|
62028
|
Hackslack by @asho | Stardance
|
asho
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T04:33:50Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a slackbot with three basic functions. I was constantly running into error plus my nest application wasn’t being approved. Thank you soo much!", "repo": "https://github.com/ayeshayaya/hackslack", "demo": "https://ayeshayaya.github.io/hackslack/"}]...
|
[{"post_id": 67860, "ts": "202 [{"post_id": 67860, "ts": "2026-09-14T04:24:27Z", "hours": 0.2789, "text": "the project took me around 2 hours to do, idk why its showing 16min:)"}]...
|
Title: Hackslack by @asho | Stardance
Devlogs:
th Title: Hackslack by @asho | Stardance
Devlogs:
the project took me around 2 hours to do, idk why its showing 16min:)
Ships:
I made a slackbot with three basic functions. I was constantly running into error plus my nest application wasn’t being approved. Thank you soo much!...
|
1793058530.142392
|
1793144930.142392
|
|
28283
|
Robot Arm by @jake18 | Stardance
|
jake18
|
1
|
28.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T03:43:04Z", "hours": 28.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built a 5-DOF robotic arm that can move manually or remotely using coordinate control. The arm uses 5 servo motors for the arm and 1 stepper motor for the base to provide movement. Every joint in this arm is controlled through a local web app that I am running on my laptop. All of the controls, calculations, etc., are all on my laptop. The ESP32 only acts as a motor controller, receiving commands through wifi and controlling the motors. The thing that I am most proud of is the code and coordinate control. This was the first time I did a project with this scale of code, and I am proud that it works well. This was also the first time I made a web app and combining it with an ESP32. The most challenging part about this project was definitely the mechanical design. Everything in CAD worked smoothly with no mistakes, but when I printed it out, big and small errors kept showing up that delayed my project by a few weeks. I had to go through many iterations until I got one that worked. FYI the angle processing in the code is tailored to my specific motor angles and position.", "repo": "https://github.com/jakecao18/Robot-Arm", "demo": ""}]...
|
[{"post_id": 70721, "ts": "202 [{"post_id": 70721, "ts": "2026-09-19T17:29:25Z", "hours": 8.8356, "text": "Devlog #6 So i have just finished assembling the arm and making all the gears, motors and joints properly now what I have done: fixed the shoulder joint by removing the belt completely, now it runs on a 1:1.5 spur gear reduction I added the stepper motor so now the arm can rotate by its base, allowing it to move in 3d I redesigned the gripper since the old one (finray style gripper) was too weak and couldn’t pick things up. this new gripper is a rack and pinion gripper that is much stronger I have connected the SMPS power supply and now every motor can run on full power I have connected the website to the esp so now my slider control works and is accurate But there are still some problems: the backlash of all the joints add up, which means the end effector wobbles too much. My coordinate control still isn’t accurate So before shipping this project, I will fix the coordinate control code so that it is now accurate. The backlash is a separate problem that I dont think ill be able to solve in time."}, {"post_id": 47845, "ts": "2026-08-16T02:11:50Z", "hours": 10.0933, "text": "Devlog #5 I have now finished the local web server to control the robot, it includes 6 sliders for the 5 servos and 1 stepper motor and also a coordinate control. for the coordinate control, you simply plug in your x, y, z coordinates it will return j1, j2, j3, and j4 angles to you. on the coding side of that, i just wrote some simple analytical ik, mostly triangle geometry. the website is ran by flask and i am using udp sockets to send the angles to my esp32 via wifi. everything is ran on my computer, so the esp would only have to control the motors with the angles. i also did some cad to redesign the shoulder base to fix the belt problem, will start printing soon."}, {"post_id": 42286, "ts": "2026-08-06T22:24:53Z", "hours": 9.0053, "text": "Devlog #4 So ive finished the CAD for the new parts and assembled the robot arm, but the wrist roll and gripper will be attached later. the elbow and wrist pitch of the robot works smoothly now, no skipping or anything, however. the shoulder belt is still skipping under load, i have now used more teeth but it still skips. I think that this is because the belt itself is not tensioned properly (its a little loose), i will have to return the current belt and buy a new one. if anyone have any suggestions to help prevent skipping please let me know. for now that is the only major problem in this build. I am working on the gripper right now since the old design didnt work. also i have been working on a web app to control the arm from my computer to the esp via wifi. I am almost done the app and soon will be able to send data to the esp. that is all for now but i think more problems will apear later."}, {"post_id": 35021, "ts": "2026-07-26T05:31:37Z", "hours": 9.3075, "text": "Devlog #3 So now i have printed all the parts and assembled the arm up to the wrist, but a few problems prevented the arm from moving properly. The gears at the elbow are slipping when under load and also the shafts supporting them are not stable. I think I can fix this by locking the two shafts together and using wider M2 gears. The belt at the shoulder is also slipping under load. I think that i just need the gears to be bigger so that they can tension the belt better. The elbow joint servo doesnt have enough movement to drive the whole elbow 180 degrees because of the gears. I messed up this part because i was supposed to buy the 270 degree servo not the 180 one. Ill be waiting for the 270 servo to arrive. Aside from those problems I have written code so that I can control the servos by angle and not PWM pulses. The base of the arm works fine, Ill be controlling that as soon as i learn how to control a stepper motor. For now I have redesigned most of the arm to fix these problems, but as i wait for the servo and all the parts to print, ill try to work on a web that can control the arm."}, {"post_id": 27505, "ts": "2026-07-13T04:01:09Z", "hours": 4.1847, "text": "Devlog #2 Finished printing everything and started testing if everything fit together. Some of the components had weak spots or didn’t fit together well. I had to go back and forth between CAD and printing for a while because my tolerances weren’t quite correct. Everything fits nicely now. I also made a GitHub repo and added all the CAD files, BOM, pictures etc. I will update GitHub frequently, and everything needed to recreate this project will be there. I also made a wiring diagram and in the process realized that I needed a few more components to make sure that the arm would work smoothly and safely. I was kinda hard to learn why I needed all these different components but in the end I think it makes sense to me now. The next steps now is probably to buy the components and then assemble the robot. In the meantime though I think I can start writing some code on Inverse Kinematics for the Robot. I want it to be able to move all the servos to the correct angle when given some coordinates."}, {"post_id": 21070, "ts": "2026-07-02T20:57:09Z", "hours": 1.2269, "text": "Devlog #1 Completed the CAD assembly for my robot arm. I plan it to be a 5-DOF arm with 5 motors for movement and 1 motor for the claw. I’m using 5 servos and 1 stepper motor right now but I don’t know if I should change it all into servos. I also made the arm be able to swap grippers pretty easily. Im gonna print everything for this arm, gears, gripper, etc. I can also 3d print the ball bearings but I think its better to buy them. The next step is to start printing everything, buying all the parts and start assembling it. Once Im done assembling Ill start coding it. I plan for the arm to run on a Raspberry Pi and be controlled via an app."}]...
|
Title: Robot Arm by @jake18 | Stardance
Devlogs:
Title: Robot Arm by @jake18 | Stardance
Devlogs:
Devlog #1 Completed the CAD assembly for my robot arm. I plan it to be a 5-DOF arm with 5 motors for movement and 1 motor for the claw. I’m using 5 servos and 1 stepper motor right now but I don’t know if I should change it all into servos. I also made the arm be able to swap grippers pretty easily. Im gonna print everything for this arm, gears, gripper, etc. I can also 3d print the ball bearings but I think its better to buy them. The next step is to start printing everything, buying all the parts and start assembling it. Once Im done assembling Ill start coding it. I plan for the arm to run on a Raspberry Pi and be controlled via an app.
Devlog #2 Finished printing everything and started testing if everything fit together. Some of the components had weak spots or didn’t fit together well. I had to go back and forth between CAD and printing for a while because my tolerances weren’t quite correct. Everything fits nicely now. I also made a GitHub repo and added all the CAD files, BOM, pictures etc. I will update GitHub frequently, and everything needed to recreate this project will be there. I also made a wiring diagram and in the process realized that I needed a few more components to make sure that the arm would work smoothly and safely. I was kinda hard to learn why I needed all these different components but in the end I think it makes sense to me now. The next steps now is probably to buy the components and then assemble the robot. In the meantime though I think I can start writing some code on Inverse Kinematics for the Robot. I want it to be able to move all the servos to the correct angle when given some coordinates.
Devlog #3 So now i have printed all the parts and assembled the arm up to the wrist, but a few problems prevented the arm from moving properly. The gears at the elbow are slipping when under load and also the shafts supporting them are not stable. I think I can fix this by locking the two shafts together and using wider M2 gears. The belt at the shoulder is also slipping under load. I think that i just need the gears to be bigger so that they can tension the belt better. The elbow joint servo doesnt have enough movement to drive the whole elbow 180 degrees because of the gears. I messed up this part because i was supposed to buy the 270 degree servo not the 180 one. Ill be waiting for the 270 servo to arrive. Aside from those problems I have written code so that I can control the servos by angle and not PWM pulses. The base of the arm works fine, Ill be controlling that as soon as i learn how to control a stepper motor. For now I have redesigned most of the arm to fix these problems, but as i wait for the servo and all the parts to print, ill try to work on a web that can control the arm.
Devlog #4 So ive finished the CAD for the new parts and assembled the robot arm, but the wrist roll and gripper will be attached later. the elbow and wrist pitch of the robot works smoothly now, no skipping or anything, however. the shoulder belt is still skipping under load, i have now used more teeth but it still skips. I think that this is because the belt itself is not tensioned properly (its a little loose), i will have to return the current belt and buy a new one. if anyone have any suggestions to help prevent skipping please let me know. for now that is the only major problem in this build. I am working on the gripper right now since the old design didnt work. also i have been working on a web app to control the arm from my computer to the esp via wifi. I am almost done the app and soon will be able to send data to the esp. that is all for now but i think more problems will apear later.
Devlog #5 I have now finished the local web server to control the robot, it includes 6 sliders for the 5 servos and 1 stepper motor and also a coordinate control. for the coordinate control, you simply plug in your x, y, z coordinates it will return j1, j2, j3, and j4 angles to you. on the coding side of that, i just wrote some simple analytical ik, mostly triangle geometry. the website is ran by flask and i am using udp sockets to send the angles to my esp32 via wifi. everything is ran on my computer, so the esp would only have to control the motors with the angles. i also did some cad to redesign the shoulder base to fix the belt problem, will start printing soon.
Devlog #6 So i have just finished assembling the arm and making all the gears, motors and joints properly now what I have done: fixed the shoulder joint by removing the belt completely, now it runs on a 1:1.5 spur gear reduction I added the stepper motor so now the arm can rotate by its base, allowing it to move in 3d I redesigned the gripper since the old one (finray style gripper) was too weak and couldn’t pick things up. this new gripper is a rack and pinion gripper that is much stronger I have connected the SMPS power supply and now every motor can run on full power I have connected the website to the esp so now my slider control works and is accurate But there are still some problems: the backlash of all the joints add up, which means the end effector wobbles too much. My coordinate control still isn’t accurate So before shipping this project, I will fix the coordinate control code so that it is now accurate. The backlash is a separate problem that I dont think ill be able to solve in time.
Ships:
I built a 5-DOF robotic arm that can move manually or remotely using coordinate control. The arm uses 5 servo motors for the arm and 1 stepper motor for the base to provide movement. Every joint in this arm is controlled through a local web app that I am running on my laptop. All of the controls, calculations, etc., are all on my laptop. The ESP32 only acts as a motor controller, receiving commands through wifi and controlling the motors. The thing that I am most proud of is the code and coordinate control. This was the first time I did a project with this scale of code, and I am proud that it works well. This was also the first time I made a web app and combining it with an ESP32. The most challenging part about this project was definitely the mechanical design. Everything in CAD worked smoothly with no mistakes, but when I printed it out, big and small errors kept showing up that delayed my project by a few weeks. I had to go through many iterations until I got one that worked. FYI the angle processing in the code is tailored to my specific motor angles and position....
|
1793008160.788182
|
1793094560.788182
|
|
63797
|
ryOS by @immaturegoat | Stardance
|
immaturegoat
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T03:00:02Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "ryOS “Since time immemorial, outstanding individuals have emerged from the oceans of mediocrity that make up the vast majority of humanity. Great thinkers destined to change their respective eras, launching the world into a new epoch. Ryo Yamada is the undeniable peak of what an outstanding individual is- she is the peak of what humanity can ever possibly achieve, the apex of human evolution and society.” -unknown This is ryOS, an webOS with a little bit of Ryo Yamada. It has 4 apps built into it. Features Ryo Yamada Draggable windows - As well as being able to drag them, you can also click on one to bring it to the front, close them, etc. Working time and date A notes app - this was done using a textarea that just saves the text contents inside to localstorage. It was pretty simple and easy to make A pong app - this is a simple game of pong, and you control the left side using your mouse. The AI is pretty hard, and I haven’t gotten a point yet. A music app - this just opens up a window with the option to play one song, and that’s Seishun Complex by Kessoku Band. A photos app - clicking on the left or right buttons of the window allows you to switch between different photos.", "repo": "https://github.com/immaturegoat/ryOS", "demo": "https://immaturegoat.github.io/ryOS/"}]...
|
[{"post_id": 71583, "ts": "202 [{"post_id": 71583, "ts": "2026-09-21T02:59:27Z", "hours": 0.5789, "text": "Devlog 3 lowk this is such a troll project I added 3 more apps, so now there are 4 in total. They are a ryong app, a ryosic app, and a ryotos app (pong, music, and photos). On the pong app, you use your mouse to control the left side. The AI is pretty good though. I haven’t been able to beat it yet. On the music app, you can only play Seishun Complex by Kessoku Band. Anyway, I just put a music player in a window, and it works pretty well. Finally, on the photos app, its just several photos of Ryo that you can switch between. I’m pretty proud of this ngl."}, {"post_id": 70854, "ts": "2026-09-19T21:31:58Z", "hours": 0.4828, "text": "Devlog 2 I built a simple notes app that just stores what you type in a text app into local storage. I’m going to finish the project with a few other apps first."}, {"post_id": 70836, "ts": "2026-09-19T20:57:50Z", "hours": 1.4139, "text": "Devlog 1 I lowkey just needed 50 more stardust, so I’m doing this project. Anyway, I’m just following the guide and customizing it to my liking. I’ve added a welcome screen, but I’ll add more later. I’ve also styled the close buttons and the dragging mechanic."}]...
|
Title: ryOS by @immaturegoat | Stardance
Devlogs: Title: ryOS by @immaturegoat | Stardance
Devlogs:
Devlog 1 I lowkey just needed 50 more stardust, so I’m doing this project. Anyway, I’m just following the guide and customizing it to my liking. I’ve added a welcome screen, but I’ll add more later. I’ve also styled the close buttons and the dragging mechanic.
Devlog 2 I built a simple notes app that just stores what you type in a text app into local storage. I’m going to finish the project with a few other apps first.
Devlog 3 lowk this is such a troll project I added 3 more apps, so now there are 4 in total. They are a ryong app, a ryosic app, and a ryotos app (pong, music, and photos). On the pong app, you use your mouse to control the left side. The AI is pretty good though. I haven’t been able to beat it yet. On the music app, you can only play Seishun Complex by Kessoku Band. Anyway, I just put a music player in a window, and it works pretty well. Finally, on the photos app, its just several photos of Ryo that you can switch between. I’m pretty proud of this ngl.
Ships:
ryOS “Since time immemorial, outstanding individuals have emerged from the oceans of mediocrity that make up the vast majority of humanity. Great thinkers destined to change their respective eras, launching the world into a new epoch. Ryo Yamada is the undeniable peak of what an outstanding individual is- she is the peak of what humanity can ever possibly achieve, the apex of human evolution and society.” -unknown This is ryOS, an webOS with a little bit of Ryo Yamada. It has 4 apps built into it. Features Ryo Yamada Draggable windows - As well as being able to drag them, you can also click on one to bring it to the front, close them, etc. Working time and date A notes app - this was done using a textarea that just saves the text contents inside to localstorage. It was pretty simple and easy to make A pong app - this is a simple game of pong, and you control the left side using your mouse. The AI is pretty hard, and I haven’t gotten a point yet. A music app - this just opens up a window with the option to play one song, and that’s Seishun Complex by Kessoku Band. A photos app - clicking on the left or right buttons of the window allows you to switch between different photos....
|
1793058823.3636389
|
1793145223.3636389
|
|
63981
|
RocketRikshaw by @teerth | Stardance
|
teerth
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T02:39:52Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "If this is my view outside the auto, you best believe I’m becoming the best auto driver that has ever lived. I have worked with layers on html before, but I got a good taste of layering here because it took me so many trials and errors with all the different z-index to pick the right ones also putting the gradient in the background was a bit tough but I accomplished it anyway I aim to update this in future to add more new tab like features on this website", "repo": "https://github.com/spiceTheCode/rocketRikshaw", "demo": "https://spicethecode.github.io/rocketRikshaw/"}]...
|
[{"post_id": 71572, "ts": "202 [{"post_id": 71572, "ts": "2026-09-21T02:24:06Z", "hours": 2.1047, "text": "rocket rikshaw is now in space!!!! We are now done with a good nasa apod show website!!! not the best nasa apod for demo tho :( added a peek out button so that users can have full fiew also!"}, {"post_id": 71099, "ts": "2026-09-20T09:20:55Z", "hours": 1.3125, "text": "so the auto overlay is here, and the api works fine too, all i need it to just fix some sizing and make the api url media as big as the background ON IT!!"}]...
|
Title: RocketRikshaw by @teerth | Stardance
Devlo Title: RocketRikshaw by @teerth | Stardance
Devlogs:
so the auto overlay is here, and the api works fine too, all i need it to just fix some sizing and make the api url media as big as the background ON IT!!
rocket rikshaw is now in space!!!! We are now done with a good nasa apod show website!!! not the best nasa apod for demo tho :( added a peek out button so that users can have full fiew also!
Ships:
If this is my view outside the auto, you best believe I’m becoming the best auto driver that has ever lived. I have worked with layers on html before, but I got a good taste of layering here because it took me so many trials and errors with all the different z-index to pick the right ones also putting the gradient in the background was a bit tough but I accomplished it anyway I aim to update this in future to add more new tab like features on this website...
|
1793058861.9184885
|
1793145261.9184885
|
|
18043
|
Seal OS by @indiesealdev | Stardance
|
indiesealdev
|
3
|
116.0
|
920
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T02:36:55Z", "hours": 11.0, "multiplier": 18.0, "payout": 200, "blessing": "neutral", "text": "Hello there!! Well, I’m done with this project, I’m very happy with the result of what I did, and I learnt a lot of JavaScript, HTML and CSS. For this final update I worked on a ton of QOL basically, basically the following: All things you build now get saved when you reset the page. You can now scale and rotate objects (only certain you can rotate), for example, Seals can be scaled up and be slower, or be scaled down and be faster. For rotating and scaling, you can also use your ARROW KEYS :D That was about it, most of my time spent was in structuring my code and making it easier to expand, so the integration of these was pretty easy tbh. Well, thank you for following me on this journey <] SEAl YA!", "repo": "https://github.com/IndieSeal/SealWebOS", "demo": "https://indieseal.github.io/SealWebOS/"}, {"ship_num": 2, "ts": "2026-08-12T06:19:20Z", "hours": 37.0, "multiplier": 19.4, "payout": 720, "blessing": "neutral", "text": "I made 3 new apps, but I did add a heck ton more features! Ok, let’s get started with the apps first: Moving Seals: This is an app that lets you draw seals that move all over your screen and that after they’re spawned you have the possibility to make them explode, or nuke them if you’re so cruel. Sand Builder: An app to decorate your os! Place sand castles, starfishes and sand dollars (didn’t know those existed but they’re really cool). Settings: A simple app to adjust volume settings, and to enable a certain possible jumpscare with a very small chance of it happening every second, hope it doesn’t catch you off guard. They’re also saved if you reload the page (including Seal Clicker!!). About the features, I wanted to add some small things that were fun to play around and fun to discover, very silly! So I made the following: Sleepy but hungry seal: A seal that sits in the top left corner of your screen which if you click, will call it’s guard (an epic cat), which will throw a brick at you lol, this will leave your screen fractured, unless you feed the seal some fish by dragging them into its mouth. Fish: There’s some new decoration, which are fish who like to swim below in your screen in the sea! You can grab them to feed the hungry seal. DVD Seal: I wanted to experiment with 3D, because I saw a really cute seal model, so I made it so you can grab it and throw it around like the DVD Screensaver, I’m not sure why it reminded me of it, but yeah. Foxy Jumpscare: I wanted to scare the user of the website, at first I thought I would do a really creepy seal image, WHICH I FOUND SOME WHICH I WILL NEVER BE ABLE TO ERASE FROM MY BRAIN D:, but I landed on the Foxy Jumpscare as I think it’s funnier and fits the silly vibes more, but I decided to disable it by default so if someone doesn’t know about it, they don’t get jumped or smthing. Since the last update, I updated a lot of the visuals (just UI elements, my weird art will still be there), thanks to my sister which is an artist (thx for the help :D). I had a bit of trouble with the 3D DVD Seal as I thought moving it would be as easy as just getting the input from the canvas, I was so wrong, I was there for hours trying to fix it, and then I thought, what about raycasting? That would literally need the model to be hit! But implementation also took hours as I couldn’t find any guides, but OH WELL. I’m super duper happy with how it turned out, and I hope you love it as much as I enjoyed making it, thanks for watching my devlogs, for reading alla this. and bye <3", "repo": "https://github.com/IndieSeal/SealWebOS", "demo": "https://indieseal.github.io/SealWebOS/"}, {"ship_num": 3, "ts": "2026-08-03T00:56:22Z", "hours": 68.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hello there!! I made a very Seal-Inspired WebOS, it has 3 apps, which only two are cool as the other one is just an introduction to the OS and me! The REAL cool apps are these as of right now are: Seal Clicker: A clicker/idle game like Cookie Clicker but if it was seals. SealTok: Wanna brainrot your brain until it only thinks of seals? Me too! Now you can do that here!! I think what was most challenging about making this project was the Seal Clicker app as it went through multiple stages of rebuilding to make expanding the upgrades and seals easier, and in general it’s just a big app lol, I also did all the art myself, I’ve been challenging myself recently to learn to draw, even if they’re not the best drawings, but I’m very happy on how it turned out! I also had barely any knowledge about HTML, CSS and JS, so I learnt everything from scratch, though I was glad to discover that JS is surprisingly similar to my main coding language C#. I’m also VERY proud of the Seal Clicker app, it’s where I learnt that a lot of the concepts from C# were applicable in JS and is where I put my structure optimization hat haha, I ended up loving the drawings I made. And for you to test the project just hit the “Try Project” button and it will take you there! I really hope you enjoy the OS as much as I loved building it, and thanks for taking the time to check it out!!", "repo": "https://github.com/IndieSeal/SealWebOS", "demo": "https://indieseal.github.io/SealWebOS/"}]...
|
[{"post_id": 70954, "ts": "202 [{"post_id": 70954, "ts": "2026-09-20T03:04:48Z", "hours": 3.5997, "text": "Helloooooooo, I again fell into the rabbit hole of OPTIMIZATION As I am on my mission to make everything really approachable for coders that may want to inspect the code and fork it, and make their own silly changes, it is easier than ever. So I made some new sliders that affect multiple things, which I used to replace the audio categories! (sfx and ui for example), audios that fit into the same category and have one slider that affects all of them. Thanks to the new slider system I have, it was very easy to implement a new feature, sizing and rotation for objects! Though not all objects are rotatable, but at least they all are scalable :]! So now you can have annoying cockroach seals that zoom all over the screen, or have big sealies that move as slow as a turtle. OH, I almost forgot. You can also use the arrow keys to rotate and scale the stuff without having to grab the slider and move it around, though I could not find a way to make it so you can press more than 2 keys at the same time, I will be putting some time to research that, but for now, nope :[ Alrighty, that is it for this cool devlog , see ya"}, {"post_id": 65627, "ts": "2026-09-10T21:30:46Z", "hours": 6.7997, "text": "Hello thereeee!! i am back with a pretty boring devlog, oh yea I have been fixing bugs, which that I am aware, everything should be fixed (hopefully) These include: Sealtok autoplaying on page load (videos with audio would be heard from outside, which could be annoying) I have also been busy with structuring code, and I am currently working on optimizing the Audio Categories to translate them into the new settings system! (sfx and ui sliders) I also spent some of the stardust on buying a domain, so I can have my cool OS outside of github >:] (now with cloudflare too) Some really cool things that I have been working on for the Paint Windows is so they get saved, so you can restart the page and have your drawn things there again!! I have a rotation system and scaling system for object painting, but with the structuring of the setting system so that I can create sliders for other things too, it is still a WIP, but it should be out soon! Alright, yippe and bye"}, {"post_id": 50735, "ts": "2026-08-20T02:39:42Z", "hours": 0.7006, "text": "Well, I am back at it, as my goal is to get a 3D printer! As of currently, I just fixed a couple of bugs, including: Making ¨painting¨ apps easier to close. Fixed it so you could not ¨paint¨ when clicking the close or minimize button. Fixed Foxy Jumpscare setting not actually working I already have some ideas in mind of what I want to do next! If you wanna hear my quick vent, go ahead: For WebOS 1 I really placed a lot of time into it so I could have my code structure really well done so it would be really easy to create new apps, and I did spend a lot of time in Seal Clicker lol, but I thought the ratings would count both Web 1 and 2, but sadly not, so I will have to work another 50 hours on this , not annoyed, but I did wanna work on other projects"}, {"post_id": 45597, "ts": "2026-08-12T05:57:52Z", "hours": 8.5486, "text": "Hello there, and welcome to my last devlog, it is been a long journey, but I have done it, I have learned the ways of HTML, CSS and JS. I hate them all, but at least I know them now lol. I made a lot of QOL, a LOT of bug fixing and added some cool little features, you can take a look: Random Foxy Jumpscare: It is an option in the Settings App which can be activated and desactivated, but it is disabled by default. Saved settings: All settings you modify will be kept if you reload the page, this also works with the Seal Clicker app! Fih: Now you will see a bunch of fish swimming around in the bottom of the screen, and they are grabbable!! Sleepy, Hungry seal: The seal in the top corner of the screen is very sleepy, if you click it, it will get mad, but you can fix the damages by feeding it fish. Audio: Added a bunch more of audio Fixes: A lot of bug interactions with the DVD Seal."}, {"post_id": 44959, "ts": "2026-08-11T02:07:57Z", "hours": 10.1906, "text": "I made mostly visual improvements and added some silly stuff in general, because I wanna have fun, you know? These include: Mad Seal: The seal is resting, and you woke them up by clicking them, they are calling the crazy kitty to attack you, for now the damage is permanent (until you refresh the page), but there will soon be a way to revert it by feeding the seal. 🐟 Spinning Seal: You can grab it and throw it around like those DVD Screensavers, its fun! 📀 I want to make something to jumpscare y´all, but I will be thinking of ideas to do so hehe, be prepared >:] I had to make the Desktop App Icons wrap around, so they did not sink into the water, because I do not want that. I am so close to finishing this really cool OS which I am really proud of, I love it so much, and did it all without any frameworks which is really cool. These changes are not published yet, they are on a testing branch as I still need to squash some bugs."}, {"post_id": 43810, "ts": "2026-08-09T07:37:47Z", "hours": 9.8419, "text": "Hello there, I did a lot of expanding on the Seal Moving app, I grabbed it and stripped all of its bones and removed their personality so they were easily modifiable and expandable! YIPPEE. What I am trying to say is, I plan on using the same behaviour of spawning seals for another app to decorate your OS´s background! So i had to spend a lot of time making it easily expandable, and it was worth it!! I also made a variation of the seal´s sprite so you can choose which one to spawn, there is also brushes now for spawning and removing seals, aswell as an icon for nuking them all!! The other app will be for spawning sand castles, sea stars and other stuff like that ONLY in the sand, below everything that is UI. With these two apps, I would just need to add one more app, and I should be done! Probably another game to have some more fun stuff, I know that will take a while, but eh, doesn´t really matter."}, {"post_id": 41328, "ts": "2026-08-05T14:03:48Z", "hours": 8.7142, "text": "These days I have been mostly optimizing the code, so again, it is easier to create new windows and stuff, and I also fixed some annoying window header css issues. I am also thinking to change some of the audio the apps have to sound a bit less THUMPY. I currently have two things I am working on, just a visual update in general for the OS so it feels more silly, which should be in video 2, and a new app >:] This new app, I am still unsure in which direction to take it, maybe both?? But here is the idea: You have seals that move in your screen, and you can click to explode them (sorry sealies ) But I do need to decide wether with this to do this or that: A minigame where seals spawn and you have to explode as many as you can in a limited amount of time. Desktop pets, them just hanging around, and if they are bothering you, just pop them lol. Or I could do a combo of the two, but again, unsure. Would love to know what everyone else thinks"}, {"post_id": 39792, "ts": "2026-08-03T00:23:54Z", "hours": 5.6922, "text": "Final devlog, this was a great journey, and I cannot wait to get started on WebOS 2, this is going to take an eternity with how long this first part took me, but I already have a solid base (I might even do some more structure changes in the code to make it EVEN EASIER to make windows), and I learnt a lot about HTML, CSS and JS! Well, in these last two days I did the following: Fixed the drag audio bug Fixed some CSS which was not working on build Finished adding all the art for Seal Clicker Balanched Seal Clicker so it takes around 10-20 minutes to finish Made App Icons for Seal Clicker and SealTok Made some visual changes Added RESOURCES.md and updated the README.md hope you enjoy it!!! I really loved building it 🦭 (hope there is someone as autistic as me who loves seals lol)"}, {"post_id": 38610, "ts": "2026-08-01T02:54:25Z", "hours": 10.3364, "text": "I have finished my Seal-Tok, I wanted to keep it simple, I do not really want to add likes and comments and stuff as I do not want to overcomplicate myself as much as I did with Seal Clicker lol, but I may add a ¨Share¨ feature which would just take you to the source of the authors video. I am also planning on doing some videos myself for seal-tok, I am already working on some, but it is going to take a while D: I have finally finished my Seal Clicker in terms of systems and having all the upgrades, now I only have to draw the last couple of upgrades (7 more). In terms of what I have to do before publishing the mission is to fix a couple of audio bugs, for some reason windows if left inactive for a while (changing to other tabs of browser), probably because of the deltaTime I have in there? I need to take a look. And soon SealOS will be available for all!! hehe"}, {"post_id": 32758, "ts": "2026-07-22T03:40:05Z", "hours": 9.1253, "text": "I’m no artist but I’ve been working on the art for the game, maybe it’s not the prettiest but ehh, it’s pretty good for me. I’ve been working on implementing audio, on adding some juice to the interactions, which I’m still planning to do a lot more of those, but time will tell. I’ve added the basic first upgrades for all the Seals which is really cool yeaa.. I’m super happy with how I got to optimize the upgrade and seal system as now you only need 3 lines of code to inject HOPE into the html give it their unique id and change icons and text around with ease, I love using classes, seriously can’t even begin to say how happy I am with JavaScript literally being C# but a bit worse ( sorry JS enjoyers :[ ). So now, it should be very easy to add new stuff which I’m thrilled to do, not thrilled about the art part though haha. Probably less than 10 more hours and I should be done with this damned app, and I have already noted down some ideas for which apps I could do next, but I don’t want to spoil, so you’ll have to wait, or if you find the Source Code, maybe you can go search for it, like a treasure hunt, or easter egg? if you actually find the easter egg, what do you think of my suggestion? it’s amazing right? right? idk (also I just got annoyed with my keyboard putting this: ` instead of ’, so I just copied it and pasted it, would be fun to have a onekey for that haha) ok bye, thanks for reading"}, {"post_id": 30250, "ts": "2026-07-17T17:54:40Z", "hours": 9.8186, "text": "Hellooo!! Well, I´ve been working a lot on the Seal Clicker app, it´s taking a whole lot more than I had initially thought, but oh well. All upgrades are working correctly, made a lot of UI improvements, more like the layout specifically, I still need to work on how it overall looks. I´ve been squashing down bugs, and I´ve implemented tooltips! For now only applicable on the upgrades, but I want to see if I can make it modular. My next task is learning how to spawn HTML into a page, because I want there to be a visual way to know how many Seals you´ve bought that help you obtain food (that´s the middle row for ya, I still need to draw some backgrounds lol). Also, I´m actually enjoying a lot learning this as first of all, now I can make websites hehe, but also I got a new language in my ¨can-do¨ list I guess, JavaScript is literally C# but with Dynamic Typing so it´s been quite easy to learn. (i hate dynamic typing though). alright, adios, see ya on the next devlog :]"}, {"post_id": 28500, "ts": "2026-07-14T19:47:15Z", "hours": 8.9739, "text": "I´m about to hit the 10 hour time limit per devlog, so I´m posting this :] As of currently, I´m just trying to make the project more organized, I´ve been making folders to store CSS´s as I´ve been splitting the main one, similarly of how I did with my Java Script files. And I´ve got the basics down of the Seal Clicker, I´m going to be taking a lot of inspiration from Cookie Clicker, so I´m seeing how to land those vibes. I´ve also made it so windows can´t leave your viewport and can´t go on top of the Navbar. I would share a video, but the project still looks exactly the same and feels about the same, the Seal Clicker window has the basic click and upgrade functionality, but it´s just the elements rn and it looks kinda ugly. But I´ll keep y´all updated!! :]"}, {"post_id": 22546, "ts": "2026-07-05T02:07:31Z", "hours": 8.0039, "text": "Thanks to Jenin over on Summer Camp, I´ve been able to grasp the concepts of HTML and CSS better, and I got over some hard bugs I couldn´t squash. Well, I´ve done a lot on this update, I followed a tutorial on how to make a sea, on top of that I added a fish that swims through the sea, and soon will be draggable and will be feedable to a seal! I´ve thought of what I will do app-wise, but I won´t spoil ya! I added some relaxing beach/sea sounds, I changed the background to actually match the water i placed, so not it´s sand! I added a little bar in the taskbar app icons to know wether it is the app that is selected, or if it´s minimized/not selected, I´ll probably need to have a different color for those two states, but for now, I think it´s pretty good, on the future I want to make apps pinnable on the taskbar and they will show up without the bar below! Visually I think it´s looking great, now I only gotta start developing the actuall apps lol. Wish me luck :]"}, {"post_id": 18397, "ts": "2026-06-29T15:16:32Z", "hours": 5.7233, "text": "I have improved my audio system for dragging objects, so it only plays when you´re moving the window and not just by touching it, and finished adding the lerp implementation to the windows, I still gotta fix some bugs though, like the buttons from the windows making sound when hovered WHEN moving the windows too fast, I´m thinking I´ll disable their interactions when the window is grabbed. I also made a very important change, to avoid creating duplicate script and to make my lerp actually work, I made the whole drag script into a class! This way, each window manages itself and can store it’s last position for the lerp purpose, and I’m very proud of how it ended up looking and how it sounds, would’ve loved to be able to fix the bug where looping has a small pause between each loop, but maybe I’ll make the audio longer so it’s not AS noticeable, or it doesn’t happen as often! With these changes, making new windows should be easy peasy :D"}, {"post_id": 11067, "ts": "2026-06-18T03:16:23Z", "hours": 3.8808, "text": "Working on the taskbar, and added some audio to keep it from being so silent, I was getting tired from it! To-do: -Work on Wii-type opening app menu. -Finish adding sounds everywhere -Add more desktop apps -Finish taskbar behaviour"}, {"post_id": 8547, "ts": "2026-06-14T06:38:21Z", "hours": 3.3081, "text": "Finally finished the basic part of the windows, still needs to be polished, but hey they behaviour’s there!"}, {"post_id": 8276, "ts": "2026-06-13T19:23:23Z", "hours": 3.2692, "text": "I finally finished the drag and drop feature, took me a while as I was trying to have different cursors while outside, while hovering and while clicking, which took longer than I thought, but I did it! Next task: Make an app inside of the OS"}]...
|
Title: Seal OS by @indiesealdev | Stardance
Devlo Title: Seal OS by @indiesealdev | Stardance
Devlogs:
I finally finished the drag and drop feature, took me a while as I was trying to have different cursors while outside, while hovering and while clicking, which took longer than I thought, but I did it! Next task: Make an app inside of the OS
Finally finished the basic part of the windows, still needs to be polished, but hey they behaviour’s there!
Working on the taskbar, and added some audio to keep it from being so silent, I was getting tired from it! To-do: -Work on Wii-type opening app menu. -Finish adding sounds everywhere -Add more desktop apps -Finish taskbar behaviour
I have improved my audio system for dragging objects, so it only plays when you´re moving the window and not just by touching it, and finished adding the lerp implementation to the windows, I still gotta fix some bugs though, like the buttons from the windows making sound when hovered WHEN moving the windows too fast, I´m thinking I´ll disable their interactions when the window is grabbed. I also made a very important change, to avoid creating duplicate script and to make my lerp actually work, I made the whole drag script into a class! This way, each window manages itself and can store it’s last position for the lerp purpose, and I’m very proud of how it ended up looking and how it sounds, would’ve loved to be able to fix the bug where looping has a small pause between each loop, but maybe I’ll make the audio longer so it’s not AS noticeable, or it doesn’t happen as often! With these changes, making new windows should be easy peasy :D
Thanks to Jenin over on Summer Camp, I´ve been able to grasp the concepts of HTML and CSS better, and I got over some hard bugs I couldn´t squash. Well, I´ve done a lot on this update, I followed a tutorial on how to make a sea, on top of that I added a fish that swims through the sea, and soon will be draggable and will be feedable to a seal! I´ve thought of what I will do app-wise, but I won´t spoil ya! I added some relaxing beach/sea sounds, I changed the background to actually match the water i placed, so not it´s sand! I added a little bar in the taskbar app icons to know wether it is the app that is selected, or if it´s minimized/not selected, I´ll probably need to have a different color for those two states, but for now, I think it´s pretty good, on the future I want to make apps pinnable on the taskbar and they will show up without the bar below! Visually I think it´s looking great, now I only gotta start developing the actuall apps lol. Wish me luck :]
I´m about to hit the 10 hour time limit per devlog, so I´m posting this :] As of currently, I´m just trying to make the project more organized, I´ve been making folders to store CSS´s as I´ve been splitting the main one, similarly of how I did with my Java Script files. And I´ve got the basics down of the Seal Clicker, I´m going to be taking a lot of inspiration from Cookie Clicker, so I´m seeing how to land those vibes. I´ve also made it so windows can´t leave your viewport and can´t go on top of the Navbar. I would share a video, but the project still looks exactly the same and feels about the same, the Seal Clicker window has the basic click and upgrade functionality, but it´s just the elements rn and it looks kinda ugly. But I´ll keep y´all updated!! :]
Hellooo!! Well, I´ve been working a lot on the Seal Clicker app, it´s taking a whole lot more than I had initially thought, but oh well. All upgrades are working correctly, made a lot of UI improvements, more like the layout specifically, I still need to work on how it overall looks. I´ve been squashing down bugs, and I´ve implemented tooltips! For now only applicable on the upgrades, but I want to see if I can make it modular. My next task is learning how to spawn HTML into a page, because I want there to be a visual way to know how many Seals you´ve bought that help you obtain food (that´s the middle row for ya, I still need to draw some backgrounds lol). Also, I´m actually enjoying a lot learning this as first of all, now I can make websites hehe, but also I got a new language in my ¨can-do¨ list I guess, JavaScript is literally C# but with Dynamic Typing so it´s been quite easy to learn. (i hate dynamic typing though). alright, adios, see ya on the next devlog :]
I’m no artist but I’ve been working on the art for the game, maybe it’s not the prettiest but ehh, it’s pretty good for me. I’ve been working on implementing audio, on adding some juice to the interactions, which I’m still planning to do a lot more of those, but time will tell. I’ve added the basic first upgrades for all the Seals which is really cool yeaa.. I’m super happy with how I got to optimize the upgrade and seal system as now you only need 3 lines of code to inject HOPE into the html give it their unique id and change icons and text around with ease, I love using classes, seriously can’t even begin to say how happy I am with JavaScript literally being C# but a bit worse ( sorry JS enjoyers :[ ). So now, it should be very easy to add new stuff which I’m thrilled to do, not thrilled about the art part though haha. Probably less than 10 more hours and I should be done with this damned app, and I have already noted down some ideas for which apps I could do next, but I don’t want to spoil, so you’ll have to wait, or if you find the Source Code, maybe you can go search for it, like a treasure hunt, or easter egg? if you actually find the easter egg, what do you think of my suggestion? it’s amazing right? right? idk (also I just got annoyed with my keyboard putting this: ` instead of ’, so I just copied it and pasted it, would be fun to have a onekey for that haha) ok bye, thanks for reading
I have finished my Seal-Tok, I wanted to keep it simple, I do not really want to add likes and comments and stuff as I do not want to overcomplicate myself as much as I did with Seal Clicker lol, but I may add a ¨Share¨ feature which would just take you to the source of the authors video. I am also planning on doing some videos myself for seal-tok, I am already working on some, but it is going to take a while D: I have finally finished my Seal Clicker in terms of systems and having all the upgrades, now I only have to draw the last couple of upgrades (7 more). In terms of what I have to do before publishing the mission is to fix a couple of audio bugs, for some reason windows if left inactive for a while (changing to other tabs of browser), probably because of the deltaTime I have in there? I need to take a look. And soon SealOS will be available for all!! hehe
Final devlog, this was a great journey, and I cannot wait to get started on WebOS 2, this is going to take an eternity with how long this first part took me, but I already have a solid base (I might even do some more structure changes in the code to make it EVEN EASIER to make windows), and I learnt a lot about HTML, CSS and JS! Well, in these last two days I did the following: Fixed the drag audio bug Fixed some CSS which was not working on build Finished adding all the art for Seal Clicker Balanched Seal Clicker so it takes around 10-20 minutes to finish Made App Icons for Seal Clicker and SealTok Made some visual changes Added RESOURCES.md and updated the README.md hope you enjoy it!!! I really loved building it 🦭 (hope there is someone as autistic as me who loves seals lol)
These days I have been mostly optimizing the code, so again, it is easier to create new windows and stuff, and I also fixed some annoying window header css issues. I am also thinking to change some of the audio the apps have to sound a bit less THUMPY. I currently have two things I am working on, just a visual update in general for the OS so it feels more silly, which should be in video 2, and a new app >:] This new app, I am still unsure in which direction to take it, maybe both?? But here is the idea: You have seals that move in your screen, and you can click to explode them (sorry sealies ) But I do need to decide wether with this to do this or that: A minigame where seals spawn and you have to explode as many as you can in a limited amount of time. Desktop pets, them just hanging around, and if they are bothering you, just pop them lol. Or I could do a combo of the two, but again, unsure. Would love to know what everyone else thinks
Hello there, I did a lot of expanding on the Seal Moving app, I grabbed it and stripped all of its bones and removed their personality so they were easily modifiable and expandable! YIPPEE. What I am trying to say is, I plan on using the same behaviour of spawning seals for another app to decorate your OS´s background! So i had to spend a lot of time making it easily expandable, and it was worth it!! I also made a variation of the seal´s sprite so you can choose which one to spawn, there is also brushes now for spawning and removing seals, aswell as an icon for nuking them all!! The other app will be for spawning sand castles, sea stars and other stuff like that ONLY in the sand, below everything that is UI. With these two apps, I would just need to add one more app, and I should be done! Probably another game to have some more fun stuff, I know that will take a while, but eh, doesn´t really matter.
I made mostly visual improvements and added some silly stuff in general, because I wanna have fun, you know? These include: Mad Seal: The seal is resting, and you woke them up by clicking them, they are calling the crazy kitty to attack you, for now the damage is permanent (until you refresh the page), but there will soon be a way to revert it by feeding the seal. 🐟 Spinning Seal: You can grab it and throw it around like those DVD Screensavers, its fun! 📀 I want to make something to jumpscare y´all, but I will be thinking of ideas to do so hehe, be prepared >:] I had to make the Desktop App Icons wrap around, so they did not sink into the water, because I do not want that. I am so close to finishing this really cool OS which I am really proud of, I love it so much, and did it all without any frameworks which is really cool. These changes are not published yet, they are on a testing branch as I still need to squash some bugs.
Hello there, and welcome to my last devlog, it is been a long journey, but I have done it, I have learned the ways of HTML, CSS and JS. I hate them all, but at least I know them now lol. I made a lot of QOL, a LOT of bug fixing and added some cool little features, you can take a look: Random Foxy Jumpscare: It is an option in the Settings App which can be activated and desactivated, but it is disabled by default. Saved settings: All settings you modify will be kept if you reload the page, this also works with the Seal Clicker app! Fih: Now you will see a bunch of fish swimming around in the bottom of the screen, and they are grabbable!! Sleepy, Hungry seal: The seal in the top corner of the screen is very sleepy, if you click it, it will get mad, but you can fix the damages by feeding it fish. Audio: Added a bunch more of audio Fixes: A lot of bug interactions with the DVD Seal.
Well, I am back at it, as my goal is to get a 3D printer! As of currently, I just fixed a couple of bugs, including: Making ¨painting¨ apps easier to close. Fixed it so you could not ¨paint¨ when clicking the close or minimize button. Fixed Foxy Jumpscare setting not actually working I already have some ideas in mind of what I want to do next! If you wanna hear my quick vent, go ahead: For WebOS 1 I really placed a lot of time into it so I could have my code structure really well done so it would be really easy to create new apps, and I did spend a lot of time in Seal Clicker lol, but I thought the ratings would count both Web 1 and 2, but sadly not, so I will have to work another 50 hours on this , not annoyed, but I did wanna work on other projects
Hello thereeee!! i am back with a pretty boring devlog, oh yea I have been fixing bugs, which that I am aware, everything should be fixed (hopefully) These include: Sealtok autoplaying on page load (videos with audio would be heard from outside, which could be annoying) I have also been busy with structuring code, and I am currently working on optimizing the Audio Categories to translate them into the new settings system! (sfx and ui sliders) I also spent some of the stardust on buying a domain, so I can have my cool OS outside of github >:] (now with cloudflare too) Some really cool things that I have been working on for the Paint Windows is so they get saved, so you can restart the page and have your drawn things there again!! I have a rotation system and scaling system for object painting, but with the structuring of the setting system so that I can create sliders for other things too, it is still a WIP, but it should be out soon! Alright, yippe and bye
Helloooooooo, I again fell into the rabbit hole of OPTIMIZATION As I am on my mission to make everything really approachable for coders that may want to inspect the code and fork it, and make their own silly changes, it is easier than ever. So I made some new sliders that affect multiple things, which I used to replace the audio categories! (sfx and ui for example), audios that fit into the same category and have one slider that affects all of them. Thanks to the new slider system I have, it was very easy to implement a new feature, sizing and rotation for objects! Though not all objects are rotatable, but at least they all are scalable :]! So now you can have annoying cockroach seals that zoom all over the screen, or have big sealies that move as slow as a turtle. OH, I almost forgot. You can also use the arrow keys to rotate and scale the stuff without having to grab the slider and move it around, though I could not find a way to make it so you can press more than 2 keys at the same time, I will be putting some time to research that, but for now, nope :[ Alrighty, that is it for this cool devlog , see ya
Ships:
Hello there!! I made a very Seal-Inspired WebOS, it has 3 apps, which only two are cool as the other one is just an introduction to the OS and me! The REAL cool apps are these as of right now are: Seal Clicker: A clicker/idle game like Cookie Clicker but if it was seals. SealTok: Wanna brainrot your brain until it only thinks of seals? Me too! Now you can do that here!! I think what was most challenging about making this project was the Seal Clicker app as it went through multiple stages of rebuilding to make expanding the upgrades and seals easier, and in general it’s just a big app lol, I also did all the art myself, I’ve been challenging myself recently to learn to draw, even if they’re not the best drawings, but I’m very happy on how it turned out! I also had barely any knowledge about HTML, CSS and JS, so I learnt everything from scratch, though I was glad to discover that JS is surprisingly similar to my main coding language C#. I’m also VERY proud of the Seal Clicker app, it’s where I learnt that a lot of the concepts from C# were applicable in JS and is where I put my structure optimization hat haha, I ended up loving the drawings I made. And for you to test the project just hit the “Try Project” button and it will take you there! I really hope you enjoy the OS as much as I loved building it, and thanks for taking the time to check it out!!
I made 3 new apps, but I did add a heck ton more features! Ok, let’s get started with the apps first: Moving Seals: This is an app that lets you draw seals that move all over your screen and that after they’re spawned you have the possibility to make them explode, or nuke them if you’re so cruel. Sand Builder: An app to decorate your os! Place sand castles, starfishes and sand dollars (didn’t know those existed but they’re really cool). Settings: A simple app to adjust volume settings, and to enable a certain possible jumpscare with a very small chance of it happening every second, hope it doesn’t catch you off guard. They’re also saved if you reload the page (including Seal Clicker!!). About the features, I wanted to add some small things that were fun to play around and fun to discover, very silly! So I made the following: Sleepy but hungry seal: A seal that sits in the top left corner of your screen which if you click, will call it’s guard (an epic cat), which will throw a brick at you lol, this will leave your screen fractured, unless you feed the seal some fish by dragging them into its mouth. Fish: There’s some new decoration, which are fish who like to swim below in your screen in the sea! You can grab them to feed the hungry seal. DVD Seal: I wanted to experiment with 3D, because I saw a really cute seal model, so I made it so you can grab it and throw it around like the DVD Screensaver, I’m not sure why it reminded me of it, but yeah. Foxy Jumpscare: I wanted to scare the user of the website, at first I thought I would do a really creepy seal image, WHICH I FOUND SOME WHICH I WILL NEVER BE ABLE TO ERASE FROM MY BRAIN D:, but I landed on the Foxy Jumpscare as I think it’s funnier and fits the silly vibes more, but I decided to disable it by default so if someone doesn’t know about it, they don’t get jumped or smthing. Since the last update, I updated a lot of the visuals (just UI elements, my weird art will still be there), thanks to my sister which is an artist (thx for the help :D). I had a bit of trouble with the 3D DVD Seal as I thought moving it would be as easy as just getting the input from the canvas, I was so wrong, I was there for hours trying to fix it, and then I thought, what about raycasting? That would literally need the model to be hit! But implementation also took hours as I couldn’t find any guides, but OH WELL. I’m super duper happy with how it turned out, and I hope you love it as much as I enjoyed making it, thanks for watching my devlogs, for reading alla this. and bye <3
Hello there!! Well, I’m done with this project, I’m very happy with the result of what I did, and I learnt a lot of JavaScript, HTML and CSS. For this final update I worked on a ton of QOL basically, basically the following: All things you build now get saved when you reset the page. You can now scale and rotate objects (only certain you can rotate), for example, Seals can be scaled up and be slower, or be scaled down and be faster. For rotating and scaling, you can also use your ARROW KEYS :D That was about it, most of my time spent was in structuring my code and making it easier to expand, so the integration of these was pretty easy tbh. Well, thank you for following me on this journey <] SEAl YA!...
|
1792990393.52246
|
1793076793.52246
|
|
55629
|
Drawpad by @magomango | Stardance
|
magomango
|
1
|
10.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T01:55:01Z", "hours": 10.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a drawpad using Arduino. It includes a screen and a reset button physically. There’s an intial passcode screen to protect your devious drawings and a clear button the side which functions as a lock button or a clear pass attempt. Currently there’s 4 colors and a clear button.", "repo": "https://github.com/magnolia345/Gamepad", "demo": ""}]...
|
[{"post_id": 71519, "ts": "202 [{"post_id": 71519, "ts": "2026-09-20T23:59:07Z", "hours": 3.7739, "text": "Added a simple pass You now need to enter the correct passcode to view the drawpad, and it locks by pressing the left side button. Necessary to protect any… private drawings. 👀 But then i just leaked it to everyone who sees this. Oops gotta change it"}, {"post_id": 63669, "ts": "2026-09-07T16:31:47Z", "hours": 6.2542, "text": "A cool gamepad - 1st Devlog, DRAWPAD This is the first time I’m posting hardware, and I lwk didn’t know there was an option to record build time lmao. Uh ok. And also forgot to make devlogs along the way so we got this. ~ What is this? I’m making a gamepad using Arduino, with different games on it. With Arduino Uno and a TFT LCD Display, I made this tiny drawing pad, which will eventually be one part of the overall gamepad, with 4 different colors and a clear button. For size reference, it’s about the size of an airpod pro case. ~ Plan For this drawpad specifically, I’ll add an erase button and possibly more colors! I will make a retro pingpong game and add it to the overall gameboard. More to come on that. corn…."}]...
|
Title: Drawpad by @magomango | Stardance
Devlogs: Title: Drawpad by @magomango | Stardance
Devlogs:
A cool gamepad - 1st Devlog, DRAWPAD This is the first time I’m posting hardware, and I lwk didn’t know there was an option to record build time lmao. Uh ok. And also forgot to make devlogs along the way so we got this. ~ What is this? I’m making a gamepad using Arduino, with different games on it. With Arduino Uno and a TFT LCD Display, I made this tiny drawing pad, which will eventually be one part of the overall gamepad, with 4 different colors and a clear button. For size reference, it’s about the size of an airpod pro case. ~ Plan For this drawpad specifically, I’ll add an erase button and possibly more colors! I will make a retro pingpong game and add it to the overall gameboard. More to come on that. corn….
Added a simple pass You now need to enter the correct passcode to view the drawpad, and it locks by pressing the left side button. Necessary to protect any… private drawings. 👀 But then i just leaked it to everyone who sees this. Oops gotta change it
Ships:
I made a drawpad using Arduino. It includes a screen and a reset button physically. There’s an intial passcode screen to protect your devious drawings and a clear button the side which functions as a lock button or a clear pass attempt. Currently there’s 4 colors and a clear button....
|
1793004756.2612386
|
1793091156.2612386
|
|
59437
|
Fractal Explorer by @exasperadou | Stardance
|
exasperadou
|
1
|
4.0
|
13
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T01:42:29Z", "hours": 4.0, "multiplier": 3.46, "payout": 13, "blessing": "neutral", "text": "Fractal Explorer is a fractal visualizer where you can explore fractals and create your own. This project wasn’t as fun as i expected :( . I had to learn some OpenGL and it was kinda hard but i did know some C, which helped me understand some of the syntax and logic. School started which caused me to not work on this a lot, but i did it. I hope you like it", "repo": "https://github.com/exasperadou-max/fractal-Explorer", "demo": "https://exasperadou-max.github.io/fractal-Explorer/"}]...
|
[{"post_id": 71479, "ts": "202 [{"post_id": 71479, "ts": "2026-09-20T22:00:17Z", "hours": 2.0667, "text": "Im done!!!"}, {"post_id": 65709, "ts": "2026-09-11T01:21:16Z", "hours": 1.2756, "text": "I progressed on the CSS and the design of the page, not the fractal yet :)"}, {"post_id": 63960, "ts": "2026-09-08T01:40:30Z", "hours": 0.3536, "text": "Fractal Explorer is a website where you can visualize and explore some fractals and even make your own :) . I finished the html and it looks good so far, i actually took like 1.4 hours doing this but the hackatime didnt work so i had to reset it and make it work"}]...
|
Title: Fractal Explorer by @exasperadou | Stardanc Title: Fractal Explorer by @exasperadou | Stardance
Devlogs:
Fractal Explorer is a website where you can visualize and explore some fractals and even make your own :) . I finished the html and it looks good so far, i actually took like 1.4 hours doing this but the hackatime didnt work so i had to reset it and make it work
I progressed on the CSS and the design of the page, not the fractal yet :)
Im done!!!
Ships:
Fractal Explorer is a fractal visualizer where you can explore fractals and create your own. This project wasn’t as fun as i expected :( . I had to learn some OpenGL and it was kinda hard but i did know some C, which helped me understand some of the syntax and logic. School started which caused me to not work on this a lot, but i did it. I hope you like it...
|
1793008208.0846117
|
1793094608.0846117
|
|
24246
|
Pineapple Chess GUI by @Theenash | Stardance
|
Theenash
|
2
|
28.0
|
448
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T01:40:27Z", "hours": 6.0, "multiplier": 8.66, "payout": 64, "blessing": "neutral", "text": "I made a chess software called Pineapple Chess, this is my second ship on this project, this ship is the major change of porting it to the web. The summary will stay mostly the same for any newcomers to the second ship. — SUMMARY — So basically it’s like any other chess software but it is pineapple themed(don’t worry if you don’t like the way it looks you can switch themes)! With 3 themes: Light, Dark, and Pineapple! There is a 2 player mode, if you have 2 people in front of a computer, you can play against each other on 1 computer! With an optional board flip feature! You can play against bots, powered by Stockfish, you can play against bots with different difficulties. And this time built with Javascript. Basically the original version was made in Java, but in the last ship, I got a lot of feedback saying I should port this to the web, so I did! — LINKS — To Play on web: Play now: https://shadowtech1234.github.io/pineapplechess/ — CHALLENGES — Here are some challenges I faced. When I first started porting this, I had to learn another brand new language that I had never used, which is JavaScript(last time was Java), so it took me a while to get used to it and progress was very slow at the start. Like a lot of hours I spent on the project was not really captured by Hackatime because I was on documentation and troubleshooting a lot. A very, very big task was efficiency. JavaScript is very, very fragile. I had a lot of problems where it would always freeze and stop, which lead to phantom moves in chess and broke it a lot. Learning to code in JavaScript with this efficiency was a bit hard because I had to make sure everything was perfect and there was no holes in it. Like for example in Java, I just coded in whatever way works, and there probably was holes and leaks in that but it wouldn’t be noticeable, in JavaScript it was the complete opposite. (This is what I noticed when I coded, I don’t know if this is factual that JavaScript is very hard when coding to make sure it’s efficient, it might just be me) Another problem was when I tried putting this on GitHub Pages, because the source for it had to be like in one folder I had to rearrange my code and rewrite some parts to make it work on GitHub Pages, The last challenge I faced was stopping. This is the same as last time. I have a lot of ideas to add to this, but I realized that if I did all of it, it would be a waste of time. This includes adding a evaluation bar, game export and import, game analysis, and maybe multiplayer. Working on this is a fun side project but I don’t have the time to work on it as much right now as I have a lot of work from school, and Stardance is ending soon anyways, so I wanted to get it as polished as possible and ship it. That’s basically it. I had a lot of fun making this, it’s not much but I will add features in the future, maybe in the next Hack Club event. Thank you!", "repo": "https://github.com/Shadowtech1234/pineapplechess", "demo": "https://shadowtech1234.github.io/pineapplechess/"}, {"ship_num": 2, "ts": "2026-08-03T00:03:27Z", "hours": 22.0, "multiplier": 14.56, "payout": 384, "blessing": "neutral", "text": "I made a chess software called Pineapple Chess. — SUMMARY — So basically it’s like any other chess software but it is pineapple themed(don’t worry if you don’t like the way it looks you can switch themes)! With 3 themes: Light, Dark, and Pineapple! There is a 2 player mode, if you have 2 people in front of a computer, you can play against each other on 1 computer! With an optional board flip feature! You can play against bots, powered by Stockfish, you can play against bots with different difficulties. And built with Java. — LINKS — Github: https://github.com/Shadowtech1234/pineapplechess/ If you want to download, simply go to the Github repo, and go to the releases tab and download it! For more detailed instructions, it is on the Github readme. — SHOWCASE VIDEO — Showcase video is available on the very top of the readme in the Github repo. (I wasn’t able to attach the video to this Ship post) — CHALLENGES — Here are some challenges I faced. When I first started, I had to learn a brand new language that I had never used, which is Java, so it took me a while to get used to it and progress was very slow at the start. Like a lot of hours I spent on the project was not really captured by Hackatime because I was on documentation and troubleshooting a lot. A very, very big task was app resizing. What I mean is when you resize the app, for example make it fit the entire screen, the app has to make every component scale up, or scale down with a ratio to make it look good. This took me so long to implement and it works, there is just one problem, you have to click the app after you change the window for the resize to apply, so it looks weird when you resize, but you just need to click on the app to refresh it. Hopefully I can fix that in the next update of my app. Another problem was when I tried building my app to an installer to make it as easy as possible for the user. It just never worked for a while. Like every time I tried to build it would give me a problem, and after I fixed it it just gave me another. This went on 7 times. Of the times I had to rewrite a couple major parts of my app including image loading of the pieces, it worked well in developer mode(which is just clicking the run button in VS Code), but Java kind works differently when compiled into a finished product, so the images didn’t load in a couple builds. But now it works and has a user-friendly installer. The last challenge I faced was stopping. I have a lot of ideas to add to this, but I realized that if I did all of it, it would be a waste of time. This includes multi-platform support over MacOS and Linux, not only Windows. Working on this is a fun side project but I want to do something more meaningful. So I am shipping this project right now and trying to make it as clean as possible with the current features of the app, and moving on to the next project. I will still be working on this project, but I will probably come back to it after summer ends or ever later. That’s basically it. I had a lot of fun making the app, it’s not much but I will add features in the future. Thank you!", "repo": "https://github.com/Shadowtech1234/pineapplechess", "demo": "https://shadowtech1234.github.io/pineapplechess/"}]...
|
[{"post_id": 71505, "ts": "202 [{"post_id": 71505, "ts": "2026-09-20T23:20:37Z", "hours": 6.0689, "text": "JavaScript Port After finishing Pineapple Chess in Java , which meant you need to download my app, which is Windows only, I started getting a lot of people asking if I could port this to the web. So I did, yay. From Java to JavaScript The original version of Pineapple Chess was built entirely in Java, and after finishing it, I figured porting it to JavaScript would be a pretty interesting challenge. The reason why I have to use JavaScript for anyone curious is because that is one of the best for web development. The goal was to recreate the game in JavaScript while keeping the same basic gameplay and features from the original version. This meant going through the original code and rebuilding a lot of the game’s logic in a completely different language. Rebuilding the Game One of the biggest parts of the process was getting the chess logic working again. I had to recreate things like: Piece movement Check and checkmate Special chess moves Turn switching Selecting and moving pieces Detecting when the game ends Since I already had the Java version working, I wasn’t starting completely from scratch. I could use the original game as a reference for how everything was supposed to work, which made the process a lot easier. Why JavaScript? The main reason for making the JavaScript version was accessibility. The original Java version worked, but having a JavaScript version makes it much easier to run and share. Instead of needing to set up the Java version first, the JavaScript version can be used in a much more web-friendly environment. Basically, Pineapple Chess is now significantly easier to get running. And That’s a Wrap! This is actually going to be my last devlog for this event. With the event ending in about two weeks, I wanted to squeeze in one last piece of work before it wraps up, and porting Pineapple Chess to JavaScript felt like the perfect way to finish things off. I know this devlog isn’t much of a change, and there are a lot of features in Pineapple Chess that I would love to add, it’s just I don’t have the time as I have a lot of work in school, and Stardance is ending soon, I will be working on this in the future though. It’s pretty cool seeing a project that I originally made in Java now running in JavaScript. The original version isn’t going anywhere, but now Pineapple Chess has a new form too. I will be shipping this soon, stay tuned! And also, thank you to everyone who followed along with my devlogs, gave feedback, played Pineapple Chess, or suggested things for me to work on. All of the feedback and support throughout the event has genuinely been really helpful and made working on this project a lot more fun. It’s been awesome being able to work on Pineapple Chess throughout this event, it’s not a big project like what other people make but it was a passion project for me for fun. One last update before the event ends. 🍍❤️ Thanks for reading, and I’ll see you around the next Hack Club event!"}, {"post_id": 38375, "ts": "2026-07-31T18:34:51Z", "hours": 1.9519, "text": "I WAS SANE BEFORE TODAY😭😭😭. I have done it, I have finished my app. That part was so easy. But compiling it into a downloadable installer has cost me so much I might as well have sold my soul. I had to build the stupid thing 7 TIMES. I had to mess around with the dependencies for so long, this took like 8 hours but most of it was just trying to fix dependencies and working in the terminal trying to debug why my installer wont work. My installer now works never the less. It is very easy to install in a user’s perspective and it automatically makes a shortcut in the desktop. Sadly this installer is only for windows, sorry Mac and Linux. I will be shipping this project soon. As you can see in the pictures attached, it created the shortcut! And it works!🎉🎉🎉"}, {"post_id": 37946, "ts": "2026-07-31T00:05:38Z", "hours": 4.3528, "text": "This for some reason genuinely took the life out of me. I have finally added the whole point of this chess app, PINEAPPLES! NEW BOARD COLOR, NEW UI THEME, NEW CHESS PEICES. Don’t worry, if you or any other user doesn’t like it, I have added the ability in settings to be able to switch between Light, Dark, and Pineapple Mode. But why would you not want to play with this beauty! The addition of the theme was easy, it was the settings that your able to switch themes that was the hard part. On top of that since I added new chess pieces, the entirety of the image load system in my code and organization of the resources in the source code had to be completely redone, the re-organizing for the file management was not tracked by hackatime but that took way too long. But yea, yay🎉🎉🎉"}, {"post_id": 30885, "ts": "2026-07-18T21:08:29Z", "hours": 4.2989, "text": "I have successfully added Stockfish, an chess engine that is extremely powerful to my app. Took a bit of work, but now you can play against a bot! I have added setting to customize the game against Stockfish if you click it so there’s difficulty selection and the side chooser which lets you choose which side you want to play on. Hardest part was getting the code to work with Stockfish as Stockfish communicates via the Universal Chess Interface (UCI) protocol. The chess engine itself is basically a command line and you can put in the current position and it will spit out the best move in the command line. Its not very user friendly which is why chess GUI’s come in to play like mine, my code translates it from he UI to the command line and vice versa. UCI lets me to be able to use any chess engine I want as long as it uses the UCI protocol, meaning in the future if I decide to make my own chess engine, I can implement it to my app, but for now it will remain as Stockfish."}, {"post_id": 25560, "ts": "2026-07-09T21:44:03Z", "hours": 3.5764, "text": "A LOT OF NEW STUFF. Easiest part was dark mode yay. but what took me 3 hours and was so hard to do was reseizing, what I mean is you can resize the app how ever way and it works with any screen and it always sets the board at the center, I don’t know why it took this long but I did it yay. I have attached a example of it centering it self on multiple aspect ratios."}, {"post_id": 15990, "ts": "2026-06-25T23:28:19Z", "hours": 1.3036, "text": "for a very small feature, this should not have taken this long. i added 2 features, the side bar in the left for future stuff, the play button on he left allows to choose the game mode when i add the feature to be able to play bots, i want to be able to choose what I want to be able to do, either play 2 player or bots, so basically the sidebar is the foundation for future features. Then is the feature that should have taken like 10 minutes, but it took me a hour and a half. It is the feature that flips the board after every turn in 2 player mode because 2 player means 2 people are using one computer to play so the board should flip. Like it used to flip the peices were upside down, liekt he images were, and i tried to add code to make it flip but it didnt work, so then I added a seperate folder with the peices edited to be flipped, but then after implemeting that, id id some stuff it swithc the pictures to that folder only when the baord is flipped, BUT THEN IT STILL REMAINED FLIPPED. So i tried so much to finally figure out I did somehtign that amde the peices flip by themselves without editing and using the different stuff, but when i tired to remove the folder andf only use one folder wiht the peices IT STOPPED WORKING, so now I have 2 folder wiht the exact same pictures of the peices and it works😭. sry if I yapped too much but I needed to vent, In the picture attached it shows the baord flipped and the sidebar as well if you wanna see the final product of the work ive done so far. but im gieunly tweaking rn😭"}, {"post_id": 15336, "ts": "2026-06-24T22:21:00Z", "hours": 0.63, "text": "added a new popup system where instead of it opening a new separate window with the popup, it is more cleaner and in the app, my next step is to add a sidebar to the left and have like a bunch of different stuff there 😄"}, {"post_id": 15119, "ts": "2026-06-24T15:53:12Z", "hours": 1.2217, "text": "BIG PROGRESS, fixed possible move highlights. added a move history to the side, and added draw detection for all possible draws. Next job is hopefully being able to export and import PGN."}, {"post_id": 14788, "ts": "2026-06-24T00:56:39Z", "hours": 1.1747, "text": "A lot of progress has been done, I have put in all the special moves like castling, en passant, and pawn promotion. And I have also added check and checkmate detection. Also I have added UI popups that appear when you promote so you can choose what piece you want as well as the game over pop up when you checkmate and a rematch button which resets the board. So foundation of my chess game GUI is complete, I have recreated the game, I just have some small tweaks that i can do later like when you click a piece while you are in check, it still shows the viable options that don’t protect your king, but it wont let you move there but it still shows it. On top of that I also want to make the pop ups happen in game without opening a new window. But my main next step is add a move history, draw detection, which can only be done with a move history because 2 ways a draw can happen is when 50 moves have passed and a piece has not been captured, or the same position has been repeated 3 times."}, {"post_id": 14609, "ts": "2026-06-23T19:40:15Z", "hours": 1.9833, "text": "I have made my chess board render pieces, show viable moves, make moves, and only allow legal moves. Not all special moves have been added like castling, en passant, pawn promotion, stalemate, or even checkmate(you can take the opponent’s king and the opponent can still move😭)."}, {"post_id": 14437, "ts": "2026-06-23T15:52:11Z", "hours": 0.7981, "text": "I made the Chess Board"}, {"post_id": 14362, "ts": "2026-06-23T13:55:21Z", "hours": 0.6683, "text": "I have started my project, most of my time was taken switching my GUI from Java Swing to JavaFX. This is just a simple window so far but we are going somewhere. This isn’t a lot but I am learning Java, so its just slow and steady progress."}]...
|
Title: Pineapple Chess GUI by @Theenash | Stardanc Title: Pineapple Chess GUI by @Theenash | Stardance
Devlogs:
I have started my project, most of my time was taken switching my GUI from Java Swing to JavaFX. This is just a simple window so far but we are going somewhere. This isn’t a lot but I am learning Java, so its just slow and steady progress.
I made the Chess Board
I have made my chess board render pieces, show viable moves, make moves, and only allow legal moves. Not all special moves have been added like castling, en passant, pawn promotion, stalemate, or even checkmate(you can take the opponent’s king and the opponent can still move😭).
A lot of progress has been done, I have put in all the special moves like castling, en passant, and pawn promotion. And I have also added check and checkmate detection. Also I have added UI popups that appear when you promote so you can choose what piece you want as well as the game over pop up when you checkmate and a rematch button which resets the board. So foundation of my chess game GUI is complete, I have recreated the game, I just have some small tweaks that i can do later like when you click a piece while you are in check, it still shows the viable options that don’t protect your king, but it wont let you move there but it still shows it. On top of that I also want to make the pop ups happen in game without opening a new window. But my main next step is add a move history, draw detection, which can only be done with a move history because 2 ways a draw can happen is when 50 moves have passed and a piece has not been captured, or the same position has been repeated 3 times.
BIG PROGRESS, fixed possible move highlights. added a move history to the side, and added draw detection for all possible draws. Next job is hopefully being able to export and import PGN.
added a new popup system where instead of it opening a new separate window with the popup, it is more cleaner and in the app, my next step is to add a sidebar to the left and have like a bunch of different stuff there 😄
for a very small feature, this should not have taken this long. i added 2 features, the side bar in the left for future stuff, the play button on he left allows to choose the game mode when i add the feature to be able to play bots, i want to be able to choose what I want to be able to do, either play 2 player or bots, so basically the sidebar is the foundation for future features. Then is the feature that should have taken like 10 minutes, but it took me a hour and a half. It is the feature that flips the board after every turn in 2 player mode because 2 player means 2 people are using one computer to play so the board should flip. Like it used to flip the peices were upside down, liekt he images were, and i tried to add code to make it flip but it didnt work, so then I added a seperate folder with the peices edited to be flipped, but then after implemeting that, id id some stuff it swithc the pictures to that folder only when the baord is flipped, BUT THEN IT STILL REMAINED FLIPPED. So i tried so much to finally figure out I did somehtign that amde the peices flip by themselves without editing and using the different stuff, but when i tired to remove the folder andf only use one folder wiht the peices IT STOPPED WORKING, so now I have 2 folder wiht the exact same pictures of the peices and it works😭. sry if I yapped too much but I needed to vent, In the picture attached it shows the baord flipped and the sidebar as well if you wanna see the final product of the work ive done so far. but im gieunly tweaking rn😭
A LOT OF NEW STUFF. Easiest part was dark mode yay. but what took me 3 hours and was so hard to do was reseizing, what I mean is you can resize the app how ever way and it works with any screen and it always sets the board at the center, I don’t know why it took this long but I did it yay. I have attached a example of it centering it self on multiple aspect ratios.
I have successfully added Stockfish, an chess engine that is extremely powerful to my app. Took a bit of work, but now you can play against a bot! I have added setting to customize the game against Stockfish if you click it so there’s difficulty selection and the side chooser which lets you choose which side you want to play on. Hardest part was getting the code to work with Stockfish as Stockfish communicates via the Universal Chess Interface (UCI) protocol. The chess engine itself is basically a command line and you can put in the current position and it will spit out the best move in the command line. Its not very user friendly which is why chess GUI’s come in to play like mine, my code translates it from he UI to the command line and vice versa. UCI lets me to be able to use any chess engine I want as long as it uses the UCI protocol, meaning in the future if I decide to make my own chess engine, I can implement it to my app, but for now it will remain as Stockfish.
This for some reason genuinely took the life out of me. I have finally added the whole point of this chess app, PINEAPPLES! NEW BOARD COLOR, NEW UI THEME, NEW CHESS PEICES. Don’t worry, if you or any other user doesn’t like it, I have added the ability in settings to be able to switch between Light, Dark, and Pineapple Mode. But why would you not want to play with this beauty! The addition of the theme was easy, it was the settings that your able to switch themes that was the hard part. On top of that since I added new chess pieces, the entirety of the image load system in my code and organization of the resources in the source code had to be completely redone, the re-organizing for the file management was not tracked by hackatime but that took way too long. But yea, yay🎉🎉🎉
I WAS SANE BEFORE TODAY😭😭😭. I have done it, I have finished my app. That part was so easy. But compiling it into a downloadable installer has cost me so much I might as well have sold my soul. I had to build the stupid thing 7 TIMES. I had to mess around with the dependencies for so long, this took like 8 hours but most of it was just trying to fix dependencies and working in the terminal trying to debug why my installer wont work. My installer now works never the less. It is very easy to install in a user’s perspective and it automatically makes a shortcut in the desktop. Sadly this installer is only for windows, sorry Mac and Linux. I will be shipping this project soon. As you can see in the pictures attached, it created the shortcut! And it works!🎉🎉🎉
JavaScript Port After finishing Pineapple Chess in Java , which meant you need to download my app, which is Windows only, I started getting a lot of people asking if I could port this to the web. So I did, yay. From Java to JavaScript The original version of Pineapple Chess was built entirely in Java, and after finishing it, I figured porting it to JavaScript would be a pretty interesting challenge. The reason why I have to use JavaScript for anyone curious is because that is one of the best for web development. The goal was to recreate the game in JavaScript while keeping the same basic gameplay and features from the original version. This meant going through the original code and rebuilding a lot of the game’s logic in a completely different language. Rebuilding the Game One of the biggest parts of the process was getting the chess logic working again. I had to recreate things like: Piece movement Check and checkmate Special chess moves Turn switching Selecting and moving pieces Detecting when the game ends Since I already had the Java version working, I wasn’t starting completely from scratch. I could use the original game as a reference for how everything was supposed to work, which made the process a lot easier. Why JavaScript? The main reason for making the JavaScript version was accessibility. The original Java version worked, but having a JavaScript version makes it much easier to run and share. Instead of needing to set up the Java version first, the JavaScript version can be used in a much more web-friendly environment. Basically, Pineapple Chess is now significantly easier to get running. And That’s a Wrap! This is actually going to be my last devlog for this event. With the event ending in about two weeks, I wanted to squeeze in one last piece of work before it wraps up, and porting Pineapple Chess to JavaScript felt like the perfect way to finish things off. I know this devlog isn’t much of a change, and there are a lot of features in Pineapple Chess that I would love to add, it’s just I don’t have the time as I have a lot of work in school, and Stardance is ending soon, I will be working on this in the future though. It’s pretty cool seeing a project that I originally made in Java now running in JavaScript. The original version isn’t going anywhere, but now Pineapple Chess has a new form too. I will be shipping this soon, stay tuned! And also, thank you to everyone who followed along with my devlogs, gave feedback, played Pineapple Chess, or suggested things for me to work on. All of the feedback and support throughout the event has genuinely been really helpful and made working on this project a lot more fun. It’s been awesome being able to work on Pineapple Chess throughout this event, it’s not a big project like what other people make but it was a passion project for me for fun. One last update before the event ends. 🍍❤️ Thanks for reading, and I’ll see you around the next Hack Club event!
Ships:
I made a chess software called Pineapple Chess. — SUMMARY — So basically it’s like any other chess software but it is pineapple themed(don’t worry if you don’t like the way it looks you can switch themes)! With 3 themes: Light, Dark, and Pineapple! There is a 2 player mode, if you have 2 people in front of a computer, you can play against each other on 1 computer! With an optional board flip feature! You can play against bots, powered by Stockfish, you can play against bots with different difficulties. And built with Java. — LINKS — Github: https://github.com/Shadowtech1234/pineapplechess/ If you want to download, simply go to the Github repo, and go to the releases tab and download it! For more detailed instructions, it is on the Github readme. — SHOWCASE VIDEO — Showcase video is available on the very top of the readme in the Github repo. (I wasn’t able to attach the video to this Ship post) — CHALLENGES — Here are some challenges I faced. When I first started, I had to learn a brand new language that I had never used, which is Java, so it took me a while to get used to it and progress was very slow at the start. Like a lot of hours I spent on the project was not really captured by Hackatime because I was on documentation and troubleshooting a lot. A very, very big task was app resizing. What I mean is when you resize the app, for example make it fit the entire screen, the app has to make every component scale up, or scale down with a ratio to make it look good. This took me so long to implement and it works, there is just one problem, you have to click the app after you change the window for the resize to apply, so it looks weird when you resize, but you just need to click on the app to refresh it. Hopefully I can fix that in the next update of my app. Another problem was when I tried building my app to an installer to make it as easy as possible for the user. It just never worked for a while. Like every time I tried to build it would give me a problem, and after I fixed it it just gave me another. This went on 7 times. Of the times I had to rewrite a couple major parts of my app including image loading of the pieces, it worked well in developer mode(which is just clicking the run button in VS Code), but Java kind works differently when compiled into a finished product, so the images didn’t load in a couple builds. But now it works and has a user-friendly installer. The last challenge I faced was stopping. I have a lot of ideas to add to this, but I realized that if I did all of it, it would be a waste of time. This includes multi-platform support over MacOS and Linux, not only Windows. Working on this is a fun side project but I want to do something more meaningful. So I am shipping this project right now and trying to make it as clean as possible with the current features of the app, and moving on to the next project. I will still be working on this project, but I will probably come back to it after summer ends or ever later. That’s basically it. I had a lot of fun making the app, it’s not much but I will add features in the future. Thank you!
I made a chess software called Pineapple Chess, this is my second ship on this project, this ship is the major change of porting it to the web. The summary will stay mostly the same for any newcomers to the second ship. — SUMMARY — So basically it’s like any other chess software but it is pineapple themed(don’t worry if you don’t like the way it looks you can switch themes)! With 3 themes: Light, Dark, and Pineapple! There is a 2 player mode, if you have 2 people in front of a computer, you can play against each other on 1 computer! With an optional board flip feature! You can play against bots, powered by Stockfish, you can play against bots with different difficulties. And this time built with Javascript. Basically the original version was made in Java, but in the last ship, I got a lot of feedback saying I should port this to the web, so I did! — LINKS — To Play on web: Play now: https://shadowtech1234.github.io/pineapplechess/ — CHALLENGES — Here are some challenges I faced. When I first started porting this, I had to learn another brand new language that I had never used, which is JavaScript(last time was Java), so it took me a while to get used to it and progress was very slow at the start. Like a lot of hours I spent on the project was not really captured by Hackatime because I was on documentation and troubleshooting a lot. A very, very big task was efficiency. JavaScript is very, very fragile. I had a lot of problems where it would always freeze and stop, which lead to phantom moves in chess and broke it a lot. Learning to code in JavaScript with this efficiency was a bit hard because I had to make sure everything was perfect and there was no holes in it. Like for example in Java, I just coded in whatever way works, and there probably was holes and leaks in that but it wouldn’t be noticeable, in JavaScript it was the complete opposite. (This is what I noticed when I coded, I don’t know if this is factual that JavaScript is very hard when coding to make sure it’s efficient, it might just be me) Another problem was when I tried putting this on GitHub Pages, because the source for it had to be like in one folder I had to rearrange my code and rewrite some parts to make it work on GitHub Pages, The last challenge I faced was stopping. This is the same as last time. I have a lot of ideas to add to this, but I realized that if I did all of it, it would be a waste of time. This includes adding a evaluation bar, game export and import, game analysis, and maybe multiplayer. Working on this is a fun side project but I don’t have the time to work on it as much right now as I have a lot of work from school, and Stardance is ending soon anyways, so I wanted to get it as polished as possible and ship it. That’s basically it. I had a lot of fun making this, it’s not much but I will add features in the future, maybe in the next Hack Club event. Thank you!...
|
1792983086.0330443
|
1793069486.0330443
|
|
7577
|
Sonora Music by @Samuel-Dingle | Stardance
|
Samuel-Dingle
|
1
|
15.0
|
112
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T01:34:20Z", "hours": 15.0, "multiplier": 7.41, "payout": 112, "blessing": "neutral", "text": "I built a macOS native music app called Sonora Music. It is designed to be a simple music player for local files. It uses Apple’s own AV Frameworks in order to be lightweight. The main thing I found challenging at the start was configuring all of the rust code to get actual audio playback. After some reading and a bit of help from AI, I was able to get a basic player, from which I scaled up with Shuffle, Repeat, a working playbar that supports scrubbing, and a queue system. To try out the project, just click the try project button and download the latest release from github. I have included 2 songs to test the app with!", "repo": "https://github.com/TheApparition1/Sonora-Music", "demo": "https://github.com/TheApparition1/Sonora-Music/releases"}]...
|
[{"post_id": 71504, "ts": "202 [{"post_id": 71504, "ts": "2026-09-20T23:07:40Z", "hours": 1.9058, "text": "Devlog 7 - Sonora Music I decided that with so little time left with Stardance, it wasn’t worth migrating to a new audio engine, especially with all the testing that would have to be done. I ended up deciding to just clean up the app, fix some small errors and making general fixes here and there. Here’s a short list of some bugs I fixed: Fixed a loud bang when spamming skip or closing the app with media playing The app being unable to select directories with only one file Broken UI theme selection Other than that, I’ve just spent time on rewording the readme and making the DMG background and App logo to prepare for shipping the app. Of course in typical developer logic, the build command just has to break, only for me to spend time debugging a missing image file."}, {"post_id": 52821, "ts": "2026-08-23T05:24:42Z", "hours": 2.95, "text": "Devlog 6 - Sonora Music So I left this project alone for a while to focus on other things, but i’m back! I ended up fixing a few bugs here and there, and removing 2 themes I thought didn’t look great. I also added a fallback for that, so if you were using Sonora with that theme, and updated, your app won’t break. I fixed a few memory leaks, mostly because I fell victim to a bunch of them while writing code and testing things. From what I can tell, it was because AVAudioPlayer wasn’t properly releasing itself. This meant that more instances accumulated over time, eating up more RAM and CPU. I also did some visual polishing, by cleaning up unnecessary icons I added, and also just making the UI more refined. I pinned the playbar and controls to the bottom of the screen so that you can always see the controls, and fixed the broken color swatches for the themes so you can see what you are applying. I’m getting close to being ready to ship this project, all I really have left to do is to decide if migrating to AVAudioEngine is worth it as it is an extremely intensive task, and will require lots of tedious work and debugging. The other thing I’ll consider is writing a windows build in Symphonia or some other thing so that this can be cross platform. The main reason I am migrating is so that I can have more refined control of the signal chain and DSP (The chain that your audio passes through and how it is modified, say for an EQ). AVAudioPlayer is designed to just play audio easily, where I want more control and be able to implement the ability to add EQ down the line to further enhance the experience. Hopefully the migration goes well, and I should be able to ship in the next week or two."}, {"post_id": 22506, "ts": "2026-07-05T00:38:03Z", "hours": 4.9175, "text": "Sonora Music – Pain Edition After a week of absolute debugging hell, I finally located and fixed an issue that prevented audio from playing entirely. That took up most of my week, and I also forgot to reinstall Wakatime after I reset my laptop and lost 2-3 hrs there :( While I was at it, I also added Shuffle and Repeat functionality, making the player a bit nicer to use. I’m currently experimenting with a few UI prototypes because I’d really like to add proper playlist creation and management in the future. In terms of releases, I uploaded the first version to GitHub, then realised I built my backup one that didn’t have shuffle and repeat, or the customisation. After uploading the correct build, my next steps are just to update the Sonora Website (another Stardance project ofc) Here’s what I want to tackle next: Migrate the audio system to AVAudioEngine so I can implement more advanced audio features. Add a 3-band EQ (This is why I need to migrate over to AVAudioEngine, as my current AVF Framework doesn’t have support for these types of things or DSP in general). Implement a proper library and playlist view. Create a few custom themes which are similar to the current palette. Add a dedicated Settings page for things like themes, EQ controls, and other app parameters to keep the main UI less cluttered. Overall, this update was mostly focused on bug fixes and polishing. Aside from the features above, I also designed a custom application logo and branded the DMG installer with a custom Sonora Music background, replacing the plain white installer window with something that actually matches the application’s style. Hopefully, the next devlog is a little less about debugging and a little more about adding new features. Maybe? Please???"}, {"post_id": 12851, "ts": "2026-06-21T01:30:51Z", "hours": 1.2872, "text": "I was able to add a working play bar to the app and got the controls to work so that you are now able to skip forward and back songs. I now want to remove that scroll bar on the side and pin the play controls to the bottom of the screen."}, {"post_id": 12428, "ts": "2026-06-20T08:53:34Z", "hours": 0.7778, "text": "So I decided to pivot the whole application to be macOS native by using AVFoundation for Audio. I had too many issues with rodio which is used with rust. While this means it is only for macOS users, it does mean that I can focus on creating for only one OS, and I can develop easier and better. After implementing AVFoundation I am able to select a song using the UI I developed earlier, and then play the song. The next step is to add player controls and a time bar, and work on adding a shuffle feature."}, {"post_id": 12396, "ts": "2026-06-20T07:11:11Z", "hours": 0.4494, "text": "I added logic to select a folder for music and have it list the songs in the folder! I’m now going to add the ability to play music back"}, {"post_id": 11065, "ts": "2026-06-18T03:15:52Z", "hours": 2.8081, "text": "I added the main UI as a mockup. This is only the first page, the player window. Eventually I will add a few more pages and only after will I write the logic to play music."}]...
|
Title: Sonora Music by @Samuel-Dingle | Stardance
Title: Sonora Music by @Samuel-Dingle | Stardance
Devlogs:
I added the main UI as a mockup. This is only the first page, the player window. Eventually I will add a few more pages and only after will I write the logic to play music.
I added logic to select a folder for music and have it list the songs in the folder! I’m now going to add the ability to play music back
So I decided to pivot the whole application to be macOS native by using AVFoundation for Audio. I had too many issues with rodio which is used with rust. While this means it is only for macOS users, it does mean that I can focus on creating for only one OS, and I can develop easier and better. After implementing AVFoundation I am able to select a song using the UI I developed earlier, and then play the song. The next step is to add player controls and a time bar, and work on adding a shuffle feature.
I was able to add a working play bar to the app and got the controls to work so that you are now able to skip forward and back songs. I now want to remove that scroll bar on the side and pin the play controls to the bottom of the screen.
Sonora Music – Pain Edition After a week of absolute debugging hell, I finally located and fixed an issue that prevented audio from playing entirely. That took up most of my week, and I also forgot to reinstall Wakatime after I reset my laptop and lost 2-3 hrs there :( While I was at it, I also added Shuffle and Repeat functionality, making the player a bit nicer to use. I’m currently experimenting with a few UI prototypes because I’d really like to add proper playlist creation and management in the future. In terms of releases, I uploaded the first version to GitHub, then realised I built my backup one that didn’t have shuffle and repeat, or the customisation. After uploading the correct build, my next steps are just to update the Sonora Website (another Stardance project ofc) Here’s what I want to tackle next: Migrate the audio system to AVAudioEngine so I can implement more advanced audio features. Add a 3-band EQ (This is why I need to migrate over to AVAudioEngine, as my current AVF Framework doesn’t have support for these types of things or DSP in general). Implement a proper library and playlist view. Create a few custom themes which are similar to the current palette. Add a dedicated Settings page for things like themes, EQ controls, and other app parameters to keep the main UI less cluttered. Overall, this update was mostly focused on bug fixes and polishing. Aside from the features above, I also designed a custom application logo and branded the DMG installer with a custom Sonora Music background, replacing the plain white installer window with something that actually matches the application’s style. Hopefully, the next devlog is a little less about debugging and a little more about adding new features. Maybe? Please???
Devlog 6 - Sonora Music So I left this project alone for a while to focus on other things, but i’m back! I ended up fixing a few bugs here and there, and removing 2 themes I thought didn’t look great. I also added a fallback for that, so if you were using Sonora with that theme, and updated, your app won’t break. I fixed a few memory leaks, mostly because I fell victim to a bunch of them while writing code and testing things. From what I can tell, it was because AVAudioPlayer wasn’t properly releasing itself. This meant that more instances accumulated over time, eating up more RAM and CPU. I also did some visual polishing, by cleaning up unnecessary icons I added, and also just making the UI more refined. I pinned the playbar and controls to the bottom of the screen so that you can always see the controls, and fixed the broken color swatches for the themes so you can see what you are applying. I’m getting close to being ready to ship this project, all I really have left to do is to decide if migrating to AVAudioEngine is worth it as it is an extremely intensive task, and will require lots of tedious work and debugging. The other thing I’ll consider is writing a windows build in Symphonia or some other thing so that this can be cross platform. The main reason I am migrating is so that I can have more refined control of the signal chain and DSP (The chain that your audio passes through and how it is modified, say for an EQ). AVAudioPlayer is designed to just play audio easily, where I want more control and be able to implement the ability to add EQ down the line to further enhance the experience. Hopefully the migration goes well, and I should be able to ship in the next week or two.
Devlog 7 - Sonora Music I decided that with so little time left with Stardance, it wasn’t worth migrating to a new audio engine, especially with all the testing that would have to be done. I ended up deciding to just clean up the app, fix some small errors and making general fixes here and there. Here’s a short list of some bugs I fixed: Fixed a loud bang when spamming skip or closing the app with media playing The app being unable to select directories with only one file Broken UI theme selection Other than that, I’ve just spent time on rewording the readme and making the DMG background and App logo to prepare for shipping the app. Of course in typical developer logic, the build command just has to break, only for me to spend time debugging a missing image file.
Ships:
I built a macOS native music app called Sonora Music. It is designed to be a simple music player for local files. It uses Apple’s own AV Frameworks in order to be lightweight. The main thing I found challenging at the start was configuring all of the rust code to get actual audio playback. After some reading and a bit of help from AI, I was able to get a basic player, from which I scaled up with Shuffle, Repeat, a working playbar that supports scrubbing, and a queue system. To try out the project, just click the try project button and download the latest release from github. I have included 2 songs to test the app with!...
|
1793004515.523585
|
1793090915.523585
|
|
9616
|
revo by @ratmuds | Stardance
|
ratmuds
|
1
|
134.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T01:26:40Z", "hours": 134.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I wanted to make a robot arm that punched above it’s weight. The price is pretty similar to smaller robot arms on Amazon that may not include cameras, which would need to be purchased seperately. The way this is achieved by using cheap servos, servos that are 100% NOT made for this purpose, and adding most of the functionality of a smart servo back by using a TON of PCBs. It was a lot of soldering. I just wanted to make something that had more features for less money :) This project was SUPER difficult for me, and pushed my limits a bit. The amount of tolerences especially for the stupid custom motor case and magnet and PCBs and the crazy mainboard and generally having everything play well together took so long, I had many days where I quit frustrated. I’m very happy about how it turned out though, even seeing the lots of shortcomings it has.", "repo": "https://github.com/ratmuds/revo", "demo": ""}]...
|
[{"post_id": 71545, "ts": "202 [{"post_id": 71545, "ts": "2026-09-21T01:17:14Z", "hours": 1.7336, "text": "Finish Project Up :) I wrote a ton in the repository im tired :( https://github.com/ratmuds/revo"}, {"post_id": 71258, "ts": "2026-09-20T15:14:42Z", "hours": 3.1572, "text": "Setup VR and Gripper, Robot Rapidly Disassembles my robot arm is broken I setup VR and fixed some more IK when I go into VR and try playing around, it instantly flies out and throws itself off the table and breaks into pieces. This is going to be fun to fix."}, {"post_id": 70809, "ts": "2026-09-19T19:55:52Z", "hours": 3.8861, "text": "Integration Hell I’ve just been like trying to get this stupid project to work. Screws keep falling out, the IK keeps failing, things are hitting each other and wires are being strained I’m in integration hell. Everything works fine on its own, but combining everything is horrible. I’ve been reassembling and trying to fix this stupid thing for so long. Anyway I’ve went through a few more revisions of some CAD and some more refinements and the gripper and camera is now mounted but this is just incredibly incredibly annoying :(((("}, {"post_id": 69881, "ts": "2026-09-18T00:05:17Z", "hours": 3.8311, "text": "Fixed Broken Magnet, Redoing all IK joint data and offsets, Stereo depth test An encoder magnet broke off, so I had to disassemble and reassemble the top half of the arm to get to the encoder magnet and glue it back on. I also started properly punching in the IK joint data, before it was mostly just random data but now almost all of the data is mostly correct, and I’m waiting for a print to complete that will flip a motor to finally get the IK simulation matching with real life and have the IK endpoint be tracked at the tip of the gripper. It was a lot of trial and error and measurements. I also started experimenting with adding depth estimation. Eventually this could add collision avoidance IK pathfinding, which would be really cool but it’s just a pointcloud in the render right now. But the robot arm is slowly coming together finally! I’ll be able to grab something soon I think."}, {"post_id": 68903, "ts": "2026-09-16T00:31:34Z", "hours": 2.8461, "text": "Assembled Full Arm (not all motors active yet for safety) and Basic Interpolation for Control I assembled the new full arm assembly minus the end effector and didn’t plug in the first two motors as they have the highest chance of doing something really bad. I also made some general changes to the code and also added a flag to some motors to interpolate their movement slowly to not explode the robot arm while controlling it."}, {"post_id": 68352, "ts": "2026-09-15T00:17:44Z", "hours": 2.5044, "text": "Significantly Better Motor Control and Gripper CAD The motor code was getting a bit messy, so I rewrote it. I separated the motor code from the main control code which cleaned it up a bit. LADRC I’m using LADRC now. It’s kind of like PID, but advanced. I took the implementation from online. I feed it the motor current, encoder value, and the target and it goes. The algorithm or whatever somehow calculates the velocity of the motor and how much “effort” it’s using and then gives an effort to put to the motor. It somehow cancels out like disturbances like gravity, backlash, the general physics, etc. As you can see, the motor control is so so so much better than before. It cleanly decelerates. It handles load and dynamically increases effort. Before there was some oscillation because it just couldn’t figure out how to get to the target, this one is just so much better and so hands off. There’s basically like no calibration as it does it over time :)))"}, {"post_id": 67779, "ts": "2026-09-14T00:57:25Z", "hours": 1.4489, "text": "Assembled last 4 DoF for Integrated Test I assembled the MG996R servos in a test piece that will represent the full regular arm segment to test if everything worked. With some fiddling it worked. As you can see there’s more transparent pieces. The pieces that connect the previous joint are transparent to show the Neopixel below it a lot better as before the LED was almost completely occluded. The bright green LEDs power status ones are too bright but I can cover them later."}, {"post_id": 67735, "ts": "2026-09-13T23:20:04Z", "hours": 6.6769, "text": "Dashboard Revamp WIP, Tons of CAD changes, Code Updates, Tolerances I’ve just been refining everything and it’s just going really slowly. Many problems. Magnets shorting out stuff. Magnet too far and not being detected. Wires breaking. I’ve also redesigned the dashboard UI to hopefully look better. I’m still working on it, hopefully it will look more polished later. The dashboard It shows a load speedometer type thing, with the load (max current from a motor out of 500mA) and the temp on the right (for now just dummy value) The motors have cool little animations now too and look less cluttered. I’ve just been working on it a lot. Just everything in general tbh."}, {"post_id": 65061, "ts": "2026-09-09T22:13:56Z", "hours": 5.7644, "text": "Debugging and Fixing Is Killing Me and the Mainboard Exploded :( I have spent SO many hours trying to get this to work. It’s so annoying. This isn’t near how many hours I spent, I’ve been too frustrated to log it. The case is incredibly annoying. Getting the initial case works fine. Doing all of this stuff makes it complicated and break and jam up. The RS485 busses just randomly stop working. The servo output is wiggly and not stable. A PCB header snapped and I didn’t have replacements so I had to bodge solder it back on. The mainboard voltage regulator literally exploded. It was a cheap part but yeah that literally just broke stuff. Fixes to everything. CAD. Firmware. bruh"}, {"post_id": 60577, "ts": "2026-09-03T00:49:54Z", "hours": 6.7731, "text": "MG996Rs Finally Working The servos finally work. I don’t even think this amount of hours logged is equal to how long this took, because I just got tired of it. I think I printed like 20 new revisions of the case and servo mount. It was just so so annoying. While the general case worked, getting a reliable magnet output shaft was impossible. From tolerances, to my own errors to binding to hot glue getting everywhere, or superglue binding random gears, or my getting my fingers stuck to the actual case from superglue (was not fun and hurt) The case finally works. And the prototype code somewhat works too. It basically rotates until the sensor hits zero, it resets the “ticks”. A tick is a raw output from the AS5600. Because this magnet shaft spins faster than the output shaft, like 10x faster, the MCU needs to poll the sensor super quickly, which also needed some optimizations to clear the blocking bus communication wait that would let the magnet skip multiple full turns. The sensor doesn’t internally count turns so we just need to count manually and detect when it jumps from 4096-0 or the other way around. It then spins around until the sensor is hit AGAIN to calculate tick to degrees, assuming the sensor was zeroed before, and then the current ticks would equal 360 degrees. Another problem was the servo needs a PWM signal to move. The threshold from stop to go is pretty garbage on these cheap servos, leading it to spin quite fast already when at the lowest PWM value. Instead when far from the value it increases the PWM signal, closer it brings to minimum and starts linearly flickering the PWM signal from 0 to the speed, with the closer it is the more ratio of time stopped to inch it closer to the target. It actually surprisingly works. It’s very fragile though, any skipped reads, from potentially slow bus transfers would completely throw it off, so all the code running locally on the weak 8 bit MCU needs to be extremely lightweight. Yeah this was super super painful. I’ve been sitting here redoing superglue and code for hours."}, {"post_id": 58979, "ts": "2026-08-31T15:36:35Z", "hours": 3.4036, "text": "Servo Code I did some slight refining to the servo case again, making the tolerances tighter to keep the gears from wobbling. It’s still sort of loose, so I need to just keep trying over and over again. I’m also still writing the servo code. It’s already much more organized than before. I’m also learning Vim keybinds and stuff to try and code faster. The RS485 bus communication works now, and it’s just sending dummy telemetry data back right now. It can also control the servo fine. I’ve just been doing like the lower level architecting I guess, or not really I’m not sure. Before everything was crammed into a single file and now there’s actually header files and multiple source files and it’s actually somewhat readable. I had an issue with LED control for a second but that’s fixed now :)"}, {"post_id": 58467, "ts": "2026-08-30T21:44:37Z", "hours": 2.4922, "text": "V2 Servo Case Working; Servo Code Revamp WIP After around 10 more revisions, the new servo case is fully working with the magnetic extender. The V2 is significantly better designed and higher efficiency than the last, more guess and check result. I’ve also started to rewrite the servo code. Right now, its really messy and just kind of snowballed over time as I’ve slapped on patches and features to a fundamentally weak base. I’m in the progress of writing that now, hopefully it will be done soon. It will also include the new auto calibration and encoder usage and PID (and potentially advanced auto tuned curve to combat motor acceleration overshoot and backlash)"}, {"post_id": 57778, "ts": "2026-08-30T02:16:49Z", "hours": 3.8514, "text": "Working on IK System & Resoldered Joints Again Bruh so my robot arm after finally being assembled by the way exceeded it’s limits and tore its wires out. I had to take apart the mainboard assembly again, which just is SO TEDIOUS. I just dumped solder and hot glue again and fixed a short caused from another wire being sheared off. Also I’m working on the IK system, but it’s not really going well right now. I need to add offsets and config to each of the motors to get them to work correctly. The motors hooked up right now started crashing into my table sadly. Hopefully it will work soon. I also continued working on the servo case. I still haven’t added the code to calibrate and get closed loop control on the MG996R servos. The DS5180 encoders should be easier though."}, {"post_id": 57272, "ts": "2026-08-29T11:42:11Z", "hours": 3.1006, "text": "Reprinted Arm Segments; Added Segment Cover; Servo Mount Working; Working on Web UI I reprinted the arm segments, hopefully for one of the last times, I’ve went through so much filament already. It now allows the mainboard to be neatly packed inside, hiding most of it while still allowing wires to come out. Due to the design of the mainboard, the wires do have to stick out the front like that sadly. To avoid crushing wires, the servo mount has been expanded to allow more clearance for wires and general electronics. The servo mount works now with a new design. I remeasured and adjusted the sketches and added proper hole sizes and a little chamfer to allow the insert to slot in before using a soldering iron to melt it in to help align much better than before. The web UI now shows a representation of the arm. It’s not tuned yet, so the angles are wrong but I’ll fix it soon. I had to move everything from Fusion to Onshape to create the assemblies, and then use a Python library to convert the Onshape assembly into a URDF file that can be rendered with the correct joints inside ThreeJS. Next, I’ll be adding IK and general arm control."}, {"post_id": 56800, "ts": "2026-08-28T18:32:28Z", "hours": 3.1978, "text": "Heatset Inserts Working; Fixing Faulty Motor Power Connections; Internal Fan Power Connectors I verified that the servo cover works, and it’s much much better than the last version. The tolerances are much better this time, leading to less stress on the gears. The same amount of turning uses around 100mA compared to 300mA before, almost reaching it’s limit without any load. Some motor power connectors disconnected, so I found it with a multimeter and added hot glue to some connectors to secure them. I soldered the fan power things inside the PCB, but realized that the JST connectors I’m using are different from the fans. I might have to make a sort of adapter or something by crimping more wires. And the heatset inserts finally work after some tweaking, before the inserts would get misaligned when put in, now with a aligning lip thing it can be slotted in and melted in more accurately."}, {"post_id": 56316, "ts": "2026-08-28T01:34:32Z", "hours": 4.6306, "text": "New Mainboard Cover, Wiring, Bearing Revamp, Heatset Inserts, Servo Cover I added space for the mainboard segment, now it has clearance to actually fit, I redid the cover for this segment, and now it can allow the wires to come out The servo mount now has heatset inserts, because the previous screw in print kept slipping out, but this time the screws just would not go into the inserts through the mount for some reason? The screws went in normally, but with the tolerances, when multiple screws go in they just fight and push against the edge of the insert instead of going in. The MG996R servo housing now has been redesigned, based off of picture references and calipers to attempt to be more accurate than the last one to try and reduce the amount of bad tolerances affecting the gears and making them misaligned, reducing torque output. And just general wiring and CAD work."}, {"post_id": 55294, "ts": "2026-08-27T01:14:32Z", "hours": 2.9064, "text": "Assembled Basic Arm Parts and Packaged Main Board Assembly; Reprogrammed servo MCUs & worked on web UI I redid some soldering on the mainboard PCB, secured connections, and secured everything with tape for now. I’ll likely have to reprint the first arm segment to fit everything in flush because as you can see there are wires and things bulging out of the segment itself right now. I also redesigned the CAD to include heat set inserts. I did programming and a bunch of bug testing and fixing too. An hour of time was lost because Lapse errored out :((((( very sad about that :( I also had an issue with data corruption on the RS485 bus but that is fixed now, and it works like it should."}, {"post_id": 54840, "ts": "2026-08-26T00:29:08Z", "hours": 4.3236, "text": "Mainboard Stack Redo & Firmware Updates and Test Web UI I had to take the electronics out, and redo some of the wiring. The screw terminals are pretty cheap and suck, which makes it incredibly annoying to use as it’s impossible to fit these thicker AWG wires in and they sometimes slide out of the terminals. When I’m done I’m probably going to hot glue the wires. The incredibly fragile flexible extension jumpers for data transfer between the stack is also super fragile, and especially doesn’t grip. Sometimes the data wires just slip out. I took apart the arm, as during testing the motor stripped some screws. I’ve ordered some heat set inserts to prevent that from happening again, which will require me to reprint all the arm segments again. I also added a simple web UI for moving the joints. There is an empty ThreeJS sidebar and the right has some graphs (real data) from the mainboard sensors. The smaller MG996R servos haven’t been mounted yet due to a power delivery issue from the mainboard but hopefully that will be fixed soon."}, {"post_id": 28657, "ts": "2026-07-15T01:25:27Z", "hours": 4.0167, "text": "Test assembly and fitting of robot arm I am mostly done with the core functionality of the mainboard, so i packed everything together and double checked eerything works including power Then I started assembling most of the servos The smaller servo casing doesn’t fit very well, and the transparent window doesn’t fit either But the magnetic cover for the arm segments works great :) It was a lot of fitting, screwing, testing with multimeter, etc"}, {"post_id": 28409, "ts": "2026-07-14T17:26:49Z", "hours": 5.1303, "text": "Finalizing hardware I crimped and soldered almost the remaining wires, I’ve made some last redesigns to the arm CAD and I’m now fitting everything into the new prints and assembling. I’ve also had a ton of trouble with my servo PCBs lately, but I found out a lot of the issue was my programmer is actually fried somehow, so I’m now using an old RPi Pico to act as a UPDI adapter so PlatformIO can now successfully program the ATtinys much better now. A lot of the CAD was slightly tweaked so that everything fits better"}, {"post_id": 26853, "ts": "2026-07-11T21:36:43Z", "hours": 1.175, "text": "Servo firmware almost done The servo firmware now (with the mainboard) sends validation data back and forth so both the servo and mainboard can verify that the data was sent successfully and can ignore corrupted packets because my wiring can be flaky sometimes The firmware now sends real data again and is much more robust, with a proper stateful LED that shows useful information, like offline, online and driving motor, homing, error (fast flashing of LED as red), and the error state is also triggered in the case of corrupted packets (I tried it and it works :)) I’m also still printing out the pieces to assemble the arm. I actually have more hours working on it, I just forgot to log :((((((("}, {"post_id": 26218, "ts": "2026-07-10T21:40:32Z", "hours": 8.1217, "text": "Rewrote all firmware; Fixing Servo Cover and a ton of other CAD; Almost fried everything For the CAD, it doesn’t look like much changed, but I’ve basically redesigned a bunch of things and fixed tolerances and now it should move really smoothly. With the bearings added, everything moves incredibly smoothly now Especially the servo cover was annoying. I needed to attach a magnet to the shaft which was really annoying. I haven’t logged that well, I’ve done more like 15 hours of work instead of just 5 but whatever Most of those hours was the painful debugging. RS-485 busses, JSON not communcating with the PC, dropped connections, corrupted data, disconnected jumpers, FTDI programmer becoming flaky for some reason It’s just been pain :((( Now the PC (screenshot) recieves all the data and sends all the data You can see a lot (not all) of the telemetry being received. Ignore the volts though my math is wrong. Realtime connecting now works smoothly, as you can see the other RS485 servos are offline."}, {"post_id": 24091, "ts": "2026-07-07T13:11:08Z", "hours": 5.9586, "text": "Bidirectional Communication To PC/RPi 5 with LeRobot & More CAD changes I setup a basic class for my robot in LeRobot (which was a little confusing) and then I also got communication between the Pico and my PC working. Originally I have SPI pins exposed on my mainboard PCB to connect to the RPi 5’s GPIO pins, but for some reason after lots of debugging, even running it at super low speeds it just would not work. So I switched to just using serial over USB, and using the SerialTransfer library to send data more reliably. The script on the PC now can send target joint angles, and receive a lot of data back, like if the joint is online, temp, current, angle, homing sensor, home status, LED, firmware version, voltage, etc I also iterated on the CAD for everything, and it should be done soon. It’s just a bunch of tolerance fixes to make everything fit at this point and some new things like mounts for encoders and DC buck modules and fixing the CAD for the custom MG996R case."}, {"post_id": 23468, "ts": "2026-07-06T13:46:37Z", "hours": 1.9767, "text": "Mainboard and other CAD I got the mainboard to stack on top of each other with a weird jumper and two piece jumper holder and some screws setup which required some revisions and trying to get everything to fit. I’ve squeezed one of the DC buck modules into between the mainboard, and the second arm segment will hold the two remaining DC buck modules. The bottom mainboard PCB also has 2 smaller buck modules. There’s a lot of things going on with the voltages in this project due to the servos peak current draw being so large. I also refined the arm segment CAD by some reprints and made the DS5180 servo fit better. I’ve also made one of the buck module mounts for the second arm segment to fit more cleanly."}, {"post_id": 22393, "ts": "2026-07-04T21:03:02Z", "hours": 4.3272, "text": "Servo Control Working, More CAD and 3D Printing I got the mainboard to be able to control the servo on the servo PCBs. I also tested a bunch of the functions, like the magnetic sensor, neopixel LED, etc The communication now sends the PCB ID, and the target speed and the servo PCB echos it back and moves the servo. I also worked on the CAD (and refined) for the mainboard connector that will make connecting the two mainboards not a total pain. I also soldered the connectors on the mainboard PCBs for them to connect to each other."}, {"post_id": 21568, "ts": "2026-07-03T16:23:00Z", "hours": 0.4833, "text": "Servo PCB Daisy Chaining Working I plugged in the JST VH and JST 1.25mm wires into the PCBs, and they seem to work! I adjusted the message struct to hold a desired PCB sort of address or ID. When the MCU detects that the ID matches the PCB (by using the solder jumpers at the bottom of each PCB to program the PCB ID), only then it lights up the LED and replies to the main board. The mainboard now loops through IDs and sends a message and waits for a response. I’m very very happy this worked without any really big problems."}, {"post_id": 21540, "ts": "2026-07-03T15:45:12Z", "hours": 3.4667, "text": "Crimped JST VH wires, Connected JST 1.25mm wires, Soldered more PCB connectors Crimping JST VH wires is a ton easier than JST 1.25mm, and after a bunch of failed attempts still, I got some okay crimps that work finally. It took me a long time because I didn’t know that I had to rotate the wire for the hook on the terminal to go into the housing hole, and then also that the box shape part on the terminal actually has to stick out of the crimper or the crimper will crush the whole terminal into bits"}, {"post_id": 21185, "ts": "2026-07-03T00:14:50Z", "hours": 4.7722, "text": "Finished Soldering all Smaller PCBs & Got RS-485 communication working from main board to servo PCBs First, I finished soldering the PCBs. I added the connectors for power and the small data connectors. I also finished the servo expansion boards that hold the magnetic encoder and sensor. I also finished soldering the joint encoder PCBs that will track shoulder and elbow lift servo positions. I also got the bus communication to work. It was really really painful and I was really scared it wouldn’t work. First, the PCBs wouldn’t communicate at all. But eventually, I realized that it was because I wasn’t supplying 3.3V to the main board. This is when I realized that I haven’t adjusted the buck converters on the main board to supply the correct voltage, so I was about to unsolder the buck converter when I realized that I could just set the power supply to 5V (which the ICs on the mainboard can handle luckily), and then adjust the voltage down to 3.3V. But after a really long time of debugging, it still wasn’t working. The connection would sometimes work but was really flaky. Eventually, I soldered on the RPi Pico 2 onto the board completely and then found out the reason, it was because the ATtiny3216 was set to clock at a slow speed that would mess with the communication. I made them use the SerialTransfer library to send data more reliably and it now can communicate properly :)"}, {"post_id": 20354, "ts": "2026-07-01T22:40:54Z", "hours": 5.5597, "text": "Done Soldering Most PCBs, Crimped JST wires kind of I’m pretty much done soldering, I just have like 3 more tiny PCBs and I should be done. The big main board PCBs are pretty much done, I just need to make some botched tall headers since the clearance of regular headers are too small, and the servo PCBs are almost done, with just some connectors left to solder. Soldering JST 1.25mm wires ARE THE WORST EVER THING TO EVER EXIST I spent 2 hours crimping terminals on multiple wires and its so so so annoying. I can barely hold the terminal itself and they are so easy to bend. I couldn’t afford the real tool to crimp them, so I have cheap crimpers that are the wrong size and can’t technically crimp these. If crimping the metal things wasn’t bad enough, inserting the terminals into the housing was even worse. The housing would bend, or I would accidentally somehow insert it where it shorts the pin next to it??? Also while soldering a JST 1.25mm connector on a PCB, I ripped the pads clean off the PCB. I guess that one just will be missing the daisy chain feature because it only has one connector for data now and all the components and MCU are already soldered on, which really sucks. The rest of the servo PCB (4 in total for now) went fine though, and I’m getting faster at it."}, {"post_id": 18843, "ts": "2026-06-30T01:27:03Z", "hours": 4.7572, "text": "Worked on firmware & CAD & Soldered Second PCB I got the PCB and ATtiny3216 to power a servo. I soldered on the remaining components on it, like the custom LED (which just turns on when the motor is spinning for now) and the 100uF capacitor and also the RS485 bus IC. I also changed the CAD of the arm to use a bearing and changed the servo horn to fit inside of the bearing. I’ve ordered right angle headers and the bearing and metal servo horn already. I also added some transparent parts to the arm design to make it look more interesting hopefully. I also am almost done soldering the second servo PCB. Now that I have all the parts ready and I actually got better at soldering ICs I can do it faster now."}, {"post_id": 17022, "ts": "2026-06-27T17:00:47Z", "hours": 4.0433, "text": "Finally got ATtiny3216 on PCB Working This took so so long. Basically, I spent hours trying to get it to work. First, the 3.3V rail wasn’t getting power and the LED wasn’t lighting so I had to resolder the voltage regulator and then both green LEDs lit up, meaning everything was working. Then I got my FTDI programmer, and plugged it into my PCB. Because I have a FTDI programmer and the ATtiny3216 has a UPDI programming interface, there is a resistor on the board to combine the two pins into one. Even just getting megaTinyCore installed in Arduino IDE was a pain. The website that hosted the package info was down again, with an expired certificate. Apparently, this happens very often with it but I found an alternative mirror. Then I tried flashing code, and it didn’t work. Then I realized that the board type I was using was the Optiboot version, and I couldn’t find the non Optiboot version so I had to flash Optiboot onto the MCU. I did not realize that doing this would cause problems later on. I also had to switch the programmer from the one that programs Arduinos to the UPDI programmer. But I STILL couldn’t get any GPIO to work. I just tried things for hours. I switched to PlatformIO. I tried switching from C to Arduino in PlatformIO. I tried unplugging the programmer because I saw some voltage leaking from it. I tried emptying the caps and trying again. I probed every single pin to see if I wrote the wrong pin. Then after all of that, when I switched to non Optiboot (having to find online that I have to downgrade megaTinyCore), and flashing that, it works. I think it was because flashing a bootloader burns some fuses to expect a bootloader, but when I flash my code it actually overwrites the bootloader code because I don’t have access to the TX and RX pins typically used to flash when Optiboot is installed, and that just caused the code to not run."}, {"post_id": 14058, "ts": "2026-06-23T01:15:22Z", "hours": 2.3747, "text": "Soldered Smaller PCBs, Ordered Missing Parts, Continued CAD work I soldered most of the small PCBs, but now I need to order the parts I missed from the first order I placed. I’m also running out of 0.1uF caps, which sucks. I added a spot and holes for a fan on the camera mount and also some arm segment CAD improvements and back plating to hold the metal rods in. I printed out a test and it works fine. As for the PCBs, I’m still waiting for a few parts."}, {"post_id": 13444, "ts": "2026-06-22T00:49:23Z", "hours": 2.6311, "text": "Continued Soldering PCB (Diodes/LEDs, power circuitry, etc) and worked on arm CAD. For the PCB, after some time, I got the power switching circuit to output power. It’s a collection of things that I hope will make it safer, with a some diodes and a fuse, some MOSFETs, so the main MCU can command to send power, and also another stage that requires the E-STOP to not be pressed to actually be able to send power through with two MOSFETs (one main power, another switch the main MOSFET). I added a fan to the global shutter main wrist camera since it gets hot, and added a new “head” to the arm segment CAD (the heads are swappable depending on what you need to print) for the smaller motor for the last DOFs in the arm. It fits my custom daisy chaining two part PCB hat for the MG996R to give it current, temp, power sensing, and daisy chaining power and data via a RS485 bus with an onboard MCU to provide communication and control. I added some holes for airflow for this PCB. I also added some screw holes to actually connect the halves of the arm together."}, {"post_id": 12830, "ts": "2026-06-21T00:22:41Z", "hours": 1.6036, "text": "Continued Soldering and Working on CAD I snapped some headers and soldered on some more ICs on the PCBs. I did also mess up and ordered a wrong footprint for a part, so now I have to delay that too. It’s so tiny I can barely see the pins. I also worked on the CAD, where I designed the stereo camera holder, added a spot for the RPi 5 to go on top, and maybe a display. I also made a V2 of my grabber since the old one didn’t work well. It also seems that Stardance isn’t syncing my time properly, and it’s missing a few hours so that’s annoying :("}, {"post_id": 12281, "ts": "2026-06-20T01:43:23Z", "hours": 5.3406, "text": "I soldered some parts on the PCB, and worked on the CAD files some more I did realize that I forgot some parts, so I ordered them on DigiKey. I’ll continue soldering the rest tomorrow. One of the parts was the LDO, which I only found out because I soldered the parts and realized that the voltage being put on the 3.3V rail is 5V My project needs both versions of the same LDO and I only bought the 5V one I also bought the wrong resistors. I’ve ordered them and they should arrive in a week or so. My design of stacking the PCBs and then adding the buck modules in the middle might be very challenging, and I might need to stack multiple headers on top of each other to fit the modules inside. Hopefully it will still fit inside my arm segment and not short anything. There also needs to be sufficient airflow, which is def a challenge"}, {"post_id": 10584, "ts": "2026-06-17T12:06:26Z", "hours": 1.8508, "text": "Added Bottom Reinforcements with holes for magnets and wiring Added Fans and airflow holes And just fixed and refined the CAD, like adding spots for magnetic attached front and back plates and more"}]...
|
Title: revo by @ratmuds | Stardance
Devlogs:
Adde Title: revo by @ratmuds | Stardance
Devlogs:
Added Bottom Reinforcements with holes for magnets and wiring Added Fans and airflow holes And just fixed and refined the CAD, like adding spots for magnetic attached front and back plates and more
I soldered some parts on the PCB, and worked on the CAD files some more I did realize that I forgot some parts, so I ordered them on DigiKey. I’ll continue soldering the rest tomorrow. One of the parts was the LDO, which I only found out because I soldered the parts and realized that the voltage being put on the 3.3V rail is 5V My project needs both versions of the same LDO and I only bought the 5V one I also bought the wrong resistors. I’ve ordered them and they should arrive in a week or so. My design of stacking the PCBs and then adding the buck modules in the middle might be very challenging, and I might need to stack multiple headers on top of each other to fit the modules inside. Hopefully it will still fit inside my arm segment and not short anything. There also needs to be sufficient airflow, which is def a challenge
Continued Soldering and Working on CAD I snapped some headers and soldered on some more ICs on the PCBs. I did also mess up and ordered a wrong footprint for a part, so now I have to delay that too. It’s so tiny I can barely see the pins. I also worked on the CAD, where I designed the stereo camera holder, added a spot for the RPi 5 to go on top, and maybe a display. I also made a V2 of my grabber since the old one didn’t work well. It also seems that Stardance isn’t syncing my time properly, and it’s missing a few hours so that’s annoying :(
Continued Soldering PCB (Diodes/LEDs, power circuitry, etc) and worked on arm CAD. For the PCB, after some time, I got the power switching circuit to output power. It’s a collection of things that I hope will make it safer, with a some diodes and a fuse, some MOSFETs, so the main MCU can command to send power, and also another stage that requires the E-STOP to not be pressed to actually be able to send power through with two MOSFETs (one main power, another switch the main MOSFET). I added a fan to the global shutter main wrist camera since it gets hot, and added a new “head” to the arm segment CAD (the heads are swappable depending on what you need to print) for the smaller motor for the last DOFs in the arm. It fits my custom daisy chaining two part PCB hat for the MG996R to give it current, temp, power sensing, and daisy chaining power and data via a RS485 bus with an onboard MCU to provide communication and control. I added some holes for airflow for this PCB. I also added some screw holes to actually connect the halves of the arm together.
Soldered Smaller PCBs, Ordered Missing Parts, Continued CAD work I soldered most of the small PCBs, but now I need to order the parts I missed from the first order I placed. I’m also running out of 0.1uF caps, which sucks. I added a spot and holes for a fan on the camera mount and also some arm segment CAD improvements and back plating to hold the metal rods in. I printed out a test and it works fine. As for the PCBs, I’m still waiting for a few parts.
Finally got ATtiny3216 on PCB Working This took so so long. Basically, I spent hours trying to get it to work. First, the 3.3V rail wasn’t getting power and the LED wasn’t lighting so I had to resolder the voltage regulator and then both green LEDs lit up, meaning everything was working. Then I got my FTDI programmer, and plugged it into my PCB. Because I have a FTDI programmer and the ATtiny3216 has a UPDI programming interface, there is a resistor on the board to combine the two pins into one. Even just getting megaTinyCore installed in Arduino IDE was a pain. The website that hosted the package info was down again, with an expired certificate. Apparently, this happens very often with it but I found an alternative mirror. Then I tried flashing code, and it didn’t work. Then I realized that the board type I was using was the Optiboot version, and I couldn’t find the non Optiboot version so I had to flash Optiboot onto the MCU. I did not realize that doing this would cause problems later on. I also had to switch the programmer from the one that programs Arduinos to the UPDI programmer. But I STILL couldn’t get any GPIO to work. I just tried things for hours. I switched to PlatformIO. I tried switching from C to Arduino in PlatformIO. I tried unplugging the programmer because I saw some voltage leaking from it. I tried emptying the caps and trying again. I probed every single pin to see if I wrote the wrong pin. Then after all of that, when I switched to non Optiboot (having to find online that I have to downgrade megaTinyCore), and flashing that, it works. I think it was because flashing a bootloader burns some fuses to expect a bootloader, but when I flash my code it actually overwrites the bootloader code because I don’t have access to the TX and RX pins typically used to flash when Optiboot is installed, and that just caused the code to not run.
Worked on firmware & CAD & Soldered Second PCB I got the PCB and ATtiny3216 to power a servo. I soldered on the remaining components on it, like the custom LED (which just turns on when the motor is spinning for now) and the 100uF capacitor and also the RS485 bus IC. I also changed the CAD of the arm to use a bearing and changed the servo horn to fit inside of the bearing. I’ve ordered right angle headers and the bearing and metal servo horn already. I also added some transparent parts to the arm design to make it look more interesting hopefully. I also am almost done soldering the second servo PCB. Now that I have all the parts ready and I actually got better at soldering ICs I can do it faster now.
Done Soldering Most PCBs, Crimped JST wires kind of I’m pretty much done soldering, I just have like 3 more tiny PCBs and I should be done. The big main board PCBs are pretty much done, I just need to make some botched tall headers since the clearance of regular headers are too small, and the servo PCBs are almost done, with just some connectors left to solder. Soldering JST 1.25mm wires ARE THE WORST EVER THING TO EVER EXIST I spent 2 hours crimping terminals on multiple wires and its so so so annoying. I can barely hold the terminal itself and they are so easy to bend. I couldn’t afford the real tool to crimp them, so I have cheap crimpers that are the wrong size and can’t technically crimp these. If crimping the metal things wasn’t bad enough, inserting the terminals into the housing was even worse. The housing would bend, or I would accidentally somehow insert it where it shorts the pin next to it??? Also while soldering a JST 1.25mm connector on a PCB, I ripped the pads clean off the PCB. I guess that one just will be missing the daisy chain feature because it only has one connector for data now and all the components and MCU are already soldered on, which really sucks. The rest of the servo PCB (4 in total for now) went fine though, and I’m getting faster at it.
Finished Soldering all Smaller PCBs & Got RS-485 communication working from main board to servo PCBs First, I finished soldering the PCBs. I added the connectors for power and the small data connectors. I also finished the servo expansion boards that hold the magnetic encoder and sensor. I also finished soldering the joint encoder PCBs that will track shoulder and elbow lift servo positions. I also got the bus communication to work. It was really really painful and I was really scared it wouldn’t work. First, the PCBs wouldn’t communicate at all. But eventually, I realized that it was because I wasn’t supplying 3.3V to the main board. This is when I realized that I haven’t adjusted the buck converters on the main board to supply the correct voltage, so I was about to unsolder the buck converter when I realized that I could just set the power supply to 5V (which the ICs on the mainboard can handle luckily), and then adjust the voltage down to 3.3V. But after a really long time of debugging, it still wasn’t working. The connection would sometimes work but was really flaky. Eventually, I soldered on the RPi Pico 2 onto the board completely and then found out the reason, it was because the ATtiny3216 was set to clock at a slow speed that would mess with the communication. I made them use the SerialTransfer library to send data more reliably and it now can communicate properly :)
Crimped JST VH wires, Connected JST 1.25mm wires, Soldered more PCB connectors Crimping JST VH wires is a ton easier than JST 1.25mm, and after a bunch of failed attempts still, I got some okay crimps that work finally. It took me a long time because I didn’t know that I had to rotate the wire for the hook on the terminal to go into the housing hole, and then also that the box shape part on the terminal actually has to stick out of the crimper or the crimper will crush the whole terminal into bits
Servo PCB Daisy Chaining Working I plugged in the JST VH and JST 1.25mm wires into the PCBs, and they seem to work! I adjusted the message struct to hold a desired PCB sort of address or ID. When the MCU detects that the ID matches the PCB (by using the solder jumpers at the bottom of each PCB to program the PCB ID), only then it lights up the LED and replies to the main board. The mainboard now loops through IDs and sends a message and waits for a response. I’m very very happy this worked without any really big problems.
Servo Control Working, More CAD and 3D Printing I got the mainboard to be able to control the servo on the servo PCBs. I also tested a bunch of the functions, like the magnetic sensor, neopixel LED, etc The communication now sends the PCB ID, and the target speed and the servo PCB echos it back and moves the servo. I also worked on the CAD (and refined) for the mainboard connector that will make connecting the two mainboards not a total pain. I also soldered the connectors on the mainboard PCBs for them to connect to each other.
Mainboard and other CAD I got the mainboard to stack on top of each other with a weird jumper and two piece jumper holder and some screws setup which required some revisions and trying to get everything to fit. I’ve squeezed one of the DC buck modules into between the mainboard, and the second arm segment will hold the two remaining DC buck modules. The bottom mainboard PCB also has 2 smaller buck modules. There’s a lot of things going on with the voltages in this project due to the servos peak current draw being so large. I also refined the arm segment CAD by some reprints and made the DS5180 servo fit better. I’ve also made one of the buck module mounts for the second arm segment to fit more cleanly.
Bidirectional Communication To PC/RPi 5 with LeRobot & More CAD changes I setup a basic class for my robot in LeRobot (which was a little confusing) and then I also got communication between the Pico and my PC working. Originally I have SPI pins exposed on my mainboard PCB to connect to the RPi 5’s GPIO pins, but for some reason after lots of debugging, even running it at super low speeds it just would not work. So I switched to just using serial over USB, and using the SerialTransfer library to send data more reliably. The script on the PC now can send target joint angles, and receive a lot of data back, like if the joint is online, temp, current, angle, homing sensor, home status, LED, firmware version, voltage, etc I also iterated on the CAD for everything, and it should be done soon. It’s just a bunch of tolerance fixes to make everything fit at this point and some new things like mounts for encoders and DC buck modules and fixing the CAD for the custom MG996R case.
Rewrote all firmware; Fixing Servo Cover and a ton of other CAD; Almost fried everything For the CAD, it doesn’t look like much changed, but I’ve basically redesigned a bunch of things and fixed tolerances and now it should move really smoothly. With the bearings added, everything moves incredibly smoothly now Especially the servo cover was annoying. I needed to attach a magnet to the shaft which was really annoying. I haven’t logged that well, I’ve done more like 15 hours of work instead of just 5 but whatever Most of those hours was the painful debugging. RS-485 busses, JSON not communcating with the PC, dropped connections, corrupted data, disconnected jumpers, FTDI programmer becoming flaky for some reason It’s just been pain :((( Now the PC (screenshot) recieves all the data and sends all the data You can see a lot (not all) of the telemetry being received. Ignore the volts though my math is wrong. Realtime connecting now works smoothly, as you can see the other RS485 servos are offline.
Servo firmware almost done The servo firmware now (with the mainboard) sends validation data back and forth so both the servo and mainboard can verify that the data was sent successfully and can ignore corrupted packets because my wiring can be flaky sometimes The firmware now sends real data again and is much more robust, with a proper stateful LED that shows useful information, like offline, online and driving motor, homing, error (fast flashing of LED as red), and the error state is also triggered in the case of corrupted packets (I tried it and it works :)) I’m also still printing out the pieces to assemble the arm. I actually have more hours working on it, I just forgot to log :(((((((
Finalizing hardware I crimped and soldered almost the remaining wires, I’ve made some last redesigns to the arm CAD and I’m now fitting everything into the new prints and assembling. I’ve also had a ton of trouble with my servo PCBs lately, but I found out a lot of the issue was my programmer is actually fried somehow, so I’m now using an old RPi Pico to act as a UPDI adapter so PlatformIO can now successfully program the ATtinys much better now. A lot of the CAD was slightly tweaked so that everything fits better
Test assembly and fitting of robot arm I am mostly done with the core functionality of the mainboard, so i packed everything together and double checked eerything works including power Then I started assembling most of the servos The smaller servo casing doesn’t fit very well, and the transparent window doesn’t fit either But the magnetic cover for the arm segments works great :) It was a lot of fitting, screwing, testing with multimeter, etc
Mainboard Stack Redo & Firmware Updates and Test Web UI I had to take the electronics out, and redo some of the wiring. The screw terminals are pretty cheap and suck, which makes it incredibly annoying to use as it’s impossible to fit these thicker AWG wires in and they sometimes slide out of the terminals. When I’m done I’m probably going to hot glue the wires. The incredibly fragile flexible extension jumpers for data transfer between the stack is also super fragile, and especially doesn’t grip. Sometimes the data wires just slip out. I took apart the arm, as during testing the motor stripped some screws. I’ve ordered some heat set inserts to prevent that from happening again, which will require me to reprint all the arm segments again. I also added a simple web UI for moving the joints. There is an empty ThreeJS sidebar and the right has some graphs (real data) from the mainboard sensors. The smaller MG996R servos haven’t been mounted yet due to a power delivery issue from the mainboard but hopefully that will be fixed soon.
Assembled Basic Arm Parts and Packaged Main Board Assembly; Reprogrammed servo MCUs & worked on web UI I redid some soldering on the mainboard PCB, secured connections, and secured everything with tape for now. I’ll likely have to reprint the first arm segment to fit everything in flush because as you can see there are wires and things bulging out of the segment itself right now. I also redesigned the CAD to include heat set inserts. I did programming and a bunch of bug testing and fixing too. An hour of time was lost because Lapse errored out :((((( very sad about that :( I also had an issue with data corruption on the RS485 bus but that is fixed now, and it works like it should.
New Mainboard Cover, Wiring, Bearing Revamp, Heatset Inserts, Servo Cover I added space for the mainboard segment, now it has clearance to actually fit, I redid the cover for this segment, and now it can allow the wires to come out The servo mount now has heatset inserts, because the previous screw in print kept slipping out, but this time the screws just would not go into the inserts through the mount for some reason? The screws went in normally, but with the tolerances, when multiple screws go in they just fight and push against the edge of the insert instead of going in. The MG996R servo housing now has been redesigned, based off of picture references and calipers to attempt to be more accurate than the last one to try and reduce the amount of bad tolerances affecting the gears and making them misaligned, reducing torque output. And just general wiring and CAD work.
Heatset Inserts Working; Fixing Faulty Motor Power Connections; Internal Fan Power Connectors I verified that the servo cover works, and it’s much much better than the last version. The tolerances are much better this time, leading to less stress on the gears. The same amount of turning uses around 100mA compared to 300mA before, almost reaching it’s limit without any load. Some motor power connectors disconnected, so I found it with a multimeter and added hot glue to some connectors to secure them. I soldered the fan power things inside the PCB, but realized that the JST connectors I’m using are different from the fans. I might have to make a sort of adapter or something by crimping more wires. And the heatset inserts finally work after some tweaking, before the inserts would get misaligned when put in, now with a aligning lip thing it can be slotted in and melted in more accurately.
Reprinted Arm Segments; Added Segment Cover; Servo Mount Working; Working on Web UI I reprinted the arm segments, hopefully for one of the last times, I’ve went through so much filament already. It now allows the mainboard to be neatly packed inside, hiding most of it while still allowing wires to come out. Due to the design of the mainboard, the wires do have to stick out the front like that sadly. To avoid crushing wires, the servo mount has been expanded to allow more clearance for wires and general electronics. The servo mount works now with a new design. I remeasured and adjusted the sketches and added proper hole sizes and a little chamfer to allow the insert to slot in before using a soldering iron to melt it in to help align much better than before. The web UI now shows a representation of the arm. It’s not tuned yet, so the angles are wrong but I’ll fix it soon. I had to move everything from Fusion to Onshape to create the assemblies, and then use a Python library to convert the Onshape assembly into a URDF file that can be rendered with the correct joints inside ThreeJS. Next, I’ll be adding IK and general arm control.
Working on IK System & Resoldered Joints Again Bruh so my robot arm after finally being assembled by the way exceeded it’s limits and tore its wires out. I had to take apart the mainboard assembly again, which just is SO TEDIOUS. I just dumped solder and hot glue again and fixed a short caused from another wire being sheared off. Also I’m working on the IK system, but it’s not really going well right now. I need to add offsets and config to each of the motors to get them to work correctly. The motors hooked up right now started crashing into my table sadly. Hopefully it will work soon. I also continued working on the servo case. I still haven’t added the code to calibrate and get closed loop control on the MG996R servos. The DS5180 encoders should be easier though.
V2 Servo Case Working; Servo Code Revamp WIP After around 10 more revisions, the new servo case is fully working with the magnetic extender. The V2 is significantly better designed and higher efficiency than the last, more guess and check result. I’ve also started to rewrite the servo code. Right now, its really messy and just kind of snowballed over time as I’ve slapped on patches and features to a fundamentally weak base. I’m in the progress of writing that now, hopefully it will be done soon. It will also include the new auto calibration and encoder usage and PID (and potentially advanced auto tuned curve to combat motor acceleration overshoot and backlash)
Servo Code I did some slight refining to the servo case again, making the tolerances tighter to keep the gears from wobbling. It’s still sort of loose, so I need to just keep trying over and over again. I’m also still writing the servo code. It’s already much more organized than before. I’m also learning Vim keybinds and stuff to try and code faster. The RS485 bus communication works now, and it’s just sending dummy telemetry data back right now. It can also control the servo fine. I’ve just been doing like the lower level architecting I guess, or not really I’m not sure. Before everything was crammed into a single file and now there’s actually header files and multiple source files and it’s actually somewhat readable. I had an issue with LED control for a second but that’s fixed now :)
MG996Rs Finally Working The servos finally work. I don’t even think this amount of hours logged is equal to how long this took, because I just got tired of it. I think I printed like 20 new revisions of the case and servo mount. It was just so so annoying. While the general case worked, getting a reliable magnet output shaft was impossible. From tolerances, to my own errors to binding to hot glue getting everywhere, or superglue binding random gears, or my getting my fingers stuck to the actual case from superglue (was not fun and hurt) The case finally works. And the prototype code somewhat works too. It basically rotates until the sensor hits zero, it resets the “ticks”. A tick is a raw output from the AS5600. Because this magnet shaft spins faster than the output shaft, like 10x faster, the MCU needs to poll the sensor super quickly, which also needed some optimizations to clear the blocking bus communication wait that would let the magnet skip multiple full turns. The sensor doesn’t internally count turns so we just need to count manually and detect when it jumps from 4096-0 or the other way around. It then spins around until the sensor is hit AGAIN to calculate tick to degrees, assuming the sensor was zeroed before, and then the current ticks would equal 360 degrees. Another problem was the servo needs a PWM signal to move. The threshold from stop to go is pretty garbage on these cheap servos, leading it to spin quite fast already when at the lowest PWM value. Instead when far from the value it increases the PWM signal, closer it brings to minimum and starts linearly flickering the PWM signal from 0 to the speed, with the closer it is the more ratio of time stopped to inch it closer to the target. It actually surprisingly works. It’s very fragile though, any skipped reads, from potentially slow bus transfers would completely throw it off, so all the code running locally on the weak 8 bit MCU needs to be extremely lightweight. Yeah this was super super painful. I’ve been sitting here redoing superglue and code for hours.
Debugging and Fixing Is Killing Me and the Mainboard Exploded :( I have spent SO many hours trying to get this to work. It’s so annoying. This isn’t near how many hours I spent, I’ve been too frustrated to log it. The case is incredibly annoying. Getting the initial case works fine. Doing all of this stuff makes it complicated and break and jam up. The RS485 busses just randomly stop working. The servo output is wiggly and not stable. A PCB header snapped and I didn’t have replacements so I had to bodge solder it back on. The mainboard voltage regulator literally exploded. It was a cheap part but yeah that literally just broke stuff. Fixes to everything. CAD. Firmware. bruh
Dashboard Revamp WIP, Tons of CAD changes, Code Updates, Tolerances I’ve just been refining everything and it’s just going really slowly. Many problems. Magnets shorting out stuff. Magnet too far and not being detected. Wires breaking. I’ve also redesigned the dashboard UI to hopefully look better. I’m still working on it, hopefully it will look more polished later. The dashboard It shows a load speedometer type thing, with the load (max current from a motor out of 500mA) and the temp on the right (for now just dummy value) The motors have cool little animations now too and look less cluttered. I’ve just been working on it a lot. Just everything in general tbh.
Assembled last 4 DoF for Integrated Test I assembled the MG996R servos in a test piece that will represent the full regular arm segment to test if everything worked. With some fiddling it worked. As you can see there’s more transparent pieces. The pieces that connect the previous joint are transparent to show the Neopixel below it a lot better as before the LED was almost completely occluded. The bright green LEDs power status ones are too bright but I can cover them later.
Significantly Better Motor Control and Gripper CAD The motor code was getting a bit messy, so I rewrote it. I separated the motor code from the main control code which cleaned it up a bit. LADRC I’m using LADRC now. It’s kind of like PID, but advanced. I took the implementation from online. I feed it the motor current, encoder value, and the target and it goes. The algorithm or whatever somehow calculates the velocity of the motor and how much “effort” it’s using and then gives an effort to put to the motor. It somehow cancels out like disturbances like gravity, backlash, the general physics, etc. As you can see, the motor control is so so so much better than before. It cleanly decelerates. It handles load and dynamically increases effort. Before there was some oscillation because it just couldn’t figure out how to get to the target, this one is just so much better and so hands off. There’s basically like no calibration as it does it over time :)))
Assembled Full Arm (not all motors active yet for safety) and Basic Interpolation for Control I assembled the new full arm assembly minus the end effector and didn’t plug in the first two motors as they have the highest chance of doing something really bad. I also made some general changes to the code and also added a flag to some motors to interpolate their movement slowly to not explode the robot arm while controlling it.
Fixed Broken Magnet, Redoing all IK joint data and offsets, Stereo depth test An encoder magnet broke off, so I had to disassemble and reassemble the top half of the arm to get to the encoder magnet and glue it back on. I also started properly punching in the IK joint data, before it was mostly just random data but now almost all of the data is mostly correct, and I’m waiting for a print to complete that will flip a motor to finally get the IK simulation matching with real life and have the IK endpoint be tracked at the tip of the gripper. It was a lot of trial and error and measurements. I also started experimenting with adding depth estimation. Eventually this could add collision avoidance IK pathfinding, which would be really cool but it’s just a pointcloud in the render right now. But the robot arm is slowly coming together finally! I’ll be able to grab something soon I think.
Integration Hell I’ve just been like trying to get this stupid project to work. Screws keep falling out, the IK keeps failing, things are hitting each other and wires are being strained I’m in integration hell. Everything works fine on its own, but combining everything is horrible. I’ve been reassembling and trying to fix this stupid thing for so long. Anyway I’ve went through a few more revisions of some CAD and some more refinements and the gripper and camera is now mounted but this is just incredibly incredibly annoying :((((
Setup VR and Gripper, Robot Rapidly Disassembles my robot arm is broken I setup VR and fixed some more IK when I go into VR and try playing around, it instantly flies out and throws itself off the table and breaks into pieces. This is going to be fun to fix.
Finish Project Up :) I wrote a ton in the repository im tired :( https://github.com/ratmuds/revo
Ships:
I wanted to make a robot arm that punched above it’s weight. The price is pretty similar to smaller robot arms on Amazon that may not include cameras, which would need to be purchased seperately. The way this is achieved by using cheap servos, servos that are 100% NOT made for this purpose, and adding most of the functionality of a smart servo back by using a TON of PCBs. It was a lot of soldering. I just wanted to make something that had more features for less money :) This project was SUPER difficult for me, and pushed my limits a bit. The amount of tolerences especially for the stupid custom motor case and magnet and PCBs and the crazy mainboard and generally having everything play well together took so long, I had many days where I quit frustrated. I’m very happy about how it turned out though, even seeing the lots of shortcomings it has....
|
1793005016.299186
|
1793091416.299186
|
|
60464
|
Fast Delights by @Orbernator | Stardance
|
Orbernator
|
2
|
20.0
|
217
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T01:26:37Z", "hours": 17.0, "multiplier": 11.1, "payout": 194, "blessing": "neutral", "text": "I made the official Wiki for Fast Delights, this took WAAAAY longer than it should have, and is contaned in a seperate repo, for ease of use. View the Shipped Page here: https://orbernator.github.io/FastDelightsDocs/ And the source code here: https://github.com/Orbernator/FastDelightsDocs Enjoy my Suffering!", "repo": "https://github.com/Orbernator/FastDelights", "demo": "https://modrinth.com/mod/fast-delights"}, {"ship_num": 2, "ts": "2026-09-11T08:12:11Z", "hours": 3.0, "multiplier": 8.74, "payout": 23, "blessing": "neutral", "text": "This is the 0.3.1 release of the mod, just wanting to gauge feedback from the community! More to come over the remaining time of Stardance!", "repo": "https://github.com/Orbernator/FastDelights", "demo": "https://modrinth.com/mod/fast-delights"}]...
|
[{"post_id": 71547, "ts": "202 [{"post_id": 71547, "ts": "2026-09-21T01:24:51Z", "hours": 0.7153, "text": "Alright! Its all done! The Docs are up, and its time to ship! Viewable here: https://orbernator.github.io/FastDelightsDocs/ And source code is here: https://github.com/Orbernator/FastDelightsDocs Enjoy the fruits of my Suffering!"}, {"post_id": 71520, "ts": "2026-09-21T00:00:24Z", "hours": 1.3628, "text": "ALRIGHTY! Got the recipes all in! Just got to make the pages and I can FINALLY SHIP! Time to celebrate!"}, {"post_id": 69931, "ts": "2026-09-18T02:49:43Z", "hours": 2.3581, "text": "Added all cutting board recipes, and the shapeless ones! Just the cooking pots to go!"}, {"post_id": 69535, "ts": "2026-09-17T07:43:20Z", "hours": 2.2547, "text": "Finished fixing all the recipes, added smelting and smoking recipes."}, {"post_id": 68980, "ts": "2026-09-16T04:57:13Z", "hours": 0.8208, "text": "Alright! The Smelting method is in, the AI crap is fully gone, along with the 6 random branches it made and protected. (nothing a little –force couldnt fix) and now I need to rework the recipes to work with the new system. My fingers may fall off."}, {"post_id": 68557, "ts": "2026-09-15T10:05:59Z", "hours": 0.7447, "text": "Well, I have learned why you dont let AI code. In 30min it managed to cause around 6 different error messages, and then crash the site, then proceed to not fix it, but say it was fixed for around 15 minutes. I am never letting AI code by itself again. This has scarred me for life. Thanks to git, I can revert back to working version!"}, {"post_id": 68535, "ts": "2026-09-15T08:41:40Z", "hours": 1.1694, "text": "So, turns out, to get the smelting in, I have to rewrite the recipe files, and the other methods. So guess what wiki wont work right now. Mine. Nose back to the grindstone"}, {"post_id": 68492, "ts": "2026-09-15T06:56:40Z", "hours": 1.1147, "text": "So, all of the Shaped Crafting table recipes are in! Now I just have to add items from other mods so that its happy! Now, to work on the next ones!"}, {"post_id": 68471, "ts": "2026-09-15T05:17:29Z", "hours": 0.9483, "text": "Alright! All of the shaped crafting table recipes are in! Now I need to work out how to get the shapeless, furnace, smoker, cutting-board, cooking pots, and more in! This is taking a lot longer than I thought it would."}, {"post_id": 68420, "ts": "2026-09-15T02:49:47Z", "hours": 0.3225, "text": "Finally, all the items are in! Time to make the recipes, and individual pages!"}, {"post_id": 68370, "ts": "2026-09-15T00:57:58Z", "hours": 0.4306, "text": "Allllrighty! All of the Mod Items are in the database, now to add images, and then the shudders recipes. Wish me luck!"}, {"post_id": 68338, "ts": "2026-09-14T23:30:16Z", "hours": 0.5281, "text": "So far so good! I have about half of the items into the docs, then I just need to add the dependends, and then figure out how to add the custom recipes, like cutting, ect ect"}, {"post_id": 68318, "ts": "2026-09-14T22:37:46Z", "hours": 0.4572, "text": "Ok! So the framework for the wiki is down! Now, to start adding all the items in groans wish me luck guys"}, {"post_id": 67992, "ts": "2026-09-14T10:28:13Z", "hours": 0.9828, "text": "So, the AI code didn’t work, hands up who’s surprised! no-one puts their hands up so. 20m of troubleshootin later, and I figure out the problem! And it works! So, now to add everything!"}, {"post_id": 67874, "ts": "2026-09-14T05:13:54Z", "hours": 1.1494, "text": "Wow, this is longer than I have ever worked on a project without DevLogging, so here we go! So, because I am not, and will not copy-paste AI, I am writing it by hand! It has taken me almost 1h to write about 3 files with a LOOOT of mistakes. But. I have cut out, and reordered, and changed it to be my own. Anyway, nose back to the grindstone, and I hope that when I finish, all of these errors will go away!"}, {"post_id": 67830, "ts": "2026-09-14T02:49:25Z", "hours": 0.2703, "text": "So, after all that, what am I doin now? Well, I gave in and had to look up how to make the recipe page look good. BUT! I have standards! NO AI CODE HAS BEEN COPY PASTED (Which kinda defeats the whole point of AI making stuff shorter), and I am not just using its code. I am still writing it myself. But, that means I do have to update the AI declaration on my project :("}, {"post_id": 67815, "ts": "2026-09-14T02:16:05Z", "hours": 0.3389, "text": "Ok! So in the past 20m, I have made the framework of a website, pushed to github, and am currently setting up GitHub Actions. So far, so good. (Things are gonna go downhill, I can sense it)"}, {"post_id": 67759, "ts": "2026-09-14T00:24:47Z", "hours": 0.3181, "text": "Started work on the Docs, for Fast Delights. These will be held in a seperate repo, to hopefully not get them mixed up. I am using VitePress to make the docs, first time ever using it so, somthing is going to go wrong. Murphys Law and all that"}, {"post_id": 67731, "ts": "2026-09-13T23:01:53Z", "hours": 0.3033, "text": "First DevLog of the day! Committed my changes to Github, fixed the recipes, and added translations! All in all, good start to the day"}, {"post_id": 67219, "ts": "2026-09-13T08:31:56Z", "hours": 0.3767, "text": "Added recipe for Frickles, KFC eat your heart out."}, {"post_id": 66288, "ts": "2026-09-12T01:09:02Z", "hours": 0.2706, "text": "I have created the model of the Frickle, shown below"}, {"post_id": 66273, "ts": "2026-09-12T00:37:03Z", "hours": 0.2606, "text": "I am beginning work on my next update, 0.4.0, the vegtables update, when I see that KFC, now have a whole Pickle menu. So. Guess what I gotta add now? Thats right! Frickles!"}, {"post_id": 65824, "ts": "2026-09-11T07:01:34Z", "hours": 0.9403, "text": "Added new files, and working on adding a avacado plant! Because avacado’s taste really good!"}, {"post_id": 65211, "ts": "2026-09-10T05:49:04Z", "hours": 0.2642, "text": "Fixed the Creative tab not showing items, and changed the logo"}, {"post_id": 65183, "ts": "2026-09-10T04:05:16Z", "hours": 0.3019, "text": "Updated the readme, and patched a issue with the Recipes not saving. Uploading to Modrinth as I type this."}, {"post_id": 65171, "ts": "2026-09-10T03:36:53Z", "hours": 0.7556, "text": "Added the textures for the update, and created the recipes and languages."}, {"post_id": 65108, "ts": "2026-09-10T00:38:27Z", "hours": 0.3467, "text": "Added registrations for items, then added Recipes for sliced_onion and onion_rings"}]...
|
Title: Fast Delights by @Orbernator | Stardance
D Title: Fast Delights by @Orbernator | Stardance
Devlogs:
Added registrations for items, then added Recipes for sliced_onion and onion_rings
Added the textures for the update, and created the recipes and languages.
Updated the readme, and patched a issue with the Recipes not saving. Uploading to Modrinth as I type this.
Fixed the Creative tab not showing items, and changed the logo
Added new files, and working on adding a avacado plant! Because avacado’s taste really good!
I am beginning work on my next update, 0.4.0, the vegtables update, when I see that KFC, now have a whole Pickle menu. So. Guess what I gotta add now? Thats right! Frickles!
I have created the model of the Frickle, shown below
Added recipe for Frickles, KFC eat your heart out.
First DevLog of the day! Committed my changes to Github, fixed the recipes, and added translations! All in all, good start to the day
Started work on the Docs, for Fast Delights. These will be held in a seperate repo, to hopefully not get them mixed up. I am using VitePress to make the docs, first time ever using it so, somthing is going to go wrong. Murphys Law and all that
Ok! So in the past 20m, I have made the framework of a website, pushed to github, and am currently setting up GitHub Actions. So far, so good. (Things are gonna go downhill, I can sense it)
So, after all that, what am I doin now? Well, I gave in and had to look up how to make the recipe page look good. BUT! I have standards! NO AI CODE HAS BEEN COPY PASTED (Which kinda defeats the whole point of AI making stuff shorter), and I am not just using its code. I am still writing it myself. But, that means I do have to update the AI declaration on my project :(
Wow, this is longer than I have ever worked on a project without DevLogging, so here we go! So, because I am not, and will not copy-paste AI, I am writing it by hand! It has taken me almost 1h to write about 3 files with a LOOOT of mistakes. But. I have cut out, and reordered, and changed it to be my own. Anyway, nose back to the grindstone, and I hope that when I finish, all of these errors will go away!
So, the AI code didn’t work, hands up who’s surprised! no-one puts their hands up so. 20m of troubleshootin later, and I figure out the problem! And it works! So, now to add everything!
Ok! So the framework for the wiki is down! Now, to start adding all the items in groans wish me luck guys
So far so good! I have about half of the items into the docs, then I just need to add the dependends, and then figure out how to add the custom recipes, like cutting, ect ect
Allllrighty! All of the Mod Items are in the database, now to add images, and then the shudders recipes. Wish me luck!
Finally, all the items are in! Time to make the recipes, and individual pages!
Alright! All of the shaped crafting table recipes are in! Now I need to work out how to get the shapeless, furnace, smoker, cutting-board, cooking pots, and more in! This is taking a lot longer than I thought it would.
So, all of the Shaped Crafting table recipes are in! Now I just have to add items from other mods so that its happy! Now, to work on the next ones!
So, turns out, to get the smelting in, I have to rewrite the recipe files, and the other methods. So guess what wiki wont work right now. Mine. Nose back to the grindstone
Well, I have learned why you dont let AI code. In 30min it managed to cause around 6 different error messages, and then crash the site, then proceed to not fix it, but say it was fixed for around 15 minutes. I am never letting AI code by itself again. This has scarred me for life. Thanks to git, I can revert back to working version!
Alright! The Smelting method is in, the AI crap is fully gone, along with the 6 random branches it made and protected. (nothing a little –force couldnt fix) and now I need to rework the recipes to work with the new system. My fingers may fall off.
Finished fixing all the recipes, added smelting and smoking recipes.
Added all cutting board recipes, and the shapeless ones! Just the cooking pots to go!
ALRIGHTY! Got the recipes all in! Just got to make the pages and I can FINALLY SHIP! Time to celebrate!
Alright! Its all done! The Docs are up, and its time to ship! Viewable here: https://orbernator.github.io/FastDelightsDocs/ And source code is here: https://github.com/Orbernator/FastDelightsDocs Enjoy the fruits of my Suffering!
Ships:
This is the 0.3.1 release of the mod, just wanting to gauge feedback from the community! More to come over the remaining time of Stardance!
I made the official Wiki for Fast Delights, this took WAAAAY longer than it should have, and is contaned in a seperate repo, for ease of use. View the Shipped Page here: https://orbernator.github.io/FastDelightsDocs/ And the source code here: https://github.com/Orbernator/FastDelightsDocs Enjoy my Suffering!...
|
1793055182.7578857
|
1793141582.7578857
|
|
62717
|
GMM_Tab by @GMM | Stardance
|
GMM
|
2
|
11.0
|
5
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T01:17:40Z", "hours": 8.0, "multiplier": 1.18, "payout": 5, "blessing": "neutral", "text": "I just made a site that updates the nasa image daily (and that was the most difficult part). In it, I added a calculator, a search bar and a button I thought would be cool, just to fill in the blank. I am very proud that I used my creativity in it.", "repo": "https://github.com/GuilhermeMartins-GMM/GMM_Tab", "demo": "https://guilhermemartins-gmm.github.io/GMM_Tab/"}, {"ship_num": 2, "ts": "2026-09-16T16:40:00Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a searching site, I tried to put the NASA thing and a calculator, but, even though it worked in my tablet, when I uploaded, it didn’t. So, IT’S NOT COMPLETE. I’m going to make them work. But, by now, I think the result is doing great.", "repo": "https://github.com/GuilhermeMartins-GMM/GMM_Tab", "demo": "https://guilhermemartins-gmm.github.io/GMM_Tab/"}]...
|
[{"post_id": 71541, "ts": "202 [{"post_id": 71541, "ts": "2026-09-21T01:13:40Z", "hours": 1.5689, "text": "I added an interactive button (replacing the snake game that was AI made)"}, {"post_id": 70805, "ts": "2026-09-19T19:49:05Z", "hours": 1.3311, "text": "I re-wrote the code, removed the AI snake game, and updated the readme."}, {"post_id": 70407, "ts": "2026-09-19T03:56:43Z", "hours": 0.2769, "text": "I added mouse spotlight."}, {"post_id": 70400, "ts": "2026-09-19T03:26:23Z", "hours": 2.6092, "text": "Uptated the readme and re-wrote the code."}, {"post_id": 69401, "ts": "2026-09-16T23:53:46Z", "hours": 1.8861, "text": "Now it can be used in phones too."}, {"post_id": 69218, "ts": "2026-09-16T16:35:30Z", "hours": 3.1586, "text": "I am trying to add a calculator, but the site is looking great."}]...
|
Title: GMM_Tab by @GMM | Stardance
Devlogs:
I am Title: GMM_Tab by @GMM | Stardance
Devlogs:
I am trying to add a calculator, but the site is looking great.
Now it can be used in phones too.
Uptated the readme and re-wrote the code.
I added mouse spotlight.
I re-wrote the code, removed the AI snake game, and updated the readme.
I added an interactive button (replacing the snake game that was AI made)
Ships:
I made a searching site, I tried to put the NASA thing and a calculator, but, even though it worked in my tablet, when I uploaded, it didn’t. So, IT’S NOT COMPLETE. I’m going to make them work. But, by now, I think the result is doing great.
I just made a site that updates the nasa image daily (and that was the most difficult part). In it, I added a calculator, a search bar and a button I thought would be cool, just to fill in the blank. I am very proud that I used my creativity in it....
|
1793058640.1141086
|
1793145040.1141086
|
|
43242
|
mtg tool by @flyingfish | Stardance
|
flyingfish
|
1
|
46.0
|
400
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T01:16:08Z", "hours": 46.0, "multiplier": 8.6, "payout": 400, "blessing": "neutral", "text": "i made a tool for making custom mtg cards in bulk i dont aurally know anything about mtg my brother just wanted me to make this", "repo": "https://github.com/dinotiger01/frfr", "demo": "https://github.com/dinotiger01/frfr/releases/tag/idk"}]...
|
[{"post_id": 71543, "ts": "202 [{"post_id": 71543, "ts": "2026-09-21T01:14:49Z", "hours": 1.4325, "text": "just some last minute repo fixes"}, {"post_id": 44887, "ts": "2026-08-10T22:42:40Z", "hours": 9.2114, "text": "it works on windows"}, {"post_id": 43638, "ts": "2026-08-09T00:43:02Z", "hours": 8.2292, "text": "i have spent the past 4 HOURS trying to fix a bug and nothing works(i am going to try to ship by the end of today if i can fix this stupid bug)"}, {"post_id": 42311, "ts": "2026-08-06T23:27:47Z", "hours": 8.6642, "text": "it can conect to an api now"}, {"post_id": 41448, "ts": "2026-08-05T17:41:26Z", "hours": 9.0586, "text": "it can export now"}, {"post_id": 39896, "ts": "2026-08-03T05:48:25Z", "hours": 4.0275, "text": "its too late in the day for this jusdt work for like 10 hrs today"}, {"post_id": 39784, "ts": "2026-08-02T23:52:07Z", "hours": 5.8589, "text": "ykyk"}]...
|
Title: mtg tool by @flyingfish | Stardance
Devlog Title: mtg tool by @flyingfish | Stardance
Devlogs:
ykyk
its too late in the day for this jusdt work for like 10 hrs today
it can export now
it can conect to an api now
i have spent the past 4 HOURS trying to fix a bug and nothing works(i am going to try to ship by the end of today if i can fix this stupid bug)
it works on windows
just some last minute repo fixes
Ships:
i made a tool for making custom mtg cards in bulk i dont aurally know anything about mtg my brother just wanted me to make this...
|
1793004581.073696
|
1793090981.073696
|
|
62003
|
Rune of Foot by @NotIdhant | Stardance
|
NotIdhant
|
1
|
8.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T01:12:15Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Rune of Foot was a rollercoaster for me. Now that Chapter 1 is finished, I guess I can finally have my sleep hehe - but really though, it was difficult because it was my first ever time coding a big Python project like this. So I’m exceptionally proud. Check it out on my Github page, just download the ZIP and you’re good! Thank you for all the support!", "repo": "https://github.com/NotIdhant/Rune-of-Foot/", "demo": "https://humble-space-halibut-qv4qvgq7rww4fx4xw.github.dev/"}]...
|
[{"post_id": 71538, "ts": "202 [{"post_id": 71538, "ts": "2026-09-21T01:07:58Z", "hours": 2.4781, "text": "FINISHED AND READY TO SHIP BABY - chapter 1, the village and the forest, are finished, with save files"}, {"post_id": 71348, "ts": "2026-09-20T17:53:30Z", "hours": 3.0286, "text": "yeep its been a while since i did my last devlog, and i’ve worked rlly hard! so here’s some updates for rUnE oF fOoTtTtTtTt so first of all, i finished the first level of the game <3 the forest is complete! so is the Tax Collector™! you’ll meet him later hehe - also i completed a save file system so that you don’t permadie after an hour of grinding and lose all your progress. also finished the creepy place called the pocket. so yea, thats what i did, cya when its shipped !!!"}, {"post_id": 70339, "ts": "2026-09-19T00:01:01Z", "hours": 0.4728, "text": "Hey yall !! Chances are you have no idea what my game is because I have literally one follower :( but now’s your time to stop scrolling and uh be enlightened i guess !! 😅 so Rune of Foot is a text-based Python RPG. contrary to popular belief its not just a wall of if statements! theres a whole lotta meat to it (im so sorry) and you should check it out by clickin on my profile! so rn i worked on some new enemies and debugged my spawning mechanic! so so excited to ship this, it’ll be my first ever project! so cya !!"}, {"post_id": 70307, "ts": "2026-09-18T22:11:16Z", "hours": 0.3983, "text": "hehe, doors fans might recognize this, but I added a rift-like feature to my game (image below from Doors, not my game lmao) called the Pocket. you can store items inside and they get saved upon death! pretty neat, right?"}, {"post_id": 69917, "ts": "2026-09-18T02:07:51Z", "hours": 0.4153, "text": "my new fav enemy in my game: Rock, Paper, Scissors! he sounds very simple but is actually very deadly. His top attack does up to 20 damage (almost 50% of your health when you first have the chance to meet him), and his lesser attacks do really. really. really bad status effects. imagine the wither effect in minecraft but at the same time ur bleeding out :I so yea, i rlly enjoy fighting him, it is strategic because you need to defend so that you dont bleed out or get demolished by rock attacks but also attack because he doesnt have very much health!"}, {"post_id": 69894, "ts": "2026-09-18T00:57:54Z", "hours": 0.3575, "text": "in love with my player.attack() function <3. a good game developer would prob look down on me and say “gosh this kid is stupid, he’s so proud of making an absurd text based game in python.” but nah, i’ve evolved from those stupid if statement choose-your-own-adventure spirals (rune of foot is so much more than that, check my project’s repository) and i’m genuinely so happy rn so let me be plz :DDDD"}, {"post_id": 69869, "ts": "2026-09-17T23:26:09Z", "hours": 0.7617, "text": "The Hackatime thing isnt working :( i have 2 hours 22 minutes but it shows 45 minutes only. But anyways Devlog 1: Crap I’ve come far, finished 75% of brawling mechanics (I have 3 current actions, attack, defend, and check, planning to add a use inventory action next, no I’m not copying Undertale harrumph ). Also finished the status effects system, just gotta - uh - add status effects 😅 Also got the first enemy (Frail Psychopath) down, it’s a very easy but nice introductory brawl. So yea, hopefully Hackatime fixes itself soon and cya in devlog 2!"}]...
|
Title: Rune of Foot by @NotIdhant | Stardance
Dev Title: Rune of Foot by @NotIdhant | Stardance
Devlogs:
The Hackatime thing isnt working :( i have 2 hours 22 minutes but it shows 45 minutes only. But anyways Devlog 1: Crap I’ve come far, finished 75% of brawling mechanics (I have 3 current actions, attack, defend, and check, planning to add a use inventory action next, no I’m not copying Undertale harrumph ). Also finished the status effects system, just gotta - uh - add status effects 😅 Also got the first enemy (Frail Psychopath) down, it’s a very easy but nice introductory brawl. So yea, hopefully Hackatime fixes itself soon and cya in devlog 2!
in love with my player.attack() function <3. a good game developer would prob look down on me and say “gosh this kid is stupid, he’s so proud of making an absurd text based game in python.” but nah, i’ve evolved from those stupid if statement choose-your-own-adventure spirals (rune of foot is so much more than that, check my project’s repository) and i’m genuinely so happy rn so let me be plz :DDDD
my new fav enemy in my game: Rock, Paper, Scissors! he sounds very simple but is actually very deadly. His top attack does up to 20 damage (almost 50% of your health when you first have the chance to meet him), and his lesser attacks do really. really. really bad status effects. imagine the wither effect in minecraft but at the same time ur bleeding out :I so yea, i rlly enjoy fighting him, it is strategic because you need to defend so that you dont bleed out or get demolished by rock attacks but also attack because he doesnt have very much health!
hehe, doors fans might recognize this, but I added a rift-like feature to my game (image below from Doors, not my game lmao) called the Pocket. you can store items inside and they get saved upon death! pretty neat, right?
Hey yall !! Chances are you have no idea what my game is because I have literally one follower :( but now’s your time to stop scrolling and uh be enlightened i guess !! 😅 so Rune of Foot is a text-based Python RPG. contrary to popular belief its not just a wall of if statements! theres a whole lotta meat to it (im so sorry) and you should check it out by clickin on my profile! so rn i worked on some new enemies and debugged my spawning mechanic! so so excited to ship this, it’ll be my first ever project! so cya !!
yeep its been a while since i did my last devlog, and i’ve worked rlly hard! so here’s some updates for rUnE oF fOoTtTtTtTt so first of all, i finished the first level of the game <3 the forest is complete! so is the Tax Collector™! you’ll meet him later hehe - also i completed a save file system so that you don’t permadie after an hour of grinding and lose all your progress. also finished the creepy place called the pocket. so yea, thats what i did, cya when its shipped !!!
FINISHED AND READY TO SHIP BABY - chapter 1, the village and the forest, are finished, with save files
Ships:
Rune of Foot was a rollercoaster for me. Now that Chapter 1 is finished, I guess I can finally have my sleep hehe - but really though, it was difficult because it was my first ever time coding a big Python project like this. So I’m exceptionally proud. Check it out on my Github page, just download the ZIP and you’re good! Thank you for all the support!...
|
1793058520.185883
|
1793144920.185883
|
|
52596
|
My first slack bot! - Blackreaper by @DaviSilva | My first slack bot! - Blackreaper by @DaviSilva | Stardance...
|
DaviSilva
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T01:02:51Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What I built I made a Slack bot called BlackReaper. It has a few different commands like ping, help, cat facts, jokes, dice, coin flip, and random dog photos. Some of them also use APIs, like the cat fact, joke, and dog photo commands. I also added the three extra commands that were required for the challenge. They are all in my code, but for some reason the three new ones aren’t showing up in Slack. I’m not really sure what happened with the configuration, but I’m still shipping the project since the commands are already in the code. If someone knows what I did wrong or can help me get them working in Slack, I’d really appreciate it. What was challenging I started this project basically knowing nothing about JavaScript, so there was definitely a lot to figure out. The setup was probably the hardest part for me, especially VS Code and the Nest configuration. I ran into a bunch of problems and had to use AI to help me figure some of them out, but I also learned from fixing those problems. What I’m proud of I’m really proud that I actually finished the project. This is my first project on StarDance, and I started it without really knowing JavaScript or how to make a bot. Seeing everything actually work after all the problems I had was really cool. What people should know I put a lot of time and effort into this project and made it with a lot of care. The main commands are working, and the three extra commands are already in the code. The only thing I’m still trying to figure out is why those new commands aren’t showing up in Slack. If someone can help me fix that, I’d really appreciate it!", "repo": "https://github.com/X-BlackScythe/BlackReaper---First-Slack-Bot-", "demo": "https://hackclub.enterprise.slack.com/archives/C0P5NE354"}]...
|
[{"post_id": 71534, "ts": "202 [{"post_id": 71534, "ts": "2026-09-21T00:54:33Z", "hours": 0.35, "text": "So for this new version I added 4 new commands, the joke example from the mission guide, roll a dice, flip a coin and dog photo, Idk if I have to restart something or what but on the VsCode the code for the commands is there but when I try using them on Slack they do not appear…. I’ll ship the project because IDK what to do now, But I did my work with everything that I have :)"}, {"post_id": 62372, "ts": "2026-09-05T18:18:48Z", "hours": 0.3969, "text": "Almost done! - First Slack Bot. Today I made my nest account and got to put my bot (BlackReaper) to work 24/7, I had some problems along the way and had the help of AI to explain it to me, the biggest problem that I had was with the name Index.js hahahaha, I was trying to run it by writing “ node index.js” and it wasn’t working because I had to write “ node Index.js” with the big “i”, I spent 5 minutes just to notice this. I want to add at least 1 more command with API before finishing the project. I also added in the GitHub repository the “README.ms”. Thanks for reading!"}, {"post_id": 54788, "ts": "2026-08-25T22:04:23Z", "hours": 0.4278, "text": "(DevLog #01) First Slack Bot - Blackreaper Until yesterday I didn’t know anything about a slack bot, but today I got to make one and put it to work! I named it Blackreaper, it main purpose its to respond commands in the channel #bot-spam on (Hack Club - Slack) , it has the commands /blackreaper-ping /blackreaper-help and /blackreaper-catfacts ( The last one use an API to get the facts!), I got some problems with VsCode Git and NodeJS but nothing seriously just some configurations, I want to add more commands that uses API’s in the future. That is my first DevLog! Thanks!"}]...
|
Title: My first slack bot! - Blackreaper by @DaviS Title: My first slack bot! - Blackreaper by @DaviSilva | Stardance
Devlogs:
(DevLog #01) First Slack Bot - Blackreaper Until yesterday I didn’t know anything about a slack bot, but today I got to make one and put it to work! I named it Blackreaper, it main purpose its to respond commands in the channel #bot-spam on (Hack Club - Slack) , it has the commands /blackreaper-ping /blackreaper-help and /blackreaper-catfacts ( The last one use an API to get the facts!), I got some problems with VsCode Git and NodeJS but nothing seriously just some configurations, I want to add more commands that uses API’s in the future. That is my first DevLog! Thanks!
Almost done! - First Slack Bot. Today I made my nest account and got to put my bot (BlackReaper) to work 24/7, I had some problems along the way and had the help of AI to explain it to me, the biggest problem that I had was with the name Index.js hahahaha, I was trying to run it by writing “ node index.js” and it wasn’t working because I had to write “ node Index.js” with the big “i”, I spent 5 minutes just to notice this. I want to add at least 1 more command with API before finishing the project. I also added in the GitHub repository the “README.ms”. Thanks for reading!
So for this new version I added 4 new commands, the joke example from the mission guide, roll a dice, flip a coin and dog photo, Idk if I have to restart something or what but on the VsCode the code for the commands is there but when I try using them on Slack they do not appear…. I’ll ship the project because IDK what to do now, But I did my work with everything that I have :)
Ships:
What I built I made a Slack bot called BlackReaper. It has a few different commands like ping, help, cat facts, jokes, dice, coin flip, and random dog photos. Some of them also use APIs, like the cat fact, joke, and dog photo commands. I also added the three extra commands that were required for the challenge. They are all in my code, but for some reason the three new ones aren’t showing up in Slack. I’m not really sure what happened with the configuration, but I’m still shipping the project since the commands are already in the code. If someone knows what I did wrong or can help me get them working in Slack, I’d really appreciate it. What was challenging I started this project basically knowing nothing about JavaScript, so there was definitely a lot to figure out. The setup was probably the hardest part for me, especially VS Code and the Nest configuration. I ran into a bunch of problems and had to use AI to help me figure some of them out, but I also learned from fixing those problems. What I’m proud of I’m really proud that I actually finished the project. This is my first project on StarDance, and I started it without really knowing JavaScript or how to make a bot. Seeing everything actually work after all the problems I had was really cool. What people should know I put a lot of time and effort into this project and made it with a lot of care. The main commands are working, and the three extra commands are already in the code. The only thing I’m still trying to figure out is why those new commands aren’t showing up in Slack. If someone can help me fix that, I’d really appreciate it!...
|
1793004997.3468723
|
1793091397.3468723
|
|
36238
|
DIY Solder Fume Extractor + Air Quality Sensor by DIY Solder Fume Extractor + Air Quality Sensor by @james-lian | Stardance...
|
james-lian
|
1
|
21.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T00:57:44Z", "hours": 21.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a small hobbyist solder fume extractor complete with an air quality sensor for soldering applications. Features include: powered by a 12V DC power supply 0.91inch OLED SSD1306 LM2596-3.3 buck converter for 3V3 supply ENS160+AHT21 sensor to detect VOCs and eCO2 ESP-01S microcontroller custom 3d-printed casing 12V desk fan which pulls solder fumes through an activated carbon filter flip flop switch circuit + MOSFET to control the fan, flyback diode to prevent MOSFET damage A challenge that pushed the project’s completion date back was a manufacturing error that occurred on my PCB. The specific buck converter I ordered from JLCPCB assembly was the LM2596-3.3, but the first batch that was sent to me had the LM2596-ADJ, which output the default ~1.3V instead of 3V3. I only found out about this after soldering on both PCB boards, which meant I had wasted time, effort, and some good usable components which I failed to desolder.", "repo": "https://github.com/James-Lian/Solder-Fume-Extractor", "demo": ""}]...
|
[{"post_id": 71524, "ts": "202 [{"post_id": 71524, "ts": "2026-09-21T00:25:53Z", "hours": 3.2508, "text": "Devlog #7: Completion The replacement PCB board from JLCPCB arrived today, and I spent a couple hours resoldering all the components. Finally, it’s done!"}, {"post_id": 59947, "ts": "2026-09-02T00:32:00Z", "hours": 5.5417, "text": "Devlog #6: Getting throttled Attempting to complete my PCBs, and I’m going through it, fr. Fried transistors + attempted fixes After receiving my PCBs, I got to work to solder my components. I had ordered PCBA for any components I didn’t have, such as inductors, the barrel jack connection, etc., but I was planning to save money by hand-soldering components I DID already have, such as transistors and my entire MCU system. This also gave me the added benefit of testing these components beforehand, and it allowed me to go through several iterations of code on the ESP-01S. The first issue I encountered with hand-soldering was with soldering the tiny, microscopic transistor holes (it was my first time doing so). The copper pads for my PN2222 breadboard transistors are super close together, and with my shaky hands, I accidentally whiffed, put too much solder, and left a solder connection between all three pads. Whoops! I eventually managed to fix it with a solder sucker. But after soldering, I decided to test the transistors with a multimeter to check if they were damaged, and both transistors were duds. I probably spent too long trying to fix it with the soldering iron and ended up frying them both. After this, I attempted to salvage the project by desoldering some of the more expensive components from the board and using it on the second backup PCBA I ordered from JLCPCB. I managed to salvage the OLED screen, but while desoldering the ESP-01S, I broke off several pins, essentially leaving the chip unusable. I decided not to salvage the bigger chips (e.g. ESP-01S, ENS160+AHT21), and decided to just reorder some components instead for the second attempt. New attempt: flip-flop switch fix + MCU not working I managed to solder all components to the second PCB cleanly, without any hiccups. However, on trying my project out, I encountered two issues: The flip flop switch turns on the fan, but it doesn’t turn it off. The 3.3V MCU system (including the OLED, ESP-01S, and ENS160+AHT21 sensor) doesn’t seem to turn on. The first issue was relatively easy to fix. Turns out, I had forgotten to add a pull-up resistor near the bottom of the flip-flop switch, and thus my steering capacitors had no path to VCC to “refill” (reset) their charge after the initial button press. I quickly soldered a pull-up resistor to VCC to fix it. The second issue stumped me for a while. I found out that I had forgotten to connect pin 4 (EN) of the ESP-01S to 3V3, so I quickly soldered a connection, but it still wasn’t working. Eventually, I took a look with my multimeter and found the problem: my 3V3 logic chips were actually running on 1.23V for some reason. It turns out, JLCPCB had sent me PCBA’s with the WRONG BUCK CONVERTER. I had ordered an TDSEMIC LM2596S-3.3, which would normally work perfectly, but JLCPCB had sent me PCBA’s with TDSEMIC LM2596S-ADJ instead. I’ll have to either contact JLCPCB for a refund, or attempt to salvage the PCB myself by modding it. I’ve burnt enough allowance on this ;-; Below: desoldering fail, attempted fixes (2), close-up of LM2596S-ADJ vs what I actually ordered ( https://www.lcsc.com/product-detail/C42421958.html?s_z=n_q_C42421958&globalKeyword=C42421958 )"}, {"post_id": 54994, "ts": "2026-08-26T12:52:38Z", "hours": 5.3325, "text": "Devlog #5 CAD Modeling With the code and PCB done, I needed a frame to hold all of the hardware together. Therefore, I spent a couple hours designing two cases in Fusion360 - one to house the PCB, and one to house the fan and the carbon filter I was using. PCB Case This PCB case is a little different than the ones I’ve designed so far. For one, the MOSFET and the capacitor that arrived on the PCB assembly I ordered from JLCPCB were much larger than I’d imagined, so I needed to design holes in my casing to accommodate for their size. Additionally, the ENS160 + AHT21 sensor needs generous access to air in order to provide accurate readings. I couldn’t encase them in the casing entirely, so I needed several unusual holes in my design so as not to interfere with the placements on my PCB board. I ended up designing a snap-fit housing with two parts - top and bottom (my first time designing a snap-fit joint!). The top part has several holes to ensure enough spacing for PCB components such as the OLED screen and keyswitch. It’s not air tight, but I really only need it to keep the PCB isolated and make things more presentable. Fan Holder Case I also needed to model a CAD case for the desktop fan to hold it and the active carbon filter in place. The fan case itself is actually a very simple design - three separate “panels” held in place with 4 screws and heat inserts."}, {"post_id": 54243, "ts": "2026-08-25T04:02:06Z", "hours": 3.2061, "text": "Devlog #4 Finalizing MCU program I used the breadboard prototype I had from Devlog #1 to finalize a working version of the ENS160 + AHT21 sensor program on the ESP-01S. I use the Adafruit libraries for these components to extract their readings, and then display it on a scrolling background on my 0.91 inch OLED SSD1306. This program is the final step before I solder the remaining components onto my PCB, which conveniently arrived as I was on vacation. It displays the following information: Line 1: Temp (deg C), Temp (deg F), Humidity (relative %) Line 2: Air Quality Index (AQI), Total Volatile Organic Compounds (ppb - TVOC), eCO2 (ppm - estimated CO2)"}, {"post_id": 31068, "ts": "2026-07-19T05:01:26Z", "hours": 1.7156, "text": "Devlog #3 - PCB design Once I had the design finalized from the schematic, it was straightforward enough to convert it into a PCB. I spent some time rearranging components to try and use as little space as possible. I had to leave some extra space for the ENS160+AHT21 air quality sensor, as it doesn’t work without consistent exposure to air."}, {"post_id": 30977, "ts": "2026-07-19T00:12:45Z", "hours": 1.6228, "text": "Devlog #2 - schematic design After confirming that the ESP-01S was a viable microcontroller for this project, I continued with designing the schematic for the PCB. Power Management ESP-01S is a 3.3V native controller, and the ENS160+AHT21 and the I2C OLED both use 3.3V logic. If I plug my 12V DC adapter directly into the ESP-01S, I’ll fry all my MCU components. Thus, I’m using an LM2596 buck converter to step-down some of the charge to 3.3V. Air Quality Sensor + MCU This section contains the sensor components and MCU. The air quality sensors and the OLED both share the same SCL/SDA I2C communication pins, which we established was possible in the previous devlog. Flip-Flop Switch + MOSFET Since the pins on the ESP-01S are being used, I decided to try exploring other options to turn my fan ON/OFF. I decided to use a flip-flop switch circuit. This allows me to persistently alter the fan’s ON/OFF state by simply clicking one pushbutton. The flip-flop switch circuit is a bistable multivibrator. It has two stable states where it can output a persistent signal (either 0 or 1), thus why we say it can represent a single bit of information. One of the states (transistors) is connected to a MOSFET (STP55NF06L), a heavy-duty voltage-controlled component which handles heavy loads much better than a simple transistor. The MOSFET helps control the fan. I attached a flyback diode in parallel to the fan. Because a fan is fundamentally wire coiled around magnets (an inductor), when the flip-flop switch suddenly turns off, the magnetic field of the fan collapses, converting back into an extremely high-voltage electric signal that, if not protected against, could instantly fry my MOSFET. The flyback diode allows the current to loop back around through the inductor until it is harmlessly dissipated as heat. Power-On Circuit On its own, the flip-flop switch’s initial state is hard to control . It’s based on chance, and small manufacturing differences between identical resistors and capacitors used in the circuit. To ensure the flip-flop switch always initializes to an OFF state, I added a tiny 10nF capacitor to one of the transistors. This makes one of the transistors slightly slower, thus ensuring the other one will always “win” the race condition. Next, I’ll be designing the PCB and programming the ESP-01S!"}, {"post_id": 30435, "ts": "2026-07-17T23:44:14Z", "hours": 0.7667, "text": "Devlog #1 - breadboard prototype I’ve been soldering a lot more recently thanks to starting a variety of electronics projects, and I’m starting to feel the need to get a fume extractor and some sort of air quality sensor to monitor my workspace. After some consideration, I decided making my own fume extractor would be a fun project idea, and also a great way to use up some electronics components that I have lying around. Components To make this project, I ordered some cheap $6 12V cooling fans meant for PC setups. For the microcontroller, I’ll be using an ESP-01S, an ENS160+AHT21 (which can measure air quality and VOCs), and an I2C 0.91 inch OLED display, all components I already have. I spent some time desoldering the OLED display from an older PCB project to reuse it in this one. Breadboarding The ESP-01S is an incredibly small controller, with only two pins (GPIO0 and GPIO2) available as digital pins (apart from RX and TX, but I plan to use those for debugging). Since both the OLED and the ENS160+AHT21 are I2C components that communicate with Serial Data (SDA) and Serial Clock (SCL), theoretically these components could share GPIO0 and GPIO2 as SDA and SCL pins if they had different device addresses. However, to be sure, I breadboarded and flashed a quick program to output the addresses and confirm that I had three separate, unique identifiers. Now that I have this information, I’m ready to design the PCB next."}]...
|
Title: DIY Solder Fume Extractor + Air Quality Sen Title: DIY Solder Fume Extractor + Air Quality Sensor by @james-lian | Stardance
Devlogs:
Devlog #1 - breadboard prototype I’ve been soldering a lot more recently thanks to starting a variety of electronics projects, and I’m starting to feel the need to get a fume extractor and some sort of air quality sensor to monitor my workspace. After some consideration, I decided making my own fume extractor would be a fun project idea, and also a great way to use up some electronics components that I have lying around. Components To make this project, I ordered some cheap $6 12V cooling fans meant for PC setups. For the microcontroller, I’ll be using an ESP-01S, an ENS160+AHT21 (which can measure air quality and VOCs), and an I2C 0.91 inch OLED display, all components I already have. I spent some time desoldering the OLED display from an older PCB project to reuse it in this one. Breadboarding The ESP-01S is an incredibly small controller, with only two pins (GPIO0 and GPIO2) available as digital pins (apart from RX and TX, but I plan to use those for debugging). Since both the OLED and the ENS160+AHT21 are I2C components that communicate with Serial Data (SDA) and Serial Clock (SCL), theoretically these components could share GPIO0 and GPIO2 as SDA and SCL pins if they had different device addresses. However, to be sure, I breadboarded and flashed a quick program to output the addresses and confirm that I had three separate, unique identifiers. Now that I have this information, I’m ready to design the PCB next.
Devlog #2 - schematic design After confirming that the ESP-01S was a viable microcontroller for this project, I continued with designing the schematic for the PCB. Power Management ESP-01S is a 3.3V native controller, and the ENS160+AHT21 and the I2C OLED both use 3.3V logic. If I plug my 12V DC adapter directly into the ESP-01S, I’ll fry all my MCU components. Thus, I’m using an LM2596 buck converter to step-down some of the charge to 3.3V. Air Quality Sensor + MCU This section contains the sensor components and MCU. The air quality sensors and the OLED both share the same SCL/SDA I2C communication pins, which we established was possible in the previous devlog. Flip-Flop Switch + MOSFET Since the pins on the ESP-01S are being used, I decided to try exploring other options to turn my fan ON/OFF. I decided to use a flip-flop switch circuit. This allows me to persistently alter the fan’s ON/OFF state by simply clicking one pushbutton. The flip-flop switch circuit is a bistable multivibrator. It has two stable states where it can output a persistent signal (either 0 or 1), thus why we say it can represent a single bit of information. One of the states (transistors) is connected to a MOSFET (STP55NF06L), a heavy-duty voltage-controlled component which handles heavy loads much better than a simple transistor. The MOSFET helps control the fan. I attached a flyback diode in parallel to the fan. Because a fan is fundamentally wire coiled around magnets (an inductor), when the flip-flop switch suddenly turns off, the magnetic field of the fan collapses, converting back into an extremely high-voltage electric signal that, if not protected against, could instantly fry my MOSFET. The flyback diode allows the current to loop back around through the inductor until it is harmlessly dissipated as heat. Power-On Circuit On its own, the flip-flop switch’s initial state is hard to control . It’s based on chance, and small manufacturing differences between identical resistors and capacitors used in the circuit. To ensure the flip-flop switch always initializes to an OFF state, I added a tiny 10nF capacitor to one of the transistors. This makes one of the transistors slightly slower, thus ensuring the other one will always “win” the race condition. Next, I’ll be designing the PCB and programming the ESP-01S!
Devlog #3 - PCB design Once I had the design finalized from the schematic, it was straightforward enough to convert it into a PCB. I spent some time rearranging components to try and use as little space as possible. I had to leave some extra space for the ENS160+AHT21 air quality sensor, as it doesn’t work without consistent exposure to air.
Devlog #4 Finalizing MCU program I used the breadboard prototype I had from Devlog #1 to finalize a working version of the ENS160 + AHT21 sensor program on the ESP-01S. I use the Adafruit libraries for these components to extract their readings, and then display it on a scrolling background on my 0.91 inch OLED SSD1306. This program is the final step before I solder the remaining components onto my PCB, which conveniently arrived as I was on vacation. It displays the following information: Line 1: Temp (deg C), Temp (deg F), Humidity (relative %) Line 2: Air Quality Index (AQI), Total Volatile Organic Compounds (ppb - TVOC), eCO2 (ppm - estimated CO2)
Devlog #5 CAD Modeling With the code and PCB done, I needed a frame to hold all of the hardware together. Therefore, I spent a couple hours designing two cases in Fusion360 - one to house the PCB, and one to house the fan and the carbon filter I was using. PCB Case This PCB case is a little different than the ones I’ve designed so far. For one, the MOSFET and the capacitor that arrived on the PCB assembly I ordered from JLCPCB were much larger than I’d imagined, so I needed to design holes in my casing to accommodate for their size. Additionally, the ENS160 + AHT21 sensor needs generous access to air in order to provide accurate readings. I couldn’t encase them in the casing entirely, so I needed several unusual holes in my design so as not to interfere with the placements on my PCB board. I ended up designing a snap-fit housing with two parts - top and bottom (my first time designing a snap-fit joint!). The top part has several holes to ensure enough spacing for PCB components such as the OLED screen and keyswitch. It’s not air tight, but I really only need it to keep the PCB isolated and make things more presentable. Fan Holder Case I also needed to model a CAD case for the desktop fan to hold it and the active carbon filter in place. The fan case itself is actually a very simple design - three separate “panels” held in place with 4 screws and heat inserts.
Devlog #6: Getting throttled Attempting to complete my PCBs, and I’m going through it, fr. Fried transistors + attempted fixes After receiving my PCBs, I got to work to solder my components. I had ordered PCBA for any components I didn’t have, such as inductors, the barrel jack connection, etc., but I was planning to save money by hand-soldering components I DID already have, such as transistors and my entire MCU system. This also gave me the added benefit of testing these components beforehand, and it allowed me to go through several iterations of code on the ESP-01S. The first issue I encountered with hand-soldering was with soldering the tiny, microscopic transistor holes (it was my first time doing so). The copper pads for my PN2222 breadboard transistors are super close together, and with my shaky hands, I accidentally whiffed, put too much solder, and left a solder connection between all three pads. Whoops! I eventually managed to fix it with a solder sucker. But after soldering, I decided to test the transistors with a multimeter to check if they were damaged, and both transistors were duds. I probably spent too long trying to fix it with the soldering iron and ended up frying them both. After this, I attempted to salvage the project by desoldering some of the more expensive components from the board and using it on the second backup PCBA I ordered from JLCPCB. I managed to salvage the OLED screen, but while desoldering the ESP-01S, I broke off several pins, essentially leaving the chip unusable. I decided not to salvage the bigger chips (e.g. ESP-01S, ENS160+AHT21), and decided to just reorder some components instead for the second attempt. New attempt: flip-flop switch fix + MCU not working I managed to solder all components to the second PCB cleanly, without any hiccups. However, on trying my project out, I encountered two issues: The flip flop switch turns on the fan, but it doesn’t turn it off. The 3.3V MCU system (including the OLED, ESP-01S, and ENS160+AHT21 sensor) doesn’t seem to turn on. The first issue was relatively easy to fix. Turns out, I had forgotten to add a pull-up resistor near the bottom of the flip-flop switch, and thus my steering capacitors had no path to VCC to “refill” (reset) their charge after the initial button press. I quickly soldered a pull-up resistor to VCC to fix it. The second issue stumped me for a while. I found out that I had forgotten to connect pin 4 (EN) of the ESP-01S to 3V3, so I quickly soldered a connection, but it still wasn’t working. Eventually, I took a look with my multimeter and found the problem: my 3V3 logic chips were actually running on 1.23V for some reason. It turns out, JLCPCB had sent me PCBA’s with the WRONG BUCK CONVERTER. I had ordered an TDSEMIC LM2596S-3.3, which would normally work perfectly, but JLCPCB had sent me PCBA’s with TDSEMIC LM2596S-ADJ instead. I’ll have to either contact JLCPCB for a refund, or attempt to salvage the PCB myself by modding it. I’ve burnt enough allowance on this ;-; Below: desoldering fail, attempted fixes (2), close-up of LM2596S-ADJ vs what I actually ordered ( https://www.lcsc.com/product-detail/C42421958.html?s_z=n_q_C42421958&globalKeyword=C42421958 )
Devlog #7: Completion The replacement PCB board from JLCPCB arrived today, and I spent a couple hours resoldering all the components. Finally, it’s done!
Ships:
I made a small hobbyist solder fume extractor complete with an air quality sensor for soldering applications. Features include: powered by a 12V DC power supply 0.91inch OLED SSD1306 LM2596-3.3 buck converter for 3V3 supply ENS160+AHT21 sensor to detect VOCs and eCO2 ESP-01S microcontroller custom 3d-printed casing 12V desk fan which pulls solder fumes through an activated carbon filter flip flop switch circuit + MOSFET to control the fan, flyback diode to prevent MOSFET damage A challenge that pushed the project’s completion date back was a manufacturing error that occurred on my PCB. The specific buck converter I ordered from JLCPCB assembly was the LM2596-3.3, but the first batch that was sent to me had the LM2596-ADJ, which output the default ~1.3V instead of 3V3. I only found out about this after soldering on both PCB boards, which meant I had wasted time, effort, and some good usable components which I failed to desolder....
|
1793004987.4812524
|
1793091387.4812524
|
|
52073
|
After Playlist by @Jolly_VFX | Stardance
|
Jolly_VFX
|
2
|
14.0
|
229
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T23:41:39Z", "hours": 7.0, "multiplier": 12.4, "payout": 107, "blessing": "neutral", "text": "After Playlist v5.0.0 BOOM! I’ve finally finished with my second ship for this project. Honestly I’ve had a blast making this and I hope everyone likes it! What did I make? I made a Adobe After Effects ScriptUI Panel that lets you control what music is playing through PowerShell and Windows Script Host. This all happens asynchronously so no need to worry about AE lagging, losing focus, or simply just crashing. It’s all handled outside. The project is designed to save those extra few seconds and to make sure that you never have to leave the editing “flow-state.” I also made another video! :D Major QoL improvements: Multiple guides: Majorly helps users install, troubleshoot, or even just figure out if they can run the script. Settings panel: Give more control and freedom over the script Error codes! I really should’ve added these earlier. They help the user troubleshoot more easily and figure out what’s wrong! Challenges I didn’t have too much difficulty this time tbh. I had to research quite I bit to figure out how to even make a settings panel which I tried to make before but failed HORRIBLY. I updated the UI which wasn’t too challenging at all. I suppose the biggest challenge was how tiring it was to make all those functions for the settings menu. Thanks for the feedback I got some AMAZING feedback from the previous ship and I made sure to address each of them. They mainly said to fix/update the UI and I did so. I do agree the previous UI wasn’t exactly… appealing. AI disclaimer I didn’t use as much AI as last ship. It was mainly just for ideas and I asked once why my settings menu wasn’t opening and I got some feedback from Manus which steered me in the right direction. I only copy and pasted a few times for the unicode symbols because I decided that symbols would look better and cleaner than text. Thanks to everyone at Hackclub for making Stardance. It really gave me a purpose (and i also needed motivation to learn coding lol).", "repo": "https://github.com/pi-vfx-aep/After-Playlist", "demo": "https://github.com/pi-vfx-aep/After-Playlist/releases/tag/v5.0"}, {"ship_num": 2, "ts": "2026-08-28T00:40:39Z", "hours": 7.0, "multiplier": 14.99, "payout": 122, "blessing": "neutral", "text": "After Playlist V4.0.0 for Windows 11 Time spent: ~7 hours (5h developing and 2h asset creation and video editing). Editors like myself often find themselves in a state known as the flow state. The flow state is a time where an editor is completely locked in and fully focused on editing. A major contributor to achieving this state is music. Music is what relaxes you and gets you focused at the same time. The Problem: The big issue is that flipping between Spotify or other media platforms can easily break the creative flow. I personally hate going back and forth between Adobe After Effects (AE) and Spotify just to pause a song or look at what the song is called. Standard AE scripts that aim to fix this problem usually end up making AE freeze. The Solution: After Playlist is a media controller that stays docked inside AE. It uses an Asynchronous architecture to communicate with Windows silently to make sure AE doesn’t keep freezing. The 4 Major QoL Improvements: A non-blocking asynchronous engine: It uses a small little hidden VBScript/Powershell bridge to keep AE responsive (errors can occur!) A live now-playing section: Every 6 seconds the artist name and song name is fetched through background polling. It uses a marquee scrolling effect for long names. Spotify launcher and media controls: The main part is the media controls (Play/pause, next, previous, volume up/down, and mute. It also has a button to launch Spotify incase you haven’t already :D Diagnostics test: The button near the button runs a test to make sure the script will work (Can be inaccurate). Challenges: As I’ve mentioned in a previous devlog and the Github README, I had a hard time figuring out how to even make this work. Some deep researching led me to PowerShell and VBScript. Another challenge was not much a challenge and rather an annoying bug that would register multiple clicks at once causing either AE to crash or the script to not work. AI Disclaimer: Manus and Claude were used quite a bit for pointing out errors that I missed and they also helped come up with ideas to add to the script. The name was based off a ChatGPT suggestion lol. Technical details: Language used: Adobe ExtendScript (Based on ECMAScript) Code editor used: VS Code Software used for testing: Adobe After Effects 2025. Hope people use this! Have an absolutely spectacular day!", "repo": "https://github.com/pi-vfx-aep/After-Playlist", "demo": "https://github.com/pi-vfx-aep/After-Playlist/releases/tag/v5.0"}]...
|
[{"post_id": 71501, "ts": "202 [{"post_id": 71501, "ts": "2026-09-20T22:54:34Z", "hours": 1.8772, "text": "I’m Finally Done (Hopefully) I decided to make a little “Minimum System Requirements” sheet because well, why not? It felt like a good addition because I don’t want people installing the script and then not being able to use it. The other important thing I did was make another video. Is it necessary? No. Is it absolutely awesome and cool? ONE HUNDRED PERCENT! My passion for video editing is so strong I just couldn’t bring myself to not make another video. This one is a little different however. I didn’t showcase the tool at all, its more so just an ad to get people interested. The style of it is also different. I went with a low fps, grainy, style of video. References: https://www.youtube.com/watch?v=EUoHKh86mX0 https://www.youtube.com/watch?v=cxA-qJsJL30 Video Details: FPS: 18 Resolution: 1920 x 1080 px How cool it is: 10/10"}, {"post_id": 69406, "ts": "2026-09-17T00:04:29Z", "hours": 4.0544, "text": "Possible my second last devlog I did quite a lot in these 4 hours. Before I tell you, I’d like to thank everyone at stardance for this amazing opportunity to pursue this project and also get a cool prize :D What I added I added a settings menu! I actually tried to add one a while back but it unfortunately it did not work. I did not give up. I decided to add it back in the 5.0 version (releasing soon, probably when I ship). I also added a couple more things: Fixed status text Fixed minor bugs Added error codes Added tooltips to error codes New manuals I also created two manuals so far. A user manual and a troubleshooting manual. The troubleshooting manual defines all the error codes and gives fixes, general fixes, how to report a problem, and known limitations of the script. The user manual gives explicit info on the script and its functions and it has a simplified version of how to install it (more in depth instructions on readme). Error codes While seemingly irrelevant, error codes are SUPER important. It lets the user reference the trouble shooting guide much easier and they also have much less to remember. AI disclaimer As always I have to provide an AI disclaimer. Now most of this didn’t really use much AI since it was pretty basic stuff especially the error codes. All I really asked AI about was what I should add to the settings since I’m not exactly creative. As for how to make the settings panel, I just researched a little online, dug through some forums, and that’s pretty much it. THANKS TO EVERYONE AT STARDANCE LOVE YALL"}, {"post_id": 63188, "ts": "2026-09-06T21:08:19Z", "hours": 1.2042, "text": "I’m back. I got some amazing feedback on this project and I’m honored to get a blessing. It has boosted my motivation to continue this silly project of mine. I’ve been quite inactive lately because I was sick but fret not because I’m back to working on After Playlist. This time, I worked a lot more on the UI because most of my feedback was that the UI looked boring and generic. Fair enough. I changed up some colors and positions of the buttons and then I set this as a new release on my github. I plan on spending atleast 6 more hours on this because only then will I be able to get the thing I want (the keebcard). I am not really sure what to add so if you are reading this please give me suggestions! AI disclaimer Not much AI used this time as all I did was change up the UI. I did however use Claude to tell me what I should do to improve the AI but otherwise none of the code was written by AI. Have a great day!"}, {"post_id": 56286, "ts": "2026-08-28T00:08:39Z", "hours": 1.0578, "text": "The final devlog: The journey was fun. I’d never thought I’d make something that I’d use almost every day. After Playlist has evolved ALOT in a short time. When I first made it, I had low hopes. Almost as if it’d be a fail. And though it did indeed fail, I pushed through and made it work. So for my last update, I added two buttons: C - Enables compact mode by hiding everything except the media controls and diagnostics section. S - Launches Spotify for the people like me who feel too lazy to even open Spotify normally. I wont go too much in detail but I used the Spotify protocol which works with every version of Spotify and the compact mode was very simple, all it did was hide certain aspects. I also learned something new. I never actually knew how helpTips worked and I researched them a bit and added two helpTips. One to each button because you can’t really tell what each button does. I’m going to ship this project shortly after everything is in order. AI usage: HUGE thanks to manus once again my goat helped my find out why the diagnostics text was getting cut off and also how to use helpTips properly. Have a good day!"}, {"post_id": 55312, "ts": "2026-08-27T01:47:21Z", "hours": 0.8581, "text": "I did it, I finally added the now playing feature! So as you may know, I revealed in my second devlog of this project that the now playing feature had to be removed because I just could not get it to work. Today I woke up and thought: “Let’s give it another shot” ##My biggest challenge: I had thought of a way to make it work but AE would still keep freezing every now and then because the process was happening through AE. How I made it and fixed the freezing problem: I made a sort of “scout” that would launch a small, hidden powershell process in the background every 6 seconds. This scout then asks windows: “Bro what song is playing right now? I gotta know.” So then windows responds with the answer written in a temporary file. AE then reads this file and displays it on the “Now Playing” section near the top. If the answer comes empty then AE keeps the same song. This way AE doesn’t freeze because the process happens outside AE. One other problem was that the text would get cutoff due to panel resizing issues. To fix this I simply added a marquee scrolling effect to keep it nice and smooth. I won’t go into detail about that but know that I had to search up how to do it since I’ve never done it. AI usage disclaimer: Claude Sonnet was used to point out syntax errors and Manus was used to help guide me to using the “background scout” method. Both AI helped out a whole lot. Hope someone uses this and if you are reading it, have a great day!"}, {"post_id": 52779, "ts": "2026-08-23T03:48:38Z", "hours": 2.5169, "text": "I made another video So if you’ve seen my previous script: “Wiggle Me Timbers,” you’d know I made a short, sick looking demo video so people know how it works. Well, I did it again. My main talent lies in motion graphics and video editing so not making a video would feel like a crime. This video is a bit different from the other one. Instead of making a simple video, I added a fun twist using my knowledge of 3D typography. Anyways the video IS done but I haven’t rendered it yet because I don’t intend to upload it right now. Hope you guys like it!"}, {"post_id": 52012, "ts": "2026-08-22T01:37:11Z", "hours": 1.3683, "text": "FINALLY! So I had a minor (actually kinda major) problem with the original version. It had MAJOR delay! It was honestly very irritating. To fix this I reduced the unecessary delays by reducing the key-down/key-up timing from 40 miliseconds to 15 miliseconds, and the response-file polling interval was reduced from 100 miliseconds to 25. This made it faster yes, but After Effects was still waiting synchronously :( I made the script create a temporary PowerShell script and a hidden VBScript launcher. The VBScript uses WScript.Shell.Run with style 0 and the False wait parameter. I did a little more but I don’t want to bore you :D Anyways if anyone read to the end, I hope you guys have a great day and that someone can actually find this useful."}, {"post_id": 51368, "ts": "2026-08-21T00:22:21Z", "hours": 0.2553, "text": "Now I realized that the idea was i bit far fetched and that making it work first try would be… impossible. It took a while of debugging which i forgot to record so there goes some hours BUT i did record ~15 mins of me testing and updating the README so theres that. I changed the UI, removed and entire feature and make a lot of tweaks to FINALLY make it work. Great thing is manus and claude helped me identify tons of the errors. Have a good day :D"}, {"post_id": 51345, "ts": "2026-08-20T23:20:53Z", "hours": 0.7486, "text": "After Playlist (V1.0) I basically made everything in this one session but technically it’s not fully done. The next few devlogs will include QoL improvements, UI changes, etc. It’s a lightweight media controller for After Effects. If you use AE for hours like me and you need music to stay focused, this is honestly perfect for you. Note: This only works on Windows and the desktop app of Spotify, other desktop apps may work How it works (in more simple terms) Now most of this I needed quite a bit of help for like how to integrate Windows SMTC (System Media Transport Control) Now ExtendScript, the programming language for After Effects ScriptUI Panels doesn’t really support asynchronous Windows API’s :( The good this is you can still build a simple PowerShell Bridge, (It’s not actually that simple for a new coder like me 😭 ) So for the people who can actually understand this… It generates a temporary .ps1 script tapping into GlobalSystemMediaTransportControlsSessionManager wow, thats a real mouthful. Anyways then it uses a custom Await helper via .NET reflection to query the active media session for the song name, artist and the playback status :D Then it reads the cached input from Folder.temp back into the UI Panel (stay with me we’re almost done) Lastly the playback is mapped directly through Poweshell SendKeys commands. AI usage Claude Sonnet was used to debug the code and provide some suggestions on what to add (im not super creative 😭 ) Anyways have fun guys I hope someone will actually use this!"}]...
|
Title: After Playlist by @Jolly_VFX | Stardance
D Title: After Playlist by @Jolly_VFX | Stardance
Devlogs:
After Playlist (V1.0) I basically made everything in this one session but technically it’s not fully done. The next few devlogs will include QoL improvements, UI changes, etc. It’s a lightweight media controller for After Effects. If you use AE for hours like me and you need music to stay focused, this is honestly perfect for you. Note: This only works on Windows and the desktop app of Spotify, other desktop apps may work How it works (in more simple terms) Now most of this I needed quite a bit of help for like how to integrate Windows SMTC (System Media Transport Control) Now ExtendScript, the programming language for After Effects ScriptUI Panels doesn’t really support asynchronous Windows API’s :( The good this is you can still build a simple PowerShell Bridge, (It’s not actually that simple for a new coder like me 😭 ) So for the people who can actually understand this… It generates a temporary .ps1 script tapping into GlobalSystemMediaTransportControlsSessionManager wow, thats a real mouthful. Anyways then it uses a custom Await helper via .NET reflection to query the active media session for the song name, artist and the playback status :D Then it reads the cached input from Folder.temp back into the UI Panel (stay with me we’re almost done) Lastly the playback is mapped directly through Poweshell SendKeys commands. AI usage Claude Sonnet was used to debug the code and provide some suggestions on what to add (im not super creative 😭 ) Anyways have fun guys I hope someone will actually use this!
Now I realized that the idea was i bit far fetched and that making it work first try would be… impossible. It took a while of debugging which i forgot to record so there goes some hours BUT i did record ~15 mins of me testing and updating the README so theres that. I changed the UI, removed and entire feature and make a lot of tweaks to FINALLY make it work. Great thing is manus and claude helped me identify tons of the errors. Have a good day :D
FINALLY! So I had a minor (actually kinda major) problem with the original version. It had MAJOR delay! It was honestly very irritating. To fix this I reduced the unecessary delays by reducing the key-down/key-up timing from 40 miliseconds to 15 miliseconds, and the response-file polling interval was reduced from 100 miliseconds to 25. This made it faster yes, but After Effects was still waiting synchronously :( I made the script create a temporary PowerShell script and a hidden VBScript launcher. The VBScript uses WScript.Shell.Run with style 0 and the False wait parameter. I did a little more but I don’t want to bore you :D Anyways if anyone read to the end, I hope you guys have a great day and that someone can actually find this useful.
I made another video So if you’ve seen my previous script: “Wiggle Me Timbers,” you’d know I made a short, sick looking demo video so people know how it works. Well, I did it again. My main talent lies in motion graphics and video editing so not making a video would feel like a crime. This video is a bit different from the other one. Instead of making a simple video, I added a fun twist using my knowledge of 3D typography. Anyways the video IS done but I haven’t rendered it yet because I don’t intend to upload it right now. Hope you guys like it!
I did it, I finally added the now playing feature! So as you may know, I revealed in my second devlog of this project that the now playing feature had to be removed because I just could not get it to work. Today I woke up and thought: “Let’s give it another shot” ##My biggest challenge: I had thought of a way to make it work but AE would still keep freezing every now and then because the process was happening through AE. How I made it and fixed the freezing problem: I made a sort of “scout” that would launch a small, hidden powershell process in the background every 6 seconds. This scout then asks windows: “Bro what song is playing right now? I gotta know.” So then windows responds with the answer written in a temporary file. AE then reads this file and displays it on the “Now Playing” section near the top. If the answer comes empty then AE keeps the same song. This way AE doesn’t freeze because the process happens outside AE. One other problem was that the text would get cutoff due to panel resizing issues. To fix this I simply added a marquee scrolling effect to keep it nice and smooth. I won’t go into detail about that but know that I had to search up how to do it since I’ve never done it. AI usage disclaimer: Claude Sonnet was used to point out syntax errors and Manus was used to help guide me to using the “background scout” method. Both AI helped out a whole lot. Hope someone uses this and if you are reading it, have a great day!
The final devlog: The journey was fun. I’d never thought I’d make something that I’d use almost every day. After Playlist has evolved ALOT in a short time. When I first made it, I had low hopes. Almost as if it’d be a fail. And though it did indeed fail, I pushed through and made it work. So for my last update, I added two buttons: C - Enables compact mode by hiding everything except the media controls and diagnostics section. S - Launches Spotify for the people like me who feel too lazy to even open Spotify normally. I wont go too much in detail but I used the Spotify protocol which works with every version of Spotify and the compact mode was very simple, all it did was hide certain aspects. I also learned something new. I never actually knew how helpTips worked and I researched them a bit and added two helpTips. One to each button because you can’t really tell what each button does. I’m going to ship this project shortly after everything is in order. AI usage: HUGE thanks to manus once again my goat helped my find out why the diagnostics text was getting cut off and also how to use helpTips properly. Have a good day!
I’m back. I got some amazing feedback on this project and I’m honored to get a blessing. It has boosted my motivation to continue this silly project of mine. I’ve been quite inactive lately because I was sick but fret not because I’m back to working on After Playlist. This time, I worked a lot more on the UI because most of my feedback was that the UI looked boring and generic. Fair enough. I changed up some colors and positions of the buttons and then I set this as a new release on my github. I plan on spending atleast 6 more hours on this because only then will I be able to get the thing I want (the keebcard). I am not really sure what to add so if you are reading this please give me suggestions! AI disclaimer Not much AI used this time as all I did was change up the UI. I did however use Claude to tell me what I should do to improve the AI but otherwise none of the code was written by AI. Have a great day!
Possible my second last devlog I did quite a lot in these 4 hours. Before I tell you, I’d like to thank everyone at stardance for this amazing opportunity to pursue this project and also get a cool prize :D What I added I added a settings menu! I actually tried to add one a while back but it unfortunately it did not work. I did not give up. I decided to add it back in the 5.0 version (releasing soon, probably when I ship). I also added a couple more things: Fixed status text Fixed minor bugs Added error codes Added tooltips to error codes New manuals I also created two manuals so far. A user manual and a troubleshooting manual. The troubleshooting manual defines all the error codes and gives fixes, general fixes, how to report a problem, and known limitations of the script. The user manual gives explicit info on the script and its functions and it has a simplified version of how to install it (more in depth instructions on readme). Error codes While seemingly irrelevant, error codes are SUPER important. It lets the user reference the trouble shooting guide much easier and they also have much less to remember. AI disclaimer As always I have to provide an AI disclaimer. Now most of this didn’t really use much AI since it was pretty basic stuff especially the error codes. All I really asked AI about was what I should add to the settings since I’m not exactly creative. As for how to make the settings panel, I just researched a little online, dug through some forums, and that’s pretty much it. THANKS TO EVERYONE AT STARDANCE LOVE YALL
I’m Finally Done (Hopefully) I decided to make a little “Minimum System Requirements” sheet because well, why not? It felt like a good addition because I don’t want people installing the script and then not being able to use it. The other important thing I did was make another video. Is it necessary? No. Is it absolutely awesome and cool? ONE HUNDRED PERCENT! My passion for video editing is so strong I just couldn’t bring myself to not make another video. This one is a little different however. I didn’t showcase the tool at all, its more so just an ad to get people interested. The style of it is also different. I went with a low fps, grainy, style of video. References: https://www.youtube.com/watch?v=EUoHKh86mX0 https://www.youtube.com/watch?v=cxA-qJsJL30 Video Details: FPS: 18 Resolution: 1920 x 1080 px How cool it is: 10/10
Ships:
After Playlist V4.0.0 for Windows 11 Time spent: ~7 hours (5h developing and 2h asset creation and video editing). Editors like myself often find themselves in a state known as the flow state. The flow state is a time where an editor is completely locked in and fully focused on editing. A major contributor to achieving this state is music. Music is what relaxes you and gets you focused at the same time. The Problem: The big issue is that flipping between Spotify or other media platforms can easily break the creative flow. I personally hate going back and forth between Adobe After Effects (AE) and Spotify just to pause a song or look at what the song is called. Standard AE scripts that aim to fix this problem usually end up making AE freeze. The Solution: After Playlist is a media controller that stays docked inside AE. It uses an Asynchronous architecture to communicate with Windows silently to make sure AE doesn’t keep freezing. The 4 Major QoL Improvements: A non-blocking asynchronous engine: It uses a small little hidden VBScript/Powershell bridge to keep AE responsive (errors can occur!) A live now-playing section: Every 6 seconds the artist name and song name is fetched through background polling. It uses a marquee scrolling effect for long names. Spotify launcher and media controls: The main part is the media controls (Play/pause, next, previous, volume up/down, and mute. It also has a button to launch Spotify incase you haven’t already :D Diagnostics test: The button near the button runs a test to make sure the script will work (Can be inaccurate). Challenges: As I’ve mentioned in a previous devlog and the Github README, I had a hard time figuring out how to even make this work. Some deep researching led me to PowerShell and VBScript. Another challenge was not much a challenge and rather an annoying bug that would register multiple clicks at once causing either AE to crash or the script to not work. AI Disclaimer: Manus and Claude were used quite a bit for pointing out errors that I missed and they also helped come up with ideas to add to the script. The name was based off a ChatGPT suggestion lol. Technical details: Language used: Adobe ExtendScript (Based on ECMAScript) Code editor used: VS Code Software used for testing: Adobe After Effects 2025. Hope people use this! Have an absolutely spectacular day!
After Playlist v5.0.0 BOOM! I’ve finally finished with my second ship for this project. Honestly I’ve had a blast making this and I hope everyone likes it! What did I make? I made a Adobe After Effects ScriptUI Panel that lets you control what music is playing through PowerShell and Windows Script Host. This all happens asynchronously so no need to worry about AE lagging, losing focus, or simply just crashing. It’s all handled outside. The project is designed to save those extra few seconds and to make sure that you never have to leave the editing “flow-state.” I also made another video! :D Major QoL improvements: Multiple guides: Majorly helps users install, troubleshoot, or even just figure out if they can run the script. Settings panel: Give more control and freedom over the script Error codes! I really should’ve added these earlier. They help the user troubleshoot more easily and figure out what’s wrong! Challenges I didn’t have too much difficulty this time tbh. I had to research quite I bit to figure out how to even make a settings panel which I tried to make before but failed HORRIBLY. I updated the UI which wasn’t too challenging at all. I suppose the biggest challenge was how tiring it was to make all those functions for the settings menu. Thanks for the feedback I got some AMAZING feedback from the previous ship and I made sure to address each of them. They mainly said to fix/update the UI and I did so. I do agree the previous UI wasn’t exactly… appealing. AI disclaimer I didn’t use as much AI as last ship. It was mainly just for ideas and I asked once why my settings menu wasn’t opening and I got some feedback from Manus which steered me in the right direction. I only copy and pasted a few times for the unicode symbols because I decided that symbols would look better and cleaner than text. Thanks to everyone at Hackclub for making Stardance. It really gave me a purpose (and i also needed motivation to learn coding lol)....
|
1792994006.615885
|
1793080406.615885
|
|
64280
|
bread&bair by @devlx | Stardance
|
devlx
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T23:35:28Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made Bread & Bair, a terminal-based fantasy text adventure where players explore Morrowfen’s haunted forest to rescue Bair, a missing baker’s apprentice. I’m proud of the branching choices, random travel events, item-based progression, and multiple endings. The main challenge was just designing the game although nothing major.", "repo": "https://github.com/DevanshLath/bread-bair", "demo": "https://pypi.org/project/bread-bair/"}]...
|
[{"post_id": 71503, "ts": "202 [{"post_id": 71503, "ts": "2026-09-20T23:03:56Z", "hours": 1.4019, "text": "Devlog #1 Welcome to Bread & BairBread & Bair is a small fantasy text adventure set in the shadowy woods around Morrowfen Village.The story follows Bair, a baker’s apprentice who disappears after chasing strange lights into the forest. Players must explore dangerous paths, gather key items, uncover the River Hag’s weakness, and return Bair home before the third sunrise.This first version focuses on branching choices, limited inventory, random travel events, multiple discoveries, score tracking, and two possible successful endings. The true ending requires finding both the Amber Tear and the Moonstone, then awakening the star arch.The game is written in Python and runs directly in the terminal with no external dependencies. Future updates could add more locations, character interactions, additional endings, and richer consequences for player choices."}]...
|
Title: bread&bair by @devlx | Stardance
Devlo Title: bread&bair by @devlx | Stardance
Devlogs:
Devlog #1 Welcome to Bread & BairBread & Bair is a small fantasy text adventure set in the shadowy woods around Morrowfen Village.The story follows Bair, a baker’s apprentice who disappears after chasing strange lights into the forest. Players must explore dangerous paths, gather key items, uncover the River Hag’s weakness, and return Bair home before the third sunrise.This first version focuses on branching choices, limited inventory, random travel events, multiple discoveries, score tracking, and two possible successful endings. The true ending requires finding both the Amber Tear and the Moonstone, then awakening the star arch.The game is written in Python and runs directly in the terminal with no external dependencies. Future updates could add more locations, character interactions, additional endings, and richer consequences for player choices.
Ships:
I made Bread & Bair, a terminal-based fantasy text adventure where players explore Morrowfen’s haunted forest to rescue Bair, a missing baker’s apprentice. I’m proud of the branching choices, random travel events, item-based progression, and multiple endings. The main challenge was just designing the game although nothing major....
|
1793058908.3757796
|
1793145308.3757796
|
|
24700
|
GlintX by @taran | Stardance
|
taran
|
1
|
20.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T23:35:12Z", "hours": 20.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made GlintX, a hands-free phone cleaning machine that uses microfiber rollers, cleaning fluid, and UV lights to clean the outside of a phone. The phone sits vertically in the center while two rollers move along its sides using threaded rods and motors. It works kinda like a car wash. It’s main function to clean surface level grime and dirt to make your phone squeaky clean! :) The most challenging part was getting the mechanical system to work reliably. My original 3D-printed carriage broke twice the day before Open Sauce, so I redesigned it so that each roller had its own separate carriage. I also had to do a lot of wiring, debugging, and testing to get the motors, pump, and cleaning mechanism working together. I’m most proud that I was able to take an idea from a rough concept to a working machine that I could actually demonstrate to people at Open Sauce in just a few weeks. Seeing 100+ people reacting to my project amused, surprised, and amazed was really rewarding to me. If you want to test GlintX, place a phone vertically in the center of the machine and start the cleaning cycle. The rollers should move along both sides of the phone while the pump applies cleaning fluid. Please make sure the phone is secured properly before starting the cycle.", "repo": "https://github.com/tiger-14/GlintX", "demo": ""}]...
|
[{"post_id": 40957, "ts": "202 [{"post_id": 40957, "ts": "2026-08-04T20:22:08Z", "hours": 8.8961, "text": "We finally finished assembling and coding GlintX! We spent a lot of time putting together all the electronics and getting the motors, pump, and cleaning mechanism to work together properly. There was a lot of wiring and debugging involved, especially getting everything to fit inside the enclosure while still keeping all the connections accessible. The code also took some testing to get our carriage synced up and work properly. Our 3D printed carriage broke twice thed ay before open sauce and then we decided to have asplit design with each roller having their own carriage and that fixed it! After getting everything working, we brought GlintX to Open Sauce and got to demo it to 100+ people! It was really cool seeing people watching their phones get clean, providing their own feedback and appreciating our project! i am extremely grateful for hack club providing me with this awesome opportunity :)"}, {"post_id": 17385, "ts": "2026-06-28T04:36:11Z", "hours": 6.0561, "text": "We finally finished making the 3D model of our project! We spent a long time on the carriage design (the square piece in the attached vid that holds the two microfiber rollers) and getting the gap between rollers right to fit phones of all sizes, including cases. We went for a sleek futuristic look, so it had to be compact and not too big. In the end, while designing the cleaning fluid container, we realized in the end that we have only one water pump and one long pipe but 4 nozzles lol. So we have to cut them and find a way to arrange and connect them separately. The hardest part was the middle base — it supports the carriage, phone, and threaded rods simultaneously, and getting exact measurements was annoying since several Amazon listings don’t list dimensions. We also designed two internal pillars for structural integrity that double as mounts for the UV strips. The build splits into 6 parts: top lid, carriage, middle base, 2 parts for the shell, and bottom base for all the wiring and Arduino. This was because we wanted to 3D print this project easily without much supports. I also added all our files and created a README to our Github repo and also created a demo video. Our project is now ready to submit for the outpost funding! Thanks for reading! (sorry about making this a bit too long, I should’ve made this into multiple devposts)"}, {"post_id": 15850, "ts": "2026-06-25T19:30:12Z", "hours": 2.8833, "text": "Hey everyone! I finalized the parts list after almost 3 hours of research. Figuring out the motor setup was pretty challenging. I first looked at the NEMA 17, but that was too overkill, then went through 4+ different DC motors before picking TT motors, which have low RPM but high torque (required for spinning our threaded rods) unlike the other motors we looked at. Also had to ditch our first power adapter when we realized 1300mA wouldn’t handle 4 motors running simultaneously. Swapped it for a proper 12V 2A supply. Next, we have to create the CAD model for our project and submit the design!"}, {"post_id": 14723, "ts": "2026-06-23T22:41:50Z", "hours": 2.6067, "text": "Hello everyone! I tried to come up with an original and useful idea for a hardware project for Outpost and decided to make a phone cleaner! @Ben_A and I designed some of the mechanical design for the project in a whiteboard today. The cleaner uses two threaded rods to drive a microfiber roller up and down both sides of the phone, with UV lights lining the inner walls and a sliding door on top to add cleaning fluid. The phone sits vertically in the center. Hardest part of the design was figuring out the microfiber roller design. We ended up choosing threaded rods in order to make the roller move up and down along the phone’s screen and back. Next, we have to complete a proper diagram of our project, make the CAD models to 3D print, and finalize the parts list. We’re trying to find as many parts as possible in local stores nearby to avoid shipping delays!"}]...
|
Title: GlintX by @taran | Stardance
Devlogs:
Hell Title: GlintX by @taran | Stardance
Devlogs:
Hello everyone! I tried to come up with an original and useful idea for a hardware project for Outpost and decided to make a phone cleaner! @Ben_A and I designed some of the mechanical design for the project in a whiteboard today. The cleaner uses two threaded rods to drive a microfiber roller up and down both sides of the phone, with UV lights lining the inner walls and a sliding door on top to add cleaning fluid. The phone sits vertically in the center. Hardest part of the design was figuring out the microfiber roller design. We ended up choosing threaded rods in order to make the roller move up and down along the phone’s screen and back. Next, we have to complete a proper diagram of our project, make the CAD models to 3D print, and finalize the parts list. We’re trying to find as many parts as possible in local stores nearby to avoid shipping delays!
Hey everyone! I finalized the parts list after almost 3 hours of research. Figuring out the motor setup was pretty challenging. I first looked at the NEMA 17, but that was too overkill, then went through 4+ different DC motors before picking TT motors, which have low RPM but high torque (required for spinning our threaded rods) unlike the other motors we looked at. Also had to ditch our first power adapter when we realized 1300mA wouldn’t handle 4 motors running simultaneously. Swapped it for a proper 12V 2A supply. Next, we have to create the CAD model for our project and submit the design!
We finally finished making the 3D model of our project! We spent a long time on the carriage design (the square piece in the attached vid that holds the two microfiber rollers) and getting the gap between rollers right to fit phones of all sizes, including cases. We went for a sleek futuristic look, so it had to be compact and not too big. In the end, while designing the cleaning fluid container, we realized in the end that we have only one water pump and one long pipe but 4 nozzles lol. So we have to cut them and find a way to arrange and connect them separately. The hardest part was the middle base — it supports the carriage, phone, and threaded rods simultaneously, and getting exact measurements was annoying since several Amazon listings don’t list dimensions. We also designed two internal pillars for structural integrity that double as mounts for the UV strips. The build splits into 6 parts: top lid, carriage, middle base, 2 parts for the shell, and bottom base for all the wiring and Arduino. This was because we wanted to 3D print this project easily without much supports. I also added all our files and created a README to our Github repo and also created a demo video. Our project is now ready to submit for the outpost funding! Thanks for reading! (sorry about making this a bit too long, I should’ve made this into multiple devposts)
We finally finished assembling and coding GlintX! We spent a lot of time putting together all the electronics and getting the motors, pump, and cleaning mechanism to work together properly. There was a lot of wiring and debugging involved, especially getting everything to fit inside the enclosure while still keeping all the connections accessible. The code also took some testing to get our carriage synced up and work properly. Our 3D printed carriage broke twice thed ay before open sauce and then we decided to have asplit design with each roller having their own carriage and that fixed it! After getting everything working, we brought GlintX to Open Sauce and got to demo it to 100+ people! It was really cool seeing people watching their phones get clean, providing their own feedback and appreciating our project! i am extremely grateful for hack club providing me with this awesome opportunity :)
Ships:
I made GlintX, a hands-free phone cleaning machine that uses microfiber rollers, cleaning fluid, and UV lights to clean the outside of a phone. The phone sits vertically in the center while two rollers move along its sides using threaded rods and motors. It works kinda like a car wash. It’s main function to clean surface level grime and dirt to make your phone squeaky clean! :) The most challenging part was getting the mechanical system to work reliably. My original 3D-printed carriage broke twice the day before Open Sauce, so I redesigned it so that each roller had its own separate carriage. I also had to do a lot of wiring, debugging, and testing to get the motors, pump, and cleaning mechanism working together. I’m most proud that I was able to take an idea from a rough concept to a working machine that I could actually demonstrate to people at Open Sauce in just a few weeks. Seeing 100+ people reacting to my project amused, surprised, and amazed was really rewarding to me. If you want to test GlintX, place a phone vertically in the center of the machine and start the cleaning cycle. The rollers should move along both sides of the phone while the pump applies cleaning fluid. Please make sure the phone is secured properly before starting the cycle....
|
1793004586.525471
|
1793090986.525471
|
|
64248
|
OrbitOS by @eliziv027 | Stardance
|
eliziv027
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T22:39:37Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built OrbitOS, a space-themed WebOS with draggable windows, a dock, and Welcome, Projects, Sticky Notes, and Orbit Terminal apps. I focused on smoother window dragging and focus behavior, then added Orbit Terminal as a feature beyond the guide. It is deployed without a password—open several apps, drag their title bars, and try the Terminal.", "repo": "https://github.com/zivzancoeli-commits/orbit-os", "demo": "https://zivzancoeli-commits.github.io/orbit-os/"}]...
|
[{"post_id": 71497, "ts": "202 [{"post_id": 71497, "ts": "2026-09-20T22:36:47Z", "hours": 0.3675, "text": "Orbit Terminal + Sticky Notes + Pages deploy; AI helped; Eli directed."}, {"post_id": 71483, "ts": "2026-09-20T22:05:42Z", "hours": 0.6394, "text": "Today I improved draggable window behavior and focus handling in OrbitOS, and refined the Welcome and Projects apps. I tested moving windows and bringing the active window to the front."}, {"post_id": 71461, "ts": "2026-09-20T21:21:41Z", "hours": 0.3125, "text": "I worked on OrbitOS by refining the space-themed WebOS interface and improving the draggable window experience. I polished the dock and the Welcome, Projects, Notes, and Terminal apps, including the extra Orbit Terminal feature. Next I will keep testing interactions and improving the overall usability."}]...
|
Title: OrbitOS by @eliziv027 | Stardance
Devlogs: Title: OrbitOS by @eliziv027 | Stardance
Devlogs:
I worked on OrbitOS by refining the space-themed WebOS interface and improving the draggable window experience. I polished the dock and the Welcome, Projects, Notes, and Terminal apps, including the extra Orbit Terminal feature. Next I will keep testing interactions and improving the overall usability.
Today I improved draggable window behavior and focus handling in OrbitOS, and refined the Welcome and Projects apps. I tested moving windows and bringing the active window to the front.
Orbit Terminal + Sticky Notes + Pages deploy; AI helped; Eli directed.
Ships:
I built OrbitOS, a space-themed WebOS with draggable windows, a dock, and Welcome, Projects, Sticky Notes, and Orbit Terminal apps. I focused on smoother window dragging and focus behavior, then added Orbit Terminal as a feature beyond the guide. It is deployed without a password—open several apps, drag their title bars, and try the Terminal....
|
1793058903.8967242
|
1793145303.8967242
|
|
62366
|
Eli Site by @eliziv027 | Stardance
|
eliziv027
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T22:04:41Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I refined the Eli Site homepage structure and content to better present my interests, projects, and journey. I focused on improving the layout and making the site easier to explore.", "repo": "https://github.com/zivzancoeli-commits/Eli-site", "demo": "https://zivzancoeli-commits.github.io/Eli-site/"}]...
|
[{"post_id": 71457, "ts": "202 [{"post_id": 71457, "ts": "2026-09-20T21:20:12Z", "hours": 0.5022, "text": "I worked on the Eli Site today and refined the personal homepage structure. I improved the layout and content so the site better presents my interests, projects, and journey. Next I will continue polishing the design and adding more useful sections."}]...
|
Title: Eli Site by @eliziv027 | Stardance
Devlogs Title: Eli Site by @eliziv027 | Stardance
Devlogs:
I worked on the Eli Site today and refined the personal homepage structure. I improved the layout and content so the site better presents my interests, projects, and journey. Next I will continue polishing the design and adding more useful sections.
Ships:
I refined the Eli Site homepage structure and content to better present my interests, projects, and journey. I focused on improving the layout and making the site easier to explore....
|
1793058581.7899148
|
1793144981.7899148
|
|
27346
|
shadow less light by @flyingfish | Stardance
|
flyingfish
|
1
|
200.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T21:59:09Z", "hours": 200.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "this is a desk lamp inspired my surgery lights this is my first time ever doing a pcb or smd soldering i learned a ton it was super fun", "repo": "https://github.com/dinotiger01/shadowless-light", "demo": ""}]...
|
[{"post_id": 71477, "ts": "202 [{"post_id": 71477, "ts": "2026-09-20T21:56:22Z", "hours": 7.8586, "text": "https://youtu.be/H-r51vnOVfs everything is done i can ship now there wasnt a lot of stuff to say in the midle of development so the devlogs got kinda bad around the middle"}, {"post_id": 69984, "ts": "2026-09-18T05:47:32Z", "hours": 6.7189, "text": "i have the video on my phone but i dont have wifi rn so you can have this i assembed every thing and starded the covumantation"}, {"post_id": 68285, "ts": "2026-09-14T20:58:58Z", "hours": 7.6081, "text": "100% done with 3d modeling it just takes a long time to proint everything"}, {"post_id": 66330, "ts": "2026-09-12T03:15:51Z", "hours": 8.2417, "text": "um i have done almost everything besides the case servos were breaking everything so aparently even if you dont use a servo on pin 10 0r 9 the servo lobrary still disables it but i uses those for red and green so i will need to figure that out later all panels and the main board are soldered and wired controlls when you click on the rotary encoder it changes what value you are changeing white - white lights red - red lights green - green lights blue - blue lights yellow - servos (not working) purple - turns on uv on main pannel"}, {"post_id": 65764, "ts": "2026-09-11T03:41:50Z", "hours": 4.5517, "text": "i started soldering everything over to the mother board i was able to dim the lights but i broke also its like green idk but most of the fir ware is done"}, {"post_id": 65105, "ts": "2026-09-10T00:33:09Z", "hours": 2.18, "text": "i have finished most of the soldering the rest is just small stuff"}, {"post_id": 64596, "ts": "2026-09-09T03:20:50Z", "hours": 5.7506, "text": "i am at 7/9 sooo close"}, {"post_id": 64439, "ts": "2026-09-08T20:21:40Z", "hours": 2.9669, "text": "i just made a a panel i am at 5/8 i am going to try to finish the other 3 today also"}, {"post_id": 64073, "ts": "2026-09-08T07:05:34Z", "hours": 3.8169, "text": "i got the uv lights all soldered up and made another panel i have made 4/8 panels i was going to meanchen how i have posted 3 devlogs today but i just noticed it became tomorrow during my last recording"}, {"post_id": 63995, "ts": "2026-09-08T03:05:37Z", "hours": 7.0836, "text": "i did the big one and every single light acualy works this time my back is in extreme consent pain i am almost don with soldering though my eyes i have been staring in to these lights for like 7 hr"}, {"post_id": 63665, "ts": "2026-09-07T16:29:00Z", "hours": 2.4503, "text": "i am starting to get the hang of things i lowered my chair and now i dont have insane back pain"}, {"post_id": 63304, "ts": "2026-09-07T01:49:15Z", "hours": 2.8169, "text": "i got some new stuff for soldering um and my back hurts sooo bad"}, {"post_id": 63218, "ts": "2026-09-06T22:02:36Z", "hours": 5.0336, "text": "yooo"}, {"post_id": 62617, "ts": "2026-09-06T02:45:23Z", "hours": 5.6875, "text": "so like i think i poisoned my self or somthing i wasnt able to get mech work done i am like on the verge of passing out like constently ill do a lot more tomarow"}, {"post_id": 61747, "ts": "2026-09-04T20:03:13Z", "hours": 7.3389, "text": "it works"}, {"post_id": 36826, "ts": "2026-07-29T04:02:13Z", "hours": 6.045, "text": "3d modeling and i hate windows i have finish all the 3dmodling i need to do for now and am now just waiting foe the pcbs to ship in the mean tim i wall be here https://stardance.hackclub.com/projects/41354 clips i added clips on the bottom of the outer pieaces they wew to small on the first print so i made them bigger poles i did almost a com pleat overhaul on the poles i made them connect stronger by making them go deeper in logo * i added the loo to everything because it looks cool control i add a control panel it is at the base of the main light and just kinda sits there idea i have a another idea but i am way to tired to add it rn so i am not adding it till later the idea is to have a light conecten to a pole so i can pull it off to like press it up against things rn i also want to add a uv light to it so i can cure things better"}, {"post_id": 35555, "ts": "2026-07-27T02:13:05Z", "hours": 9.48, "text": "windows is soo slow i am making this because i have been modeling for 10hr and more then 10hr doesn’t log to star dance will make a longer devlog in a bit"}, {"post_id": 33887, "ts": "2026-07-24T05:20:04Z", "hours": 4.9367, "text": "alright i got the pcbs 100% done for real this time UV i fully implemented the UV lights IR i gave the option to attach a it receiver so i can do that in the futor if i want to logo i added the updated logo silkscreen i went through the silkscreen and fixed all there errors check i want through literately every since trace and footprint on these boards to make sure i am actually done designing thease"}, {"post_id": 33673, "ts": "2026-07-23T19:40:16Z", "hours": 5.7425, "text": "so turns out i was not done with the pcbs i redesigned the logo i gave it this outline and added a gear to the light bulb uv i had the idea to add uv light to the light for like idk i will probably never use it but its fun the best use i can think of is curing resen witch is really cool i added them in to the pcb redesign so while adding the uv i realized i didnt use the vertion of the foot print ment for hand a soldering so i made sure to fix that hopfully they are done for real this time"}, {"post_id": 32810, "ts": "2026-07-22T06:19:52Z", "hours": 9.4156, "text": "logo i got everything done to get the pcbs orderd Logo i made a logo so i could add it to the silkscreen for some extra style mother board the mother board is basically an Arduino what directly plugs in to 36 outputs so it can control all 9 boards controll to make the controller i have desided it is going to be comprised of 3 componest the indicator a rotary encoder and a switch indicator it is passively a relay small since wrgb controller so i can do a small display type out but it is also nice because i have extra of all the components so this will make them easy to use for other components jlc is goofy so if you have sevral break away bords in one they charge you for all of them witch is like a lot and the work around is if you split all of them in to there own file it only cost like $2 per board so instead of paying $20 for for board i paid $8 for the same amount this is what i split everything in to fin_right fin_left indicator mother_board main_light"}, {"post_id": 32122, "ts": "2026-07-21T02:09:02Z", "hours": 6.1692, "text": "uh i am so tired i did like 6hr of work while fighting to stay awake split i split the pcb in to 2 100mm sections becouse it is like a lot cheaper. i have no mony to connect between panels i come up with an idea that is rather guineas or it is going to be the biggest mistake in the entire project i put 5 pads on the sides of each board and i am planing to aline the boards then bridge the gap with solder this should electrically connect the 2 boards and hold them together at least a bit net i finished the net on the main pcb i finished the not on the fins flip just like yesterday i flipped the pcb so that the leds work"}, {"post_id": 31867, "ts": "2026-07-20T16:31:24Z", "hours": 7.3906, "text": "data sheet uh resistors i moved the resistors like 5mm apart because i have plenty of space and it will be like X400 easier so solder i am blind i was testing the led so i can make sure every thing works the led is like really small so i was leaning in so that i can see the pins so i can try and turn it on… so like it is super bright and i burned a little dot in my eye data sheet so when i was testing the led i noticed that you need to power it from the left side and i assumed that it was powered from the right side i was curious as to why i got it backwards because i reference the data sheet like all the time. so apparently the schematic counted clockwise. while everything else on the data sheet is counter-clockwise like look at pg 15 and you can see why i assumed the power went from right to left not left to right https://downloads.cree-led.com/files/ds/h/HB-CLW6A-TKW.pdf the flip so i needed to flip the entire pcb becouse the power is on the wrong side i would have just rotated it around but scene the resistors are specific to the pins that wouldn’t work and the leds would burn out i also learned that you cant mirror footprints on kicad so what i did was set the center of my pcb to (0,0) then went through and switch the sign on every x value on the pcb"}, {"post_id": 31021, "ts": "2026-07-19T02:34:27Z", "hours": 6.3408, "text": "i am making things small small i have decided to find some way to fit everything in to 100 mm pieces the old deign would have costed like $30 idk why but pcb manufacturers really like 100mm x 100mm and each only cost like 1 dollar"}, {"post_id": 30448, "ts": "2026-07-18T00:20:00Z", "hours": 4.9019, "text": "pcb are really time consuming i have found (expetaly if you have never used any kinda pcb editor) bigger trace the traces on my pcb before were a bit to small and there was a good chance they would but each light pulls 20mA witch is 0.02A there is 25 lights and each has 4 light in side because RGBW witch means this could potently run at 2 amps and the 0.2 mm traces can only handle like 0.5A(i forgot but it is a smaller number) so i mad most things bigger lets hope it doesn’t explode"}, {"post_id": 29907, "ts": "2026-07-17T02:32:06Z", "hours": 4.6172, "text": "pcbs are like really expenceve so turns out most pcb manufatuers only sell 5 panels at a time so i shrunk my design down to just 2 so i get 10 in total also all the components arrived from mouser because i assumed it would take waaaay longer for them to ship"}, {"post_id": 29262, "ts": "2026-07-16T02:11:59Z", "hours": 6.4558, "text": "i think i got scamed idk why but like a lot of my time just didnt get logged i am working on it fins are done i put the finishing toutches on the fin lights mainly changing out the mosfets and stuff net so i had no clue what net is and aparently i was sposed to be lableing what everything is sposed to canect to so it can auto check for shorts so i spent like 2 hrs individualy assining a value to all the pads on the pcb panalization i was doing a lot of stuff trying to figure out panzatoin its almost done i think"}, {"post_id": 28654, "ts": "2026-07-15T01:16:48Z", "hours": 10.5153, "text": "so i had to go to my grand parents over the week end so i want able to get much work done but i figured out how to use kicad on my laptop so it was funny in the car while we driving i was working and then kicad crashed before i saved and i had to restart and then after i had done it all a second time i saved and turns out my kicad was out of date so i had to restart all i did was sett up the main pcb that has the 25 lights as seen below the zig zag pattern is because all the lights need to be connected in parallel the really weird pattern in the middle right was because the light was too close to the side so i had to move things and that is that only way i could find that things fit new mosfets i just changed the mosfets for fun idk"}, {"post_id": 26330, "ts": "2026-07-11T01:59:42Z", "hours": 10.4356, "text": "i did a lot of work on the pcb and Um idk i burnt my hand RGBW to i decided i would have 10 per segment and 25 on the core 105 in total witch end up at 8 amps and 1050 lumins resistors i decided to giv every pin its own resistor witch ends up with 420 resistor is need to solder i have never hand solder a smd component this is going to be a learning expireence mostfets i think i was high earlier it is like realy easy to fin smd mosfets i added smd mosfets i have in idea regarding the stand i didnt like the crane becouse it was really bulky and i feel like it wont move how i want it to and i wanted like a standered desk lamp where it can me moved easy but it is too wide for that to work well so what if i take the same mechonisum as the desk arm and just mount it to the wall"}, {"post_id": 24530, "ts": "2026-07-08T04:31:37Z", "hours": 5.7922, "text": "so i have to delete all of the pcb work i had before . i learned that making white light with RGB sucks and causes eye strain and it wont be brite enough RGBW i switched to RGBW leds witch is the same but with a dedicated white led the white light fixes both problems the pure white light wont cause eye strain and they are about 4x brighter then the old ones however it took me like 3 hours to figure out how to add a footprint to my library"}, {"post_id": 23669, "ts": "2026-07-06T19:38:41Z", "hours": 4.6003, "text": "so i managed to not save and lost all my progress again pcb rgb so the rgb have common anode(+) witch means yo just need to power the one pin then short witch color you want to turn on i learned how to us the seconded layer in order to hook all the cathodes(-) together mosfet the plan is to use the mosfets to switch each color on using a arduino idk why i couldn’t find any smd mosfets so i added tht mosfets and put them in backward to i can add a heatsink with out it getting in the way of the light resistors idk man its a resistor its not that exiting"}, {"post_id": 23003, "ts": "2026-07-05T18:22:30Z", "hours": 4.7006, "text": "so uh i worked for a long time then a black out hit and i lost all of it"}, {"post_id": 21865, "ts": "2026-07-04T01:07:06Z", "hours": 4.8339, "text": "i finished the crane for the case matirials i decided to make part of the crane out of pvc pipe because idk i don’t know anything better *changeable i made a simple pole connector to hole the thing on so that the crane can hold any future projects if needed *motor i have been debating whether it is worth it to make it motorized at the moment it is set up to be but idk"}, {"post_id": 20491, "ts": "2026-07-02T02:58:40Z", "hours": 4.2003, "text": "so this is the first time i have ever used kicad there is not a lot to say here i just spent like 4 trying to make a pcb and nothing happend execpt things turned green every so often and idk why"}, {"post_id": 19714, "ts": "2026-07-01T03:18:51Z", "hours": 4.7839, "text": "i worked on the core model servo i made places for the servos to sit in the core *the servos will push and pull the control poles to tilt the segments *poles the poles i printed earlier finished and i though i could get away with just 2 servos but i am going to need 4 other then that is seems to work as expected for now *RGB *ngl i just think it would be funny to add RGB and it could help with very specific tasked i gouess *general so i feel kinda dumb but i realized i could add lights on the bottom of the core too so that is something i am working on now i did a lot of general changes to the design mainly getting rid of unneeded plastic witch makes it look cooler"}, {"post_id": 17315, "ts": "2026-06-28T01:16:37Z", "hours": 9.3347, "text": "so i want to make a desk lamp that works the same way that surgery lamps so there is no shadows constraints: bright: i want to be able to use it to see no shadows: i don’t want shadows alright this is the model so far: it has 8 segments : place to mount a pcb a hole with a pole that lets it swivel a second hole to have a pole that can control it moving in and out(see more farther down) each has 2 brackets that hold the swivel pole to the center control poles like the segments there are 8 of these each of them have a hole and a pole the idea is you thread the pole part thought the hole of another one till it comes all the way around then if one is pusher out it should push all of them out i am currently printing some small versions to see if the concept workes center it is curtly just a block with slits for the brackest i am sure there will be more on it latter"}]...
|
Title: shadow less light by @flyingfish | Stardanc Title: shadow less light by @flyingfish | Stardance
Devlogs:
so i want to make a desk lamp that works the same way that surgery lamps so there is no shadows constraints: bright: i want to be able to use it to see no shadows: i don’t want shadows alright this is the model so far: it has 8 segments : place to mount a pcb a hole with a pole that lets it swivel a second hole to have a pole that can control it moving in and out(see more farther down) each has 2 brackets that hold the swivel pole to the center control poles like the segments there are 8 of these each of them have a hole and a pole the idea is you thread the pole part thought the hole of another one till it comes all the way around then if one is pusher out it should push all of them out i am currently printing some small versions to see if the concept workes center it is curtly just a block with slits for the brackest i am sure there will be more on it latter
i worked on the core model servo i made places for the servos to sit in the core *the servos will push and pull the control poles to tilt the segments *poles the poles i printed earlier finished and i though i could get away with just 2 servos but i am going to need 4 other then that is seems to work as expected for now *RGB *ngl i just think it would be funny to add RGB and it could help with very specific tasked i gouess *general so i feel kinda dumb but i realized i could add lights on the bottom of the core too so that is something i am working on now i did a lot of general changes to the design mainly getting rid of unneeded plastic witch makes it look cooler
so this is the first time i have ever used kicad there is not a lot to say here i just spent like 4 trying to make a pcb and nothing happend execpt things turned green every so often and idk why
i finished the crane for the case matirials i decided to make part of the crane out of pvc pipe because idk i don’t know anything better *changeable i made a simple pole connector to hole the thing on so that the crane can hold any future projects if needed *motor i have been debating whether it is worth it to make it motorized at the moment it is set up to be but idk
so uh i worked for a long time then a black out hit and i lost all of it
so i managed to not save and lost all my progress again pcb rgb so the rgb have common anode(+) witch means yo just need to power the one pin then short witch color you want to turn on i learned how to us the seconded layer in order to hook all the cathodes(-) together mosfet the plan is to use the mosfets to switch each color on using a arduino idk why i couldn’t find any smd mosfets so i added tht mosfets and put them in backward to i can add a heatsink with out it getting in the way of the light resistors idk man its a resistor its not that exiting
so i have to delete all of the pcb work i had before . i learned that making white light with RGB sucks and causes eye strain and it wont be brite enough RGBW i switched to RGBW leds witch is the same but with a dedicated white led the white light fixes both problems the pure white light wont cause eye strain and they are about 4x brighter then the old ones however it took me like 3 hours to figure out how to add a footprint to my library
i did a lot of work on the pcb and Um idk i burnt my hand RGBW to i decided i would have 10 per segment and 25 on the core 105 in total witch end up at 8 amps and 1050 lumins resistors i decided to giv every pin its own resistor witch ends up with 420 resistor is need to solder i have never hand solder a smd component this is going to be a learning expireence mostfets i think i was high earlier it is like realy easy to fin smd mosfets i added smd mosfets i have in idea regarding the stand i didnt like the crane becouse it was really bulky and i feel like it wont move how i want it to and i wanted like a standered desk lamp where it can me moved easy but it is too wide for that to work well so what if i take the same mechonisum as the desk arm and just mount it to the wall
so i had to go to my grand parents over the week end so i want able to get much work done but i figured out how to use kicad on my laptop so it was funny in the car while we driving i was working and then kicad crashed before i saved and i had to restart and then after i had done it all a second time i saved and turns out my kicad was out of date so i had to restart all i did was sett up the main pcb that has the 25 lights as seen below the zig zag pattern is because all the lights need to be connected in parallel the really weird pattern in the middle right was because the light was too close to the side so i had to move things and that is that only way i could find that things fit new mosfets i just changed the mosfets for fun idk
i think i got scamed idk why but like a lot of my time just didnt get logged i am working on it fins are done i put the finishing toutches on the fin lights mainly changing out the mosfets and stuff net so i had no clue what net is and aparently i was sposed to be lableing what everything is sposed to canect to so it can auto check for shorts so i spent like 2 hrs individualy assining a value to all the pads on the pcb panalization i was doing a lot of stuff trying to figure out panzatoin its almost done i think
pcbs are like really expenceve so turns out most pcb manufatuers only sell 5 panels at a time so i shrunk my design down to just 2 so i get 10 in total also all the components arrived from mouser because i assumed it would take waaaay longer for them to ship
pcb are really time consuming i have found (expetaly if you have never used any kinda pcb editor) bigger trace the traces on my pcb before were a bit to small and there was a good chance they would but each light pulls 20mA witch is 0.02A there is 25 lights and each has 4 light in side because RGBW witch means this could potently run at 2 amps and the 0.2 mm traces can only handle like 0.5A(i forgot but it is a smaller number) so i mad most things bigger lets hope it doesn’t explode
i am making things small small i have decided to find some way to fit everything in to 100 mm pieces the old deign would have costed like $30 idk why but pcb manufacturers really like 100mm x 100mm and each only cost like 1 dollar
data sheet uh resistors i moved the resistors like 5mm apart because i have plenty of space and it will be like X400 easier so solder i am blind i was testing the led so i can make sure every thing works the led is like really small so i was leaning in so that i can see the pins so i can try and turn it on… so like it is super bright and i burned a little dot in my eye data sheet so when i was testing the led i noticed that you need to power it from the left side and i assumed that it was powered from the right side i was curious as to why i got it backwards because i reference the data sheet like all the time. so apparently the schematic counted clockwise. while everything else on the data sheet is counter-clockwise like look at pg 15 and you can see why i assumed the power went from right to left not left to right https://downloads.cree-led.com/files/ds/h/HB-CLW6A-TKW.pdf the flip so i needed to flip the entire pcb becouse the power is on the wrong side i would have just rotated it around but scene the resistors are specific to the pins that wouldn’t work and the leds would burn out i also learned that you cant mirror footprints on kicad so what i did was set the center of my pcb to (0,0) then went through and switch the sign on every x value on the pcb
uh i am so tired i did like 6hr of work while fighting to stay awake split i split the pcb in to 2 100mm sections becouse it is like a lot cheaper. i have no mony to connect between panels i come up with an idea that is rather guineas or it is going to be the biggest mistake in the entire project i put 5 pads on the sides of each board and i am planing to aline the boards then bridge the gap with solder this should electrically connect the 2 boards and hold them together at least a bit net i finished the net on the main pcb i finished the not on the fins flip just like yesterday i flipped the pcb so that the leds work
logo i got everything done to get the pcbs orderd Logo i made a logo so i could add it to the silkscreen for some extra style mother board the mother board is basically an Arduino what directly plugs in to 36 outputs so it can control all 9 boards controll to make the controller i have desided it is going to be comprised of 3 componest the indicator a rotary encoder and a switch indicator it is passively a relay small since wrgb controller so i can do a small display type out but it is also nice because i have extra of all the components so this will make them easy to use for other components jlc is goofy so if you have sevral break away bords in one they charge you for all of them witch is like a lot and the work around is if you split all of them in to there own file it only cost like $2 per board so instead of paying $20 for for board i paid $8 for the same amount this is what i split everything in to fin_right fin_left indicator mother_board main_light
so turns out i was not done with the pcbs i redesigned the logo i gave it this outline and added a gear to the light bulb uv i had the idea to add uv light to the light for like idk i will probably never use it but its fun the best use i can think of is curing resen witch is really cool i added them in to the pcb redesign so while adding the uv i realized i didnt use the vertion of the foot print ment for hand a soldering so i made sure to fix that hopfully they are done for real this time
alright i got the pcbs 100% done for real this time UV i fully implemented the UV lights IR i gave the option to attach a it receiver so i can do that in the futor if i want to logo i added the updated logo silkscreen i went through the silkscreen and fixed all there errors check i want through literately every since trace and footprint on these boards to make sure i am actually done designing thease
windows is soo slow i am making this because i have been modeling for 10hr and more then 10hr doesn’t log to star dance will make a longer devlog in a bit
3d modeling and i hate windows i have finish all the 3dmodling i need to do for now and am now just waiting foe the pcbs to ship in the mean tim i wall be here https://stardance.hackclub.com/projects/41354 clips i added clips on the bottom of the outer pieaces they wew to small on the first print so i made them bigger poles i did almost a com pleat overhaul on the poles i made them connect stronger by making them go deeper in logo * i added the loo to everything because it looks cool control i add a control panel it is at the base of the main light and just kinda sits there idea i have a another idea but i am way to tired to add it rn so i am not adding it till later the idea is to have a light conecten to a pole so i can pull it off to like press it up against things rn i also want to add a uv light to it so i can cure things better
it works
so like i think i poisoned my self or somthing i wasnt able to get mech work done i am like on the verge of passing out like constently ill do a lot more tomarow
yooo
i got some new stuff for soldering um and my back hurts sooo bad
i am starting to get the hang of things i lowered my chair and now i dont have insane back pain
i did the big one and every single light acualy works this time my back is in extreme consent pain i am almost don with soldering though my eyes i have been staring in to these lights for like 7 hr
i got the uv lights all soldered up and made another panel i have made 4/8 panels i was going to meanchen how i have posted 3 devlogs today but i just noticed it became tomorrow during my last recording
i just made a a panel i am at 5/8 i am going to try to finish the other 3 today also
i am at 7/9 sooo close
i have finished most of the soldering the rest is just small stuff
i started soldering everything over to the mother board i was able to dim the lights but i broke also its like green idk but most of the fir ware is done
um i have done almost everything besides the case servos were breaking everything so aparently even if you dont use a servo on pin 10 0r 9 the servo lobrary still disables it but i uses those for red and green so i will need to figure that out later all panels and the main board are soldered and wired controlls when you click on the rotary encoder it changes what value you are changeing white - white lights red - red lights green - green lights blue - blue lights yellow - servos (not working) purple - turns on uv on main pannel
100% done with 3d modeling it just takes a long time to proint everything
i have the video on my phone but i dont have wifi rn so you can have this i assembed every thing and starded the covumantation
https://youtu.be/H-r51vnOVfs everything is done i can ship now there wasnt a lot of stuff to say in the midle of development so the devlogs got kinda bad around the middle
Ships:
this is a desk lamp inspired my surgery lights this is my first time ever doing a pcb or smd soldering i learned a ton it was super fun...
|
1793008053.2502232
|
1793094453.2502232
|
|
1327
|
Cirqmon by @itsdecodeaditya | Stardance
|
itsdecodeaditya
|
1
|
85.0
|
1594
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T21:50:13Z", "hours": 85.0, "multiplier": 19.19, "payout": 1594, "blessing": "neutral", "text": "Cirqmon is a quantum computing circuit builder on web and It’s idea was like when I used to go on tools like IBM’s or other quantum circuit simulators they used to feel like so dry and academic, So I thought why don’t I make one that’s colorful, looks like game because I guess learning deep tech should not mean that you lose colors. Earlier I thought I would just build UI layer on top of Qiskit via Python API, then I thought what will I learn and from a quite a long time I wanted to build something that involves maths and physics so i thought I should build whole thing by myself. The whole thing was Actually a bit challenging on understanding how Q spheres or Tensors or how bitwise calculations work, aligning it will a Good UI theme, So I just learned and build. sometimes I thought How will i finish or how will I map that understanding into code But I guess AI as a Teacher helped me a lot. For Others to try it you should know about Quantum Gates, read the Readme once and I guess you will understand the project.", "repo": "https://github.com/decodeaditya/cirqmon/", "demo": "https://cirqmon.vercel.app/"}]...
|
[{"post_id": 71464, "ts": "202 [{"post_id": 71464, "ts": "2026-09-20T21:31:02Z", "hours": 2.8469, "text": "Cirqmon Devlog #12 So I guess it’s final Devlog. Here firstly I updated Readme with new UI based snapshots. Made custom Alert box so it matches the theme instead of browser native alert box. Fixed bug in which earlier the gates were being added in circuit without checking if that Block is being used by other gate and its corresponding qubits. I hope if I don’t get a new problem to fix I will ship it;"}, {"post_id": 71194, "ts": "2026-09-20T12:52:50Z", "hours": 8.1419, "text": "Cirqmon Devlog #11 So Guys, I have finally finalized the Cirqmon Playground UI. I replaced the old glassmorphism theme with a rougher, more irregular visual style. Earlier I got feedback that, the old layout felt cluttered because the quantum gates were spread far apart and Due to Space Background and glassmorphism, it looked like Vibe coded. I have now grouped all the gates together in one place to make the interface cleaner and easier to navigate. Here Is what I changed: Removed the Home button. Clicking the Cirqmon logo now takes gets back to the home page. Updated Playground icons with Animal GIFs to give it more lively and engaging appearance. As mentioned above, reduced the use of glassmorphism to due to flickering issues and implemented like hand drawn solid color based UI. Attaching a video Snapshot so you can see changes made. also, The README is the only major task left. Once that’s finished, I’ll be ready to ship the project!"}, {"post_id": 66582, "ts": "2026-09-12T12:50:46Z", "hours": 8.0617, "text": "Cirqmon Devlog #10 Every time I think My project is ready to ship I find something missing and then it gets delayed. After I finished the blog on Deutsch Jozsa algorithm the project worked, as it needed only Single and Double qubit gate. When I started writing about Grover’s algorithm I realized the need of Three Qubit gate too as it needed CCZ gate to flip the phase to achieve 111 State. So I had to fix that. Here is what I did: Firstly as I told earlier I added the 3 Qubit gate feature, the underlying simulator code is working as old Inflating the Matrix approach, I only had to make it work for 3 Qubit gates. Secondly once I was on huddle where we were discussing about Boba bash, I presented the project to people and some said like ’it looks like too stuffed or some said it looked vibe coded. So I thought its a good feedback to work on. Then I improvised the Homepage so it feels like Apple like minimal theme while maintaining game feel. I also added the Background video instead of static image. Thirdly the blog page was pending so I made blog page with similar theme as I updated along with a option to search among the medium posts. So this was what I updated in this Version and now I needs that code review and matching the theme on Playground too. Just Hope I don’t get stuck this time and wrap it up. Thanks for Reading!"}, {"post_id": 46862, "ts": "2026-08-14T12:20:36Z", "hours": 6.1919, "text": "Cirqmon #Devlog 9 This version is more of testing, I thought that I should write blogs and use examples using Cirqmon, So Written 2 blogs on Quantum computing for Beginners and Deutsch Joza algorithm. While writing it I thought I should Show them on Cirqmon Hompage too, earlier I thought I would replace blogs part in Homepage with Just a medium link of mine, but later when I read on internet that medium allows to see RSS version of Blogs so I parsed RSS to JSON and fetched Blogs related Quantum Computing. Along with it, made Qubits limits to 8 and steps to 24 and made a centralized Config file to control parameters from there. Added a Toggle so People can switch indentation of Qubit states either Big endian or Little Endian. Updated Homepage button with Pikachu Button I found while explore on UI verse, also added link to Readme guide. Now After writing Blogs I am getting surge of confidence inside that I understood Quantum Computing more Better. One of topics I am curious about is Cybersecurity and one of Algorithm that challenges classical Approaches like RSA is Shor’s Algorithm so next I am going to explore it, Also along with all these, I have updated Some images in readme too and going to Push updates, so do Share Feedbacks."}, {"post_id": 43067, "ts": "2026-08-08T04:03:36Z", "hours": 3.9364, "text": "Cirqmon #Devlog 8 Actually I was telling my friend about project, and I realized that the Project should have better readme that tells about features, Examples, and Tour. Also added HSL wheel in Q sphere so People can Use it as a reference. Initially its faded, you hover it and it gets Visible. Also the Latest version is now Live with multi qubit gates."}, {"post_id": 41965, "ts": "2026-08-06T14:25:38Z", "hours": 8.0969, "text": "Cirqmon Devlog #7 So, I am posting this Devlog after interval of Almost 20 days since last Posted. Why delay? During this time I learnt a Lot about Quantum computing. Infact, I was planning to ship the Project with Single qubit gates only, but after I joined Qiskit Global Summer School, then I realised that main game in Quantum computing is about entanglement, that comes with multi Qubit gates like CX, CZ, SWAP etc. The Media attached is Demo is of a GHZ circuit is made by combination of H gate and CNOT gates. Basically a GHZ state is larger version of Bell state. For N qubits, only two possible states shows Up with equal probability i.e 1/root2 (000…n + 111…n). So here is What I made Changes and How : 1) 2 Qubit Gates Implementation - So Earlier Version was for Only 1 Qubit Gates, and it used Tensor product. Where it used to tensor Each step and then Multiply each step to StateVector in successive manner. But for 2 Qubit gates, tensor method gets problematic because multi qubit gates need to have dependence on other qubits too, meanwhile tensor assumes every gate on that step is independent and it builds large matrix. This loses dependence and relation as demanded by multi qubit gates. So then I got to know of approach called Embedding or Inflation where we first create Temporary matrix of 2^n rows and 2^n Columns with each entry initially as 0, then we start looping through columns of that Matrix (which represent possibility, like iteration for 0 is actually 00 in binary) and then, matching it with rows and columns in Gate matrix, after that we force the bit in Temporary Matrix’s respective column and row to align with what Gate’s matrix bit has? Either 0 or 1. Finally we get Result of application in that Temporary matrix which we multiply with StateVector later on. That’s how This Inflation Approach works. 2) Applied Phase angle Indicator Now, Quantum State’s node’s color in Q sphere shows its phase Angle, which can be from PI to -PI, calculated using formula tan2a(y,x) , then we constraint it from 0 to 2PI, later convert to degrees, then feeding that value as HUE value in HSL colour format keeping lightness as 50% and Saturation 100% and then it corresponds to Phase Angle with color that degree, like 0deg is red, 90deg is green etc. So this was Major Changes I did along with some Style changes and Minor error fixing that appeared during changing the Simulator’s Approach. And to be very Honest at when I started to Write code for 2 qubit Gates, I earlier thought I would Do something that I dont have to change Simulator, but those were still just making me cry. So finally I gone to AI to learn and for almost 2 days new experiments were going out of head and that way almost I wasted Hours and then to experiment more and Stop Tracking Hackatime since I knew It would track more hours for Experiments too, So I coded in Cursor (Without Any AI, Just as Other Editor) Untracked. At the End it worked :) Now Finally Majority part is Done, after few More Edits, Will Ship it soon!"}, {"post_id": 28525, "ts": "2026-07-14T20:44:03Z", "hours": 7.3483, "text": "Devlog #6 :) So Hey People, I am feeling Immensely satisfied that Q Sphere feature is Mostly done. Also the GateWiki part is also done that tells You about Gate you Clicked on Gates Tray, again to tell you can drag gates into Circuit to build and Tap to know about it . May be I also link blogs on that Later. Now about Q Sphere Part Okay , Now let me share about Making of Q Sphere Part , So earlier I was not able to visualize it, but somehow I got to Know about Spherical Coordinates which is dependent on: theta : angle of Line from Z Axis phi : angle of Line from x Axis But clicked finally after frustration of not understanding it earlier. Then I gone to Google searching to see 3d visuals and AI to understand how we calculate those angles: So - Based on hamming weights (Means how many 1s in that State, Suppose in |01> has 1 1s and 011 have 2 1s ) and total qubits which help us find theta and divide sphere into sort of rings for similar nodes/lines of same hamming weights in same ring. Then we find how we calculate phi based on total active states in each ring and slicing ring into same proportion. I don’t know why but that was a finally a kick for me :) Finally since you will plot lines and nodes on spherical surface you have to convert theta and phi to coordinates [x, y, z] which you do using polar coordinates . Then after plotting them, a major part of Q sphere is made. now as you can see on 2nd screenshot left side the Sphere shows nodes for respective State. more chances of being 0 is on upper half and more 1 chance on bottom half. Structured the folders Also I worked on code Structure to keep all algos separated: To parse stateVectors Parse the frontend data to json circuit instructions Making all q sphere data from stateVectors parsing Code to export in Qiskit. more such functions too.. So yeah that was work I did, little more things is needed to build, after that project is done. Adding some multi qubit gates is next important thing now. I would be pushing on Github this Version and Vercel too now. Go check it out. Namaste!!!"}, {"post_id": 27203, "ts": "2026-07-12T15:29:23Z", "hours": 8.8928, "text": "Devlog #5 :) To be very honest I forget that its 8 hours 47 minutes in hackatime and it didn’t posted devlog until I got a Notification on slack. Sooo Guys! In this part of work I had to decide a thing that should I add Visualization of Qubits or not and then I realized that’s the whole point of project [to let people easily visualize whats happening]. So thats why I have decided add Q sphere . Folder Structure First of all I realized that my project was using url images and project structure was actually messing up as files and folders were increasing, so I decided to first organise the chaos and downloading all internet 3d assets in project. [Screenshot -1]. Because without a better organization of project it would get intimidatingly hard for others to contribute. Big Endian vs Little Endian Now second part is making the Result page of Qubit execution match that 3d glassmorphism design and white browsing through IBM composer (Tool for making Circuits) I got to observe that states were actually reverse in order. Suppose you applied hadamard gate to first qubit in 2 qubit system so instead of showing Probabilities of states as |00> = 50% , |01> = 0 , |10> = 50% , |11> = 0 , it reversed for 01 and 10. So after reading on internet about this I got to know that both ways are right and just differs because order you calcuate tensors: G1 * G2 * G3.. gives you Big Endian Version which considers least qubit as important Vice versa in case of Little Endian as IBM uses. So I implemented both in project. Earlier I thought I broke a physics Law [haha.] Making Q Sphere Its for Q sphere [2nd screenshot], that’s what help you understand statevector, because we can’t imagine more than 3D, so IBM come with this method. Basically I have used react 3 fiber that helps us write Three.js in react easily, using JSX instead of js manually, and it shows 3 lines in space which represent each state in vector: Bigger the node on top, bigger its probability . Color tells phase angle from origin. More 0 probability the vector will be pointing on upper hemisphere’s top and similarly more 1 will point on bottom of lower hemisphere. I am still processing [x,y,z] coordinates of line. Q sphere now shows random plots, I have to parse state vector to correct representation, will tell you about it in next devlog after I have learnt and implemented this. Screen Restrictions Forth is more of usability, side by side you can see either, code and graph or sphere and graph , so understand better. Also I added a screen restrictor for small screens since running this project on phone won’t be possible because design clutterness (forget to add screenshot, but you can check live). So hope you liked this version, I know it’s too much of quantum but yeah like others I am also trying to understand better. At Last, don’t forget to check attachments and share your feedbacks. Also I think I would be pushing on github now before developing futher. Namaste!!!"}, {"post_id": 26000, "ts": "2026-07-10T15:38:00Z", "hours": 5.5644, "text": "Devlog #4 This Part was all about making Navigation work between pages and since last time I got some feedbacks that Home and Playground VIbe Don’t match so made Playground more 3d. Here are Changes - Using react router, Made Navigation between Home and Playground and Vice versa. Used 3d Resources like Background images, Button images to make it look 3d Videogame. Added button animations like some changes images, some spins. Improved qubit adjust box. Added tooltip component so people know what buttons does what, since buttons are image based. So, I have tried to make project look 3d Glassmorphism and minimal too. check out video attached to see progress till now ."}, {"post_id": 25463, "ts": "2026-07-09T19:03:49Z", "hours": 7.8494, "text": "#Devlog 3 Made Homepage for Cirqmon because I wanted to Put Medium blogs and Tool at one place so this will act as Entry door easily. Experimented with designs, fonts and images to make it feel like 3d Cartoon themed. Following things made - At first “what is does” Hero Section telling people that its a Colorful way to play and learn to make Quantum Circuits. Actually in hero section I have experimented with 3d images animations but it looked distracting UI so Removed it. but Kept H and Y gates to give a idea of Builder. Blogs Section is where it will fetch Quantum related Blogs from Medium (will write soon). Don’t forget to notice that Astronaut. Data is dummy. the Boxes use Backdrop transparent design to match with 3d design. Last is for People who would like to give feedbacks. Buttons are Demo for now. Basically UI for Homepage is Done. Now in next Version WIll use router for Navigation. ALso TBH Gemini really Helped me with Box Shadow button effects which I adjusted according to project Later. Do give Feedbacks please :)"}, {"post_id": 23711, "ts": "2026-07-06T20:20:51Z", "hours": 6.1475, "text": "Its Devlog 2 and in midway didn’t knew That I will be able to go further in project but somehow Curosity pushed it. So I have basically in this Version I made following new Things - Added fundamental Single Qubit Gates and the Moment someone drag Gates into Circuit and it get Translated into circuit Instructions JSON which tracks for which gate is applied at target and step; The moment you click on Playcircuit button it Calculates the probability of Each possible Qubit state and corresponding qiskit code; Basically this part of calculating the Circuit I had options either to use Qiskit directly via Python, Use react pre-written Scripts in react or Reinvent the Wheel by making my own Simulator which might not be as Efficient as Already made ones. So to see how strong my kidneys are I chose 3rd one. But you won’t believe I got answers to all My questions whether Why more qubits means exponential computation time, or tensors and many other things which I will write in blogs in some time. So basically it was about initializing a State vector and then running step by step tensor product of gates applied and then when I got a single wire as a result of all gates in each step, then multiply the state vector with Matrix which contains 2^N rows and columns (n is number of qubits) which finally gives you the amplitudes of each state. FInally you format them to Show. Now it still need better design and More code organization after which I will push new Version; till then You are welcome for Questions and Suggestions. Note - This version handle single qubits till now."}, {"post_id": 17512, "ts": "2026-06-28T10:11:41Z", "hours": 11.5036, "text": "Quite a While I started to learn about quantum Computing and observed that its still gives too research vibes for a beginner to overwhelm and leave it. This is Cirqmon which I am making so Building Quantum circuits become some fun without dumping every information and expecting everyone to be a Researcher. Started with making on React, giving it Cartoon or Animated vibe, earlier I thought to make it Doremon themed but later found that it would give copyright issues. For now features added- 1 ) You can Drag and Drog Quantum gates from Tray into Circuit Canvas. 2 ) Music and Background Manage buttons. 3 ) I have tried to play with Vector and Cartoon Images in Transition. 4 ) Adjust Qubits and Nodes/Steps from Drawer earlier I thought to Use Slider but used Buttons later to Avoid touch screen inconsistencies. While making the Drag and Drop canvas Features, found that using HTML Drag and drop API sometimes break on Safari and other browers and it was still making codebase look complicated for others or even me in future to Contribute. So I used @dnd kit for drag and drop feature. Also I kept a Limit on Qubits and Nodes to Keep Execution Easier and test. Majorly a Structure is Done,"}]...
|
Title: Cirqmon by @itsdecodeaditya | Stardance
De Title: Cirqmon by @itsdecodeaditya | Stardance
Devlogs:
Quite a While I started to learn about quantum Computing and observed that its still gives too research vibes for a beginner to overwhelm and leave it. This is Cirqmon which I am making so Building Quantum circuits become some fun without dumping every information and expecting everyone to be a Researcher. Started with making on React, giving it Cartoon or Animated vibe, earlier I thought to make it Doremon themed but later found that it would give copyright issues. For now features added- 1 ) You can Drag and Drog Quantum gates from Tray into Circuit Canvas. 2 ) Music and Background Manage buttons. 3 ) I have tried to play with Vector and Cartoon Images in Transition. 4 ) Adjust Qubits and Nodes/Steps from Drawer earlier I thought to Use Slider but used Buttons later to Avoid touch screen inconsistencies. While making the Drag and Drop canvas Features, found that using HTML Drag and drop API sometimes break on Safari and other browers and it was still making codebase look complicated for others or even me in future to Contribute. So I used @dnd kit for drag and drop feature. Also I kept a Limit on Qubits and Nodes to Keep Execution Easier and test. Majorly a Structure is Done,
Its Devlog 2 and in midway didn’t knew That I will be able to go further in project but somehow Curosity pushed it. So I have basically in this Version I made following new Things - Added fundamental Single Qubit Gates and the Moment someone drag Gates into Circuit and it get Translated into circuit Instructions JSON which tracks for which gate is applied at target and step; The moment you click on Playcircuit button it Calculates the probability of Each possible Qubit state and corresponding qiskit code; Basically this part of calculating the Circuit I had options either to use Qiskit directly via Python, Use react pre-written Scripts in react or Reinvent the Wheel by making my own Simulator which might not be as Efficient as Already made ones. So to see how strong my kidneys are I chose 3rd one. But you won’t believe I got answers to all My questions whether Why more qubits means exponential computation time, or tensors and many other things which I will write in blogs in some time. So basically it was about initializing a State vector and then running step by step tensor product of gates applied and then when I got a single wire as a result of all gates in each step, then multiply the state vector with Matrix which contains 2^N rows and columns (n is number of qubits) which finally gives you the amplitudes of each state. FInally you format them to Show. Now it still need better design and More code organization after which I will push new Version; till then You are welcome for Questions and Suggestions. Note - This version handle single qubits till now.
#Devlog 3 Made Homepage for Cirqmon because I wanted to Put Medium blogs and Tool at one place so this will act as Entry door easily. Experimented with designs, fonts and images to make it feel like 3d Cartoon themed. Following things made - At first “what is does” Hero Section telling people that its a Colorful way to play and learn to make Quantum Circuits. Actually in hero section I have experimented with 3d images animations but it looked distracting UI so Removed it. but Kept H and Y gates to give a idea of Builder. Blogs Section is where it will fetch Quantum related Blogs from Medium (will write soon). Don’t forget to notice that Astronaut. Data is dummy. the Boxes use Backdrop transparent design to match with 3d design. Last is for People who would like to give feedbacks. Buttons are Demo for now. Basically UI for Homepage is Done. Now in next Version WIll use router for Navigation. ALso TBH Gemini really Helped me with Box Shadow button effects which I adjusted according to project Later. Do give Feedbacks please :)
Devlog #4 This Part was all about making Navigation work between pages and since last time I got some feedbacks that Home and Playground VIbe Don’t match so made Playground more 3d. Here are Changes - Using react router, Made Navigation between Home and Playground and Vice versa. Used 3d Resources like Background images, Button images to make it look 3d Videogame. Added button animations like some changes images, some spins. Improved qubit adjust box. Added tooltip component so people know what buttons does what, since buttons are image based. So, I have tried to make project look 3d Glassmorphism and minimal too. check out video attached to see progress till now .
Devlog #5 :) To be very honest I forget that its 8 hours 47 minutes in hackatime and it didn’t posted devlog until I got a Notification on slack. Sooo Guys! In this part of work I had to decide a thing that should I add Visualization of Qubits or not and then I realized that’s the whole point of project [to let people easily visualize whats happening]. So thats why I have decided add Q sphere . Folder Structure First of all I realized that my project was using url images and project structure was actually messing up as files and folders were increasing, so I decided to first organise the chaos and downloading all internet 3d assets in project. [Screenshot -1]. Because without a better organization of project it would get intimidatingly hard for others to contribute. Big Endian vs Little Endian Now second part is making the Result page of Qubit execution match that 3d glassmorphism design and white browsing through IBM composer (Tool for making Circuits) I got to observe that states were actually reverse in order. Suppose you applied hadamard gate to first qubit in 2 qubit system so instead of showing Probabilities of states as |00> = 50% , |01> = 0 , |10> = 50% , |11> = 0 , it reversed for 01 and 10. So after reading on internet about this I got to know that both ways are right and just differs because order you calcuate tensors: G1 * G2 * G3.. gives you Big Endian Version which considers least qubit as important Vice versa in case of Little Endian as IBM uses. So I implemented both in project. Earlier I thought I broke a physics Law [haha.] Making Q Sphere Its for Q sphere [2nd screenshot], that’s what help you understand statevector, because we can’t imagine more than 3D, so IBM come with this method. Basically I have used react 3 fiber that helps us write Three.js in react easily, using JSX instead of js manually, and it shows 3 lines in space which represent each state in vector: Bigger the node on top, bigger its probability . Color tells phase angle from origin. More 0 probability the vector will be pointing on upper hemisphere’s top and similarly more 1 will point on bottom of lower hemisphere. I am still processing [x,y,z] coordinates of line. Q sphere now shows random plots, I have to parse state vector to correct representation, will tell you about it in next devlog after I have learnt and implemented this. Screen Restrictions Forth is more of usability, side by side you can see either, code and graph or sphere and graph , so understand better. Also I added a screen restrictor for small screens since running this project on phone won’t be possible because design clutterness (forget to add screenshot, but you can check live). So hope you liked this version, I know it’s too much of quantum but yeah like others I am also trying to understand better. At Last, don’t forget to check attachments and share your feedbacks. Also I think I would be pushing on github now before developing futher. Namaste!!!
Devlog #6 :) So Hey People, I am feeling Immensely satisfied that Q Sphere feature is Mostly done. Also the GateWiki part is also done that tells You about Gate you Clicked on Gates Tray, again to tell you can drag gates into Circuit to build and Tap to know about it . May be I also link blogs on that Later. Now about Q Sphere Part Okay , Now let me share about Making of Q Sphere Part , So earlier I was not able to visualize it, but somehow I got to Know about Spherical Coordinates which is dependent on: theta : angle of Line from Z Axis phi : angle of Line from x Axis But clicked finally after frustration of not understanding it earlier. Then I gone to Google searching to see 3d visuals and AI to understand how we calculate those angles: So - Based on hamming weights (Means how many 1s in that State, Suppose in |01> has 1 1s and 011 have 2 1s ) and total qubits which help us find theta and divide sphere into sort of rings for similar nodes/lines of same hamming weights in same ring. Then we find how we calculate phi based on total active states in each ring and slicing ring into same proportion. I don’t know why but that was a finally a kick for me :) Finally since you will plot lines and nodes on spherical surface you have to convert theta and phi to coordinates [x, y, z] which you do using polar coordinates . Then after plotting them, a major part of Q sphere is made. now as you can see on 2nd screenshot left side the Sphere shows nodes for respective State. more chances of being 0 is on upper half and more 1 chance on bottom half. Structured the folders Also I worked on code Structure to keep all algos separated: To parse stateVectors Parse the frontend data to json circuit instructions Making all q sphere data from stateVectors parsing Code to export in Qiskit. more such functions too.. So yeah that was work I did, little more things is needed to build, after that project is done. Adding some multi qubit gates is next important thing now. I would be pushing on Github this Version and Vercel too now. Go check it out. Namaste!!!
Cirqmon Devlog #7 So, I am posting this Devlog after interval of Almost 20 days since last Posted. Why delay? During this time I learnt a Lot about Quantum computing. Infact, I was planning to ship the Project with Single qubit gates only, but after I joined Qiskit Global Summer School, then I realised that main game in Quantum computing is about entanglement, that comes with multi Qubit gates like CX, CZ, SWAP etc. The Media attached is Demo is of a GHZ circuit is made by combination of H gate and CNOT gates. Basically a GHZ state is larger version of Bell state. For N qubits, only two possible states shows Up with equal probability i.e 1/root2 (000…n + 111…n). So here is What I made Changes and How : 1) 2 Qubit Gates Implementation - So Earlier Version was for Only 1 Qubit Gates, and it used Tensor product. Where it used to tensor Each step and then Multiply each step to StateVector in successive manner. But for 2 Qubit gates, tensor method gets problematic because multi qubit gates need to have dependence on other qubits too, meanwhile tensor assumes every gate on that step is independent and it builds large matrix. This loses dependence and relation as demanded by multi qubit gates. So then I got to know of approach called Embedding or Inflation where we first create Temporary matrix of 2^n rows and 2^n Columns with each entry initially as 0, then we start looping through columns of that Matrix (which represent possibility, like iteration for 0 is actually 00 in binary) and then, matching it with rows and columns in Gate matrix, after that we force the bit in Temporary Matrix’s respective column and row to align with what Gate’s matrix bit has? Either 0 or 1. Finally we get Result of application in that Temporary matrix which we multiply with StateVector later on. That’s how This Inflation Approach works. 2) Applied Phase angle Indicator Now, Quantum State’s node’s color in Q sphere shows its phase Angle, which can be from PI to -PI, calculated using formula tan2a(y,x) , then we constraint it from 0 to 2PI, later convert to degrees, then feeding that value as HUE value in HSL colour format keeping lightness as 50% and Saturation 100% and then it corresponds to Phase Angle with color that degree, like 0deg is red, 90deg is green etc. So this was Major Changes I did along with some Style changes and Minor error fixing that appeared during changing the Simulator’s Approach. And to be very Honest at when I started to Write code for 2 qubit Gates, I earlier thought I would Do something that I dont have to change Simulator, but those were still just making me cry. So finally I gone to AI to learn and for almost 2 days new experiments were going out of head and that way almost I wasted Hours and then to experiment more and Stop Tracking Hackatime since I knew It would track more hours for Experiments too, So I coded in Cursor (Without Any AI, Just as Other Editor) Untracked. At the End it worked :) Now Finally Majority part is Done, after few More Edits, Will Ship it soon!
Cirqmon #Devlog 8 Actually I was telling my friend about project, and I realized that the Project should have better readme that tells about features, Examples, and Tour. Also added HSL wheel in Q sphere so People can Use it as a reference. Initially its faded, you hover it and it gets Visible. Also the Latest version is now Live with multi qubit gates.
Cirqmon #Devlog 9 This version is more of testing, I thought that I should write blogs and use examples using Cirqmon, So Written 2 blogs on Quantum computing for Beginners and Deutsch Joza algorithm. While writing it I thought I should Show them on Cirqmon Hompage too, earlier I thought I would replace blogs part in Homepage with Just a medium link of mine, but later when I read on internet that medium allows to see RSS version of Blogs so I parsed RSS to JSON and fetched Blogs related Quantum Computing. Along with it, made Qubits limits to 8 and steps to 24 and made a centralized Config file to control parameters from there. Added a Toggle so People can switch indentation of Qubit states either Big endian or Little Endian. Updated Homepage button with Pikachu Button I found while explore on UI verse, also added link to Readme guide. Now After writing Blogs I am getting surge of confidence inside that I understood Quantum Computing more Better. One of topics I am curious about is Cybersecurity and one of Algorithm that challenges classical Approaches like RSA is Shor’s Algorithm so next I am going to explore it, Also along with all these, I have updated Some images in readme too and going to Push updates, so do Share Feedbacks.
Cirqmon Devlog #10 Every time I think My project is ready to ship I find something missing and then it gets delayed. After I finished the blog on Deutsch Jozsa algorithm the project worked, as it needed only Single and Double qubit gate. When I started writing about Grover’s algorithm I realized the need of Three Qubit gate too as it needed CCZ gate to flip the phase to achieve 111 State. So I had to fix that. Here is what I did: Firstly as I told earlier I added the 3 Qubit gate feature, the underlying simulator code is working as old Inflating the Matrix approach, I only had to make it work for 3 Qubit gates. Secondly once I was on huddle where we were discussing about Boba bash, I presented the project to people and some said like ’it looks like too stuffed or some said it looked vibe coded. So I thought its a good feedback to work on. Then I improvised the Homepage so it feels like Apple like minimal theme while maintaining game feel. I also added the Background video instead of static image. Thirdly the blog page was pending so I made blog page with similar theme as I updated along with a option to search among the medium posts. So this was what I updated in this Version and now I needs that code review and matching the theme on Playground too. Just Hope I don’t get stuck this time and wrap it up. Thanks for Reading!
Cirqmon Devlog #11 So Guys, I have finally finalized the Cirqmon Playground UI. I replaced the old glassmorphism theme with a rougher, more irregular visual style. Earlier I got feedback that, the old layout felt cluttered because the quantum gates were spread far apart and Due to Space Background and glassmorphism, it looked like Vibe coded. I have now grouped all the gates together in one place to make the interface cleaner and easier to navigate. Here Is what I changed: Removed the Home button. Clicking the Cirqmon logo now takes gets back to the home page. Updated Playground icons with Animal GIFs to give it more lively and engaging appearance. As mentioned above, reduced the use of glassmorphism to due to flickering issues and implemented like hand drawn solid color based UI. Attaching a video Snapshot so you can see changes made. also, The README is the only major task left. Once that’s finished, I’ll be ready to ship the project!
Cirqmon Devlog #12 So I guess it’s final Devlog. Here firstly I updated Readme with new UI based snapshots. Made custom Alert box so it matches the theme instead of browser native alert box. Fixed bug in which earlier the gates were being added in circuit without checking if that Block is being used by other gate and its corresponding qubits. I hope if I don’t get a new problem to fix I will ship it;
Ships:
Cirqmon is a quantum computing circuit builder on web and It’s idea was like when I used to go on tools like IBM’s or other quantum circuit simulators they used to feel like so dry and academic, So I thought why don’t I make one that’s colorful, looks like game because I guess learning deep tech should not mean that you lose colors. Earlier I thought I would just build UI layer on top of Qiskit via Python API, then I thought what will I learn and from a quite a long time I wanted to build something that involves maths and physics so i thought I should build whole thing by myself. The whole thing was Actually a bit challenging on understanding how Q spheres or Tensors or how bitwise calculations work, aligning it will a Good UI theme, So I just learned and build. sometimes I thought How will i finish or how will I map that understanding into code But I guess AI as a Teacher helped me a lot. For Others to try it you should know about Quantum Gates, read the Readme once and I guess you will understand the project....
|
1793004488.4733472
|
1793090888.4733472
|
|
7165
|
Eve by @Light | Stardance
|
Light
|
1
|
294.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T20:53:22Z", "hours": 294.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Eve is a graphics engine written entirely in Vulkan , with the primary goal of learning Vulkan and C++ while simplifying their usage. Originally conceived as a simple, lightweight wrapper around Vulkan , Eve now includes: A Render Graph designed from scratch that leverages technologies such as memory aliasing (where multiple resources share the same memory space) and resource pooling (reusing resources across frames). It performs the core function of a Render Graph: by simply knowing how resources are utilized, it automatically issues the necessary synchronization barriers to the GPU. Developing the Render Graph was a grueling process, but it proved worthwhile in terms of both performance and the educational value of the experience. An ECS (Entity Component System) also designed from scratch, following the model of Unity’s DOTS ECS . Instead of scattering resources across VRAM—which slows down access due to constant memory jumps—game objects are organized into Archetypes. Components are distributed in contiguous memory batches, thereby minimizing cache misses. A rendering system that automates the insertion of transforms into buffers; these are subsequently processed into matrices via a compute shader and sent to the rendering shaders. It also features a material system that analyzes shader composition, looking for a struct named “Properties” that allows fields to be assigned by name from the C++ side. Support for the Slang shading language with a bindless system . Eve provides a file named Eve.slangh that simplifies and automates the retrieval of textures, buffers, and samplers from descriptors. Compute shader support is also included. An integrated, easy-to-use Input system inspired by Unity’s Input System , along with a lightweight UI wrapper that makes using Dear ImGui simpler and more intuitive. Eve also includes a demo featuring a gravitational simulation of thousands of entities orbiting a black hole, allowing various parameters to be adjusted in real-time.", "repo": "https://github.com/SonoUnBot09/Eve", "demo": "https://github.com/SonoUnBot09/Eve/releases/tag/v1.0.0"}]...
|
[{"post_id": 71422, "ts": "202 [{"post_id": 71422, "ts": "2026-09-20T19:52:09Z", "hours": 8.8461, "text": "DEVLOG 36 - Black Hole! Hi Stardance! Intro I’ve been working really hard lately, and I think I’ve reached a milestone with Eve that I honestly never expected to hit. The project is finally complete; now I just need to click that nice button to ship it. I’ve spent this time working on the README, improving the documentation, fixing bugs, and building a demo using Eve. Eve Demo The demo is a gravity simulation featuring hundreds of thousands of entities orbiting a black hole. You can tweak various parameters—such as time, the black hole’s gravitational pull, lighting, colors, meshes, and much more. If you’d like to test it out, you can find it in the GitHub releases; there’s a ready-to-use .exe, or the source code if you’re on Linux—or if you simply want to understand how Eve works or make some modifications yourself. Problems Encountered While building the demo, I ran into—and have since resolved—some very frustrating bugs, such as memory corruption in the ECS caused by the continuous creation and destruction of entities and their components. I also added UI text support and implemented the ability to register “stages” belonging to classes or structs that can be called by the engine."}, {"post_id": 70544, "ts": "2026-09-19T10:27:28Z", "hours": 8.0992, "text": "DEVLOG 35 - Documentation Hi Stardance! Intro I’ve finally finished writing the documentation for Eve—a rather tedious and repetitive process, but a necessary one. How The Docs Is Structured: Every part of the engine is documented; inside the docs folder, you’ll find instructions on how to launch the engine, along with subfolders for each component—graphics, input, window management, and so on. Next Last Steps: I still need to create the README and tidy up a few things in the project, as well as write instructions on how to configure Eve for use on one’s own PC… But after a whole summer, I’m finally close to shipping!"}, {"post_id": 69366, "ts": "2026-09-16T22:11:41Z", "hours": 2.8144, "text": "DEVLOG 34 - Icon, Windows & More Hi Stardance! Intro The release is getting close, so I’m tidying up a few final details; I’ve finally turned my attention to a slightly more relaxed and lighthearted part of the project. Engine Settings I added a method to start the engine that accepts configuration settings for how the app runs. You can also choose whether or not to enable VSync at runtime. Window Class I added a window management class that allows for various operations, such as toggling fullscreen mode and manually changing the resolution, position, title, etc. I also included a method to set the window icon using a PNG image. Eve’s Icon I also spent some time on Canva trying to create an icon—a logo—for Eve. After several attempts, I settled on the one in the attachment."}, {"post_id": 68288, "ts": "2026-09-14T21:13:02Z", "hours": 4.0392, "text": "DEVLOG 33 - Meshes & Fixes Hi Stardance! Intro We’re getting closer to the release build of Eve! I have to say that with this devlog, the engine is practically finished and ready for shipping; I just need to tweak a few final details and we’re all set… Meshes: In this devlog, I worked on the mesh system—fleshing it out and making it functional—and added standard meshes to Eve: a cube, a UV sphere, an icosphere, a plane, and a quad. Some Bugs Fixed While implementing this, the program kept crashing for no apparent reason; after two hours of debugging, I found the error in the Render Graph—caused by the order of Eve’s internal passes—which is now fixed. Internal Shaders Organization I also embedded the engine’s internal shaders directly into the executable, so there’s no need to remember to include them alongside the executable when creating an app. The video shows the same UI as the previous devlog—featuring controls for color, rotation, cube position, and direct light direction—but this time, you can change the meshes of the “thousand-odd” cubes at runtime using the standard Eve meshes listed above, via a simple UI dropdown menu."}, {"post_id": 67640, "ts": "2026-09-13T19:52:38Z", "hours": 7.8861, "text": "DEVLOG 32 - UI Support Hi Stardance, Intro I’ve been working on the UI lately, as I wanted to give the user a way to interact with the engine beyond just mouse and keyboard input. The UI in Eve I opted for Dear ImGui and created a lightweight wrapper that allows it to run within Eve. I stripped away some of the boilerplate code associated with the standard Begin and End calls, making it slightly simpler and safer to use than raw ImGui. I also added support for dockable windows. The video shows a scene with 1,000 cubes; thanks to the UI, you can modify their color, position, and rotation. You can also change the direction of the direct light. The code required by this UI is just five lines."}, {"post_id": 65309, "ts": "2026-09-10T11:36:28Z", "hours": 0.2975, "text": "DEVLOG 31 - It’s not my fault! Hi Stardance! Unlike the other devlogs, this one is very quick and simple. A Little Recap In devlog 29, I encountered some issues with RenderDoc, even though the app kept running fine and caused no problems outside of RenderDoc itself. What I Did After doing some online research, I discovered that RenderDoc has issues with AMD drivers, which can cause the app to crash. So, I decided to try AMD’s Radeon Developer Tools (a profiler similar to RenderDoc, designed specifically for AMD GPUs). No errors were reported and everything works perfectly, so the problem most likely lies in how AMD drivers interface with RenderDoc."}, {"post_id": 64811, "ts": "2026-09-09T14:20:04Z", "hours": 5.6439, "text": "DEVLOG 30 - Compute Shaders Hi Stardance! Intro I’ve finally implemented compute shaders—as the title suggests—alongside conducting some tests and reorganizing the project. Compute Shader Support I’ve added support for compute shaders, meaning they can now be used just like any other type of pass, whether graphics or transfer. Optimizations I’ve also utilized compute shaders internally within the engine to speed up matrix calculations; here are the results: With 100,000 entities using instanced rendering, I’m getting 800 FPS, up from the previous 250. With 1,000,000 entities using instanced rendering, I’m getting around 90 FPS, up from the previous 30. With 100,000 entities using independent draw calls, I’m getting around 90 FPS, up from the previous 30. I’d say the results speak for themselves, and I’m quite happy with these optimizations. As mentioned in the previous devlog, testing was performed on my PC, which is equipped with a Ryzen 5 5600X and an RX 6600. Swapchain & CMake I also made slight modifications to the swapchain recreation code to make it faster and reduce stuttering. Finally, I tidied up the CMakeLists file to make it more organized and prepare for the release. The video shows a scene with 1M entities rendered in real-time using instanced draw call at 90 FPS"}, {"post_id": 63615, "ts": "2026-09-07T15:19:57Z", "hours": 8.0778, "text": "DEVLOG 29 - 1M Entities! Hi Stardance! Intro Since the last day, I’ve been working alone and have run into several issues… Most of them have been resolved. Some Tests So I started running some tests to check the speed of my new rendering system, and with 100,000 entities drawn to the screen with a single draw call, I was getting 30 FPS. After parallelizing the code a bit and reducing the copies, the results are now better: 100,000 entities with single draw calls get 50-60 FPS. 100,000 entities with a single instanced draw call get 230-250 FPS. 1,000,000 entities with a single instanced draw call get 30 FPS. What Need To Be Optimized Actually, I could optimize even more and double these FPS, but the current problem is that I’m calculating the matrices on the CPU side, so I’m doing a lot of calculations that currently take up a good portion of the necessary CPU time, about 50%. The idea would be to move all the work to the GPU in the future with compute shaders, thus significantly reducing the CPU load. I’ll see if I can do this… Maybe in a while, when I add full support for compute shaders. (I have a Ryzen 5 5600 X and an RX 6600) Rendering System Time: Not counting the matrices, the rendering cycle along with the Render Graph takes about 2-2.5 ms, almost all of which is spent on the Render Graph. I have also fixed some problems with Swapchain Recreation when the window is minimized. Problems With RenderDoc Five of these eight hours have been pure frustration, as I don’t understand why, but the app crashes on RenderDoc. Normally, on my PC it starts and works, but on RenderDoc it crashes… I’ve tried every way to understand the problem, but unfortunately I haven’t been able to. I’ll also test on other PCs to better understand the problem. Unfortunately, I don’t have time on my side, so I’ve had to put the issue aside for now…"}, {"post_id": 61817, "ts": "2026-09-04T22:10:27Z", "hours": 10.2261, "text": "DEVLOG 28 - New Render System Hi Stardance! Intro I think this devlog is consistent with the next one I’m working on, since the work I’ve done in the last few hours isn’t quite finished, as there are still some bugs to resolve… Why a new render system? So far, I’ve been working on improving Eve’s rendering system. Instead of having to manually create buffers and the like, Eve has a completely automated system similar to the one used by Unity. For example, when you try to draw an object, you need things like object transformation matrices. If you then need more data, the limited size of push constants is no longer enough. Per Instance Params Eve, therefore, with its new rendering system, revolutionizes the way we write code, reduces bugs, and simplifies it. For each draw call sent to the GPU, the engine sends a buffer called InstanceParams to the GPU, which contains, for each drawing instance, its model matrix and its inverse. These matrices can then be retrieved using simple, custom functions ready for use in the shader. Per Render View Data For camera data, the process is similar. For each RenderView object, Eve allocates these objects on the GPU in a contiguous buffer from which the view, perspective, VP, and other matrices can be accessed. Custom Draw Info Data If you want to send custom data to the shader, each drawing function offers a pointer called DrawInfo that allows you to send data to the shader, which can then be accessed. If set to null, the shader will not send anything. GLM & A Flycam I also created a flycam and deprecated the Eve math package to use the glm one. Honestly, I want to focus on Eve and not the math, which is why I chose this option. Next Step: I still have some bugs to fix regarding making more than one draw call, but I’m working on it."}, {"post_id": 59920, "ts": "2026-09-01T23:02:30Z", "hours": 7.4931, "text": "DEVLOG 27 - Material System Intro After some code rewrites, such as the separation between shaders and materials, the materials system now works. It’s very similar to how it works in Unity. I’ve figured out how to set things like material properties (floats, integers, vectors, etc.) directly from C++ using their names, without manually binding code. How Vulkan Handle All Of This? In Vulkan, you can’t set a shader parameter directly with a name. You need to create a buffer on the GPU, specifically a UBO, typically used for materials, bind it using a descriptor, and then bind it on the CPU. All of this is hidden by Eve, making the code easier and faster to write. What It Does? Basically, once the shader is compiled, it’s analyzed and checked for a struct called Properties. If it exists, this struct will be used for the material properties. Each field within it will be settable directly from the CPU using its name. Eve, now knowing the size of the struct and the field offsets, creates a buffer for the materials (actually, one for each frame in flight) and uses it to write everything a material might need, thus allowing for very simple parameter setting. How To Use It: The material provides an ID via the GetPropertyUBOId function, which must always be retrieved at each frame since it is not the same from frame to frame. This ID can be sent to the shader via push constant, which then allows access to the material’s property UBO, which contains all the values set on the CPU side. A simple cube rotating on itself using the new Material System and simple direct lighting"}, {"post_id": 58517, "ts": "2026-08-30T23:07:29Z", "hours": 4.8986, "text": "DEVLOG 26 - Input System Hi Stardance! The New Input System Since I couldn’t interact much with the graphics engine at the moment, I chose to create an Input System that currently only supports keyboard and mouse. It has methods like IsKeyDown(...) , GetMouseState(...) , IsMouseUp(...) , and similar ones. It’s quite simple, but it allows you to interact with the world, for example by creating a camera or a moving player. The Cube For fun and to test a bit, I tried creating a scene with a slightly rotated cube with direct light, obviously using my Render Graph, which allows you to do all this in about 150 lines of code (CPU side) instead of having to manually write barriers, configure passes, and many other repetitive tasks. I’m still using glm for matrix math, but I’m trying to reach a more stable level with the Eve package."}, {"post_id": 57455, "ts": "2026-08-29T16:33:40Z", "hours": 7.1736, "text": "DEVLOG 25 - Eve is “Multi PC” Hi everyone! What’s changed since last time? More Device Supported As promised, Eve now uses Vulkan 1.2, so it can be used on multiple devices. Obviously, the device requires that, in addition to supporting Vulkan 1.2, it also supports some extensions that became core in Vulkan 1.3. Tests On Other PCs I then tried running the app on the only PC I had at home, but it crashed. I then tried updating the graphics driver, but that didn’t help; unfortunately, that PC is too old. I then asked a friend of mine to test the app. After fixing some issues, it started, but it would crash instantly. After hours of debugging, I found the problem: the problem was in resource allocation within the Render Graph, which only occurred with integrated GPUs (my heap selection algorithm for integrated GPUs was wrong). It’s now fixed. I also added my checks for failed Vulkan or VMA calls in places where they were missing, so now everything should work properly. Math Packet In Eve I also added a small mathematical component to Eve, including Vector2,3,4 ; Vector2Int,3Int,4Int ; Quaternion ; and Matrix4x4 . I must say that quaternions were difficult to understand at first, but once you understand how they work, it’s very easy to visualize them in your head. The first attachment shows Eve running on the PC of this friend of mine, whom I thank so much for his help, and the second image shows Eve running on my PC."}, {"post_id": 55554, "ts": "2026-08-27T14:10:22Z", "hours": 4.5942, "text": "DEVLOG 24 - Error Manager, Copies & More Intro Hi Stardance! Lately, I’ve been focusing mainly on improving error handling returned by Vulkan and fixing some code here and there. New Error Manager System I’ve created a system responsible for error handling so that when an error occurs, such as a failure to allocate memory due to fragmentation or any other critical error, the app places a text file with information about the error in a folder called logs (created on the fly if it doesn’t exist). Immediately afterward, an error message is displayed on the screen explaining what happened. When the user presses the OK button, the app closes in the pop-up by calling std::abort(); . Some Test On Other PCs I tried running Eve outside of my PC on two other PCs, but since they’re a bit older, they don’t have support for Vulkan 1.4, so the app can’t be started. Swapchain Improvements The code for creating the swapchain has been improved somewhat, making it more secure and robust. New Copy Support I’ve added support for buffer and texture copy operations between resources that aren’t the same type (one transient and one persistent). Next Step: I want to make Eve a little more portable, so in the next few hours I’ll try using Vulkan 1.2, trying not to mess with the code. If necessary, I might resort to using Vulkan 1.3; I’ll see…"}, {"post_id": 54816, "ts": "2026-08-25T23:26:03Z", "hours": 3.9353, "text": "DEVLOG 23 - Instanced Draw & Some Fixes Intro Devlog time!! In the last devlog, I had some issues with instanced drawing and reading a position buffer. What Was The Problem? I worked hard, but I managed to figure out where the problem was and fix it. (The problem was due to a for loop responsible for creating the address buffers. I was saving pointers outside the for loop with structs allocated inside the for loop; therefore, the pointers were pointing to corrupted memory or nothing.) Render Graph Fixes I fixed several things in the Render Graph that could cause future problems. I added small guards within the Render Graph so that if the user does something wrong, the application doesn’t crash unexpectedly. For example, previously, if the user set a texture to display that they’d never used (never involved in a transfer operation, never used as a graphic attachment), the program would crash. With these simple guards, everything is solved. Easier Resource Usage Declaration I’ve also added the ability to easily declare textures and buffers usage in the Graphics Pass class with dedicated methods like UseBufferReadOnlyVertex(...) , UseTextureVertex(...) , and others. The image shows a grid of 20x20 quad meshes drawn with a single draw call instead of 400 using instanced draw."}, {"post_id": 54096, "ts": "2026-08-24T21:43:20Z", "hours": 10.5117, "text": "DEVLOG 22 - ECS Bugs Fixed, Graphics Files Reorganized Hi Stardance! What I Did In this dev log, I fixed some of the last bugs the ECS code, so it now works and is very efficient. I ran several tests destroying, creating, and moving entities from one archtype to another, and everything works. I then worked on the project structure of the graphics part by fixing the graphics include files. What Went Wrong These updates mentioned so far have been successful. Two hours ago, I added a method in the graphics pass responsible for instanced drawing, so I took advantage of the opportunity to create a buffer to read the instance positions to see if it worked. I still don’t know why, but it doesn’t work. The application freezes, and sometimes the driver crashes (it scared me a little… :/ ). The Validation Layers don’t report anything wrong… So I need to figure out what’s wrong and fix it. The image shows some of the methods available after fixing the folders. The methods are in the Graphics class in the include folder."}, {"post_id": 51727, "ts": "2026-08-21T15:40:39Z", "hours": 10.1514, "text": "DEVLOG 21 - ECS Refactoring Intro Over the past ten hours, I’ve worked extensively on the ECS , making it more robust, easier to use, more secure, and more efficient. What’s changed: New Way To Record Entity Commands Entity Command Pools are still used, but they’re managed not by the user but by the Entity Manager. The old CreateCommandPool() method no longer exists. Now, to execute a command on entities, you make a request to the EntityManager , which takes the command and places it in an EntityCommandPool of its choosing. The EntityCommandPool is chosen based on the SystemId provided by the engine with methods like Start, Awake, Update, etc. This reduces complexity and allows for systems that can run natively in parallel on multiple threads. Improved Efficiency Internally, the Entity Manager has improved the way to compact batches after command execution, making it simpler and faster. Instead, iterating over all batches only iterates on the entities that are no longer valid, and those slots are refilled with the components of the valid entities at the end of the last batches. Batch creation and destruction is handled automatically by the EntityManager . New Way To Query Tables The way to find tables with certain requirements has improved; the old method required registering a query and then returning a “ticket” used to access the query results. The operation is now simpler and more unified: The EntityManager is asked for all tables that meet the QueryInfo structure requirements, such as the archtype. The EntityManager checks whether the query already exists; if it doesn’t, it calculates it on the fly and returns it. Queries Updated Only When Needed Queries are updated only when tables are created/destroyed; otherwise, they remain - static and aren’t updated, saving calculations . The next step will be to verify if everything works, since I haven’t tested anything yet because I’m forced to do this devlog due to the ten-hour time limit. :/ Sorry about the picture, it’s the same, I didn’t have time to do anything else"}, {"post_id": 48967, "ts": "2026-08-17T15:28:34Z", "hours": 5.8128, "text": "DEVLOG 20 - A Better Triangle Intro Hi Stardance! This triangle was created with Render Graph . The entire process is divided into two steps: the first draws the triangle on a user-selected image, and the second takes that image, samples it, and draws it on the swapchain so the triangle can be seen on screen. Clean and Simple API The beauty of this is evident in the photo (third attachment). You only need to write a few lines of code to achieve all this compared to the complexity and number of lines of code required by Vulkan. Render Graph thus creates all the resources needed for synchronization, such as barriers , and attempts to alias memory whenever possible. It also leverages Resource Pooling , so images aren’t destroyed and recreated at every frame. Instead, if they have identical requirements, they are reused, avoiding unnecessary Vulkan calls. MSAA Deprecated MSAA images have been deprecated because, from a desktop computer perspective, they aren’t worth using because they require a lot of computational resources. To achieve anti-aliasing, it’s best to use post-processing passes that use FXAA (Fast Approximate Anti-Aliasing) or TAA (Temporal Anti-Aliasing). There are probably some bugs still present in the Render Graph despite the many already fixed; I’ll work on them."}, {"post_id": 47136, "ts": "2026-08-14T20:10:25Z", "hours": 9.8778, "text": "DEVLOG 19 - Colors! Hi Stardance! I’ve made some progress and finally drew something on the screen! Improvements on the Swapchain Pass I’ve improved the Render Graph a bit by cleaning up old methods and making all the improvements discussed in the last devlog, such as improving the rendering code for the swapchain. Normally, you would set the 2D texture to display on the screen using the RenderGraph::SetPresentTexture(); In reality, this texture isn’t displayed directly on the screen but is first sampled and copied to the swapchain, so the Render Graph adds a hidden pass for this. When this texture hasn’t been assigned to any texture, the swapchain will be colored with the clear value set to black and sent to the screen. Push Constants Supported I’ve added the ability to use Vulkan Push Constants. Push Constants are data packets that can be sent to the GPU in parallel with the drawing command. Their size is very limited, 128 bytes, but their transfer speed is extremely fast. A hardware limitation is that the offset and size parameters must be multiples of four, so I used a struct called Words32 to dictate the 32-bit size and offset, not the 8-bit one. Furthermore, internally, the engine checks the state of the previous push constant for each push constant update, so as not to make unnecessary updates and to register the push constant command only when necessary, and only partially for the relevant bytes. Shaders Improvements I improved the shader code a bit by reducing the arguments needed to create a shader, and I also unified the layout; all shaders use the same VkPipelineLayout . The Problem and The Solution When I was writing the shaders to get these things on screen, I ran into errors telling me I was assigning a buffer descriptor to Descriptor Set 0 with binding 0, even though they’re actually textures. However, in the shader, I wasn’t requesting any of this, since the vertex data was written directly into the shader. After some research, I discovered that Slang shaders were creating bindings for these arrays outside the shader. To fix this, I simply moved the arrays into the vertex shader function, marking them with const. And note that all these images/videos use the swapchain pass, so this was all just a test. Now I’ll have to try declaring a real pass with Render Graph and try to draw something, hoping everything works correctly :/"}, {"post_id": 44624, "ts": "2026-08-10T14:56:52Z", "hours": 10.0239, "text": "DEVLOG 18 - More Refactoring Hi Stardance! I don’t know what to say about this devlog, since I’ve written a lot of code for my specific implementation… I’ll try to describe what I did without being too boring. Why I refactored again? As discussed in the previous devlog, I felt the code wasn’t “nice” or at least not very tidy, and honestly, I don’t like that very much, so I rewrote the Render Graph (partially) for the third time. Now, the Render Graph only manages single-frame resources, while all multi-frame resources are managed by a separate class called TransientResourcePool, which is therefore responsible for storing the resources. The Render Graph: A single frame responsibility The Render Graph is still responsible for memory aliasing and resource pooling, of course, as well as generating barriers and inserting the draw, copy, and, in the future, compute commands. (I still need to improve the code for compiling commands into the Command Buffers a bit.) Improvement in the searching of pooled resources Now, searching for resources to reuse is even faster, since resources are divided by their composition, for example. For textures, the parameters for this division are height, depth, width, samples, etc. This allows you to immediately find a resource if it’s available. More organization is the TransientResourcePool The TransientResourcePool is also responsible for permanently destroying unused resources for several frames. I had written the destruction code within the TransientResourcePool, but I thought maybe it wasn’t its responsibility, but rather an existing class called MemoryBin. The MemoryBin class was configured to work only for persistent resources, but now it handles the destruction of persistent and transient resources. What I need to fix: There’s a small problem in the code: Normally, when you want to destroy a resource, it’s queued and usually assigned a countdown. This countdown is a number that corresponds to the maximum frames in flight and decreases by one every frame. When this number reaches zero, the resource can be destroyed. This works perfectly, but when, for example, the swapchain needs to be recreated because the window size has changed, the GPU needs to be put into idle mode. This means that all in-flight frames have finished, and therefore all resources queued for destruction can and must be destroyed immediately, otherwise they would pile up. Otherwise, I think everything is perfect. I don’t think it will take me long to implement these little tricks, so I assume and hope :/ to start writing the code to display something on the screen soon. I’ll go back to my old, dear little triangle :)"}, {"post_id": 41971, "ts": "2026-08-06T14:41:01Z", "hours": 11.1292, "text": "DEVLOG 17 - Meshes & New Architecture Into See you again, Stardance. I’ve been implementing several things lately, as the title suggests, and I think we might soon have some geometry on the screen. Mesh System I’ve been working on meshes, creating everything needed to support mesh creation, editing, and destruction. Currently, if you create a mesh, you obviously create all the necessary buffers: one for vertex positions, one for normals, one for UVs, etc. So, for example, if I load position data and the buffer doesn’t exist, a new buffer is created and a CPU-GPU upload operation is performed. However, if the buffer exists and its size is greater than the new vertex size, the buffer isn’t reallocated to a smaller size but remains the same, reducing the number of vertices used for drawing. I’m not sure how useful this option is, but I plan to add an option to specify this in the future. Image Presentation Supported I’ve also been working on how to display an image on the screen. Currently, the Render Graph has a method that, given a texture’s Transient handle, sets that texture as the image to display on the screen. Internally, the Render Graph creates a draw pass at the end of all existing passes and then samples from the presentation texture set to draw on the swapchain. The code for all this might be a little rough at the moment; I’ll improve it later. The New Architecture For a while now, I’ve felt like the code was stepping on its own toes. I had a class called MemoryRegistry that was responsible for assigning slots to resources, allocating them, and managing their lifecycle. I didn’t like this, so I decided to rewrite much of it, splitting everything into multiple classes. Now I have a class called ResourceRegistry that provides resource IDs. A class called ResourceMapper that inserts resources into their respective global descriptors. A class called ResourceTracker that manages the resource lifecycle, their last use, which stage they were in, and similar information. Until recently, the MemoryRegistry managed both persistent and transient resources, which was a mess. I’ve decided that the MemoryRegistry should only manage persistent resources, while transient resources should be managed by a class called TransientResourcePool or something similar, which should be managed by the RenderGraph. That’s exactly what I’m working on. Some Stupid Bugs I overran the timeframe because I was partially testing the new code and encountered a stupid bug that made me lose time. (I was iterating an Array starting from the last element, but I forgot to subtract one from the size of the vector assigned to the for loop index, thus causing an out-of-memory access.) I think I’ll also rewrite a good portion of the RenderGraph first to adapt it to the new architecture. Advantages These changes will make developing new features faster and less cumbersome without having to adapt to an architecture that was poorly designed from the start. I swear that after I’ve done all this, I’ll render something to the screen, assuming there are no unforeseen issues ;)"}, {"post_id": 39763, "ts": "2026-08-02T22:53:53Z", "hours": 9.9536, "text": "DEVLOG 16 - Blank Window, Draw Calls & More The last ten hours have been very productive. As the devlog title suggests, I managed to get the classic black window, completed the code for draw calls, and also accomplished many other things. Draw Calls Commands I then completed the code for making draw calls with a simple mesh, integrating all the logic into the Render Graph. If you want to send any command to the GPU—a draw call, a copy, a dispatch, or anything else—it must necessarily go through the Render Graph. This allows me to have a central entity that can manage barriers and commands in a highly optimized, precise, and secure manner. When you want to draw something, you must declare a graphics pass. This pass has methods to execute the drawing commands, but it also has methods to set things like the texture depth/stencil to use, the target texture to draw on, etc. You can also have multiple color targets, as long as they have the same resolution. Blank Window Since I haven’t seen any tangible results on screen for a while, only code, I tried displaying a black window and then initializing the engine. The new context, window, and swapchain builders all work. The Resource Mapper, the class that manages the global descriptor set, also works. Testing the other classes will require a bit more work until I’ve got all the missing pieces, but it’s almost there. Persistent Resources Support Since creating a mesh also involves creating data and sending it to the GPU via buffers, I need a way to upload data from the CPU to the GPU. Mesh buffers are persistent, not transient. Currently, in the Render Graph code, I only had support for copying and uploading transient resources. From now on, this is also available for Persistent resources, as I’ve written the same code for them as well. I also implemented barrier generation for persistent resources so that synchronization is handled internally by the Render Graph, as with transient resources. New Resource Handles Up until now, each resource has been represented as a handle corresponding to an unsigned 32-bit number. From now on, resources are represented by two unsigned 32-bit numbers: one for the previously existing identification number and a generation number. By combining both numbers, each resource is unique, thus eliminating the possibility that if a resource is destroyed and recreated with the same ID, it could be mistaken for an older resource that no longer exists. Project Cleaning I finally cleaned up the project a bit and made it a bit more organized by dividing the files into more specific subfolders."}, {"post_id": 37211, "ts": "2026-07-29T19:14:02Z", "hours": 10.0533, "text": "DEVLOG 15 - Slang & Render Graph Reorganization So, I’ve been dividing the project into folders, making everything more organized, which wasn’t the case until now. The New Shader Language: Slang I saw that there was a more modern alternative to GLSL I could use, so I chose Slang. I created the code to create it in real time, and then I also changed the architecture of the Pipeline Builder a bit (the class responsible for creating Vulkan’s Pipeline and PipelineLayout objects). Vertex Fetch, Why Did I Choose It? I’ve been thinking for a while about forcing users of the engine to use Vertex Fetch. What is it? Well, normally when using a shader, before the Vertex Shader there’s a phase called Input Assembly that, based on the triangle indices, samples vertices from the vertex buffer, allowing them to be used directly in the Vertex Shader without manual sampling. However, this means that the layout of the vertex buffer must never change; if it were to change, you’d have to create another Pipeline object and bind it. Honestly, I don’t like this limitation very much. That’s why I removed this feature and adopted Vertex Fetch, which allows you to not specify a vertex layout, thus having as few Pipeline objects as possible. Obviously, you have to manually fetch the vertex from the respective buffer in the Vertex Shader, but frankly, it’s not a huge problem. Work In Progress On The Render Graph Another thing I’m implementing is commands that can be sent to the GPU via the Render Graph. So now you can draw, make GPU-GPU copies between buffers, between textures, and even between textures and buffers. Copies currently only support Transient resources; I’ll add the functionality for Persistent resources later. The same goes for using Compute Shaders. I’ve also added the ability to upload data from the CPU to the GPU, again for transient resources. For Persistent resources, I’ll also add this functionality later. I’m still writing the code for this, so I’m not finished yet, but I’m forced to devlog for the usual 10 hours of Stardance…"}, {"post_id": 34710, "ts": "2026-07-25T17:18:03Z", "hours": 9.9128, "text": "DEVLOG 14 - I Rewrote The Memory Aliasing Algorithm Intro Unfortunately, I don’t have anything exciting to say. I’m forced to do this devlog since I’ve reached ten hours since my last devlog, so I have to publish one, otherwise my hours wouldn’t count in full. I’ll try to share what I did, the problems I encountered, and how I solved them. The Problem I might sound crazy, but after working on the Render Graph for twenty hours, I rewrote it entirely from scratch. You might ask, why? The reason I did this was Vulkan itself. I discovered that, since I’d previously relied on VMA (Vulkan Memory Allocator) to manage memory, now that I was managing memory without it, there was something I’d overlooked: a parameter called Memory Type Index. The Memory Type Index indicates where to allocate memory. There could be a Memory Type Index for the GPU’s local memory, one for the Resizable BAR, etc. So, what’s the problem if all the Render Graph resources must live exclusively in the GPU’s local memory anyway? Wouldn’t it be enough to simply add a few lines of code and everything would be solved? Unfortunately, not because this index indicates in which memory to allocate that resource, but there’s also another parameter called Memory Type Bits, which is a bitmask that indicates in which Memory Type Indexes a resource can or cannot be allocated. All resources are allocated in the same Memory Type Index, but they may have different Memory Type Bits. This means, for example, that a texture without multi-samples cannot fit in the same memory space as a texture with multi-samples. This can also happen with the aspect mask, so a color texture and a depth texture might not fit in the same place. It could also happen with the format or tiling. The same goes for buffers, but these are more flexible than textures. The Solution My Memory Aliasing algorithm was designed without taking all this into account, so I chose to rewrite a large part of the Render Graph, trying to recycle some parts. Therefore, the Aliasing algorithm now operates on “Buckets,” which are in-memory containers containing resources that can fit in the same space. Without this distinction, memory aliasing wouldn’t be possible because a resource attempting to reuse memory used by previous resources must only check among resources with the same requirements, not among all resources. Therefore, it checks per bucket, not all existing resources. This has also made the code much cleaner and more organized."}, {"post_id": 32449, "ts": "2026-07-21T17:21:23Z", "hours": 10.0289, "text": "DEVLOG 13 - Memory Aliasing Recap In the last devlog, I explained what I did and why I was creating a Render Graph. I mentioned a concept called Memory Aliasing, but I explained it briefly. I’ve been working extensively on the Render Graph these past few hours to implement the Memory Aliasing algorithm. What is Memory Aliasing? Memory Aliasing involves having two or more resources use the same portions of memory, thus sharing that memory. For example, let’s take a texture we’ll call A. This texture is used as Depth in pass 1 and read in pass 2. Another texture, called B, is used in pass 3 and pass 4 (see photo). We could allocate both resources independently, but you can clearly see that the resources don’t overlap in the passes. Texture A begins its usage cycle in pass 1 and ends in pass 2, and immediately after, in pass 3, texture B is used for the first time. What we could do is have both textures occupy the same memory space to save VRAM. This is the concept of Memory Aliasing. Obviously, since the resources share the same memory space, barriers must be created to synchronize resource access, otherwise there would be a race condition (two threads operating in parallel on the same memory space, not just for read-only operations). Resource Pooling In addition to memory aliasing, I wanted to optimize another aspect that took me some time. In Vulkan, when you want to create resources, you use vkCreateImage and vkCreateBuffer. These functions create a handle without associating physical memory with these objects. Binding occurs later, after executing the memory aliasing algorithm, which determines which memory space to assign to a resource. This means that I have to create and destroy resource handles every frame, which apparently isn’t a light operation to perform on multiple resources. So I thought that if there was a possibility, I could reuse handles from previous frames by simply comparing whether the settings of the requested handle were the same as the one to be reused and then binding the memory. The Problem and the Solution This was the idea I had, but unfortunately it’s not feasible because Vulkan doesn’t allow memory binding to a resource more than once, so this approach wouldn’t have worked. After thinking for a while about how to solve this, I decided to include in the requirements for using old handles, in addition to the texture or buffer settings, the offset and stride of how they were bound in memory. This way, if the pass structure and usage hadn’t changed significantly during the user’s setup phase, the Memory Aliasing algorithm would always produce the same results, given the deterministic nature, making this all feasible. Finally, if the resources aren’t reused for an N number of consecutive frames, they are permanently destroyed."}, {"post_id": 30667, "ts": "2026-07-18T13:14:32Z", "hours": 9.9683, "text": "DEVLOG 12 - Render Graph, Code Refactoring A Little Recap In the last devlog, I mentioned I watched the 2017 GDC conference, where they explained how the Frostbite development team had created a Render Graph. But what is a Render Graph, and what is it used for? To answer this question, we must first understand how the GPU works. The Difference: CPU & GPU First, a GPU, unlike a CPU, performs all its operations in parallel. When we write code for the CPU, we say: do this operation, then this, then that, and so on. The CPU performs its operations synchronously, in sequential order. The GPU, however, doesn’t work that way. If we tell the GPU that we want to draw three objects, we can send it three draw calls, which we’ll call A, B, and C. These draw calls are sent in order, so first A, then B, and then C. The order in which the commands are sent doesn’t correspond to the order in which they are executed, because the GPU could execute the commands in this order: C, B, A, or B, A, C, or A, C, B, and so on. This is because, while operation A might be in progress, operation B might start executing, so both commands will use the same resources and therefore run into a race condition if both operations are not read-only. The Problem From this perspective, the GPU is very powerful because it tries to stay constantly busy, eliminating dead time. However, this greatly complicates things on the synchronization side. Let’s take two operations: operation A that writes an image and operation B that reads the image. How can we be sure that the GPU executes operation A first and not B? Who can assure us that the GPU, while executing A, doesn’t have to execute B? The answer to all these questions is no one. How Graphics APIs Handle All Of This In graphics APIs like OpenGL, all of this is hidden from the programmer, so they don’t have to worry about it. But in graphics APIs like Vulkan and DirectX 12, this is the programmer’s responsibility. The programmer must write a barrier and tell the GPU not to touch the image from operation B before A has finished. For a few barriers, this is feasible, but as soon as you write more complex applications, making the code sufficiently organized, non-repetitive, and fast to develop becomes very challenging. This is why the concept of a Render Graph exists. What A Render Graph Does A Render Graph allows the programmer to specify which steps the GPU should execute, which operations resources like images and textures will perform, and in what order. The Frame Graph looks at this graph constructed by the programmer at each frame and internally understands where barriers and sometimes semaphores are needed (if we’re working with multiple queues, that’s not the case for me). Another responsibility of the Frame Graph is to internally allocate and manage resources that only exist within a single frame, called transient resources. Finally, I’m implementing Memory Aliasing. This reduces the memory used by resources: for example, if resource A is used for the last time in pass 3 and resource B for the first time in pass 4, they can share the same physical memory, thus reducing the overall memory requirement. Bonus I’ve also restructured the texture creation methods, making them simpler and allowing for fewer specifications. The before and after is a good result… The same goes for 1D and 3D textures."}, {"post_id": 28272, "ts": "2026-07-14T12:58:23Z", "hours": 10.2439, "text": "DEVLOG 11 - BDA, Pipeline, Shaders In the last devlog, I explained how I wanted to structure my bindless descriptor set. With that approach, I had a buffer for each data type. This approach works, but it’s a bit cumbersome, so I switched to using Buffer Device Addresses (BDAs). The idea behind it is: Create buffers, around VRAM, placing the buffers within VRAM memory pools. Instead of saving the physical data inside the descriptor buffer, we can only save pointers to the buffers, so I’ll have a buffer of pointers to the buffers scattered across VRAM. Since the pointers take up 8 bytes, managing the buffer is very simple, as it will be very light. So, essentially, I separate the physical data of the buffers from the shader binding logic. Rather than using namespaces to hide the internal implementation, I chose to use Hadles, which are simply numbers that identify that resource. So I could have a BufferHandle, ImageHandle, SamplerHandle, PipelineHandle, and so on. I chose not to call the structure that manages all this with names that might be reminiscent of the Vulkan API, but instead called this system Resource Mapper. At the moment, I think I’ve done something wrong with the code: Since the buffers are simply exposed via a 32-bit index, internally the buffer index corresponds to the index of the vector in which the Vulkan buffer handles and all the allocation information are allocated. I think I’ve erred in saving the buffers in vector indices that don’t match their exposed handle index outside of Eve. This causes access to incorrect buffers or buffers that don’t even exist, causing UBs or crashes. I still need to verify this issue and, if it occurs, I’ll have to fix it. Furthermore, yesterday I added all the code responsible for creating the graphics pipeline and compiling the shaders. This code is still a bit rough and needs improvement. Furthermore, since I don’t want the user to have to manage synchronization outside of the engine, I’ve been thinking about how to structure a Render Graph. I saw Frostbite’s presentation at GDC 2017 where they explained how their Render Graph works and that gave me some insights."}, {"post_id": 25895, "ts": "2026-07-10T11:55:09Z", "hours": 11.2272, "text": "DEVLOG 10 - Working On The Vulkan Wrapper For now, I’m focused on creating a wrapper for Vulkan to make it simpler and less repetitive to use. I don’t want to create a wrapper that abstracts too much, thus losing control; instead, I’m creating a fairly thin wrapper. I’m currently restructured the Application class a bit and divided some of its parts into three “modules.” I’m structuring this using the Factory Pattern. I’ve created three Builders: one for the window and SDL initialization, one for creating a Vulkan context—VulkanInstace, PhysicalDevice, LogicalDevice, and the graphics queue—and the last one for building the swapchain. I chose this approach because I consider it flexible and I don’t want everything to fit into one huge monolith; I prefer having multiple modular classes. In addition to these more or less complete builders, I’m focusing on creating a system that can allow shaders to see and manipulate the data stored in VRAM. This is usually done with DescriptorSets, which have been the standard for years. They’re more or less like pointers to objects in VRAM so shaders can access them. In reality, they’re fat pointers because they contain other information besides the address. However, this approach is good but not optimal because it introduces CPU overhead. Since the draw calls may not share the same materials and therefore require different textures, a new DescriptorSet must be bound before each draw call, which, with many draw calls, incurs CPU overhead. What I’m doing to solve this problem is looking towards a more modern and efficient approach called Bindless. Basically, instead of having multiple small DescriptorSets, you have one huge global DescriptorSet that contains all the resources used by the application. So we could have a sort of array containing all the samplers, then another containing all the textures, another containing all the buffers of a specific type, etc. Then we just need to bind this DescriptorSet at the start of rendering, which will be used for the entire rendering process, and pass indices to the shader that will tell it which resources to use from the DescriptorSet. I’m a little slow in developing all this because I’ve never used Vulkan; in fact, I’m still learning. The second reason is that Vulkan is very complex and there’s a lot of boilerplate code. I still have to finish the ECS system since I don’t yet have a centralized approach for obtaining the IDs and GenerationIds of new entities, which are verified and therefore safely managed internally by the engine. But I think I’ll do it later since I’m a little tired of fiddling with entities and want to do something different for a while."}, {"post_id": 21085, "ts": "2026-07-02T21:28:10Z", "hours": 4.3578, "text": "DEVLOG 9 - 100K Entities After the last devlog, in which I rendered 1K entities, I tried increasing the number of entities to a 15x15x15 cube, or 3375 entities, and I saw the frame rate drop unexpectedly, 25 FPS. I was wondering if this was normal or not… Apparently, it wasn’t… I tried to figure out the problem, but it wasn’t easy. I tried using a tool called RenderDoc that lets you see what’s happening on the GPU, so all the calls, data passed to the GPU, buffers, textures, etc. That information also included the time, and the GPU indicated it was taking about 16 ms, which was quite strange. I started to suspect Vulkan’s validation layers. By disabling them, I got to 30 FPS or a little higher, I don’t remember exactly. Then I disabled ASan and set the swapchain to Immediate Mode so as not to be constrained by the screen refresh rate, and I got to about 100 FPS. Then I made several CPU-level optimizations at the code level by changing the way components are obtained from batches in my ECS system, specifically limiting those operations that can be avoided in the internal component iteration loop, and I got up to 140 fps. Finally, the thing that made me open my eyes and say WOW was compiling in Release and not Debug, the fps skyrocketed to around 2300… I couldn’t believe it either… After doing all this, I rendered 100,000 entities and my fps were stable at 90… Incredible! Finally, just for the sake of curiosity, I tested 1,000,000 entities and got 9 fps, which is good because it means the system scales linearly. This is what I’ve been doing for the last two hours. Before that, I spent some time revisiting my ECS code to make it more secure. For example, many of the Table and EntityManager methods now return references and not pointers. I’ve also made the ComponentRegistry class much more efficient by storing component information in contiguous arrays instead of lists, which therefore contain non-contiguous data. Next Steps: I need to implement a way to get verified IDs from the EntityManager, since currently the IDs are only manual and non-unique. And then I’ll need to refactor the rendering code again, making it more modular, since it’s currently all in a single class."}, {"post_id": 20319, "ts": "2026-07-01T21:44:13Z", "hours": 9.6286, "text": "DEVLOG 8 - 1K Entities I implemented several things: One of these is a manager that allows systems to register their functions so they can be called, for example, when Update, Start, LateUpdate, etc. I implemented Address Sanitizer in the project to detect leaks, overflows, or out-of-bounds reads, thus uncovering some bugs. I didn’t understand why, but ASan was having trouble integrating with the project; apparently, the shaderc library was causing problems because it had a different connotation than the project. I finally solved the problem by telling CMake to use the Release version of shaderc, not Debug. I created a test system called S_Test, which I used to verify that I could create and manage multiple entities (apparently, yes). After having several memory issues, which I resolved with the help of ASan, I also started creating a camera component so I could move freely in 3D space. I’ve improved the security of the code; Entity Command Pools now no longer need to be created by the programmer, but by the Entity Manager itself, which manages them. This minimizes the risk of freeing memory too early, resulting in cleaner code for the game. Furthermore, the EntityCommandInfo and QueryInfo classes can now be allocated on the stack rather than the heap, resulting in a more secure program. Finally, for fun, I wanted to try creating a thousand entities, also to see if the system was capable of it and if there were any problems. I have to say, I’m quite happy with the result. Next Step: I still have to improve several parts of the code to make it more secure and faster, such as the Component Registry."}, {"post_id": 18339, "ts": "2026-06-29T13:31:38Z", "hours": 6.0772, "text": "DEVLOG 7 - Code Reorganization I tried to reorganize the project so that the headers needed by users of the engine are visible, while the internal, and therefore unnecessary, ones are not. What do I mean? Let’s say we have a class called A. This class is used by the engine itself, but it can also be used by the developer, for example, to record commands or something similar. So the developer will include class A in their header or source files so it can be used. But there’s a problem: Header A could include other headers that aren’t necessarily needed by the developer using the engine, thus polluting the headers. How do I solve this problem? Since I haven’t used C++ for years, I’ve been researching the problem online for months and found the following solutions: Forward Declaration - This consists of declaring the required class in the header, in this case A, without using the include directive, which literally copies the headers included in the file containing the directive. This seems like a good method, but unfortunately the data can’t be variable by value, only by reference or pointer, since the compiler must know at compile time how much memory that specific object occupies. Pimpl Idiom - This involves enclosing or encapsulating the information needed for the internal functioning of A in a class or struct that is hidden from the developer using the engine. This method could work and is almost standard, but personally, I don’t really like the idea of having to create another structure to achieve this goal. It’s more of a workaround, since the language has significant limitations in this regard. C++20 Modules - Modules are a new way of programming in C++ because, among other things, they solve this problem. They also reduce compilation times and avoid separating the code into two separate files (.hpp and .cpp). I tried using them, and from a compiler perspective, they work great (I’m using Clang), but from a Clangd perspective, the situation is quite different: While the compiler support is fairly mature, Clangd still has several issues; in fact, it reported errors everywhere. I even tried modifying the .clangd file by adding various flags, but the situation didn’t improve. There are other methods, such as Fast Pimpl, but they aren’t as flexible. What I’m looking for is something flexible that generally works in all conditions and doesn’t introduce overhead, which Pimpl Idiom doesn’t. The final solution was to use namespaces . All the public headers that must be used by the developer using the engine are in the Eve/ namespace, while the internal headers that shouldn’t be used by the developer are in a namespace called Eve/Internal. If the developer uses these files, it’s their fault; they’re marked as internal to the engine and therefore shouldn’t be used. I also changed build system and switched to CMake as it is more widespread in the C++ community and this can also give an advantage in the engine configuration section for other users"}, {"post_id": 15067, "ts": "2026-06-24T14:08:55Z", "hours": 28.5411, "text": "DEVLOG 6 - Crash, Crash, Crash and…. Crash What I did After spending several hours designing my ECS architecture, I realized I could do better, so I basically started from scratch and, as I mentioned in the previous devlog, I chose to use Archtypes so everything would be extremely efficient. Maybe I’m a bit too obsessed with performance… The Problem Anyway, after finishing the entire system, I started the app and it crashed. After several hours of debugging with simple print(); I thought the problem was in the memory, but I couldn’t figure out where… I finally decided to use Address Sanitizer, a tool that alerts you to out-of-bounds writes or reads, which allowed me to pinpoint the problem. I had performed a nonsensical multiplication, so the memory pointer was pointing to the wrong place, specifically to the end of the allocated memory portion, causing the metadata to be overwritten. (Apparently, when allocating memory, the program itself allocates additional memory slices that store information about the allocated memory portion.) The problem was that the app didn’t always crash, only sometimes, and I didn’t understand why. But I finally managed to get it working… The Result At the moment, this is a single entity, and since I haven’t tested the rest of the code, such as the destruction logic and entity transitions from one archtype to another, there are likely other bugs waiting for me."}, {"post_id": 9873, "ts": "2026-06-16T10:28:19Z", "hours": 4.6411, "text": "DEVLOG 5 - The ECS Architecture Since I can now draw something on the screen, I’d say it’s time to start building the actual graphics engine. The first system I need to create for Eve is the management of game objects. There are two options: the first is to use the OOP programming paradigm and therefore manage game objects just like Unity does; the other, which is the one I chose, is to use the ECS (Entity, Component, System) architecture. To understand why I chose ECS, you need to understand how this architecture works. As I mentioned, the word ECS is an acronym for Entity, Component, and System, which represent the three pillars on which this architecture is based. In short, entities represent objects, the essence of the object; that object simply exists, and they are usually represented by a simple numeric ID. Components, on the other hand, represent pure data; therefore, each entity can have its own components and therefore its own data. Systems, on the other hand, are the part of the code that executes the logic. Let’s take the rendering system as an example. This will iterate over all entities that have mesh components, and a transform will take their data and send it to the GPU for rendering. This division of responsibilities ensures incredible efficiency, given how the CPU works, since the component data is stored contiguously in memory. This facilitates the work of a CPU component called the Hardware Prefetcher, which tries to predict which portion of RAM the CPU will use next, thus reducing cache misses. There are many ready-to-use libraries for this architecture, such as Flecs, EnTT, and others. I chose to try and create my own so I could learn and understand more. Currently, I’m using, broadly speaking, the same approach Unity uses with their ECS architecture, which is part of their Unity DOTS ecosystem. All entities in the game can be classified based on an ID called an Archtype, which identifies the type of entity being viewed based on its components. This way, you can have contiguous arrays and minimize cache misses, thus maximizing CPU efficiency. I’m still working on it, but I have to say it’s extremely interesting…"}, {"post_id": 8166, "ts": "2026-06-13T16:39:12Z", "hours": 4.5819, "text": "DEVLOG 4 - Textures! I finally managed to use textures; Vulkan has a bit of boilerplate in their configuration, especially with the descriptor sets. This was the part that slowed me down a bit. The code isn’t very tidy at the moment… For now, I’ve focused more on learning, so I haven’t written anything extremely tidy and readable. As I said, I’ve only learned the basics so far. Now that I feel more confident about the subject, I think I’ll start writing something. I’m thinking of a framework or something simple that allows you to draw geometry on the screen without having to write hundreds of lines of code directly with Vulkan. So, more generally, I think I’ll create a layer of abstraction while still trying to maintain excellent flexibility."}, {"post_id": 7178, "ts": "2026-06-11T23:53:28Z", "hours": 2.3814, "text": "DEVLOG 3 - First Cube!!! How satisfying, my first 3D object! Since previously all vertices were written manually in the shader, I opted to learn how to create buffers to load more complex 3D geometry onto the screen. I’m loading the resources directly into a specific portion of memory called Host Visible, where the CPU can also write, and the GPU’s reading isn’t as fast as it could be. If I instead allocate the memory in a portion of VRAM called Device Local, the GPU will be very fast at accessing the data, but the CPU, on the other hand, won’t be able to do anything with that memory. To modify it, you need to first allocate the data in an intermediate buffer called Staging Buffer, and then from there the data can go to Device Local memory (the GPU’s fast memory). I also added some transformations and rotations with GLM to rotate the cube, and this is the result, which is nice. I think I’ll try using Device Local memory by loading data to it, as discussed before, with a Staging Buffer and after that I think I’ll start experimenting with textures."}, {"post_id": 6502, "ts": "2026-06-10T22:34:52Z", "hours": 9.0367, "text": "DEVLOG 2 - Consolidation of things learned Well, What’s new? Just a square? It might not seem like much, but yes. I spent all these hours rewriting the entire code from scratch so I could understand where I had the most doubts and therefore review some concepts. Synchronization was and still is the most difficult concept to grasp; understanding how the semaphores and barriers are linked together wasn’t easy for me, and I must admit I still have some doubts about it, but certainly much less than before. Given the asynchronous nature of the graphics card, you can’t program operations that will be executed in order, unlike the CPU, and this is one of the graphics card’s strengths and weaknesses. You can parallelize many operations, but you have to be careful how they are linked together and synchronize them as correctly as possible. My next step, I think, will be to use buffers to give more complex geometry to the shaders, primarily for drawing 3D geometry. I also think I still have to delve deeper and better understand things like semaphores, timeline semaphores, and barriers, which are topics I feel I haven’t internalized as well as others."}, {"post_id": 5182, "ts": "2026-06-08T21:32:27Z", "hours": 11.6153, "text": "DEVLOG 1 - Hello Triangle!!! Finally, after several hours trying to understand how Vulkan works, watching and reading several tutorials, I got it, my first triangle, isn’t it cute?🫠🫠 I’ve figured out most of the things, but I think I need to delve a little deeper into the process of creating a pipeline with dynamic rendering and synchronization. These are the two topics that have been giving me the most trouble. I think the next step will be to re-explore the code and try to create something on my own, without a guided tutorial, to see if I’ve really understood the concepts."}]...
|
Title: Eve by @Light | Stardance
Devlogs:
DEVLOG Title: Eve by @Light | Stardance
Devlogs:
DEVLOG 1 - Hello Triangle!!! Finally, after several hours trying to understand how Vulkan works, watching and reading several tutorials, I got it, my first triangle, isn’t it cute?🫠🫠 I’ve figured out most of the things, but I think I need to delve a little deeper into the process of creating a pipeline with dynamic rendering and synchronization. These are the two topics that have been giving me the most trouble. I think the next step will be to re-explore the code and try to create something on my own, without a guided tutorial, to see if I’ve really understood the concepts.
DEVLOG 2 - Consolidation of things learned Well, What’s new? Just a square? It might not seem like much, but yes. I spent all these hours rewriting the entire code from scratch so I could understand where I had the most doubts and therefore review some concepts. Synchronization was and still is the most difficult concept to grasp; understanding how the semaphores and barriers are linked together wasn’t easy for me, and I must admit I still have some doubts about it, but certainly much less than before. Given the asynchronous nature of the graphics card, you can’t program operations that will be executed in order, unlike the CPU, and this is one of the graphics card’s strengths and weaknesses. You can parallelize many operations, but you have to be careful how they are linked together and synchronize them as correctly as possible. My next step, I think, will be to use buffers to give more complex geometry to the shaders, primarily for drawing 3D geometry. I also think I still have to delve deeper and better understand things like semaphores, timeline semaphores, and barriers, which are topics I feel I haven’t internalized as well as others.
DEVLOG 3 - First Cube!!! How satisfying, my first 3D object! Since previously all vertices were written manually in the shader, I opted to learn how to create buffers to load more complex 3D geometry onto the screen. I’m loading the resources directly into a specific portion of memory called Host Visible, where the CPU can also write, and the GPU’s reading isn’t as fast as it could be. If I instead allocate the memory in a portion of VRAM called Device Local, the GPU will be very fast at accessing the data, but the CPU, on the other hand, won’t be able to do anything with that memory. To modify it, you need to first allocate the data in an intermediate buffer called Staging Buffer, and then from there the data can go to Device Local memory (the GPU’s fast memory). I also added some transformations and rotations with GLM to rotate the cube, and this is the result, which is nice. I think I’ll try using Device Local memory by loading data to it, as discussed before, with a Staging Buffer and after that I think I’ll start experimenting with textures.
DEVLOG 4 - Textures! I finally managed to use textures; Vulkan has a bit of boilerplate in their configuration, especially with the descriptor sets. This was the part that slowed me down a bit. The code isn’t very tidy at the moment… For now, I’ve focused more on learning, so I haven’t written anything extremely tidy and readable. As I said, I’ve only learned the basics so far. Now that I feel more confident about the subject, I think I’ll start writing something. I’m thinking of a framework or something simple that allows you to draw geometry on the screen without having to write hundreds of lines of code directly with Vulkan. So, more generally, I think I’ll create a layer of abstraction while still trying to maintain excellent flexibility.
DEVLOG 5 - The ECS Architecture Since I can now draw something on the screen, I’d say it’s time to start building the actual graphics engine. The first system I need to create for Eve is the management of game objects. There are two options: the first is to use the OOP programming paradigm and therefore manage game objects just like Unity does; the other, which is the one I chose, is to use the ECS (Entity, Component, System) architecture. To understand why I chose ECS, you need to understand how this architecture works. As I mentioned, the word ECS is an acronym for Entity, Component, and System, which represent the three pillars on which this architecture is based. In short, entities represent objects, the essence of the object; that object simply exists, and they are usually represented by a simple numeric ID. Components, on the other hand, represent pure data; therefore, each entity can have its own components and therefore its own data. Systems, on the other hand, are the part of the code that executes the logic. Let’s take the rendering system as an example. This will iterate over all entities that have mesh components, and a transform will take their data and send it to the GPU for rendering. This division of responsibilities ensures incredible efficiency, given how the CPU works, since the component data is stored contiguously in memory. This facilitates the work of a CPU component called the Hardware Prefetcher, which tries to predict which portion of RAM the CPU will use next, thus reducing cache misses. There are many ready-to-use libraries for this architecture, such as Flecs, EnTT, and others. I chose to try and create my own so I could learn and understand more. Currently, I’m using, broadly speaking, the same approach Unity uses with their ECS architecture, which is part of their Unity DOTS ecosystem. All entities in the game can be classified based on an ID called an Archtype, which identifies the type of entity being viewed based on its components. This way, you can have contiguous arrays and minimize cache misses, thus maximizing CPU efficiency. I’m still working on it, but I have to say it’s extremely interesting…
DEVLOG 6 - Crash, Crash, Crash and…. Crash What I did After spending several hours designing my ECS architecture, I realized I could do better, so I basically started from scratch and, as I mentioned in the previous devlog, I chose to use Archtypes so everything would be extremely efficient. Maybe I’m a bit too obsessed with performance… The Problem Anyway, after finishing the entire system, I started the app and it crashed. After several hours of debugging with simple print(); I thought the problem was in the memory, but I couldn’t figure out where… I finally decided to use Address Sanitizer, a tool that alerts you to out-of-bounds writes or reads, which allowed me to pinpoint the problem. I had performed a nonsensical multiplication, so the memory pointer was pointing to the wrong place, specifically to the end of the allocated memory portion, causing the metadata to be overwritten. (Apparently, when allocating memory, the program itself allocates additional memory slices that store information about the allocated memory portion.) The problem was that the app didn’t always crash, only sometimes, and I didn’t understand why. But I finally managed to get it working… The Result At the moment, this is a single entity, and since I haven’t tested the rest of the code, such as the destruction logic and entity transitions from one archtype to another, there are likely other bugs waiting for me.
DEVLOG 7 - Code Reorganization I tried to reorganize the project so that the headers needed by users of the engine are visible, while the internal, and therefore unnecessary, ones are not. What do I mean? Let’s say we have a class called A. This class is used by the engine itself, but it can also be used by the developer, for example, to record commands or something similar. So the developer will include class A in their header or source files so it can be used. But there’s a problem: Header A could include other headers that aren’t necessarily needed by the developer using the engine, thus polluting the headers. How do I solve this problem? Since I haven’t used C++ for years, I’ve been researching the problem online for months and found the following solutions: Forward Declaration - This consists of declaring the required class in the header, in this case A, without using the include directive, which literally copies the headers included in the file containing the directive. This seems like a good method, but unfortunately the data can’t be variable by value, only by reference or pointer, since the compiler must know at compile time how much memory that specific object occupies. Pimpl Idiom - This involves enclosing or encapsulating the information needed for the internal functioning of A in a class or struct that is hidden from the developer using the engine. This method could work and is almost standard, but personally, I don’t really like the idea of having to create another structure to achieve this goal. It’s more of a workaround, since the language has significant limitations in this regard. C++20 Modules - Modules are a new way of programming in C++ because, among other things, they solve this problem. They also reduce compilation times and avoid separating the code into two separate files (.hpp and .cpp). I tried using them, and from a compiler perspective, they work great (I’m using Clang), but from a Clangd perspective, the situation is quite different: While the compiler support is fairly mature, Clangd still has several issues; in fact, it reported errors everywhere. I even tried modifying the .clangd file by adding various flags, but the situation didn’t improve. There are other methods, such as Fast Pimpl, but they aren’t as flexible. What I’m looking for is something flexible that generally works in all conditions and doesn’t introduce overhead, which Pimpl Idiom doesn’t. The final solution was to use namespaces . All the public headers that must be used by the developer using the engine are in the Eve/ namespace, while the internal headers that shouldn’t be used by the developer are in a namespace called Eve/Internal. If the developer uses these files, it’s their fault; they’re marked as internal to the engine and therefore shouldn’t be used. I also changed build system and switched to CMake as it is more widespread in the C++ community and this can also give an advantage in the engine configuration section for other users
DEVLOG 8 - 1K Entities I implemented several things: One of these is a manager that allows systems to register their functions so they can be called, for example, when Update, Start, LateUpdate, etc. I implemented Address Sanitizer in the project to detect leaks, overflows, or out-of-bounds reads, thus uncovering some bugs. I didn’t understand why, but ASan was having trouble integrating with the project; apparently, the shaderc library was causing problems because it had a different connotation than the project. I finally solved the problem by telling CMake to use the Release version of shaderc, not Debug. I created a test system called S_Test, which I used to verify that I could create and manage multiple entities (apparently, yes). After having several memory issues, which I resolved with the help of ASan, I also started creating a camera component so I could move freely in 3D space. I’ve improved the security of the code; Entity Command Pools now no longer need to be created by the programmer, but by the Entity Manager itself, which manages them. This minimizes the risk of freeing memory too early, resulting in cleaner code for the game. Furthermore, the EntityCommandInfo and QueryInfo classes can now be allocated on the stack rather than the heap, resulting in a more secure program. Finally, for fun, I wanted to try creating a thousand entities, also to see if the system was capable of it and if there were any problems. I have to say, I’m quite happy with the result. Next Step: I still have to improve several parts of the code to make it more secure and faster, such as the Component Registry.
DEVLOG 9 - 100K Entities After the last devlog, in which I rendered 1K entities, I tried increasing the number of entities to a 15x15x15 cube, or 3375 entities, and I saw the frame rate drop unexpectedly, 25 FPS. I was wondering if this was normal or not… Apparently, it wasn’t… I tried to figure out the problem, but it wasn’t easy. I tried using a tool called RenderDoc that lets you see what’s happening on the GPU, so all the calls, data passed to the GPU, buffers, textures, etc. That information also included the time, and the GPU indicated it was taking about 16 ms, which was quite strange. I started to suspect Vulkan’s validation layers. By disabling them, I got to 30 FPS or a little higher, I don’t remember exactly. Then I disabled ASan and set the swapchain to Immediate Mode so as not to be constrained by the screen refresh rate, and I got to about 100 FPS. Then I made several CPU-level optimizations at the code level by changing the way components are obtained from batches in my ECS system, specifically limiting those operations that can be avoided in the internal component iteration loop, and I got up to 140 fps. Finally, the thing that made me open my eyes and say WOW was compiling in Release and not Debug, the fps skyrocketed to around 2300… I couldn’t believe it either… After doing all this, I rendered 100,000 entities and my fps were stable at 90… Incredible! Finally, just for the sake of curiosity, I tested 1,000,000 entities and got 9 fps, which is good because it means the system scales linearly. This is what I’ve been doing for the last two hours. Before that, I spent some time revisiting my ECS code to make it more secure. For example, many of the Table and EntityManager methods now return references and not pointers. I’ve also made the ComponentRegistry class much more efficient by storing component information in contiguous arrays instead of lists, which therefore contain non-contiguous data. Next Steps: I need to implement a way to get verified IDs from the EntityManager, since currently the IDs are only manual and non-unique. And then I’ll need to refactor the rendering code again, making it more modular, since it’s currently all in a single class.
DEVLOG 10 - Working On The Vulkan Wrapper For now, I’m focused on creating a wrapper for Vulkan to make it simpler and less repetitive to use. I don’t want to create a wrapper that abstracts too much, thus losing control; instead, I’m creating a fairly thin wrapper. I’m currently restructured the Application class a bit and divided some of its parts into three “modules.” I’m structuring this using the Factory Pattern. I’ve created three Builders: one for the window and SDL initialization, one for creating a Vulkan context—VulkanInstace, PhysicalDevice, LogicalDevice, and the graphics queue—and the last one for building the swapchain. I chose this approach because I consider it flexible and I don’t want everything to fit into one huge monolith; I prefer having multiple modular classes. In addition to these more or less complete builders, I’m focusing on creating a system that can allow shaders to see and manipulate the data stored in VRAM. This is usually done with DescriptorSets, which have been the standard for years. They’re more or less like pointers to objects in VRAM so shaders can access them. In reality, they’re fat pointers because they contain other information besides the address. However, this approach is good but not optimal because it introduces CPU overhead. Since the draw calls may not share the same materials and therefore require different textures, a new DescriptorSet must be bound before each draw call, which, with many draw calls, incurs CPU overhead. What I’m doing to solve this problem is looking towards a more modern and efficient approach called Bindless. Basically, instead of having multiple small DescriptorSets, you have one huge global DescriptorSet that contains all the resources used by the application. So we could have a sort of array containing all the samplers, then another containing all the textures, another containing all the buffers of a specific type, etc. Then we just need to bind this DescriptorSet at the start of rendering, which will be used for the entire rendering process, and pass indices to the shader that will tell it which resources to use from the DescriptorSet. I’m a little slow in developing all this because I’ve never used Vulkan; in fact, I’m still learning. The second reason is that Vulkan is very complex and there’s a lot of boilerplate code. I still have to finish the ECS system since I don’t yet have a centralized approach for obtaining the IDs and GenerationIds of new entities, which are verified and therefore safely managed internally by the engine. But I think I’ll do it later since I’m a little tired of fiddling with entities and want to do something different for a while.
DEVLOG 11 - BDA, Pipeline, Shaders In the last devlog, I explained how I wanted to structure my bindless descriptor set. With that approach, I had a buffer for each data type. This approach works, but it’s a bit cumbersome, so I switched to using Buffer Device Addresses (BDAs). The idea behind it is: Create buffers, around VRAM, placing the buffers within VRAM memory pools. Instead of saving the physical data inside the descriptor buffer, we can only save pointers to the buffers, so I’ll have a buffer of pointers to the buffers scattered across VRAM. Since the pointers take up 8 bytes, managing the buffer is very simple, as it will be very light. So, essentially, I separate the physical data of the buffers from the shader binding logic. Rather than using namespaces to hide the internal implementation, I chose to use Hadles, which are simply numbers that identify that resource. So I could have a BufferHandle, ImageHandle, SamplerHandle, PipelineHandle, and so on. I chose not to call the structure that manages all this with names that might be reminiscent of the Vulkan API, but instead called this system Resource Mapper. At the moment, I think I’ve done something wrong with the code: Since the buffers are simply exposed via a 32-bit index, internally the buffer index corresponds to the index of the vector in which the Vulkan buffer handles and all the allocation information are allocated. I think I’ve erred in saving the buffers in vector indices that don’t match their exposed handle index outside of Eve. This causes access to incorrect buffers or buffers that don’t even exist, causing UBs or crashes. I still need to verify this issue and, if it occurs, I’ll have to fix it. Furthermore, yesterday I added all the code responsible for creating the graphics pipeline and compiling the shaders. This code is still a bit rough and needs improvement. Furthermore, since I don’t want the user to have to manage synchronization outside of the engine, I’ve been thinking about how to structure a Render Graph. I saw Frostbite’s presentation at GDC 2017 where they explained how their Render Graph works and that gave me some insights.
DEVLOG 12 - Render Graph, Code Refactoring A Little Recap In the last devlog, I mentioned I watched the 2017 GDC conference, where they explained how the Frostbite development team had created a Render Graph. But what is a Render Graph, and what is it used for? To answer this question, we must first understand how the GPU works. The Difference: CPU & GPU First, a GPU, unlike a CPU, performs all its operations in parallel. When we write code for the CPU, we say: do this operation, then this, then that, and so on. The CPU performs its operations synchronously, in sequential order. The GPU, however, doesn’t work that way. If we tell the GPU that we want to draw three objects, we can send it three draw calls, which we’ll call A, B, and C. These draw calls are sent in order, so first A, then B, and then C. The order in which the commands are sent doesn’t correspond to the order in which they are executed, because the GPU could execute the commands in this order: C, B, A, or B, A, C, or A, C, B, and so on. This is because, while operation A might be in progress, operation B might start executing, so both commands will use the same resources and therefore run into a race condition if both operations are not read-only. The Problem From this perspective, the GPU is very powerful because it tries to stay constantly busy, eliminating dead time. However, this greatly complicates things on the synchronization side. Let’s take two operations: operation A that writes an image and operation B that reads the image. How can we be sure that the GPU executes operation A first and not B? Who can assure us that the GPU, while executing A, doesn’t have to execute B? The answer to all these questions is no one. How Graphics APIs Handle All Of This In graphics APIs like OpenGL, all of this is hidden from the programmer, so they don’t have to worry about it. But in graphics APIs like Vulkan and DirectX 12, this is the programmer’s responsibility. The programmer must write a barrier and tell the GPU not to touch the image from operation B before A has finished. For a few barriers, this is feasible, but as soon as you write more complex applications, making the code sufficiently organized, non-repetitive, and fast to develop becomes very challenging. This is why the concept of a Render Graph exists. What A Render Graph Does A Render Graph allows the programmer to specify which steps the GPU should execute, which operations resources like images and textures will perform, and in what order. The Frame Graph looks at this graph constructed by the programmer at each frame and internally understands where barriers and sometimes semaphores are needed (if we’re working with multiple queues, that’s not the case for me). Another responsibility of the Frame Graph is to internally allocate and manage resources that only exist within a single frame, called transient resources. Finally, I’m implementing Memory Aliasing. This reduces the memory used by resources: for example, if resource A is used for the last time in pass 3 and resource B for the first time in pass 4, they can share the same physical memory, thus reducing the overall memory requirement. Bonus I’ve also restructured the texture creation methods, making them simpler and allowing for fewer specifications. The before and after is a good result… The same goes for 1D and 3D textures.
DEVLOG 13 - Memory Aliasing Recap In the last devlog, I explained what I did and why I was creating a Render Graph. I mentioned a concept called Memory Aliasing, but I explained it briefly. I’ve been working extensively on the Render Graph these past few hours to implement the Memory Aliasing algorithm. What is Memory Aliasing? Memory Aliasing involves having two or more resources use the same portions of memory, thus sharing that memory. For example, let’s take a texture we’ll call A. This texture is used as Depth in pass 1 and read in pass 2. Another texture, called B, is used in pass 3 and pass 4 (see photo). We could allocate both resources independently, but you can clearly see that the resources don’t overlap in the passes. Texture A begins its usage cycle in pass 1 and ends in pass 2, and immediately after, in pass 3, texture B is used for the first time. What we could do is have both textures occupy the same memory space to save VRAM. This is the concept of Memory Aliasing. Obviously, since the resources share the same memory space, barriers must be created to synchronize resource access, otherwise there would be a race condition (two threads operating in parallel on the same memory space, not just for read-only operations). Resource Pooling In addition to memory aliasing, I wanted to optimize another aspect that took me some time. In Vulkan, when you want to create resources, you use vkCreateImage and vkCreateBuffer. These functions create a handle without associating physical memory with these objects. Binding occurs later, after executing the memory aliasing algorithm, which determines which memory space to assign to a resource. This means that I have to create and destroy resource handles every frame, which apparently isn’t a light operation to perform on multiple resources. So I thought that if there was a possibility, I could reuse handles from previous frames by simply comparing whether the settings of the requested handle were the same as the one to be reused and then binding the memory. The Problem and the Solution This was the idea I had, but unfortunately it’s not feasible because Vulkan doesn’t allow memory binding to a resource more than once, so this approach wouldn’t have worked. After thinking for a while about how to solve this, I decided to include in the requirements for using old handles, in addition to the texture or buffer settings, the offset and stride of how they were bound in memory. This way, if the pass structure and usage hadn’t changed significantly during the user’s setup phase, the Memory Aliasing algorithm would always produce the same results, given the deterministic nature, making this all feasible. Finally, if the resources aren’t reused for an N number of consecutive frames, they are permanently destroyed.
DEVLOG 14 - I Rewrote The Memory Aliasing Algorithm Intro Unfortunately, I don’t have anything exciting to say. I’m forced to do this devlog since I’ve reached ten hours since my last devlog, so I have to publish one, otherwise my hours wouldn’t count in full. I’ll try to share what I did, the problems I encountered, and how I solved them. The Problem I might sound crazy, but after working on the Render Graph for twenty hours, I rewrote it entirely from scratch. You might ask, why? The reason I did this was Vulkan itself. I discovered that, since I’d previously relied on VMA (Vulkan Memory Allocator) to manage memory, now that I was managing memory without it, there was something I’d overlooked: a parameter called Memory Type Index. The Memory Type Index indicates where to allocate memory. There could be a Memory Type Index for the GPU’s local memory, one for the Resizable BAR, etc. So, what’s the problem if all the Render Graph resources must live exclusively in the GPU’s local memory anyway? Wouldn’t it be enough to simply add a few lines of code and everything would be solved? Unfortunately, not because this index indicates in which memory to allocate that resource, but there’s also another parameter called Memory Type Bits, which is a bitmask that indicates in which Memory Type Indexes a resource can or cannot be allocated. All resources are allocated in the same Memory Type Index, but they may have different Memory Type Bits. This means, for example, that a texture without multi-samples cannot fit in the same memory space as a texture with multi-samples. This can also happen with the aspect mask, so a color texture and a depth texture might not fit in the same place. It could also happen with the format or tiling. The same goes for buffers, but these are more flexible than textures. The Solution My Memory Aliasing algorithm was designed without taking all this into account, so I chose to rewrite a large part of the Render Graph, trying to recycle some parts. Therefore, the Aliasing algorithm now operates on “Buckets,” which are in-memory containers containing resources that can fit in the same space. Without this distinction, memory aliasing wouldn’t be possible because a resource attempting to reuse memory used by previous resources must only check among resources with the same requirements, not among all resources. Therefore, it checks per bucket, not all existing resources. This has also made the code much cleaner and more organized.
DEVLOG 15 - Slang & Render Graph Reorganization So, I’ve been dividing the project into folders, making everything more organized, which wasn’t the case until now. The New Shader Language: Slang I saw that there was a more modern alternative to GLSL I could use, so I chose Slang. I created the code to create it in real time, and then I also changed the architecture of the Pipeline Builder a bit (the class responsible for creating Vulkan’s Pipeline and PipelineLayout objects). Vertex Fetch, Why Did I Choose It? I’ve been thinking for a while about forcing users of the engine to use Vertex Fetch. What is it? Well, normally when using a shader, before the Vertex Shader there’s a phase called Input Assembly that, based on the triangle indices, samples vertices from the vertex buffer, allowing them to be used directly in the Vertex Shader without manual sampling. However, this means that the layout of the vertex buffer must never change; if it were to change, you’d have to create another Pipeline object and bind it. Honestly, I don’t like this limitation very much. That’s why I removed this feature and adopted Vertex Fetch, which allows you to not specify a vertex layout, thus having as few Pipeline objects as possible. Obviously, you have to manually fetch the vertex from the respective buffer in the Vertex Shader, but frankly, it’s not a huge problem. Work In Progress On The Render Graph Another thing I’m implementing is commands that can be sent to the GPU via the Render Graph. So now you can draw, make GPU-GPU copies between buffers, between textures, and even between textures and buffers. Copies currently only support Transient resources; I’ll add the functionality for Persistent resources later. The same goes for using Compute Shaders. I’ve also added the ability to upload data from the CPU to the GPU, again for transient resources. For Persistent resources, I’ll also add this functionality later. I’m still writing the code for this, so I’m not finished yet, but I’m forced to devlog for the usual 10 hours of Stardance…
DEVLOG 16 - Blank Window, Draw Calls & More The last ten hours have been very productive. As the devlog title suggests, I managed to get the classic black window, completed the code for draw calls, and also accomplished many other things. Draw Calls Commands I then completed the code for making draw calls with a simple mesh, integrating all the logic into the Render Graph. If you want to send any command to the GPU—a draw call, a copy, a dispatch, or anything else—it must necessarily go through the Render Graph. This allows me to have a central entity that can manage barriers and commands in a highly optimized, precise, and secure manner. When you want to draw something, you must declare a graphics pass. This pass has methods to execute the drawing commands, but it also has methods to set things like the texture depth/stencil to use, the target texture to draw on, etc. You can also have multiple color targets, as long as they have the same resolution. Blank Window Since I haven’t seen any tangible results on screen for a while, only code, I tried displaying a black window and then initializing the engine. The new context, window, and swapchain builders all work. The Resource Mapper, the class that manages the global descriptor set, also works. Testing the other classes will require a bit more work until I’ve got all the missing pieces, but it’s almost there. Persistent Resources Support Since creating a mesh also involves creating data and sending it to the GPU via buffers, I need a way to upload data from the CPU to the GPU. Mesh buffers are persistent, not transient. Currently, in the Render Graph code, I only had support for copying and uploading transient resources. From now on, this is also available for Persistent resources, as I’ve written the same code for them as well. I also implemented barrier generation for persistent resources so that synchronization is handled internally by the Render Graph, as with transient resources. New Resource Handles Up until now, each resource has been represented as a handle corresponding to an unsigned 32-bit number. From now on, resources are represented by two unsigned 32-bit numbers: one for the previously existing identification number and a generation number. By combining both numbers, each resource is unique, thus eliminating the possibility that if a resource is destroyed and recreated with the same ID, it could be mistaken for an older resource that no longer exists. Project Cleaning I finally cleaned up the project a bit and made it a bit more organized by dividing the files into more specific subfolders.
DEVLOG 17 - Meshes & New Architecture Into See you again, Stardance. I’ve been implementing several things lately, as the title suggests, and I think we might soon have some geometry on the screen. Mesh System I’ve been working on meshes, creating everything needed to support mesh creation, editing, and destruction. Currently, if you create a mesh, you obviously create all the necessary buffers: one for vertex positions, one for normals, one for UVs, etc. So, for example, if I load position data and the buffer doesn’t exist, a new buffer is created and a CPU-GPU upload operation is performed. However, if the buffer exists and its size is greater than the new vertex size, the buffer isn’t reallocated to a smaller size but remains the same, reducing the number of vertices used for drawing. I’m not sure how useful this option is, but I plan to add an option to specify this in the future. Image Presentation Supported I’ve also been working on how to display an image on the screen. Currently, the Render Graph has a method that, given a texture’s Transient handle, sets that texture as the image to display on the screen. Internally, the Render Graph creates a draw pass at the end of all existing passes and then samples from the presentation texture set to draw on the swapchain. The code for all this might be a little rough at the moment; I’ll improve it later. The New Architecture For a while now, I’ve felt like the code was stepping on its own toes. I had a class called MemoryRegistry that was responsible for assigning slots to resources, allocating them, and managing their lifecycle. I didn’t like this, so I decided to rewrite much of it, splitting everything into multiple classes. Now I have a class called ResourceRegistry that provides resource IDs. A class called ResourceMapper that inserts resources into their respective global descriptors. A class called ResourceTracker that manages the resource lifecycle, their last use, which stage they were in, and similar information. Until recently, the MemoryRegistry managed both persistent and transient resources, which was a mess. I’ve decided that the MemoryRegistry should only manage persistent resources, while transient resources should be managed by a class called TransientResourcePool or something similar, which should be managed by the RenderGraph. That’s exactly what I’m working on. Some Stupid Bugs I overran the timeframe because I was partially testing the new code and encountered a stupid bug that made me lose time. (I was iterating an Array starting from the last element, but I forgot to subtract one from the size of the vector assigned to the for loop index, thus causing an out-of-memory access.) I think I’ll also rewrite a good portion of the RenderGraph first to adapt it to the new architecture. Advantages These changes will make developing new features faster and less cumbersome without having to adapt to an architecture that was poorly designed from the start. I swear that after I’ve done all this, I’ll render something to the screen, assuming there are no unforeseen issues ;)
DEVLOG 18 - More Refactoring Hi Stardance! I don’t know what to say about this devlog, since I’ve written a lot of code for my specific implementation… I’ll try to describe what I did without being too boring. Why I refactored again? As discussed in the previous devlog, I felt the code wasn’t “nice” or at least not very tidy, and honestly, I don’t like that very much, so I rewrote the Render Graph (partially) for the third time. Now, the Render Graph only manages single-frame resources, while all multi-frame resources are managed by a separate class called TransientResourcePool, which is therefore responsible for storing the resources. The Render Graph: A single frame responsibility The Render Graph is still responsible for memory aliasing and resource pooling, of course, as well as generating barriers and inserting the draw, copy, and, in the future, compute commands. (I still need to improve the code for compiling commands into the Command Buffers a bit.) Improvement in the searching of pooled resources Now, searching for resources to reuse is even faster, since resources are divided by their composition, for example. For textures, the parameters for this division are height, depth, width, samples, etc. This allows you to immediately find a resource if it’s available. More organization is the TransientResourcePool The TransientResourcePool is also responsible for permanently destroying unused resources for several frames. I had written the destruction code within the TransientResourcePool, but I thought maybe it wasn’t its responsibility, but rather an existing class called MemoryBin. The MemoryBin class was configured to work only for persistent resources, but now it handles the destruction of persistent and transient resources. What I need to fix: There’s a small problem in the code: Normally, when you want to destroy a resource, it’s queued and usually assigned a countdown. This countdown is a number that corresponds to the maximum frames in flight and decreases by one every frame. When this number reaches zero, the resource can be destroyed. This works perfectly, but when, for example, the swapchain needs to be recreated because the window size has changed, the GPU needs to be put into idle mode. This means that all in-flight frames have finished, and therefore all resources queued for destruction can and must be destroyed immediately, otherwise they would pile up. Otherwise, I think everything is perfect. I don’t think it will take me long to implement these little tricks, so I assume and hope :/ to start writing the code to display something on the screen soon. I’ll go back to my old, dear little triangle :)
DEVLOG 19 - Colors! Hi Stardance! I’ve made some progress and finally drew something on the screen! Improvements on the Swapchain Pass I’ve improved the Render Graph a bit by cleaning up old methods and making all the improvements discussed in the last devlog, such as improving the rendering code for the swapchain. Normally, you would set the 2D texture to display on the screen using the RenderGraph::SetPresentTexture(); In reality, this texture isn’t displayed directly on the screen but is first sampled and copied to the swapchain, so the Render Graph adds a hidden pass for this. When this texture hasn’t been assigned to any texture, the swapchain will be colored with the clear value set to black and sent to the screen. Push Constants Supported I’ve added the ability to use Vulkan Push Constants. Push Constants are data packets that can be sent to the GPU in parallel with the drawing command. Their size is very limited, 128 bytes, but their transfer speed is extremely fast. A hardware limitation is that the offset and size parameters must be multiples of four, so I used a struct called Words32 to dictate the 32-bit size and offset, not the 8-bit one. Furthermore, internally, the engine checks the state of the previous push constant for each push constant update, so as not to make unnecessary updates and to register the push constant command only when necessary, and only partially for the relevant bytes. Shaders Improvements I improved the shader code a bit by reducing the arguments needed to create a shader, and I also unified the layout; all shaders use the same VkPipelineLayout . The Problem and The Solution When I was writing the shaders to get these things on screen, I ran into errors telling me I was assigning a buffer descriptor to Descriptor Set 0 with binding 0, even though they’re actually textures. However, in the shader, I wasn’t requesting any of this, since the vertex data was written directly into the shader. After some research, I discovered that Slang shaders were creating bindings for these arrays outside the shader. To fix this, I simply moved the arrays into the vertex shader function, marking them with const. And note that all these images/videos use the swapchain pass, so this was all just a test. Now I’ll have to try declaring a real pass with Render Graph and try to draw something, hoping everything works correctly :/
DEVLOG 20 - A Better Triangle Intro Hi Stardance! This triangle was created with Render Graph . The entire process is divided into two steps: the first draws the triangle on a user-selected image, and the second takes that image, samples it, and draws it on the swapchain so the triangle can be seen on screen. Clean and Simple API The beauty of this is evident in the photo (third attachment). You only need to write a few lines of code to achieve all this compared to the complexity and number of lines of code required by Vulkan. Render Graph thus creates all the resources needed for synchronization, such as barriers , and attempts to alias memory whenever possible. It also leverages Resource Pooling , so images aren’t destroyed and recreated at every frame. Instead, if they have identical requirements, they are reused, avoiding unnecessary Vulkan calls. MSAA Deprecated MSAA images have been deprecated because, from a desktop computer perspective, they aren’t worth using because they require a lot of computational resources. To achieve anti-aliasing, it’s best to use post-processing passes that use FXAA (Fast Approximate Anti-Aliasing) or TAA (Temporal Anti-Aliasing). There are probably some bugs still present in the Render Graph despite the many already fixed; I’ll work on them.
DEVLOG 21 - ECS Refactoring Intro Over the past ten hours, I’ve worked extensively on the ECS , making it more robust, easier to use, more secure, and more efficient. What’s changed: New Way To Record Entity Commands Entity Command Pools are still used, but they’re managed not by the user but by the Entity Manager. The old CreateCommandPool() method no longer exists. Now, to execute a command on entities, you make a request to the EntityManager , which takes the command and places it in an EntityCommandPool of its choosing. The EntityCommandPool is chosen based on the SystemId provided by the engine with methods like Start, Awake, Update, etc. This reduces complexity and allows for systems that can run natively in parallel on multiple threads. Improved Efficiency Internally, the Entity Manager has improved the way to compact batches after command execution, making it simpler and faster. Instead, iterating over all batches only iterates on the entities that are no longer valid, and those slots are refilled with the components of the valid entities at the end of the last batches. Batch creation and destruction is handled automatically by the EntityManager . New Way To Query Tables The way to find tables with certain requirements has improved; the old method required registering a query and then returning a “ticket” used to access the query results. The operation is now simpler and more unified: The EntityManager is asked for all tables that meet the QueryInfo structure requirements, such as the archtype. The EntityManager checks whether the query already exists; if it doesn’t, it calculates it on the fly and returns it. Queries Updated Only When Needed Queries are updated only when tables are created/destroyed; otherwise, they remain - static and aren’t updated, saving calculations . The next step will be to verify if everything works, since I haven’t tested anything yet because I’m forced to do this devlog due to the ten-hour time limit. :/ Sorry about the picture, it’s the same, I didn’t have time to do anything else
DEVLOG 22 - ECS Bugs Fixed, Graphics Files Reorganized Hi Stardance! What I Did In this dev log, I fixed some of the last bugs the ECS code, so it now works and is very efficient. I ran several tests destroying, creating, and moving entities from one archtype to another, and everything works. I then worked on the project structure of the graphics part by fixing the graphics include files. What Went Wrong These updates mentioned so far have been successful. Two hours ago, I added a method in the graphics pass responsible for instanced drawing, so I took advantage of the opportunity to create a buffer to read the instance positions to see if it worked. I still don’t know why, but it doesn’t work. The application freezes, and sometimes the driver crashes (it scared me a little… :/ ). The Validation Layers don’t report anything wrong… So I need to figure out what’s wrong and fix it. The image shows some of the methods available after fixing the folders. The methods are in the Graphics class in the include folder.
DEVLOG 23 - Instanced Draw & Some Fixes Intro Devlog time!! In the last devlog, I had some issues with instanced drawing and reading a position buffer. What Was The Problem? I worked hard, but I managed to figure out where the problem was and fix it. (The problem was due to a for loop responsible for creating the address buffers. I was saving pointers outside the for loop with structs allocated inside the for loop; therefore, the pointers were pointing to corrupted memory or nothing.) Render Graph Fixes I fixed several things in the Render Graph that could cause future problems. I added small guards within the Render Graph so that if the user does something wrong, the application doesn’t crash unexpectedly. For example, previously, if the user set a texture to display that they’d never used (never involved in a transfer operation, never used as a graphic attachment), the program would crash. With these simple guards, everything is solved. Easier Resource Usage Declaration I’ve also added the ability to easily declare textures and buffers usage in the Graphics Pass class with dedicated methods like UseBufferReadOnlyVertex(...) , UseTextureVertex(...) , and others. The image shows a grid of 20x20 quad meshes drawn with a single draw call instead of 400 using instanced draw.
DEVLOG 24 - Error Manager, Copies & More Intro Hi Stardance! Lately, I’ve been focusing mainly on improving error handling returned by Vulkan and fixing some code here and there. New Error Manager System I’ve created a system responsible for error handling so that when an error occurs, such as a failure to allocate memory due to fragmentation or any other critical error, the app places a text file with information about the error in a folder called logs (created on the fly if it doesn’t exist). Immediately afterward, an error message is displayed on the screen explaining what happened. When the user presses the OK button, the app closes in the pop-up by calling std::abort(); . Some Test On Other PCs I tried running Eve outside of my PC on two other PCs, but since they’re a bit older, they don’t have support for Vulkan 1.4, so the app can’t be started. Swapchain Improvements The code for creating the swapchain has been improved somewhat, making it more secure and robust. New Copy Support I’ve added support for buffer and texture copy operations between resources that aren’t the same type (one transient and one persistent). Next Step: I want to make Eve a little more portable, so in the next few hours I’ll try using Vulkan 1.2, trying not to mess with the code. If necessary, I might resort to using Vulkan 1.3; I’ll see…
DEVLOG 25 - Eve is “Multi PC” Hi everyone! What’s changed since last time? More Device Supported As promised, Eve now uses Vulkan 1.2, so it can be used on multiple devices. Obviously, the device requires that, in addition to supporting Vulkan 1.2, it also supports some extensions that became core in Vulkan 1.3. Tests On Other PCs I then tried running the app on the only PC I had at home, but it crashed. I then tried updating the graphics driver, but that didn’t help; unfortunately, that PC is too old. I then asked a friend of mine to test the app. After fixing some issues, it started, but it would crash instantly. After hours of debugging, I found the problem: the problem was in resource allocation within the Render Graph, which only occurred with integrated GPUs (my heap selection algorithm for integrated GPUs was wrong). It’s now fixed. I also added my checks for failed Vulkan or VMA calls in places where they were missing, so now everything should work properly. Math Packet In Eve I also added a small mathematical component to Eve, including Vector2,3,4 ; Vector2Int,3Int,4Int ; Quaternion ; and Matrix4x4 . I must say that quaternions were difficult to understand at first, but once you understand how they work, it’s very easy to visualize them in your head. The first attachment shows Eve running on the PC of this friend of mine, whom I thank so much for his help, and the second image shows Eve running on my PC.
DEVLOG 26 - Input System Hi Stardance! The New Input System Since I couldn’t interact much with the graphics engine at the moment, I chose to create an Input System that currently only supports keyboard and mouse. It has methods like IsKeyDown(...) , GetMouseState(...) , IsMouseUp(...) , and similar ones. It’s quite simple, but it allows you to interact with the world, for example by creating a camera or a moving player. The Cube For fun and to test a bit, I tried creating a scene with a slightly rotated cube with direct light, obviously using my Render Graph, which allows you to do all this in about 150 lines of code (CPU side) instead of having to manually write barriers, configure passes, and many other repetitive tasks. I’m still using glm for matrix math, but I’m trying to reach a more stable level with the Eve package.
DEVLOG 27 - Material System Intro After some code rewrites, such as the separation between shaders and materials, the materials system now works. It’s very similar to how it works in Unity. I’ve figured out how to set things like material properties (floats, integers, vectors, etc.) directly from C++ using their names, without manually binding code. How Vulkan Handle All Of This? In Vulkan, you can’t set a shader parameter directly with a name. You need to create a buffer on the GPU, specifically a UBO, typically used for materials, bind it using a descriptor, and then bind it on the CPU. All of this is hidden by Eve, making the code easier and faster to write. What It Does? Basically, once the shader is compiled, it’s analyzed and checked for a struct called Properties. If it exists, this struct will be used for the material properties. Each field within it will be settable directly from the CPU using its name. Eve, now knowing the size of the struct and the field offsets, creates a buffer for the materials (actually, one for each frame in flight) and uses it to write everything a material might need, thus allowing for very simple parameter setting. How To Use It: The material provides an ID via the GetPropertyUBOId function, which must always be retrieved at each frame since it is not the same from frame to frame. This ID can be sent to the shader via push constant, which then allows access to the material’s property UBO, which contains all the values set on the CPU side. A simple cube rotating on itself using the new Material System and simple direct lighting
DEVLOG 28 - New Render System Hi Stardance! Intro I think this devlog is consistent with the next one I’m working on, since the work I’ve done in the last few hours isn’t quite finished, as there are still some bugs to resolve… Why a new render system? So far, I’ve been working on improving Eve’s rendering system. Instead of having to manually create buffers and the like, Eve has a completely automated system similar to the one used by Unity. For example, when you try to draw an object, you need things like object transformation matrices. If you then need more data, the limited size of push constants is no longer enough. Per Instance Params Eve, therefore, with its new rendering system, revolutionizes the way we write code, reduces bugs, and simplifies it. For each draw call sent to the GPU, the engine sends a buffer called InstanceParams to the GPU, which contains, for each drawing instance, its model matrix and its inverse. These matrices can then be retrieved using simple, custom functions ready for use in the shader. Per Render View Data For camera data, the process is similar. For each RenderView object, Eve allocates these objects on the GPU in a contiguous buffer from which the view, perspective, VP, and other matrices can be accessed. Custom Draw Info Data If you want to send custom data to the shader, each drawing function offers a pointer called DrawInfo that allows you to send data to the shader, which can then be accessed. If set to null, the shader will not send anything. GLM & A Flycam I also created a flycam and deprecated the Eve math package to use the glm one. Honestly, I want to focus on Eve and not the math, which is why I chose this option. Next Step: I still have some bugs to fix regarding making more than one draw call, but I’m working on it.
DEVLOG 29 - 1M Entities! Hi Stardance! Intro Since the last day, I’ve been working alone and have run into several issues… Most of them have been resolved. Some Tests So I started running some tests to check the speed of my new rendering system, and with 100,000 entities drawn to the screen with a single draw call, I was getting 30 FPS. After parallelizing the code a bit and reducing the copies, the results are now better: 100,000 entities with single draw calls get 50-60 FPS. 100,000 entities with a single instanced draw call get 230-250 FPS. 1,000,000 entities with a single instanced draw call get 30 FPS. What Need To Be Optimized Actually, I could optimize even more and double these FPS, but the current problem is that I’m calculating the matrices on the CPU side, so I’m doing a lot of calculations that currently take up a good portion of the necessary CPU time, about 50%. The idea would be to move all the work to the GPU in the future with compute shaders, thus significantly reducing the CPU load. I’ll see if I can do this… Maybe in a while, when I add full support for compute shaders. (I have a Ryzen 5 5600 X and an RX 6600) Rendering System Time: Not counting the matrices, the rendering cycle along with the Render Graph takes about 2-2.5 ms, almost all of which is spent on the Render Graph. I have also fixed some problems with Swapchain Recreation when the window is minimized. Problems With RenderDoc Five of these eight hours have been pure frustration, as I don’t understand why, but the app crashes on RenderDoc. Normally, on my PC it starts and works, but on RenderDoc it crashes… I’ve tried every way to understand the problem, but unfortunately I haven’t been able to. I’ll also test on other PCs to better understand the problem. Unfortunately, I don’t have time on my side, so I’ve had to put the issue aside for now…
DEVLOG 30 - Compute Shaders Hi Stardance! Intro I’ve finally implemented compute shaders—as the title suggests—alongside conducting some tests and reorganizing the project. Compute Shader Support I’ve added support for compute shaders, meaning they can now be used just like any other type of pass, whether graphics or transfer. Optimizations I’ve also utilized compute shaders internally within the engine to speed up matrix calculations; here are the results: With 100,000 entities using instanced rendering, I’m getting 800 FPS, up from the previous 250. With 1,000,000 entities using instanced rendering, I’m getting around 90 FPS, up from the previous 30. With 100,000 entities using independent draw calls, I’m getting around 90 FPS, up from the previous 30. I’d say the results speak for themselves, and I’m quite happy with these optimizations. As mentioned in the previous devlog, testing was performed on my PC, which is equipped with a Ryzen 5 5600X and an RX 6600. Swapchain & CMake I also made slight modifications to the swapchain recreation code to make it faster and reduce stuttering. Finally, I tidied up the CMakeLists file to make it more organized and prepare for the release. The video shows a scene with 1M entities rendered in real-time using instanced draw call at 90 FPS
DEVLOG 31 - It’s not my fault! Hi Stardance! Unlike the other devlogs, this one is very quick and simple. A Little Recap In devlog 29, I encountered some issues with RenderDoc, even though the app kept running fine and caused no problems outside of RenderDoc itself. What I Did After doing some online research, I discovered that RenderDoc has issues with AMD drivers, which can cause the app to crash. So, I decided to try AMD’s Radeon Developer Tools (a profiler similar to RenderDoc, designed specifically for AMD GPUs). No errors were reported and everything works perfectly, so the problem most likely lies in how AMD drivers interface with RenderDoc.
DEVLOG 32 - UI Support Hi Stardance, Intro I’ve been working on the UI lately, as I wanted to give the user a way to interact with the engine beyond just mouse and keyboard input. The UI in Eve I opted for Dear ImGui and created a lightweight wrapper that allows it to run within Eve. I stripped away some of the boilerplate code associated with the standard Begin and End calls, making it slightly simpler and safer to use than raw ImGui. I also added support for dockable windows. The video shows a scene with 1,000 cubes; thanks to the UI, you can modify their color, position, and rotation. You can also change the direction of the direct light. The code required by this UI is just five lines.
DEVLOG 33 - Meshes & Fixes Hi Stardance! Intro We’re getting closer to the release build of Eve! I have to say that with this devlog, the engine is practically finished and ready for shipping; I just need to tweak a few final details and we’re all set… Meshes: In this devlog, I worked on the mesh system—fleshing it out and making it functional—and added standard meshes to Eve: a cube, a UV sphere, an icosphere, a plane, and a quad. Some Bugs Fixed While implementing this, the program kept crashing for no apparent reason; after two hours of debugging, I found the error in the Render Graph—caused by the order of Eve’s internal passes—which is now fixed. Internal Shaders Organization I also embedded the engine’s internal shaders directly into the executable, so there’s no need to remember to include them alongside the executable when creating an app. The video shows the same UI as the previous devlog—featuring controls for color, rotation, cube position, and direct light direction—but this time, you can change the meshes of the “thousand-odd” cubes at runtime using the standard Eve meshes listed above, via a simple UI dropdown menu.
DEVLOG 34 - Icon, Windows & More Hi Stardance! Intro The release is getting close, so I’m tidying up a few final details; I’ve finally turned my attention to a slightly more relaxed and lighthearted part of the project. Engine Settings I added a method to start the engine that accepts configuration settings for how the app runs. You can also choose whether or not to enable VSync at runtime. Window Class I added a window management class that allows for various operations, such as toggling fullscreen mode and manually changing the resolution, position, title, etc. I also included a method to set the window icon using a PNG image. Eve’s Icon I also spent some time on Canva trying to create an icon—a logo—for Eve. After several attempts, I settled on the one in the attachment.
DEVLOG 35 - Documentation Hi Stardance! Intro I’ve finally finished writing the documentation for Eve—a rather tedious and repetitive process, but a necessary one. How The Docs Is Structured: Every part of the engine is documented; inside the docs folder, you’ll find instructions on how to launch the engine, along with subfolders for each component—graphics, input, window management, and so on. Next Last Steps: I still need to create the README and tidy up a few things in the project, as well as write instructions on how to configure Eve for use on one’s own PC… But after a whole summer, I’m finally close to shipping!
DEVLOG 36 - Black Hole! Hi Stardance! Intro I’ve been working really hard lately, and I think I’ve reached a milestone with Eve that I honestly never expected to hit. The project is finally complete; now I just need to click that nice button to ship it. I’ve spent this time working on the README, improving the documentation, fixing bugs, and building a demo using Eve. Eve Demo The demo is a gravity simulation featuring hundreds of thousands of entities orbiting a black hole. You can tweak various parameters—such as time, the black hole’s gravitational pull, lighting, colors, meshes, and much more. If you’d like to test it out, you can find it in the GitHub releases; there’s a ready-to-use .exe, or the source code if you’re on Linux—or if you simply want to understand how Eve works or make some modifications yourself. Problems Encountered While building the demo, I ran into—and have since resolved—some very frustrating bugs, such as memory corruption in the ECS caused by the continuous creation and destruction of entities and their components. I also added UI text support and implemented the ability to register “stages” belonging to classes or structs that can be called by the engine.
Ships:
Eve is a graphics engine written entirely in Vulkan , with the primary goal of learning Vulkan and C++ while simplifying their usage. Originally conceived as a simple, lightweight wrapper around Vulkan , Eve now includes: A Render Graph designed from scratch that leverages technologies such as memory aliasing (where multiple resources share the same memory space) and resource pooling (reusing resources across frames). It performs the core function of a Render Graph: by simply knowing how resources are utilized, it automatically issues the necessary synchronization barriers to the GPU. Developing the Render Graph was a grueling process, but it proved worthwhile in terms of both performance and the educational value of the experience. An ECS (Entity Component System) also designed from scratch, following the model of Unity’s DOTS ECS . Instead of scattering resources across VRAM—which slows down access due to constant memory jumps—game objects are organized into Archetypes. Components are distributed in contiguous memory batches, thereby minimizing cache misses. A rendering system that automates the insertion of transforms into buffers; these are subsequently processed into matrices via a compute shader and sent to the rendering shaders. It also features a material system that analyzes shader composition, looking for a struct named “Properties” that allows fields to be assigned by name from the C++ side. Support for the Slang shading language with a bindless system . Eve provides a file named Eve.slangh that simplifies and automates the retrieval of textures, buffers, and samplers from descriptors. Compute shader support is also included. An integrated, easy-to-use Input system inspired by Unity’s Input System , along with a lightweight UI wrapper that makes using Dear ImGui simpler and more intuitive. Eve also includes a demo featuring a gravitational simulation of thousands of entities orbiting a black hole, allowing various parameters to be adjusted in real-time....
|
1793008124.1295273
|
1793094524.1295273
|
|
20495
|
Hangman by @thanEay | Stardance
|
thanEay
|
1
|
17.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T20:49:03Z", "hours": 17.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Ready to ship my project! Try it at https://hangman.epin.to This is my hangman project. I put a lot of time into this project, written in Python. While it may look simple, there is a lot of nuance and thought put into it. For example, you can guess single letters, guess entire words, choose a random word to guess, or enter one yourself for a friend to guess. I have been learning Python for a few months and decided that a project like this had just enough complexity that I would learn but not enough that I would give up. Although this project has been completed for months, I procrastinated shipping it until now. I hope that you like it!", "repo": "https://github.com/thanEay/hackclub-hangman", "demo": "https://hangman.epin.to"}]...
|
[{"post_id": 16461, "ts": "202 [{"post_id": 16461, "ts": "2026-06-26T19:59:09Z", "hours": 2.4122, "text": "After much work, it is time to ship my project! Updated demo at hangman.epin.to . This project has taught me a lot about making working projects in Python. I only started learning Python at the beginning of this year, and this is the largest coding project that I have completed so far. It may not seem like a lot, but I put many hours into this code. Much of that time was fun, spent coding the main flow of the code. But eventually, the last few hours of this project went into debugging, trying to catch edge cases, and improved user messaging. So what have I worked on since my last devlog? Mostly implementing a way to disable the counter to play just for fun with infinite guesses. It is accessed by putting an exclamation mark before the mode input (like !m for manual or !r for random). Because no counter is going up, no hangman is displayed. I also changed some player messaging to make things clearer. When a correct letter is guessed, the 1-based location(s) in the word is printed rather than the 0-based indexes that Python uses for its lists. Finally, ‘!’ by itself is rejected as a guess. If it is input, the user will get a message saying that ‘!’ alone is not an acceptable input."}, {"post_id": 15443, "ts": "2026-06-25T03:07:41Z", "hours": 4.1822, "text": "Live demo hosted on Nest at hangman.epin.to . I made lots of progress, as you can probably tell with the amount of time it took. I added functionality for guessing entire words, which took about half of my four logged hours. Also, when the word is guessed correctly, the sprite changes to the man falling off of the gallows and saying ‘thanks’. To guess entire words, you put an exclamation mark at the beginning of your answer. Otherwise, only single letters are accepted. For example, to guess ‘stardance’ all at once rather than one letter at a time, you would enter ‘!stardance’. If a word guess is incorrect, the counter for tries left goes down one, just like it would for guessing an incorrect letter. I also updated some of the user prompts to make them more clear, as well as printing out all already guessed answers (letters and words) after any letter input (correct or incorrect) or incorrect word guesses so that the player can better guess correct words/letters. The reason that this project, despite its apparent simplicity is taking so long is the little features. For example, I added different messages based on different conditions (Have letters and/or words been guessed? If only one has, change the already guessed printed message to match.) TODO: Add the ability to turn off the counter so that the game can be played without a guess limit."}, {"post_id": 13768, "ts": "2026-06-22T15:52:50Z", "hours": 2.8817, "text": "Sprites added. Sprites are saved as a list of multi-line strings in ascii_sprites.py. As the name implies, the sprites are completely ascii and printable to the terminal. Additionally, now if the word has spaces, the printed characters will contain a space in the given spot. For example, ‘hack club’ will be ____ ____ instead of nine unbroken underscores. Letters that have been guessed already are printed out when an incorrect answer is chosen. I might change it to always tell you regardless of an incorrect answer to make it easier to guess. TODO: I need to add the ability to guess an entire word. I would also like to add a sprite change if the player guesses correctly. Maybe the guy would be released from the gallows or something."}, {"post_id": 11730, "ts": "2026-06-19T03:14:35Z", "hours": 1.6522, "text": "Working prototype completed! At this point, all text-related functionality is present. You can enter characters that show up more than once in a word, and it won’t throw errors. I spent the better part of a half hour trying to find out why most times I would enter a letter, it would say that there were none of that letter in the word. This was clearly a bug, as it happened even when entering a letter for a manually chosen word (showing that I wasn’t just an abysmal letter guesser). It turned out that the lack of two characters caused my problem. In my check_letter() function, it creates different letter location lists depending on whether there is one or more instances of that letter in the word. The code is like this. def check_letter(word: str, letter: str) -> list: if isinstance(letter, str) and len(letter) == 1: locations = [] if word.count(letter) == 1: locations = [word.find(letter)] elif word.count(letter) > 1: # BUG found here! elif was an if statement for index, character in enumerate(word): if character == letter: locations.append(index) else: locations = [-1] return locations # If letter is not in the word, will result in index of -1 The comment that starts with ‘BUG’ shows where the problem originated from. Any word with a single instance of a letter returned [-1] because if word.count(letter) > 1 would always override an intended single element list. Now, I need to add hangman sprites that will progress as you choose correct or incorrect answers, probably using ASCII characters."}, {"post_id": 11272, "ts": "2026-06-18T13:07:08Z", "hours": 2.6856, "text": "Last day of school, and even more coding! I have a mostly working prototype that can be seen below. There is no hangman sprite yet, but most of the functionality is here. Main.py has been expanded greatly. Now you can choose the game mode and enter characters. It also displays blank, unknown characters as ‘_’ and shows known characters as their letters, printing again after every input. A major bug that remains is that if a word has two identical letters (like ‘a’ in Stardance), only one can be input and uncovered. This is due to code that was meant to prevent people from doing the same wrong answer twice, but it also prevents entering the same right answer twice. This is the culprit code. In the looping code (counter does not go up in the current version, it is mostly a placeholder): while counter < 10: user_input = input(\"Enter another letter: \") if user_input.strip().lower() in already_guessed: print(\"You already guessed that letter.\") continue # Goes to next loop In the ask_for_letter() function, only a single instance of a letter is uncovered, even if the letter appears more than once. index = check_letter(word, letter) if index != -1: already_guessed.append(letter) message = f\"{letter} is in the word at index {index}.\" uncovered_indicies.append(index) return index, message check_letter() only returns a single index, which then only uncovers a single letter in the word. I need to fix this by giving the functions the ability to take and return multiple indexes. The image below shows an example of the current code. The word is ‘cryptic’, but the last ‘c’ cannot be selected. Assuming the word doesn’t have two of the same letter, when the word is guessed the following message is printed: You guessed the word: {secret_word}. Congratulations! 🎉"}, {"post_id": 10869, "ts": "2026-06-17T20:30:12Z", "hours": 1.5619, "text": "It is the second to last day of school, and that means a lot of free time to code! I worked on more functions that I will use, and I added docstrings for everything. I have an ask_for_letter() function that will do the heavy lifting for the hangman logic to keep a clean main.py. So far in main.py, I have logic to choose the word. I will expand main.py, but most of the logic will be kept in functions."}, {"post_id": 10414, "ts": "2026-06-17T03:21:09Z", "hours": 1.2764, "text": "I got a great start to this project. I wrote some functions that I will need to call in main.py, specifically one to ask the user for manual or random word choice, one to check the location of a letter in a word, and to choose a random word. I am trying to follow some best practices for Python, like functions in a separate file, docstrings, return type annotations, and descriptive errors. Next, I will finish up some of the major functions and start on main.py."}]...
|
Title: Hangman by @thanEay | Stardance
Devlogs:
I Title: Hangman by @thanEay | Stardance
Devlogs:
I got a great start to this project. I wrote some functions that I will need to call in main.py, specifically one to ask the user for manual or random word choice, one to check the location of a letter in a word, and to choose a random word. I am trying to follow some best practices for Python, like functions in a separate file, docstrings, return type annotations, and descriptive errors. Next, I will finish up some of the major functions and start on main.py.
It is the second to last day of school, and that means a lot of free time to code! I worked on more functions that I will use, and I added docstrings for everything. I have an ask_for_letter() function that will do the heavy lifting for the hangman logic to keep a clean main.py. So far in main.py, I have logic to choose the word. I will expand main.py, but most of the logic will be kept in functions.
Last day of school, and even more coding! I have a mostly working prototype that can be seen below. There is no hangman sprite yet, but most of the functionality is here. Main.py has been expanded greatly. Now you can choose the game mode and enter characters. It also displays blank, unknown characters as ‘_’ and shows known characters as their letters, printing again after every input. A major bug that remains is that if a word has two identical letters (like ‘a’ in Stardance), only one can be input and uncovered. This is due to code that was meant to prevent people from doing the same wrong answer twice, but it also prevents entering the same right answer twice. This is the culprit code. In the looping code (counter does not go up in the current version, it is mostly a placeholder): while counter < 10: user_input = input("Enter another letter: ") if user_input.strip().lower() in already_guessed: print("You already guessed that letter.") continue # Goes to next loop In the ask_for_letter() function, only a single instance of a letter is uncovered, even if the letter appears more than once. index = check_letter(word, letter) if index != -1: already_guessed.append(letter) message = f"{letter} is in the word at index {index}." uncovered_indicies.append(index) return index, message check_letter() only returns a single index, which then only uncovers a single letter in the word. I need to fix this by giving the functions the ability to take and return multiple indexes. The image below shows an example of the current code. The word is ‘cryptic’, but the last ‘c’ cannot be selected. Assuming the word doesn’t have two of the same letter, when the word is guessed the following message is printed: You guessed the word: {secret_word}. Congratulations! 🎉
Working prototype completed! At this point, all text-related functionality is present. You can enter characters that show up more than once in a word, and it won’t throw errors. I spent the better part of a half hour trying to find out why most times I would enter a letter, it would say that there were none of that letter in the word. This was clearly a bug, as it happened even when entering a letter for a manually chosen word (showing that I wasn’t just an abysmal letter guesser). It turned out that the lack of two characters caused my problem. In my check_letter() function, it creates different letter location lists depending on whether there is one or more instances of that letter in the word. The code is like this. def check_letter(word: str, letter: str) -> list: if isinstance(letter, str) and len(letter) == 1: locations = [] if word.count(letter) == 1: locations = [word.find(letter)] elif word.count(letter) > 1: # BUG found here! elif was an if statement for index, character in enumerate(word): if character == letter: locations.append(index) else: locations = [-1] return locations # If letter is not in the word, will result in index of -1 The comment that starts with ‘BUG’ shows where the problem originated from. Any word with a single instance of a letter returned [-1] because if word.count(letter) > 1 would always override an intended single element list. Now, I need to add hangman sprites that will progress as you choose correct or incorrect answers, probably using ASCII characters.
Sprites added. Sprites are saved as a list of multi-line strings in ascii_sprites.py. As the name implies, the sprites are completely ascii and printable to the terminal. Additionally, now if the word has spaces, the printed characters will contain a space in the given spot. For example, ‘hack club’ will be ____ ____ instead of nine unbroken underscores. Letters that have been guessed already are printed out when an incorrect answer is chosen. I might change it to always tell you regardless of an incorrect answer to make it easier to guess. TODO: I need to add the ability to guess an entire word. I would also like to add a sprite change if the player guesses correctly. Maybe the guy would be released from the gallows or something.
Live demo hosted on Nest at hangman.epin.to . I made lots of progress, as you can probably tell with the amount of time it took. I added functionality for guessing entire words, which took about half of my four logged hours. Also, when the word is guessed correctly, the sprite changes to the man falling off of the gallows and saying ‘thanks’. To guess entire words, you put an exclamation mark at the beginning of your answer. Otherwise, only single letters are accepted. For example, to guess ‘stardance’ all at once rather than one letter at a time, you would enter ‘!stardance’. If a word guess is incorrect, the counter for tries left goes down one, just like it would for guessing an incorrect letter. I also updated some of the user prompts to make them more clear, as well as printing out all already guessed answers (letters and words) after any letter input (correct or incorrect) or incorrect word guesses so that the player can better guess correct words/letters. The reason that this project, despite its apparent simplicity is taking so long is the little features. For example, I added different messages based on different conditions (Have letters and/or words been guessed? If only one has, change the already guessed printed message to match.) TODO: Add the ability to turn off the counter so that the game can be played without a guess limit.
After much work, it is time to ship my project! Updated demo at hangman.epin.to . This project has taught me a lot about making working projects in Python. I only started learning Python at the beginning of this year, and this is the largest coding project that I have completed so far. It may not seem like a lot, but I put many hours into this code. Much of that time was fun, spent coding the main flow of the code. But eventually, the last few hours of this project went into debugging, trying to catch edge cases, and improved user messaging. So what have I worked on since my last devlog? Mostly implementing a way to disable the counter to play just for fun with infinite guesses. It is accessed by putting an exclamation mark before the mode input (like !m for manual or !r for random). Because no counter is going up, no hangman is displayed. I also changed some player messaging to make things clearer. When a correct letter is guessed, the 1-based location(s) in the word is printed rather than the 0-based indexes that Python uses for its lists. Finally, ‘!’ by itself is rejected as a guess. If it is input, the user will get a message saying that ‘!’ alone is not an acceptable input.
Ships:
Ready to ship my project! Try it at https://hangman.epin.to This is my hangman project. I put a lot of time into this project, written in Python. While it may look simple, there is a lot of nuance and thought put into it. For example, you can guess single letters, guess entire words, choose a random word to guess, or enter one yourself for a friend to guess. I have been learning Python for a few months and decided that a project like this had just enough complexity that I would learn but not enough that I would give up. Although this project has been completed for months, I procrastinated shipping it until now. I hope that you like it!...
|
1793005031.6492102
|
1793091431.6492102
|
|
50654
|
Focus-core by @ashrafmahin10 | Stardance
|
ashrafmahin10
|
2
|
19.0
|
84
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T20:45:57Z", "hours": 17.0, "multiplier": 3.49, "payout": 71, "blessing": "neutral", "text": "I made a timer app where you can set timer, goal, reward, and break time. The challenging part was to rewrite the code after it was flagged with heavy Ai usage. I am proud of getting my own website to set timer. It is recomended to use it in phone or sidebar of computer.", "repo": "https://github.com/Ashraf-999/Focus-core", "demo": "https://ashraf-999.github.io/Focus-core/"}, {"ship_num": 2, "ts": "2026-08-27T02:22:15Z", "hours": 2.0, "multiplier": 5.32, "payout": 13, "blessing": "neutral", "text": "I made a Timer website where you can also set goal, reward, audio, and break. The most challenging part was when the github copilot did some unwanted changes and needed to debug them. I am proud to have my own productivity timer app. People who are trying out my project should use it when they need to do deep work like studying, coding etc.", "repo": "https://github.com/Ashraf-999/Focus-core", "demo": "https://ashraf-999.github.io/Focus-core/"}]...
|
[{"post_id": 68923, "ts": "202 [{"post_id": 68923, "ts": "2026-09-16T01:41:25Z", "hours": 2.2208, "text": "Devlog 6: Rewrote the Css by myself (again) because it looked so vibecoded."}, {"post_id": 66740, "ts": "2026-09-12T17:08:13Z", "hours": 1.135, "text": "Devlog 5: Added some changes to css because it looked so vibe codded."}, {"post_id": 65737, "ts": "2026-09-11T02:35:08Z", "hours": 8.7775, "text": "Devlog 4: I made the previous version with AI. Because it got rejected, I wrote my own code and it is version I made.I only kept the CSS and wrote the html and javascript by myself."}, {"post_id": 57446, "ts": "2026-08-29T16:24:47Z", "hours": 4.7242, "text": "Devlog 3: Just added some button sound and extra time option."}, {"post_id": 55328, "ts": "2026-08-27T02:17:17Z", "hours": 1.8397, "text": "Devlog #2 Finally finished the whole project. Added Audio, notification etc."}, {"post_id": 50542, "ts": "2026-08-19T18:50:23Z", "hours": 0.5422, "text": "Devlog #1 I made a productivity website where you can set timer, add goal, and add rewards. I also made it mobile friendly so you can set the timer from your mobile. I notice that it is satisfying to see a progression bar increasing, so I added it as a feature. I am planning to add notification, desktop app, streak, time tracking, audio option etc feature in the future. Suggest me some feature you like to see and also tell me if you are looking forward to use this website or not. I used chatgpt to write prompt and brainstorm ideas, and Copilot to build the actual thing, but the idea and description was mine."}]...
|
Title: Focus-core by @ashrafmahin10 | Stardance
D Title: Focus-core by @ashrafmahin10 | Stardance
Devlogs:
Devlog #1 I made a productivity website where you can set timer, add goal, and add rewards. I also made it mobile friendly so you can set the timer from your mobile. I notice that it is satisfying to see a progression bar increasing, so I added it as a feature. I am planning to add notification, desktop app, streak, time tracking, audio option etc feature in the future. Suggest me some feature you like to see and also tell me if you are looking forward to use this website or not. I used chatgpt to write prompt and brainstorm ideas, and Copilot to build the actual thing, but the idea and description was mine.
Devlog #2 Finally finished the whole project. Added Audio, notification etc.
Devlog 3: Just added some button sound and extra time option.
Devlog 4: I made the previous version with AI. Because it got rejected, I wrote my own code and it is version I made.I only kept the CSS and wrote the html and javascript by myself.
Devlog 5: Added some changes to css because it looked so vibe codded.
Devlog 6: Rewrote the Css by myself (again) because it looked so vibecoded.
Ships:
I made a Timer website where you can also set goal, reward, audio, and break. The most challenging part was when the github copilot did some unwanted changes and needed to debug them. I am proud to have my own productivity timer app. People who are trying out my project should use it when they need to do deep work like studying, coding etc.
I made a timer app where you can set timer, goal, reward, and break time. The challenging part was to rewrite the code after it was flagged with heavy Ai usage. I am proud of getting my own website to set timer. It is recomended to use it in phone or sidebar of computer....
|
1792968501.474987
|
1793054901.474987
|
|
61613
|
ONE TAB by @Devadutt | Stardance
|
Devadutt
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T20:20:19Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I build a Website with google search bar and hyperlinks to some of my favorites sites. The hardest part was setting up the workflow. I messed it up a couple time I misspelled the depoly.yml file and so on. I am happy I made something like this. Thank YOu", "repo": "https://github.com/Devadutt-11/ONE-TAB", "demo": "https://devadutt-11.github.io/ONE-TAB/"}]...
|
[{"post_id": 71432, "ts": "202 [{"post_id": 71432, "ts": "2026-09-20T20:15:00Z", "hours": 1.2419, "text": "completed …..!"}, {"post_id": 71362, "ts": "2026-09-20T18:06:39Z", "hours": 2.1028, "text": "Done some designing and added few hyperlink"}, {"post_id": 70781, "ts": "2026-09-19T19:10:19Z", "hours": 2.3478, "text": "I completed my guide almost correctly.I am looking forward for my next part of the project…!"}]...
|
Title: ONE TAB by @Devadutt | Stardance
Devlogs:
Title: ONE TAB by @Devadutt | Stardance
Devlogs:
I completed my guide almost correctly.I am looking forward for my next part of the project…!
Done some designing and added few hyperlink
completed …..!
Ships:
I build a Website with google search bar and hyperlinks to some of my favorites sites. The hardest part was setting up the workflow. I messed it up a couple time I misspelled the depoly.yml file and so on. I am happy I made something like this. Thank YOu...
|
1793055365.762873
|
1793141765.762873
|
|
61892
|
My Basic Portfolio by @Darknow90 | Stardance
|
Darknow90
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T19:54:23Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I’m very happy to finish this project , I made : -3 categories -A pages for my project -2 pages about me Thanks you for this challenge !", "repo": "https://github.com/Manu7611/MyBasicPortfolio", "demo": "https://manu7611.github.io/MyBasicPortfolio/"}]...
|
[{"post_id": 71411, "ts": "202 [{"post_id": 71411, "ts": "2026-09-20T19:36:09Z", "hours": 0.3167, "text": "DevLog #8 : I made the Readme and I’m ready to ship my project now !"}, {"post_id": 70763, "ts": "2026-09-19T18:36:21Z", "hours": 0.36, "text": "DevLog #7 : I restructured the code a bit and added an icon in front of the bar, but that last session wasn’t very productive… I think I’ll submit my project at this stage and keep improving it once I have new ideas!"}, {"post_id": 70218, "ts": "2026-09-18T18:49:09Z", "hours": 0.3333, "text": "DevLog #6: Hehe NyanCat is here now 🤣. Anything to add at my page ?"}, {"post_id": 69785, "ts": "2026-09-17T19:43:30Z", "hours": 0.7017, "text": "DevLog #5 : Working on css but it’s impossible to make a rainbow animation like 90s 😭"}, {"post_id": 69314, "ts": "2026-09-16T19:41:37Z", "hours": 0.5706, "text": "DevLog #4 : I worked on the css and now I can understand more things ! It’s not very beautiful but for now It’s okay."}, {"post_id": 68810, "ts": "2026-09-15T19:46:43Z", "hours": 1.0628, "text": "DevLog #3 : I found the problem in my code thanks to the comments 🤣. Now I’m trying to improve the aesthetics, but I really don’t see how, lol."}, {"post_id": 68252, "ts": "2026-09-14T19:43:37Z", "hours": 0.65, "text": "DevLog #2 : I’m working on the logic of the js code to switch on each text without make other page but it’s difficult…"}, {"post_id": 67641, "ts": "2026-09-13T19:52:39Z", "hours": 0.2833, "text": "Devlog #1: Sorry , I don’t have a lot of time today 😭. I just set up my index and link the js ,css and my pages of projects…"}]...
|
Title: My Basic Portfolio by @Darknow90 | Stardanc Title: My Basic Portfolio by @Darknow90 | Stardance
Devlogs:
Devlog #1: Sorry , I don’t have a lot of time today 😭. I just set up my index and link the js ,css and my pages of projects…
DevLog #2 : I’m working on the logic of the js code to switch on each text without make other page but it’s difficult…
DevLog #3 : I found the problem in my code thanks to the comments 🤣. Now I’m trying to improve the aesthetics, but I really don’t see how, lol.
DevLog #4 : I worked on the css and now I can understand more things ! It’s not very beautiful but for now It’s okay.
DevLog #5 : Working on css but it’s impossible to make a rainbow animation like 90s 😭
DevLog #6: Hehe NyanCat is here now 🤣. Anything to add at my page ?
DevLog #7 : I restructured the code a bit and added an icon in front of the bar, but that last session wasn’t very productive… I think I’ll submit my project at this stage and keep improving it once I have new ideas!
DevLog #8 : I made the Readme and I’m ready to ship my project now !
Ships:
I’m very happy to finish this project , I made : -3 categories -A pages for my project -2 pages about me Thanks you for this challenge !...
|
1793058497.3861997
|
1793144897.3861997
|
|
57915
|
Hot Potato Catch by @NJstechnigames | Stardance
|
NJstechnigames
|
1
|
7.73
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T19:14:43Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I shall declare this project Finished! Also the password to the devmode is “RaspberryPi1234” (dont use this to cheat)", "repo": "https://github.com/njstechnigames-afk/Hot-Potato-Catch-v1", "demo": "https://njs-technigames.itch.io/the-hot-potato-catch-game"}]...
|
[{"post_id": 72545, "ts": "202 [{"post_id": 72545, "ts": "2026-09-23T05:36:02Z", "hours": 1.0194, "text": "NEW UPDATE: I have redone the textures for the buttons for mobile. As well as that, I’ve added a pause system."}, {"post_id": 71871, "ts": "2026-09-21T17:55:01Z", "hours": 0.7075, "text": "NEW UPDATE!!! the game can now be played on a mobile phone by enabling the mobile phone mode in the settings menu :)"}, {"post_id": 71401, "ts": "2026-09-20T19:12:00Z", "hours": 1.7492, "text": "Added a few new features like a dev mode, (Although i will reveal the password after i ship it :))"}, {"post_id": 69768, "ts": "2026-09-17T19:10:31Z", "hours": 1.165, "text": "finally finished the minigames. time for the lose screen."}, {"post_id": 69710, "ts": "2026-09-17T16:54:24Z", "hours": 2.4069, "text": "i am currently working on the first minigame mechanics."}, {"post_id": 61062, "ts": "2026-09-03T19:38:05Z", "hours": 0.2703, "text": "Created menu screen. And github crashed so the respiratory isn’t linked :("}]...
|
Title: Hot Potato Catch by @NJstechnigames | Stard Title: Hot Potato Catch by @NJstechnigames | Stardance
Devlogs:
Created menu screen. And github crashed so the respiratory isn’t linked :(
i am currently working on the first minigame mechanics.
finally finished the minigames. time for the lose screen.
Added a few new features like a dev mode, (Although i will reveal the password after i ship it :))
NEW UPDATE!!! the game can now be played on a mobile phone by enabling the mobile phone mode in the settings menu :)
NEW UPDATE: I have redone the textures for the buttons for mobile. As well as that, I’ve added a pause system.
Ships:
I shall declare this project Finished! Also the password to the devmode is “RaspberryPi1234” (dont use this to cheat)...
|
1793005046.9169238
|
1793091446.9169238
|
|
33555
|
Rural Coders Society by @-Sophie- | Stardance
|
-Sophie-
|
1
|
12.0
|
252
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T18:58:04Z", "hours": 12.0, "multiplier": 17.99, "payout": 252, "blessing": "neutral", "text": "I made a revamped webpage for Rural Coders Society, a fiscally sponsored project under Hack Club! This was my first time using full blown React for an actual project, so there was a huge learning curve. But I’m really proud with how it turned out! Challenges: Using external libraries like NumberFlow and SplideJS for the first time (lots of documentation to read D:) Gauging what I should make a component and what I should just put on the page Making the card system modular (esp for different amounts of content and such) and streamlining the process of adding cards to the website Using useState for the first (practical) time to make a navbar :0 What I’m proud of: I’m proud that I overcame these challenges despite it being discouraging at times How I was able successfully integrate external libraries and troubleshoot through card issues and being stubborn to not use AI to debug (it was tempting but I know I wouldn’t learn) Using TailwindCSS for the first time and it’s actually so good I don’t think I can return to regular CSS anymore I’m glad I was able to reference other sites on the web and somewhat replicate it with react and tailwind with my own creativity on my own page Using and understanding how to use react routes and Link elements You can check the page out at www.ruralcoderssociety.org ! Thanks for reading :))))", "repo": "https://github.com/gwak-amole/ruralcoderssociety", "demo": "https://www.ruralcoderssociety.org/"}]...
|
[{"post_id": 71368, "ts": "202 [{"post_id": 71368, "ts": "2026-09-20T18:18:33Z", "hours": 1.7058, "text": "FINISHED THE SITE!! I added mobile compatibility The site was looking really good until someone looked on it on their phone or something other than a desktop, so this was the final element to ship it! No more fixed widths The fixed widths, I found, were the culprit for all the breaking when the website was viewed in other dimensions, so I made use of sm:some property and md:some property and lg:some property in tailwind and also w-full and max-w-some number to make the cards flexible depending on the dimensions it’s viewed from NAVBAR I’m really proud of this because I used useState for the first time on an actual website to create the hamburger navigation thing. It opens like a set of links if you click it and the text changes from a three-line hamburger thing to an x. useState is actually amazing so many use cases Challenges The main challenge was just tweaking what text/font sizes should go with sm/md/lg displays–just a lot of trial and error Another challenge was making the hamburger opening look good because the background was only coloring to the height of the navbar,, I realized that I needed to move the appearing navigation outside of the navbar and it worked wonders Future additions Just if the nonprofit gets more metrics or after outreach initiatives it’s apparent we’re missing some important content. but it’s done and I’m going to ship this!!"}, {"post_id": 66091, "ts": "2026-09-11T17:49:29Z", "hours": 1.1672, "text": "Finished About Me Page + program page struggles Finished the about me! It’ s a simple about me page; I got inspiration from other NPO about me pages online! Program Page work in progress I’m trying to use the same components across two pages for information cards on the programs we do, but the cards need to be two different heights. I’ve been hacking at this for a while but I’m going to rest before I try resolving this problem again :’))))) (as you can see the images go off the cards for this second component. I want each card to be a standardized height but differ across pages. gl to me in the future lol) Future additions After I finish adjusting these card heights, my website will be finished! I just need to hook it to our website domain and replace our outdated website!! yayyy"}, {"post_id": 59083, "ts": "2026-08-31T18:09:12Z", "hours": 2.5033, "text": "Added project carousel! React component I used React to make a reusable image carousel thing where you can pass an array of photos as an argument and it will put it into the the SplideJS slides Used SplideJS again Added a featured projects carousel that has some cool projects that our Code Without Borders Bootcamp participants made!! Added arrows to the carousel too Tailwind Added a gradient background for aesthetic purposes :) Challenges I generally had a hard time figuring out how to style the features component–it was really looking rough to start with but we landed on something 😭 I think the gradient helped a lot Additional information I also tweaked styling for the rest of the webpage I added some join buttons and linked the donation page Updated the impact numbers Future additions About to add the proper join form and also get started on the about us page :D"}, {"post_id": 29809, "ts": "2026-07-16T23:01:41Z", "hours": 1.1256, "text": "Added footer + more I added a footer to the home page to make it feel more complete Number animations now the number statistics animate when you scroll upon them. so i attached a video to show u what that looks like. I used the NumberFlow React library–it was pretty intuitive itself but then i had to use useState, useEffect, and useRef hooks and understand how to use those and how to defer the useEffect until the window detects it 😭 😭 u can do it with the native .getBoundingClientRect tho and u have to do it to an element you want to be the trigger, in my case i made the card the trigger, so if it shows then the animation will happen. and then make sure it’s less than window.innerHeight and element’s position.bottom must be greater than 0, which means that the element is below the top edge of ur screen holy yap but this is how i teach myself bc that was something new for me 😭"}, {"post_id": 28588, "ts": "2026-07-14T22:37:09Z", "hours": 0.6417, "text": "Added card types and prop types to specify the kind of card design you want I added different card types, and so now you can switch between them. So CardGrid is extra reusable LOL This is through capitalized variables that I just learned! I could work logic between choosing components using a capitalized variable (yk the one that uses PascalCase)"}, {"post_id": 28564, "ts": "2026-07-14T21:53:38Z", "hours": 0.3922, "text": "Reworked some card grid component logic I heard it’s better to create an array of the props rather than an array of the cards, so after struggling a bit I got to do it the conventional way with array mapping! Not entirely sure what the individual mapping keys are for but I will look more deeply into that. It says online that you have to keep keys stable so that React knows which item you’re referencing but don’t totally understand why it would need to know that lol"}, {"post_id": 28551, "ts": "2026-07-14T21:28:11Z", "hours": 0.8739, "text": "Card Component + Card Grid Both are reusable! Card Component I create InfoCard.jsx component which makes these light blue cards. I used props for the first time, so you can pass in an argument making these components completely reusable across the platform! Card Grid I created an array of cards and then passed them through the Card Grid. I made it so that the cols prop you pass in leads to the amount of columns created with Tailwind CSS by assigning 1 to “grid-col-1” etc etc in an object and then using that for part of the Tailwind CSS for the Card Grid. super simple logic but im still proud nevertheless LOL"}, {"post_id": 26415, "ts": "2026-07-11T06:05:56Z", "hours": 1.3447, "text": "I implemented Splide JS into the website so it could create this photo gallery carousel!! i’m so proud of it! and the syntax for Splide was surprisingly easy and intuitive–I followed a tutorial on Medium to understand how to use it. The home page is already looking more polished."}, {"post_id": 26386, "ts": "2026-07-11T04:30:11Z", "hours": 1.0606, "text": "Added a hero to the website. It’s currently a placeholder, I’m working on a swiping photo gallery as the hero. I also styled everything with tailwind-css because I’m trying to get used to it."}, {"post_id": 26290, "ts": "2026-07-11T00:20:44Z", "hours": 0.8678, "text": "Why is react so painful? anyhow I made a router without styling yet with react-router-dom and so yeah that’s progress :’). I’m getting used to the react-router-dom way of things and having to configure main.jsx and stuff it’s so painful LOL"}]...
|
Title: Rural Coders Society by @-Sophie- | Stardan Title: Rural Coders Society by @-Sophie- | Stardance
Devlogs:
Why is react so painful? anyhow I made a router without styling yet with react-router-dom and so yeah that’s progress :’). I’m getting used to the react-router-dom way of things and having to configure main.jsx and stuff it’s so painful LOL
Added a hero to the website. It’s currently a placeholder, I’m working on a swiping photo gallery as the hero. I also styled everything with tailwind-css because I’m trying to get used to it.
I implemented Splide JS into the website so it could create this photo gallery carousel!! i’m so proud of it! and the syntax for Splide was surprisingly easy and intuitive–I followed a tutorial on Medium to understand how to use it. The home page is already looking more polished.
Card Component + Card Grid Both are reusable! Card Component I create InfoCard.jsx component which makes these light blue cards. I used props for the first time, so you can pass in an argument making these components completely reusable across the platform! Card Grid I created an array of cards and then passed them through the Card Grid. I made it so that the cols prop you pass in leads to the amount of columns created with Tailwind CSS by assigning 1 to “grid-col-1” etc etc in an object and then using that for part of the Tailwind CSS for the Card Grid. super simple logic but im still proud nevertheless LOL
Reworked some card grid component logic I heard it’s better to create an array of the props rather than an array of the cards, so after struggling a bit I got to do it the conventional way with array mapping! Not entirely sure what the individual mapping keys are for but I will look more deeply into that. It says online that you have to keep keys stable so that React knows which item you’re referencing but don’t totally understand why it would need to know that lol
Added card types and prop types to specify the kind of card design you want I added different card types, and so now you can switch between them. So CardGrid is extra reusable LOL This is through capitalized variables that I just learned! I could work logic between choosing components using a capitalized variable (yk the one that uses PascalCase)
Added footer + more I added a footer to the home page to make it feel more complete Number animations now the number statistics animate when you scroll upon them. so i attached a video to show u what that looks like. I used the NumberFlow React library–it was pretty intuitive itself but then i had to use useState, useEffect, and useRef hooks and understand how to use those and how to defer the useEffect until the window detects it 😭 😭 u can do it with the native .getBoundingClientRect tho and u have to do it to an element you want to be the trigger, in my case i made the card the trigger, so if it shows then the animation will happen. and then make sure it’s less than window.innerHeight and element’s position.bottom must be greater than 0, which means that the element is below the top edge of ur screen holy yap but this is how i teach myself bc that was something new for me 😭
Added project carousel! React component I used React to make a reusable image carousel thing where you can pass an array of photos as an argument and it will put it into the the SplideJS slides Used SplideJS again Added a featured projects carousel that has some cool projects that our Code Without Borders Bootcamp participants made!! Added arrows to the carousel too Tailwind Added a gradient background for aesthetic purposes :) Challenges I generally had a hard time figuring out how to style the features component–it was really looking rough to start with but we landed on something 😭 I think the gradient helped a lot Additional information I also tweaked styling for the rest of the webpage I added some join buttons and linked the donation page Updated the impact numbers Future additions About to add the proper join form and also get started on the about us page :D
Finished About Me Page + program page struggles Finished the about me! It’ s a simple about me page; I got inspiration from other NPO about me pages online! Program Page work in progress I’m trying to use the same components across two pages for information cards on the programs we do, but the cards need to be two different heights. I’ve been hacking at this for a while but I’m going to rest before I try resolving this problem again :’))))) (as you can see the images go off the cards for this second component. I want each card to be a standardized height but differ across pages. gl to me in the future lol) Future additions After I finish adjusting these card heights, my website will be finished! I just need to hook it to our website domain and replace our outdated website!! yayyy
FINISHED THE SITE!! I added mobile compatibility The site was looking really good until someone looked on it on their phone or something other than a desktop, so this was the final element to ship it! No more fixed widths The fixed widths, I found, were the culprit for all the breaking when the website was viewed in other dimensions, so I made use of sm:some property and md:some property and lg:some property in tailwind and also w-full and max-w-some number to make the cards flexible depending on the dimensions it’s viewed from NAVBAR I’m really proud of this because I used useState for the first time on an actual website to create the hamburger navigation thing. It opens like a set of links if you click it and the text changes from a three-line hamburger thing to an x. useState is actually amazing so many use cases Challenges The main challenge was just tweaking what text/font sizes should go with sm/md/lg displays–just a lot of trial and error Another challenge was making the hamburger opening look good because the background was only coloring to the height of the navbar,, I realized that I needed to move the appearing navigation outside of the navbar and it worked wonders Future additions Just if the nonprofit gets more metrics or after outreach initiatives it’s apparent we’re missing some important content. but it’s done and I’m going to ship this!!
Ships:
I made a revamped webpage for Rural Coders Society, a fiscally sponsored project under Hack Club! This was my first time using full blown React for an actual project, so there was a huge learning curve. But I’m really proud with how it turned out! Challenges: Using external libraries like NumberFlow and SplideJS for the first time (lots of documentation to read D:) Gauging what I should make a component and what I should just put on the page Making the card system modular (esp for different amounts of content and such) and streamlining the process of adding cards to the website Using useState for the first (practical) time to make a navbar :0 What I’m proud of: I’m proud that I overcame these challenges despite it being discouraging at times How I was able successfully integrate external libraries and troubleshoot through card issues and being stubborn to not use AI to debug (it was tempting but I know I wouldn’t learn) Using TailwindCSS for the first time and it’s actually so good I don’t think I can return to regular CSS anymore I’m glad I was able to reference other sites on the web and somewhat replicate it with react and tailwind with my own creativity on my own page Using and understanding how to use react routes and Link elements You can check the page out at www.ruralcoderssociety.org ! Thanks for reading :))))...
|
1793004745.956177
|
1793091145.956177
|
|
15657
|
Telemetry LMU by @Karlito | Stardance
|
Karlito
|
1
|
178.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T18:45:37Z", "hours": 178.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Telemetry LMU An application for both Windows and Linux to visualize the telemetry data from Le Mans Ultimate What it does: This application collects, stores, and visualizes data from a racing simulator called Le Mans Ultimate. The main goal: Allow users to analyze their driving and learn from their data through an easy-to-use interface. The requirements: Performance, nice and simple UI, expandability, minimal setup. Results: Main goal: Achieved. (I wouldn’t be shipping this app otherwise) Performance: On average the app uses 4% of CPU and 250Mb of RAM under full load. That is less RAM usage than running Spotify in the background. Nice and simple UI: This is personal preference, however in my opinion I think i succeeded. Expandability: The architecture of the app is very modular so this also isn’t a problem. Setup: On windows there is none (except installing the app), on linux there is one dependency (this is sadly unavoidable.) Some stats: 200+ hours of development time (including the time before Stardance) 250+ commits 6 000+ lines of Rust", "repo": "https://github.com/Karlito05/TelemetryLMU", "demo": "https://github.com/Karlito05/TelemetryLMU/releases/tag/v1.0.1"}]...
|
[{"post_id": 71364, "ts": "202 [{"post_id": 71364, "ts": "2026-09-20T18:08:56Z", "hours": 1.2894, "text": "Devlog 29 - The end So this is the last one, huh. Here is the full write up on this project as I promised. Chapter 1 - The beginnings This project started about 3 months ago. I started experimenting with just getting the data and plotting it. Just for fun as an exercise to learn rust. Then I realized that there actually isn’t a proper working telemetry tool that works on linux. So I did some research… and I decided that I am going to make the app in Dioxus. Chapter 2 - The Dioxus era This leads us to the shortest of eras. The Dioxus era. Nothing really happened here and quite frankly I don’t even remember it that much. There aren’t really any git commits because I didn’t have that setup yet. One thing i remember tho is that I couldn’t figure out how to draw the garphs, because Dioxus is based on web technologies but weirdly becuase you are writing HTLM like syntax but in rust. And that was the main reason I decided to switch to Tauri. Chapter 3 - The Tauri era At first Tauri was the best framework ever made for me. That is because I already kinda knew react, it was simple to understand and I could really lean into the split frontend and backend architecture. This sadly proved very inefficient for the graph view which needs to render thousands of points each frame. Since it was too much for the basic HTML canvas I have switched to using WebGL with numerous downsampling techniques. This was just a bandaid fix though. I have also ran into bunch of architectural issues with the whole split frontend and backend thing. Accessing the telemetry data proved to be very difficult and inefficient. I remember that I ran each of the graphs on a separate thread. This was so stupid. I don’t even remember how I could’ve come up with such a stupid idea :D. It just led to memory leaks and threads uncontrollably spinning up and not stopping. I am sure that all of that could’ve been easily avoided with simpler architecture but at that point I was at my lowest point of this project, so I didn’t even have the energy to do it. I also had the state of the frontend so fragmented which didn’t help. And the whole retained mode GUI thing just wasn’t well suited for this kind of app. And that is when I decided to do a complete rewrite in pure rust! Chapter 4 - The sweet EGUI I didn’t know it at the time, but this was the best idea on what to do with the project. I remember that I was very split between just shipping it half done and finishing it just because of how bad the development experience with Tauri was (sorry Tauri devs, it’s not a you thing, it’s a me thing). It took about 30h to fully rewrite the app with EGUI, which looking back at it isn’t too bad. It felt like ages though. It didn’t help that almost none of the work in this “chapter” did AI. Which at the end of the day is better! Although my style of writing EGUI code was let’s say original… I have just put everything into one file and that grew very fast :D. I had like 5 files that were about 800 lines each. That has since luckily changed. (I have adopted more of a React style file structure.) Anyway at the end of the rewrite I kinda started loving EGUI and that hasn’t stopped since. I continued to develop the Map page in EASY which was pretty easy. But then I needed the track limits data for the map page. This was a bit of a roadblock… First I have tried to extract the data directly from the game, however this was inaccurate and the track width was missing entirely. So then I tried to download an up to date image of the top down view of the track and extract the inside and outside line from it and match it to the in game data. This partially worked better, still not great tho. So there was only one option left. And that was to painfully drive each layout of each track by hand. This took almost 7h of just driving in circles. After that it was smooth and buggy sailing until the ship. Everyone who read this, have a beautiful day."}, {"post_id": 71172, "ts": "2026-09-20T12:02:04Z", "hours": 7.2817, "text": "Devlog 28 Today is gonna be a big day, because I will ship the project. There is a few things left to do tho. Mainly the readme and the demo video! In my last and next devlog I will also make a write up on the story of the whole project so far. Besides that I have yesterday refactored the whole codebase so now there aren’t just 5 monolithic files. I went for a more react like approach with the structure being divided into pages and components. Sadly there isn’t enough time until the ship to touch up on some old UI and UX problems in the edit view of the graphs, neither is there time to add more fields. This will be done in the near future! Overall I am very happy how the app turned out. But this is not the end of the development this is just the end of the stardance journey!"}, {"post_id": 70125, "ts": "2026-09-18T14:50:07Z", "hours": 4.7625, "text": "Devlog 27 For the past few hours I have been polishing the app up. The main you’ll probably see are the onboarding dialogs. A global one pops up when you first launch the app and then one for each page when you first enter them. Another change I have done is that I made the ghosts on the map page be based on time and not data point index."}, {"post_id": 68694, "ts": "2026-09-15T15:37:09Z", "hours": 9.5181, "text": "Devlog 26 Hiiiii For the past few hours I have been working on polishing the app and get it to a shippable state overall. There is still work left to do, but I am getting there. I have set up a simple packager, and a simple script to use it. It automatically compiles the release version of the app and packages it into a windows installer a Debian .deb package and a pacman package. I have also (after like 2 hours of struggeling with it) added an Icon for the app. So now it looks nice!There has been a lot of new bugfixes as well and the app has been tested by my friend so it should be somwhat usable, tho the setup UX should be improved upon. If you wish you can download the app from here: https://github.com/Karlito05/TelemetryLMU/releases/tag/v0.2.3 Well that is all I have for you all today, so have a nice one :)"}, {"post_id": 66482, "ts": "2026-09-12T10:09:34Z", "hours": 5.3067, "text": "Devlog 25 I know I have just made a devlog like yesterday but holy s*** the track references work so well. They are practically perfect . Besides the references I have also implemented the delta time between the 2 cars! That has really tied the page together. If I can say so myself, we are getting pretty close to the final ship . There is not much needed to implement. The obvious are bugfixes, and some simple onboarding. But really, that’s it! Everyone who is following or caring about this project can expect a ship in the next week or so. In my final devlog I will also do a writeup on this project as a whole, from the coarse beginnings in Dyoxys, trough Tauri, to the sweet home of EGUI. There will also be a trailer video and a demo for all the raters :D Anyway for now you can have this preview of the map page! Stay tuned!"}, {"post_id": 65936, "ts": "2026-09-11T12:33:33Z", "hours": 6.7664, "text": "Devlog 24 HI! All of the time on this devlog was basically just driving in circles. And I mean that. I have recorded all of the outsides and insides of all tracks in the game to get the data for the map page. It was very teidius and very boring. Like very very boring. There are 31 tracks in LMU (including each layout) and on every one of them I had to do an out lap, the ouside, another out lap and the inside. So 4laps for each. That is about 15min per layout. Yeah it was a long one. And the recordings aren’t perfect either! I will now have to somehow process them all to get them ready for the ship. You can watch the timelapses of this process here if you wish. https://lapse.hackclub.com/timelapse/OQcismBwxbBB https://lapse.hackclub.com/timelapse/le3Lta0RxcUA https://lapse.hackclub.com/timelapse/XRf98OimmUk9 Anyway. Have a nice day!"}, {"post_id": 63016, "ts": "2026-09-06T16:07:27Z", "hours": 7.12, "text": "Devlog 23 - More Refactoring Hi! In the past few days I have been making some core architectural changes to the project and I would like to explain them now. Telemetry Provider I have finally decided on how I am gonna handle telemetry in the long term. It’s a pretty simple concept but the implementation is pretty hard. I have one object (the TelemetryProvider struct) that is in charge of getting and managing the telemetry. Right now it logs data from all cars and stores the best, last and current laps. If you wish it can save only your laps or laps of everybody. Each lap is a json file about 500kB - 1MB in size and holds all the data that can be displayed in the app. Notably the position ( so you can load that lap directly into the map page ) and the data displayed by the graphs (so you can load it as a reference there as well.) Pointer to this struct is distributed to pages that need it so they can access it! The provider has a core logging loop that is running on another thread so the whole UI doesn’t have to redraw each time you log new data. (About 60 times a second.) State and Settings Providers Next, I have implemented a StateProvider and an SettingsProvider . These two are basically a drop in replacement of what was stored in the Sidebar and SettingsPage respectively. Difference between the two is that the StateProvider isn’t stored between app restarts. Similarly to how the TelemetryProvider works, each of the pages that need these values get a shared pointer (or an Arc in rust) and can access the values. What’s next Going further I will keep my focus on the map page. Finish it, and then start polishing the app for the final ship! Wish me luck and have a nice day!"}, {"post_id": 61727, "ts": "2026-09-04T19:26:10Z", "hours": 9.5394, "text": "Devlog 22 Hiiiiiiiiiiiii I have some huge news to tell you. I have just made the MOST complex addition yet. And I love it! I have completely overhauled the accessing and managing the telemetry! I have designed a thread safe way to have it run on a separate thread and be accessible from *every place in the app. One unified API for everything! I now store the current lap and the last lap for each of the cars. Tho this takes up a massive 140mb of just floats (in the worst case scenario) I believe its worth the RAM! (Let’s be real, we have saved over 400mb from the tauri implementation so we can now use some of that!) Next I will continue on further implementing these features around the tool. Anyway have a nice day people and bye bye. Some context to that meme: I have a type in my app that is literally Arc<Mutex<[([f64; TelemetryValueType::Max as usize], Option); 104]»"}, {"post_id": 60204, "ts": "2026-09-02T13:06:23Z", "hours": 9.4931, "text": "Devlog 21 For the past few days I have been working on a new feature. The map page. It is turning out great, however it has a lot of bugs. These will get fix over the next few days. I promise :) There have also been changes made to the lap logging system and some other systems as well. As you can see on the image you select 2 saved laps and can crosscompare the lines you drove. Obviously this is completly useless if you loaded 2 different track like I did here. This will get checked for and prohibited in the future. Next I will add the underlying lap overlay which I will somehow extract from the game or from somewhere else. I don’t really know yet. Well that is it for today. Have a great day and bye bye!"}, {"post_id": 57444, "ts": "2026-08-29T16:23:51Z", "hours": 8.955, "text": "Devlog 20 So I have been polishing up the current features a bit and they are far from done. I am starting to question if i will make it to shipping this app one day :D. Anyway I have fixed numerous bugs, added an settings page and implemnted although very crudly a lap logger. But there is still a lot work that needs to be done. I have also added persistancy so the app remembers your choices. I am almost ready to replace the main branch with the fully rusted version, but like I said more work has to be done to go trough with that! I have probably never shown how the Car info page turned out and IMO it did really well. (The empty space is for inputs. That will be implemented soon!)"}, {"post_id": 55542, "ts": "2026-08-27T13:46:52Z", "hours": 8.0039, "text": "Devlog 19 Hello hello! Today I have some exciting news. The rewrite is complete That’s right, after about 30 hours of porting this code from tauri into EGUI it is finally finished! So let’s take a look at some stats, shall we ? | | Tauri | EGUI | |----------------------|-------------|--------------- | | Dev time | 80h | 30h | | Lines of code written | 6k | 3k | | Enjoyability | suboptimal | above average | And some perofrmance stuff as well: | | Tauri | EGUI | |----------------------|-------------|--------------- | | Ram idle | ~700Mb | ~150Mb | | CPU % idle | ~5% | ~5% | | FPS under load | ~29fps | stable 60 | Some other perks also include that EGUI doesn’t need a browser installed on the system to work. Overall I think this was a very successful rewrite! I wouldn’t do it again tho Next I will refactor the code a bit, do a bit off the good ’ol cleanup and then get to work on the map feature."}, {"post_id": 54543, "ts": "2026-08-25T15:54:21Z", "hours": 4.4164, "text": "Devlog 18 - 100h on the project So it’s been a hundred hours huh ? I also can’t believe it! I have also just now finished* the graph view which will be newly called Telemetry (page) Now I will move onto making the car info page previously known as the championship view. I expect this to be very easy!"}, {"post_id": 53875, "ts": "2026-08-24T16:07:03Z", "hours": 6.4811, "text": "Devlog 17 Hello guys. Its me again :D I am continuing to rewrite the UI into egui. I have completed the Graph view’s UI and now I am moving onto implementing it. One thing I have noticed is just how much more “code efficient” egui is. I understand that I didn’t make the logic behind the code yet but even with that I made the same thing with 3k less lines of code. Here is how the layout edit mode is looking for now."}, {"post_id": 51324, "ts": "2026-08-20T22:11:51Z", "hours": 5.83, "text": "Devlog 16 Another 6 hours, another devlog… Hi people. For the last 2 days I took a bit of a break from the project. I have played Approximately up with the boys and it was so fun. Y’all should try the game. It has a free demo 😉 But we are not here to talk about games, are we… I am continuing the implementation of the frontend and its coming along nicely. I’ve just noticed one thing, making the UI itself in egui is kinda slow however the state is very easy. Whilst this not being completely ideal i can push trough that. Since the last devlog, I have finished the implementation of the sidebar, and started working on the telemetry page. I have the graphs sorted and now I am working on the top bar. It’s having a couple of issues at the moment but nothing hard to fix really. I am hopefully gonna continue tomorrow and have the page finished by the end of the week. Welp, I guess that’s it for today. Everybody have a beautiful day, and bye bye!"}, {"post_id": 48473, "ts": "2026-08-16T20:40:29Z", "hours": 6.3456, "text": "Devlog 15 For the last few days, I have been remaking the UI in EGUI and I am enjoying it so far. I’ve been working on the graphs in the graph view and also the sidebar. The sidebar is turning out very well and I am also pretty pleased with the graphs. I have only this for now, so enjoy :D"}, {"post_id": 46562, "ts": "2026-08-13T21:40:19Z", "hours": 2.9933, "text": "Devlog 14 I have done some research and decided that moving forward the app will use eGPU as the main GUI library. I have chosen this over the competitors due to a few reasons. The main being that its rendered natively and that its a intermediate mode library. This will make it very easy to work with the graphs and hopefully other stuff too. I am enjoying working with it so far. There are some concepts that I really like, like that everything that has state is just a simple struct that is initialized somewhere and you do most of the implementation. The widget system is also pretty cool. I was at first worried that I would hate it due to my experiences from TKInter that was forced on me in school :D but its pretty intuitive how they did it. Going further I will need to think about the architecture of the app a bit to not have it fall apart. Right now I am thinking that one thread will be the main “logger thread” which will gather data from the telemetry and then there will be the UI thread. I think that is what pretty much everyone is doing so it might work . With this approach i am worried that its gonna be a pain, but what isn’t these days… I don’t really have that much more to say so at least enjoy this screenshot of a pretty much not working app Fun fact: due to how the lib works there is a bug now that you have to move your cursor on the app for it to log data :DDD"}, {"post_id": 46009, "ts": "2026-08-12T21:29:42Z", "hours": 2.5956, "text": "Devlog 13 Okay so I might have found a solution for me not liking react and web technologies but still wanting to finish this project. And I don’t like it…. but it has to be done. But before I tell you what it is you have to understand my problems. The good React in combination with typescript is a very easy thing to understand. They are everywhere, the skill of knowing these is very valuable. They have a huge ecosystem because they are everywhere. And I am sure that I have forgotten many other cool and interesting features and perks but I picked them for mainly these 3. The Bad They are slow (in comparison to something like rust) They rely too heavily on browsers (I mean it’s basically their runtime) You have to be “hacky” to do some things. They are not suitable to develop desktop apps I mean in hindsight those are so obvious but until you are balls deep into some specific project you don’t really think about those. The main problem is that the performance is, for the lack of a better word, sh*t. And normally that isn’t a problem however when you are processing a memory object of about 300kb 60 times per second it adds up fast. Even on my pretty beefy PC (r7 9800x3d and n5070ti) it hardly gets 30 fps. I know this could probably be fixed with “more hacky workarounds” but I am tired of those. The solution I am going to REWRITE The project I have spent 70h on already in some rust native GUI framework such as ICED. I have not yet decided which one to chose and I will do that research tomorrow and report back Literally me RN ⬇️"}, {"post_id": 45715, "ts": "2026-08-12T11:49:22Z", "hours": 2.1014, "text": "Devlog 12 This will be more of like a quick update on the championships feature. So what has happened is that I have implemented the feature, and assumed that the data will be there for all players… which there isn’t. The other players show up and everything but the details like tire data, damage data and fuel data just isn’t there. So I am kinda stuck if I should just scrap the feature or recreate it into a personal data panel which would just not be fun I think. Also the damages data is very very limited, so I just don’t know what to do."}, {"post_id": 45217, "ts": "2026-08-11T15:31:51Z", "hours": 9.4839, "text": "Devlog 11 Hello guys. I have some good news and some bad news… Let’s start with the not so good news. After thinking about it, I have decided, that I don’t really enjoy working on this project. It’s not that the project it self is bad, it’s more about the tech stack I chose… Don’t get me wrong typescript and react are both phenomenal choices and great tools but, I guess the web is just not for me. I realized that I like the lower end of the spectrum better. So I have decided to cut this project short. The map view will not be included in the final ship for the time being and the profile stats also will not be there. On the bright side, I have started working on the championships page with that nearing its completion. Next I will start to work on the onboarding and settings pages."}, {"post_id": 23759, "ts": "2026-07-06T21:48:28Z", "hours": 10.0158, "text": "Devlog 10 - We are in the double digits 🎊 UI Redesign Progress I am slowly redesigning the app to look like the design I made. I started with the sidebar and then the top control panel. All that went well. The Graphs… 😅 But then I got to the Graphs . *Oh, the graphs… *I wanted to redo the backend for them because the multiple-thread approach was just straight up stupid. It was a pain to develop and would be a pain to maintain. So, in my infinite wisdom , I have gone for just a simple async function. That means that right now the frontend is requesting each data point instead of subscribing to a stream. After that, I needed to revise the frontend graph component itself. At first I just wanted to make a non-messy implementation of the old version. However, it turned out that the HTML <canvas> element is really slow. And I mean realllllllllly slow. So after I wasted like 2 hours trying to optimize the design with no success, I rage quit and went to watch a movie. WebGL to the Rescue But I don’t give up that easily. After the movie, I reimplemented the graph view with WebGL through Pixi.js , which wasn’t even that hard like I expected and overall had much better performance. Well… at least after I fixed one very stupid bug . The Bug That Ate 10 GB of RAM I had forgotten everything from the first GraphView.tsx implementation, so I was just mindlessly copying over the code and renaming the variables to what I thought they meant when I first made it. Then I got to the part which draws the lap (aka the big loop over all the points-up to 10,000 points at a time). There was an error on one of the variables. It was the length of some array. I just renamed it to the main array length because… *what other thing would it be, right? *Well…It was the length of the values array , which was always 1 or 2 .So I accidentally turned 1 × 10,000 iterations into 10,000^2 iterations . Somehow the app still wasn’t lagging that much. It just took like 10 GB of RAM . The Result Thankfully, the new WebGL + Pixi.js approach is way more efficient , so after fixing that bug the graph rendering performs much better. It still isn’t perfect on the UI side of things but I am getting there!"}, {"post_id": 22818, "ts": "2026-07-05T12:34:46Z", "hours": 6.9447, "text": "Devlog 9 - THE REDESIGN For the past few days I’ve been working on a new design for the app. I am not the best designer and to be real I didn’t enjoy it :D. Designing is just too illogical for me. There’s not really much more to say about this. Enjoy the design:"}, {"post_id": 20110, "ts": "2026-07-01T17:12:04Z", "hours": 9.2647, "text": "Devlog 8 Do you guys remember how I said that I will take a break ? Yeah… That didn’t happen. Instead I have made a plan for myself on how I am gonna continue in the tool’s development. Da plan The plan Is pretty simple: Design the app in Figma, then build it! I have also made a list of features that will be added. You can find the plan on Github. You can also suggest features if you’re interested! …oh and before making the plan I have implemented a pretty cool logging feature. Basically it records the currently selected driver and saves all his data to a file along with the lap time and date. It does this only for laps that the game considers valid (aka gives a lap time to.)"}, {"post_id": 17764, "ts": "2026-06-28T18:11:51Z", "hours": 6.7406, "text": "DevLog 7 This will be just a quick update on how things are looking right now, what’s happening, and the overall state of the project. Good news The rewrite is complete The sole UI library is now ShadCN. There have also been some minor bugfixes and ux improvements. The main being that the app is now working on lower resolutions. We’ve got a readme. It’s basic, but its there. Also I have added installation instructions and released the 1st alpha version. You can find it in the releases! Both windows and linux packages are there! Bad news I will take a break for the next few days. I will be working on a smaller project for android and I hope that by the time I return I will be full of energy and ideas! What’s next I will continue working on the graph view. Mainly saving and loading reference laps, and overall better UI and UX."}, {"post_id": 12606, "ts": "2026-06-20T16:24:29Z", "hours": 9.7894, "text": "DevLog 6 - Windows support and the first rewrite! Windows support There’s not really much to say about this. You just get a handle on the game’s memory. This was vibecoded but it’s below 100 lines of windows specific code, so I’m gonna allow it. (It was just the 2 function that handle updating the telemetry and the rest is the same.) Rewrite After adding windows support, and sending it to a friend to test, I have discovered a massive problem. The app just didn’t work on a lower resolution. Since I have a QHD monitor, I didn’t notice it. Also when I started writing the app, I did it in pure React without any UI libraries, then I started to use Antd and then MUI and it became a mess. So I have done some research and decided to rewrite the app using ShadcnUI. I did this because Shadcn has one massive advantage - the code that you use is in your codebase. This means that you can modify the components however you want. It is also one of the more popular ones out there. For icons, I will be using Tabular, because they have a lot of them, and I like their look."}, {"post_id": 10767, "ts": "2026-06-17T17:54:53Z", "hours": 4.4767, "text": "DevLog 5 - Introducing the Layouts feature! So for the past few days I was implementing a layouts feature for the Graphs view in my app. Features: Adding layouts Removing layouts Managing layouts change what graphs they display change the properties of those graphs aka their number of gridlines, color and type How many graphs there are and what sizes they have You can do all of that in the Edit Mode . This mode is accessible via the layout selection dropdown. In edit mode you have options to change the graphs as said, remove the layout you’re editing, to save it as a new one or to save it (basically override the last one). All of this is persistent between sessions. Note that the UI in the screenshots is probably gonna be changed in the future and is just a development placeholder :)"}, {"post_id": 8829, "ts": "2026-06-14T18:01:40Z", "hours": 5.2161, "text": "DevLog 4 Today I have started implementing the layouts feature. There’s not much to really say. The graphs can be vertically adjusted in size, their color and type can be changed and there is a whole new edit mode for that. And that’s what I did for 5h today… (I really hate frontend :D) The design of the whole thing is unfinished but hey, it works. Even though some features (mainly saving and loading layouts) are missing its turning out great. I will continue developing this feature for the time being."}, {"post_id": 8235, "ts": "2026-06-13T18:14:25Z", "hours": 4.1997, "text": "DevLog 3 This one will be more about the organization of the project. New folder structure I have split up the src directory into a few different subdirectories mainly pages directory which is further split up into directories for each page and a components directory for reusable components like the sidebar. Logging Furthermore I have implemented logging on the backend. (It’s also callable from the frontend but that’s not that convenient at least in case of debugging so I won’t be using it as much.) The top bar Next I have started implementing a top bar for the telemetry view . On there will be some important controls and information regarding that view. Just note that in the screenshot the game is not open therefore the driver dropdown isn’t populated with any text. This will probably change in the future. And the layout dropdown is there just for the looks for now ;)"}, {"post_id": 6907, "ts": "2026-06-11T16:08:05Z", "hours": 2.7908, "text": "DevLog 2 Today i have fixed a bug where threads would spawn infinitely. I’ve been at it for 3h… Yeah it was kinda pain. So I basically have this architecture, where my backend spawns a new thread for each graph ( to provide information more responsibly. ) However whenever the graph element unloaded, it didn’t unsubscribe from that thread. A simple fix, just unsubscribe it, right ? Yup basically. However my lack of expertise in this kind of stuff led me on a wild goose chase. After I realized that what I am doing is stupid, it was just a simple hook that the spawn function returned, when spawning the new thread. Well we all make mistakes :D"}, {"post_id": 6797, "ts": "2026-06-11T12:14:18Z", "hours": 0.4275, "text": "DevLog 1 — An Introduction to My Project Hi! I’m Karlito, and this is my first devlog. I’d like to use this devlog to introduce my project, explain its current state, and share my plans for the future. So, what actually is LMU Telemetry? The TL;DR is that it’s a telemetry tool for Le Mans Ultimate. However, many people don’t know what that means, so I’ll explain it here. What is Le Mans Ultimate? In short, Le Mans Ultimate is a racing simulator. Unlike traditional racing games, it doesn’t simply say “the car accelerates when you press W.” Instead, it simulates the engine, tires, driveshafts, brakes, track grip, and many other factors to provide a realistic driving experience. What is telemetry? Telemetry is a way for simulators to output simulation data, such as speed, position, engine temperature, and much more. At a lower level, it’s essentially a chunk of memory containing numbers that are constantly updated with current information. What LMU Telemetry actually does LMU Telemetry aims to visualize these data points in a way that’s easy to understand and can help users improve their driving. It does this in several ways. For example, one feature draws real-time graphs of various metrics such as speed or delta time compared to your best lap. The current state of development The app is currently little more than a glorified demo. It has some rough UI elements and only plots graphs for a hardcoded car (index 0). While this works in private lobbies, where you’re always the first car, the system fails in most other situations. In short, the app isn’t very useful yet, but it’s a start. Main goals Live telemetry view Real-time graphs Map view A view showing the track layout and the line you drove Sharing features Exporting laps and comparing them with laps driven by other users Requirements The app must be performant Running LMU can already be demanding on some systems, so the app shouldn’t use more resources than necessary Linux support A reactive and polished UI Future plans Windows support Depending on how difficult this turns out to be, it may be implemented sooner Strategy mode Useful for endurance and team events, allowing you to monitor the tire and fuel status of other drivers So, what now? Right now, I’ll focus on getting the app to its MVP state. This means refining the UI, fixing bugs, and, most importantly, making the app genuinely useful. Well, that was quite a long one, wasn’t it? Thank you for reading all the way to the end, and have a wonderful rest of your day!"}]...
|
Title: Telemetry LMU by @Karlito | Stardance
Devl Title: Telemetry LMU by @Karlito | Stardance
Devlogs:
DevLog 1 — An Introduction to My Project Hi! I’m Karlito, and this is my first devlog. I’d like to use this devlog to introduce my project, explain its current state, and share my plans for the future. So, what actually is LMU Telemetry? The TL;DR is that it’s a telemetry tool for Le Mans Ultimate. However, many people don’t know what that means, so I’ll explain it here. What is Le Mans Ultimate? In short, Le Mans Ultimate is a racing simulator. Unlike traditional racing games, it doesn’t simply say “the car accelerates when you press W.” Instead, it simulates the engine, tires, driveshafts, brakes, track grip, and many other factors to provide a realistic driving experience. What is telemetry? Telemetry is a way for simulators to output simulation data, such as speed, position, engine temperature, and much more. At a lower level, it’s essentially a chunk of memory containing numbers that are constantly updated with current information. What LMU Telemetry actually does LMU Telemetry aims to visualize these data points in a way that’s easy to understand and can help users improve their driving. It does this in several ways. For example, one feature draws real-time graphs of various metrics such as speed or delta time compared to your best lap. The current state of development The app is currently little more than a glorified demo. It has some rough UI elements and only plots graphs for a hardcoded car (index 0). While this works in private lobbies, where you’re always the first car, the system fails in most other situations. In short, the app isn’t very useful yet, but it’s a start. Main goals Live telemetry view Real-time graphs Map view A view showing the track layout and the line you drove Sharing features Exporting laps and comparing them with laps driven by other users Requirements The app must be performant Running LMU can already be demanding on some systems, so the app shouldn’t use more resources than necessary Linux support A reactive and polished UI Future plans Windows support Depending on how difficult this turns out to be, it may be implemented sooner Strategy mode Useful for endurance and team events, allowing you to monitor the tire and fuel status of other drivers So, what now? Right now, I’ll focus on getting the app to its MVP state. This means refining the UI, fixing bugs, and, most importantly, making the app genuinely useful. Well, that was quite a long one, wasn’t it? Thank you for reading all the way to the end, and have a wonderful rest of your day!
DevLog 2 Today i have fixed a bug where threads would spawn infinitely. I’ve been at it for 3h… Yeah it was kinda pain. So I basically have this architecture, where my backend spawns a new thread for each graph ( to provide information more responsibly. ) However whenever the graph element unloaded, it didn’t unsubscribe from that thread. A simple fix, just unsubscribe it, right ? Yup basically. However my lack of expertise in this kind of stuff led me on a wild goose chase. After I realized that what I am doing is stupid, it was just a simple hook that the spawn function returned, when spawning the new thread. Well we all make mistakes :D
DevLog 3 This one will be more about the organization of the project. New folder structure I have split up the src directory into a few different subdirectories mainly pages directory which is further split up into directories for each page and a components directory for reusable components like the sidebar. Logging Furthermore I have implemented logging on the backend. (It’s also callable from the frontend but that’s not that convenient at least in case of debugging so I won’t be using it as much.) The top bar Next I have started implementing a top bar for the telemetry view . On there will be some important controls and information regarding that view. Just note that in the screenshot the game is not open therefore the driver dropdown isn’t populated with any text. This will probably change in the future. And the layout dropdown is there just for the looks for now ;)
DevLog 4 Today I have started implementing the layouts feature. There’s not much to really say. The graphs can be vertically adjusted in size, their color and type can be changed and there is a whole new edit mode for that. And that’s what I did for 5h today… (I really hate frontend :D) The design of the whole thing is unfinished but hey, it works. Even though some features (mainly saving and loading layouts) are missing its turning out great. I will continue developing this feature for the time being.
DevLog 5 - Introducing the Layouts feature! So for the past few days I was implementing a layouts feature for the Graphs view in my app. Features: Adding layouts Removing layouts Managing layouts change what graphs they display change the properties of those graphs aka their number of gridlines, color and type How many graphs there are and what sizes they have You can do all of that in the Edit Mode . This mode is accessible via the layout selection dropdown. In edit mode you have options to change the graphs as said, remove the layout you’re editing, to save it as a new one or to save it (basically override the last one). All of this is persistent between sessions. Note that the UI in the screenshots is probably gonna be changed in the future and is just a development placeholder :)
DevLog 6 - Windows support and the first rewrite! Windows support There’s not really much to say about this. You just get a handle on the game’s memory. This was vibecoded but it’s below 100 lines of windows specific code, so I’m gonna allow it. (It was just the 2 function that handle updating the telemetry and the rest is the same.) Rewrite After adding windows support, and sending it to a friend to test, I have discovered a massive problem. The app just didn’t work on a lower resolution. Since I have a QHD monitor, I didn’t notice it. Also when I started writing the app, I did it in pure React without any UI libraries, then I started to use Antd and then MUI and it became a mess. So I have done some research and decided to rewrite the app using ShadcnUI. I did this because Shadcn has one massive advantage - the code that you use is in your codebase. This means that you can modify the components however you want. It is also one of the more popular ones out there. For icons, I will be using Tabular, because they have a lot of them, and I like their look.
DevLog 7 This will be just a quick update on how things are looking right now, what’s happening, and the overall state of the project. Good news The rewrite is complete The sole UI library is now ShadCN. There have also been some minor bugfixes and ux improvements. The main being that the app is now working on lower resolutions. We’ve got a readme. It’s basic, but its there. Also I have added installation instructions and released the 1st alpha version. You can find it in the releases! Both windows and linux packages are there! Bad news I will take a break for the next few days. I will be working on a smaller project for android and I hope that by the time I return I will be full of energy and ideas! What’s next I will continue working on the graph view. Mainly saving and loading reference laps, and overall better UI and UX.
Devlog 8 Do you guys remember how I said that I will take a break ? Yeah… That didn’t happen. Instead I have made a plan for myself on how I am gonna continue in the tool’s development. Da plan The plan Is pretty simple: Design the app in Figma, then build it! I have also made a list of features that will be added. You can find the plan on Github. You can also suggest features if you’re interested! …oh and before making the plan I have implemented a pretty cool logging feature. Basically it records the currently selected driver and saves all his data to a file along with the lap time and date. It does this only for laps that the game considers valid (aka gives a lap time to.)
Devlog 9 - THE REDESIGN For the past few days I’ve been working on a new design for the app. I am not the best designer and to be real I didn’t enjoy it :D. Designing is just too illogical for me. There’s not really much more to say about this. Enjoy the design:
Devlog 10 - We are in the double digits 🎊 UI Redesign Progress I am slowly redesigning the app to look like the design I made. I started with the sidebar and then the top control panel. All that went well. The Graphs… 😅 But then I got to the Graphs . *Oh, the graphs… *I wanted to redo the backend for them because the multiple-thread approach was just straight up stupid. It was a pain to develop and would be a pain to maintain. So, in my infinite wisdom , I have gone for just a simple async function. That means that right now the frontend is requesting each data point instead of subscribing to a stream. After that, I needed to revise the frontend graph component itself. At first I just wanted to make a non-messy implementation of the old version. However, it turned out that the HTML <canvas> element is really slow. And I mean realllllllllly slow. So after I wasted like 2 hours trying to optimize the design with no success, I rage quit and went to watch a movie. WebGL to the Rescue But I don’t give up that easily. After the movie, I reimplemented the graph view with WebGL through Pixi.js , which wasn’t even that hard like I expected and overall had much better performance. Well… at least after I fixed one very stupid bug . The Bug That Ate 10 GB of RAM I had forgotten everything from the first GraphView.tsx implementation, so I was just mindlessly copying over the code and renaming the variables to what I thought they meant when I first made it. Then I got to the part which draws the lap (aka the big loop over all the points-up to 10,000 points at a time). There was an error on one of the variables. It was the length of some array. I just renamed it to the main array length because… *what other thing would it be, right? *Well…It was the length of the values array , which was always 1 or 2 .So I accidentally turned 1 × 10,000 iterations into 10,000^2 iterations . Somehow the app still wasn’t lagging that much. It just took like 10 GB of RAM . The Result Thankfully, the new WebGL + Pixi.js approach is way more efficient , so after fixing that bug the graph rendering performs much better. It still isn’t perfect on the UI side of things but I am getting there!
Devlog 11 Hello guys. I have some good news and some bad news… Let’s start with the not so good news. After thinking about it, I have decided, that I don’t really enjoy working on this project. It’s not that the project it self is bad, it’s more about the tech stack I chose… Don’t get me wrong typescript and react are both phenomenal choices and great tools but, I guess the web is just not for me. I realized that I like the lower end of the spectrum better. So I have decided to cut this project short. The map view will not be included in the final ship for the time being and the profile stats also will not be there. On the bright side, I have started working on the championships page with that nearing its completion. Next I will start to work on the onboarding and settings pages.
Devlog 12 This will be more of like a quick update on the championships feature. So what has happened is that I have implemented the feature, and assumed that the data will be there for all players… which there isn’t. The other players show up and everything but the details like tire data, damage data and fuel data just isn’t there. So I am kinda stuck if I should just scrap the feature or recreate it into a personal data panel which would just not be fun I think. Also the damages data is very very limited, so I just don’t know what to do.
Devlog 13 Okay so I might have found a solution for me not liking react and web technologies but still wanting to finish this project. And I don’t like it…. but it has to be done. But before I tell you what it is you have to understand my problems. The good React in combination with typescript is a very easy thing to understand. They are everywhere, the skill of knowing these is very valuable. They have a huge ecosystem because they are everywhere. And I am sure that I have forgotten many other cool and interesting features and perks but I picked them for mainly these 3. The Bad They are slow (in comparison to something like rust) They rely too heavily on browsers (I mean it’s basically their runtime) You have to be “hacky” to do some things. They are not suitable to develop desktop apps I mean in hindsight those are so obvious but until you are balls deep into some specific project you don’t really think about those. The main problem is that the performance is, for the lack of a better word, sh*t. And normally that isn’t a problem however when you are processing a memory object of about 300kb 60 times per second it adds up fast. Even on my pretty beefy PC (r7 9800x3d and n5070ti) it hardly gets 30 fps. I know this could probably be fixed with “more hacky workarounds” but I am tired of those. The solution I am going to REWRITE The project I have spent 70h on already in some rust native GUI framework such as ICED. I have not yet decided which one to chose and I will do that research tomorrow and report back Literally me RN ⬇️
Devlog 14 I have done some research and decided that moving forward the app will use eGPU as the main GUI library. I have chosen this over the competitors due to a few reasons. The main being that its rendered natively and that its a intermediate mode library. This will make it very easy to work with the graphs and hopefully other stuff too. I am enjoying working with it so far. There are some concepts that I really like, like that everything that has state is just a simple struct that is initialized somewhere and you do most of the implementation. The widget system is also pretty cool. I was at first worried that I would hate it due to my experiences from TKInter that was forced on me in school :D but its pretty intuitive how they did it. Going further I will need to think about the architecture of the app a bit to not have it fall apart. Right now I am thinking that one thread will be the main “logger thread” which will gather data from the telemetry and then there will be the UI thread. I think that is what pretty much everyone is doing so it might work . With this approach i am worried that its gonna be a pain, but what isn’t these days… I don’t really have that much more to say so at least enjoy this screenshot of a pretty much not working app Fun fact: due to how the lib works there is a bug now that you have to move your cursor on the app for it to log data :DDD
Devlog 15 For the last few days, I have been remaking the UI in EGUI and I am enjoying it so far. I’ve been working on the graphs in the graph view and also the sidebar. The sidebar is turning out very well and I am also pretty pleased with the graphs. I have only this for now, so enjoy :D
Devlog 16 Another 6 hours, another devlog… Hi people. For the last 2 days I took a bit of a break from the project. I have played Approximately up with the boys and it was so fun. Y’all should try the game. It has a free demo 😉 But we are not here to talk about games, are we… I am continuing the implementation of the frontend and its coming along nicely. I’ve just noticed one thing, making the UI itself in egui is kinda slow however the state is very easy. Whilst this not being completely ideal i can push trough that. Since the last devlog, I have finished the implementation of the sidebar, and started working on the telemetry page. I have the graphs sorted and now I am working on the top bar. It’s having a couple of issues at the moment but nothing hard to fix really. I am hopefully gonna continue tomorrow and have the page finished by the end of the week. Welp, I guess that’s it for today. Everybody have a beautiful day, and bye bye!
Devlog 17 Hello guys. Its me again :D I am continuing to rewrite the UI into egui. I have completed the Graph view’s UI and now I am moving onto implementing it. One thing I have noticed is just how much more “code efficient” egui is. I understand that I didn’t make the logic behind the code yet but even with that I made the same thing with 3k less lines of code. Here is how the layout edit mode is looking for now.
Devlog 18 - 100h on the project So it’s been a hundred hours huh ? I also can’t believe it! I have also just now finished* the graph view which will be newly called Telemetry (page) Now I will move onto making the car info page previously known as the championship view. I expect this to be very easy!
Devlog 19 Hello hello! Today I have some exciting news. The rewrite is complete That’s right, after about 30 hours of porting this code from tauri into EGUI it is finally finished! So let’s take a look at some stats, shall we ? | | Tauri | EGUI | |----------------------|-------------|--------------- | | Dev time | 80h | 30h | | Lines of code written | 6k | 3k | | Enjoyability | suboptimal | above average | And some perofrmance stuff as well: | | Tauri | EGUI | |----------------------|-------------|--------------- | | Ram idle | ~700Mb | ~150Mb | | CPU % idle | ~5% | ~5% | | FPS under load | ~29fps | stable 60 | Some other perks also include that EGUI doesn’t need a browser installed on the system to work. Overall I think this was a very successful rewrite! I wouldn’t do it again tho Next I will refactor the code a bit, do a bit off the good ’ol cleanup and then get to work on the map feature.
Devlog 20 So I have been polishing up the current features a bit and they are far from done. I am starting to question if i will make it to shipping this app one day :D. Anyway I have fixed numerous bugs, added an settings page and implemnted although very crudly a lap logger. But there is still a lot work that needs to be done. I have also added persistancy so the app remembers your choices. I am almost ready to replace the main branch with the fully rusted version, but like I said more work has to be done to go trough with that! I have probably never shown how the Car info page turned out and IMO it did really well. (The empty space is for inputs. That will be implemented soon!)
Devlog 21 For the past few days I have been working on a new feature. The map page. It is turning out great, however it has a lot of bugs. These will get fix over the next few days. I promise :) There have also been changes made to the lap logging system and some other systems as well. As you can see on the image you select 2 saved laps and can crosscompare the lines you drove. Obviously this is completly useless if you loaded 2 different track like I did here. This will get checked for and prohibited in the future. Next I will add the underlying lap overlay which I will somehow extract from the game or from somewhere else. I don’t really know yet. Well that is it for today. Have a great day and bye bye!
Devlog 22 Hiiiiiiiiiiiii I have some huge news to tell you. I have just made the MOST complex addition yet. And I love it! I have completely overhauled the accessing and managing the telemetry! I have designed a thread safe way to have it run on a separate thread and be accessible from *every place in the app. One unified API for everything! I now store the current lap and the last lap for each of the cars. Tho this takes up a massive 140mb of just floats (in the worst case scenario) I believe its worth the RAM! (Let’s be real, we have saved over 400mb from the tauri implementation so we can now use some of that!) Next I will continue on further implementing these features around the tool. Anyway have a nice day people and bye bye. Some context to that meme: I have a type in my app that is literally Arc<Mutex<[([f64; TelemetryValueType::Max as usize], Option); 104]»
Devlog 23 - More Refactoring Hi! In the past few days I have been making some core architectural changes to the project and I would like to explain them now. Telemetry Provider I have finally decided on how I am gonna handle telemetry in the long term. It’s a pretty simple concept but the implementation is pretty hard. I have one object (the TelemetryProvider struct) that is in charge of getting and managing the telemetry. Right now it logs data from all cars and stores the best, last and current laps. If you wish it can save only your laps or laps of everybody. Each lap is a json file about 500kB - 1MB in size and holds all the data that can be displayed in the app. Notably the position ( so you can load that lap directly into the map page ) and the data displayed by the graphs (so you can load it as a reference there as well.) Pointer to this struct is distributed to pages that need it so they can access it! The provider has a core logging loop that is running on another thread so the whole UI doesn’t have to redraw each time you log new data. (About 60 times a second.) State and Settings Providers Next, I have implemented a StateProvider and an SettingsProvider . These two are basically a drop in replacement of what was stored in the Sidebar and SettingsPage respectively. Difference between the two is that the StateProvider isn’t stored between app restarts. Similarly to how the TelemetryProvider works, each of the pages that need these values get a shared pointer (or an Arc in rust) and can access the values. What’s next Going further I will keep my focus on the map page. Finish it, and then start polishing the app for the final ship! Wish me luck and have a nice day!
Devlog 24 HI! All of the time on this devlog was basically just driving in circles. And I mean that. I have recorded all of the outsides and insides of all tracks in the game to get the data for the map page. It was very teidius and very boring. Like very very boring. There are 31 tracks in LMU (including each layout) and on every one of them I had to do an out lap, the ouside, another out lap and the inside. So 4laps for each. That is about 15min per layout. Yeah it was a long one. And the recordings aren’t perfect either! I will now have to somehow process them all to get them ready for the ship. You can watch the timelapses of this process here if you wish. https://lapse.hackclub.com/timelapse/OQcismBwxbBB https://lapse.hackclub.com/timelapse/le3Lta0RxcUA https://lapse.hackclub.com/timelapse/XRf98OimmUk9 Anyway. Have a nice day!
Devlog 25 I know I have just made a devlog like yesterday but holy s*** the track references work so well. They are practically perfect . Besides the references I have also implemented the delta time between the 2 cars! That has really tied the page together. If I can say so myself, we are getting pretty close to the final ship . There is not much needed to implement. The obvious are bugfixes, and some simple onboarding. But really, that’s it! Everyone who is following or caring about this project can expect a ship in the next week or so. In my final devlog I will also do a writeup on this project as a whole, from the coarse beginnings in Dyoxys, trough Tauri, to the sweet home of EGUI. There will also be a trailer video and a demo for all the raters :D Anyway for now you can have this preview of the map page! Stay tuned!
Devlog 26 Hiiiii For the past few hours I have been working on polishing the app and get it to a shippable state overall. There is still work left to do, but I am getting there. I have set up a simple packager, and a simple script to use it. It automatically compiles the release version of the app and packages it into a windows installer a Debian .deb package and a pacman package. I have also (after like 2 hours of struggeling with it) added an Icon for the app. So now it looks nice!There has been a lot of new bugfixes as well and the app has been tested by my friend so it should be somwhat usable, tho the setup UX should be improved upon. If you wish you can download the app from here: https://github.com/Karlito05/TelemetryLMU/releases/tag/v0.2.3 Well that is all I have for you all today, so have a nice one :)
Devlog 27 For the past few hours I have been polishing the app up. The main you’ll probably see are the onboarding dialogs. A global one pops up when you first launch the app and then one for each page when you first enter them. Another change I have done is that I made the ghosts on the map page be based on time and not data point index.
Devlog 28 Today is gonna be a big day, because I will ship the project. There is a few things left to do tho. Mainly the readme and the demo video! In my last and next devlog I will also make a write up on the story of the whole project so far. Besides that I have yesterday refactored the whole codebase so now there aren’t just 5 monolithic files. I went for a more react like approach with the structure being divided into pages and components. Sadly there isn’t enough time until the ship to touch up on some old UI and UX problems in the edit view of the graphs, neither is there time to add more fields. This will be done in the near future! Overall I am very happy how the app turned out. But this is not the end of the development this is just the end of the stardance journey!
Devlog 29 - The end So this is the last one, huh. Here is the full write up on this project as I promised. Chapter 1 - The beginnings This project started about 3 months ago. I started experimenting with just getting the data and plotting it. Just for fun as an exercise to learn rust. Then I realized that there actually isn’t a proper working telemetry tool that works on linux. So I did some research… and I decided that I am going to make the app in Dioxus. Chapter 2 - The Dioxus era This leads us to the shortest of eras. The Dioxus era. Nothing really happened here and quite frankly I don’t even remember it that much. There aren’t really any git commits because I didn’t have that setup yet. One thing i remember tho is that I couldn’t figure out how to draw the garphs, because Dioxus is based on web technologies but weirdly becuase you are writing HTLM like syntax but in rust. And that was the main reason I decided to switch to Tauri. Chapter 3 - The Tauri era At first Tauri was the best framework ever made for me. That is because I already kinda knew react, it was simple to understand and I could really lean into the split frontend and backend architecture. This sadly proved very inefficient for the graph view which needs to render thousands of points each frame. Since it was too much for the basic HTML canvas I have switched to using WebGL with numerous downsampling techniques. This was just a bandaid fix though. I have also ran into bunch of architectural issues with the whole split frontend and backend thing. Accessing the telemetry data proved to be very difficult and inefficient. I remember that I ran each of the graphs on a separate thread. This was so stupid. I don’t even remember how I could’ve come up with such a stupid idea :D. It just led to memory leaks and threads uncontrollably spinning up and not stopping. I am sure that all of that could’ve been easily avoided with simpler architecture but at that point I was at my lowest point of this project, so I didn’t even have the energy to do it. I also had the state of the frontend so fragmented which didn’t help. And the whole retained mode GUI thing just wasn’t well suited for this kind of app. And that is when I decided to do a complete rewrite in pure rust! Chapter 4 - The sweet EGUI I didn’t know it at the time, but this was the best idea on what to do with the project. I remember that I was very split between just shipping it half done and finishing it just because of how bad the development experience with Tauri was (sorry Tauri devs, it’s not a you thing, it’s a me thing). It took about 30h to fully rewrite the app with EGUI, which looking back at it isn’t too bad. It felt like ages though. It didn’t help that almost none of the work in this “chapter” did AI. Which at the end of the day is better! Although my style of writing EGUI code was let’s say original… I have just put everything into one file and that grew very fast :D. I had like 5 files that were about 800 lines each. That has since luckily changed. (I have adopted more of a React style file structure.) Anyway at the end of the rewrite I kinda started loving EGUI and that hasn’t stopped since. I continued to develop the Map page in EASY which was pretty easy. But then I needed the track limits data for the map page. This was a bit of a roadblock… First I have tried to extract the data directly from the game, however this was inaccurate and the track width was missing entirely. So then I tried to download an up to date image of the top down view of the track and extract the inside and outside line from it and match it to the in game data. This partially worked better, still not great tho. So there was only one option left. And that was to painfully drive each layout of each track by hand. This took almost 7h of just driving in circles. After that it was smooth and buggy sailing until the ship. Everyone who read this, have a beautiful day.
Ships:
Telemetry LMU An application for both Windows and Linux to visualize the telemetry data from Le Mans Ultimate What it does: This application collects, stores, and visualizes data from a racing simulator called Le Mans Ultimate. The main goal: Allow users to analyze their driving and learn from their data through an easy-to-use interface. The requirements: Performance, nice and simple UI, expandability, minimal setup. Results: Main goal: Achieved. (I wouldn’t be shipping this app otherwise) Performance: On average the app uses 4% of CPU and 250Mb of RAM under full load. That is less RAM usage than running Spotify in the background. Nice and simple UI: This is personal preference, however in my opinion I think i succeeded. Expandability: The architecture of the app is very modular so this also isn’t a problem. Setup: On windows there is none (except installing the app), on linux there is one dependency (this is sadly unavoidable.) Some stats: 200+ hours of development time (including the time before Stardance) 250+ commits 6 000+ lines of Rust...
|
1793008191.1281526
|
1793094591.1281526
|
|
5301
|
My awesome macropad! by @AmeenR-M | Stardance
|
AmeenR-M
|
1
|
9.02
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T18:41:48Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This… this is The Rayquaza Macropad. I was replaying pokemon emerald the other day, and i got to sky pillar, i thought, ‘hey i want a sky pillar’ and one of my freinds had recently made a macropad, so i thought, what if i made a macropad, but wait, with a rayquaza circling it just like sky pillar? and thats how this project was made, i made it so i make a macropad, then the rayquaza is sepertley printed, so it drapes above it. i initally started with working around scotto keebs’ macropad, but i eventually switched it up to this bigger design. I hope you enjoy going through my github page, seeing the cool models, and when its fully fleshed out… the final product", "repo": "https://github.com/ameenrahimmuith-alt/The-Rayquaza-Macropad-", "demo": ""}]...
|
[{"post_id": 72827, "ts": "202 [{"post_id": 72827, "ts": "2026-09-23T20:24:33Z", "hours": 0.4169, "text": "Doing some sizing issues"}, {"post_id": 72362, "ts": "2026-09-22T19:08:53Z", "hours": 0.4669, "text": "Even more case desgin work, i might have a lead on issues!"}, {"post_id": 71933, "ts": "2026-09-21T20:13:05Z", "hours": 3.1339, "text": "Even more cadding, touching up the model, keep having sizing issues, whenever i try models it keeps giving errors…"}, {"post_id": 68802, "ts": "2026-09-15T19:33:11Z", "hours": 5.2175, "text": "More cad work, cant be bothered to take a new screen shot sorry"}, {"post_id": 66900, "ts": "2026-09-12T21:02:44Z", "hours": 0.6336, "text": "More case design, touching stuff up, not done yet tho"}, {"post_id": 59811, "ts": "2026-09-01T19:26:01Z", "hours": 1.7531, "text": "Basically, im cadding? i think thats the term, im fixing bugs with the model"}, {"post_id": 37730, "ts": "2026-07-30T17:15:31Z", "hours": 0.3833, "text": "Im working on a porject… jk a 3x3 macro pad with a rayquaza circling it"}]...
|
Title: My awesome macropad! by @AmeenR-M | Stardan Title: My awesome macropad! by @AmeenR-M | Stardance
Devlogs:
Im working on a porject… jk a 3x3 macro pad with a rayquaza circling it
Basically, im cadding? i think thats the term, im fixing bugs with the model
More case design, touching stuff up, not done yet tho
More cad work, cant be bothered to take a new screen shot sorry
Even more cadding, touching up the model, keep having sizing issues, whenever i try models it keeps giving errors…
Even more case desgin work, i might have a lead on issues!
Doing some sizing issues
Ships:
This… this is The Rayquaza Macropad. I was replaying pokemon emerald the other day, and i got to sky pillar, i thought, ‘hey i want a sky pillar’ and one of my freinds had recently made a macropad, so i thought, what if i made a macropad, but wait, with a rayquaza circling it just like sky pillar? and thats how this project was made, i made it so i make a macropad, then the rayquaza is sepertley printed, so it drapes above it. i initally started with working around scotto keebs’ macropad, but i eventually switched it up to this bigger design. I hope you enjoy going through my github page, seeing the cool models, and when its fully fleshed out… the final product...
|
1793004687.0911157
|
1793091087.0911157
|
|
49819
|
My very own WebOS by @Alyssa889 | Stardance
|
Alyssa889
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T18:29:40Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made my very Own WebOs! It was so fun following the guide and I enjoyed it so much! It was hard to follow the Javascript steps because I’m new to coding but I was able to follow. Hopefully there are no bugs or problems with it!", "repo": "https://github.com/alyssaelias/WebOS", "demo": "https://friendly-telegram-vpg4g6rp9ww9cxq47.github.dev/"}]...
|
[{"post_id": 71372, "ts": "202 [{"post_id": 71372, "ts": "2026-09-20T18:26:39Z", "hours": 0.3492, "text": "Added a ending message to my WebOs and changed the colors of the text. I think it’s ready to ship!"}, {"post_id": 71352, "ts": "2026-09-20T17:55:09Z", "hours": 0.5172, "text": "Styling my WebOS to make it unique"}, {"post_id": 71323, "ts": "2026-09-20T17:02:21Z", "hours": 0.3956, "text": "Editing the draggable window through JS"}, {"post_id": 70738, "ts": "2026-09-19T17:52:26Z", "hours": 1.1453, "text": "Finishing my WebOS and finally got Hackatime to work"}]...
|
Title: My very own WebOS by @Alyssa889 | Stardance Title: My very own WebOS by @Alyssa889 | Stardance
Devlogs:
Finishing my WebOS and finally got Hackatime to work
Editing the draggable window through JS
Styling my WebOS to make it unique
Added a ending message to my WebOs and changed the colors of the text. I think it’s ready to ship!
Ships:
I made my very Own WebOs! It was so fun following the guide and I enjoyed it so much! It was hard to follow the Javascript steps because I’m new to coding but I was able to follow. Hopefully there are no bugs or problems with it!...
|
1793004717.4430737
|
1793091117.4430737
|
|
34685
|
My first slack bot by @rsupp | Stardance
|
rsupp
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T18:29:05Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a pretty simple slack bot that has commands for pinging, a help command, and an echo command. While its not very complex, I liked learning about how to deploy a slack bot with private and public keys, using git push through vscode, and keeping it running through nest.", "repo": "https://github.com/Supertiger576/rs-responder/", "demo": "https://app.slack.com/client/E09V59WQY1E/C0P5NE354"}]...
|
[{"post_id": 36708, "ts": "202 [{"post_id": 36708, "ts": "2026-07-28T22:52:49Z", "hours": 0.7822, "text": "I worked for a while on coding my slackbot and setting it up for the guide. One things I was originally trying to code was a slash command where the bot would return a message after an inputted time. This did not end up working because the bot would be entirely taken up by one message and then crash. Instead, I created an “echo” slash command where the bot immediately returns this message."}]...
|
Title: My first slack bot by @rsupp | Stardance
D Title: My first slack bot by @rsupp | Stardance
Devlogs:
I worked for a while on coding my slackbot and setting it up for the guide. One things I was originally trying to code was a slash command where the bot would return a message after an inputted time. This did not end up working because the bot would be entirely taken up by one message and then crash. Instead, I created an “echo” slash command where the bot immediately returns this message.
Ships:
I made a pretty simple slack bot that has commands for pinging, a help command, and an echo command. While its not very complex, I liked learning about how to deploy a slack bot with private and public keys, using git push through vscode, and keeping it running through nest....
|
1793004828.3215547
|
1793091228.3215547
|
|
54332
|
ziglm by @simonproyt | Stardance
|
simonproyt
|
1
|
52.95
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T17:57:15Z", "hours": 51.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "So after achieving the performance goals that i wanted i think i decided that im ready to ship this project but i feel kinda scared because i wrote a lot less devlogs then my previous projects but like this project was a lot more boring debugging heavy so idk if i could have wrote about more stuff but im hoping that ppl are going to like this one as much as my previous project and it was a great learning experience and i learned a lot about the zig programing language and performance optimization and about the inner workings of llms and about writing low level performance critical cuda code Thank you for checking out my project and best of luck finishing your project and getting what you want", "repo": "https://github.com/simonproyt/ziglm", "demo": "https://cdn.hackclub.com/01a0bfeb-6c82-7528-93f3-aae99d703da5/ziglm_demo.mp4"}]...
|
[{"post_id": 75555, "ts": "202 [{"post_id": 75555, "ts": "2026-09-30T12:45:05Z", "hours": 1.9483, "text": "Note to the reviewers/shipwright/fraud squad so i accidentally added my home folder to the hackatime project and and when i contacted the fraud squad they told me to write a note so can you please deduct around 10 hours please also i attached a demo video of the benchmark script running for the ppl that dont want to download models and set my project up"}, {"post_id": 71338, "ts": "2026-09-20T17:33:25Z", "hours": 9.8469, "text": "removed multimodal and fixed the performance issue so im writing this devlog the second time because stardance logged me out when i tried to post it and it didnt save it sadly so i have to write it again i guess but as the title said i removed the multimodal code basically because it was a pain to maintain and it broke with every update so i just wanted to focus on just closely matching llama.cpp on text speed as a solo developer project and i think i kinda achieved that because in the generation speed its only a few tokens of difference so i think the project is basically finished now and i maybe add a few small changes to it or ship it now but i dont know yet but i hope that someone will like my project even if it was a bit more boring then my other projects"}, {"post_id": 69690, "ts": "2026-09-17T16:20:51Z", "hours": 10.3528, "text": "Fixed some bugs and improved the performance in my free time so i had some time on the weekend and the days i didnt go to school to fix added a benchmark shell script to compare the performance against ollama and llama.cpp for testing and for generating performance graphs now the vision tensors are run on the gpu too so the model wont get bottle necked by my laptops pci express bus speeds and uses the gpus memory instead so this or maybe another one will be probably the last devlog for this project because it has been super hard to develop this and kinda a pain to maintain and try to get it to the performance levels of modern interference libraries and i dont have much free time anymore because of school maybe i will continue development but idk"}, {"post_id": 64849, "ts": "2026-09-09T15:22:55Z", "hours": 11.8742, "text": "Working cuda and ci pipeline but sadly i cant work on this project anymore because school started So working on this project required quite a beefy and heavy computer and i dont want to carry one so sadly i dont have time to continue on this project in this time so after adding a working cuda gpu backend and a ci pipeline so ppl dont have to compile it from the source code and have nvcc to even try i think this is the end of this project for the current time being and i hope that someone will find this So this is what i added: added a cuda backend with a fatbin kernel so it will work on multiple compute levels a github actions ci pipeline to generate verified releases for the ppl who dont want to compile everything for themselves"}, {"post_id": 57155, "ts": "2026-08-29T08:16:47Z", "hours": 7.4842, "text": "Devlog 2: Finally working multimodal audio and video support So after a lot of trial and error i finally added multimodal audio and video support because they were the only two things missing from a complete cpu engine because i wanted a fully working cpu reference before doing anything with cuda and stuff but i want to get cuda working asap because the smaller models that i have been testing that would run on my cpu with a good speed they kinda have bad multimodal performance Thank you for reading my devlog"}, {"post_id": 54967, "ts": "2026-08-26T12:21:34Z", "hours": 11.2867, "text": "First devlog for this new project So i decided to start this new project while waiting for my other project getting reviewed Why did i do this: I was kinda bored waiting for my other project to be reviewed by ppl and i wanted to try out zig so i thought this is a great toy project idea to play with in zig What models are tested (others might work but i havent tested them): smollm2-360m gemma 4 and its variants with curently only image multimodal working but sound and video might be added in the future Thank you for reading my devlog"}]...
|
Title: ziglm by @simonproyt | Stardance
Devlogs:
Title: ziglm by @simonproyt | Stardance
Devlogs:
First devlog for this new project So i decided to start this new project while waiting for my other project getting reviewed Why did i do this: I was kinda bored waiting for my other project to be reviewed by ppl and i wanted to try out zig so i thought this is a great toy project idea to play with in zig What models are tested (others might work but i havent tested them): smollm2-360m gemma 4 and its variants with curently only image multimodal working but sound and video might be added in the future Thank you for reading my devlog
Devlog 2: Finally working multimodal audio and video support So after a lot of trial and error i finally added multimodal audio and video support because they were the only two things missing from a complete cpu engine because i wanted a fully working cpu reference before doing anything with cuda and stuff but i want to get cuda working asap because the smaller models that i have been testing that would run on my cpu with a good speed they kinda have bad multimodal performance Thank you for reading my devlog
Working cuda and ci pipeline but sadly i cant work on this project anymore because school started So working on this project required quite a beefy and heavy computer and i dont want to carry one so sadly i dont have time to continue on this project in this time so after adding a working cuda gpu backend and a ci pipeline so ppl dont have to compile it from the source code and have nvcc to even try i think this is the end of this project for the current time being and i hope that someone will find this So this is what i added: added a cuda backend with a fatbin kernel so it will work on multiple compute levels a github actions ci pipeline to generate verified releases for the ppl who dont want to compile everything for themselves
Fixed some bugs and improved the performance in my free time so i had some time on the weekend and the days i didnt go to school to fix added a benchmark shell script to compare the performance against ollama and llama.cpp for testing and for generating performance graphs now the vision tensors are run on the gpu too so the model wont get bottle necked by my laptops pci express bus speeds and uses the gpus memory instead so this or maybe another one will be probably the last devlog for this project because it has been super hard to develop this and kinda a pain to maintain and try to get it to the performance levels of modern interference libraries and i dont have much free time anymore because of school maybe i will continue development but idk
removed multimodal and fixed the performance issue so im writing this devlog the second time because stardance logged me out when i tried to post it and it didnt save it sadly so i have to write it again i guess but as the title said i removed the multimodal code basically because it was a pain to maintain and it broke with every update so i just wanted to focus on just closely matching llama.cpp on text speed as a solo developer project and i think i kinda achieved that because in the generation speed its only a few tokens of difference so i think the project is basically finished now and i maybe add a few small changes to it or ship it now but i dont know yet but i hope that someone will like my project even if it was a bit more boring then my other projects
Note to the reviewers/shipwright/fraud squad so i accidentally added my home folder to the hackatime project and and when i contacted the fraud squad they told me to write a note so can you please deduct around 10 hours please also i attached a demo video of the benchmark script running for the ppl that dont want to download models and set my project up
Ships:
So after achieving the performance goals that i wanted i think i decided that im ready to ship this project but i feel kinda scared because i wrote a lot less devlogs then my previous projects but like this project was a lot more boring debugging heavy so idk if i could have wrote about more stuff but im hoping that ppl are going to like this one as much as my previous project and it was a great learning experience and i learned a lot about the zig programing language and performance optimization and about the inner workings of llms and about writing low level performance critical cuda code Thank you for checking out my project and best of luck finishing your project and getting what you want...
|
1793008177.1532097
|
1793094577.1532097
|
|
44815
|
Differential Swerve by @precon | Stardance
|
precon
|
1
|
47.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T17:53:54Z", "hours": 47.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a differential swerve that is FTC legal, mainly out of 3D printed parts. The most challenging part was getting tolerances right, getting all the math correct, and getting the pod to fit in the build limit. I’m proud that it actually works. I have a working product right now and you should know that although the tuning can be a bit hard, the build is actually very easy. You can just download the files, print it out, get the parts, and build it in around a day or two", "repo": "https://github.com/Vixator/Phoenix-Force-10100-Differential-Swerve", "demo": ""}]...
|
[{"post_id": 71347, "ts": "202 [{"post_id": 71347, "ts": "2026-09-20T17:51:30Z", "hours": 4.35, "text": "Final design and print, need a bit more money for stronger filament/manufacturing, so will ship and then finish the project."}, {"post_id": 70478, "ts": "2026-09-19T08:16:24Z", "hours": 8.1925, "text": "Finished the full build and got everything assembled. It was very rough but it worked. Found a lot of problems and then started and almost finished redesigning it. I hope to print this out in a stronger material and try again to maybe have a more successful design."}, {"post_id": 70303, "ts": "2026-09-18T22:02:48Z", "hours": 14.9586, "text": "OMGGGG got first build done"}, {"post_id": 64029, "ts": "2026-09-08T04:39:06Z", "hours": 7.7411, "text": "It has been a long time working to fix all the previous issues. I think I have one of the most final versions of the model. I’ve only made very tiny tolerance revisions after the final version rebuild so I think I’m mostly stable for the CAD. I’ve been printing out everything to finally build both pods at once. I’ve compiled changes that I’ve done only on one pod or changes that should have plenty of clearance to work. Right now the final shell is printing. I’ll probably work on getting both pods disassembled tomorrow and reassembling them with brand new parts and it should all be coming together quickly. I also worked a lot on the code. I made the robot field-centric and also started using odometry to help out with the accuracy. I haven’t done anything with auto yet but I hope to do something with Pedro pathing to have an auto pathing system for my swerve. I’m pretty excited, to build the final version of my project and have a final product so this can come to a close."}, {"post_id": 63288, "ts": "2026-09-07T01:07:01Z", "hours": 12.1331, "text": "I finished doing the remodel with new parts. A lot of it was updating existing parts to fix what I noticed went wrong in the test build, which made V3. A lot of it was improving the clearances and tolerances between parts to reduce friction and increase efficiency. I also made a lot of changes to the software, which is currently uploaded to GitHub. My plans for the future are:Finish making the wheel grippier and make sure the tread doesn’t fall off.Make auto pathing software.Get a full drivetrain ready."}, {"post_id": 44981, "ts": "2026-08-11T03:18:09Z", "hours": 8.9275, "text": "After finding out about the previous issues in the last version, I finally finished version 2. This one uses different gears that avoid clipping and I changed a lot of the other tolerances. I also found a major thing that I got wrong in my design. Apparently somewhere along the line I dragged a component, which was messing up all the spacings and everything was out of line. I had to go back and fix all of that. I added a lot of convenience features for me to build this easier and made the pod shorter by a good 3 mm so I could actually add some aluminum protection on the ends to avoid the pod being damaged while driving. Overall I think there are a lot of improvements. Once I ship the mod and get the parts, I can finish building this pod and another pod to create a drive base. Hopefully I can finish programming it and hook it up soon so it works."}, {"post_id": 43735, "ts": "2026-08-09T04:35:17Z", "hours": 2.95, "text": "Just posted a devlog but forgot to publish my most recent timelapse and just wanted to give a couple updates. A lot of the tolerances for parts are highly dependent. When I’m inserting a bearing into a 3D printed part, I usually do 13.9 for a 14 mm bearing and 14.9 for the flange. Because some parts print really weirdly in a weird configuration or print vertically where the layers will collapse on each other, I had to make the outer race 15.2 mm and the inner race 14.2 mm, so 0.2 mm oversize instead of undersized. This gives proper tolerance.I also had a lot of weird print issues. I’ve been having a lot of stringing and I accidentally added supports on one of the parts so I’ve been losing a lot of material but it’s honestly taught me a lot as well.I attached a couple of pictures just to show you a difference from my last post. It’s been five minutes but it’s a slight difference. It’s just to show:- what I’ve gotten done- what I’ve assembled so far- what I’ve thrown away- what I’ve missed- okay this is an update after the 2-hour time lapse of me building an entire pod. There’s a lot of things but the biggest thing I noticed was that one of the bevel gears actually clips with the main drive ring gear, which ruins the entire model. This is the biggest issue I have to fix. Other issues I noticed were that assembling was very hard because a lot of the holes were too big and things would fall out when they were flipped over. I also didn’t have the right size screws often, which led me to have weird spacings. Mostly issues can be ironed out through CAD and now that I’ve built it once I can remember what went wrong. For the second version after I fix all these major and minor issues, I hope it’ll go much better and I can get a working pod that’s in size pretty soon for version two."}, {"post_id": 43078, "ts": "2026-08-08T04:46:01Z", "hours": 7.8169, "text": "I started recording and documenting this project halfway through the first revision. The first time lapse was me implementing the final preliminary designs, getting the encoder mounted, getting all the fittings correct, getting the bearing stacks right, and mounting everything in a way that it would technically fit in CAD. The second and third time lapses are mostly printing, getting tolerances right, and getting fits right. My first 3D build will be complete as soon as possible and I can get started on making revisions and iterations to improve the design. I think I focused a lot on trying to incorporate everything I saw. I looked at some designs online and reviewed everything that we needed to implement before hand. I think I’ve done a pretty good job of finding space for everything and putting everything in a nice compact fashion. I think after I get all the tolerances correct and finish assembling, this will be a great first iteration to improve upon. I hope this project can continue and I will get funding for my future prospects, which are getting this machined and getting higher quality parts."}]...
|
Title: Differential Swerve by @precon | Stardance
Title: Differential Swerve by @precon | Stardance
Devlogs:
I started recording and documenting this project halfway through the first revision. The first time lapse was me implementing the final preliminary designs, getting the encoder mounted, getting all the fittings correct, getting the bearing stacks right, and mounting everything in a way that it would technically fit in CAD. The second and third time lapses are mostly printing, getting tolerances right, and getting fits right. My first 3D build will be complete as soon as possible and I can get started on making revisions and iterations to improve the design. I think I focused a lot on trying to incorporate everything I saw. I looked at some designs online and reviewed everything that we needed to implement before hand. I think I’ve done a pretty good job of finding space for everything and putting everything in a nice compact fashion. I think after I get all the tolerances correct and finish assembling, this will be a great first iteration to improve upon. I hope this project can continue and I will get funding for my future prospects, which are getting this machined and getting higher quality parts.
Just posted a devlog but forgot to publish my most recent timelapse and just wanted to give a couple updates. A lot of the tolerances for parts are highly dependent. When I’m inserting a bearing into a 3D printed part, I usually do 13.9 for a 14 mm bearing and 14.9 for the flange. Because some parts print really weirdly in a weird configuration or print vertically where the layers will collapse on each other, I had to make the outer race 15.2 mm and the inner race 14.2 mm, so 0.2 mm oversize instead of undersized. This gives proper tolerance.I also had a lot of weird print issues. I’ve been having a lot of stringing and I accidentally added supports on one of the parts so I’ve been losing a lot of material but it’s honestly taught me a lot as well.I attached a couple of pictures just to show you a difference from my last post. It’s been five minutes but it’s a slight difference. It’s just to show:- what I’ve gotten done- what I’ve assembled so far- what I’ve thrown away- what I’ve missed- okay this is an update after the 2-hour time lapse of me building an entire pod. There’s a lot of things but the biggest thing I noticed was that one of the bevel gears actually clips with the main drive ring gear, which ruins the entire model. This is the biggest issue I have to fix. Other issues I noticed were that assembling was very hard because a lot of the holes were too big and things would fall out when they were flipped over. I also didn’t have the right size screws often, which led me to have weird spacings. Mostly issues can be ironed out through CAD and now that I’ve built it once I can remember what went wrong. For the second version after I fix all these major and minor issues, I hope it’ll go much better and I can get a working pod that’s in size pretty soon for version two.
After finding out about the previous issues in the last version, I finally finished version 2. This one uses different gears that avoid clipping and I changed a lot of the other tolerances. I also found a major thing that I got wrong in my design. Apparently somewhere along the line I dragged a component, which was messing up all the spacings and everything was out of line. I had to go back and fix all of that. I added a lot of convenience features for me to build this easier and made the pod shorter by a good 3 mm so I could actually add some aluminum protection on the ends to avoid the pod being damaged while driving. Overall I think there are a lot of improvements. Once I ship the mod and get the parts, I can finish building this pod and another pod to create a drive base. Hopefully I can finish programming it and hook it up soon so it works.
I finished doing the remodel with new parts. A lot of it was updating existing parts to fix what I noticed went wrong in the test build, which made V3. A lot of it was improving the clearances and tolerances between parts to reduce friction and increase efficiency. I also made a lot of changes to the software, which is currently uploaded to GitHub. My plans for the future are:Finish making the wheel grippier and make sure the tread doesn’t fall off.Make auto pathing software.Get a full drivetrain ready.
It has been a long time working to fix all the previous issues. I think I have one of the most final versions of the model. I’ve only made very tiny tolerance revisions after the final version rebuild so I think I’m mostly stable for the CAD. I’ve been printing out everything to finally build both pods at once. I’ve compiled changes that I’ve done only on one pod or changes that should have plenty of clearance to work. Right now the final shell is printing. I’ll probably work on getting both pods disassembled tomorrow and reassembling them with brand new parts and it should all be coming together quickly. I also worked a lot on the code. I made the robot field-centric and also started using odometry to help out with the accuracy. I haven’t done anything with auto yet but I hope to do something with Pedro pathing to have an auto pathing system for my swerve. I’m pretty excited, to build the final version of my project and have a final product so this can come to a close.
OMGGGG got first build done
Finished the full build and got everything assembled. It was very rough but it worked. Found a lot of problems and then started and almost finished redesigning it. I hope to print this out in a stronger material and try again to maybe have a more successful design.
Final design and print, need a bit more money for stronger filament/manufacturing, so will ship and then finish the project.
Ships:
I made a differential swerve that is FTC legal, mainly out of 3D printed parts. The most challenging part was getting tolerances right, getting all the math correct, and getting the pod to fit in the build limit. I’m proud that it actually works. I have a working product right now and you should know that although the tuning can be a bit hard, the build is actually very easy. You can just download the files, print it out, get the parts, and build it in around a day or two...
|
1793004697.0367296
|
1793091097.0367296
|
|
62931
|
GitWrapped by @NEBULA_X | Stardance
|
NEBULA_X
|
1
|
20.56
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T17:44:02Z", "hours": 11.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a project called GitWrapped. It can turn any GitHub profile into a Spotify wrapped style story. The most challenging things in this project for me were the CSS page CSS errors, positioning was also acting up, I think I had a sort of variable conflict or something, almost pushing my tokens to github which was automatically blocked, but that presented another pushing general issue, I eventually had to create a New repo since trying to fix the old one was too much unnecessary work. Im proud of the fact that I was able to think up an idea and build and deploy a working model all from scratch, thats pretty awesome to me. The software requires a VALID github username (obviously), any other information check out the README! It would be great if i could get feedback on the project itself from other people, so if you guys dont mind, drop what you think of it.", "repo": "https://github.com/IsraelAdedeji/GIT-WRAPPED-V2", "demo": "https://git-wrapped-v2.vercel.app/"}]...
|
[{"post_id": 81512, "ts": "202 [{"post_id": 81512, "ts": "2026-10-21T15:24:31Z", "hours": 3.5833, "text": "UHHHHHH, Finally almost done with the restyling (almost, I think), made a lot of changes, especially to the downloadable card, there were A LOTTT of errors EVERYWHERE!, and a small mistake will make you scratch your head for hours, I literally forgot to comment out ONE line of code, and it almost ruined everything, anyways, I should be making the finally touches soon (There genuinely is an github account for any name haha)"}, {"post_id": 79783, "ts": "2026-10-15T12:06:33Z", "hours": 2.8828, "text": "Added a dialogue box to the input screen inspired by the orpheus overlay Ive seen, although i want to use it for every screen, lets see how it goes. I almost broke the entire thing trying to make the dialogue box a global variable that can be used on every screen, so I quickly reversed all the changes, will try to do it again later I also used a default smiley face emoji as a placeholder, im still deciding whether to use pixel art or trying drawing a character myself (even though I cant really draw 0…0)"}, {"post_id": 78455, "ts": "2026-10-10T20:37:08Z", "hours": 1.8867, "text": "I created a simple welcome screen, with an animation as well too, and also a sort of dropping curtain overlay for when the button is clicked that comes down from the top, switches to the next screen then goes back up again. At first I encountered an issue where the overlay started from the middle of the screen to the top and bottom, but i was able to fix that after a few tweaks. I used the pixel font from google fonts because… well thats what I wanted to see when i open the software so…"}, {"post_id": 71850, "ts": "2026-09-21T17:26:59Z", "hours": 1.2119, "text": "#UPDATE I did a little retouch to the UI because it apparently looked like I used AI heavily for it (I used it to do some code correction and implementation issues mainly), but I have redone it with my own personal touch (based on what ive learned while building the first version). I changed the background to a simple color gradient instead of the characteristic glossy AI looking background and adjusted the color code a little. The overall layout is still pretty much the same."}, {"post_id": 71337, "ts": "2026-09-20T17:31:41Z", "hours": 2.7936, "text": "Final devloggggg!!! Im finally done with version one of GitWrapped!!! Honestly this has been one of the most exciting but frustrating projects ive ever done. I spruced up the UI a bit to make it feel more appealing. I added a work history heatmap, downloadable summary card that can be shared with friends, link to the github account the summary is referencing, and a bunch of other tiny fixes/updates. Deploying was a bit problematic too cause of the GitHub PAT I used, so I had to find a better secure work around. Learning stuff for the first time can be crazy, cause the tiniest of mistakes can cause an error and lead you on wild goose chases lasting hours, my final bug for this project was literally just a single “.”, thats it, I started wondering whats wrong but after a while i was able to discover it. So thats pretty much it for GitWrapped, Hope you guys like it!"}, {"post_id": 70858, "ts": "2026-09-19T21:39:44Z", "hours": 5.5714, "text": "Javascriptttttttt!!! It was a battle getting everything to work like i intended, when you try fixing something, something else breaks. Well… Ive made the software interactive, it can fetch and display live data from github over the github API. I also designed an activity heatmap, similar to the one in github to show work. I spent soooooooo much time on debugging, i discovered bugs that i didnt notice during the html and css phase. Visibility toggling, incorrect id syntax in HTML css caching as well too, (although i learned i could disable it later on so…) and screens stacking on each other were some of my major problems. I feel im almost done done, ill just do one last polish and readme as well."}, {"post_id": 70571, "ts": "2026-09-19T11:47:00Z", "hours": 1.7011, "text": "Finally done with the CSS for this project (I think) I learned about a bunch of new css elements and using the :root tag too, which makes it quite a lot easier to make changes. Colour gradients make it look even nicer too. Well, uhmmm… Thats it I guess, dont know what to write anymore, gonna work on the interactivity next"}, {"post_id": 69330, "ts": "2026-09-16T20:29:24Z", "hours": 0.5092, "text": "And im back again after a long break, this time im working on GitWrapped, spotify wrapped inspired interface. For now ive only built the html code for the frontend. Its supposed to take the username of the github account and pull information about it to be displayed in an interesting format. I actually decided to build this cause a similar situation happened recently where people were trying to show off their accounts, so i thought making a fun in piece of software for doing that would be nice. The fetching your story… part isnt supposed to be visible btw, its supposed to display after the user has entered A VALID username, ill work on those functionalities next (after the styling obviously)"}]...
|
Title: GitWrapped by @NEBULA_X | Stardance
Devlog Title: GitWrapped by @NEBULA_X | Stardance
Devlogs:
And im back again after a long break, this time im working on GitWrapped, spotify wrapped inspired interface. For now ive only built the html code for the frontend. Its supposed to take the username of the github account and pull information about it to be displayed in an interesting format. I actually decided to build this cause a similar situation happened recently where people were trying to show off their accounts, so i thought making a fun in piece of software for doing that would be nice. The fetching your story… part isnt supposed to be visible btw, its supposed to display after the user has entered A VALID username, ill work on those functionalities next (after the styling obviously)
Finally done with the CSS for this project (I think) I learned about a bunch of new css elements and using the :root tag too, which makes it quite a lot easier to make changes. Colour gradients make it look even nicer too. Well, uhmmm… Thats it I guess, dont know what to write anymore, gonna work on the interactivity next
Javascriptttttttt!!! It was a battle getting everything to work like i intended, when you try fixing something, something else breaks. Well… Ive made the software interactive, it can fetch and display live data from github over the github API. I also designed an activity heatmap, similar to the one in github to show work. I spent soooooooo much time on debugging, i discovered bugs that i didnt notice during the html and css phase. Visibility toggling, incorrect id syntax in HTML css caching as well too, (although i learned i could disable it later on so…) and screens stacking on each other were some of my major problems. I feel im almost done done, ill just do one last polish and readme as well.
Final devloggggg!!! Im finally done with version one of GitWrapped!!! Honestly this has been one of the most exciting but frustrating projects ive ever done. I spruced up the UI a bit to make it feel more appealing. I added a work history heatmap, downloadable summary card that can be shared with friends, link to the github account the summary is referencing, and a bunch of other tiny fixes/updates. Deploying was a bit problematic too cause of the GitHub PAT I used, so I had to find a better secure work around. Learning stuff for the first time can be crazy, cause the tiniest of mistakes can cause an error and lead you on wild goose chases lasting hours, my final bug for this project was literally just a single “.”, thats it, I started wondering whats wrong but after a while i was able to discover it. So thats pretty much it for GitWrapped, Hope you guys like it!
#UPDATE I did a little retouch to the UI because it apparently looked like I used AI heavily for it (I used it to do some code correction and implementation issues mainly), but I have redone it with my own personal touch (based on what ive learned while building the first version). I changed the background to a simple color gradient instead of the characteristic glossy AI looking background and adjusted the color code a little. The overall layout is still pretty much the same.
I created a simple welcome screen, with an animation as well too, and also a sort of dropping curtain overlay for when the button is clicked that comes down from the top, switches to the next screen then goes back up again. At first I encountered an issue where the overlay started from the middle of the screen to the top and bottom, but i was able to fix that after a few tweaks. I used the pixel font from google fonts because… well thats what I wanted to see when i open the software so…
Added a dialogue box to the input screen inspired by the orpheus overlay Ive seen, although i want to use it for every screen, lets see how it goes. I almost broke the entire thing trying to make the dialogue box a global variable that can be used on every screen, so I quickly reversed all the changes, will try to do it again later I also used a default smiley face emoji as a placeholder, im still deciding whether to use pixel art or trying drawing a character myself (even though I cant really draw 0…0)
UHHHHHH, Finally almost done with the restyling (almost, I think), made a lot of changes, especially to the downloadable card, there were A LOTTT of errors EVERYWHERE!, and a small mistake will make you scratch your head for hours, I literally forgot to comment out ONE line of code, and it almost ruined everything, anyways, I should be making the finally touches soon (There genuinely is an github account for any name haha)
Ships:
This is a project called GitWrapped. It can turn any GitHub profile into a Spotify wrapped style story. The most challenging things in this project for me were the CSS page CSS errors, positioning was also acting up, I think I had a sort of variable conflict or something, almost pushing my tokens to github which was automatically blocked, but that presented another pushing general issue, I eventually had to create a New repo since trying to fix the old one was too much unnecessary work. Im proud of the fact that I was able to think up an idea and build and deploy a working model all from scratch, thats pretty awesome to me. The software requires a VALID github username (obviously), any other information check out the README! It would be great if i could get feedback on the project itself from other people, so if you guys dont mind, drop what you think of it....
|
1793058682.8353505
|
1793145082.8353505
|
|
10338
|
Liable For Damages by @wilson_brunner | Stardance
|
wilson_brunner
|
1
|
214.95
|
2560
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T17:08:06Z", "hours": 211.0, "multiplier": 13.61, "payout": 2560, "blessing": "neutral", "text": "I made something! This was my first time coding outside of Arduinos, and one of the biggest learning experiences of my life. There was stress, time crunches, and pain, but it all came down to the wire. The most challenging part was drawing, of course, I’m never going to do this again JUST because of the assets. Thanks for playing", "repo": "https://github.com/wilbot3000/Liable-For-Damages", "demo": "https://wilbot3000.itch.io/liable-for-damages"}]...
|
[{"post_id": 75085, "ts": "202 [{"post_id": 75085, "ts": "2026-09-29T03:15:45Z", "hours": 3.1931, "text": "Started working on Liable for Damages 2.0 Devlog #1 Started working on better settings, mostly just things for volume, fonhts, and scrolling things. Whipped up some basic sprites in aseprite and took a day to implement them and figure out bugs, which were very annoying, mostly just related to button sizing. Had to mess around with Godot’s “containers”, for the first time, and it was quite bad, I’ve got some more work to do before I can get the sliders to work, but I’m close! Next stuff’s: -format sliders -start creating settings related to different busses -create saves for the sliders -implement button to change font -make font-changed labels for all maps -do bum ahh drivers ed instead of W Stardance I’ll hopefully release 2.0 within October, and I’mma try and devlog more! ~Wil"}, {"post_id": 72459, "ts": "2026-09-23T00:48:57Z", "hours": 0.7572, "text": "devlog for projects i forgot to add, really just time from learning to export godot games, very annoying um, fun fact, if you create a web game, change the file to index.html, or it literally WON’T WORK!!! Play my game (now!)"}, {"post_id": 71208, "ts": "2026-09-20T13:27:09Z", "hours": 10.0756, "text": "Final Release (or close to it) Game will be out soon, I just gotta ship, but everythings done, I finished sounds, and the ending yesterday, like a 8 hour coding marathon, so i could get this out in time. PLEASE play it, it’s called Liable for Damages, I don’t know where I’ll post it yet, but It’ll probably be on Itch.io or just the game application file. It’s like 150,000 kilabytes, so it shouldn’t be too bad for any computer, hopefully (mines from like 2009 and it ran fine) P.S! Please, (if you do play), comment bugs, especially major things, EXCEPT: -Player dissapearing when opening menu in elevator (don’t try this, im not fixing it it’s funny) -Bugs on top of head, (js kill them) Anything else is bad and needs fix thanks. Also sorry no volume controls, I was crunching down to finish."}, {"post_id": 69943, "ts": "2026-09-18T03:13:43Z", "hours": 10.1883, "text": "SFX stuff, final thing before ending, just finishing sounds, really annoying though ngl. done soon, big update at end"}, {"post_id": 67708, "ts": "2026-09-13T22:09:54Z", "hours": 11.4017, "text": "FINAL STRETCH time to lock in please oh no Im finishing the last level, no time to talk, but got like 4 things to finish THINGS: -level -boss fight -sounds -ending -bugs"}, {"post_id": 59735, "ts": "2026-09-01T17:44:56Z", "hours": 10.84, "text": "WORKING ON MY FINAL STRETCH I’m going to be locked in for the next few days, school starts, so I’ll have less time, but I got a boss fight and then bug fixing and sound effects, hears a sneak peak and one of the many things ive worked on. Also, I came up for a name. Looked up the universal laws for space and saw something about how “Countries of Origin are Liable for Damages caused by their space debris” and said “dang, thas dope” so now i have a name. In my next log ill have a longer devlog like a lite trailer, but the games pretty short, more like a showcase of learning. Thanks!"}, {"post_id": 55339, "ts": "2026-08-27T02:45:42Z", "hours": 9.8842, "text": "quick stuff, nothing much Finished some updates, but I’m locked so don’t have time to write much"}, {"post_id": 53129, "ts": "2026-08-23T15:40:04Z", "hours": 10.67, "text": "Another devlog about levels. Started work on the second (this takes so long) I can’t say much for fear of spoilers, but just say this involves WAY to much code and sprites (I hate drawing so much)"}, {"post_id": 51334, "ts": "2026-08-20T22:46:55Z", "hours": 10.2436, "text": "quick devlog. I need to do this cause i got 10 hours, Im working on the level system and im so tired please why is htis so hard D: D: D: D: D: D: D: D: D: D: D: D:"}, {"post_id": 49718, "ts": "2026-08-18T17:06:16Z", "hours": 9.2325, "text": "keypads, doors, and beginning of the first level. Im actually making a game! contains spoilers First of many… keypads were really difficult, every button, when clicked, multiplies the correct number by a multiplier, and adds it to a “code” variable. the multiplier is chosen based on what step of the code you’re on, (e.g, 1: 10000, 2: 1000, 3: 100, 4: 10, 5: 1), when you click the green button, it cross checks another variable with the one you typed, and if they’re the same, it sends the function to open the doors, and if not, everything resets. The other terminals and what not just open things when clicked on, so it’s just an easier version of the keypad."}, {"post_id": 47241, "ts": "2026-08-15T01:07:13Z", "hours": 8.0058, "text": "Flying enemy is complete, in record time! wow, 8 hours for an enemy, how quick D: This was a challenge, but also really fun. This enemy is the flying one, which made it a little more difficult than just the copy and paste of old ones but still pretty cool. It works using a Navigation Agent, which is like Godot pathfinding. Fast forward three hours and a whole lot of troubleshooting, but that works. The enemy detects the player in the same fashion as the other enemies and then activates the nav-agent to being movement. It’ll follow the player through vents, passages and really anywhere. The fly has three main detection circles, the first one tells it to move towards the player, if the player enters the second one, it’ll freeze and stop moving, and if the player gets even closer, it’ll try to move away (by reversing the velocity var outputted by the nav-agent, iyc) the enemy’s one hit, acourse, but is really annoying to attack, (ill rework ground pounding to make this easier later). The enemy has a shooting attack, that is on a 6 second timer if it can see the player, otherwise it’s just on hold. its shots are pretty slow, so there easy to avoid, but in a crowded fight ya never know. The main quirk of this enemy is it has a really long forgetfulness timer, so even if it can’t see you, it’ll continue to follow for quite a long time, much longer than other enemies. Next:! -stationary, weird wall tentacle that shoots at you -egg spawner that hatches into 1 of three enemies (mystery ooh) -doors (ikr)"}, {"post_id": 44372, "ts": "2026-08-10T02:47:57Z", "hours": 2.9308, "text": "Enemy is complete: Chomper! Lot of work, but got it done. This is the, please avoid, very dangerous, you will die enemy. I haven’t balanced its health yet, and I’m not going to for a while, so it looks like an easy kill in the video. The weird quirks of this enemy are mostly in its charge attack, that rushes the player. It’s pretty easy to avoid, but once again i haven’t done attack balancing, so it may become harder later. The majority of the enemy works just like the lil guy, so idk read that devlog. But there is two major differences: LIST: gasp 1.!!!1! : idle stuff -really just a randomizer -if enemy is idling, starts a timer, and when it runs out of time, it does one of two things (using a randi() function) -if the outputs a 1, nothing happens, but if its a 2 it flips the enemy, thas all -the main reason for this is that since this enemy is so big, making it a tad more animated than the lil guy felt important to me, and also because the detection areas for the big guy are skewed towards the front, so him turning around makes the player sneaking up on him a little less common, it’s generally just for Q-O-l (slang btw) (only cool people understand) 2.!: dash -dear lord, why was hard so much D: -Wasn’t actually that difficult, I spent a lot of time trying stuff before realizing I just unleash my inner enginneer and do it step by step ’till it works, which it did. -first, theres three detection boxes, one for walking towards the player, one for the chomp, and one for dashing, if the player enters the dash-box, a timer will start -when the timer ends, the charge animation plays, which halfway through, activates a function too add velocity (actual charge part of charge) -If the enemy hits a wall, player, or box, it stops moving, but in the case of the player it plays a second animation (dash_hit) that looks like a chomp and kills the player if it hits them. Theres another If statement that sets velocity back to 0 when this happens also. OTHER CHANGES: -I removed the players health really, I like games that are one shot, because it’s subjectively more fun, I’ll make the player death a little more explosive if I have time. I’ll probably make them have three health but that’ll change when I do attack balancing -made the lil guys attack timer shorter, makes him more dangerous. NEXT TIME PLANS: -hopefully in one day (ima lock in rq) -gonna add a flying enemy, -literally just a tad fly, like 5x5 pixels, it’ll look at the player and fire acid that’ll kill you -i might change the death animation to be more BOOM (IYKWIM) :D -my goal is too complete the flying guy 100% tomorrow, but I got other stuff to do so we shall see -also it’ll be nice to not have to do major animating besides literally 6 pixels splaterring -if extra time, I’ll make a weird egg thing that turns into the fly THANKS FOR READING! as always (not really) go make some interesting, and uh learn something new every day please (P.S I made some changes after I took these videos so it still looks and feels kinda bad but not actually rn) ~Wilfred"}, {"post_id": 44000, "ts": "2026-08-09T14:18:20Z", "hours": 11.6767, "text": "Little enemy beginnings I haven’t actually finished anything yet, but I need to devlog anyways, but I have started to finish the second enemy, which is also the framework for more."}, {"post_id": 41460, "ts": "2026-08-05T17:57:18Z", "hours": 12.2908, "text": "player movement is complete!! went on vacation, so fell behind a bit, but finally got this done. I spent a lot of time thinking on how to make player movement good, and then thought of my BOTW playthroughs, where you can either hold your attack and have a powerful slash, or click fast and hit three in a row. First addition!: Ground pounds were pretty interesting, all it does is forces the player down hard if they attack in the air, decreases stamina, and then hits the ground, I added a dust cloud that explodes when he hits the ground, which just plays the animation and then disappears. I had to do some fenagling with this because the code knows when to start the animation because the player will be ground pounding and on the ground, which starts the poof and then stops ground pounding, which also keeps the animation from playing multiple times. SECOND: Annoying stupid player attacks. Tried to finish this in a day, so I was working till 11:00 at night, but I got the animations done and what not. When the player hits/holds the attack button, it starts a stopwatch that increases, when the player releases the button, depending on the time on this timer, it will either play the first of 3 quick attacks or the big attack, which does more damage. If the quick attacks are chosen, the first one will play, three things happen when thats starts, 2 timers start, and player velocity increases to 500. at the end of the attack, there are three things can happen, the player can wait until the animation ends, they can attack again, or they can walk to reset the attack earlier than waiting, the first timer forces the player to wait to cancel the attack by walking, and the second one stops their velocity so they jolt forward. at the end of the animation, a function is played that: starts the reset timer for the attack A variable increases that sets the next attack to be the second or third in the sequence, instead of the first and a if statement that resets the variable to 0 if it gets to 3. Theres some other details for weird situations, like falling off the edge and ground pounding while attacking, or the variable not resetting weirdly. But all of that was like an hour. Thanks for reading: Play my game when it comes out so I have a reason to finihs Also I need a name for the game (please, I suck at naming) and go play Legend of Zelda (or Just Cause 3) (or research operation Just Cause) #USinvadinglatinamericaAGAINfornoreason P.S (I was gonking on being up till eleven, but I did like 3 hours of animating and coding in like 30 minutes while being food deprived and barely awake because deadlines = lock in, so if you need to lock in just don’t sleep ig ) also, I’m technically not done ‘cause ma boy needs a sawed off before I’m done here Yee Haw"}, {"post_id": 35583, "ts": "2026-07-27T03:37:24Z", "hours": 1.1306, "text": "MOVEMENT PART # (3) les go took me short time, it’s ten o’clock im tired, pretty simple stuff. If player is sprinting and the crouch button is pressed, the normal function is overridden and a slide is activated, this just sets the animation to slide and the X velocity of the player to a high number. There’s some other code for just general quality of life, like stopping if you hit a wall and keeping you from changing directions, but the REALLLY cool part is jumping. Like in real life (trust), while sliding the player will jump further, which permits some cool movement combinations, like vaulting over gaps and climbing 4 block walls. I have to work out stamina changes depending on jump strength and stamina decrease for vaulting, but the movement getting pretty fleshed out. P.S, after I took the video, I changed the sprint stamina decrease to be a consistent decrease instead of being choppy like in the video, it’ll be in the next log, but it was just quality of life. NEXTS STUFFS: -dash -enemy lunge -stamina from hoisting and slide-jump stamina increase Thanks for reading!"}, {"post_id": 34965, "ts": "2026-07-26T03:00:51Z", "hours": 3.8936, "text": "Crouching! #2 in the player movement chronicles! Surprisingly, I also managed to create a whole new 5 animations! slide, crouch idle, crouch walk, and the sledge versions (not slide cause ya can’t sprint with sledge). I implemented all but the slide, which’ll take a long time, so I’m going to keep it off a bit. This was really straight forward to add, and for the first time in a long time, i had like only 1 problem . I really just had a piece of code that asks, “did ya click the crouch button?” and if so, it toggles crouch. IF (and only if!) the crouch is on (or “true”) the idle and walk animations are switched to their respective crouch variants, and the normal player hitbox is replaced by a shorter-er-est one. To bar the player from un-crouching in the midst of a tunnel, I added 2 new raycasts to the front and back of the players head facing up, these casts detect if there is a block above the player, and if either one of them detects anything, the player is unable to un-crouch until they are unshielded. Another quick thing I had to fix a bit was the raycasts detecting the player, which broke EVERYTHING so I just turned good ’ol collision mask/layer 20 into the super-cool (ALL-NEW !!) “player raycast collision!!!” which just only lets them interact with the floor and boxes, so yippee NEXT STEPeths!: -slide ): -enemy lunge -other player attacks (only hard attack right now which is bad)"}, {"post_id": 34347, "ts": "2026-07-24T23:18:41Z", "hours": 13.5214, "text": "Mantling and fixes Hi. I have had a very long week. I spent a lot of time working on sprites, mostly for the game 3rd level (no spoilers, (but that’s pretty boring) so heres the interesting part. I’ve been focusing on revamping player movement to make it feel more interesting and fun, and this is a good start. Mantling! if you don’t know what this is, it’s what you do when you get out of a pool without a ladder or staircase, pretty much just “pulling yourself up” The player does this by using raycasts, I added three, but one is for something else. One of them detects a wall in front of the player, and one detects a wall above. The code uses these casts to detect if the player is up against a wall, and if there is no wall above the player, pretty much checking if there is a mantalable ledge. If there is, the code says “you can mantle” Another line says: if you can mantle, and you are not on the ground, and if the player clicked space (Jump), then mantle. The annoying part was animations. When the player begins mantling, the hitbox and player position is frozen in space, and position is snapped to the nearest block to line up the animation. the only thing that moves during the animation is the player sprite, which means at the end of the animation, when the players position is finally changed, the player sprite needs to snap back at the EXACT same time, or it looks bad, which was hard. The other annoying part was the camera snapping randomly, as it moves with the player and not the sprite. I fixed this by just temporarily turning on the cameras position smoothing while the mantle is happening and then turning it off when the player moves again."}, {"post_id": 31003, "ts": "2026-07-19T01:34:03Z", "hours": 14.4064, "text": "sprites! done some stuff, mostly just game planning (sadly didn’t get time for because notes but I got a lot done, mostly just some serious drawing. I finished some tiles for the first and second levels, and some tiles for the next three."}, {"post_id": 26947, "ts": "2026-07-12T01:17:07Z", "hours": 4.2967, "text": "Quick hurt animations Main thing I added was animations for death and injury. I first added knockback when hit. It just takes the player’s scale.x (what i use for flipping the sprite) and multiplies it by 200 to the player velocity, since the scale is either 1 or -1, it changes the direction the player is thrown (in the future i’d like to make the scale the enemies direction, not the players, as if the player is flipped in the wrong direction, it could have knockback in the wrong direction (very bad) Theres was already a variable to detect if the player was being hit that was used for testing, so I just implemented that to play the injury animations. i also detected if the players health was zero or below after being hit, and if so it would make the player play the death animation instead of the injury. I have currently unimplemented animations for a before-death injured player, so after they are hit for the last time they will stand for a bit before collapsing. NEXT STUFF: (hast beeneth narrowed list) -add enemy knockback (only when injured, lok wierd when die) -fix player knockback thank yoh forth coming to my TED talk"}, {"post_id": 25010, "ts": "2026-07-08T22:32:29Z", "hours": 12.3911, "text": "I’m gonna start this by saying: I HATE animating! Aseprite made this so much easier, but GOD this was difficult… I think I had 5 situations this time around where the problem was the littlest change in the world, and I just needed to go to bed. I made 3 different walk cycles, before giving up and figuring out how to do it for real, it was only a little difficult after that. I have unused hurt, death, and push animations, and need to implement a shorter attack and smooth some things out still (jumping while attacking cough ) Almost all of these 12 hours was fixing stupid little problems and changing little pixels, probably some of the worst time ive spent on this project yet… (but still really interesting) NEXT STEPS::: -fix walk so it looks sensible (drifting) -make jumping illegal hwilst attacking -add short attack -customized tile map ????? Thank you for reading goodbye I want to stop animating"}, {"post_id": 21598, "ts": "2026-07-03T17:09:19Z", "hours": 4.0883, "text": "enemy attacks/better particles. This took some work, but not really… The enemy can now attack and hurt the player the codes really just the same as the player attacking the enemies. Theres a hurtbox in the player that gets hit by an area in the enemy that makes them take damage. The particles took some more difficult work. Godot has CPU and GPU particles, which apparently are different, it just depends on what in your computer renders them. I used GPU particles, because they run better and can collide with things. I whipped up a sprite sheet for the particles in Aseprite, which looked a lot better than the weird purple generic Godot things. The particles only collided with light occluders??, so I added an occlusion layer to the tile map, at some point I hope to create a better system for when they hit the ground, but thats not my priority right now. Next STEPS!!!!! -main thing is that the enemy has a lunge attack that I haven’t implemented yet, so thats next. -starting on the player sprites, this is a LOT of work, so its gonna take me a lot of time, but no time like the present"}, {"post_id": 20225, "ts": "2026-07-01T19:32:16Z", "hours": 5.3086, "text": "Some more enemy development! -first “enemy” in the game, a pretty basic little thing. -designed on Aseprite, took some time to set up with hakatime, but turns out I was using a version only used on Mac OS, so no kidding it was giving me trouble -I created unused animations for a lunge and whip attack animations that I will implement soon (?). NEXT STEPS :D : -stop the player from colliding with the enemy’s hitbox, it’s very annoying, and in the future will we a necessity for having many creatures in the same room -add the enemy attacks, I’ll probably just use a raycasy to see if the players close enough, and then make it hit, pretty simple… Also get Aseprite, it’s like 20 bucks but it’s a really good software, also it’s just really good for game making. gasp :D"}, {"post_id": 18857, "ts": "2026-06-30T01:51:26Z", "hours": 10.155, "text": "Basis of an enemy AI!!! the beginnings… I feel like ten hours is a little much for just this, but there was so much work to do. The main step began with a pretty simple area. It just detects if the player enters. The code uses the player position (or “target” position in the code), and subtracts it from the enemy position, if the numbers greater than 1 it moves one way and if less than -1 other. (The buffer in-between the 2 is just for smoothing) If the player is within the hitbox, the enemy shoots out a ray cast towards the player. If it touches the player, it lets the enemy move, if it hits a box or the ground first it doesn’t, pretty simple, till you realize what can go wrong… For clarification i have NO CLUE why any of what i did helped, but it did so yippee!!! The first problem was that the enemy would only detect the player if they were off the ground. I tried to fix this by forcing the ray cast to not interact with the Tile Map (which wouldn’t have worked anyways, because it still needs to so the objects can block the enemy’s sight). I set a piece of code to print what the enemy was interacting with, and it turns out it was the background? (I know, weird?) I seperated the background and collision ground into 2 tile layers, then turned of collisions for the back layer. After that there was some glitchy stuff which you can see in the video a bit, but I fixed almost all of it with literally one if statement that only lets the player become a target for the code (My code is a modified version from this website) / / / / / Godot 3.0: Visibility with Ray-casting · KCC Blog"}, {"post_id": 14832, "ts": "2026-06-24T02:59:54Z", "hours": 4.9869, "text": "Devlog #4? 3 big things this time, physics blocks, destructive blocks, and stamina upgrades. Physics!: -just a block but it’s a “rigid body”, so Godot gives it physics. -It uses some “borrowed code” to detect if the player is colliding with something and then add the players velocity to it.* -I had to change the hitbox of the floor to be a collision polygon, instead of one per block, which made the pushing kind of shotty.** Destruction!: -Really simple… just an enemy that can’t move or fight back. I added an animation so you can tell it’s getting hit but that’s the most complicated it got. Stamina! (it’s better): -I added 3 major things, though 2 of them are pretty small. First, I added a bar, Godot has a built-in progress bar node, so I just mapped the value from 0 - 10, and used the stamina value from the player as the value input -SECOND! I changed the recharge, instead of a variable that goes up when a timer ends, it now uses a move_toward() function to make the stamina tick up smoothly. -thirdibidily, a pause. Mainly because irl and in games you don’t just start recharging as soon as you stop moving. This uses a float that begins to tick up when the player starts moving, and when it surpasses a certain point, it allows the stamina to recharge. Final stuff!!! -I’ll start focusing on: -more indepth weapons -and maybe ai for enemies… probs something with raycasts……….."}, {"post_id": 13221, "ts": "2026-06-21T17:28:44Z", "hours": 1.7094, "text": "Sprinting! took a bit, but I finally got sprinting to work. Works pretty simply, the characters motion is determined by a speed variable, which just increases if the sprint button (shift) is held down. Here’s the code: if Input.is_action_just_pressed(“sprint”) and stamina >= 1: state_machine.travel(“sprint”) sprinting_timer.start() SPEED = 200 sprinting = true elif Input.is_action_just_released(“sprint”): SPEED = 75 sprinting = false sprinting_timer.stop() I’m using an animation_tree for my animations, instead of just a player, this helps the transitions from animations feel smoother, so thats what the “state_machine” is. The “sprinting” variable is used to force other animations (e.g, for idling and running) to check if the player is sprinting, and thus not override the animation (the sprinting animation currently is identical to running, but when I start designing the character i’ll change that). The timer is just on a .5 sec loop, and makes the stamina decrease when it ends, the second bit of code checks if you stopped sprinting, and returns the SPEED to normal and stops the timer loop. This code doesn’t actually fully work, as another if statement is needed. The extra “and” in the first check makes sure you can’t start sprinting if stamina is below one, but actually only checks once when you start sprinting, not constantly, so the sprinting doesn’t stop if stamina goes below 1 (like it should). if stamina < 1: SPEED = 75 sprinting_timer.stop() sprinting = false This code, unlike the first “if”, checks consistantly if stamina’s below one, and does the same job as if you let go of sprinting. This keeps stamina from going negative D: In the future I plan on adding a gradient to the effect, so the speed up isn’t as jarring, but this is a good start! Thanks to Brackeys for the current assets! (go watch his video on Godot, it’s very informative) ~wil"}, {"post_id": 12762, "ts": "2026-06-20T21:26:41Z", "hours": 13.1589, "text": "Finally started to develop a “game” made 3 things, Attacks, Stamina, and GUI Attacks: ->use hurtboxes detect if an area entered, if that area is_in_group(“attackarea”) the hurtbox takes a damage variable and applies it to the thing it’s attached too (Player, enemy, etc) Stamina: -> A timer slowly makes it tick upwards, starts at 10, and goes down if the player jumps or attacks, uses a Global Variable allow the GUI to display the stamina (there’s probably a better way but I’m lazy ¯ _ (ツ)_/¯) GUI: ->uses a canvas layer being displayed over a sub-viewport, which includes the coins and stamina, just displays text and then the quantities of each integer. next steps: ->destructible blocks ->physics blocks ->stamina bar (not integer) ->sprinting (and smoother movement. Thanks to Brackeys for the assets!"}, {"post_id": 5987, "ts": "2026-06-10T01:24:33Z", "hours": 4.8608, "text": "Finally done learning basic Godot!! My entire time has been dedicated to just learning how to use the software, and I’m glad to say I now have something to work off of. I still need to learn more, like GDscript, pixel art, and game design. Next Steps! -develop weapon (sledgehammer :D) -destructible terrain elements (fancy walls that get destroyed) -physics blocks -begin designing character and aliens"}]...
|
Title: Liable For Damages by @wilson_brunner | Sta Title: Liable For Damages by @wilson_brunner | Stardance
Devlogs:
Finally done learning basic Godot!! My entire time has been dedicated to just learning how to use the software, and I’m glad to say I now have something to work off of. I still need to learn more, like GDscript, pixel art, and game design. Next Steps! -develop weapon (sledgehammer :D) -destructible terrain elements (fancy walls that get destroyed) -physics blocks -begin designing character and aliens
Finally started to develop a “game” made 3 things, Attacks, Stamina, and GUI Attacks: ->use hurtboxes detect if an area entered, if that area is_in_group(“attackarea”) the hurtbox takes a damage variable and applies it to the thing it’s attached too (Player, enemy, etc) Stamina: -> A timer slowly makes it tick upwards, starts at 10, and goes down if the player jumps or attacks, uses a Global Variable allow the GUI to display the stamina (there’s probably a better way but I’m lazy ¯ _ (ツ)_/¯) GUI: ->uses a canvas layer being displayed over a sub-viewport, which includes the coins and stamina, just displays text and then the quantities of each integer. next steps: ->destructible blocks ->physics blocks ->stamina bar (not integer) ->sprinting (and smoother movement. Thanks to Brackeys for the assets!
Sprinting! took a bit, but I finally got sprinting to work. Works pretty simply, the characters motion is determined by a speed variable, which just increases if the sprint button (shift) is held down. Here’s the code: if Input.is_action_just_pressed(“sprint”) and stamina >= 1: state_machine.travel(“sprint”) sprinting_timer.start() SPEED = 200 sprinting = true elif Input.is_action_just_released(“sprint”): SPEED = 75 sprinting = false sprinting_timer.stop() I’m using an animation_tree for my animations, instead of just a player, this helps the transitions from animations feel smoother, so thats what the “state_machine” is. The “sprinting” variable is used to force other animations (e.g, for idling and running) to check if the player is sprinting, and thus not override the animation (the sprinting animation currently is identical to running, but when I start designing the character i’ll change that). The timer is just on a .5 sec loop, and makes the stamina decrease when it ends, the second bit of code checks if you stopped sprinting, and returns the SPEED to normal and stops the timer loop. This code doesn’t actually fully work, as another if statement is needed. The extra “and” in the first check makes sure you can’t start sprinting if stamina is below one, but actually only checks once when you start sprinting, not constantly, so the sprinting doesn’t stop if stamina goes below 1 (like it should). if stamina < 1: SPEED = 75 sprinting_timer.stop() sprinting = false This code, unlike the first “if”, checks consistantly if stamina’s below one, and does the same job as if you let go of sprinting. This keeps stamina from going negative D: In the future I plan on adding a gradient to the effect, so the speed up isn’t as jarring, but this is a good start! Thanks to Brackeys for the current assets! (go watch his video on Godot, it’s very informative) ~wil
Devlog #4? 3 big things this time, physics blocks, destructive blocks, and stamina upgrades. Physics!: -just a block but it’s a “rigid body”, so Godot gives it physics. -It uses some “borrowed code” to detect if the player is colliding with something and then add the players velocity to it.* -I had to change the hitbox of the floor to be a collision polygon, instead of one per block, which made the pushing kind of shotty.** Destruction!: -Really simple… just an enemy that can’t move or fight back. I added an animation so you can tell it’s getting hit but that’s the most complicated it got. Stamina! (it’s better): -I added 3 major things, though 2 of them are pretty small. First, I added a bar, Godot has a built-in progress bar node, so I just mapped the value from 0 - 10, and used the stamina value from the player as the value input -SECOND! I changed the recharge, instead of a variable that goes up when a timer ends, it now uses a move_toward() function to make the stamina tick up smoothly. -thirdibidily, a pause. Mainly because irl and in games you don’t just start recharging as soon as you stop moving. This uses a float that begins to tick up when the player starts moving, and when it surpasses a certain point, it allows the stamina to recharge. Final stuff!!! -I’ll start focusing on: -more indepth weapons -and maybe ai for enemies… probs something with raycasts………..
Basis of an enemy AI!!! the beginnings… I feel like ten hours is a little much for just this, but there was so much work to do. The main step began with a pretty simple area. It just detects if the player enters. The code uses the player position (or “target” position in the code), and subtracts it from the enemy position, if the numbers greater than 1 it moves one way and if less than -1 other. (The buffer in-between the 2 is just for smoothing) If the player is within the hitbox, the enemy shoots out a ray cast towards the player. If it touches the player, it lets the enemy move, if it hits a box or the ground first it doesn’t, pretty simple, till you realize what can go wrong… For clarification i have NO CLUE why any of what i did helped, but it did so yippee!!! The first problem was that the enemy would only detect the player if they were off the ground. I tried to fix this by forcing the ray cast to not interact with the Tile Map (which wouldn’t have worked anyways, because it still needs to so the objects can block the enemy’s sight). I set a piece of code to print what the enemy was interacting with, and it turns out it was the background? (I know, weird?) I seperated the background and collision ground into 2 tile layers, then turned of collisions for the back layer. After that there was some glitchy stuff which you can see in the video a bit, but I fixed almost all of it with literally one if statement that only lets the player become a target for the code (My code is a modified version from this website) / / / / / Godot 3.0: Visibility with Ray-casting · KCC Blog
Some more enemy development! -first “enemy” in the game, a pretty basic little thing. -designed on Aseprite, took some time to set up with hakatime, but turns out I was using a version only used on Mac OS, so no kidding it was giving me trouble -I created unused animations for a lunge and whip attack animations that I will implement soon (?). NEXT STEPS :D : -stop the player from colliding with the enemy’s hitbox, it’s very annoying, and in the future will we a necessity for having many creatures in the same room -add the enemy attacks, I’ll probably just use a raycasy to see if the players close enough, and then make it hit, pretty simple… Also get Aseprite, it’s like 20 bucks but it’s a really good software, also it’s just really good for game making. gasp :D
enemy attacks/better particles. This took some work, but not really… The enemy can now attack and hurt the player the codes really just the same as the player attacking the enemies. Theres a hurtbox in the player that gets hit by an area in the enemy that makes them take damage. The particles took some more difficult work. Godot has CPU and GPU particles, which apparently are different, it just depends on what in your computer renders them. I used GPU particles, because they run better and can collide with things. I whipped up a sprite sheet for the particles in Aseprite, which looked a lot better than the weird purple generic Godot things. The particles only collided with light occluders??, so I added an occlusion layer to the tile map, at some point I hope to create a better system for when they hit the ground, but thats not my priority right now. Next STEPS!!!!! -main thing is that the enemy has a lunge attack that I haven’t implemented yet, so thats next. -starting on the player sprites, this is a LOT of work, so its gonna take me a lot of time, but no time like the present
I’m gonna start this by saying: I HATE animating! Aseprite made this so much easier, but GOD this was difficult… I think I had 5 situations this time around where the problem was the littlest change in the world, and I just needed to go to bed. I made 3 different walk cycles, before giving up and figuring out how to do it for real, it was only a little difficult after that. I have unused hurt, death, and push animations, and need to implement a shorter attack and smooth some things out still (jumping while attacking cough ) Almost all of these 12 hours was fixing stupid little problems and changing little pixels, probably some of the worst time ive spent on this project yet… (but still really interesting) NEXT STEPS::: -fix walk so it looks sensible (drifting) -make jumping illegal hwilst attacking -add short attack -customized tile map ????? Thank you for reading goodbye I want to stop animating
Quick hurt animations Main thing I added was animations for death and injury. I first added knockback when hit. It just takes the player’s scale.x (what i use for flipping the sprite) and multiplies it by 200 to the player velocity, since the scale is either 1 or -1, it changes the direction the player is thrown (in the future i’d like to make the scale the enemies direction, not the players, as if the player is flipped in the wrong direction, it could have knockback in the wrong direction (very bad) Theres was already a variable to detect if the player was being hit that was used for testing, so I just implemented that to play the injury animations. i also detected if the players health was zero or below after being hit, and if so it would make the player play the death animation instead of the injury. I have currently unimplemented animations for a before-death injured player, so after they are hit for the last time they will stand for a bit before collapsing. NEXT STUFF: (hast beeneth narrowed list) -add enemy knockback (only when injured, lok wierd when die) -fix player knockback thank yoh forth coming to my TED talk
sprites! done some stuff, mostly just game planning (sadly didn’t get time for because notes but I got a lot done, mostly just some serious drawing. I finished some tiles for the first and second levels, and some tiles for the next three.
Mantling and fixes Hi. I have had a very long week. I spent a lot of time working on sprites, mostly for the game 3rd level (no spoilers, (but that’s pretty boring) so heres the interesting part. I’ve been focusing on revamping player movement to make it feel more interesting and fun, and this is a good start. Mantling! if you don’t know what this is, it’s what you do when you get out of a pool without a ladder or staircase, pretty much just “pulling yourself up” The player does this by using raycasts, I added three, but one is for something else. One of them detects a wall in front of the player, and one detects a wall above. The code uses these casts to detect if the player is up against a wall, and if there is no wall above the player, pretty much checking if there is a mantalable ledge. If there is, the code says “you can mantle” Another line says: if you can mantle, and you are not on the ground, and if the player clicked space (Jump), then mantle. The annoying part was animations. When the player begins mantling, the hitbox and player position is frozen in space, and position is snapped to the nearest block to line up the animation. the only thing that moves during the animation is the player sprite, which means at the end of the animation, when the players position is finally changed, the player sprite needs to snap back at the EXACT same time, or it looks bad, which was hard. The other annoying part was the camera snapping randomly, as it moves with the player and not the sprite. I fixed this by just temporarily turning on the cameras position smoothing while the mantle is happening and then turning it off when the player moves again.
Crouching! #2 in the player movement chronicles! Surprisingly, I also managed to create a whole new 5 animations! slide, crouch idle, crouch walk, and the sledge versions (not slide cause ya can’t sprint with sledge). I implemented all but the slide, which’ll take a long time, so I’m going to keep it off a bit. This was really straight forward to add, and for the first time in a long time, i had like only 1 problem . I really just had a piece of code that asks, “did ya click the crouch button?” and if so, it toggles crouch. IF (and only if!) the crouch is on (or “true”) the idle and walk animations are switched to their respective crouch variants, and the normal player hitbox is replaced by a shorter-er-est one. To bar the player from un-crouching in the midst of a tunnel, I added 2 new raycasts to the front and back of the players head facing up, these casts detect if there is a block above the player, and if either one of them detects anything, the player is unable to un-crouch until they are unshielded. Another quick thing I had to fix a bit was the raycasts detecting the player, which broke EVERYTHING so I just turned good ’ol collision mask/layer 20 into the super-cool (ALL-NEW !!) “player raycast collision!!!” which just only lets them interact with the floor and boxes, so yippee NEXT STEPeths!: -slide ): -enemy lunge -other player attacks (only hard attack right now which is bad)
MOVEMENT PART # (3) les go took me short time, it’s ten o’clock im tired, pretty simple stuff. If player is sprinting and the crouch button is pressed, the normal function is overridden and a slide is activated, this just sets the animation to slide and the X velocity of the player to a high number. There’s some other code for just general quality of life, like stopping if you hit a wall and keeping you from changing directions, but the REALLLY cool part is jumping. Like in real life (trust), while sliding the player will jump further, which permits some cool movement combinations, like vaulting over gaps and climbing 4 block walls. I have to work out stamina changes depending on jump strength and stamina decrease for vaulting, but the movement getting pretty fleshed out. P.S, after I took the video, I changed the sprint stamina decrease to be a consistent decrease instead of being choppy like in the video, it’ll be in the next log, but it was just quality of life. NEXTS STUFFS: -dash -enemy lunge -stamina from hoisting and slide-jump stamina increase Thanks for reading!
player movement is complete!! went on vacation, so fell behind a bit, but finally got this done. I spent a lot of time thinking on how to make player movement good, and then thought of my BOTW playthroughs, where you can either hold your attack and have a powerful slash, or click fast and hit three in a row. First addition!: Ground pounds were pretty interesting, all it does is forces the player down hard if they attack in the air, decreases stamina, and then hits the ground, I added a dust cloud that explodes when he hits the ground, which just plays the animation and then disappears. I had to do some fenagling with this because the code knows when to start the animation because the player will be ground pounding and on the ground, which starts the poof and then stops ground pounding, which also keeps the animation from playing multiple times. SECOND: Annoying stupid player attacks. Tried to finish this in a day, so I was working till 11:00 at night, but I got the animations done and what not. When the player hits/holds the attack button, it starts a stopwatch that increases, when the player releases the button, depending on the time on this timer, it will either play the first of 3 quick attacks or the big attack, which does more damage. If the quick attacks are chosen, the first one will play, three things happen when thats starts, 2 timers start, and player velocity increases to 500. at the end of the attack, there are three things can happen, the player can wait until the animation ends, they can attack again, or they can walk to reset the attack earlier than waiting, the first timer forces the player to wait to cancel the attack by walking, and the second one stops their velocity so they jolt forward. at the end of the animation, a function is played that: starts the reset timer for the attack A variable increases that sets the next attack to be the second or third in the sequence, instead of the first and a if statement that resets the variable to 0 if it gets to 3. Theres some other details for weird situations, like falling off the edge and ground pounding while attacking, or the variable not resetting weirdly. But all of that was like an hour. Thanks for reading: Play my game when it comes out so I have a reason to finihs Also I need a name for the game (please, I suck at naming) and go play Legend of Zelda (or Just Cause 3) (or research operation Just Cause) #USinvadinglatinamericaAGAINfornoreason P.S (I was gonking on being up till eleven, but I did like 3 hours of animating and coding in like 30 minutes while being food deprived and barely awake because deadlines = lock in, so if you need to lock in just don’t sleep ig ) also, I’m technically not done ‘cause ma boy needs a sawed off before I’m done here Yee Haw
Little enemy beginnings I haven’t actually finished anything yet, but I need to devlog anyways, but I have started to finish the second enemy, which is also the framework for more.
Enemy is complete: Chomper! Lot of work, but got it done. This is the, please avoid, very dangerous, you will die enemy. I haven’t balanced its health yet, and I’m not going to for a while, so it looks like an easy kill in the video. The weird quirks of this enemy are mostly in its charge attack, that rushes the player. It’s pretty easy to avoid, but once again i haven’t done attack balancing, so it may become harder later. The majority of the enemy works just like the lil guy, so idk read that devlog. But there is two major differences: LIST: gasp 1.!!!1! : idle stuff -really just a randomizer -if enemy is idling, starts a timer, and when it runs out of time, it does one of two things (using a randi() function) -if the outputs a 1, nothing happens, but if its a 2 it flips the enemy, thas all -the main reason for this is that since this enemy is so big, making it a tad more animated than the lil guy felt important to me, and also because the detection areas for the big guy are skewed towards the front, so him turning around makes the player sneaking up on him a little less common, it’s generally just for Q-O-l (slang btw) (only cool people understand) 2.!: dash -dear lord, why was hard so much D: -Wasn’t actually that difficult, I spent a lot of time trying stuff before realizing I just unleash my inner enginneer and do it step by step ’till it works, which it did. -first, theres three detection boxes, one for walking towards the player, one for the chomp, and one for dashing, if the player enters the dash-box, a timer will start -when the timer ends, the charge animation plays, which halfway through, activates a function too add velocity (actual charge part of charge) -If the enemy hits a wall, player, or box, it stops moving, but in the case of the player it plays a second animation (dash_hit) that looks like a chomp and kills the player if it hits them. Theres another If statement that sets velocity back to 0 when this happens also. OTHER CHANGES: -I removed the players health really, I like games that are one shot, because it’s subjectively more fun, I’ll make the player death a little more explosive if I have time. I’ll probably make them have three health but that’ll change when I do attack balancing -made the lil guys attack timer shorter, makes him more dangerous. NEXT TIME PLANS: -hopefully in one day (ima lock in rq) -gonna add a flying enemy, -literally just a tad fly, like 5x5 pixels, it’ll look at the player and fire acid that’ll kill you -i might change the death animation to be more BOOM (IYKWIM) :D -my goal is too complete the flying guy 100% tomorrow, but I got other stuff to do so we shall see -also it’ll be nice to not have to do major animating besides literally 6 pixels splaterring -if extra time, I’ll make a weird egg thing that turns into the fly THANKS FOR READING! as always (not really) go make some interesting, and uh learn something new every day please (P.S I made some changes after I took these videos so it still looks and feels kinda bad but not actually rn) ~Wilfred
Flying enemy is complete, in record time! wow, 8 hours for an enemy, how quick D: This was a challenge, but also really fun. This enemy is the flying one, which made it a little more difficult than just the copy and paste of old ones but still pretty cool. It works using a Navigation Agent, which is like Godot pathfinding. Fast forward three hours and a whole lot of troubleshooting, but that works. The enemy detects the player in the same fashion as the other enemies and then activates the nav-agent to being movement. It’ll follow the player through vents, passages and really anywhere. The fly has three main detection circles, the first one tells it to move towards the player, if the player enters the second one, it’ll freeze and stop moving, and if the player gets even closer, it’ll try to move away (by reversing the velocity var outputted by the nav-agent, iyc) the enemy’s one hit, acourse, but is really annoying to attack, (ill rework ground pounding to make this easier later). The enemy has a shooting attack, that is on a 6 second timer if it can see the player, otherwise it’s just on hold. its shots are pretty slow, so there easy to avoid, but in a crowded fight ya never know. The main quirk of this enemy is it has a really long forgetfulness timer, so even if it can’t see you, it’ll continue to follow for quite a long time, much longer than other enemies. Next:! -stationary, weird wall tentacle that shoots at you -egg spawner that hatches into 1 of three enemies (mystery ooh) -doors (ikr)
keypads, doors, and beginning of the first level. Im actually making a game! contains spoilers First of many… keypads were really difficult, every button, when clicked, multiplies the correct number by a multiplier, and adds it to a “code” variable. the multiplier is chosen based on what step of the code you’re on, (e.g, 1: 10000, 2: 1000, 3: 100, 4: 10, 5: 1), when you click the green button, it cross checks another variable with the one you typed, and if they’re the same, it sends the function to open the doors, and if not, everything resets. The other terminals and what not just open things when clicked on, so it’s just an easier version of the keypad.
quick devlog. I need to do this cause i got 10 hours, Im working on the level system and im so tired please why is htis so hard D: D: D: D: D: D: D: D: D: D: D: D:
Another devlog about levels. Started work on the second (this takes so long) I can’t say much for fear of spoilers, but just say this involves WAY to much code and sprites (I hate drawing so much)
quick stuff, nothing much Finished some updates, but I’m locked so don’t have time to write much
WORKING ON MY FINAL STRETCH I’m going to be locked in for the next few days, school starts, so I’ll have less time, but I got a boss fight and then bug fixing and sound effects, hears a sneak peak and one of the many things ive worked on. Also, I came up for a name. Looked up the universal laws for space and saw something about how “Countries of Origin are Liable for Damages caused by their space debris” and said “dang, thas dope” so now i have a name. In my next log ill have a longer devlog like a lite trailer, but the games pretty short, more like a showcase of learning. Thanks!
FINAL STRETCH time to lock in please oh no Im finishing the last level, no time to talk, but got like 4 things to finish THINGS: -level -boss fight -sounds -ending -bugs
SFX stuff, final thing before ending, just finishing sounds, really annoying though ngl. done soon, big update at end
Final Release (or close to it) Game will be out soon, I just gotta ship, but everythings done, I finished sounds, and the ending yesterday, like a 8 hour coding marathon, so i could get this out in time. PLEASE play it, it’s called Liable for Damages, I don’t know where I’ll post it yet, but It’ll probably be on Itch.io or just the game application file. It’s like 150,000 kilabytes, so it shouldn’t be too bad for any computer, hopefully (mines from like 2009 and it ran fine) P.S! Please, (if you do play), comment bugs, especially major things, EXCEPT: -Player dissapearing when opening menu in elevator (don’t try this, im not fixing it it’s funny) -Bugs on top of head, (js kill them) Anything else is bad and needs fix thanks. Also sorry no volume controls, I was crunching down to finish.
devlog for projects i forgot to add, really just time from learning to export godot games, very annoying um, fun fact, if you create a web game, change the file to index.html, or it literally WON’T WORK!!! Play my game (now!)
Started working on Liable for Damages 2.0 Devlog #1 Started working on better settings, mostly just things for volume, fonhts, and scrolling things. Whipped up some basic sprites in aseprite and took a day to implement them and figure out bugs, which were very annoying, mostly just related to button sizing. Had to mess around with Godot’s “containers”, for the first time, and it was quite bad, I’ve got some more work to do before I can get the sliders to work, but I’m close! Next stuff’s: -format sliders -start creating settings related to different busses -create saves for the sliders -implement button to change font -make font-changed labels for all maps -do bum ahh drivers ed instead of W Stardance I’ll hopefully release 2.0 within October, and I’mma try and devlog more! ~Wil
Ships:
I made something! This was my first time coding outside of Arduinos, and one of the biggest learning experiences of my life. There was stress, time crunches, and pain, but it all came down to the wire. The most challenging part was drawing, of course, I’m never going to do this again JUST because of the assets. Thanks for playing...
|
1793008113.762244
|
1793094513.762244
|
|
59717
|
NASA Space Explorer by @vedasm | Stardance
|
vedasm
|
1
|
9.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T16:49:44Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I developed NASA Space Explorer, a comprehensive web dashboard that consolidates a series of NASA Open APIs into a single, user-interactive interface. The application offers a zoomable, high-res view of the APOD or NASA Astronomy Picture of the Day, and live NeoWS or Near-Earth Object Web Service tracking of perihelion distance, velocity, and hazard classification. It also supplies deep-space imagery of the Earth from DSCOVR ‘Earth Polychromatic Imaging Camera’ or EPIC, on a user-defined date, fusing a NASA Image Search over six decades of mission photography anda performance caching back-end to avoid rate limits and speed load time. The biggest issues encountered were normalization of different JSON payload structures for the many different NASA endpoints, dynamically building date based image URL paths for the EPIC camera feed, and fine tuning rate limits and cache TTLs to ensure a fast responsive application.", "repo": "https://github.com/vedasm/NASA-Space-Explorer", "demo": "https://nasaspaceexplorervsm.vercel.app/"}]...
|
[{"post_id": 71308, "ts": "202 [{"post_id": 71308, "ts": "2026-09-20T16:37:31Z", "hours": 1.2825, "text": "NASA Image Library Search and Deployment Implemented keyword-based querying via the /api/search endpoint to fetch 6 decades of mission photography. Built a search bar component allowing the user to query for images dynamically by keyword. Rendered search results in a responsive grid featuring high-resolution thumbnails, mission titles, centers, and dates. Configured build scripts and deployed the full-stack web app live to Vercel at https://nasaspaceexplorervsm.vercel.app/ Click here to see"}, {"post_id": 71177, "ts": "2026-09-20T12:07:42Z", "hours": 1.4531, "text": "NASA EPIC Earth Imagery Integration Created @app.route(\"/api/epic\") an endpoint that parses the date parameter and validates input against the YYYY-MM-DD format. Built _fetch_epic_images() to query the EPIC API from NASA and parse the full PNG, including year, month, and day path components. Wrapped raw API calls inside a _cached() helper function with a 24-hour cache TTL to lower redundant external API requests. Added a date selection input with a Show Images button and responsive grid to display all earth images."}, {"post_id": 70934, "ts": "2026-09-20T02:22:20Z", "hours": 1.7364, "text": "Added Near-Earth Object Asteroid Tracking NASA NeoWs API Integration: Querying NeoWs (Near Earth Object Web Service) REST API to fetch real-time close-approach asteroid telemetry for that day. Real-Time Metrics Parsing: Extracting important astronomical data attributes, including estimated maximum width, velocity, and miss distance. Sorting & Filtering: Manipulating API payloads to dynamically determine hazardous status badges and sort incoming asteroids by nearest distance. Metric UI Components: Created a CSS-styled list view with hazard badges and a starry background overlay"}, {"post_id": 70470, "ts": "2026-09-19T08:02:39Z", "hours": 1.1364, "text": "NASA APOD to Web APOD API Integration: Fetched NASA’s Astronomy Picture of the Day data dynamically to display the latest space image, date, etc. Parallax Scrolling Effect: Implemented multi-layered star parallax scrolling where stars in the background move slowly and smoothly. Shooting Star Animation: Designed a dynamic shooting star animation. This was when I took a little help from AI. Full Image Model: Added a “Full Image” button that opens a full-resolution image."}, {"post_id": 70426, "ts": "2026-09-19T05:18:35Z", "hours": 3.1561, "text": "NASA Space Explorer Architecture Setup Frontend Structure User Interface: index.html serves as the entry point for the user in the browser, styled via style.css . Core Logic: main.js handles user interactions, renders NASA data onto the browser, and routes API requests to the backend. Backend Integration Flask Server: Flask app.py acts as the core app router, exposing endpoints for /api/apod , /api/asteroids , /api/epic and /api/search . nasa_api.py manages external API communication."}]...
|
Title: NASA Space Explorer by @vedasm | Stardance
Title: NASA Space Explorer by @vedasm | Stardance
Devlogs:
NASA Space Explorer Architecture Setup Frontend Structure User Interface: index.html serves as the entry point for the user in the browser, styled via style.css . Core Logic: main.js handles user interactions, renders NASA data onto the browser, and routes API requests to the backend. Backend Integration Flask Server: Flask app.py acts as the core app router, exposing endpoints for /api/apod , /api/asteroids , /api/epic and /api/search . nasa_api.py manages external API communication.
NASA APOD to Web APOD API Integration: Fetched NASA’s Astronomy Picture of the Day data dynamically to display the latest space image, date, etc. Parallax Scrolling Effect: Implemented multi-layered star parallax scrolling where stars in the background move slowly and smoothly. Shooting Star Animation: Designed a dynamic shooting star animation. This was when I took a little help from AI. Full Image Model: Added a “Full Image” button that opens a full-resolution image.
Added Near-Earth Object Asteroid Tracking NASA NeoWs API Integration: Querying NeoWs (Near Earth Object Web Service) REST API to fetch real-time close-approach asteroid telemetry for that day. Real-Time Metrics Parsing: Extracting important astronomical data attributes, including estimated maximum width, velocity, and miss distance. Sorting & Filtering: Manipulating API payloads to dynamically determine hazardous status badges and sort incoming asteroids by nearest distance. Metric UI Components: Created a CSS-styled list view with hazard badges and a starry background overlay
NASA EPIC Earth Imagery Integration Created @app.route("/api/epic") an endpoint that parses the date parameter and validates input against the YYYY-MM-DD format. Built _fetch_epic_images() to query the EPIC API from NASA and parse the full PNG, including year, month, and day path components. Wrapped raw API calls inside a _cached() helper function with a 24-hour cache TTL to lower redundant external API requests. Added a date selection input with a Show Images button and responsive grid to display all earth images.
NASA Image Library Search and Deployment Implemented keyword-based querying via the /api/search endpoint to fetch 6 decades of mission photography. Built a search bar component allowing the user to query for images dynamically by keyword. Rendered search results in a responsive grid featuring high-resolution thumbnails, mission titles, centers, and dates. Configured build scripts and deployed the full-stack web app live to Vercel at https://nasaspaceexplorervsm.vercel.app/ Click here to see
Ships:
I developed NASA Space Explorer, a comprehensive web dashboard that consolidates a series of NASA Open APIs into a single, user-interactive interface. The application offers a zoomable, high-res view of the APOD or NASA Astronomy Picture of the Day, and live NeoWS or Near-Earth Object Web Service tracking of perihelion distance, velocity, and hazard classification. It also supplies deep-space imagery of the Earth from DSCOVR ‘Earth Polychromatic Imaging Camera’ or EPIC, on a user-defined date, fusing a NASA Image Search over six decades of mission photography anda performance caching back-end to avoid rate limits and speed load time. The biggest issues encountered were normalization of different JSON payload structures for the many different NASA endpoints, dynamically building date based image URL paths for the EPIC camera feed, and fine tuning rate limits and cache TTLs to ensure a fast responsive application....
|
1793055059.7700565
|
1793141459.7700565
|
|
64163
|
cup shuffle eye training game by @hoshi | Stardanc cup shuffle eye training game by @hoshi | Stardance...
|
hoshi
|
1
|
2.0
|
12
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T16:48:56Z", "hours": 2.0, "multiplier": 7.46, "payout": 12, "blessing": "neutral", "text": "a really really small game I made, a cup shuffling game with various levels! It’s basically an eye training game. There are ten total levels! Levels 1-5 have three cups and levels 6-9 has five cups. Level 10 is impossible, no one can beat it haha. Basically, the ball starts inside the middle cup. And you have to use your eyes to remember the ball’s position while the cups are getting shuffled. It might be a bit hard and confusing to see, sorry", "repo": "https://github.com/uuukye/cup-shuffle-eye-training-game", "demo": "https://uuukye.github.io/cup-shuffle-eye-training-game/"}]...
|
[{"post_id": 71310, "ts": "202 [{"post_id": 71310, "ts": "2026-09-20T16:37:53Z", "hours": 0.5758, "text": "I added the difficulty levels! this did not really take that much time, because I just had to alter the speed and the amount of cups. What was challenging though was the buttons, it was pretty stressful to create buttons. Also I forgot to write this in my previous devlog but it was challenging switching the cups with a smooth transition, while running “draw” but I somehow solved that"}, {"post_id": 71274, "ts": "2026-09-20T15:42:48Z", "hours": 0.9717, "text": "I just wanted to create a small project so I made this basic eye trainer. I’m thinking of adding difficulty levels, and from level 4 or smth I will make it five cups instead of three cups. I’m not expecting to make this project huge"}]...
|
Title: cup shuffle eye training game by @hoshi | S Title: cup shuffle eye training game by @hoshi | Stardance
Devlogs:
I just wanted to create a small project so I made this basic eye trainer. I’m thinking of adding difficulty levels, and from level 4 or smth I will make it five cups instead of three cups. I’m not expecting to make this project huge
I added the difficulty levels! this did not really take that much time, because I just had to alter the speed and the amount of cups. What was challenging though was the buttons, it was pretty stressful to create buttons. Also I forgot to write this in my previous devlog but it was challenging switching the cups with a smooth transition, while running “draw” but I somehow solved that
Ships:
a really really small game I made, a cup shuffling game with various levels! It’s basically an eye training game. There are ten total levels! Levels 1-5 have three cups and levels 6-9 has five cups. Level 10 is impossible, no one can beat it haha. Basically, the ball starts inside the middle cup. And you have to use your eyes to remember the ball’s position while the cups are getting shuffled. It might be a bit hard and confusing to see, sorry...
|
1793058894.6823025
|
1793145294.6823025
|
|
901
|
Kern by @AntKru | Stardance
|
AntKru
|
3
|
153.98
|
2739
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T16:46:53Z", "hours": 65.0, "multiplier": 19.56, "payout": 1269, "blessing": "neutral", "text": "I have released the next version of my own kernel! The biggest feature I added is multitasking. While it doesn’t look that special, it was actually very difficult to make my kernel switch between different tasks! Here are some notes on how to try the project: If you don’t want/can’t run it, you can look at the video in the readme. If you want to run it on macOS with UTM, you have to force a PS/2 controller: https://docs.getutm.app/settings-qemu/qemu/#force-ps2-controller", "repo": "https://gitlab.com/AntKru/kern", "demo": "https://gitlab.com/AntKru/kern/-/releases/"}, {"ship_num": 2, "ts": "2026-07-24T06:30:43Z", "hours": 48.0, "multiplier": 19.83, "payout": 961, "blessing": "neutral", "text": "I added a CLI the kernel, which was possible, because I finally have a keyboard driver! It only took so long, because it was actually difficult to write it: I thought I have to program the PIC, but it was already disabled so I had to learn the more complicated APIC. There is a demo video in the README if you don’t want to run the kernel. If you want to run it on macOS with UTM, you have to force a PS/2 controller: https://docs.getutm.app/settings-qemu/qemu/#force-ps2-controller", "repo": "https://gitlab.com/AntKru/kern", "demo": "https://gitlab.com/AntKru/kern/-/releases/"}, {"ship_num": 3, "ts": "2026-06-20T14:34:14Z", "hours": 30.0, "multiplier": 17.21, "payout": 509, "blessing": "neutral", "text": "I made an x86_64 kernel using the limine boot protocol. I don’t know what the most difficult thing was, as even most basic things are very complicated for me as a beginner in osdev. I still have to learn much and the kernel will be improved, but I thing it kind of works now. I have a video demo in the readme, if you don’t have qemu . When building, remember to clone the submodules ( git submodule init && git submodule update ). You need xorriso to build the ISO. Sorry for mixing meson and make , but in the README is a guide. Please use clang, gcc is very complicated.", "repo": "https://gitlab.com/AntKru/kern", "demo": "https://gitlab.com/AntKru/kern/-/releases/"}]...
|
[{"post_id": 79283, "ts": "202 [{"post_id": 79283, "ts": "2026-10-13T09:56:47Z", "hours": 4.6628, "text": "Memory management problems… It seems like there was a critical bug sleeping inside my memory manager. It appeared since I started using the PMM in my AHCI driver, but I think the problem is in the virtual memory manager. For this reason I am working currently on the memory manager instead of the AHCI driver. Roadmap As soon as I fix the MM, I will continue on the AHCI driver. It probably won’t be finished until the end of stardance."}, {"post_id": 76791, "ts": "2026-10-04T16:08:54Z", "hours": 2.6242, "text": "AHCI! (SATA) I am jumping a little bit fast form PCI to AHCI, but I think the PCI driver is as good as I need it right now, and if I learn that it isn’t, I will fix it. Anyway, I am starting to work on AHCI! This is really cool, as this allows me to communicate to storage devices! At the moment the kernel just lists connected devices, but that’s just the beginning! Roadmap The AHCI driver is in a very early stage, and it will take me a lot of time to finish, as AHCI is relatively complicated and the documentation isn’t written for beginners like me ;-)"}, {"post_id": 74920, "ts": "2026-09-28T16:27:51Z", "hours": 3.6928, "text": "PCI! I am starting to write a PCI driver, which opens a new world to me! As you can see, the kernel is already able to print some information on boot about connected PCI devices. I also added a function that can search for a specific PCI device by it’s class, which will help me to implement drivers for specific PCI devices. Roadmap The real reason I am implementing PCI is that I need it to find the AHCI controller. The AHCI controller can be used to access connected storage devices, which is my long-term goal."}, {"post_id": 71311, "ts": "2026-09-20T16:38:40Z", "hours": 1.3486, "text": "Release 0.3.0 I finished the release, including the new borders command! The visible bugs that I found are also fixed, please report them if you find some! Roadmap The kernel isn’t finished yet, I will continue to improve it and see how far I will get."}, {"post_id": 70750, "ts": "2026-09-19T18:15:14Z", "hours": 4.075, "text": "Final improvements before the next release Status bar I moved the status bar from the bottom to the top and removed the borders, in my opinion it looks better this way. Framebuffer borders I am already working on a new command which will make it possible to see the borders of the framebuffer in QEMU. This will be useful for debugging while keeping the UI simple. Bugs There are still some obvious bugs: My printf() implementation seems to break with invalid format strings and I have a bug in my memory manager which prevents me from merging the command showing the screen borders into main. Roadmap I will try to fix the bugs, but the features are now complete. I want to release the new version tomorrow."}, {"post_id": 68765, "ts": "2026-09-15T18:23:31Z", "hours": 7.8061, "text": "printf compatability I improved the printf() compatability, so that I can pad numbers with or 0 . This is very useful, for example I now can use it to display time and date properly. Roadmap I don’t know yet what’s the next thing to do, maybe I will ship soon."}, {"post_id": 63678, "ts": "2026-09-07T16:41:58Z", "hours": 4.1103, "text": "Status bar! I added a status bar which show the current time. It is very basic, but makes the OS look way more friendlier in my opinion. Sorry for the weird messages in the main window, I am currently debugging my printf implementation. Roadmap I still have a problem with printing dates: The year 2006 would be printed as 206 , because the RTC has seperate registers for year and century, so if century is 20 and year is 6 it prints 206."}, {"post_id": 58325, "ts": "2026-08-30T18:21:09Z", "hours": 2.6081, "text": "“Windows” I am making it possible to split the framebuffer into multiple views. This should make it more easy to have a more advanced UI than a CLI already inside the kernel. Hopefully there will be user processes at some point, but I want to have a nice looking OS before that. Roadmap I still have to fix some things (as visible on the screenshot). After that, I can try to make use of it and add a status bar or a separate command window."}, {"post_id": 55470, "ts": "2026-08-27T10:27:14Z", "hours": 4.5317, "text": "RTC The kernel can now read the current time from the Computer’s RTC! At the moment, you can’t select the time zone, so the time is probably in UTC, depending on how the computer is configured. Roadmap I am planning to improve the use experience, for example by using multiple “windows”, to maybe even have a status bar."}, {"post_id": 52423, "ts": "2026-08-22T15:29:50Z", "hours": 4.2389, "text": "GCC support I added GCC support, which should (hopefully) make debugging easier for me. I can’t show it really on the screenshot, trust me, it is compiled with gcc! Roadmap I have still bugs in my multitasking system. Currently I get a page fault when compiling with optimization > -O2 with clang, the next step is to test it with GCC."}, {"post_id": 47914, "ts": "2026-08-16T05:50:20Z", "hours": 2.6892, "text": "Mutexes I implemented a simple mutex (which isn’t perfect yet, but it works). As visible on the screenshot, I used it to make it impossible for the test tasks to print at the same time. One problem with it is that it currently runs hlt after releasing a mutex so that a different task has a chance to acquire it, which doesn’t seem like the best solution to me. Roadmap I am making the terminal position atomic, so that I don’t need mutexes for output, which I can not use in interrupt handlers"}, {"post_id": 46418, "ts": "2026-08-13T16:41:17Z", "hours": 5.8897, "text": "Multitasking! I fixed the last bug (that I could find) and multitasking works now! On the screenshot you can see two tasks trying to print the numbers 0-19 at the same time. The CLI even waits until the tasks are finished! Road map The output is still a little bit broken, so I want to implement output buffering and mutexes, so that multiple threads can’t print at the same time."}, {"post_id": 44770, "ts": "2026-08-10T19:26:17Z", "hours": 6.2656, "text": "Multitasking… I am still working on multitasking, but I am stuck currently. I am trying to modify the stack frame so that asm_switch_task is called after iretq , but it doesn’t work. As you can see on the screenshot, I get a page fault as soon as it tries to switch tasks (in the debugging process I had it switch 2-3 times before it crashes, which is not really better) Road map My highest priority is to get task switching to work consistently. After that, I will see what I can polish."}, {"post_id": 43900, "ts": "2026-08-09T10:50:40Z", "hours": 2.4128, "text": "SSE register state switching! The kernel will now switch the SSE register state lazily, but I still have two problems: The Part for the registers in the TCB must be 16 byte aligned, which it currently not guaranteed The interrupt handlers are not allowed to use SSE instructions, but I have no way of verifying this Road map I think it is time to write a version of malloc() which can guarantee a specified alignment. After that, I can try to actually switch tasks automatically with a simple scheduler! I will probably use the PIT interrupt to switch to the next task in a list."}, {"post_id": 42570, "ts": "2026-08-07T11:56:52Z", "hours": 4.5606, "text": "It probably doesn’t sound special, but it is as important as everything else: SSE support SSE is an extension of the CPU which has 16 128-bit registers, but is rarely used. This means, that saving all of these registers every time a task switch occurs would cost some performance. For this reason, the CPU has a bit that can be set to indicate that a task switch occurred. In most cases, nothing happens and the registers are kept in their original state. But if a task needs to use SSE instructions, the CPU generates an interrupt, which manually saves the SSE registers. This is what I am working on currently. Custom ISR wrapper All interrupt handlers use now my custom wrappers, which made possible that I can work on SSE support."}, {"post_id": 40940, "ts": "2026-08-04T19:52:16Z", "hours": 5.0347, "text": "Array optimization (Screenshot 1) I now actually optimized the dynamic array type, which means that it allocates memory in bigger chunks instead of every time an element is added / removed. In the process I added some debug logging, so typing is now very difficult if you don’t know how it works with log level LOG_DEBUG . Custom ISR wrapper (Screenshot 2) I finally decided to implement my own wrapper for ISRs instead of relying on __attribute__((interrupt)) . This should allow me to use floating point math with the FPU in the future. Also, I can now read more registers on interrupt (screenshot). Road map I am currently working on making all ISRs compatible with my wrapper. Then I will continue trying to get multitasking to work."}, {"post_id": 38897, "ts": "2026-08-01T14:03:43Z", "hours": 6.4275, "text": "Multitasking (Screenshot 1) I decided to try to implement multitasking! The kernel can now switch tasks, but only one time. This is the first step in direction of real multitasking, but I still have much to do. It is interesting to see, How I realize how bad my implementations I did earlier are, because I don’t fully understand them. But now I can improve them! Dynamic arrays (Screenshot 2) I made a quick implementation of dynamic arrays for the keyboard driver, but as I realized that I need them to store a list of tasks, I decided to implement one optimized implementation I can use everywhere. I have implemented a very simple version and use it in the keyboard driver, but it isn’t optimized yet. In fact, it’s even worse than the one I had earlier in the keyboard driver, because every modification now requires a reallocation. Road map I am going to optimize dynamic arrays, and then continue with multitasking."}, {"post_id": 36558, "ts": "2026-07-28T19:08:32Z", "hours": 2.8569, "text": "PIT I quickly wrote a simple PIT (Programmable Interval Timer) driver, so that I have a basic sleep function. It isn’t really useful at the moment and not thread safe, but as it was very simple I thought why not? APIC I realized that MADT I/O APIC overrides also override the flags of entries, so I am using these now unless it’s overridden by the user. Road map As I have now a simple keyboard driver, I want to work on something new. Some things I am considering: Multitasking Filesystems ELF loading PCI USB All of this topics are completely new to me, so I will pick the one that looks the most simple and probably fail anyway."}, {"post_id": 33535, "ts": "2026-07-23T15:58:35Z", "hours": 2.3419, "text": "I am shipping soon! Some little improvements in messages I improved some messages, so that the kernel looks more polished to new users. v0.2.0 I released a new version, which is what I am shipping soon (if nothing goes wrong). It includes an interactive CLI, which was made possible with the new keyboard driver. I improved the scrolling performance a lot, which I personally really enjoy! Finally, I fixed a bug when printing numbers, so the printed memory map now has (mostly) correct addresses."}, {"post_id": 32511, "ts": "2026-07-21T18:56:41Z", "hours": 3.1614, "text": "The kernel is now interactive! Demo CLI I added a demo CLI (you can see it on the screenshot) where you can exit properly, run tests or view the old demo! Keyboard driver I had to fix some bugs with the keyboard driver, but now I think it works okay enough that the CLI is stable (previously, it kept parts from the old buffer when reading it again) Road map I want to add more features to the CLI, such as setting the log level. As you can see on the screenshot, the debug output disturbs the CLI."}, {"post_id": 31826, "ts": "2026-07-20T14:47:46Z", "hours": 5.0328, "text": "I FINALLY get interrupts from the keyboard! PS/2 Keyboard driver The problem was, that I mistook the IRQ number for the interrupt vector when calling my own function! Now I can start expanding my keyboard driver. Currently, it already prints the pressed keys to the screen, as you can see on the screen shot. Performance improvements when scrolling After I finished the interrupt stuff, I can focus on improving the TTY in other areas, like the performance. I am using now memset() and memcpy() functions when scrolling the frame buffer, which itself is not an improvement: I optimized the two functions to use copy 8-byte blocks ad uint64_t instead of each byte individually, which made a significant difference. Scrolling with KVM acceleration is now almost instant on my PC, and without it is as fast as it was before with acceleration. Road map I want to improve the TTY with things like buffering, which should improve the performance even more. When I have a solid TTY, I can rework the demo and ship again."}, {"post_id": 30816, "ts": "2026-07-18T19:00:05Z", "hours": 6.3653, "text": "I am still far away from getting interrupts from the keyboard, but I am still learning much and making progress on other parts of the kernel! PMM I added support for mapping pages manually, which means that I can program now the APICs! While debugging this, I also improved my Page Fault handler, which you can see on the screenshot. APIC driver The APIC driver should now be able to configure IRQs on the I/O APIC to get delivered to the local APIC, but I can’t test it as I still don’t know why I can’t get interrupts from the keyboard :-( Road Map I am still working on getting interrupts from the keyboard, which is my main goal before the next ship. I currently suspect that my PS/2 driver is broken."}, {"post_id": 29069, "ts": "2026-07-15T18:32:01Z", "hours": 7.5669, "text": "I prefer this devlog format, so I will stick to it. I/O APIC As I explained earlier, I need to configure the APIC to get interrupts. I think I only need the I/O APIC and not the local APIC, if I understand the limine documentation correctly. But when trying to access it’s registers, I got a page fault. It seems like I need to manually map the registers to virtual memory, which brings me to… Physical Memory Manager I need to do what I already feared when starting to write the PMM, manually editing page tables. I am working on a function which will map pages (Including the I/O APIC registers) to virtual addresses. For this, I need to walk the complete paging structure: PML4 (from cr3) -> PDPT -> PD -> PT I can already parse it until I have the PT’s address, but when accessing the PT I get a page fault, as you can see on the screenshot. Road map I just wanted to post this update so that the next devlog is not too long. I will continue to work on the PMM, until I can access the I/O APIC’s registers."}, {"post_id": 24628, "ts": "2026-07-08T10:52:11Z", "hours": 8.3475, "text": "I did not post for some time, so this devlog will be relatively long. PS/2 driver (Screenshot 1) I wanted to get the PIC to work, but as I had no idea why it didn’t work I thought that the PS/2 Controller might not be in a functioning state. So, I wrote a PS/2 driver which initializes the Controller, and also detects connected devices! PIC -> APIC After that, I finally found out that limine already sets up the APIC, which means that the PIC is no longer functional. So I decided that my next big goal is to learn how ACPI and APIC work… ACPI (Screenshot 2) As you can see on the screenshots, I started working on an ACPI driver, which is already able to find tables like the MADT, which I need to find the APICs UEFI This does not have anything to do with the progress of my project, but I learned how to use UEFI in QEMU, so that I can debug my ACPI driver better. Road map I will have to learn now how APICs work, so that I can get interrupts from the keyboard. Then, I can improve the keyboard driver, which should make the kernel way more fun to use!"}, {"post_id": 20746, "ts": "2026-07-02T13:20:11Z", "hours": 6.0672, "text": "I have finished implementing the memory manager! free() will now call pmm_free() to free unused pages. At the moment it does not make any difference, but if I want to extend the PMM it will have saved me the work. Also, I split the demo from the main function so that it is more maintainable. Log messages with the log level DEBUG will now only appear in debug builds. This made the output much more readable, as you can see in the screenshots."}, {"post_id": 19208, "ts": "2026-06-30T14:00:38Z", "hours": 9.6128, "text": "I have added a simple memory manager to my kernel! It was only possible with the help from kmos , a project I found while voting. I didn’t know how to start writing a physical memory manager, but in that kernel I found that I have to use the limine HHDM request to have simple access to physical addresses. Then I could implement the rest completely myself. The last thing left to do until I’m satisfied with my memory manager, is to free pages in the PMM after using free()"}, {"post_id": 12539, "ts": "2026-06-20T14:12:50Z", "hours": 0.8414, "text": "Now I am actually shipping! I had a bug that occured only when compiling with optimization level 2 or higher (which I used in the release CI). As I am working now on a Debian machine, I made it also compile on Debian stable by not requiring a new objcopy version. On the screenshot you can see the bug."}, {"post_id": 11482, "ts": "2026-06-18T19:17:02Z", "hours": 4.0292, "text": "I will ship the kernel now for the first time! I added a libk (like a libc but for the kernel) and implemented some cool functions like printf(), which I could use for cool error messages with hex numbers like the one on the screenshot."}, {"post_id": 9395, "ts": "2026-06-15T18:55:28Z", "hours": 2.4939, "text": "I sadly don’t have much to say, because I did make almost no progress. I am trying to use the PIC to get interrupts from the keyboard, but it doesn’t work for some reason. Maybe I will try to use APIC instead, but it’s more complicated."}, {"post_id": 8627, "ts": "2026-06-14T10:44:21Z", "hours": 2.2619, "text": "I finally figured out how I can integrate the external library! Now I can skip instructions when an interrupt is executed and continue execution"}, {"post_id": 7621, "ts": "2026-06-12T19:00:11Z", "hours": 1.0647, "text": "I just wanted to implement an interrupt handler specific to divide error, but it turned out to be way more difficult than I thought! To continue execution after the interrupt, I have to manually increment the instruction pointer manually. But to know by which amount, I need to now the size of the whole instruction. To find it I wanted to use a library called Zydis, but I could not get it to compile, because clang generates calls to memset() and memcpy() . As I can not link with the standard library, I will have to find a solution tomorrow."}, {"post_id": 5837, "ts": "2026-06-09T19:37:29Z", "hours": 3.1153, "text": "I added a demo to show the features of my kernel. The kernel is almost ready for the first ship!"}, {"post_id": 4373, "ts": "2026-06-07T18:00:51Z", "hours": 3.2469, "text": "After giving up on the memory manager, I added logging and very basic interrupt handling. I will ship the project when I have a demo of all the features and published ISOs."}, {"post_id": 3530, "ts": "2026-06-06T14:47:32Z", "hours": 2.2575, "text": "As I have now a very basic way to interact with the kernel, I will try to move on to more complex topics. At the moment I try to understand how memory management exactly works (specifically, how to write a physical memory manager), but it’s difficult to find information about it. Until now, I have requested a memory map from limine and can display it in a table."}, {"post_id": 3364, "ts": "2026-06-06T07:57:08Z", "hours": 1.7286, "text": "I implemented enter key press detection before doing anything else, so that I can interact somehow with the kernel. I did it with IO Ports instead of interrupts for now (because I don’t know how to set up interrupts), which means it only works with PS/2 Keyboards. Luckily, qemu shows the keyboard as a PS/2 Keyboard."}, {"post_id": 2308, "ts": "2026-06-04T18:38:28Z", "hours": 2.5331, "text": "I have added a normal font which makes things way simpler. I also improved the general tty: scrolling, new lines and tabs work now!"}, {"post_id": 1458, "ts": "2026-06-03T14:42:11Z", "hours": 1.7617, "text": "I spend so much time to fix a stupid bug (taking the address of a pointer instead of the address stored in the pointer), but know I can display characters from my ugly psf2 font! At least I learned more about gdb."}, {"post_id": 957, "ts": "2026-06-02T18:43:29Z", "hours": 3.0825, "text": "I implemented a set_pixel function, so that I can set specific pixels on the framebuffer. The next step will probably be to display text, maybe with a font made with psfedit, my project for flavortown. I also published my code on GitLab, which means I will try to build ISOs with gitlab CI at some point."}, {"post_id": 294, "ts": "2026-06-01T15:23:58Z", "hours": 1.1658, "text": "I have started to work on my kernel! I just set up my project structure but it does not work as you can see on the screenshot. I will look at it tomorrow. I have already tried to write a kernel earlier this week, but it was an i686 kernel with multiboot 2. Also, I had to copy much code from the limine template, but I will go beyond that when the kernel runs. This means, that I have a weird mix of makefile and meson, as the example uses make but I prefer meson. As I do not want to set up long mode myself, my new kernel uses limine instead of multiboot. My current plan is to get it to run and then publish the source code. Later, I might try to remove make completely and only rely on meson for building the iso."}]...
|
Title: Kern by @AntKru | Stardance
Devlogs:
I hav Title: Kern by @AntKru | Stardance
Devlogs:
I have started to work on my kernel! I just set up my project structure but it does not work as you can see on the screenshot. I will look at it tomorrow. I have already tried to write a kernel earlier this week, but it was an i686 kernel with multiboot 2. Also, I had to copy much code from the limine template, but I will go beyond that when the kernel runs. This means, that I have a weird mix of makefile and meson, as the example uses make but I prefer meson. As I do not want to set up long mode myself, my new kernel uses limine instead of multiboot. My current plan is to get it to run and then publish the source code. Later, I might try to remove make completely and only rely on meson for building the iso.
I implemented a set_pixel function, so that I can set specific pixels on the framebuffer. The next step will probably be to display text, maybe with a font made with psfedit, my project for flavortown. I also published my code on GitLab, which means I will try to build ISOs with gitlab CI at some point.
I spend so much time to fix a stupid bug (taking the address of a pointer instead of the address stored in the pointer), but know I can display characters from my ugly psf2 font! At least I learned more about gdb.
I have added a normal font which makes things way simpler. I also improved the general tty: scrolling, new lines and tabs work now!
I implemented enter key press detection before doing anything else, so that I can interact somehow with the kernel. I did it with IO Ports instead of interrupts for now (because I don’t know how to set up interrupts), which means it only works with PS/2 Keyboards. Luckily, qemu shows the keyboard as a PS/2 Keyboard.
As I have now a very basic way to interact with the kernel, I will try to move on to more complex topics. At the moment I try to understand how memory management exactly works (specifically, how to write a physical memory manager), but it’s difficult to find information about it. Until now, I have requested a memory map from limine and can display it in a table.
After giving up on the memory manager, I added logging and very basic interrupt handling. I will ship the project when I have a demo of all the features and published ISOs.
I added a demo to show the features of my kernel. The kernel is almost ready for the first ship!
I just wanted to implement an interrupt handler specific to divide error, but it turned out to be way more difficult than I thought! To continue execution after the interrupt, I have to manually increment the instruction pointer manually. But to know by which amount, I need to now the size of the whole instruction. To find it I wanted to use a library called Zydis, but I could not get it to compile, because clang generates calls to memset() and memcpy() . As I can not link with the standard library, I will have to find a solution tomorrow.
I finally figured out how I can integrate the external library! Now I can skip instructions when an interrupt is executed and continue execution
I sadly don’t have much to say, because I did make almost no progress. I am trying to use the PIC to get interrupts from the keyboard, but it doesn’t work for some reason. Maybe I will try to use APIC instead, but it’s more complicated.
I will ship the kernel now for the first time! I added a libk (like a libc but for the kernel) and implemented some cool functions like printf(), which I could use for cool error messages with hex numbers like the one on the screenshot.
Now I am actually shipping! I had a bug that occured only when compiling with optimization level 2 or higher (which I used in the release CI). As I am working now on a Debian machine, I made it also compile on Debian stable by not requiring a new objcopy version. On the screenshot you can see the bug.
I have added a simple memory manager to my kernel! It was only possible with the help from kmos , a project I found while voting. I didn’t know how to start writing a physical memory manager, but in that kernel I found that I have to use the limine HHDM request to have simple access to physical addresses. Then I could implement the rest completely myself. The last thing left to do until I’m satisfied with my memory manager, is to free pages in the PMM after using free()
I have finished implementing the memory manager! free() will now call pmm_free() to free unused pages. At the moment it does not make any difference, but if I want to extend the PMM it will have saved me the work. Also, I split the demo from the main function so that it is more maintainable. Log messages with the log level DEBUG will now only appear in debug builds. This made the output much more readable, as you can see in the screenshots.
I did not post for some time, so this devlog will be relatively long. PS/2 driver (Screenshot 1) I wanted to get the PIC to work, but as I had no idea why it didn’t work I thought that the PS/2 Controller might not be in a functioning state. So, I wrote a PS/2 driver which initializes the Controller, and also detects connected devices! PIC -> APIC After that, I finally found out that limine already sets up the APIC, which means that the PIC is no longer functional. So I decided that my next big goal is to learn how ACPI and APIC work… ACPI (Screenshot 2) As you can see on the screenshots, I started working on an ACPI driver, which is already able to find tables like the MADT, which I need to find the APICs UEFI This does not have anything to do with the progress of my project, but I learned how to use UEFI in QEMU, so that I can debug my ACPI driver better. Road map I will have to learn now how APICs work, so that I can get interrupts from the keyboard. Then, I can improve the keyboard driver, which should make the kernel way more fun to use!
I prefer this devlog format, so I will stick to it. I/O APIC As I explained earlier, I need to configure the APIC to get interrupts. I think I only need the I/O APIC and not the local APIC, if I understand the limine documentation correctly. But when trying to access it’s registers, I got a page fault. It seems like I need to manually map the registers to virtual memory, which brings me to… Physical Memory Manager I need to do what I already feared when starting to write the PMM, manually editing page tables. I am working on a function which will map pages (Including the I/O APIC registers) to virtual addresses. For this, I need to walk the complete paging structure: PML4 (from cr3) -> PDPT -> PD -> PT I can already parse it until I have the PT’s address, but when accessing the PT I get a page fault, as you can see on the screenshot. Road map I just wanted to post this update so that the next devlog is not too long. I will continue to work on the PMM, until I can access the I/O APIC’s registers.
I am still far away from getting interrupts from the keyboard, but I am still learning much and making progress on other parts of the kernel! PMM I added support for mapping pages manually, which means that I can program now the APICs! While debugging this, I also improved my Page Fault handler, which you can see on the screenshot. APIC driver The APIC driver should now be able to configure IRQs on the I/O APIC to get delivered to the local APIC, but I can’t test it as I still don’t know why I can’t get interrupts from the keyboard :-( Road Map I am still working on getting interrupts from the keyboard, which is my main goal before the next ship. I currently suspect that my PS/2 driver is broken.
I FINALLY get interrupts from the keyboard! PS/2 Keyboard driver The problem was, that I mistook the IRQ number for the interrupt vector when calling my own function! Now I can start expanding my keyboard driver. Currently, it already prints the pressed keys to the screen, as you can see on the screen shot. Performance improvements when scrolling After I finished the interrupt stuff, I can focus on improving the TTY in other areas, like the performance. I am using now memset() and memcpy() functions when scrolling the frame buffer, which itself is not an improvement: I optimized the two functions to use copy 8-byte blocks ad uint64_t instead of each byte individually, which made a significant difference. Scrolling with KVM acceleration is now almost instant on my PC, and without it is as fast as it was before with acceleration. Road map I want to improve the TTY with things like buffering, which should improve the performance even more. When I have a solid TTY, I can rework the demo and ship again.
The kernel is now interactive! Demo CLI I added a demo CLI (you can see it on the screenshot) where you can exit properly, run tests or view the old demo! Keyboard driver I had to fix some bugs with the keyboard driver, but now I think it works okay enough that the CLI is stable (previously, it kept parts from the old buffer when reading it again) Road map I want to add more features to the CLI, such as setting the log level. As you can see on the screenshot, the debug output disturbs the CLI.
I am shipping soon! Some little improvements in messages I improved some messages, so that the kernel looks more polished to new users. v0.2.0 I released a new version, which is what I am shipping soon (if nothing goes wrong). It includes an interactive CLI, which was made possible with the new keyboard driver. I improved the scrolling performance a lot, which I personally really enjoy! Finally, I fixed a bug when printing numbers, so the printed memory map now has (mostly) correct addresses.
PIT I quickly wrote a simple PIT (Programmable Interval Timer) driver, so that I have a basic sleep function. It isn’t really useful at the moment and not thread safe, but as it was very simple I thought why not? APIC I realized that MADT I/O APIC overrides also override the flags of entries, so I am using these now unless it’s overridden by the user. Road map As I have now a simple keyboard driver, I want to work on something new. Some things I am considering: Multitasking Filesystems ELF loading PCI USB All of this topics are completely new to me, so I will pick the one that looks the most simple and probably fail anyway.
Multitasking (Screenshot 1) I decided to try to implement multitasking! The kernel can now switch tasks, but only one time. This is the first step in direction of real multitasking, but I still have much to do. It is interesting to see, How I realize how bad my implementations I did earlier are, because I don’t fully understand them. But now I can improve them! Dynamic arrays (Screenshot 2) I made a quick implementation of dynamic arrays for the keyboard driver, but as I realized that I need them to store a list of tasks, I decided to implement one optimized implementation I can use everywhere. I have implemented a very simple version and use it in the keyboard driver, but it isn’t optimized yet. In fact, it’s even worse than the one I had earlier in the keyboard driver, because every modification now requires a reallocation. Road map I am going to optimize dynamic arrays, and then continue with multitasking.
Array optimization (Screenshot 1) I now actually optimized the dynamic array type, which means that it allocates memory in bigger chunks instead of every time an element is added / removed. In the process I added some debug logging, so typing is now very difficult if you don’t know how it works with log level LOG_DEBUG . Custom ISR wrapper (Screenshot 2) I finally decided to implement my own wrapper for ISRs instead of relying on __attribute__((interrupt)) . This should allow me to use floating point math with the FPU in the future. Also, I can now read more registers on interrupt (screenshot). Road map I am currently working on making all ISRs compatible with my wrapper. Then I will continue trying to get multitasking to work.
It probably doesn’t sound special, but it is as important as everything else: SSE support SSE is an extension of the CPU which has 16 128-bit registers, but is rarely used. This means, that saving all of these registers every time a task switch occurs would cost some performance. For this reason, the CPU has a bit that can be set to indicate that a task switch occurred. In most cases, nothing happens and the registers are kept in their original state. But if a task needs to use SSE instructions, the CPU generates an interrupt, which manually saves the SSE registers. This is what I am working on currently. Custom ISR wrapper All interrupt handlers use now my custom wrappers, which made possible that I can work on SSE support.
SSE register state switching! The kernel will now switch the SSE register state lazily, but I still have two problems: The Part for the registers in the TCB must be 16 byte aligned, which it currently not guaranteed The interrupt handlers are not allowed to use SSE instructions, but I have no way of verifying this Road map I think it is time to write a version of malloc() which can guarantee a specified alignment. After that, I can try to actually switch tasks automatically with a simple scheduler! I will probably use the PIT interrupt to switch to the next task in a list.
Multitasking… I am still working on multitasking, but I am stuck currently. I am trying to modify the stack frame so that asm_switch_task is called after iretq , but it doesn’t work. As you can see on the screenshot, I get a page fault as soon as it tries to switch tasks (in the debugging process I had it switch 2-3 times before it crashes, which is not really better) Road map My highest priority is to get task switching to work consistently. After that, I will see what I can polish.
Multitasking! I fixed the last bug (that I could find) and multitasking works now! On the screenshot you can see two tasks trying to print the numbers 0-19 at the same time. The CLI even waits until the tasks are finished! Road map The output is still a little bit broken, so I want to implement output buffering and mutexes, so that multiple threads can’t print at the same time.
Mutexes I implemented a simple mutex (which isn’t perfect yet, but it works). As visible on the screenshot, I used it to make it impossible for the test tasks to print at the same time. One problem with it is that it currently runs hlt after releasing a mutex so that a different task has a chance to acquire it, which doesn’t seem like the best solution to me. Roadmap I am making the terminal position atomic, so that I don’t need mutexes for output, which I can not use in interrupt handlers
GCC support I added GCC support, which should (hopefully) make debugging easier for me. I can’t show it really on the screenshot, trust me, it is compiled with gcc! Roadmap I have still bugs in my multitasking system. Currently I get a page fault when compiling with optimization > -O2 with clang, the next step is to test it with GCC.
RTC The kernel can now read the current time from the Computer’s RTC! At the moment, you can’t select the time zone, so the time is probably in UTC, depending on how the computer is configured. Roadmap I am planning to improve the use experience, for example by using multiple “windows”, to maybe even have a status bar.
“Windows” I am making it possible to split the framebuffer into multiple views. This should make it more easy to have a more advanced UI than a CLI already inside the kernel. Hopefully there will be user processes at some point, but I want to have a nice looking OS before that. Roadmap I still have to fix some things (as visible on the screenshot). After that, I can try to make use of it and add a status bar or a separate command window.
Status bar! I added a status bar which show the current time. It is very basic, but makes the OS look way more friendlier in my opinion. Sorry for the weird messages in the main window, I am currently debugging my printf implementation. Roadmap I still have a problem with printing dates: The year 2006 would be printed as 206 , because the RTC has seperate registers for year and century, so if century is 20 and year is 6 it prints 206.
printf compatability I improved the printf() compatability, so that I can pad numbers with or 0 . This is very useful, for example I now can use it to display time and date properly. Roadmap I don’t know yet what’s the next thing to do, maybe I will ship soon.
Final improvements before the next release Status bar I moved the status bar from the bottom to the top and removed the borders, in my opinion it looks better this way. Framebuffer borders I am already working on a new command which will make it possible to see the borders of the framebuffer in QEMU. This will be useful for debugging while keeping the UI simple. Bugs There are still some obvious bugs: My printf() implementation seems to break with invalid format strings and I have a bug in my memory manager which prevents me from merging the command showing the screen borders into main. Roadmap I will try to fix the bugs, but the features are now complete. I want to release the new version tomorrow.
Release 0.3.0 I finished the release, including the new borders command! The visible bugs that I found are also fixed, please report them if you find some! Roadmap The kernel isn’t finished yet, I will continue to improve it and see how far I will get.
PCI! I am starting to write a PCI driver, which opens a new world to me! As you can see, the kernel is already able to print some information on boot about connected PCI devices. I also added a function that can search for a specific PCI device by it’s class, which will help me to implement drivers for specific PCI devices. Roadmap The real reason I am implementing PCI is that I need it to find the AHCI controller. The AHCI controller can be used to access connected storage devices, which is my long-term goal.
AHCI! (SATA) I am jumping a little bit fast form PCI to AHCI, but I think the PCI driver is as good as I need it right now, and if I learn that it isn’t, I will fix it. Anyway, I am starting to work on AHCI! This is really cool, as this allows me to communicate to storage devices! At the moment the kernel just lists connected devices, but that’s just the beginning! Roadmap The AHCI driver is in a very early stage, and it will take me a lot of time to finish, as AHCI is relatively complicated and the documentation isn’t written for beginners like me ;-)
Memory management problems… It seems like there was a critical bug sleeping inside my memory manager. It appeared since I started using the PMM in my AHCI driver, but I think the problem is in the virtual memory manager. For this reason I am working currently on the memory manager instead of the AHCI driver. Roadmap As soon as I fix the MM, I will continue on the AHCI driver. It probably won’t be finished until the end of stardance.
Ships:
I made an x86_64 kernel using the limine boot protocol. I don’t know what the most difficult thing was, as even most basic things are very complicated for me as a beginner in osdev. I still have to learn much and the kernel will be improved, but I thing it kind of works now. I have a video demo in the readme, if you don’t have qemu . When building, remember to clone the submodules ( git submodule init && git submodule update ). You need xorriso to build the ISO. Sorry for mixing meson and make , but in the README is a guide. Please use clang, gcc is very complicated.
I added a CLI the kernel, which was possible, because I finally have a keyboard driver! It only took so long, because it was actually difficult to write it: I thought I have to program the PIC, but it was already disabled so I had to learn the more complicated APIC. There is a demo video in the README if you don’t want to run the kernel. If you want to run it on macOS with UTM, you have to force a PS/2 controller: https://docs.getutm.app/settings-qemu/qemu/#force-ps2-controller
I have released the next version of my own kernel! The biggest feature I added is multitasking. While it doesn’t look that special, it was actually very difficult to make my kernel switch between different tasks! Here are some notes on how to try the project: If you don’t want/can’t run it, you can look at the video in the readme. If you want to run it on macOS with UTM, you have to force a PS/2 controller: https://docs.getutm.app/settings-qemu/qemu/#force-ps2-controller...
|
1792990588.7570596
|
1793076988.7570596
|
|
64143
|
BlueberryLinux by @zsigisti | Stardance
|
zsigisti
|
1
|
45.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T16:40:36Z", "hours": 45.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Blueberry Linux is a source-built rolling x86-64 server distro I’ve been working on since May. It isn’t a respin of anything. It has its own package manager (bpm, written in Rust with streaming installs and SHA-256 verification), its own package format, and its own signed repository using an Ed25519 signature over the index. There are 225 package recipes so far, from glibc and binutils upward. It’s also self-hosted in the real sense. The base system is built from Blueberry packages using the Blueberry toolchain, and if a build falls back to a foreign bootstrap, that’s considered a build failure rather than a successful build. I came back to the project after about a month away and spent some time auditing the live infrastructure before getting back to development. I fixed the repository issues I found, published nine package updates, and built something new: you can now try Blueberry directly in your browser at https://try.blueberrylinux.org . The hardest part of this round was actually a near miss. There’s an old copy of bpmrepo.sh sitting on the repository host that predates serial support. It doesn’t emit the |serial| line. It was sitting there looking perfectly usable, and it would have worked. The problem is that using it would have silently removed rollback protection from the signed repository index. Nothing would have obviously failed. The index would still have been signed and the repository would still have worked. I only caught it because I went back and checked what my own client actually expects instead of assuming the existing tool was the right one. The browser shell also had two bugs that took a bit of debugging. First, pty.fork() already calls setsid(), so I was calling it a second time. That resulted in EPERM and killed every session immediately after launch. Then the xterm CDN URLs started returning 404s. The frontend failed before it could even display the actual error, so from the user’s perspective it just sat there saying “connecting…”. I vendored the assets locally and changed the frontend to report asset loading failures properly. The part I’m happiest with is how the browser environment is built. The thing you’re running in the browser is actually assembled from the same packages the distro itself uses. The isolation is also verified rather than assumed. From inside a live session, the router, the hypervisor, and 1.1.1.1 are all unreachable, and only three PIDs are visible. If you want to try it, open https://try.blueberrylinux.org . It’s a real shell on a real Blueberry rootfs. There’s no network access, nothing persists between sessions, and each session is limited to ten minutes. The source is available here: https://github.com/zsigisti/blueberry", "repo": "https://github.com/zsigisti/blueberry", "demo": "https://try.blueberrylinux.org/"}]...
|
[{"post_id": 71299, "ts": "202 [{"post_id": 71299, "ts": "2026-09-20T16:21:40Z", "hours": 45.3069, "text": "Came back to Blueberry after a month and audited the live infrastructure before writing any code.State of the system: the distro is healthy. 225 recipes, valid index signature, and the main mirror is serving real packages.There were two actual issues.The published bpm.index was dated 31 July, so it was seven weeks stale. The other was blueberry-build.timer on the repo host, which had failed every hour since 29 June — 2,217 consecutive failures — because it was still trying to run blueberry-build-server.sh. I deleted that script during the .bpm migration and never disabled the unit.I also initially thought repo1 was broken. It isn’t. Its index is 0 bytes because it’s the BUR community mirror and nothing has been approved there yet. Nginx correctly returns 404 at the origin. That one was just me reading the state incorrectly.Both actual issues are now fixed.I disabled the timer rather than bringing the old script back. I also republished the index with a fresh serial using tools/release/repo-publish.sh. It re-indexes remotely using the hardened bpmrepo.sh, including a count-floor check, timestamped backup, and atomic index + signature swap.I almost used the wrong script. /opt/blueberry/tools/bpmrepo.sh is an orphaned copy from before serial support was added and doesn’t emit the |serial| line. Publishing with that one would have silently removed rollback protection from the signed index.I also did an upstream sweep. 110 of the 225 packages are currently outdated. The first scan hit 11 GitHub HTTP errors because of unauthenticated API rate limiting. Passing a token brought that down to one.I bumped and built nine packages from the current sources and published them:tzdata 2026b -> 2026dcurl 8.21 -> 8.22libcap 2.73 -> 2.78libxml2wireless-regdbless 668 -> 710jq 1.8.2htop 3.5.3nano 8.7.1All nine were built using the Blueberry toolchain with no bootstrap fallback. The changes are on branch pkg-bump-2026-09-20.Three automatic bumps produced incorrect source URLs. ca-certificates tried to fetch a 2026-08 PEM from the 2026-05 path, and expat tried to fetch 2.8.4 from the R_2_8_2 tag. Those were left unpublished rather than shipping the wrong tarball.sqlite needs a manual bump. openssl 3.4.6 -> 4.0.2, perl 5.40 -> 5.44, and gettext 0.26 -> 1.0 are ABI-level changes, so those will get separate passes.There’s also something new: you can try Blueberry directly in your browser. https://try.blueberrylinux.orgNo install and no signup. It’s a real shell running on a real Blueberry rootfs. The rootfs is about 480 MB, assembled by walking the dependency closure from bpm.index and pulling the packages directly from the live mirror. It contains 41 packages, including bpm 1.11.6.The frontend is xterm.js, with an aiohttp WebSocket connected to a PTY, served through Cloudflare.Each session gets an overlay over a read-only rootfs, its own network, PID, mount, and UTS namespaces, a 32 MB tmpfs, and a hard 10-minute limit. There are 12 concurrent sessions allowed, and sessions are torn down when the client disconnects.I also verified the isolation from inside a live session. The router, hypervisor, and 1.1.1.1 are unreachable, and only three PIDs are visible.There were two bugs while building the browser shell.First, pty.fork() already calls setsid(), so my additional setsid() call failed with EPERM and killed every session during startup. The server reported “operation not permitted” and closed the WebSocket before the shell even started.Second, the xterm CDN URLs were returning 404s. The page failed before it could report the error and just sat on “connecting…”. I vendored the assets locally and changed the frontend to report asset load failures explicitly.So the current state is: the repository is publishing again, the dead build timer is gone, the first batch of package updates is built and published, and Blueberry now has a browser-accessible shell for trying out the system without installing anything."}]...
|
Title: BlueberryLinux by @zsigisti | Stardance
De Title: BlueberryLinux by @zsigisti | Stardance
Devlogs:
Came back to Blueberry after a month and audited the live infrastructure before writing any code.State of the system: the distro is healthy. 225 recipes, valid index signature, and the main mirror is serving real packages.There were two actual issues.The published bpm.index was dated 31 July, so it was seven weeks stale. The other was blueberry-build.timer on the repo host, which had failed every hour since 29 June — 2,217 consecutive failures — because it was still trying to run blueberry-build-server.sh. I deleted that script during the .bpm migration and never disabled the unit.I also initially thought repo1 was broken. It isn’t. Its index is 0 bytes because it’s the BUR community mirror and nothing has been approved there yet. Nginx correctly returns 404 at the origin. That one was just me reading the state incorrectly.Both actual issues are now fixed.I disabled the timer rather than bringing the old script back. I also republished the index with a fresh serial using tools/release/repo-publish.sh. It re-indexes remotely using the hardened bpmrepo.sh, including a count-floor check, timestamped backup, and atomic index + signature swap.I almost used the wrong script. /opt/blueberry/tools/bpmrepo.sh is an orphaned copy from before serial support was added and doesn’t emit the |serial| line. Publishing with that one would have silently removed rollback protection from the signed index.I also did an upstream sweep. 110 of the 225 packages are currently outdated. The first scan hit 11 GitHub HTTP errors because of unauthenticated API rate limiting. Passing a token brought that down to one.I bumped and built nine packages from the current sources and published them:tzdata 2026b -> 2026dcurl 8.21 -> 8.22libcap 2.73 -> 2.78libxml2wireless-regdbless 668 -> 710jq 1.8.2htop 3.5.3nano 8.7.1All nine were built using the Blueberry toolchain with no bootstrap fallback. The changes are on branch pkg-bump-2026-09-20.Three automatic bumps produced incorrect source URLs. ca-certificates tried to fetch a 2026-08 PEM from the 2026-05 path, and expat tried to fetch 2.8.4 from the R_2_8_2 tag. Those were left unpublished rather than shipping the wrong tarball.sqlite needs a manual bump. openssl 3.4.6 -> 4.0.2, perl 5.40 -> 5.44, and gettext 0.26 -> 1.0 are ABI-level changes, so those will get separate passes.There’s also something new: you can try Blueberry directly in your browser. https://try.blueberrylinux.orgNo install and no signup. It’s a real shell running on a real Blueberry rootfs. The rootfs is about 480 MB, assembled by walking the dependency closure from bpm.index and pulling the packages directly from the live mirror. It contains 41 packages, including bpm 1.11.6.The frontend is xterm.js, with an aiohttp WebSocket connected to a PTY, served through Cloudflare.Each session gets an overlay over a read-only rootfs, its own network, PID, mount, and UTS namespaces, a 32 MB tmpfs, and a hard 10-minute limit. There are 12 concurrent sessions allowed, and sessions are torn down when the client disconnects.I also verified the isolation from inside a live session. The router, hypervisor, and 1.1.1.1 are unreachable, and only three PIDs are visible.There were two bugs while building the browser shell.First, pty.fork() already calls setsid(), so my additional setsid() call failed with EPERM and killed every session during startup. The server reported “operation not permitted” and closed the WebSocket before the shell even started.Second, the xterm CDN URLs were returning 404s. The page failed before it could report the error and just sat on “connecting…”. I vendored the assets locally and changed the frontend to report asset load failures explicitly.So the current state is: the repository is publishing again, the dead build timer is gone, the first batch of package updates is built and published, and Blueberry now has a browser-accessible shell for trying out the system without installing anything.
Ships:
Blueberry Linux is a source-built rolling x86-64 server distro I’ve been working on since May. It isn’t a respin of anything. It has its own package manager (bpm, written in Rust with streaming installs and SHA-256 verification), its own package format, and its own signed repository using an Ed25519 signature over the index. There are 225 package recipes so far, from glibc and binutils upward. It’s also self-hosted in the real sense. The base system is built from Blueberry packages using the Blueberry toolchain, and if a build falls back to a foreign bootstrap, that’s considered a build failure rather than a successful build. I came back to the project after about a month away and spent some time auditing the live infrastructure before getting back to development. I fixed the repository issues I found, published nine package updates, and built something new: you can now try Blueberry directly in your browser at https://try.blueberrylinux.org . The hardest part of this round was actually a near miss. There’s an old copy of bpmrepo.sh sitting on the repository host that predates serial support. It doesn’t emit the |serial| line. It was sitting there looking perfectly usable, and it would have worked. The problem is that using it would have silently removed rollback protection from the signed repository index. Nothing would have obviously failed. The index would still have been signed and the repository would still have worked. I only caught it because I went back and checked what my own client actually expects instead of assuming the existing tool was the right one. The browser shell also had two bugs that took a bit of debugging. First, pty.fork() already calls setsid(), so I was calling it a second time. That resulted in EPERM and killed every session immediately after launch. Then the xterm CDN URLs started returning 404s. The frontend failed before it could even display the actual error, so from the user’s perspective it just sat there saying “connecting…”. I vendored the assets locally and changed the frontend to report asset loading failures properly. The part I’m happiest with is how the browser environment is built. The thing you’re running in the browser is actually assembled from the same packages the distro itself uses. The isolation is also verified rather than assumed. From inside a live session, the router, the hypervisor, and 1.1.1.1 are all unreachable, and only three PIDs are visible. If you want to try it, open https://try.blueberrylinux.org . It’s a real shell on a real Blueberry rootfs. There’s no network access, nothing persists between sessions, and each session is limited to ten minutes. The source is available here: https://github.com/zsigisti/blueberry...
|
1793058889.9513018
|
1793145289.9513018
|
|
64127
|
Sums of three cubes solver by @alij | Stardance
|
alij
|
1
|
9.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T16:35:21Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made an implementation of an algorithm to find solutions to the sums of three cubes problem! Some challenging aspects were making the algorithm work multithreaded, and saving/loading progress. If you want to try it out, please download the C file from my github and run make.", "repo": "https://github.com/OG10YROLD/sums_of_three_cubes", "demo": "https://github.com/OG10YROLD/sums_of_three_cubes/blob/main/main.c"}]...
|
[{"post_id": 71265, "ts": "202 [{"post_id": 71265, "ts": "2026-09-20T15:29:51Z", "hours": 9.4022, "text": "What three cube numbers sum to 29? Obviously, 3^3 + 1^3 + 1^3 works. What about 42? Well, the first ever solution was only discovered in 2019! It is 80435758145817515^3 + (−80538738812075974)^3 + 12602123297335631^3. Finding the three cubes which sum to a given number is a famous problem in the field of Diophantine equations, with many new results discovered in the past decade. The algorithm to find these using a computer makes use of many breakthroughs in mathematics and computer science. Naively, you might nest three loops to get O(n^3) time complexity, but for the above solution you’d need to search at least 10^51 combinations, which is more than the number of atoms on Earth. Researchers in the field have optimised the algorithm mathematically to about O(B(log log B)^(1+o(1))), where B is the upper bound for min(|x|, |y|, |z|). This still required large amounts of computing power for the new solutions found recently. The last possible number under 100 to be solved was 42 in 2019, which was possible through crowdsourced compute power from people’s spare computers. I implemented the algorithm in C, and although I didn’t find new solutions (my laptop isn’t quite powerful enough) I did re-discover many solutions, including 30 which was found in 1999."}]...
|
Title: Sums of three cubes solver by @alij | Stard Title: Sums of three cubes solver by @alij | Stardance
Devlogs:
What three cube numbers sum to 29? Obviously, 3^3 + 1^3 + 1^3 works. What about 42? Well, the first ever solution was only discovered in 2019! It is 80435758145817515^3 + (−80538738812075974)^3 + 12602123297335631^3. Finding the three cubes which sum to a given number is a famous problem in the field of Diophantine equations, with many new results discovered in the past decade. The algorithm to find these using a computer makes use of many breakthroughs in mathematics and computer science. Naively, you might nest three loops to get O(n^3) time complexity, but for the above solution you’d need to search at least 10^51 combinations, which is more than the number of atoms on Earth. Researchers in the field have optimised the algorithm mathematically to about O(B(log log B)^(1+o(1))), where B is the upper bound for min(|x|, |y|, |z|). This still required large amounts of computing power for the new solutions found recently. The last possible number under 100 to be solved was 42 in 2019, which was possible through crowdsourced compute power from people’s spare computers. I implemented the algorithm in C, and although I didn’t find new solutions (my laptop isn’t quite powerful enough) I did re-discover many solutions, including 30 which was found in 1999.
Ships:
I made an implementation of an algorithm to find solutions to the sums of three cubes problem! Some challenging aspects were making the algorithm work multithreaded, and saving/loading progress. If you want to try it out, please download the C file from my github and run make....
|
1793058887.9228196
|
1793145287.9228196
|
|
63965
|
personal web by @shibin | Stardance
|
shibin
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T16:12:26Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I was making my own personal website like a portfolio and I was also learning HTML and CSS I was learning for a long time so I learned it pretty much and I still had a confusion on you know changing you know like the size of it and changing the position of it like the I want to please like I want to place the the wherever wherever I wanted So I had a problem with that like the placement of it so I used AI to not write goat tell me how to do it and when it asks like it is still to me like how to do it when I try to do it it did not work so I just you know remove that code I just use on my original code in that and that’s it", "repo": "https://github.com/mshibin04/portfolio-website", "demo": "https://mohammed-shibin-pt.vercel.app/"}]...
|
[{"post_id": 71027, "ts": "202 [{"post_id": 71027, "ts": "2026-09-20T07:06:10Z", "hours": 1.0203, "text": "my own personal website"}]...
|
Title: personal web by @shibin | Stardance
Devlog Title: personal web by @shibin | Stardance
Devlogs:
my own personal website
Ships:
I was making my own personal website like a portfolio and I was also learning HTML and CSS I was learning for a long time so I learned it pretty much and I still had a confusion on you know changing you know like the size of it and changing the position of it like the I want to please like I want to place the the wherever wherever I wanted So I had a problem with that like the placement of it so I used AI to not write goat tell me how to do it and when it asks like it is still to me like how to do it when I try to do it it did not work so I just you know remove that code I just use on my original code in that and that’s it...
|
1793058858.211277
|
1793145258.211277
|
|
54181
|
LifeCalc by @nameer | Stardance
|
nameer
|
1
|
11.41
|
30
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T16:05:18Z", "hours": 11.0, "multiplier": 2.83, "payout": 30, "blessing": "neutral", "text": "Ok so I made a web based calculator that makes life easier and smoother its called LifeCalc. It has age calculator, date calculator, BMI calculator, tip calculator, percentage calculator, discount calculator, unit converter and interest calculator. The difficulties I faced was mainly the unfamiliarity with Github. Hopefully this will make life easier.", "repo": "https://github.com/nameerhassannhr-glitch/lifecalc", "demo": "https://nameerhassannhr-glitch.github.io/lifecalc/"}]...
|
[{"post_id": 72114, "ts": "202 [{"post_id": 72114, "ts": "2026-09-22T06:10:37Z", "hours": 0.415, "text": "I fixed the broken readme that was being flagged and fixed the picture error i have been getting"}, {"post_id": 71270, "ts": "2026-09-20T15:37:39Z", "hours": 0.7178, "text": "ok so as Iam was in the last step of the lifecalc i tested out all 8 of the calculators fixed a issue in the unit converter that was lead by an extra gap what an idiot iam so after it i finished the markdown file aded the screenshot made the website live and fixed a few other calculation bug"}, {"post_id": 70159, "ts": "2026-09-18T16:24:22Z", "hours": 10.0422, "text": "ok so ever since the last devlog things have changed i was in a science camp recently so after i came from the science camp i changed the calc style added the new calculators, fixed bugs, checked things and now its almost over"}]...
|
Title: LifeCalc by @nameer | Stardance
Devlogs:
o Title: LifeCalc by @nameer | Stardance
Devlogs:
ok so ever since the last devlog things have changed i was in a science camp recently so after i came from the science camp i changed the calc style added the new calculators, fixed bugs, checked things and now its almost over
ok so as Iam was in the last step of the lifecalc i tested out all 8 of the calculators fixed a issue in the unit converter that was lead by an extra gap what an idiot iam so after it i finished the markdown file aded the screenshot made the website live and fixed a few other calculation bug
I fixed the broken readme that was being flagged and fixed the picture error i have been getting
Ships:
Ok so I made a web based calculator that makes life easier and smoother its called LifeCalc. It has age calculator, date calculator, BMI calculator, tip calculator, percentage calculator, discount calculator, unit converter and interest calculator. The difficulties I faced was mainly the unfamiliarity with Github. Hopefully this will make life easier....
|
1793008158.7421737
|
1793094558.7421737
|
|
62719
|
Tux-WebOS by @deadbeef404 | Stardance
|
deadbeef404
|
1
|
9.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T16:02:02Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a keyboard driven, scrollable tiling window manager inspired webOS. Only for devices which have keyboard access cuz it is mainly keyboard driven.", "repo": "https://github.com/Loml-1989/Tux-WebOS", "demo": "https://webos.tuxotaku.tech/"}]...
|
[{"post_id": 71281, "ts": "202 [{"post_id": 71281, "ts": "2026-09-20T15:57:05Z", "hours": 0.3033, "text": "Added a readme.md file"}, {"post_id": 71244, "ts": "2026-09-20T14:53:15Z", "hours": 0.6808, "text": "Added a welcome screen to welcome and explain how to use it."}, {"post_id": 71014, "ts": "2026-09-20T06:33:00Z", "hours": 1.9022, "text": "I have added a functioning system monitor so now it shows some information. NOT correct one but it DOES show SOMETHING so yeah :)"}, {"post_id": 70155, "ts": "2026-09-18T16:05:23Z", "hours": 1.1756, "text": "I made the file manager actually functioning with some files in it asw."}, {"post_id": 70119, "ts": "2026-09-18T14:36:14Z", "hours": 0.8461, "text": "I made terminal functional with few commands. I added help, clear, echo, date, whoami, and neofetch."}, {"post_id": 70081, "ts": "2026-09-18T12:45:44Z", "hours": 0.8794, "text": "Added ability to change wallpaper and add custom wallpaper in the settings application."}, {"post_id": 70065, "ts": "2026-09-18T11:45:57Z", "hours": 0.27, "text": "I added a wallpaper and made some theme changes for consistency."}, {"post_id": 70051, "ts": "2026-09-18T11:12:40Z", "hours": 0.3017, "text": "I added a full screen ability so u can full screen the active window by using shift + i. I also added the ability to change the active window by using shift + h to go left and shift + l to go right window. Additionally I added a highlight/backlight for the active window so that the user can know which window is active."}, {"post_id": 70039, "ts": "2026-09-18T10:50:35Z", "hours": 0.9075, "text": "I removed window decoration because I don’t like it. Added navigation in the launcher using the arrow keys/navigation keys and ability to open the app using enter. You can focus the window by clicking it and close it by shift + c."}, {"post_id": 70022, "ts": "2026-09-18T09:29:27Z", "hours": 0.8019, "text": "Got the launcher show up when pressing shift + space. The problems was that it was getting hidden behind the DOM so I fixed that and now the launcher actually does show up when the user presses shift + space."}, {"post_id": 69087, "ts": "2026-09-16T10:55:49Z", "hours": 0.4425, "text": "Setting up the basic structure, adding a dark theme, and creating a fixed bottom status bar (similar to waybar), implementing a horizontal scrolling layout for the main workspace, inspired by tiling window managers like Niri. Added a JavaScript function to spawn dummy windows so you can see the scrolling mechanics along with a functional clock for the bar"}]...
|
Title: Tux-WebOS by @deadbeef404 | Stardance
Devl Title: Tux-WebOS by @deadbeef404 | Stardance
Devlogs:
Setting up the basic structure, adding a dark theme, and creating a fixed bottom status bar (similar to waybar), implementing a horizontal scrolling layout for the main workspace, inspired by tiling window managers like Niri. Added a JavaScript function to spawn dummy windows so you can see the scrolling mechanics along with a functional clock for the bar
Got the launcher show up when pressing shift + space. The problems was that it was getting hidden behind the DOM so I fixed that and now the launcher actually does show up when the user presses shift + space.
I removed window decoration because I don’t like it. Added navigation in the launcher using the arrow keys/navigation keys and ability to open the app using enter. You can focus the window by clicking it and close it by shift + c.
I added a full screen ability so u can full screen the active window by using shift + i. I also added the ability to change the active window by using shift + h to go left and shift + l to go right window. Additionally I added a highlight/backlight for the active window so that the user can know which window is active.
I added a wallpaper and made some theme changes for consistency.
Added ability to change wallpaper and add custom wallpaper in the settings application.
I made terminal functional with few commands. I added help, clear, echo, date, whoami, and neofetch.
I made the file manager actually functioning with some files in it asw.
I have added a functioning system monitor so now it shows some information. NOT correct one but it DOES show SOMETHING so yeah :)
Added a welcome screen to welcome and explain how to use it.
Added a readme.md file
Ships:
This is a keyboard driven, scrollable tiling window manager inspired webOS. Only for devices which have keyboard access cuz it is mainly keyboard driven....
|
1793058642.1399922
|
1793145042.1399922
|
|
43178
|
GamEngine by @bartoszkasyna | Stardance
|
bartoszkasyna
|
1
|
244.34
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T15:49:21Z", "hours": 195.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made GPU driven game engine. It use vulkan 1.4. GTAO and VSM are still little bugged. Project will be still in development. This experimental version. More deatils are in devlogs. If engine or demo crashes on your device please send me generated logs and device specification", "repo": "https://github.com/B4rtekk1/GamEngine", "demo": "https://github.com/B4rtekk1/GamEngine/releases/tag/v0.1.0"}]...
|
[{"post_id": 79106, "ts": "202 [{"post_id": 79106, "ts": "2026-10-12T18:07:52Z", "hours": 10.8381, "text": "I was working on bug fixes and glass system. Glass is not working was I want but it havs some progress. Currently glass is highly unoptimized."}, {"post_id": 78281, "ts": "2026-10-10T08:29:57Z", "hours": 4.4117, "text": "I made custom installer for my engine. Now i willl work on optimatization"}, {"post_id": 74967, "ts": "2026-09-28T18:36:35Z", "hours": 9.7639, "text": "I mainly working on bug fixing. Now VSM and GTAO are fully stable, TAA still needs some love. I was also working on fbx model importer. On the image you can see Amazon Lumberyard Bistro which has 2.7M triangles with 140FPS. I have to work on fps stability while moving camera and make glass shader/object."}, {"post_id": 74396, "ts": "2026-09-27T09:59:55Z", "hours": 9.5208, "text": "I was trying to made my version of DDGI but it was unstable, so I made this disabled. Full DDGI would be impossible for my gpu so I used Brixelizer GI from FidelityFX SDK from AMD. It looks good and stable. Image is capyured on intel sponza which has 2.7M traingles - 13x more than original sponza so my engine scale well."}, {"post_id": 73521, "ts": "2026-09-25T09:34:28Z", "hours": 9.7292, "text": "I was working on Ray Traced Contact Shadows and DDGI. Ray traced shadows works well without droping fps that much. Currently my DDGI is bugged - its very dark. The image is taken with RTCS, DGGI disabled"}, {"post_id": 72555, "ts": "2026-09-23T06:37:29Z", "hours": 5.0792, "text": "Successfully optimized GTAO and VSM, 40FPS gain and more stable 1% low"}, {"post_id": 71260, "ts": "2026-09-20T15:17:19Z", "hours": 7.5197, "text": "I was working on game optimization, editor functionalities and standalone game building. I successfully optimized GTAO and VSM a little. GTAO still have some halo around some objects and VSM are not full stable. I added option build game in editor. I have to optimize editor a little and add some more functionalities. On the first image you can see nvidia nsight graphics profiler and on the second one standalone game build running in 160 after few seconds. This is decent score for rtx 3050."}, {"post_id": 70490, "ts": "2026-09-19T08:46:32Z", "hours": 7.4986, "text": "I was trying to fix shadows but it didint go well, so I gave up and started refactoring code for better readibiliy. On the image you can see broken verin of shadows, dont worry I went back to working ones. I fixed few smaller nearly invisible shadows bugs, so I didint waste myy time. Now I will focus on optimatization and graphics effet"}, {"post_id": 69704, "ts": "2026-09-17T16:43:10Z", "hours": 8.0603, "text": "I started migration to dynamic rendering, so rendering pipeline would be much easier for user. I also made custom title bar. Im in process of improving UI. I found two bugs - in certains camera angle shadows/AO or something doesnt work correctly. Second - some random patterns may occur while looking into sky inside sponza"}, {"post_id": 69075, "ts": "2026-09-16T10:23:21Z", "hours": 5.7283, "text": "I made water system but it look horrible and performance isnt great, so i focused next on large models importing. Big models are now devided into meshlets. On the image you can see very popular benchmark scene, its called crytek sponza. I think that 170FPS in this stage is good"}, {"post_id": 68570, "ts": "2026-09-15T10:28:57Z", "hours": 8.1017, "text": "I am working on water system. I decided to make something diffrent that normal water commonly used in every modern engine. I want to make virtual water system which is inspired by VSM. More technical details I will provide in devlog when I finish my water system. I dont have any working water image so I just upload some engine footage. PS. It might be much more optimize than normal water."}, {"post_id": 67943, "ts": "2026-09-14T08:27:35Z", "hours": 6.5411, "text": "I was working on water system and improving GTAO. While testing I found weird little horizontal strips on shadows. I thought it was my WSM bug so I was trying to fix it. After I checked all possible bugs i realized that I could downgrade GTAO by linear interpolation. I fixed it and now works fine. Water currently has implemented SSR and simple Gernster waves. On the images you can see clip levels and virutal pages shown in shadow debug mode"}, {"post_id": 67159, "ts": "2026-09-13T07:20:53Z", "hours": 7.1444, "text": "I was working on editor optimatization and bug fixes. Editor launch time jumped from ~7seconds to 1.5 seconds if editor has cache, otherwise 4.3 seconds. Launching editor no more cause vulkan errors. I also added IBL and reflects. I also bugged shadows a little."}, {"post_id": 66406, "ts": "2026-09-12T06:58:22Z", "hours": 6.8744, "text": "I was working on finishing render graph. I also optimized editor - in huge scenes it will have more stable 60FPS. I optimized game mode - 1% low are higher now"}, {"post_id": 65853, "ts": "2026-09-11T08:49:16Z", "hours": 8.0272, "text": "I was mainly working on models and textures compression. Textures are now compressed into BC7 format. I also added remdergraph so user dont have to make it manually."}, {"post_id": 65239, "ts": "2026-09-10T07:13:42Z", "hours": 7.9544, "text": "Today I was working on game optimatization and little shadows improvements. I was mainly working on game profiler as you can see in the image"}, {"post_id": 64328, "ts": "2026-09-08T16:49:40Z", "hours": 9.6778, "text": "Last 2 days I was working on editor functionalities. I added built-in powersheell terminal. I also added shadergraph which currently is doesnt want to compile properly"}, {"post_id": 63480, "ts": "2026-09-07T11:14:38Z", "hours": 6.3356, "text": "I was working on UX in editor. Then I found bug which I couldnt fix for 3 hours. Bug was caused my matrix decompose floating point"}, {"post_id": 62420, "ts": "2026-09-05T19:23:52Z", "hours": 5.1811, "text": "Today I was working on optimatization, code quality and better model imports. fps jumped from ~400 to ~430."}, {"post_id": 61744, "ts": "2026-09-04T20:02:01Z", "hours": 8.3261, "text": "I was working on game optimzatization. I made jump from around 200FPS to 400. There is still a lot more things to optimize."}, {"post_id": 59136, "ts": "2026-08-31T19:21:14Z", "hours": 5.6275, "text": "I was working on optimizing grass system. I added wind component and optimized colission with other objects. Thanks to optimatization FPS jumped from ~250 to ~320. I also modified scene saving system - binary file as main file and .terrains failes as terrain data. I added Editor layout to AppData so editor rembeber your last layout"}, {"post_id": 58356, "ts": "2026-08-30T19:03:02Z", "hours": 6.1303, "text": "Today i was adding missing tests. I also updated terrain sculping system - you can now sculp all terrain at once if multiple instances. I added some utils and deleted fps limit in play mode."}, {"post_id": 57564, "ts": "2026-08-29T19:02:32Z", "hours": 4.8972, "text": "Today I was working on better shadow implemenatation. I implemented VSM shadows - smiliar are used in UE5. I think its looks good"}, {"post_id": 56852, "ts": "2026-08-28T20:10:13Z", "hours": 5.6839, "text": "Today I was working on code quality and better terrain sculping tools. I added grass painting. I also added some nice shader to grass - A rolling ball leaves a trail in the grass. Check it out!"}, {"post_id": 56432, "ts": "2026-08-28T06:18:19Z", "hours": 5.745, "text": "I was working on terrain sculping. I was inspired by unity system generator so I wanted to make something smiliar. Now there is only one brush but i will extend possibilities of my system."}, {"post_id": 55427, "ts": "2026-08-27T07:58:03Z", "hours": 4.6125, "text": "Added gltf models importing with editor asset manager. Imported gameobject has his unique mesh collider."}, {"post_id": 54988, "ts": "2026-08-26T12:44:55Z", "hours": 2.9125, "text": "I was fixing my physics system. I fixed some bugs and created new ones. First new bug is sphere bouning up on first contact. 2 bug is cube lifting up another cube. I’m happy that I removed object shaking"}, {"post_id": 54700, "ts": "2026-08-25T19:29:26Z", "hours": 6.6933, "text": "Today I was mainly working on code quality and project refactorization. When I was testing scenes with various of configuration I found some type of physics bug - Objects are shaking for some reason, you can see this in attached video"}, {"post_id": 53759, "ts": "2026-08-24T13:13:25Z", "hours": 1.2175, "text": "last 1.25h I was adding cube physics, imo it look very satisfying."}, {"post_id": 53644, "ts": "2026-08-24T09:33:54Z", "hours": 4.9856, "text": "I was working on realistic sphere physics. I think it looks good enough. I was also working on tests. Fixed bug when ramp after start/stop was changing her location."}, {"post_id": 52942, "ts": "2026-08-23T09:58:18Z", "hours": 3.4753, "text": "I added simple gravity and colliders. I also reorganized code a little - I make high level API so user dont have to use Vulkan and SDL directly."}, {"post_id": 52275, "ts": "2026-08-22T11:51:51Z", "hours": 3.0019, "text": "Added Color picker, and updated window reloading while adding MSAA or new color. Now you can easily change color in editor"}, {"post_id": 51666, "ts": "2026-08-21T13:55:21Z", "hours": 2.4742, "text": "I made object scriptable!"}, {"post_id": 50944, "ts": "2026-08-20T12:37:57Z", "hours": 4.6658, "text": "I messed something up and m editor wasnt responding I couldt click anything. I was trying to fix it almost 5 hours. What I fixed? - vulkan and SDL were recreating while turning MSAA on and GPU was loosing context"}, {"post_id": 49752, "ts": "2026-08-18T17:53:31Z", "hours": 3.2764, "text": "Editor Update The editor has been significantly improved and now looks much better. Cross-Platform Support The editor no longer depends on the Windows API, which means it should work on both Windows and Linux . Technology Stack The original goal was to use only: C++ Vulkan SDK SDL3 GLM These are all standard components that come with a typical Vulkan development setup. After further research, Dear ImGui was also added. It is currently the only third-party dependency . Performance Both the Scene View and Game View are capped at 60 FPS . The Scene View captures the 90th frame of the particle effect so that it remains static. Next Steps Focus will now shift to expanding the editor’s functionality."}, {"post_id": 49441, "ts": "2026-08-18T09:01:45Z", "hours": 1.725, "text": "I made basic editor. Now looks like terrible but I will make it better"}, {"post_id": 49021, "ts": "2026-08-17T16:44:03Z", "hours": 1.5692, "text": "Added movement, you can move by using wasd, scroll and RMB"}, {"post_id": 48153, "ts": "2026-08-16T13:31:10Z", "hours": 4.0589, "text": "Particle System I was trying to add .glb models importer but this is very hard to do without third parties dependencies and i messed up something - Tree looks flat(second attachment). After many failed attempts I decided to start making particle system, as you can see it looks good. It is also optimized. FPS drop which you can see on video is caused by cmake compilation in background. I hope you like my particles :) All of this is made in C++ and the Vulkan SDK."}, {"post_id": 47579, "ts": "2026-08-15T15:41:56Z", "hours": 2.8206, "text": "Progress Update – Last 3 Hours Focused on two main things: Engine Optimization Font Rasterizer – added support for rendering fonts in the HUD Optimizations: Integrated VMA (Vulkan Memory Allocator) Added object instancing Fixed a buffer bug that was causing a memory leak Image: Cube made of 30×30×30 (27 000) smaller cubes + HUD with rendered font. All of this is made in C++ and the Vulkan SDK."}, {"post_id": 47338, "ts": "2026-08-15T06:56:33Z", "hours": 5.75, "text": "Engine Updates Added GPU-driven Hi-Z culling Added canvas — you can now make HUDs Optimized scenes a little Added Scene Serializer Added Asset Manager Added Color class — you no longer have to work with plain vectors Showcase On the image you can see a cube made from 30×30×30 smaller cubes, each one casting a shadow. In the bottom-left corner you can see the canvas. All of this is made in C++ and the Vulkan SDK ."}, {"post_id": 46339, "ts": "2026-08-13T14:18:08Z", "hours": 4.5861, "text": "Added Engine Math based on glm. Optimized multi object drawing. Made better project structure"}, {"post_id": 45817, "ts": "2026-08-12T15:21:12Z", "hours": 2.5969, "text": "Added shadows, game objects, engine vectors and matrixs, standaole camera, position and transforms"}, {"post_id": 40303, "ts": "2026-08-03T18:52:30Z", "hours": 3.1914, "text": "I have reorganized code. I added MSAA and rotaing cube!"}, {"post_id": 39619, "ts": "2026-08-02T18:45:09Z", "hours": 0.8017, "text": "I finished my previus project so now i can have two concurrent - this and c++/cuda custom llm. Successfully rendered triangle :) Its only about ~1000 lines of code. I used offical tutorial for start."}]...
|
Title: GamEngine by @bartoszkasyna | Stardance
De Title: GamEngine by @bartoszkasyna | Stardance
Devlogs:
I finished my previus project so now i can have two concurrent - this and c++/cuda custom llm. Successfully rendered triangle :) Its only about ~1000 lines of code. I used offical tutorial for start.
I have reorganized code. I added MSAA and rotaing cube!
Added shadows, game objects, engine vectors and matrixs, standaole camera, position and transforms
Added Engine Math based on glm. Optimized multi object drawing. Made better project structure
Engine Updates Added GPU-driven Hi-Z culling Added canvas — you can now make HUDs Optimized scenes a little Added Scene Serializer Added Asset Manager Added Color class — you no longer have to work with plain vectors Showcase On the image you can see a cube made from 30×30×30 smaller cubes, each one casting a shadow. In the bottom-left corner you can see the canvas. All of this is made in C++ and the Vulkan SDK .
Progress Update – Last 3 Hours Focused on two main things: Engine Optimization Font Rasterizer – added support for rendering fonts in the HUD Optimizations: Integrated VMA (Vulkan Memory Allocator) Added object instancing Fixed a buffer bug that was causing a memory leak Image: Cube made of 30×30×30 (27 000) smaller cubes + HUD with rendered font. All of this is made in C++ and the Vulkan SDK.
Particle System I was trying to add .glb models importer but this is very hard to do without third parties dependencies and i messed up something - Tree looks flat(second attachment). After many failed attempts I decided to start making particle system, as you can see it looks good. It is also optimized. FPS drop which you can see on video is caused by cmake compilation in background. I hope you like my particles :) All of this is made in C++ and the Vulkan SDK.
Added movement, you can move by using wasd, scroll and RMB
I made basic editor. Now looks like terrible but I will make it better
Editor Update The editor has been significantly improved and now looks much better. Cross-Platform Support The editor no longer depends on the Windows API, which means it should work on both Windows and Linux . Technology Stack The original goal was to use only: C++ Vulkan SDK SDL3 GLM These are all standard components that come with a typical Vulkan development setup. After further research, Dear ImGui was also added. It is currently the only third-party dependency . Performance Both the Scene View and Game View are capped at 60 FPS . The Scene View captures the 90th frame of the particle effect so that it remains static. Next Steps Focus will now shift to expanding the editor’s functionality.
I messed something up and m editor wasnt responding I couldt click anything. I was trying to fix it almost 5 hours. What I fixed? - vulkan and SDL were recreating while turning MSAA on and GPU was loosing context
I made object scriptable!
Added Color picker, and updated window reloading while adding MSAA or new color. Now you can easily change color in editor
I added simple gravity and colliders. I also reorganized code a little - I make high level API so user dont have to use Vulkan and SDL directly.
I was working on realistic sphere physics. I think it looks good enough. I was also working on tests. Fixed bug when ramp after start/stop was changing her location.
last 1.25h I was adding cube physics, imo it look very satisfying.
Today I was mainly working on code quality and project refactorization. When I was testing scenes with various of configuration I found some type of physics bug - Objects are shaking for some reason, you can see this in attached video
I was fixing my physics system. I fixed some bugs and created new ones. First new bug is sphere bouning up on first contact. 2 bug is cube lifting up another cube. I’m happy that I removed object shaking
Added gltf models importing with editor asset manager. Imported gameobject has his unique mesh collider.
I was working on terrain sculping. I was inspired by unity system generator so I wanted to make something smiliar. Now there is only one brush but i will extend possibilities of my system.
Today I was working on code quality and better terrain sculping tools. I added grass painting. I also added some nice shader to grass - A rolling ball leaves a trail in the grass. Check it out!
Today I was working on better shadow implemenatation. I implemented VSM shadows - smiliar are used in UE5. I think its looks good
Today i was adding missing tests. I also updated terrain sculping system - you can now sculp all terrain at once if multiple instances. I added some utils and deleted fps limit in play mode.
I was working on optimizing grass system. I added wind component and optimized colission with other objects. Thanks to optimatization FPS jumped from ~250 to ~320. I also modified scene saving system - binary file as main file and .terrains failes as terrain data. I added Editor layout to AppData so editor rembeber your last layout
I was working on game optimzatization. I made jump from around 200FPS to 400. There is still a lot more things to optimize.
Today I was working on optimatization, code quality and better model imports. fps jumped from ~400 to ~430.
I was working on UX in editor. Then I found bug which I couldnt fix for 3 hours. Bug was caused my matrix decompose floating point
Last 2 days I was working on editor functionalities. I added built-in powersheell terminal. I also added shadergraph which currently is doesnt want to compile properly
Today I was working on game optimatization and little shadows improvements. I was mainly working on game profiler as you can see in the image
I was mainly working on models and textures compression. Textures are now compressed into BC7 format. I also added remdergraph so user dont have to make it manually.
I was working on finishing render graph. I also optimized editor - in huge scenes it will have more stable 60FPS. I optimized game mode - 1% low are higher now
I was working on editor optimatization and bug fixes. Editor launch time jumped from ~7seconds to 1.5 seconds if editor has cache, otherwise 4.3 seconds. Launching editor no more cause vulkan errors. I also added IBL and reflects. I also bugged shadows a little.
I was working on water system and improving GTAO. While testing I found weird little horizontal strips on shadows. I thought it was my WSM bug so I was trying to fix it. After I checked all possible bugs i realized that I could downgrade GTAO by linear interpolation. I fixed it and now works fine. Water currently has implemented SSR and simple Gernster waves. On the images you can see clip levels and virutal pages shown in shadow debug mode
I am working on water system. I decided to make something diffrent that normal water commonly used in every modern engine. I want to make virtual water system which is inspired by VSM. More technical details I will provide in devlog when I finish my water system. I dont have any working water image so I just upload some engine footage. PS. It might be much more optimize than normal water.
I made water system but it look horrible and performance isnt great, so i focused next on large models importing. Big models are now devided into meshlets. On the image you can see very popular benchmark scene, its called crytek sponza. I think that 170FPS in this stage is good
I started migration to dynamic rendering, so rendering pipeline would be much easier for user. I also made custom title bar. Im in process of improving UI. I found two bugs - in certains camera angle shadows/AO or something doesnt work correctly. Second - some random patterns may occur while looking into sky inside sponza
I was trying to fix shadows but it didint go well, so I gave up and started refactoring code for better readibiliy. On the image you can see broken verin of shadows, dont worry I went back to working ones. I fixed few smaller nearly invisible shadows bugs, so I didint waste myy time. Now I will focus on optimatization and graphics effet
I was working on game optimization, editor functionalities and standalone game building. I successfully optimized GTAO and VSM a little. GTAO still have some halo around some objects and VSM are not full stable. I added option build game in editor. I have to optimize editor a little and add some more functionalities. On the first image you can see nvidia nsight graphics profiler and on the second one standalone game build running in 160 after few seconds. This is decent score for rtx 3050.
Successfully optimized GTAO and VSM, 40FPS gain and more stable 1% low
I was working on Ray Traced Contact Shadows and DDGI. Ray traced shadows works well without droping fps that much. Currently my DDGI is bugged - its very dark. The image is taken with RTCS, DGGI disabled
I was trying to made my version of DDGI but it was unstable, so I made this disabled. Full DDGI would be impossible for my gpu so I used Brixelizer GI from FidelityFX SDK from AMD. It looks good and stable. Image is capyured on intel sponza which has 2.7M traingles - 13x more than original sponza so my engine scale well.
I mainly working on bug fixing. Now VSM and GTAO are fully stable, TAA still needs some love. I was also working on fbx model importer. On the image you can see Amazon Lumberyard Bistro which has 2.7M triangles with 140FPS. I have to work on fps stability while moving camera and make glass shader/object.
I made custom installer for my engine. Now i willl work on optimatization
I was working on bug fixes and glass system. Glass is not working was I want but it havs some progress. Currently glass is highly unoptimized.
Ships:
I made GPU driven game engine. It use vulkan 1.4. GTAO and VSM are still little bugged. Project will be still in development. This experimental version. More deatils are in devlogs. If engine or demo crashes on your device please send me generated logs and device specification...
|
1793004576.0821161
|
1793090976.0821161
|
|
63742
|
Website by @danb1551 | Stardance
|
danb1551
|
1
|
6.76
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T15:47:44Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I remade my personal site. I added links to my profiles on other platforms, remade the design. The most hard part was the radial-gradient (the sun behind my name), because I cannot find any easy tutorial how to write parameters", "repo": "https://github.com/danb1551/danb1551.cz", "demo": "https://danb1551.cz"}]...
|
[{"post_id": 81830, "ts": "202 [{"post_id": 81830, "ts": "2026-10-22T17:38:41Z", "hours": 3.7583, "text": "Completed my website"}, {"post_id": 71273, "ts": "2026-09-20T15:42:15Z", "hours": 1.0625, "text": "Site created"}, {"post_id": 70769, "ts": "2026-09-19T18:46:33Z", "hours": 0.7994, "text": "Using Jinja Templates instead of separated html files"}, {"post_id": 70713, "ts": "2026-09-19T17:14:03Z", "hours": 1.1417, "text": "Recreating page. Also I choosed better template. My current page is not good looking"}]...
|
Title: Website by @danb1551 | Stardance
Devlogs:
Title: Website by @danb1551 | Stardance
Devlogs:
Recreating page. Also I choosed better template. My current page is not good looking
Using Jinja Templates instead of separated html files
Site created
Completed my website
Ships:
I remade my personal site. I added links to my profiles on other platforms, remade the design. The most hard part was the radial-gradient (the sun behind my name), because I cannot find any easy tutorial how to write parameters...
|
1793058804.2050622
|
1793145204.2050622
|
|
63825
|
TTY-WebOS by @qkyubit | Stardance
|
qkyubit
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T15:46:46Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "And here it is, TTY/OS! TTY/OS is a simplistic Web OS designed around CLI applications, but styling it as a stacking window manager. It has four simple applications: A terminal with 13 commands A calculator with basic functions A read-only filesystem A colour app to change the theming of the system. It also has some cool ASCII art in the background. Like it? I know it’s epic. What I found challenging was that although I am pretty experienced with HTML, the logic for the draggable windows was pretty painful, taking up most of the time. I haven’t used mouse pointer logic here before. What are you waiting for? Check it out! Sadly, I did a lot of work in another editor so the time’s been under-reported, but that’s alright since this is a fixed payout.", "repo": "https://github.com/qkyubit/ttyOS/", "demo": "https://qkyubit.github.io/ttyOS/index.html"}]...
|
[{"post_id": 71271, "ts": "202 [{"post_id": 71271, "ts": "2026-09-20T15:40:13Z", "hours": 0.3697, "text": "It’s ready to ship! I’ve polished the code a bit, decided to include the terminal (but strip its functionality down quite a bit), and the main UI now functions properly."}, {"post_id": 71242, "ts": "2026-09-20T14:49:58Z", "hours": 0.8644, "text": "Display! Currently only the calculator works. I am currently working on everything else, and I should be able to ship this by the end of the day."}, {"post_id": 71212, "ts": "2026-09-20T13:40:38Z", "hours": 0.7561, "text": "Github page is ready, code is licensed and the demo is up! After fiddling around with git trying to find out how it works, I managed to get it working, and now I can always easily commit updates while working there."}, {"post_id": 71169, "ts": "2026-09-20T11:58:34Z", "hours": 0.7811, "text": "Finished working on the applet styling. Now it’s time for the main body of the webOS and some scripting to get functions like the clock to work correctly."}, {"post_id": 71130, "ts": "2026-09-20T10:34:34Z", "hours": 0.3025, "text": "Begun working on this project. So far i’ve just defined the main colour variables and started writing the basics such as the topbar and the background."}]...
|
Title: TTY-WebOS by @qkyubit | Stardance
Devlogs: Title: TTY-WebOS by @qkyubit | Stardance
Devlogs:
Begun working on this project. So far i’ve just defined the main colour variables and started writing the basics such as the topbar and the background.
Finished working on the applet styling. Now it’s time for the main body of the webOS and some scripting to get functions like the clock to work correctly.
Github page is ready, code is licensed and the demo is up! After fiddling around with git trying to find out how it works, I managed to get it working, and now I can always easily commit updates while working there.
Display! Currently only the calculator works. I am currently working on everything else, and I should be able to ship this by the end of the day.
It’s ready to ship! I’ve polished the code a bit, decided to include the terminal (but strip its functionality down quite a bit), and the main UI now functions properly.
Ships:
And here it is, TTY/OS! TTY/OS is a simplistic Web OS designed around CLI applications, but styling it as a stacking window manager. It has four simple applications: A terminal with 13 commands A calculator with basic functions A read-only filesystem A colour app to change the theming of the system. It also has some cool ASCII art in the background. Like it? I know it’s epic. What I found challenging was that although I am pretty experienced with HTML, the logic for the draggable windows was pretty painful, taking up most of the time. I haven’t used mouse pointer logic here before. What are you waiting for? Check it out! Sadly, I did a lot of work in another editor so the time’s been under-reported, but that’s alright since this is a fixed payout....
|
1793058833.0661373
|
1793145233.0661373
|
|
57165
|
Mysite by @AlextheGr3at | Stardance
|
AlextheGr3at
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T15:45:39Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made my first real website. It wasn’t that challenging. I have a navbar with links that don’t show underlines, an about me section, and a section with a list of my current projects. I also have a footer with social links, so you can follow me, should you want to :)", "repo": "https://github.com/Longing-Ingernot/Mysite", "demo": "https://longing-ingernot.github.io/Mysite/"}]...
|
[{"post_id": 71268, "ts": "202 [{"post_id": 71268, "ts": "2026-09-20T15:33:58Z", "hours": 0.4431, "text": "Devlog #2 Made the navbar links black with no underline, added a footer with socials so you can follow me :), added two more projects I’m actively working on."}, {"post_id": 71032, "ts": "2026-09-20T07:21:58Z", "hours": 0.8319, "text": "Made the structure and almost all content of the website. Added a navbar"}]...
|
Title: Mysite by @AlextheGr3at | Stardance
Devlog Title: Mysite by @AlextheGr3at | Stardance
Devlogs:
Made the structure and almost all content of the website. Added a navbar
Devlog #2 Made the navbar links black with no underline, added a footer with socials so you can follow me :), added two more projects I’m actively working on.
Ships:
I made my first real website. It wasn’t that challenging. I have a navbar with links that don’t show underlines, an about me section, and a section with a list of my current projects. I also have a footer with social links, so you can follow me, should you want to :)...
|
1793004945.957752
|
1793091345.957752
|