|
28570
|
Natural Selection Simulation by @VasilyKrupenin | Natural Selection Simulation by @VasilyKrupenin | Stardance...
|
VasilyKrupenin
|
1
|
20.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T19:34:25Z", "hours": 20.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made the basics of a natural selection simulation, but it unfortunately is unfinished, and since Stardance is ending pretty soon, I want to publish this so if anyone wants to use my project for something, they are free to do so, since I will be unable to finish it before it ends.", "repo": "https://github.com/vkrpn/Natural-Selection-Simulation", "demo": "https://drive.google.com/drive/folders/1Ek7X9l--7f_XP9Hxx5AYiUP00q131n4a?usp=drive_link"}]...
|
[{"post_id": 73289, "ts": "202 [{"post_id": 73289, "ts": "2026-09-24T19:27:07Z", "hours": 1.3636, "text": "Stardance is about to end, so I might as well publish this to get my 20+ hours worth of stardust. I may finish this later, but it will probably won’t be finished by the time Stardance ends. Do whatever you want with my project. It needs a screenshot, so here’s a cool picture I took:"}, {"post_id": 43552, "ts": "2026-08-08T21:48:17Z", "hours": 2.4575, "text": "It’s been a while since I last posted a devlog because I was hoping to finish the project, but I am farther away than I thought, and I also could not work on any Stardance projects for 2 weeks, unfortunately. It’s been so long since I’ve worked that I forgot what I’ve made; I think I made size, color, and a few tree variants."}, {"post_id": 27445, "ts": "2026-07-13T00:41:49Z", "hours": 2.8772, "text": "I’ve been a bit lazy, but progress on procedural generation is coming along well. I finished it and tweaked it until I got a result I liked (there was more mathematics that I had to do, like I had to use the pythagorean theorem to figure out the distance away from the center and subtract that to ensure that edges are ocean). The way it works is by first creating ocean, beach, fertile land, and mountains from noise, then I use moisture and temperature to determine the biome. Temperature is calculated by getting the latitude, subtracting the elevation (to make higher areas naturally colder), and then a bit of noise is added on top of all of that. Moisture works similarly, minus the latitude part. I also started working on vegetation; see those savanna trees? But I do have to create plants for each biome (or the creatures will have nothing to eat) which I am too lazy to do (as you can see I just made a savanna tree), I do not know what I’ll do for that. There’s so much art I have to make; I’ll have to make the animals and all of the plants. I’m planning to code a bunch of traits gained from animal appearance as soon as I put in the work to create the animals, which will be really difficult to do. I’m finally moving away from MSFT Paint though!"}, {"post_id": 25459, "ts": "2026-07-09T18:57:48Z", "hours": 2.0503, "text": "I don’t have much to display at the moment, I’ve been optimizing the code (for example, I used for loops to repeat the same process with different variables used for graphing instead of having separate code for each variable to significantly shorten the code) and I’ve started working on biomes. Since it has been a while since I have last posted a devlog, I’ll post one, and since I have to attach a screenshot or video, here’s an demonstration of natural selection in my game. You can clearly see the memory trait rose a lot and certain traits balanced out at a certain level (the images are a bit low quality but the values tracked are speed, sight, metabolism, mutation, memory, and population)."}, {"post_id": 23670, "ts": "2026-07-06T19:40:33Z", "hours": 1.7361, "text": "I did a bit more work on the windows. Now you can select which stats to track (only sight and speed for now, but I’ll fix that) and you can track up to 2 stats (but it doesn’t take long to change how many stats you can track), and you can change the colors. In the video, I am tracking the average speed and sight (note that the graph is measuring not the value, but the change in value; sight is twice as large as speed by default). I also demonstrated some of the features of the windows in the video which I forgot to show in the last one."}, {"post_id": 23131, "ts": "2026-07-05T22:03:50Z", "hours": 2.2103, "text": "I haven’t posted much because there wasn’t a lot to display or show that I’ve gotten something to work. Anyway, I coded a mutation trait which modifies how much a child’s traits can change (I noticed something pretty cool; when setting the mutation value super high like 1, it almost always drops back down to around 0.3). Here’s how mutation works: you get a child’s genes by calculating the average of the 2 parents genes plus that same number multiplied by mutation value. With a mutation of value of 1, the highest amount genes can change is double the original value. And most noticeably, I started working on UI; I started making charts that display certain traits. It’s nowhere near done, but it is coming along quite nicely. In the video attached, a chart is tracking the average speed value of the population. I didn’t show in the video, but you can drag the windows around, but that’s about it; I can only manually set the tracked value in code and drag windows around, they don’t have much features. A lot of the work I can’t really show; I was working on tracking, originally it was mostly for debugging, but now I can actually display those values with the graphs I am coding. Sorry that the video’s a bit long, Haaland scored a goal against Brazil and I forgot I was recording; I had to see the replay. He also scored a second one while I was typing this devlog. Go Norway (I’d root for Russia but they got suspended)!"}, {"post_id": 22335, "ts": "2026-07-04T19:12:32Z", "hours": 0.4192, "text": "I didn’t do much coding, and the game still needs a lot of work, but I have reached a great milestone! The game naturally selects traits! I added some statistics and a new memory trait because the creatures could just set off on a journey and remember the exact position down to the decimal places of the last food and water it saw, so I fixed that and added a timer which wipes the memory of the food/water position once it times out. The default traits are: 75 speed, 150 sight, 1 metabolism, and 7 memory. The average traits after running the simulation for some time: 65 speed, 125 sight, similar metabolism, and 10 memory. This result is pretty consistent with the exact plant and water setup in the image, but if I change it to a sparser environment, I saw speed go up by 10, sight go up by 5, metabolism stay the same, and surprisingly, despite being a trait with no negatives implemented yet, memory go down by 0.25. I guess memory doesn’t matter if you are fast enough and see well."}, {"post_id": 22200, "ts": "2026-07-04T15:37:17Z", "hours": 0.7967, "text": "I’m a bit stuck. I don’t really like the gene system so I decided to code traits as numbers, but that needs a lot of balance and tweaking to properly implement, and all of this work is a bit overwhelming. I might take a break from this project for a few days."}, {"post_id": 21092, "ts": "2026-07-02T21:47:31Z", "hours": 0.7008, "text": "I did a LOT of debugging. Fixed the last bug and numerous more that caused things like food not giving any hunger, genes getting incorrect effects, and more. I also changed how metabolism works and nerfed it. Now, Mm = 0, mm = -1, and MM = 1. These values are “intensified” by the I/i alleles. These work the same way as metabolism worked before, but now the values can be negative leading to efficient but low capacity creatures. I had to nerf it because capacity was becoming negative and creatures were getting infinite food."}, {"post_id": 20930, "ts": "2026-07-02T17:37:15Z", "hours": 1.1336, "text": "I restored my work and added a new trait; metabolism. mm is default metabolism; 10 hunger/thirst capacity and normal depletion. Mm is higher metabolism with 12-15 capacity and increased depletion. MM is highest metabolism with 13-22.5 capacity and even more increased depletion. I also made growth smooth instead of how previously juveniles instantly became adults. There’s also a strange bug which I’m trying to fix. Sometimes, the metabolism genotype becomes part of the other genotype. “Qq” “Vv” “Mm” is default, but after a few generations, you start seeing things like “Qq” “vm” “Mm” and eventually, things like “mm” “MM” “Mm”"}, {"post_id": 20449, "ts": "2026-07-02T01:28:54Z", "hours": 0.2603, "text": "All of my progress since my last devlog is lost :( I’ll have to recode all of it, but it isn’t that much work. Probably happened because I set up Git incorrectly or something."}, {"post_id": 19963, "ts": "2026-07-01T12:53:28Z", "hours": 1.1578, "text": "I coded limited resources and juvenile creatures. When creatures spawn, they have to wait 15 seconds until they can mate (so they don’t start mating right out of the womb like last time), and now when food is eaten, it regrows after 7 seconds. I’ll probably add more genes next time, or maybe even expand the map and add new biomes and plants (which would be really easy because I can just drag the food scene onto any plant and the plant now has fruits that grow and regrow)."}, {"post_id": 19464, "ts": "2026-06-30T19:55:19Z", "hours": 1.9164, "text": "I added genetics and reproduction! You can see in the output that each new organism has 2 genotypes, one for Q/q (short for quickness, didn’t want to use S because it’s a common letter and I might need it later idk I forgot), and one for V/v (short for vision) alleles (probably using all the wrong vocabulary). These genes directly affect speed and vision (with some slight randomness) and speed and vision also affects hunger and thirst depletion, meaning that being fast and seeing well has a tradeoff. I really need to code limited resources and I really need to code juvenile creatures (they’re mating at birth 😭😭😭). Maybe I could even make something like eggs? The output got cut off in the image. Here’s what it’s supposed to say: Genetics: [“Qq”,“vv”] Speed: 92.3979906001719 Sight: 150 Genetics: [“qQ”,vv”] Speed: 83.9082190561058 Sight: 150 Genetics: [“QQ”,“vV”] Speed: 142.633334008872 Sight: 171.81141852858 Genetics: [“QQ”,“vv”] Speed: 110.227173121233 Sight: 150 …"}, {"post_id": 18864, "ts": "2026-06-30T02:01:05Z", "hours": 1.2911, "text": "Finished coding a lil guy with some slight (heavy emphasis on slight) survival instincts. You can watch his hunger and thirst go down in the Godot output and watch him race towards food and water (oh wait forgot to add a hungry state he just runs after water, oh well, I’ll just add that next dev log). I just started working on this, so basically everything’s a prototype. And I also had the bright idea of making prototype assets in MS Paint, that’s why the art looks so beautiful and astounding. I have a lot of ideas for the future; I’ll probably code genes and reproduction next, but I also have a ton of ideas for the future, like Perlin noise generated terrain (like in my last project), adding natural selection for plants, multiple biomes, several species, etc… Who knows how this project will turn out? Anyways, it’s 10 PM and I have spend over an hour coding, so I should definitely go to sleep. Or should I? I reallyyyy want to code genes and reproduction."}]...
|
Title: Natural Selection Simulation by @VasilyKrup Title: Natural Selection Simulation by @VasilyKrupenin | Stardance
Devlogs:
Finished coding a lil guy with some slight (heavy emphasis on slight) survival instincts. You can watch his hunger and thirst go down in the Godot output and watch him race towards food and water (oh wait forgot to add a hungry state he just runs after water, oh well, I’ll just add that next dev log). I just started working on this, so basically everything’s a prototype. And I also had the bright idea of making prototype assets in MS Paint, that’s why the art looks so beautiful and astounding. I have a lot of ideas for the future; I’ll probably code genes and reproduction next, but I also have a ton of ideas for the future, like Perlin noise generated terrain (like in my last project), adding natural selection for plants, multiple biomes, several species, etc… Who knows how this project will turn out? Anyways, it’s 10 PM and I have spend over an hour coding, so I should definitely go to sleep. Or should I? I reallyyyy want to code genes and reproduction.
I added genetics and reproduction! You can see in the output that each new organism has 2 genotypes, one for Q/q (short for quickness, didn’t want to use S because it’s a common letter and I might need it later idk I forgot), and one for V/v (short for vision) alleles (probably using all the wrong vocabulary). These genes directly affect speed and vision (with some slight randomness) and speed and vision also affects hunger and thirst depletion, meaning that being fast and seeing well has a tradeoff. I really need to code limited resources and I really need to code juvenile creatures (they’re mating at birth 😭😭😭). Maybe I could even make something like eggs? The output got cut off in the image. Here’s what it’s supposed to say: Genetics: [“Qq”,“vv”] Speed: 92.3979906001719 Sight: 150 Genetics: [“qQ”,vv”] Speed: 83.9082190561058 Sight: 150 Genetics: [“QQ”,“vV”] Speed: 142.633334008872 Sight: 171.81141852858 Genetics: [“QQ”,“vv”] Speed: 110.227173121233 Sight: 150 …
I coded limited resources and juvenile creatures. When creatures spawn, they have to wait 15 seconds until they can mate (so they don’t start mating right out of the womb like last time), and now when food is eaten, it regrows after 7 seconds. I’ll probably add more genes next time, or maybe even expand the map and add new biomes and plants (which would be really easy because I can just drag the food scene onto any plant and the plant now has fruits that grow and regrow).
All of my progress since my last devlog is lost :( I’ll have to recode all of it, but it isn’t that much work. Probably happened because I set up Git incorrectly or something.
I restored my work and added a new trait; metabolism. mm is default metabolism; 10 hunger/thirst capacity and normal depletion. Mm is higher metabolism with 12-15 capacity and increased depletion. MM is highest metabolism with 13-22.5 capacity and even more increased depletion. I also made growth smooth instead of how previously juveniles instantly became adults. There’s also a strange bug which I’m trying to fix. Sometimes, the metabolism genotype becomes part of the other genotype. “Qq” “Vv” “Mm” is default, but after a few generations, you start seeing things like “Qq” “vm” “Mm” and eventually, things like “mm” “MM” “Mm”
I did a LOT of debugging. Fixed the last bug and numerous more that caused things like food not giving any hunger, genes getting incorrect effects, and more. I also changed how metabolism works and nerfed it. Now, Mm = 0, mm = -1, and MM = 1. These values are “intensified” by the I/i alleles. These work the same way as metabolism worked before, but now the values can be negative leading to efficient but low capacity creatures. I had to nerf it because capacity was becoming negative and creatures were getting infinite food.
I’m a bit stuck. I don’t really like the gene system so I decided to code traits as numbers, but that needs a lot of balance and tweaking to properly implement, and all of this work is a bit overwhelming. I might take a break from this project for a few days.
I didn’t do much coding, and the game still needs a lot of work, but I have reached a great milestone! The game naturally selects traits! I added some statistics and a new memory trait because the creatures could just set off on a journey and remember the exact position down to the decimal places of the last food and water it saw, so I fixed that and added a timer which wipes the memory of the food/water position once it times out. The default traits are: 75 speed, 150 sight, 1 metabolism, and 7 memory. The average traits after running the simulation for some time: 65 speed, 125 sight, similar metabolism, and 10 memory. This result is pretty consistent with the exact plant and water setup in the image, but if I change it to a sparser environment, I saw speed go up by 10, sight go up by 5, metabolism stay the same, and surprisingly, despite being a trait with no negatives implemented yet, memory go down by 0.25. I guess memory doesn’t matter if you are fast enough and see well.
I haven’t posted much because there wasn’t a lot to display or show that I’ve gotten something to work. Anyway, I coded a mutation trait which modifies how much a child’s traits can change (I noticed something pretty cool; when setting the mutation value super high like 1, it almost always drops back down to around 0.3). Here’s how mutation works: you get a child’s genes by calculating the average of the 2 parents genes plus that same number multiplied by mutation value. With a mutation of value of 1, the highest amount genes can change is double the original value. And most noticeably, I started working on UI; I started making charts that display certain traits. It’s nowhere near done, but it is coming along quite nicely. In the video attached, a chart is tracking the average speed value of the population. I didn’t show in the video, but you can drag the windows around, but that’s about it; I can only manually set the tracked value in code and drag windows around, they don’t have much features. A lot of the work I can’t really show; I was working on tracking, originally it was mostly for debugging, but now I can actually display those values with the graphs I am coding. Sorry that the video’s a bit long, Haaland scored a goal against Brazil and I forgot I was recording; I had to see the replay. He also scored a second one while I was typing this devlog. Go Norway (I’d root for Russia but they got suspended)!
I did a bit more work on the windows. Now you can select which stats to track (only sight and speed for now, but I’ll fix that) and you can track up to 2 stats (but it doesn’t take long to change how many stats you can track), and you can change the colors. In the video, I am tracking the average speed and sight (note that the graph is measuring not the value, but the change in value; sight is twice as large as speed by default). I also demonstrated some of the features of the windows in the video which I forgot to show in the last one.
I don’t have much to display at the moment, I’ve been optimizing the code (for example, I used for loops to repeat the same process with different variables used for graphing instead of having separate code for each variable to significantly shorten the code) and I’ve started working on biomes. Since it has been a while since I have last posted a devlog, I’ll post one, and since I have to attach a screenshot or video, here’s an demonstration of natural selection in my game. You can clearly see the memory trait rose a lot and certain traits balanced out at a certain level (the images are a bit low quality but the values tracked are speed, sight, metabolism, mutation, memory, and population).
I’ve been a bit lazy, but progress on procedural generation is coming along well. I finished it and tweaked it until I got a result I liked (there was more mathematics that I had to do, like I had to use the pythagorean theorem to figure out the distance away from the center and subtract that to ensure that edges are ocean). The way it works is by first creating ocean, beach, fertile land, and mountains from noise, then I use moisture and temperature to determine the biome. Temperature is calculated by getting the latitude, subtracting the elevation (to make higher areas naturally colder), and then a bit of noise is added on top of all of that. Moisture works similarly, minus the latitude part. I also started working on vegetation; see those savanna trees? But I do have to create plants for each biome (or the creatures will have nothing to eat) which I am too lazy to do (as you can see I just made a savanna tree), I do not know what I’ll do for that. There’s so much art I have to make; I’ll have to make the animals and all of the plants. I’m planning to code a bunch of traits gained from animal appearance as soon as I put in the work to create the animals, which will be really difficult to do. I’m finally moving away from MSFT Paint though!
It’s been a while since I last posted a devlog because I was hoping to finish the project, but I am farther away than I thought, and I also could not work on any Stardance projects for 2 weeks, unfortunately. It’s been so long since I’ve worked that I forgot what I’ve made; I think I made size, color, and a few tree variants.
Stardance is about to end, so I might as well publish this to get my 20+ hours worth of stardust. I may finish this later, but it will probably won’t be finished by the time Stardance ends. Do whatever you want with my project. It needs a screenshot, so here’s a cool picture I took:
Ships:
I made the basics of a natural selection simulation, but it unfortunately is unfinished, and since Stardance is ending pretty soon, I want to publish this so if anyone wants to use my project for something, they are free to do so, since I will be unable to finish it before it ends....
|
1792853273.7602508
|
1792939673.7602508
|
|
47889
|
sorting algs by @Lumethra | Stardance
|
Lumethra
|
1
|
16.0
|
212
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T19:32:31Z", "hours": 16.0, "multiplier": 13.53, "payout": 212, "blessing": "neutral", "text": "A 3d sorting algorithm visualizer with NextJS and ThreeJS. Also its made with luve and happiness.", "repo": "https://github.com/Lumethra/sorting-algs", "demo": "https://lumethra-sorting-algs.vercel.app/"}]...
|
[{"post_id": 73291, "ts": "202 [{"post_id": 73291, "ts": "2026-09-24T19:30:47Z", "hours": 0.4911, "text": "I wrote my readme in this session, so nothing really to say. It was just typing typing typing and finishing this beautiful readme to be able to submit this project."}, {"post_id": 73279, "ts": "2026-09-24T18:57:15Z", "hours": 0.4069, "text": "Implemented pause logic. I implemented pause logic and added an indicator, which shows, which sorting algorithm is currently active. The pause logic was quite painful, cause it just didnt want to stop. Neither with break, nor with return. After a long long long trouble shooting session, I found out, that I forgot .current and it just wont detect correctly, what a stupid bug to troubleshoot 20 min for. Also I fixed an edge case in the demo vid xD"}, {"post_id": 73266, "ts": "2026-09-24T18:19:33Z", "hours": 2.58, "text": "FINALLYYYY Today was the final coding session. I finally got the UI right and am okay with it. Its not the best, but its acceptable. I decided to only use icons, to keep it clean, but I ran into the problem, that the icons arent clear enough to showcase the specific sorting algorithm. So I decided on making a tooltip. But the build in HTML tooltip is too ugly and the delay is annoying. I did some research and found a W3Schools tutorial, they are the goat ( here it is ). I didnt expect front end being so time intensive, but I did need to adjust every value so it looks good, which is very hard to do :(. Ah, I also fixed the bug that when there is the minimal amount of pillars, it will be weird while shuffling (that wasnt proper english). Also the icons changes depending if we are shuffling or sorting and the disables and reinables, which is cool. Uhh, I remembered sth, I need to implement canceling while sorting. Also the vid is one fix old, i did fix the typo in the sorting alg."}, {"post_id": 72326, "ts": "2026-09-22T17:49:27Z", "hours": 1.4453, "text": "Thats enough, Ima do CSS tomorrow. Today I added a slider style and 2 other sliders for the shuffling and sorting speed. Then I hid those 2 and the remove and adding pillar buttons. Also added some CSS for flex, justify content, space between, to seperate the drop down, which I added too. I tried to add a scrolling drop down thing, but failed, uhh, I also adjusted the pillar speed and camera angle. Also I found out, that I can call functions from an array, so I can store a function in an array and then call it like that, thats weird, but also huge. Dont wanna write too much today, cause I still have stuff to do. Ah, also added prevention of shuffling while sorting."}, {"post_id": 71209, "ts": "2026-09-20T13:27:14Z", "hours": 1.2819, "text": "Slider!! Today I added a slider that controls the adding and removing of pillars. I had some minor problems. (No, they were huge, but I feel better saying that they were minor ). First of all, I needed to figure out how to set default values. Normally its just value=””, but this doesnt work for a input type range. After some research I found out that its simply defaultValue, I feel dumb. Then I tried to add/remove pillars with useEffect and monitor the changes of the slider. This worked, but also didnt. I needed to manually update the pillars. It didnt do it automatically. Then my brain suggested something genius. Using onChange. But now I need to do an extra function for it. I thought, maybe I use a while loop once. While the number array is smaller run add function and while its bigger, the remove function. This was uhh, not that good, because it somehow resulted into an infinite while loop, because js is asynchronous. I also tried with a for loop. This threw the error, that I set the 2 useState too often. After some experimenting I ended up with my current solution. I also added 2 useState variables for the sorting delay and shuffling delay. I am still searching for a great mathematical, anti-proportional, linear function to adjust it corresponding to the pillars count. Ahh and I also updated the camera adjusting logic a bit."}, {"post_id": 70217, "ts": "2026-09-18T18:42:46Z", "hours": 1.0872, "text": "HOLY WAS THIS A STRUGGLE !! In this session I implemented adding and removing numbers for a slider in the future (hopefully tomorrow). THIS WAS A PAIN. Especially the camera handling. The very very basic adding and removing function was quite easy, since its only adding numbers or splicing numbers from the array (stack overflow my goat). The camera thing was quite hard though. When I add enough numbers it could make the pillars taller than the viewheight, making them sticking “off screen”. The fix was zooming out. But the fix on stack overflow needed to let it be a JSX element, which somehow didnt work. Finding the fix was one problem. The other problem is, that after finding the fix, it still didnt work and the camera “fell” down. After a long debugging session with various console.logs, I finally found the problem and it was one of the stupid ones. I used z, where it should have been y, thats dumb, but eyy, here we go. There were also a few other bugs, like having an infinite while loop when only having one pillar and shuffling. This was fixed by making the minimum number 2. The other bug was, weird camera behaviors happen, when reducing the number while its shuffled. Fixing it with an instant sort before reducing the number of pillars was my approach. Ya, that was about it. I am done for today."}, {"post_id": 70112, "ts": "2026-09-18T14:17:37Z", "hours": 1.1447, "text": "Better Shuffling logic!!! Before the refinement of the shuffling logic today I just simply randomized the numbers in the array, so that there are new numbers. That introduced one problem, actually two. Numbers could dupe!! I tried to fix it while using numbers with one decimal. The other problem was I could not add an animation anywhere. This is why I decided to make a brand new shuffling logic today. I first tried to fix the duping problem, by checking if this number already exists. This took a while, because I need to figure out how to only watch an array to a specific point, to ignore the upcoming numbers. This resulted in a growing or shrinking animation, which wasnt what I wanted. Then I thought, maybe I can shuffle in another way. Not by changing the value, rather by swapping numbers randomly. Just like in a deck of cards. So I loop through each digit and randomly choose a number in the whole array and then swapping those. This ensures every place got changed. Now there was another problem. It sometimes changed with it self causing it not to do anything. This was fixed by adding a while loop which generates new positions if the position is the own position. While writing this devlog I also thought of another problem. When the total count of numbers is very low, this shuffling method might not shuffle it enough, so I am looping it 2 times, if there are less then 10 numbers in it. Ya, thats about it. Now lets get to the slider which increases the blocks."}, {"post_id": 67381, "ts": "2026-09-13T14:07:06Z", "hours": 1.6225, "text": "Finally something after a long time. I was on vacation during that time, so I needed to use some time to understand what I have done before that. Then I implemented another sorting algorithm!! Selection Sort!! If you take a look inside my commits, you can see it being committed. After implementing selection sort I took a small break and didnt devlog, cause it didnt even took that long. After the break I decided to add a little highlighting animation, that changes the color of the pillars, that are being swapped. That took waay longer that expected, but was the easiest thing to do. I just had to save the 2 values being swapped and somehow pass it inside and get the colors changed. After the highlighting, I decided its time for another sorting alg. The Insertion Sort. That somehow took longer that selection sort. Due to it being almost the exact opposite of bubble sort, I always fell back to it. While researching for insertion sort, I found this great website and quite liked its finishing animation. I also felt that the selecting animation is kinda off for insertion sort. It shouldnt be 2 pillars that are selected. It should be 3 or 1, since one pillar is inserted between 2 other ones and not 2 pillars being swapped. So I made a highlighting version with only one pillar being highlighted and created an if statement of doom inside the meshStandartMaterial. I thought this version was also better for bubble sort than the selection one and switched it too. Ya, that was all of it, I think, Have a great day though :)"}, {"post_id": 48929, "ts": "2026-08-17T14:21:47Z", "hours": 1.9594, "text": "AHHHHHHHHHHHHHHHHHHHHHH Sorting algorithm was made today. I decided on the most basic bubble sort. It is basically just 2 nested for-loops. This wikipedia article ( https://en.wikipedia.org/wiki/Bubble_sort ) has a great code example for it. It was relative easy. But the hard part was to get the animation going. The second part of the vid shows how it was without the fix for the animation. Finding out what the error was, was the first major problem. Fixing it was also hard, because I needed to save the target position after the box was created. This doesnt work, because you cannot call things after a return. Then after a good half hour of struggling and no progress, I asked my father for help. He is a full time developer aaand I hoped, that we could fix this together. He did gave some good calls, but the coding is still done by myself. After some together struggling, that lasted around 30 to 40 min, he proposed something genius. Save a version of the array of numbers, before every sorting step. That meant we need to compare the 2 arrays to get the difference and how the numbers got moved. I then said we could use some complicated for loops and then comparing stuff. He smiled and let me do. After some programming it was finally done and worked. But it wasnt optimized at all and was a bit laggy. Then he couldnt hold on anymore, laughed and told me that there is a dedicated js function just for that. I almost crashed out . Ya, that was todays session. I only implemented the dedicated js function instead of that. Ahh and before asking my father I also found out that js async is weird and that we need to use useEffect, kinda an event listener to see when the useState value changes. Ya, now that was it. See u later or tmrw."}, {"post_id": 48190, "ts": "2026-08-16T14:16:24Z", "hours": 1.0175, "text": "Shuffle mechanism Today was very successful day. The two major breakthroughs are creating the boxes dynamically and shuffle the height by math.random. I am happy that I remembered, that I could use useState to make an array and use the Array.prototype.map() function to simultaneously create the different boxes. And I can change the order of the boxes with changing the order of the components in the array, sooooo, that should be quite easy to archive. The random shuffle thingi was also quite successful. I just Math.random’ed some value and floor it to 2 decimals. Then I do that for every place of the numbers array and set it as new numbers array. This will update the numbers array, because of useState and let React-Three-Fiber rerender the boxes, resulting in a shuffling. The sorting will need an async function though, or else it will be instant sorting, which isnt the goal of this sorting thing. Enough yap, back to coding, eventually, maybe."}, {"post_id": 47505, "ts": "2026-08-15T13:45:14Z", "hours": 1.2922, "text": "After messing around abit and finding out that it is possible to have multiple meshes, I finally started with the actual project and made a Box func. While making it I decided on doing it with an Interface to be able to learn that (the whole point of this proj was to learn ThreeJS and NextJS). This Box func can be reused and the properties of this box can also be parsed inside. Soo every Box is the same and makes animating easier. I also added a simple moving animation. Then the quest was to level the boxes on the bottom. After a whole 5 min of struggling, I found a random post saying I could do scale / 2, which also worked. The moving the box was the hard part, because NextJS requires me to use useState, or else it wont get updated. This took me very long, very very very long to get right. The moving seems abit laggy in the vid, but in real life its smooth, i dunno why, but ya. The last part, was centering this whole thing, because the camera always points to [0, 0, 0] which is strange, but whatever, so i needed to move the boxes collectively somewhere else. So I tried alot of stuff, but finally found out that groups have props too, so I can group them and move them to the left and down. This was great !! Later I need to find out how to do this automatically, but thats not present-me problem, its a future-me problem."}, {"post_id": 47096, "ts": "2026-08-14T18:50:47Z", "hours": 1.3286, "text": "First devlog My friend @Leon gave me this idea to work with ThreeJS in NextJS, so I can get familiar with both at the same time. And I said, fine whatever. I had the idea to do a sorting algorithm showcaser with pillars of different heights. And code different sorting methods to sort these pillars. Soo I created a Next instance like my personal site aaaand messed up. So I had to delete it and install again, WITHOUT TailwindCSS. Finally having a working NextJS instance I installed ThreeJS, but then I ran into the problem that ThreeJS didnt like pnpm, soo I reinstalled the whole shit with npm, which obviously didnt work. So I debugged the whole shit and every reddit post and stackoverflow post said to reinstall it again, so the installer cleanly installs the JSX module that was missing, which it didnt. So I decided to just paste the whole error message into google and there it was. The holy stackoverflow post that gave me a command to reinstall the dependencies and advised me to reload my vscode window to prevent cache. THIS WORKED!!! My next task was to read and follow the React Three Fiber docs, which is threejs but in better for react, so also for nextjs. I followed it (which was very hard, since its written unclearly, but I think when you know the normal threejs it should be fine, which I obviously am not familiar with) and after some time got an overall idea how this thing works. Then I found a task in this doc and it is to create a spinning cube. I took it seriously and made it todays goal. And here we are. To be fair, it was okay to finish, since there was already a sample code written in vite or whatever it was. I just needed to rewrite that for my nextjs instance. Ya that was todays progress. I think when I got the motivation to continue later, it will be waay easier to do, since I know the basics now. Holy yap, bye, see u later, maybe, well, bye"}]...
|
Title: sorting algs by @Lumethra | Stardance
Devl Title: sorting algs by @Lumethra | Stardance
Devlogs:
First devlog My friend @Leon gave me this idea to work with ThreeJS in NextJS, so I can get familiar with both at the same time. And I said, fine whatever. I had the idea to do a sorting algorithm showcaser with pillars of different heights. And code different sorting methods to sort these pillars. Soo I created a Next instance like my personal site aaaand messed up. So I had to delete it and install again, WITHOUT TailwindCSS. Finally having a working NextJS instance I installed ThreeJS, but then I ran into the problem that ThreeJS didnt like pnpm, soo I reinstalled the whole shit with npm, which obviously didnt work. So I debugged the whole shit and every reddit post and stackoverflow post said to reinstall it again, so the installer cleanly installs the JSX module that was missing, which it didnt. So I decided to just paste the whole error message into google and there it was. The holy stackoverflow post that gave me a command to reinstall the dependencies and advised me to reload my vscode window to prevent cache. THIS WORKED!!! My next task was to read and follow the React Three Fiber docs, which is threejs but in better for react, so also for nextjs. I followed it (which was very hard, since its written unclearly, but I think when you know the normal threejs it should be fine, which I obviously am not familiar with) and after some time got an overall idea how this thing works. Then I found a task in this doc and it is to create a spinning cube. I took it seriously and made it todays goal. And here we are. To be fair, it was okay to finish, since there was already a sample code written in vite or whatever it was. I just needed to rewrite that for my nextjs instance. Ya that was todays progress. I think when I got the motivation to continue later, it will be waay easier to do, since I know the basics now. Holy yap, bye, see u later, maybe, well, bye
After messing around abit and finding out that it is possible to have multiple meshes, I finally started with the actual project and made a Box func. While making it I decided on doing it with an Interface to be able to learn that (the whole point of this proj was to learn ThreeJS and NextJS). This Box func can be reused and the properties of this box can also be parsed inside. Soo every Box is the same and makes animating easier. I also added a simple moving animation. Then the quest was to level the boxes on the bottom. After a whole 5 min of struggling, I found a random post saying I could do scale / 2, which also worked. The moving the box was the hard part, because NextJS requires me to use useState, or else it wont get updated. This took me very long, very very very long to get right. The moving seems abit laggy in the vid, but in real life its smooth, i dunno why, but ya. The last part, was centering this whole thing, because the camera always points to [0, 0, 0] which is strange, but whatever, so i needed to move the boxes collectively somewhere else. So I tried alot of stuff, but finally found out that groups have props too, so I can group them and move them to the left and down. This was great !! Later I need to find out how to do this automatically, but thats not present-me problem, its a future-me problem.
Shuffle mechanism Today was very successful day. The two major breakthroughs are creating the boxes dynamically and shuffle the height by math.random. I am happy that I remembered, that I could use useState to make an array and use the Array.prototype.map() function to simultaneously create the different boxes. And I can change the order of the boxes with changing the order of the components in the array, sooooo, that should be quite easy to archive. The random shuffle thingi was also quite successful. I just Math.random’ed some value and floor it to 2 decimals. Then I do that for every place of the numbers array and set it as new numbers array. This will update the numbers array, because of useState and let React-Three-Fiber rerender the boxes, resulting in a shuffling. The sorting will need an async function though, or else it will be instant sorting, which isnt the goal of this sorting thing. Enough yap, back to coding, eventually, maybe.
AHHHHHHHHHHHHHHHHHHHHHH Sorting algorithm was made today. I decided on the most basic bubble sort. It is basically just 2 nested for-loops. This wikipedia article ( https://en.wikipedia.org/wiki/Bubble_sort ) has a great code example for it. It was relative easy. But the hard part was to get the animation going. The second part of the vid shows how it was without the fix for the animation. Finding out what the error was, was the first major problem. Fixing it was also hard, because I needed to save the target position after the box was created. This doesnt work, because you cannot call things after a return. Then after a good half hour of struggling and no progress, I asked my father for help. He is a full time developer aaand I hoped, that we could fix this together. He did gave some good calls, but the coding is still done by myself. After some together struggling, that lasted around 30 to 40 min, he proposed something genius. Save a version of the array of numbers, before every sorting step. That meant we need to compare the 2 arrays to get the difference and how the numbers got moved. I then said we could use some complicated for loops and then comparing stuff. He smiled and let me do. After some programming it was finally done and worked. But it wasnt optimized at all and was a bit laggy. Then he couldnt hold on anymore, laughed and told me that there is a dedicated js function just for that. I almost crashed out . Ya, that was todays session. I only implemented the dedicated js function instead of that. Ahh and before asking my father I also found out that js async is weird and that we need to use useEffect, kinda an event listener to see when the useState value changes. Ya, now that was it. See u later or tmrw.
Finally something after a long time. I was on vacation during that time, so I needed to use some time to understand what I have done before that. Then I implemented another sorting algorithm!! Selection Sort!! If you take a look inside my commits, you can see it being committed. After implementing selection sort I took a small break and didnt devlog, cause it didnt even took that long. After the break I decided to add a little highlighting animation, that changes the color of the pillars, that are being swapped. That took waay longer that expected, but was the easiest thing to do. I just had to save the 2 values being swapped and somehow pass it inside and get the colors changed. After the highlighting, I decided its time for another sorting alg. The Insertion Sort. That somehow took longer that selection sort. Due to it being almost the exact opposite of bubble sort, I always fell back to it. While researching for insertion sort, I found this great website and quite liked its finishing animation. I also felt that the selecting animation is kinda off for insertion sort. It shouldnt be 2 pillars that are selected. It should be 3 or 1, since one pillar is inserted between 2 other ones and not 2 pillars being swapped. So I made a highlighting version with only one pillar being highlighted and created an if statement of doom inside the meshStandartMaterial. I thought this version was also better for bubble sort than the selection one and switched it too. Ya, that was all of it, I think, Have a great day though :)
Better Shuffling logic!!! Before the refinement of the shuffling logic today I just simply randomized the numbers in the array, so that there are new numbers. That introduced one problem, actually two. Numbers could dupe!! I tried to fix it while using numbers with one decimal. The other problem was I could not add an animation anywhere. This is why I decided to make a brand new shuffling logic today. I first tried to fix the duping problem, by checking if this number already exists. This took a while, because I need to figure out how to only watch an array to a specific point, to ignore the upcoming numbers. This resulted in a growing or shrinking animation, which wasnt what I wanted. Then I thought, maybe I can shuffle in another way. Not by changing the value, rather by swapping numbers randomly. Just like in a deck of cards. So I loop through each digit and randomly choose a number in the whole array and then swapping those. This ensures every place got changed. Now there was another problem. It sometimes changed with it self causing it not to do anything. This was fixed by adding a while loop which generates new positions if the position is the own position. While writing this devlog I also thought of another problem. When the total count of numbers is very low, this shuffling method might not shuffle it enough, so I am looping it 2 times, if there are less then 10 numbers in it. Ya, thats about it. Now lets get to the slider which increases the blocks.
HOLY WAS THIS A STRUGGLE !! In this session I implemented adding and removing numbers for a slider in the future (hopefully tomorrow). THIS WAS A PAIN. Especially the camera handling. The very very basic adding and removing function was quite easy, since its only adding numbers or splicing numbers from the array (stack overflow my goat). The camera thing was quite hard though. When I add enough numbers it could make the pillars taller than the viewheight, making them sticking “off screen”. The fix was zooming out. But the fix on stack overflow needed to let it be a JSX element, which somehow didnt work. Finding the fix was one problem. The other problem is, that after finding the fix, it still didnt work and the camera “fell” down. After a long debugging session with various console.logs, I finally found the problem and it was one of the stupid ones. I used z, where it should have been y, thats dumb, but eyy, here we go. There were also a few other bugs, like having an infinite while loop when only having one pillar and shuffling. This was fixed by making the minimum number 2. The other bug was, weird camera behaviors happen, when reducing the number while its shuffled. Fixing it with an instant sort before reducing the number of pillars was my approach. Ya, that was about it. I am done for today.
Slider!! Today I added a slider that controls the adding and removing of pillars. I had some minor problems. (No, they were huge, but I feel better saying that they were minor ). First of all, I needed to figure out how to set default values. Normally its just value=””, but this doesnt work for a input type range. After some research I found out that its simply defaultValue, I feel dumb. Then I tried to add/remove pillars with useEffect and monitor the changes of the slider. This worked, but also didnt. I needed to manually update the pillars. It didnt do it automatically. Then my brain suggested something genius. Using onChange. But now I need to do an extra function for it. I thought, maybe I use a while loop once. While the number array is smaller run add function and while its bigger, the remove function. This was uhh, not that good, because it somehow resulted into an infinite while loop, because js is asynchronous. I also tried with a for loop. This threw the error, that I set the 2 useState too often. After some experimenting I ended up with my current solution. I also added 2 useState variables for the sorting delay and shuffling delay. I am still searching for a great mathematical, anti-proportional, linear function to adjust it corresponding to the pillars count. Ahh and I also updated the camera adjusting logic a bit.
Thats enough, Ima do CSS tomorrow. Today I added a slider style and 2 other sliders for the shuffling and sorting speed. Then I hid those 2 and the remove and adding pillar buttons. Also added some CSS for flex, justify content, space between, to seperate the drop down, which I added too. I tried to add a scrolling drop down thing, but failed, uhh, I also adjusted the pillar speed and camera angle. Also I found out, that I can call functions from an array, so I can store a function in an array and then call it like that, thats weird, but also huge. Dont wanna write too much today, cause I still have stuff to do. Ah, also added prevention of shuffling while sorting.
FINALLYYYY Today was the final coding session. I finally got the UI right and am okay with it. Its not the best, but its acceptable. I decided to only use icons, to keep it clean, but I ran into the problem, that the icons arent clear enough to showcase the specific sorting algorithm. So I decided on making a tooltip. But the build in HTML tooltip is too ugly and the delay is annoying. I did some research and found a W3Schools tutorial, they are the goat ( here it is ). I didnt expect front end being so time intensive, but I did need to adjust every value so it looks good, which is very hard to do :(. Ah, I also fixed the bug that when there is the minimal amount of pillars, it will be weird while shuffling (that wasnt proper english). Also the icons changes depending if we are shuffling or sorting and the disables and reinables, which is cool. Uhh, I remembered sth, I need to implement canceling while sorting. Also the vid is one fix old, i did fix the typo in the sorting alg.
Implemented pause logic. I implemented pause logic and added an indicator, which shows, which sorting algorithm is currently active. The pause logic was quite painful, cause it just didnt want to stop. Neither with break, nor with return. After a long long long trouble shooting session, I found out, that I forgot .current and it just wont detect correctly, what a stupid bug to troubleshoot 20 min for. Also I fixed an edge case in the demo vid xD
I wrote my readme in this session, so nothing really to say. It was just typing typing typing and finishing this beautiful readme to be able to submit this project.
Ships:
A 3d sorting algorithm visualizer with NextJS and ThreeJS. Also its made with luve and happiness....
|
1792853401.529373
|
1792939801.529373
|
|
65362
|
MCQ MASTER by @Obito | Stardance
|
Obito
|
1
|
1.0
|
1
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T18:35:54Z", "hours": 1.0, "multiplier": 1.26, "payout": 1, "blessing": "neutral", "text": "i know my project is still on the beginning stage but the reason i ship this one is to communicate with the authorities that i am a 17 years old from south India i just heard about this event 3 days ago as i started lately i can’t use my full potential in less time. I’m now very frustrated that why projects get Ai flagged i just you Ai to final optimization to make the code looks clean. but the review simply says that your project contains heavy Ai code usage i don’t know how they even say this and my only goal is to get my dream keyboard AULA F75 which is very useful for me as my laptop keys are not working properly(chunky and sticky) i have 110 stardust now and i want 290 more so is this any other ways to get the stardust rather than shipping project. and any other ways to get that keyboard (Due to my financial conditions ) i can’t able to afford for a keyboard I don’t even have a proper internet connection I’m just using the mobile hotspot for the internet connection. so I Kindly request your team to give me a proper reply through this ship reply. I’m really frustrated and mentally become sick like i hit the peak level of the depression. The Only reason i accepts this stress and pain is to get that AULA F75 keyboard if i can’t able to get that or lost my chance i will definitely gets scattered and broken. so please give me a proper reply for my all questions and i know its not a proper way but please help me get that keyboard", "repo": "https://github.com/tharunkumarCYSEC/MCQ-MASTER", "demo": "https://mcq-master-sigma.vercel.app/"}]...
|
[{"post_id": 73082, "ts": "202 [{"post_id": 73082, "ts": "2026-09-24T10:44:25Z", "hours": 0.3561, "text": "im finally completed the coding part im very excited to deploy my project"}, {"post_id": 73077, "ts": "2026-09-24T10:20:37Z", "hours": 0.2856, "text": "hey there im OBITO my project is a MCQ generator name MCQ MASTER its a kind of tool for the students who want to examine thier self my monk exam. now i completed the python codes for it."}]...
|
Title: MCQ MASTER by @Obito | Stardance
Devlogs:
Title: MCQ MASTER by @Obito | Stardance
Devlogs:
hey there im OBITO my project is a MCQ generator name MCQ MASTER its a kind of tool for the students who want to examine thier self my monk exam. now i completed the python codes for it.
im finally completed the coding part im very excited to deploy my project
Ships:
i know my project is still on the beginning stage but the reason i ship this one is to communicate with the authorities that i am a 17 years old from south India i just heard about this event 3 days ago as i started lately i can’t use my full potential in less time. I’m now very frustrated that why projects get Ai flagged i just you Ai to final optimization to make the code looks clean. but the review simply says that your project contains heavy Ai code usage i don’t know how they even say this and my only goal is to get my dream keyboard AULA F75 which is very useful for me as my laptop keys are not working properly(chunky and sticky) i have 110 stardust now and i want 290 more so is this any other ways to get the stardust rather than shipping project. and any other ways to get that keyboard (Due to my financial conditions ) i can’t able to afford for a keyboard I don’t even have a proper internet connection I’m just using the mobile hotspot for the internet connection. so I Kindly request your team to give me a proper reply through this ship reply. I’m really frustrated and mentally become sick like i hit the peak level of the depression. The Only reason i accepts this stress and pain is to get that AULA F75 keyboard if i can’t able to get that or lost my chance i will definitely gets scattered and broken. so please give me a proper reply for my all questions and i know its not a proper way but please help me get that keyboard...
|
1792817239.8495672
|
1792903639.8495672
|
|
62105
|
space-dashboard by @abdulqadir | Stardance
|
abdulqadir
|
1
|
16.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T18:27:33Z", "hours": 16.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a customizable Space Dashboard using HTML, CSS, JavaScript and Vite. It uses NASA’s APOD API to show a new space background and also has a live customizable clock, Google search, quick shortcuts, random quotes, a draggable to-do list, custom space wallpapers and solid backgrounds. One of the most challenging parts was debugging the JavaScript, especially when a missing bracket broke both the clock and hamburger menu, and I also had some problems getting the Day/Night color toggle and wallpapers working correctly. I’m most proud of the custom Space Menu and how users can personalize the dashboard. When testing it, try changing the background, clock font and color, turning Day/Night mode on and off, and using the To-Do list and search.", "repo": "https://github.com/qadir-eng/space-dashboard", "demo": "https://qadir-eng.github.io/space-dashboard/"}]...
|
[{"post_id": 73257, "ts": "202 [{"post_id": 73257, "ts": "2026-09-24T18:04:25Z", "hours": 3.9967, "text": "Since the last devlog, I worked mainly on improving the customization and overall UI of the Space Dashboard. I added a Background section to the side menu. Users can now switch back to the NASA Daily image, choose from five selected space wallpapers, or use solid-color backgrounds. The wallpapers also have small previews so users can see them before selecting one. I also improved the clock customization. Users can now change the clock font using arrow buttons and choose between Digital Ops, Audiowide, Michroma, Bruno Ace, and Oxanium. I added a similar selector for clock colors, with options like White, Cyan, Blue, Purple, Solar, and Black. I added a Day/Night toggle for the clock too. When it is turned on, the clock automatically changes its color depending on the time of day. When it is turned off, the user can select their own clock color. I also improved the side menu so the clock font and color selectors open directly underneath their buttons instead of opening separate panels. This makes the menu simpler and keeps the main dashboard clean. Another addition was the loading screen. When the website starts, it shows “Loading Space…” while the NASA Daily background is being fetched and loaded. Once the image is ready, the loading screen disappears. It also disappears if the NASA request fails so the website doesn’t get stuck. There were several bugs while building these features. The biggest one was a misplaced } in the clock code, which caused the clock to stay at 00 00 and stopped the hamburger menu from working. I also had issues with the Day/Night toggle not visually turning off, wallpaper paths, and manual clock colors being overwritten by the automatic colors. I debugged these issues and got everything working properly. Overall, this update focused on making the Space Dashboard more customizable, cleaner, and easier to use."}, {"post_id": 72588, "ts": "2026-09-23T09:29:52Z", "hours": 3.6825, "text": "From last 2 days I was focusing on making the Space Dashboard more interactive and customizable. Space Menu I created a hamburger menu that opens a glass-style sidebar. This will act as the main control center for the dashboard, with options for the Quote of the Day, To-Do List, backgrounds, clock styles, and clock colors. I connected the Quote of the Day option to the sidebar. Users can now toggle the quote ON or OFF, depending on whether they want a cleaner dashboard or some inspiration on screen. I added a 4-task To-Do panel with a dark matte-glass design, background blur, rounded corners, and subtle transparency. I also made the panel draggable, so users can move it anywhere on their dashboard while still being able to type normally inside the task fields. and with that they can be on and off by clicking on to-do list button on sidebar"}, {"post_id": 71743, "ts": "2026-09-21T13:12:22Z", "hours": 0.7314, "text": "Today I worked on the search section of my Space Dashboard. I added a Google search bar so users can quickly search the web directly from the dashboard. I also added four shortcut buttons for YouTube, Gmail, Stardance, and Hackatime. I gave the search bar and shortcuts a glassmorphism/futuristic space design with transparent backgrounds, blur effects, and hover animations."}, {"post_id": 71683, "ts": "2026-09-21T09:35:02Z", "hours": 1.0897, "text": "add 5 different quotes each time randomly one from them will appear as it is appearing of top right if you think any changes feel free to give your changes"}, {"post_id": 71406, "ts": "2026-09-20T19:22:20Z", "hours": 2.0353, "text": "Set today’s NASA Astronomy Picture of the Day as the full-page background, with a dark overlay to keep everything readable regardless of what image NASA posts. Added a large glowing digital clock overlay showing the live time, styled with a soft black to match the space theme"}, {"post_id": 71105, "ts": "2026-09-20T09:38:25Z", "hours": 1.8103, "text": "🚀 Space Dashboard — Saving Notes with localStorageToday I worked on making the sticky notes in my Space Dashboard persistent.Before this, I could create NASA photo notes and drag them around, but whenever I refreshed the page, all the notes disappeared.💾 What I addedI implemented localStorage so the dashboard can remember the notes even after refreshing the page.For each note, I now save:📸 The NASA photo URL📍 The note’s position📝 The note’s shape/classI created a saveNotes() function that collects the information from every sticky note and stores it in the browser’s localStorage.I also added a restore system that runs when the page loads. It reads the saved notes, recreates them, restores their positions, and makes them draggable again.🖱️ Dragging + SavingI kept the existing drag system and connected it to the save function. Whenever I move a note, its new position is saved.This means I can:Add a NASA photo noteDrag it anywhereRefresh the pageGet the note back in the same position 🎯🧠 What I learnedThis part taught me more about:localStorageJSON.stringify()JSON.parse()datasetSaving JavaScript objectsRestoring DOM elements after a page reloadConnecting multiple features together✅ ResultThe Space Dashboard now remembers my NASA sticky notes instead of losing them every time the page refreshes.This makes the dashboard feel much more like a real usable application rather than just a temporary webpage. lwk this time no ss TT"}, {"post_id": 70069, "ts": "2026-09-18T12:00:27Z", "hours": 0.9089, "text": "Fixed a real-world problem: NASA’s official Mars Rover Photos API was returning 404 errors on every request — confirmed it wasn’t my code by testing the exact documented URL directly, even with their public demo key. Pivoted to reusing the same NASA APOD endpoint I’d already gotten working, but requesting a random historical date instead of today — gives varied real space photos on each sticky note while staying reliable. Learned how to generate a random date between two points using Date.getTime() and Math.random()."}, {"post_id": 69319, "ts": "2026-09-16T19:50:28Z", "hours": 1.2689, "text": "Wrote the core JavaScript for my Space Search project: a live fetch to NASA’s Astronomy Picture of the Day API. Learned how fetch() and .then() chains work — sending a request, converting the raw response with .json(), then using the data to build the page. Handled the case where NASA sometimes posts a video instead of an image (using an if statement and a media variable so I only set innerHTML once, instead of overwriting it multiple times). Added error handling with .catch() so the page shows a clear message instead of going blank if something fails. Toughest part was understanding why setting innerHTML multiple times wipes out previous content — had to actually see it break before it clicked. Screenshot: the page showing today’s NASA title, image, and description. Ik that it isn’t looking cool but trust the process buddies TT"}]...
|
Title: space-dashboard by @abdulqadir | Stardance
Title: space-dashboard by @abdulqadir | Stardance
Devlogs:
Wrote the core JavaScript for my Space Search project: a live fetch to NASA’s Astronomy Picture of the Day API. Learned how fetch() and .then() chains work — sending a request, converting the raw response with .json(), then using the data to build the page. Handled the case where NASA sometimes posts a video instead of an image (using an if statement and a media variable so I only set innerHTML once, instead of overwriting it multiple times). Added error handling with .catch() so the page shows a clear message instead of going blank if something fails. Toughest part was understanding why setting innerHTML multiple times wipes out previous content — had to actually see it break before it clicked. Screenshot: the page showing today’s NASA title, image, and description. Ik that it isn’t looking cool but trust the process buddies TT
Fixed a real-world problem: NASA’s official Mars Rover Photos API was returning 404 errors on every request — confirmed it wasn’t my code by testing the exact documented URL directly, even with their public demo key. Pivoted to reusing the same NASA APOD endpoint I’d already gotten working, but requesting a random historical date instead of today — gives varied real space photos on each sticky note while staying reliable. Learned how to generate a random date between two points using Date.getTime() and Math.random().
🚀 Space Dashboard — Saving Notes with localStorageToday I worked on making the sticky notes in my Space Dashboard persistent.Before this, I could create NASA photo notes and drag them around, but whenever I refreshed the page, all the notes disappeared.💾 What I addedI implemented localStorage so the dashboard can remember the notes even after refreshing the page.For each note, I now save:📸 The NASA photo URL📍 The note’s position📝 The note’s shape/classI created a saveNotes() function that collects the information from every sticky note and stores it in the browser’s localStorage.I also added a restore system that runs when the page loads. It reads the saved notes, recreates them, restores their positions, and makes them draggable again.🖱️ Dragging + SavingI kept the existing drag system and connected it to the save function. Whenever I move a note, its new position is saved.This means I can:Add a NASA photo noteDrag it anywhereRefresh the pageGet the note back in the same position 🎯🧠 What I learnedThis part taught me more about:localStorageJSON.stringify()JSON.parse()datasetSaving JavaScript objectsRestoring DOM elements after a page reloadConnecting multiple features together✅ ResultThe Space Dashboard now remembers my NASA sticky notes instead of losing them every time the page refreshes.This makes the dashboard feel much more like a real usable application rather than just a temporary webpage. lwk this time no ss TT
Set today’s NASA Astronomy Picture of the Day as the full-page background, with a dark overlay to keep everything readable regardless of what image NASA posts. Added a large glowing digital clock overlay showing the live time, styled with a soft black to match the space theme
add 5 different quotes each time randomly one from them will appear as it is appearing of top right if you think any changes feel free to give your changes
Today I worked on the search section of my Space Dashboard. I added a Google search bar so users can quickly search the web directly from the dashboard. I also added four shortcut buttons for YouTube, Gmail, Stardance, and Hackatime. I gave the search bar and shortcuts a glassmorphism/futuristic space design with transparent backgrounds, blur effects, and hover animations.
From last 2 days I was focusing on making the Space Dashboard more interactive and customizable. Space Menu I created a hamburger menu that opens a glass-style sidebar. This will act as the main control center for the dashboard, with options for the Quote of the Day, To-Do List, backgrounds, clock styles, and clock colors. I connected the Quote of the Day option to the sidebar. Users can now toggle the quote ON or OFF, depending on whether they want a cleaner dashboard or some inspiration on screen. I added a 4-task To-Do panel with a dark matte-glass design, background blur, rounded corners, and subtle transparency. I also made the panel draggable, so users can move it anywhere on their dashboard while still being able to type normally inside the task fields. and with that they can be on and off by clicking on to-do list button on sidebar
Since the last devlog, I worked mainly on improving the customization and overall UI of the Space Dashboard. I added a Background section to the side menu. Users can now switch back to the NASA Daily image, choose from five selected space wallpapers, or use solid-color backgrounds. The wallpapers also have small previews so users can see them before selecting one. I also improved the clock customization. Users can now change the clock font using arrow buttons and choose between Digital Ops, Audiowide, Michroma, Bruno Ace, and Oxanium. I added a similar selector for clock colors, with options like White, Cyan, Blue, Purple, Solar, and Black. I added a Day/Night toggle for the clock too. When it is turned on, the clock automatically changes its color depending on the time of day. When it is turned off, the user can select their own clock color. I also improved the side menu so the clock font and color selectors open directly underneath their buttons instead of opening separate panels. This makes the menu simpler and keeps the main dashboard clean. Another addition was the loading screen. When the website starts, it shows “Loading Space…” while the NASA Daily background is being fetched and loaded. Once the image is ready, the loading screen disappears. It also disappears if the NASA request fails so the website doesn’t get stuck. There were several bugs while building these features. The biggest one was a misplaced } in the clock code, which caused the clock to stay at 00 00 and stopped the hamburger menu from working. I also had issues with the Day/Night toggle not visually turning off, wallpaper paths, and manual clock colors being overwritten by the automatic colors. I debugged these issues and got everything working properly. Overall, this update focused on making the Space Dashboard more customizable, cleaner, and easier to use.
Ships:
I made a customizable Space Dashboard using HTML, CSS, JavaScript and Vite. It uses NASA’s APOD API to show a new space background and also has a live customizable clock, Google search, quick shortcuts, random quotes, a draggable to-do list, custom space wallpapers and solid backgrounds. One of the most challenging parts was debugging the JavaScript, especially when a missing bracket broke both the clock and hamburger menu, and I also had some problems getting the Day/Night color toggle and wallpapers working correctly. I’m most proud of the custom Space Menu and how users can personalize the dashboard. When testing it, try changing the background, clock font and color, turning Day/Night mode on and off, and using the To-Do list and search....
|
1792813914.7842097
|
1792900314.7842097
|
|
48199
|
UPS for Raspberry Pi by @Jovi | Stardance
|
Jovi
|
2
|
5.0
|
23
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T17:16:12Z", "hours": 1.0, "multiplier": 5.0, "payout": 3, "blessing": "neutral", "text": "I made a simple but working UPS for a raspberry pi(any raspberry pi) that works on a 1200mAh li-po battery, and can last an hour with strong load on the pi! You can also view the voltage of the battery, as shown below, so you would know when to stop before the pi shuts down edit: I edited the video this time, and added some comments", "repo": "https://github.com/TeenEngineer/RasPi_UPS", "demo": ""}, {"ship_num": 2, "ts": "2026-08-17T16:58:25Z", "hours": 4.0, "multiplier": 5.0, "payout": 20, "blessing": "neutral", "text": "I made a simple but working UPS for a raspberry pi(any raspberry pi) that works on a 1200mAh li-po battery, and can last an hour with strong load on the pi! You can also view the voltage of the battery, as shown below, so you would know when to stop before the pi shuts down", "repo": "https://github.com/TeenEngineer/RasPi_UPS", "demo": ""}]...
|
[{"post_id": 73239, "ts": "202 [{"post_id": 73239, "ts": "2026-09-24T17:13:22Z", "hours": 0.5344, "text": "Edited the initial video(i hope i get more payout this time)"}, {"post_id": 48414, "ts": "2026-08-16T19:07:04Z", "hours": 0.4003, "text": "Made the case"}, {"post_id": 47695, "ts": "2026-08-15T19:31:34Z", "hours": 3.5389, "text": "Made the UPS(TOOK TOO LONG, AND ACCIDENTALLY TRIED TO OVER-ENGINEER IT)… The final result is below. You can watch this timelapse to see what i was doing before switching to the current design: https://lapse.hackclub.com/timelapse/Mhi8F60c0BRf"}]...
|
Title: UPS for Raspberry Pi by @Jovi | Stardance
Title: UPS for Raspberry Pi by @Jovi | Stardance
Devlogs:
Made the UPS(TOOK TOO LONG, AND ACCIDENTALLY TRIED TO OVER-ENGINEER IT)… The final result is below. You can watch this timelapse to see what i was doing before switching to the current design: https://lapse.hackclub.com/timelapse/Mhi8F60c0BRf
Made the case
Edited the initial video(i hope i get more payout this time)
Ships:
I made a simple but working UPS for a raspberry pi(any raspberry pi) that works on a 1200mAh li-po battery, and can last an hour with strong load on the pi! You can also view the voltage of the battery, as shown below, so you would know when to stop before the pi shuts down
I made a simple but working UPS for a raspberry pi(any raspberry pi) that works on a 1200mAh li-po battery, and can last an hour with strong load on the pi! You can also view the voltage of the battery, as shown below, so you would know when to stop before the pi shuts down edit: I edited the video this time, and added some comments...
|
1792849670.6327949
|
1792936070.6327949
|
|
65488
|
TypeArena by @Xgly | Stardance
|
Xgly
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T17:09:25Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a Typing Speed Testing website, I just bored using a simple speed testing website, so I decided to make my own with some cool features and yeah it’s not the end I will add many more cool features. It has many mode not just one simple typing for ex- it has a hardcore mode in this if u type 1 wrong word it’s over. I faces many problem but not gonna lie I use Ai to fix them…", "repo": "https://github.com/aquamystic7/Typing-Speed-Test", "demo": "https://typearena.xyz/"}]...
|
[{"post_id": 73230, "ts": "202 [{"post_id": 73230, "ts": "2026-09-24T17:04:25Z", "hours": 5.2956, "text": "I’m Just making a cool Typing Speed Testing website with cool features…"}]...
|
Title: TypeArena by @Xgly | Stardance
Devlogs:
I’ Title: TypeArena by @Xgly | Stardance
Devlogs:
I’m Just making a cool Typing Speed Testing website with cool features…
Ships:
I made a Typing Speed Testing website, I just bored using a simple speed testing website, so I decided to make my own with some cool features and yeah it’s not the end I will add many more cool features. It has many mode not just one simple typing for ex- it has a hardcore mode in this if u type 1 wrong word it’s over. I faces many problem but not gonna lie I use Ai to fix them…...
|
1792817249.6956527
|
1792903649.6956527
|
|
28981
|
My very own WebOS by @Nikks | Stardance
|
Nikks
|
2
|
18.0
|
14
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T17:07:34Z", "hours": 9.0, "multiplier": 1.52, "payout": 14, "blessing": "neutral", "text": "I made a breaking bad themed OS that’s running in a website. Also the part i was kind of stuck at was the terminal. It was hard trying to make it similar to a traditional on and that’s I’m most proud of too.", "repo": "https://github.com/Nikhil1059/BreakingBadOS", "demo": "https://nikhil1059.github.io/BreakingBadOS/"}, {"ship_num": 2, "ts": "2026-08-17T21:13:35Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I havent completed it but i think this is a good milestone to ship it ad work on it in the future.", "repo": "https://github.com/Nikhil1059/BreakingBadOS", "demo": "https://nikhil1059.github.io/BreakingBadOS/"}]...
|
[{"post_id": 73216, "ts": "202 [{"post_id": 73216, "ts": "2026-09-24T16:48:12Z", "hours": 1.4122, "text": "This time i have added the feature to resize windows. its similar to normal windows resizing windows or linux."}, {"post_id": 65951, "ts": "2026-09-11T13:08:39Z", "hours": 2.1336, "text": "So today i made some good and exciting changes. The changes that were made are: I made a Calendar that pops out when you click the date or time. I redesigned the topbar to kind of look like a taskbar I also made the buttons on the top bar better with animations and shadow. I hope whoever tries this out if any please give me some ideas to further add :)"}, {"post_id": 65322, "ts": "2026-09-10T12:15:23Z", "hours": 1.6089, "text": "So today I made some commands for the terminal. /help gives you all the commands that WORK so feel free to fidget and I’m sure there should be no bugs but please let me know if there are any;)"}, {"post_id": 64171, "ts": "2026-09-08T12:05:35Z", "hours": 1.5844, "text": "I further worked on the terminal. Today i have added two things: The way the input and output is given in the terminal. Its very close to a standard terminal and acts like it. The cursor bar. I have added a distinct function masking the normal cursor bar with a terminal style cursor bar that works so nice. also for now the output of the commands(for now just text) is the input itself but in the next session im going to add official commands and a /help too :)"}, {"post_id": 63473, "ts": "2026-09-07T10:55:18Z", "hours": 1.38, "text": "Today I made the terminal window. As usual it will has all the characteristics of the notes window and also I tried to replicate a terminal design as much as possible. For now the terminal doesn’t work and it just gives the same output as what we type but ill work on that. But I this this was a good front end work."}, {"post_id": 49887, "ts": "2026-08-18T20:56:35Z", "hours": 1.2892, "text": "These are the things i have done in this session: I created a terminal icon and gave it the same charecteristics as the notes icon. I added a reset button which makes the app icons go back to their previous place and this clears the local storage too. I significantly upgraded the dragging system and tbh i spent a really long time for this so please check this out. The icon won’t overlap now and also i gave them real desktop like behaviour. I also added desktop boundaries so that the icons dont go off screen."}, {"post_id": 47641, "ts": "2026-08-15T17:48:50Z", "hours": 1.0669, "text": "I have made the Icon movable like an actual icon on a desktop. Also added a grid so that the icon snapped to a place like again a normal desktop. Also i have added local storage for this icon position so when you change the position of the icon and reload the website the icon will stay at the place you left it. I though it was cool. also for the people who find the boot screen appearing every time you can just change the dev mode true in Script.js and it’ll be bypassed. I planned a solution for this so stay tuned :)"}, {"post_id": 39492, "ts": "2026-08-02T13:58:35Z", "hours": 6.0139, "text": "I have made a lot of changes and forgot to make devlogs. I made a beautiful booting screen and also a beautiful intro screen. I also added a notes app which saves automatically."}, {"post_id": 20284, "ts": "2026-07-01T20:44:38Z", "hours": 1.9125, "text": "I’m working on a os on a web as part of a mission in stardance. I have so far just added some introduction about myself and added a little time and date indicator on the top right. And yeah its Breaking Bad themed so stay tuned i have some good ideas to implement."}]...
|
Title: My very own WebOS by @Nikks | Stardance
De Title: My very own WebOS by @Nikks | Stardance
Devlogs:
I’m working on a os on a web as part of a mission in stardance. I have so far just added some introduction about myself and added a little time and date indicator on the top right. And yeah its Breaking Bad themed so stay tuned i have some good ideas to implement.
I have made a lot of changes and forgot to make devlogs. I made a beautiful booting screen and also a beautiful intro screen. I also added a notes app which saves automatically.
I have made the Icon movable like an actual icon on a desktop. Also added a grid so that the icon snapped to a place like again a normal desktop. Also i have added local storage for this icon position so when you change the position of the icon and reload the website the icon will stay at the place you left it. I though it was cool. also for the people who find the boot screen appearing every time you can just change the dev mode true in Script.js and it’ll be bypassed. I planned a solution for this so stay tuned :)
These are the things i have done in this session: I created a terminal icon and gave it the same charecteristics as the notes icon. I added a reset button which makes the app icons go back to their previous place and this clears the local storage too. I significantly upgraded the dragging system and tbh i spent a really long time for this so please check this out. The icon won’t overlap now and also i gave them real desktop like behaviour. I also added desktop boundaries so that the icons dont go off screen.
Today I made the terminal window. As usual it will has all the characteristics of the notes window and also I tried to replicate a terminal design as much as possible. For now the terminal doesn’t work and it just gives the same output as what we type but ill work on that. But I this this was a good front end work.
I further worked on the terminal. Today i have added two things: The way the input and output is given in the terminal. Its very close to a standard terminal and acts like it. The cursor bar. I have added a distinct function masking the normal cursor bar with a terminal style cursor bar that works so nice. also for now the output of the commands(for now just text) is the input itself but in the next session im going to add official commands and a /help too :)
So today I made some commands for the terminal. /help gives you all the commands that WORK so feel free to fidget and I’m sure there should be no bugs but please let me know if there are any;)
So today i made some good and exciting changes. The changes that were made are: I made a Calendar that pops out when you click the date or time. I redesigned the topbar to kind of look like a taskbar I also made the buttons on the top bar better with animations and shadow. I hope whoever tries this out if any please give me some ideas to further add :)
This time i have added the feature to resize windows. its similar to normal windows resizing windows or linux.
Ships:
I havent completed it but i think this is a good milestone to ship it ad work on it in the future.
I made a breaking bad themed OS that’s running in a website. Also the part i was kind of stuck at was the terminal. It was hard trying to make it similar to a traditional on and that’s I’m most proud of too....
|
1792842625.96969
|
1792929025.96969
|
|
65180
|
portfolio by @Erox | Stardance
|
Erox
|
1
|
5.88
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T16:55:51Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is my portfolio , i used tailwind + vite to build it . on the last devlog i added my projects and refined a bit more , check my git for more info", "repo": "https://github.com/Erox-02/portfolio", "demo": "https://erox.is-a.dev/"}]...
|
[{"post_id": 74145, "ts": "202 [{"post_id": 74145, "ts": "2026-09-26T19:29:52Z", "hours": 1.7297, "text": "heavily cleaned up the code , changed a lot of code too now heres the final lool"}, {"post_id": 73655, "ts": "2026-09-25T16:20:17Z", "hours": 0.305, "text": "added a logo but it felt way too odd bec of lower quality so i upscaled it , now it looks way better"}, {"post_id": 73639, "ts": "2026-09-25T15:45:25Z", "hours": 0.8453, "text": "Upgraded the overall project , last time i rushed , used my old project’s code but now i will be continuing the project no slop"}, {"post_id": 73219, "ts": "2026-09-24T16:51:11Z", "hours": 0.7719, "text": "done this time made it perfect"}, {"post_id": 73187, "ts": "2026-09-24T15:34:33Z", "hours": 0.2589, "text": "why am i gettin an err? my file exists for sure"}, {"post_id": 73167, "ts": "2026-09-24T14:56:19Z", "hours": 0.5142, "text": "changed the accent color and a lot but it still looks odd maybe i will do a much big change now"}, {"post_id": 73044, "ts": "2026-09-24T08:11:49Z", "hours": 0.3197, "text": "added setup session , but it doesnt look tht cool so i think i will change the #setup to a diff page"}, {"post_id": 73032, "ts": "2026-09-24T07:42:12Z", "hours": 0.3647, "text": "added status and my projects"}, {"post_id": 73014, "ts": "2026-09-24T06:58:57Z", "hours": 0.2783, "text": "added the hero portion also rewrote the hero portion with rajdhani font , yk the sans look too normal check the commits for more"}, {"post_id": 73003, "ts": "2026-09-24T06:17:33Z", "hours": 0.7739, "text": "started the work , currently i have only comps the tagged img shows tht , i will be addin things"}]...
|
Title: portfolio by @Erox | Stardance
Devlogs:
st Title: portfolio by @Erox | Stardance
Devlogs:
started the work , currently i have only comps the tagged img shows tht , i will be addin things
added the hero portion also rewrote the hero portion with rajdhani font , yk the sans look too normal check the commits for more
added status and my projects
added setup session , but it doesnt look tht cool so i think i will change the #setup to a diff page
changed the accent color and a lot but it still looks odd maybe i will do a much big change now
why am i gettin an err? my file exists for sure
done this time made it perfect
Upgraded the overall project , last time i rushed , used my old project’s code but now i will be continuing the project no slop
added a logo but it felt way too odd bec of lower quality so i upscaled it , now it looks way better
heavily cleaned up the code , changed a lot of code too now heres the final lool
Ships:
This is my portfolio , i used tailwind + vite to build it . on the last devlog i added my projects and refined a bit more , check my git for more info...
|
1792814211.8088195
|
1792900611.8088195
|
|
52241
|
DDSim by @yaasshh | Stardance
|
yaasshh
|
1
|
124.76
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T16:51:16Z", "hours": 87.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built DDSim, a program that simulates what happens inside the tiny parts that computer chips are made of, ie diodes, capacitors and transistors. You describe a device by its shape and which parts of the silicon have extra electrons or holes. DDSim then works out how those electrons and holes move, and draws the current and voltage curves. I didn’t fit anything to make the graphs look right. Everything comes straight from the physics equations. (NOTE: ITS STILL VERY CLUNKY SO ITS NOT GOING TO BE PERFECT AS OF RIGHT NOW. IF YOU FACE ANY TROUBLES IM REALLY SORRY) To make sure everything accurate, I checked it against textbook formulas and against DEVSIM, a simulator other people wrote. They agree to within a few percent, and the project has about 2,700 automated tests. You can try it in your browser at ddsim.fly.dev. Pick a device, press solve, and watch the answer draw itself. Every button and graph has a little “i” that explains what it means, and there are guided lessons if you’re new to this. It’s a school-level instrument, not a chip design tool. Below about 50 nanometers the physics it uses stops being accurate, so I didn’t go beyond that", "repo": "https://github.com/yaasshh09/DDSim", "demo": "https://ddsim.fly.dev"}]...
|
[{"post_id": 82276, "ts": "202 [{"post_id": 82276, "ts": "2026-10-24T13:22:27Z", "hours": 9.6742, "text": "Devlog #23 The trick for the MOS capacitor worked. Making the electrons react faster put the slow wiggles at a speed the computer can handle, and the answers came out right. That FINALLY finished the AC phase. I also added noise, a tiny random jitter in current that every device has. Next I added time. Now its possible to flip a diode from on to off and watch it recover. When you switch a diode off, it keeps conducting for a moment because of all the charge stored inside it. I compared that against DEVSIM, and our results were within 0.03% of each other which is quite frankly something im really proud off. Then I added a feature where the simulator shows how inaccurate it may be. It now checks its own answer against a finer mesh and puts a little error bar on every point in the plots. It can also improve its own mesh by adding points only where they’re needed. On 5 of my 8 test devices it hit the target accuracy with fewer points than my hand-made meshes. I was aiming for around 6, so that’s still doable. The newest addition is a bipolar transistor, where a small current into the middle layer controls a much bigger current through the whole device. I built a simple 1D version and a more realistic 2D one. The 1D version matches the textbook formula to within 0.03%. The best part is that its gain drops off at both very low and very high current, the way real transistors do, and I never told it to. It figured that out from the physics."}, {"post_id": 80341, "ts": "2026-10-17T10:12:36Z", "hours": 1.9553, "text": "Devlog #22 The long DEVSIM run finally finished. It took about 6 hours and matched the expert result almost exactly, which closes out the scoreboard phase. Then I started the next phase, which is about AC. That essentially means wiggling the voltage back and forth and watching how the device reacts at different speeds. Before, my simulator could only handle super slow wiggles, or fast ones where I froze some electrons by hand. Now it can handle any speed. To get there, I first taught the simulator how fast electrons and holes pile up or drain away over time. Then I wrote the part that works out how much current flows into each contact when one of them gets wiggled. I tested it on diodes, since they have textbook formulas to compare against. A long diode matched within about 1%, and a short one within 1.3%. Along the way I found a bug where my mesh maker gave up on very long devices, so I fixed that too. The MOS capacitor is giving me some trouble. At really slow wiggles, the math needs more precision than normal computer numbers have, so the answers came out wrong by up to 46%. Fast wiggles work fine. Right now I’m trying a trick where I make the electrons react faster, so the slow case happens at a speed the computer can handle. Below are some of the DEVSIM scoreboard values"}, {"post_id": 80105, "ts": "2026-10-16T07:52:45Z", "hours": 4.8328, "text": "Devlog #21 Since the last devlog I finished most of the temperature phases. First I compared the diode at 400 K against DEVSIM. I saved that result so my other tests compare with it from now on. Then I added two new sliders to the website. One sets the temperature, from 200 to 500 K. The other sets the fixed charge where the silicon meets the oxide. I picked both ranges by running the simulator across them. Each slider also has a short lesson that explains what it does. While I was writing those, I found some broken math formatting in the temperature lesson and fixed it. The biggest addition is freeze-out. To make silicon conduct, we add extra atoms that give up electrons. When it gets really cold, those atoms stop giving up their electrons. Before, my simulator assumed they always did. Now there’s a switch for it, and it works. At 100, 200 and 300 K it matches the textbook formula almost exactly. I also checked that a plain frozen silicon bar still follows Ohm’s law, and that the capacitance results still work at 150 K."}, {"post_id": 79306, "ts": "2026-10-13T13:29:32Z", "hours": 4.9631, "text": "Devlog #20 In this devlog i firstly fixed up the website. It now has a little icon in the browser tab, a terms page, a privacy page and a footer with a contact button. The icon didn’t show up on the live site at first, so I fixed that too. Then I started the next phase, which is all about fixing temperature related stuff. A lot of the calculations of the simulator took room temperature which might have led to some wrong calculations, so I’ve been fixing that. The gate’s energy level was stuck at its room-temperature value. it was a real bug and its fixed now. When the silicon gets hotter, electrons now max out at a lower speed, just like in real-life chips. From 250 to 400 K, the junction’s built-in voltage matches the textbook formula. From 300 to 400 K, the diode’s leakage current stays within 0.3% of the formula. I also added a fixed charge that sits where the silicon meets the oxide layer. Real chips always have some, and it changes the voltage where a transistor turns on. Next up are the big jobs. A long DEVSIM run is still going, and after that I’ll test the temperature effects on a full 2D transistor. I also still need to put the website changes live."}, {"post_id": 76513, "ts": "2026-10-03T19:43:47Z", "hours": 7.6606, "text": "Devlog #19 The speed and robustness numbers are now saved on the scoreboard. On the first 8 benchmarks, my solver takes about 1.6x less time per bias point than DEVSIM. I also added a test that reads the README and fails if the README claims anything the data doesn’t back up (I hate getting 100% vibe code assumptions on my readme btw). I renamed a lot of variables across the code (to pass the 30% ai rule that im apparently violating) to shorter names. That kind of change can break the tests if some of the variables reference each other across multiple files, so I checked that python turns the old code and the new code into exactly the same instructions. Thankfully it did. I also moved all the settings into one file. Things like how many tries the solver gets, how small the mesh can get, and the server limits used to be scattered across about 20 files. I checked that every single value stayed exactly the same after the move. I also deleted the last few leftover comments. Then I pushed everything. The tests ran on three Python versions, and 2,723 of 2,724 passed. The one that failed was a browser test on Python 3.11 that waited too long for the page to load. The same test passed on the other two versions, so it’s probably just a slow test machine, but I’m going to rerun it to make sure. My laptop ran out of memory again, which stopped me from finishing the type hints in the tests. That’s next, once I’m not running a bunch of other stuff at the same time."}, {"post_id": 74357, "ts": "2026-09-27T07:21:49Z", "hours": 2.1619, "text": "Devlog #18 The robustness runs are almost done. Robustness checks a simple concept, if I give the solver a device cold, with no warm-up, does it actually finish? I ran 200 test cases through my solver and through DEVSIM, each in a few different setups. The robustness numbers aren’t final yet. One DEVSIM result is still missing. The first time my laptop ran out of memory, and the second time it went to sleep overnight, so it’s running again now. I also found out DEVSIM acts much differently depending on how many CPU threads it gets. With only one, some solves failed or took forever which was kinda interesting to see. On the cleanup side, I turned on the strictest type checking across the whole project and fixed what it found. Every color on the website now comes from one file. I also deleted a bunch of old files nobody used and cut the README down."}, {"post_id": 73883, "ts": "2026-09-26T07:55:09Z", "hours": 4.0261, "text": "Devlog #17 I restarted the scoreboard runs, and before looking/mentioning any of the results I checked my own setup for DEVSIM. That showed a few bugs on my side. My starting guess for the voltage inside the device did a log of zero on heavily doped chips, so DEVSIM crashed INSTANTLY. I also wasn’t giving it enough steps to settle on some devices. I fixed both, because it wouldn’t be fair to count my mistakes as DEVSIM’s. I also cleaned up the code, I tried to ship all progress so far but there was just too much AI (guilty) so I am working on redoing the python, css and javascript code again mainly from scratch. (The image shows all the values from the DDSim tests)"}, {"post_id": 73631, "ts": "2026-09-25T15:22:18Z", "hours": 2.4842, "text": "Devlog #16 Now that DDSim is live, my next goal is to make it better than DEVSIM, a free, open-source simulator a lot of people already use. “Better” doesn’t count unless I can measure it, so I planned out the next 11 stages of the project, and the first one is a scoreboard. The scoreboard runs both simulators on the same set of devices and compares them in four ways: how often each one finishes a solve without crashing, how accurate the answers are, how fast they run, and what each one can do at all. Some of these runs take hours, and my laptop ran out of memory partway through, so I paused them. I’ll post the results once they’re done, even the parts where DEVSIM is better than mine. While building the accuracy check, I found a bug in my own math. Sometimes it reported numbers that didn’t make physical sense, so now it throws those out instead of trusting them. I also went through all the style files for the website. They’re about a third smaller now, and I checked that the page still looks exactly the same. Then I found a small bug that had been there all along. The little “i” buttons that explain each setting were supposed to turn blue when you hover over them, but a different style rule was overriding it. Last, I cleaned up the README again. The pictures are centered now, I took out the GIF, and I rewrote some of the text so it reads more naturally."}, {"post_id": 73215, "ts": "2026-09-24T16:47:16Z", "hours": 1.6669, "text": "Devlog #15 DDSim is FINALLY deployed and live! You can try it at ddsim.fly.dev Getting it online took one extra step. The cheap shared server was too slow: the hardest transistor solve takes about 50 seconds on my laptop and would have taken around 7 minutes there. That’s past the 5-minute limit I set, so it would have been stopped every time. I moved it to a faster server, and now it finishes in under a minute. Once it was up, I found a bug. When every contact on a transistor was at the same voltage, the picture still drew current flowing through it. That’s impossible, because with no voltage difference nothing moves. I fixed it, and now the page says “no current flows” instead of showing an empty plot with no explanation. Then I rewrote the README from scratch. The old one was over 500 lines and way too dense. The new one is about 200 lines, mostly screenshots from the live site plus a few tables, so someone can see what the project does in a couple of minutes. While doing that, I caught a mistake. One number in my results table didn’t match the graph right next to it. I reran the full simulation, which took 20 minutes, and fixed the table so it matches. Last, I took the deployment files out of the public code. Anyone who downloads it gets everything they need to run it on their own computer, but not the setup for putting it online. Next up, I might be thinking of getting a custom name for this simulator and my other atom simulator. If anyone knows where I can get free domains, lmk in the comments"}, {"post_id": 72803, "ts": "2026-09-23T19:24:31Z", "hours": 2.5789, "text": "Devlog #14 Since then, most of my work has been getting DDSim ready for other people to use. First I cleaned up the controls. Some sliders and number boxes let you pick values that made the solver fail, which just showed up as a red error. I went through the diode, the MOS capacitor, the transistor and the draw-your-own device and found the range where each setting actually works. The sliders now stay inside those ranges, so a beginner can’t break things by accident. Then I cleaned up the code. I deleted about 2,400 lines of comments that just repeated what the code already said and kept the ones that explain something nessessary. Next came the writing. The site has about 40 short articles that explain the physics, and a lot of them sounded stiff, so I rewrote all of them. I did the same for the project docs, and on the way I found a few places where the docs no longer matched what the code does, so I fixed those too. Now I’m working on putting it online. I picked Fly.io to host it, and I’m hoping to get a free custom name. Since anyone will be able to use it, I’m adding some safety limits first. Only a couple of solves can run at the same time, old results get cleared out after a while, and a solve that runs too long gets stopped with a message explaining why. I tested each limit by breaking it on purpose to make sure the test catches it. It isn’t live yet, but it’s close! [lazy pic, i dont wanna open server again :( ]"}, {"post_id": 72407, "ts": "2026-09-22T21:05:00Z", "hours": 1.9161, "text": "Devlog #13 This one is all about the page itself. The physics didn’t change, but you’ll notice everything else did. I rebuilt the whole look from scratch. The old version was only friendly if you already knew semiconductors, and I want someone who has never heard of a diode to open it and get somewhere. Now it opens by asking you to pick a device: a diode, a MOS capacitor, a transistor, or draw your own. Each one comes with a sentence or two on what it is. Every number and switch has a little “i” next to it that explains it, and an empty plot tells you what it’s waiting for instead of sitting blank. Drawing your own device used to happen in a tiny box off to the side. Now it gets the whole screen. Some layers are so thin they basically disappeared, so I stretch the picture up and down until you can see them, and a label says when it’s stretched. Doped areas get a soft color so you can tell them apart. I also changed the font a couple of times. It started in a terminal style that felt cold. I tried one replacement and ended on Poppins, which just feels warmer. My favorite change is in the runs panel. It used to list your old runs as text, like “doping 1e17.” Now every solve saves a little picture of its own curve, and they all share the same scale, so you can see at a glance how each change moved the result. I switched the license to CC BY-NC so that it still stays technically open source but I own intellectual property for commercial use. Anyone can use it and change it for free, as long as they credit me and don’t sell it. A bit of AI usage in the frontend i will agree but not overkill in terms of it."}, {"post_id": 72227, "ts": "2026-09-22T14:20:14Z", "hours": 2.8683, "text": "Devlog #12 Last time I left off with a transistor sitting on oxide that would not solve. I think ive fixed it. The silicon body had no contact touching it anywhere, so the solver had no idea what voltage that body should sit at. There is no single right answer, so it just wanders. That is not a bug I can fix, it is the physics of the thing, so now the simulator refuses that drawing up front and says why instead of grinding away at it. Then I went hunting for every other way someone could break it. I wrote something that tries every combination of settings the page can send and watched what fell over. A few things did: A gate metal with a work function no real metal has. Surface scattering asked for on a 1D device, which has no surface to scatter off. A shape so thin the grid ends up dividing by zero. All of them now get refused before the solve starts, with a sentence saying what to change. A few smaller ones. The device picture was drawn half a grid cell off, which threw off the line you drag across it to read values. That same line returned nothing at all where silicon meets oxide. And the explanations could load out of order and show you the wrong one. I think now i should wrap the version 1 of the project and finish polishing the frontend considering stardance is getting over soon. another lazy code pic btw cause i dont wanna open the servers again"}, {"post_id": 70662, "ts": "2026-09-19T15:24:06Z", "hours": 2.4228, "text": "Devlog #11 Since the last devlog, you can draw your own 2D devices, not just stack layers in a line. You draw rectangles of silicon and oxide, paint doping onto them, and place metal contacts along the edges. The simulator builds a grid that fits your drawing and solves it. Before it solves, it checks for mistakes and tells you what’s wrong in plain words: a piece of silicon with no contact touching it, a gate sitting right on silicon, or a shape too small for the grid to see. To make sure drawing works, I redrew the MOS capacitor and the transistor I already had and checked that they give the same answers. The capacitor matched almost exactly and the transistor was within about 1%. Testing it in a real browser caught two bugs. One made every solve hang forever. The other made the picture of the device grow every time it redrew on high resolution screens. Both seem to be fixed now but I’ll be on the lookout for similar bugs. Then I tried something new, a transistor sitting on a layer of oxide, the way a lot of modern chips are built. It won’t solve yet. I narrowed it down to the oxide underneath the silicon, and I’m still wondering how breaks things. More on that next time. random picture cause im too lazy to start the servers again"}, {"post_id": 70075, "ts": "2026-09-18T12:25:44Z", "hours": 3.6847, "text": "Devlog #10 Since the last devlog, the simulator has gone from explaining things to letting you play with them. First, you can now compare runs. Every time you solve, the curve stays on the plot, so you can change one thing and see exactly what moved. The diode also got live sliders. Drag the doping or voltage and the answer updates while you drag. The 2D devices like the MOSFET are too slow for that, so I added a quick mode that uses a rougher grid. It’s a little less accurate, and I wrote down exactly how much. Then I built five guided lessons: a diode sitting at rest, a diode with voltage on it, a MOS capacitor, a transistor turning on, and what goes wrong when transistors get really small. Each lesson walks you through experiments step by step. The important part is that every claim a lesson makes is checked by a test against the solver I developed as part of the project. For example: if a lesson says “the current goes up,” a test runs it and makes sure it actually does. The biggest addition is a device builder. You stack layers of doped silicon however you want, and the simulator solves whatever you made. You can also save a design and load it again later. I agree I used AI for the frontend but I did not go VERY heavy on it. Only to build upon the frontend base I coded"}, {"post_id": 69600, "ts": "2026-09-17T12:07:30Z", "hours": 6.0439, "text": "Devlog #9 Since my last devlog, my solver and DEVSIM have started to cooperate. All ten benchmark devices match, the MOSFETs included, so the physics phase is done. THANK THE LORD Now I’m working on the part I care about most personally, which is making the simulator teach. The browser used to be a wall of knobs and plots with no explanation. Now every knob and every plot has a small “i” button. Click it and a drawer slides out with a plain explanation first, then the real equations for anyone who wants to go deeper. I wrote 35 of these explanations covering the physics, how the solver works, the devices, and how to read each plot. Then I checked them against the code. One credited the diodes with an accuracy number that actually belonged to a different device. Another claimed that one failed point in a sweep doesn’t ruin the rest, but the code stops at the first failure. The equations turned out to be hard to figure. The markdown reader treated the backslashes inside the math as its own escape characters and deleted them, so 92 bits of spacing and notation came out messed up. Now I pull the math out before the markdown step and put it back after. I also bundled the math and markdown libraries into the project, so the page works with no internet. Next up are band diagrams, which show the energy levels electrons can sit at. The page will draw them straight from the solved device."}, {"post_id": 68669, "ts": "2026-09-15T14:33:26Z", "hours": 1.7181, "text": "Devlog #8 Really tired today. Just ran a bunch of tests today and got a bunch of values ill sort through tomorrow."}, {"post_id": 67223, "ts": "2026-09-13T08:42:33Z", "hours": 3.7983, "text": "Devlog #7 Since my last devlog I have been teaching DEVSIM to run the same physics my own solver runs. Before this it was on a stripped down model set, so the two codes had similar geometry and nothing about mobility. Now it runs the real thing: doping dependent mobility, surface scattering at the oxide, velocity saturation, and proper Fermi-Dirac statistics. Getting there meant three more small lies. DEVSIM will easily chain a derivative through one kind of model and silently return zero for another. No error, no warning. My solver just diverged on the first step. It took a dump of every derivative on the device to see a column of exact zeros where numbers should have been. Then a field magnitude written as a square root of a square. Mathematically, sounds good but numerically it produces a nan wherever the field is exactly zero, which in a neutral chunk of silicon is nearly every edge. Then the surface mobility. I was refreshing it on every pass, forever. That is not a converging loop, that is two numbers chasing each other. The gate walk climbed to 0.50 V and then refused 0.55 V at every step size I gave it, down to a tenth of a millivolt. A failure that ignores step size is not a step size problem. I gave the refresh a stopping rule and re-ran it. Same answer to the last digit, just reachable now. The 1 micron device now agrees between the two codes to under 3.3 percent at low drain and under 1.3 percent at high drain, across four decades of current. The remaining blocker is not code. My browser is holding 15 of the machine’s 16 GB."}, {"post_id": 66590, "ts": "2026-09-12T13:16:11Z", "hours": 3.9589, "text": "Devlog #6 Im not going to say much this devlog. I hate Github CI errors with a passion and everybody that creates software relates."}, {"post_id": 65940, "ts": "2026-09-11T12:39:46Z", "hours": 2.6142, "text": "Devlog #5 Since the license was added, all my time has gone into one stubborn thing, that is getting DEVSIM simulator, to produce trustworthy MOSFET curves. It has been a long journey of small lies the application tells you. DEVSIM’s solve doesn’t take a device argument, so it solves everything you’ve ever built in that process at once. I was building one device per curve and leaving them around, so the second curve was dragging a finished device along with it and ruining the shared error check. Deleting each device when its curve finishes fixed a whole family of weird failures. Then I found the equilibrium solve was starting from all zeros, which on this device is 0.6 V off. I supply it from charge neutrality now. Same final output but far less trouble getting there. 2 of my own ideas turned out wrong and got reverted, but I wrote the measurements rather than dropping them. Capping the solver’s pass budget moved the current by 0.4%. Pinning the math library to one thread made a four second step take three minutes. Big Ouch. Currently, the 1 micron transfer curve at 50 mV of drain runs end to end and confirms with my simulator to within 0.23% above threshold. The 1 V curve still stalls at 0.4 V of gate, and I checked it properly rather than simply loosening the tolerance, because it turns out DEVSIM isn’t converging there at all. My own code, for contrast, does the same curve in 4.6 seconds."}, {"post_id": 65618, "ts": "2026-09-10T21:14:24Z", "hours": 1.4086, "text": "Dev log #4 After the last devlog I pushed and CI went red on all three Python versions. One test, one solver that would not converge. I guessed this before and fixed the wrong line. Last time I saw the residual and assumed a gate step was missing the convergence basin, so I put continuation on the gate ramp. That was a real improvement, just not this bug. This time I actually read the CI log The failing solve was the one before the ramp even starts. Gate at zero, drain already at 1 V, starting from a cold guess. So I measured it instead of guessing. Cold at 0 V drain takes 1 step. At 1 V it takes 22, and 12 of those get clipped by the step limiter, which means the solver is being dragged the whole way instead of converging properly The fix walks the bias in from zero using the continuation I already had. I regenerated the whole roll-off table through the new path and every digit came out identical. Only the path changed, not the answer. Also added the Open-Source MIT license, and cleaned the commit history."}, {"post_id": 65362, "ts": "2026-09-10T13:29:09Z", "hours": 2.1169, "text": "Dev log #3 I found a bug that made every 2D current in the simulator wrong by a factor of about 245, WAY too big. The cause, i believe, was one missing conversion. The code turns an internal number into a real current, and in 2D that conversion needs an extra length factor that I never included. In 1D it happened to be right, which is why it went un-noticed. I fixed it and then wrote a test that compares a 2D current against Ohm’s law, worked out by hand with no solver involved. This test was missing before. The reassuring part: I measure the turn-on voltage two completely different ways. They used to differ by 180 mV, which I didnt pay much attention to previously. After the fix they agree to about 2 mV. I did not tune anything to make that happen, so I might have to start believing in miracles. I also fixed two divide-by-zero crashes in the surface mobility code that were blocking a whole test combination. Also updated the README numbers and the decisions log. The full test suite is still running, and I will push to github once done."}, {"post_id": 64702, "ts": "2026-09-09T10:05:49Z", "hours": 15.2131, "text": "Devlog #2 Two things this stretch, and both started as “that’s odd” rather than “that’s broken.” First, the solver was crawling. Every step up in voltage cost more than the last, and past a point it just gave up. I traced it back to the starting guess, which was asking what makes glass electrically neutral. That question has no answer, because glass has no charges to balance in the first place. The solver was grinding away at something stupid before it ever got to the real problem. I gave it a proper starting answer instead, and the slowdown disappeared entirely. Second, I stopped trusting my tests and went to check them. I broke my own code ten different ways on purpose, one at a time, and watched to see which breakages the suite would catch. 9/10 failed, which is what I wanted. 1 slipped through clean, and that is the interesting one, because a test that cannot fail is not a test. Chasing the one that got away turned up a real bug hiding underneath it. Setting the voltage on the bottom contact was silently doing nothing at all. The code ran, reported success, and ignored the value. One line to fix, and it would have been very hard to find any other way, since nothing about the output looked wrong. Heads up! Light AI usage to debug the tests and break code to find errors"}, {"post_id": 54968, "ts": "2026-08-26T12:21:42Z", "hours": 35.26, "text": "DDSim Devlog I’m building a chip simulator from scratch. Today I got it to simulate a MOS capacitor, a silicon slab with a thin glass layer and a metal plate on top. It’s the heart of every transistor ever made. What I built: I stacked two grids together: a fine one near the silicon surface where all the action is, and a coarse one for the glass where nothing happens. Then I wrote one function that builds the whole sandwich. I wrote every test before the code. This kind of maths loves to give you wrong answers that look perfectly reasonable, so I only trust it when it matches something I can work out on paper. I’m happy that the “flatband” voltage came out exact to 15 decimal places. The threshold voltage matched the textbook to 0.13 millivolts, 50 times better than I needed. I also identified a few problems; the solver was getting slower and slower at high voltage, then giving up. The starting guess was asking “what makes glass electrically neutral?”, a meaningless question, since glass has no charges. I gave it a proper answer instead and the slowdown vanished completely. Then I deliberately broke my own code ten ways to check the tests would catch it. Nine got caught. One didn’t. Chasing that turned up a real bug: the bottom-contact voltage setting was silently doing nothing. One line to fix. Current Position: 1339 tests passing, everything clean, C-V curve working across all three regimes."}]...
|
Title: DDSim by @yaasshh | Stardance
Devlogs:
DDS Title: DDSim by @yaasshh | Stardance
Devlogs:
DDSim Devlog I’m building a chip simulator from scratch. Today I got it to simulate a MOS capacitor, a silicon slab with a thin glass layer and a metal plate on top. It’s the heart of every transistor ever made. What I built: I stacked two grids together: a fine one near the silicon surface where all the action is, and a coarse one for the glass where nothing happens. Then I wrote one function that builds the whole sandwich. I wrote every test before the code. This kind of maths loves to give you wrong answers that look perfectly reasonable, so I only trust it when it matches something I can work out on paper. I’m happy that the “flatband” voltage came out exact to 15 decimal places. The threshold voltage matched the textbook to 0.13 millivolts, 50 times better than I needed. I also identified a few problems; the solver was getting slower and slower at high voltage, then giving up. The starting guess was asking “what makes glass electrically neutral?”, a meaningless question, since glass has no charges. I gave it a proper answer instead and the slowdown vanished completely. Then I deliberately broke my own code ten ways to check the tests would catch it. Nine got caught. One didn’t. Chasing that turned up a real bug: the bottom-contact voltage setting was silently doing nothing. One line to fix. Current Position: 1339 tests passing, everything clean, C-V curve working across all three regimes.
Devlog #2 Two things this stretch, and both started as “that’s odd” rather than “that’s broken.” First, the solver was crawling. Every step up in voltage cost more than the last, and past a point it just gave up. I traced it back to the starting guess, which was asking what makes glass electrically neutral. That question has no answer, because glass has no charges to balance in the first place. The solver was grinding away at something stupid before it ever got to the real problem. I gave it a proper starting answer instead, and the slowdown disappeared entirely. Second, I stopped trusting my tests and went to check them. I broke my own code ten different ways on purpose, one at a time, and watched to see which breakages the suite would catch. 9/10 failed, which is what I wanted. 1 slipped through clean, and that is the interesting one, because a test that cannot fail is not a test. Chasing the one that got away turned up a real bug hiding underneath it. Setting the voltage on the bottom contact was silently doing nothing at all. The code ran, reported success, and ignored the value. One line to fix, and it would have been very hard to find any other way, since nothing about the output looked wrong. Heads up! Light AI usage to debug the tests and break code to find errors
Dev log #3 I found a bug that made every 2D current in the simulator wrong by a factor of about 245, WAY too big. The cause, i believe, was one missing conversion. The code turns an internal number into a real current, and in 2D that conversion needs an extra length factor that I never included. In 1D it happened to be right, which is why it went un-noticed. I fixed it and then wrote a test that compares a 2D current against Ohm’s law, worked out by hand with no solver involved. This test was missing before. The reassuring part: I measure the turn-on voltage two completely different ways. They used to differ by 180 mV, which I didnt pay much attention to previously. After the fix they agree to about 2 mV. I did not tune anything to make that happen, so I might have to start believing in miracles. I also fixed two divide-by-zero crashes in the surface mobility code that were blocking a whole test combination. Also updated the README numbers and the decisions log. The full test suite is still running, and I will push to github once done.
Dev log #4 After the last devlog I pushed and CI went red on all three Python versions. One test, one solver that would not converge. I guessed this before and fixed the wrong line. Last time I saw the residual and assumed a gate step was missing the convergence basin, so I put continuation on the gate ramp. That was a real improvement, just not this bug. This time I actually read the CI log The failing solve was the one before the ramp even starts. Gate at zero, drain already at 1 V, starting from a cold guess. So I measured it instead of guessing. Cold at 0 V drain takes 1 step. At 1 V it takes 22, and 12 of those get clipped by the step limiter, which means the solver is being dragged the whole way instead of converging properly The fix walks the bias in from zero using the continuation I already had. I regenerated the whole roll-off table through the new path and every digit came out identical. Only the path changed, not the answer. Also added the Open-Source MIT license, and cleaned the commit history.
Devlog #5 Since the license was added, all my time has gone into one stubborn thing, that is getting DEVSIM simulator, to produce trustworthy MOSFET curves. It has been a long journey of small lies the application tells you. DEVSIM’s solve doesn’t take a device argument, so it solves everything you’ve ever built in that process at once. I was building one device per curve and leaving them around, so the second curve was dragging a finished device along with it and ruining the shared error check. Deleting each device when its curve finishes fixed a whole family of weird failures. Then I found the equilibrium solve was starting from all zeros, which on this device is 0.6 V off. I supply it from charge neutrality now. Same final output but far less trouble getting there. 2 of my own ideas turned out wrong and got reverted, but I wrote the measurements rather than dropping them. Capping the solver’s pass budget moved the current by 0.4%. Pinning the math library to one thread made a four second step take three minutes. Big Ouch. Currently, the 1 micron transfer curve at 50 mV of drain runs end to end and confirms with my simulator to within 0.23% above threshold. The 1 V curve still stalls at 0.4 V of gate, and I checked it properly rather than simply loosening the tolerance, because it turns out DEVSIM isn’t converging there at all. My own code, for contrast, does the same curve in 4.6 seconds.
Devlog #6 Im not going to say much this devlog. I hate Github CI errors with a passion and everybody that creates software relates.
Devlog #7 Since my last devlog I have been teaching DEVSIM to run the same physics my own solver runs. Before this it was on a stripped down model set, so the two codes had similar geometry and nothing about mobility. Now it runs the real thing: doping dependent mobility, surface scattering at the oxide, velocity saturation, and proper Fermi-Dirac statistics. Getting there meant three more small lies. DEVSIM will easily chain a derivative through one kind of model and silently return zero for another. No error, no warning. My solver just diverged on the first step. It took a dump of every derivative on the device to see a column of exact zeros where numbers should have been. Then a field magnitude written as a square root of a square. Mathematically, sounds good but numerically it produces a nan wherever the field is exactly zero, which in a neutral chunk of silicon is nearly every edge. Then the surface mobility. I was refreshing it on every pass, forever. That is not a converging loop, that is two numbers chasing each other. The gate walk climbed to 0.50 V and then refused 0.55 V at every step size I gave it, down to a tenth of a millivolt. A failure that ignores step size is not a step size problem. I gave the refresh a stopping rule and re-ran it. Same answer to the last digit, just reachable now. The 1 micron device now agrees between the two codes to under 3.3 percent at low drain and under 1.3 percent at high drain, across four decades of current. The remaining blocker is not code. My browser is holding 15 of the machine’s 16 GB.
Devlog #8 Really tired today. Just ran a bunch of tests today and got a bunch of values ill sort through tomorrow.
Devlog #9 Since my last devlog, my solver and DEVSIM have started to cooperate. All ten benchmark devices match, the MOSFETs included, so the physics phase is done. THANK THE LORD Now I’m working on the part I care about most personally, which is making the simulator teach. The browser used to be a wall of knobs and plots with no explanation. Now every knob and every plot has a small “i” button. Click it and a drawer slides out with a plain explanation first, then the real equations for anyone who wants to go deeper. I wrote 35 of these explanations covering the physics, how the solver works, the devices, and how to read each plot. Then I checked them against the code. One credited the diodes with an accuracy number that actually belonged to a different device. Another claimed that one failed point in a sweep doesn’t ruin the rest, but the code stops at the first failure. The equations turned out to be hard to figure. The markdown reader treated the backslashes inside the math as its own escape characters and deleted them, so 92 bits of spacing and notation came out messed up. Now I pull the math out before the markdown step and put it back after. I also bundled the math and markdown libraries into the project, so the page works with no internet. Next up are band diagrams, which show the energy levels electrons can sit at. The page will draw them straight from the solved device.
Devlog #10 Since the last devlog, the simulator has gone from explaining things to letting you play with them. First, you can now compare runs. Every time you solve, the curve stays on the plot, so you can change one thing and see exactly what moved. The diode also got live sliders. Drag the doping or voltage and the answer updates while you drag. The 2D devices like the MOSFET are too slow for that, so I added a quick mode that uses a rougher grid. It’s a little less accurate, and I wrote down exactly how much. Then I built five guided lessons: a diode sitting at rest, a diode with voltage on it, a MOS capacitor, a transistor turning on, and what goes wrong when transistors get really small. Each lesson walks you through experiments step by step. The important part is that every claim a lesson makes is checked by a test against the solver I developed as part of the project. For example: if a lesson says “the current goes up,” a test runs it and makes sure it actually does. The biggest addition is a device builder. You stack layers of doped silicon however you want, and the simulator solves whatever you made. You can also save a design and load it again later. I agree I used AI for the frontend but I did not go VERY heavy on it. Only to build upon the frontend base I coded
Devlog #11 Since the last devlog, you can draw your own 2D devices, not just stack layers in a line. You draw rectangles of silicon and oxide, paint doping onto them, and place metal contacts along the edges. The simulator builds a grid that fits your drawing and solves it. Before it solves, it checks for mistakes and tells you what’s wrong in plain words: a piece of silicon with no contact touching it, a gate sitting right on silicon, or a shape too small for the grid to see. To make sure drawing works, I redrew the MOS capacitor and the transistor I already had and checked that they give the same answers. The capacitor matched almost exactly and the transistor was within about 1%. Testing it in a real browser caught two bugs. One made every solve hang forever. The other made the picture of the device grow every time it redrew on high resolution screens. Both seem to be fixed now but I’ll be on the lookout for similar bugs. Then I tried something new, a transistor sitting on a layer of oxide, the way a lot of modern chips are built. It won’t solve yet. I narrowed it down to the oxide underneath the silicon, and I’m still wondering how breaks things. More on that next time. random picture cause im too lazy to start the servers again
Devlog #12 Last time I left off with a transistor sitting on oxide that would not solve. I think ive fixed it. The silicon body had no contact touching it anywhere, so the solver had no idea what voltage that body should sit at. There is no single right answer, so it just wanders. That is not a bug I can fix, it is the physics of the thing, so now the simulator refuses that drawing up front and says why instead of grinding away at it. Then I went hunting for every other way someone could break it. I wrote something that tries every combination of settings the page can send and watched what fell over. A few things did: A gate metal with a work function no real metal has. Surface scattering asked for on a 1D device, which has no surface to scatter off. A shape so thin the grid ends up dividing by zero. All of them now get refused before the solve starts, with a sentence saying what to change. A few smaller ones. The device picture was drawn half a grid cell off, which threw off the line you drag across it to read values. That same line returned nothing at all where silicon meets oxide. And the explanations could load out of order and show you the wrong one. I think now i should wrap the version 1 of the project and finish polishing the frontend considering stardance is getting over soon. another lazy code pic btw cause i dont wanna open the servers again
Devlog #13 This one is all about the page itself. The physics didn’t change, but you’ll notice everything else did. I rebuilt the whole look from scratch. The old version was only friendly if you already knew semiconductors, and I want someone who has never heard of a diode to open it and get somewhere. Now it opens by asking you to pick a device: a diode, a MOS capacitor, a transistor, or draw your own. Each one comes with a sentence or two on what it is. Every number and switch has a little “i” next to it that explains it, and an empty plot tells you what it’s waiting for instead of sitting blank. Drawing your own device used to happen in a tiny box off to the side. Now it gets the whole screen. Some layers are so thin they basically disappeared, so I stretch the picture up and down until you can see them, and a label says when it’s stretched. Doped areas get a soft color so you can tell them apart. I also changed the font a couple of times. It started in a terminal style that felt cold. I tried one replacement and ended on Poppins, which just feels warmer. My favorite change is in the runs panel. It used to list your old runs as text, like “doping 1e17.” Now every solve saves a little picture of its own curve, and they all share the same scale, so you can see at a glance how each change moved the result. I switched the license to CC BY-NC so that it still stays technically open source but I own intellectual property for commercial use. Anyone can use it and change it for free, as long as they credit me and don’t sell it. A bit of AI usage in the frontend i will agree but not overkill in terms of it.
Devlog #14 Since then, most of my work has been getting DDSim ready for other people to use. First I cleaned up the controls. Some sliders and number boxes let you pick values that made the solver fail, which just showed up as a red error. I went through the diode, the MOS capacitor, the transistor and the draw-your-own device and found the range where each setting actually works. The sliders now stay inside those ranges, so a beginner can’t break things by accident. Then I cleaned up the code. I deleted about 2,400 lines of comments that just repeated what the code already said and kept the ones that explain something nessessary. Next came the writing. The site has about 40 short articles that explain the physics, and a lot of them sounded stiff, so I rewrote all of them. I did the same for the project docs, and on the way I found a few places where the docs no longer matched what the code does, so I fixed those too. Now I’m working on putting it online. I picked Fly.io to host it, and I’m hoping to get a free custom name. Since anyone will be able to use it, I’m adding some safety limits first. Only a couple of solves can run at the same time, old results get cleared out after a while, and a solve that runs too long gets stopped with a message explaining why. I tested each limit by breaking it on purpose to make sure the test catches it. It isn’t live yet, but it’s close! [lazy pic, i dont wanna open server again :( ]
Devlog #15 DDSim is FINALLY deployed and live! You can try it at ddsim.fly.dev Getting it online took one extra step. The cheap shared server was too slow: the hardest transistor solve takes about 50 seconds on my laptop and would have taken around 7 minutes there. That’s past the 5-minute limit I set, so it would have been stopped every time. I moved it to a faster server, and now it finishes in under a minute. Once it was up, I found a bug. When every contact on a transistor was at the same voltage, the picture still drew current flowing through it. That’s impossible, because with no voltage difference nothing moves. I fixed it, and now the page says “no current flows” instead of showing an empty plot with no explanation. Then I rewrote the README from scratch. The old one was over 500 lines and way too dense. The new one is about 200 lines, mostly screenshots from the live site plus a few tables, so someone can see what the project does in a couple of minutes. While doing that, I caught a mistake. One number in my results table didn’t match the graph right next to it. I reran the full simulation, which took 20 minutes, and fixed the table so it matches. Last, I took the deployment files out of the public code. Anyone who downloads it gets everything they need to run it on their own computer, but not the setup for putting it online. Next up, I might be thinking of getting a custom name for this simulator and my other atom simulator. If anyone knows where I can get free domains, lmk in the comments
Devlog #16 Now that DDSim is live, my next goal is to make it better than DEVSIM, a free, open-source simulator a lot of people already use. “Better” doesn’t count unless I can measure it, so I planned out the next 11 stages of the project, and the first one is a scoreboard. The scoreboard runs both simulators on the same set of devices and compares them in four ways: how often each one finishes a solve without crashing, how accurate the answers are, how fast they run, and what each one can do at all. Some of these runs take hours, and my laptop ran out of memory partway through, so I paused them. I’ll post the results once they’re done, even the parts where DEVSIM is better than mine. While building the accuracy check, I found a bug in my own math. Sometimes it reported numbers that didn’t make physical sense, so now it throws those out instead of trusting them. I also went through all the style files for the website. They’re about a third smaller now, and I checked that the page still looks exactly the same. Then I found a small bug that had been there all along. The little “i” buttons that explain each setting were supposed to turn blue when you hover over them, but a different style rule was overriding it. Last, I cleaned up the README again. The pictures are centered now, I took out the GIF, and I rewrote some of the text so it reads more naturally.
Devlog #17 I restarted the scoreboard runs, and before looking/mentioning any of the results I checked my own setup for DEVSIM. That showed a few bugs on my side. My starting guess for the voltage inside the device did a log of zero on heavily doped chips, so DEVSIM crashed INSTANTLY. I also wasn’t giving it enough steps to settle on some devices. I fixed both, because it wouldn’t be fair to count my mistakes as DEVSIM’s. I also cleaned up the code, I tried to ship all progress so far but there was just too much AI (guilty) so I am working on redoing the python, css and javascript code again mainly from scratch. (The image shows all the values from the DDSim tests)
Devlog #18 The robustness runs are almost done. Robustness checks a simple concept, if I give the solver a device cold, with no warm-up, does it actually finish? I ran 200 test cases through my solver and through DEVSIM, each in a few different setups. The robustness numbers aren’t final yet. One DEVSIM result is still missing. The first time my laptop ran out of memory, and the second time it went to sleep overnight, so it’s running again now. I also found out DEVSIM acts much differently depending on how many CPU threads it gets. With only one, some solves failed or took forever which was kinda interesting to see. On the cleanup side, I turned on the strictest type checking across the whole project and fixed what it found. Every color on the website now comes from one file. I also deleted a bunch of old files nobody used and cut the README down.
Devlog #19 The speed and robustness numbers are now saved on the scoreboard. On the first 8 benchmarks, my solver takes about 1.6x less time per bias point than DEVSIM. I also added a test that reads the README and fails if the README claims anything the data doesn’t back up (I hate getting 100% vibe code assumptions on my readme btw). I renamed a lot of variables across the code (to pass the 30% ai rule that im apparently violating) to shorter names. That kind of change can break the tests if some of the variables reference each other across multiple files, so I checked that python turns the old code and the new code into exactly the same instructions. Thankfully it did. I also moved all the settings into one file. Things like how many tries the solver gets, how small the mesh can get, and the server limits used to be scattered across about 20 files. I checked that every single value stayed exactly the same after the move. I also deleted the last few leftover comments. Then I pushed everything. The tests ran on three Python versions, and 2,723 of 2,724 passed. The one that failed was a browser test on Python 3.11 that waited too long for the page to load. The same test passed on the other two versions, so it’s probably just a slow test machine, but I’m going to rerun it to make sure. My laptop ran out of memory again, which stopped me from finishing the type hints in the tests. That’s next, once I’m not running a bunch of other stuff at the same time.
Devlog #20 In this devlog i firstly fixed up the website. It now has a little icon in the browser tab, a terms page, a privacy page and a footer with a contact button. The icon didn’t show up on the live site at first, so I fixed that too. Then I started the next phase, which is all about fixing temperature related stuff. A lot of the calculations of the simulator took room temperature which might have led to some wrong calculations, so I’ve been fixing that. The gate’s energy level was stuck at its room-temperature value. it was a real bug and its fixed now. When the silicon gets hotter, electrons now max out at a lower speed, just like in real-life chips. From 250 to 400 K, the junction’s built-in voltage matches the textbook formula. From 300 to 400 K, the diode’s leakage current stays within 0.3% of the formula. I also added a fixed charge that sits where the silicon meets the oxide layer. Real chips always have some, and it changes the voltage where a transistor turns on. Next up are the big jobs. A long DEVSIM run is still going, and after that I’ll test the temperature effects on a full 2D transistor. I also still need to put the website changes live.
Devlog #21 Since the last devlog I finished most of the temperature phases. First I compared the diode at 400 K against DEVSIM. I saved that result so my other tests compare with it from now on. Then I added two new sliders to the website. One sets the temperature, from 200 to 500 K. The other sets the fixed charge where the silicon meets the oxide. I picked both ranges by running the simulator across them. Each slider also has a short lesson that explains what it does. While I was writing those, I found some broken math formatting in the temperature lesson and fixed it. The biggest addition is freeze-out. To make silicon conduct, we add extra atoms that give up electrons. When it gets really cold, those atoms stop giving up their electrons. Before, my simulator assumed they always did. Now there’s a switch for it, and it works. At 100, 200 and 300 K it matches the textbook formula almost exactly. I also checked that a plain frozen silicon bar still follows Ohm’s law, and that the capacitance results still work at 150 K.
Devlog #22 The long DEVSIM run finally finished. It took about 6 hours and matched the expert result almost exactly, which closes out the scoreboard phase. Then I started the next phase, which is about AC. That essentially means wiggling the voltage back and forth and watching how the device reacts at different speeds. Before, my simulator could only handle super slow wiggles, or fast ones where I froze some electrons by hand. Now it can handle any speed. To get there, I first taught the simulator how fast electrons and holes pile up or drain away over time. Then I wrote the part that works out how much current flows into each contact when one of them gets wiggled. I tested it on diodes, since they have textbook formulas to compare against. A long diode matched within about 1%, and a short one within 1.3%. Along the way I found a bug where my mesh maker gave up on very long devices, so I fixed that too. The MOS capacitor is giving me some trouble. At really slow wiggles, the math needs more precision than normal computer numbers have, so the answers came out wrong by up to 46%. Fast wiggles work fine. Right now I’m trying a trick where I make the electrons react faster, so the slow case happens at a speed the computer can handle. Below are some of the DEVSIM scoreboard values
Devlog #23 The trick for the MOS capacitor worked. Making the electrons react faster put the slow wiggles at a speed the computer can handle, and the answers came out right. That FINALLY finished the AC phase. I also added noise, a tiny random jitter in current that every device has. Next I added time. Now its possible to flip a diode from on to off and watch it recover. When you switch a diode off, it keeps conducting for a moment because of all the charge stored inside it. I compared that against DEVSIM, and our results were within 0.03% of each other which is quite frankly something im really proud off. Then I added a feature where the simulator shows how inaccurate it may be. It now checks its own answer against a finer mesh and puts a little error bar on every point in the plots. It can also improve its own mesh by adding points only where they’re needed. On 5 of my 8 test devices it hit the target accuracy with fewer points than my hand-made meshes. I was aiming for around 6, so that’s still doable. The newest addition is a bipolar transistor, where a small current into the middle layer controls a much bigger current through the whole device. I built a simple 1D version and a more realistic 2D one. The 1D version matches the textbook formula to within 0.03%. The best part is that its gain drops off at both very low and very high current, the way real transistors do, and I never told it to. It figured that out from the physics.
Ships:
I built DDSim, a program that simulates what happens inside the tiny parts that computer chips are made of, ie diodes, capacitors and transistors. You describe a device by its shape and which parts of the silicon have extra electrons or holes. DDSim then works out how those electrons and holes move, and draws the current and voltage curves. I didn’t fit anything to make the graphs look right. Everything comes straight from the physics equations. (NOTE: ITS STILL VERY CLUNKY SO ITS NOT GOING TO BE PERFECT AS OF RIGHT NOW. IF YOU FACE ANY TROUBLES IM REALLY SORRY) To make sure everything accurate, I checked it against textbook formulas and against DEVSIM, a simulator other people wrote. They agree to within a few percent, and the project has about 2,700 automated tests. You can try it in your browser at ddsim.fly.dev. Pick a device, press solve, and watch the answer draw itself. Every button and graph has a little “i” that explains what it means, and there are guided lessons if you’re new to this. It’s a school-level instrument, not a chip design tool. Below about 50 nanometers the physics it uses stops being accurate, so I didn’t go beyond that...
|
1792853795.6203756
|
1792940195.6203756
|
|
63084
|
My own site! by @Nivedh_Govil | Stardance
|
Nivedh_Govil
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T16:46:02Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I have made my own personal website, and I’m really happy that I made one because I have been wanting this for a really long time. Now that I have learned the basics of web development, I got to see my dream come true. Something challenging was the CSS and the JavaScript so I used a bit of AI for help on that.", "repo": "https://github.com/NivedhGovil/nivedh-website", "demo": "https://nivedhgovil.github.io/nivedh-website/"}]...
|
[{"post_id": 73160, "ts": "202 [{"post_id": 73160, "ts": "2026-09-24T14:49:02Z", "hours": 2.5636, "text": "Completed my personal website! After several hours of coding in VSCode, I am joyful to say that it’s ready. The only thing that’s left is for you to see it! Features: Home: About the website and the main nav bar. Engineering: My circuits, hardware projects, PCBs, CAD drawings. Art: Some of my drawings. Literary: My essays, stories, articles and write-ups published About: About me"}, {"post_id": 72261, "ts": "2026-09-22T15:26:22Z", "hours": 0.6508, "text": "Making one of the final changes to my website! Most of the work is done, yet some key points are left. Today I worked on linking the tabs better, improving the individual webpages, and fixing the navigation bar. Learnt about the meta property tag! :D"}, {"post_id": 71778, "ts": "2026-09-21T15:07:48Z", "hours": 0.6833, "text": "Right now I’m making my page about a current project I’m working on. It’s about making a robot. I’m planning to make two robots: one is the leader and the other is the follower. Whatever movement the leader does, the follower will also do. I’m still currently making the robot so as I make it I will also update the page about the robot on my website. I’m thinking about including a description of the robot, a few photos, a video of it in action, some code snippets, and a link to its GitHub repository. Learning how to make buttons in HTML for this webpage. If I can, I’ll also add a photo of my entire team who is building the robots."}, {"post_id": 71307, "ts": "2026-09-20T16:35:50Z", "hours": 0.8908, "text": "Making the About Me section. Will have my skills, achievements, personality, and a brief introduction to my website. I experimented with various HTML and CSS tags, like & and . Trying to make a menu/ mind map of my personality and skills. I think we use frames for that… Once it’s done, I will move on to making my individual skill pages. Stay tuned for more devlogs! :D"}, {"post_id": 70059, "ts": "2026-09-18T11:24:18Z", "hours": 0.4542, "text": "A website showing my hobbies, personality, skills and more fun things. :D"}]...
|
Title: My own site! by @Nivedh_Govil | Stardance
Title: My own site! by @Nivedh_Govil | Stardance
Devlogs:
A website showing my hobbies, personality, skills and more fun things. :D
Making the About Me section. Will have my skills, achievements, personality, and a brief introduction to my website. I experimented with various HTML and CSS tags, like & and . Trying to make a menu/ mind map of my personality and skills. I think we use frames for that… Once it’s done, I will move on to making my individual skill pages. Stay tuned for more devlogs! :D
Right now I’m making my page about a current project I’m working on. It’s about making a robot. I’m planning to make two robots: one is the leader and the other is the follower. Whatever movement the leader does, the follower will also do. I’m still currently making the robot so as I make it I will also update the page about the robot on my website. I’m thinking about including a description of the robot, a few photos, a video of it in action, some code snippets, and a link to its GitHub repository. Learning how to make buttons in HTML for this webpage. If I can, I’ll also add a photo of my entire team who is building the robots.
Making one of the final changes to my website! Most of the work is done, yet some key points are left. Today I worked on linking the tabs better, improving the individual webpages, and fixing the navigation bar. Learnt about the meta property tag! :D
Completed my personal website! After several hours of coding in VSCode, I am joyful to say that it’s ready. The only thing that’s left is for you to see it! Features: Home: About the website and the main nav bar. Engineering: My circuits, hardware projects, PCBs, CAD drawings. Art: Some of my drawings. Literary: My essays, stories, articles and write-ups published About: About me
Ships:
I have made my own personal website, and I’m really happy that I made one because I have been wanting this for a really long time. Now that I have learned the basics of web development, I got to see my dream come true. Something challenging was the CSS and the JavaScript so I used a bit of AI for help on that....
|
1792814003.7525043
|
1792900403.7525043
|
|
46712
|
robotic arm by @thomas_thomas | Stardance
|
thomas_thomas
|
1
|
27.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T16:39:00Z", "hours": 27.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "It’s a completely costum 3 degrees of freedom robotic arm. It is based on an Arduino and can be controlled from your PC. I designed every single part of it myself, even designing the cycloidal drives myself. Especially the electronics were hard and often made me lose motivation (and money). But the cycloidal drive design wasnt easy as well at first. I learned many crucial skills (with this being my first electronics project): -Soldering -Proper 3d Printing and assembly oriented CAD design -How Stepper motors, Electrical circuits and many tools actually work -Documenting your work -Intuition as to what might work and what wont So may more things! This was my entry project into the world of engineering and I have so many more prejcts in mind that I would like to build someday.", "repo": "https://github.com/pommjes/robotic-arm", "demo": ""}]...
|
[{"post_id": 73168, "ts": "202 [{"post_id": 73168, "ts": "2026-09-24T15:01:07Z", "hours": 0.6667, "text": "Working on the finishing touches rn. Just made this baseplate, which I dont have myself since I made mine out of a piece of wood. Its much easier that way but in case anyone doesnt have any wood or no tools for drilling etc I made this baseplate for them."}, {"post_id": 70714, "ts": "2026-09-19T17:15:57Z", "hours": 2.9667, "text": "This is getting pretty hard now… After basically finishing the rough hardware I started finishing the software. Added a zero function which I have to use for now since the homing isnt accurate at all yet and you basically always have to home it manually (using a level lol). But the main issue is the target point function since the arm seems to make up some random data and drifts like 20(!!) cm from the target point while being spot on on the other axis. But I’ll get there in the next few days… And guess what youre getting another screenshot bcs the real arm still looks like shit:"}, {"post_id": 69718, "ts": "2026-09-17T17:17:54Z", "hours": 1.5664, "text": "Finally installed a Nema 17 as the base motor for the arm. The old Nema 14 often struggled to move the correct number of steps due to too much load. The old one had 12Ncm while the new one has 45Ncm :D. I obviously dont have anymore problems with the base motor missing steps… Also the new base with the integrated magnet holder and bearing ring is way more practical than the old design. You wont notice a difference visually and its ugly af with all the cables so yall are getting another rendering:"}, {"post_id": 66780, "ts": "2026-09-12T17:45:13Z", "hours": 1.0597, "text": "Put all the mounts for the magnets and hall effect sensors on the main parts so less printing and no glueing is needed. Posting devlogs more frequently now"}, {"post_id": 66514, "ts": "2026-09-12T11:04:53Z", "hours": 2.0667, "text": "Im going to upgrade the stepper of joint 1 from a nema14 to a nema17. The nema14 just didnt have enough torque to spin the arm without shaking a lot and skipping like half of the steps… This is the new motor case for mounting it. It will now have the lower bearing cap attached to it for easyer printing and assembly. Also finished installing and connecting all the hall effect sensors to the arm and every joint is homeable now! Next will be installing the new motor and then calibrating the software and if everything goes according to plan (it wont) i’ll be done!!"}, {"post_id": 66030, "ts": "2026-09-11T15:56:14Z", "hours": 0.7333, "text": "Did a cfd analysis of the housing for my arduino and the cnc shield. It was pretty hard to figure out but also very fun and most of all a valuable skill to learn. This might be a bit overkill but it actually helped me improve the case for better airflow over the heatsinks of the motor drivers to ensure keeping them cool for when the arm will be working for longer periods of time and under higher loads. For anyone interested I did this in Simscale its very easy to use and you get 10 free simulations!"}, {"post_id": 65026, "ts": "2026-09-09T20:36:09Z", "hours": 10.3181, "text": "Worked a lot on the homing of my arm. Did a lot of software first off. Adding the homing buttons to the GUI, adding the commands which will be send to the arduino and adding the homing feature on the arduino itself were a lot of work but we got there in the end! Also added a section for error messages and stuff at the bottom. For the hardware side I glued all the hall effect sensor in place along with the magnets needed for the sensors. I glued them on but i plan on putting designated spots on the arm for the magnets and sensors so you wont have to glue them on if you decide to build the arm yourself. I then had to build a small board to allow all the sensors to recieve power from the cnc shield. I now also started connecting all the sensors to the arduino which takes a lot longer than expected actually. But ive been successful so far and both of the connected joints work as intended right now. Next up i have to finish connecting everything and then finish so software side so the arms get to the correct position once they’re homed. This is a lot for one devlog but its hard to define clear borders in this project since everything is connected with everything else so you are never “done” with one subproject because its only a small part and wont work without me working on the next thing. Also didnt add any pics of the arm with the sensors since you cant really notice a difference compared to the older photo on here except a few more wires…"}, {"post_id": 53970, "ts": "2026-08-24T17:58:02Z", "hours": 1.8, "text": "I cant belive I’m typing this, but it works. After intensively working on the software side the last few days while waiting for the last hardware pieces needed I assembled everything today. I put on the jumper caps to enable microstepping and installed the new cables for joint 3. When everything was done i just had to do a tiny bit of troubleshooting but after that it just worked! I can control all the joints and the software also doesnt really have any issues. The only thing that doesn’t fully work yet is the target point feature, since i cant home the arm yet. Some magnets will arrive in a few days and i’ll use them with hall effect sensors to home the arm. Then it’ll hopfuly work just as it should and i can get to documenting this whole thing for you guys!"}, {"post_id": 52250, "ts": "2026-08-22T10:52:49Z", "hours": 6.0089, "text": "Advanced the software side quite a bit. Waiting for some new parts rn so I used the time to finish the gui for now and calculate everything i need to to send to the arduino! You can now input the three values making up the target point and hit calculate. Then the angles of the three joints relative to their home position as well as the delta of the angles, which is the value which the joints need to move in order to reach the target position, are displayed below. These are the values which are going to be send to the arduino. I also added the function to ignore physically impossible positions of the arm and only show the possible ones. In theory I only have to add some kind of interface to send data to the arduino and the software would be done!"}, {"post_id": 45313, "ts": "2026-08-11T17:59:37Z", "hours": 1.41, "text": "Wrote the code to controll all 3 joints.did this to prepare and pass time while i wait for my cnc shield. once it arrives ill hopefully be able to fully control my arm for the first time ever! No new features (apart from the 3rd joint) where added, but i cleaned up the code from the last version a bit and removed some unused sections. I also added lots of comments to make editing and extending the code easier in the future."}, {"post_id": 45139, "ts": "2026-08-11T13:14:44Z", "hours": 0.3, "text": "New Joint 1 -> Base interface without wobbling like the one before."}]...
|
Title: robotic arm by @thomas_thomas | Stardance
Title: robotic arm by @thomas_thomas | Stardance
Devlogs:
New Joint 1 -> Base interface without wobbling like the one before.
Wrote the code to controll all 3 joints.did this to prepare and pass time while i wait for my cnc shield. once it arrives ill hopefully be able to fully control my arm for the first time ever! No new features (apart from the 3rd joint) where added, but i cleaned up the code from the last version a bit and removed some unused sections. I also added lots of comments to make editing and extending the code easier in the future.
Advanced the software side quite a bit. Waiting for some new parts rn so I used the time to finish the gui for now and calculate everything i need to to send to the arduino! You can now input the three values making up the target point and hit calculate. Then the angles of the three joints relative to their home position as well as the delta of the angles, which is the value which the joints need to move in order to reach the target position, are displayed below. These are the values which are going to be send to the arduino. I also added the function to ignore physically impossible positions of the arm and only show the possible ones. In theory I only have to add some kind of interface to send data to the arduino and the software would be done!
I cant belive I’m typing this, but it works. After intensively working on the software side the last few days while waiting for the last hardware pieces needed I assembled everything today. I put on the jumper caps to enable microstepping and installed the new cables for joint 3. When everything was done i just had to do a tiny bit of troubleshooting but after that it just worked! I can control all the joints and the software also doesnt really have any issues. The only thing that doesn’t fully work yet is the target point feature, since i cant home the arm yet. Some magnets will arrive in a few days and i’ll use them with hall effect sensors to home the arm. Then it’ll hopfuly work just as it should and i can get to documenting this whole thing for you guys!
Worked a lot on the homing of my arm. Did a lot of software first off. Adding the homing buttons to the GUI, adding the commands which will be send to the arduino and adding the homing feature on the arduino itself were a lot of work but we got there in the end! Also added a section for error messages and stuff at the bottom. For the hardware side I glued all the hall effect sensor in place along with the magnets needed for the sensors. I glued them on but i plan on putting designated spots on the arm for the magnets and sensors so you wont have to glue them on if you decide to build the arm yourself. I then had to build a small board to allow all the sensors to recieve power from the cnc shield. I now also started connecting all the sensors to the arduino which takes a lot longer than expected actually. But ive been successful so far and both of the connected joints work as intended right now. Next up i have to finish connecting everything and then finish so software side so the arms get to the correct position once they’re homed. This is a lot for one devlog but its hard to define clear borders in this project since everything is connected with everything else so you are never “done” with one subproject because its only a small part and wont work without me working on the next thing. Also didnt add any pics of the arm with the sensors since you cant really notice a difference compared to the older photo on here except a few more wires…
Did a cfd analysis of the housing for my arduino and the cnc shield. It was pretty hard to figure out but also very fun and most of all a valuable skill to learn. This might be a bit overkill but it actually helped me improve the case for better airflow over the heatsinks of the motor drivers to ensure keeping them cool for when the arm will be working for longer periods of time and under higher loads. For anyone interested I did this in Simscale its very easy to use and you get 10 free simulations!
Im going to upgrade the stepper of joint 1 from a nema14 to a nema17. The nema14 just didnt have enough torque to spin the arm without shaking a lot and skipping like half of the steps… This is the new motor case for mounting it. It will now have the lower bearing cap attached to it for easyer printing and assembly. Also finished installing and connecting all the hall effect sensors to the arm and every joint is homeable now! Next will be installing the new motor and then calibrating the software and if everything goes according to plan (it wont) i’ll be done!!
Put all the mounts for the magnets and hall effect sensors on the main parts so less printing and no glueing is needed. Posting devlogs more frequently now
Finally installed a Nema 17 as the base motor for the arm. The old Nema 14 often struggled to move the correct number of steps due to too much load. The old one had 12Ncm while the new one has 45Ncm :D. I obviously dont have anymore problems with the base motor missing steps… Also the new base with the integrated magnet holder and bearing ring is way more practical than the old design. You wont notice a difference visually and its ugly af with all the cables so yall are getting another rendering:
This is getting pretty hard now… After basically finishing the rough hardware I started finishing the software. Added a zero function which I have to use for now since the homing isnt accurate at all yet and you basically always have to home it manually (using a level lol). But the main issue is the target point function since the arm seems to make up some random data and drifts like 20(!!) cm from the target point while being spot on on the other axis. But I’ll get there in the next few days… And guess what youre getting another screenshot bcs the real arm still looks like shit:
Working on the finishing touches rn. Just made this baseplate, which I dont have myself since I made mine out of a piece of wood. Its much easier that way but in case anyone doesnt have any wood or no tools for drilling etc I made this baseplate for them.
Ships:
It’s a completely costum 3 degrees of freedom robotic arm. It is based on an Arduino and can be controlled from your PC. I designed every single part of it myself, even designing the cycloidal drives myself. Especially the electronics were hard and often made me lose motivation (and money). But the cycloidal drive design wasnt easy as well at first. I learned many crucial skills (with this being my first electronics project): -Soldering -Proper 3d Printing and assembly oriented CAD design -How Stepper motors, Electrical circuits and many tools actually work -Documenting your work -Intuition as to what might work and what wont So may more things! This was my entry project into the world of engineering and I have so many more prejcts in mind that I would like to build someday....
|
1792853266.0454397
|
1792939666.0454397
|
|
33788
|
SOS Button by @SohamKaran | Stardance
|
SohamKaran
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T16:27:43Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made a sos button which can send your live location or call on the saved number it can be helpful for kids and any other person who is in danger", "repo": "https://github.com/sohamboyythrdh6/SOS-button", "demo": ""}]...
|
[{"post_id": 73201, "ts": "202 [{"post_id": 73201, "ts": "2026-09-24T16:24:51Z", "hours": 4.6919, "text": "after getting all the parts i started prototyping it on a bread board and after that i orderd the pcb and soldering everything after that i uploaded the code and it is working great"}, {"post_id": 31293, "ts": "2026-07-19T16:13:41Z", "hours": 6.0347, "text": "i found that some children or anyone not safe to went out so i decided to make a project which felt them safer so i made this at first i watch some YouTube tutorials then i go with some my opinion parts and i started drawing the sch after that i design the pcb and after working on the hardware I started writing code for this project . later i write the github repo i started with the bom and then i write the readme and at last upload all other requard file in it now i am finished and rady to ship it."}]...
|
Title: SOS Button by @SohamKaran | Stardance
Devl Title: SOS Button by @SohamKaran | Stardance
Devlogs:
i found that some children or anyone not safe to went out so i decided to make a project which felt them safer so i made this at first i watch some YouTube tutorials then i go with some my opinion parts and i started drawing the sch after that i design the pcb and after working on the hardware I started writing code for this project . later i write the github repo i started with the bom and then i write the readme and at last upload all other requard file in it now i am finished and rady to ship it.
after getting all the parts i started prototyping it on a bread board and after that i orderd the pcb and soldering everything after that i uploaded the code and it is working great
Ships:
i made a sos button which can send your live location or call on the saved number it can be helpful for kids and any other person who is in danger...
|
1792853476.7651994
|
1792939876.7651994
|
|
63865
|
Discord Bot by @inatlusnamor | Stardance
|
inatlusnamor
|
1
|
6.0
|
74
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T15:41:55Z", "hours": 6.0, "multiplier": 10.91, "payout": 74, "blessing": "neutral", "text": "I made a discord bot that is integrated into my website. The discord bot starts up with a slash command such as /add-gallery then it takes the parameters then it takes the current cards and appends it onto the end of it and adds the json to the github repo. After that the website adds the card without me or my members having to touch the website. What challenged me was making the pipeline from discord to github seamless and without errors but I did it. I am proud of making something that I have never seen online or anywhere. You can see the results of it in the website! I don’t really have the picture here But you can see it in the devlogs because I’m at school lol!", "repo": "https://github.com/Romanhery/hackclub-discord-bot", "demo": "https://discord.gg/8ZpQntd3Y"}]...
|
[{"post_id": 73146, "ts": "202 [{"post_id": 73146, "ts": "2026-09-24T14:13:54Z", "hours": 0.67, "text": "Devlog #4 *So previously I was struggling to get my embeds and my guides command to work but now I have officially made these work and they work! Updated List of Features /add-gallery to add a project to the gallery page /add-guide to add a new guide card After the slash commands an embed is sent and it looks very good!"}, {"post_id": 72866, "ts": "2026-09-23T21:53:10Z", "hours": 0.2892, "text": "I made IT WORK now I officially made the embed work for the addition to the gallery Im in school so I dont have access to discord to show it but once i go home Im gonna add a screenshot! But here is the code for it"}, {"post_id": 72531, "ts": "2026-09-23T04:44:25Z", "hours": 0.6836, "text": "I am still working on getting the embed to show up after the command has happened still working to fix it ! I tried some things that I think will work wish me luck! (PS) Still testing these are new pictures"}, {"post_id": 72521, "ts": "2026-09-23T03:55:40Z", "hours": 0.5669, "text": "So Right now I am stuck trying to make it so that after I uplaod my project to the discord bot then it sends to my websites gallery AND and it sends an embed so that it looks cool and it is a gallery inside of the discord server. (PS) These pictures are just me testing embed none of them have worked lol! Still tryna figure it out maybe it might because it takes too much time and its disconnecting?"}, {"post_id": 72450, "ts": "2026-09-23T00:25:25Z", "hours": 3.4286, "text": "Adding new feature on my discord bot! This is just a post to log the past hours I forgot to log but I am ready to add a new feature to my discord bot!"}]...
|
Title: Discord Bot by @inatlusnamor | Stardance
D Title: Discord Bot by @inatlusnamor | Stardance
Devlogs:
Adding new feature on my discord bot! This is just a post to log the past hours I forgot to log but I am ready to add a new feature to my discord bot!
So Right now I am stuck trying to make it so that after I uplaod my project to the discord bot then it sends to my websites gallery AND and it sends an embed so that it looks cool and it is a gallery inside of the discord server. (PS) These pictures are just me testing embed none of them have worked lol! Still tryna figure it out maybe it might because it takes too much time and its disconnecting?
I am still working on getting the embed to show up after the command has happened still working to fix it ! I tried some things that I think will work wish me luck! (PS) Still testing these are new pictures
I made IT WORK now I officially made the embed work for the addition to the gallery Im in school so I dont have access to discord to show it but once i go home Im gonna add a screenshot! But here is the code for it
Devlog #4 *So previously I was struggling to get my embeds and my guides command to work but now I have officially made these work and they work! Updated List of Features /add-gallery to add a project to the gallery page /add-guide to add a new guide card After the slash commands an embed is sent and it looks very good!
Ships:
I made a discord bot that is integrated into my website. The discord bot starts up with a slash command such as /add-gallery then it takes the parameters then it takes the current cards and appends it onto the end of it and adds the json to the github repo. After that the website adds the card without me or my members having to touch the website. What challenged me was making the pipeline from discord to github seamless and without errors but I did it. I am proud of making something that I have never seen online or anywhere. You can see the results of it in the website! I don’t really have the picture here But you can see it in the devlogs because I’m at school lol!...
|
1792814081.956109
|
1792900481.956109
|
|
51038
|
dagit by @Lxsh-S | Stardance
|
Lxsh-S
|
2
|
14.0
|
135
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T15:40:40Z", "hours": 1.0, "multiplier": 8.6, "payout": 5, "blessing": "neutral", "text": "The ony changes we have made is fix some issues with the way we fetch data from github. I wouldn’t have shipped this but I currently have 34 stardust and urgently need 1 to buy some electronics for my other project :). Please be kind", "repo": "https://github.com/lxsh-S/dagit", "demo": "https://github.com/lxsh-S/dagit/releases"}, {"ship_num": 2, "ts": "2026-08-26T15:21:21Z", "hours": 13.0, "multiplier": 10.32, "payout": 130, "blessing": "neutral", "text": "DAGIT SHIP1 I have built a terminal TUI git visualizer that beautifully displays your git repository on the terminal. Challenging part Dagit has four small sections [left panel/visualizer/status panel/logs] . I first thought there would be no resizing issues because I’m using bubble-tea and built all there sections’ skeletons, as bubble-tea doesn’t automatically handle the resize event(got to know later). I manually tried to fix it in my own broken ways and found somewhat of a solution that feels and looks good A Breakdown of the project dagit refuses to launch if we don’t open it inside a git repo. We fetch all the data by running git commands. Currently in the left panel we have the following information: * Repo name * The repo's owner name * Current branch * The url of the remote In the vizualizer: * hash of the commit * Reference * the committer name * The time of the commit * We also beautify the graph and show it in this section Log section: * Hash of commit * Commit message * Committer name Status panel: * Modified, staged files are shown here The user can toggle between the visualizer and the status panel using v The user can also choose between my predefined tick rates [500ms/1s/3s/5s/10s] . By default the tick rate is set to 1sec Proud Of how quickly I have understood the git docs and used it to build this project that makes git look so much better for the newbies. Also that I have finally made a project that is not very complicated for the user to use like gos was. lmao Also handling resize events was a bit of headache and it feels so much better now. I feel proud because of that too :shy Do we need to set something before? No, but if you wanna install it using go , you need to have go installed :) Note: The releases page only has a darwin(macos) and linux version. So I recommend using wsl on windows to enjoy the beauty of dagit Installation the simplest way to install dagit is using the AUR: yay -S dagit-bin Using go : go install github.com/lxsh-S/dagit@latest You can also install it from the github releases page (Make sure you get the latest version)", "repo": "https://github.com/lxsh-S/dagit", "demo": "https://github.com/lxsh-S/dagit/releases"}]...
|
[{"post_id": 73190, "ts": "202 [{"post_id": 73190, "ts": "2026-09-24T15:39:08Z", "hours": 0.5869, "text": "Update #1 There isnt much we have fixed some issues that were being cause because of the way we fetch data from git"}, {"post_id": 55058, "ts": "2026-08-26T14:18:54Z", "hours": 2.4206, "text": "DAGIT DEVLOG 5 yoo once again! I’ve worked on the features I’ve been delaying and let’s see the progress Progress Overview I first worked on the idea i got yesterday A status panel to see staged/modified files Then I tried to work on scrollbars in the git log and the visualizer but I failed to do so I just scrapped it completely and reset the repo to the after status panel state After scrapping that, I worked on the tick rate selection Intervals of time at which we update the data displayed in the TUI DETAIL The status panel idea had come when I was surfing git hub and was just looking at lazygit (A far better project than dagit btw). I saw the same panel there and thought of adding it here because it would make more sense, although dagit is different from lazygit (dagit is only trying to visualze git not become a workflow) The scrollbars were out of my league I already knew that but still gave a try. I dont think I would be giving up on the idea. I’ll just watch some tutorials on bubbletea and scrollbars specifically before working on it again At first, I thought I would make the tick rate selector a separate panel where we would just scroll through different intervals of time, but as I consider myself lazy I just thought of adding it in such a way that instead of scrolling we change the tick rate with the press of buttons. Although the max tickrate is already small(10sec) I recommend using 1sec on small projects"}, {"post_id": 53053, "ts": "2026-08-23T13:28:02Z", "hours": 2.8308, "text": "DAGIT DEVLOG 4 Yoo! I’ve made soo many updates and the resizing /clipping issues are still eating my brain like bugs Progress overview Decreased the sizes of reference being displayed also truncated lines in the gitlog so that the vertical clipping stops I completely styled the UI using lipgloss and it looks soo much better now Added highlighting to the head of the repo that pops a little more Refactored the old way of refreshing the data Refactored the code to increase readability Explain The git logs were looking odd because when the commit messages were long , the log that should only take the space of one line was now also taking space in the second line. So we fixed it using truncateMessages() function As we are pushig to multiple tags . The reference also gets long and causes a clipping issue again. So we again simply dosent let the refs be that long[But the current implementation can cause the line to break suddenly that may not look good all the time]- // Stop 'refs' being too long if lipgloss.Width(refs) > 30 { refs = refs[:27] + \"...\" } And as dagit is a live visualizer, I removed the old way of refreshing the data[clicking [r] to refresh]. Now what we do is use tea.Tick and the time library to refresh the data every 1 second. Issues that can be caused We are currently refreshing data every second that can put a lot more load on the system when used inside a big repository, So in infuture I’m gonna work to give the user a way to choose the tick Rate What im gonna work on now Scrollbar for gitlog and also visualizer A tick rate selector File status panel that can be toggled with the visualizer A way to search for different repo’s in the user’s computer and jumping between them(something like the nvim feature of finding files) –im not really sure of this"}, {"post_id": 52869, "ts": "2026-08-23T07:39:28Z", "hours": 0.7267, "text": "DAGIT DEVLOG 3 Yay! we have got the release workflow up and running What we are doing what we do is make new binaries name dagit-linux-amd64.tar.gz and dagit-darwin-arm64.tar.gz and push them to our releases page with the tag given while pushing to the repo We also push to the AUR!! . So all the I use arch btw people can download it easily Installation AUR yay -S dagit-bin Run in a github repo ,ie paste-> dagit Github releases go to the releases page and download the binaries zip, extract it and run in a github repo"}, {"post_id": 52542, "ts": "2026-08-22T18:20:33Z", "hours": 3.5672, "text": "DAGIT DEVLOG 2 We’ve improved the TUI soo much!! What I’ve done Got gitlog working with hash, commit message and the contibuter Made a somewhat good looking git visualizer and fixed the horizontal and vertical border issue caused by big lines (reference mainly) Styled the git visualizer with charm’s lipgloss Fixed border issues in the footer and git log too Also made dagit resize when the user makes the terminal window larger but idk why it doesnt work when the terminal window is shortened I also added a resize keybind r to reload the data in the TUI so that the user does not need to stop it and run again for it to update to latest info Issues faced I haven’t faced any big issue in particular but figuring out resizing is the only thing that eats my brain Where I spent the most time I have spent the most time making the visualizer , lemme explain a little of it’s woking !! First we fetch the git log graph from git and then we spread the graph by using SpreadGraph function in graph.go to make it look a little better Then we get 15 of the graph lines into out TUI and then render it using lipgloss [Man charm’s tool are soo cool and make CLI/TUI look soo good]. Although we don’t see all the 15 lines as we dont have a scroll feature for now What we are going to do Style it Fetch number of commits done to the repo and display it Add scrollbar to git visualizer _ Also add scrollbar to git log -Not sure What I currently feel When I was planning to make dagit, I felt it’ll be different and will attract people towards it but it’s not upto my expectation. I thinking to adding some feature that will make more people use it"}, {"post_id": 51644, "ts": "2026-08-21T12:59:40Z", "hours": 3.0086, "text": "DAGIT DEVLOG 1 (BTW WHOEVER ADDED EMOJIS OPTION SHOULD BE PROMOTED ) Hii, I’m making a TUI application that beautifully visualizes your GitHub repo inside your terminal!! Note -> This devlog is a compilation of 2 days of work that I’ll explain What I have done DAY 1: I started working on dagit with first: Checking if the current directory is a git repo or not If yes, we first fetch the repo name along with owner of the repo the remote url of current repo current branch Lmao, this was all I did on day 1 DAY 2 Today the fun began I started working on the TUI section I started with a simple bubble tea list TUI to remember the simple things that I had forgot in these many days Then I used bubbletea to render the left panel containing the the data we fetched from day one but I realised that this is messed up cuz I wont be able to make different sections for the visualizer and the git log history When I searched for a fix I saw lipgloss and then integrated it with our current setup I used lip gloss to make diffferent sections for our TUI. The sections that I currently want in the TUI left panel/middle(visualizer)/ bottom(git log) along with the footer like nvim But I forgot about the resizing problem and idk anything about how I’m going to fix it like other TUI’s do so I’m donna leave it like tat for now What I’m gonna do Make it look prettier Get the git log because it’s gonna be easier than the visualizer Make my shit code look a little better"}]...
|
Title: dagit by @Lxsh-S | Stardance
Devlogs:
DAGI Title: dagit by @Lxsh-S | Stardance
Devlogs:
DAGIT DEVLOG 1 (BTW WHOEVER ADDED EMOJIS OPTION SHOULD BE PROMOTED ) Hii, I’m making a TUI application that beautifully visualizes your GitHub repo inside your terminal!! Note -> This devlog is a compilation of 2 days of work that I’ll explain What I have done DAY 1: I started working on dagit with first: Checking if the current directory is a git repo or not If yes, we first fetch the repo name along with owner of the repo the remote url of current repo current branch Lmao, this was all I did on day 1 DAY 2 Today the fun began I started working on the TUI section I started with a simple bubble tea list TUI to remember the simple things that I had forgot in these many days Then I used bubbletea to render the left panel containing the the data we fetched from day one but I realised that this is messed up cuz I wont be able to make different sections for the visualizer and the git log history When I searched for a fix I saw lipgloss and then integrated it with our current setup I used lip gloss to make diffferent sections for our TUI. The sections that I currently want in the TUI left panel/middle(visualizer)/ bottom(git log) along with the footer like nvim But I forgot about the resizing problem and idk anything about how I’m going to fix it like other TUI’s do so I’m donna leave it like tat for now What I’m gonna do Make it look prettier Get the git log because it’s gonna be easier than the visualizer Make my shit code look a little better
DAGIT DEVLOG 2 We’ve improved the TUI soo much!! What I’ve done Got gitlog working with hash, commit message and the contibuter Made a somewhat good looking git visualizer and fixed the horizontal and vertical border issue caused by big lines (reference mainly) Styled the git visualizer with charm’s lipgloss Fixed border issues in the footer and git log too Also made dagit resize when the user makes the terminal window larger but idk why it doesnt work when the terminal window is shortened I also added a resize keybind r to reload the data in the TUI so that the user does not need to stop it and run again for it to update to latest info Issues faced I haven’t faced any big issue in particular but figuring out resizing is the only thing that eats my brain Where I spent the most time I have spent the most time making the visualizer , lemme explain a little of it’s woking !! First we fetch the git log graph from git and then we spread the graph by using SpreadGraph function in graph.go to make it look a little better Then we get 15 of the graph lines into out TUI and then render it using lipgloss [Man charm’s tool are soo cool and make CLI/TUI look soo good]. Although we don’t see all the 15 lines as we dont have a scroll feature for now What we are going to do Style it Fetch number of commits done to the repo and display it Add scrollbar to git visualizer _ Also add scrollbar to git log -Not sure What I currently feel When I was planning to make dagit, I felt it’ll be different and will attract people towards it but it’s not upto my expectation. I thinking to adding some feature that will make more people use it
DAGIT DEVLOG 3 Yay! we have got the release workflow up and running What we are doing what we do is make new binaries name dagit-linux-amd64.tar.gz and dagit-darwin-arm64.tar.gz and push them to our releases page with the tag given while pushing to the repo We also push to the AUR!! . So all the I use arch btw people can download it easily Installation AUR yay -S dagit-bin Run in a github repo ,ie paste-> dagit Github releases go to the releases page and download the binaries zip, extract it and run in a github repo
DAGIT DEVLOG 4 Yoo! I’ve made soo many updates and the resizing /clipping issues are still eating my brain like bugs Progress overview Decreased the sizes of reference being displayed also truncated lines in the gitlog so that the vertical clipping stops I completely styled the UI using lipgloss and it looks soo much better now Added highlighting to the head of the repo that pops a little more Refactored the old way of refreshing the data Refactored the code to increase readability Explain The git logs were looking odd because when the commit messages were long , the log that should only take the space of one line was now also taking space in the second line. So we fixed it using truncateMessages() function As we are pushig to multiple tags . The reference also gets long and causes a clipping issue again. So we again simply dosent let the refs be that long[But the current implementation can cause the line to break suddenly that may not look good all the time]- // Stop 'refs' being too long if lipgloss.Width(refs) > 30 { refs = refs[:27] + "..." } And as dagit is a live visualizer, I removed the old way of refreshing the data[clicking [r] to refresh]. Now what we do is use tea.Tick and the time library to refresh the data every 1 second. Issues that can be caused We are currently refreshing data every second that can put a lot more load on the system when used inside a big repository, So in infuture I’m gonna work to give the user a way to choose the tick Rate What im gonna work on now Scrollbar for gitlog and also visualizer A tick rate selector File status panel that can be toggled with the visualizer A way to search for different repo’s in the user’s computer and jumping between them(something like the nvim feature of finding files) –im not really sure of this
DAGIT DEVLOG 5 yoo once again! I’ve worked on the features I’ve been delaying and let’s see the progress Progress Overview I first worked on the idea i got yesterday A status panel to see staged/modified files Then I tried to work on scrollbars in the git log and the visualizer but I failed to do so I just scrapped it completely and reset the repo to the after status panel state After scrapping that, I worked on the tick rate selection Intervals of time at which we update the data displayed in the TUI DETAIL The status panel idea had come when I was surfing git hub and was just looking at lazygit (A far better project than dagit btw). I saw the same panel there and thought of adding it here because it would make more sense, although dagit is different from lazygit (dagit is only trying to visualze git not become a workflow) The scrollbars were out of my league I already knew that but still gave a try. I dont think I would be giving up on the idea. I’ll just watch some tutorials on bubbletea and scrollbars specifically before working on it again At first, I thought I would make the tick rate selector a separate panel where we would just scroll through different intervals of time, but as I consider myself lazy I just thought of adding it in such a way that instead of scrolling we change the tick rate with the press of buttons. Although the max tickrate is already small(10sec) I recommend using 1sec on small projects
Update #1 There isnt much we have fixed some issues that were being cause because of the way we fetch data from git
Ships:
DAGIT SHIP1 I have built a terminal TUI git visualizer that beautifully displays your git repository on the terminal. Challenging part Dagit has four small sections [left panel/visualizer/status panel/logs] . I first thought there would be no resizing issues because I’m using bubble-tea and built all there sections’ skeletons, as bubble-tea doesn’t automatically handle the resize event(got to know later). I manually tried to fix it in my own broken ways and found somewhat of a solution that feels and looks good A Breakdown of the project dagit refuses to launch if we don’t open it inside a git repo. We fetch all the data by running git commands. Currently in the left panel we have the following information: * Repo name * The repo's owner name * Current branch * The url of the remote In the vizualizer: * hash of the commit * Reference * the committer name * The time of the commit * We also beautify the graph and show it in this section Log section: * Hash of commit * Commit message * Committer name Status panel: * Modified, staged files are shown here The user can toggle between the visualizer and the status panel using v The user can also choose between my predefined tick rates [500ms/1s/3s/5s/10s] . By default the tick rate is set to 1sec Proud Of how quickly I have understood the git docs and used it to build this project that makes git look so much better for the newbies. Also that I have finally made a project that is not very complicated for the user to use like gos was. lmao Also handling resize events was a bit of headache and it feels so much better now. I feel proud because of that too :shy Do we need to set something before? No, but if you wanna install it using go , you need to have go installed :) Note: The releases page only has a darwin(macos) and linux version. So I recommend using wsl on windows to enjoy the beauty of dagit Installation the simplest way to install dagit is using the AUR: yay -S dagit-bin Using go : go install github.com/lxsh-S/dagit@latest You can also install it from the github releases page (Make sure you get the latest version)
The ony changes we have made is fix some issues with the way we fetch data from github. I wouldn’t have shipped this but I currently have 34 stardust and urgently need 1 to buy some electronics for my other project :). Please be kind...
|
1792824755.9709556
|
1792911155.9709556
|
|
60870
|
XING by @Lord-Ace | Stardance
|
Lord-Ace
|
1
|
15.57
|
18
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T15:24:11Z", "hours": 14.0, "multiplier": 1.26, "payout": 18, "blessing": "neutral", "text": "Created a fun interactive question bot powered by Gemini. You pick your set of topics and difficulty level then you allow the AI curate custom questions for you. It was quite challenging to build though especially the fastAPI layer handling the CORS and making sure the endpoint calls and returns the value the way I want it to but overall, it was a fun build and I hope you enjoy using it", "repo": "https://github.com/RADYO-ACTIV/XING", "demo": "https://xing-tau.vercel.app/"}]...
|
[{"post_id": 76484, "ts": "202 [{"post_id": 76484, "ts": "2026-10-03T18:27:08Z", "hours": 1.5656, "text": "Improved the response time for the Gemini endpoint"}, {"post_id": 72785, "ts": "2026-09-23T18:53:48Z", "hours": 5.4031, "text": "Finally finished the project. Changed the background (again), connected the fastAPI endpoint to the JavaScript, added proper error handling (I think), designed an ending animation, cors. Did a lot other things 8 can’t remember"}, {"post_id": 69124, "ts": "2026-09-16T13:02:30Z", "hours": 2.0556, "text": "Just designed the fastAPI backend for the bot and connected it to gemini 3.8flash. still having issues getting the right response from the API though but it works. Now to being everything into one piece"}, {"post_id": 68656, "ts": "2026-09-15T14:08:03Z", "hours": 3.49, "text": "Added some JavaScript to the app for extra validation and error handling. Also created functions to help fetch the generated questions and I added background music (still in development) and in case you didn’t notice, I’m trying out different backgrounds for the web app"}, {"post_id": 68029, "ts": "2026-09-14T12:26:46Z", "hours": 3.2531, "text": "Finished with the html and CSS. Completed the core layout and basic functionality. Moving to JavaScript next"}]...
|
Title: XING by @Lord-Ace | Stardance
Devlogs:
Fin Title: XING by @Lord-Ace | Stardance
Devlogs:
Finished with the html and CSS. Completed the core layout and basic functionality. Moving to JavaScript next
Added some JavaScript to the app for extra validation and error handling. Also created functions to help fetch the generated questions and I added background music (still in development) and in case you didn’t notice, I’m trying out different backgrounds for the web app
Just designed the fastAPI backend for the bot and connected it to gemini 3.8flash. still having issues getting the right response from the API though but it works. Now to being everything into one piece
Finally finished the project. Changed the background (again), connected the fastAPI endpoint to the JavaScript, added proper error handling (I think), designed an ending animation, cors. Did a lot other things 8 can’t remember
Improved the response time for the Gemini endpoint
Ships:
Created a fun interactive question bot powered by Gemini. You pick your set of topics and difficulty level then you allow the AI curate custom questions for you. It was quite challenging to build though especially the fastAPI layer handling the CORS and making sure the endpoint calls and returns the value the way I want it to but overall, it was a fun build and I hope you enjoy using it...
|
1792813766.3069706
|
1792900166.3069706
|
|
65435
|
We miss stardance by @MAyaanBaig2013 | Stardance
|
MAyaanBaig2013
|
1
|
2.0
|
3
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T15:13:52Z", "hours": 2.0, "multiplier": 1.52, "payout": 3, "blessing": "neutral", "text": "I made an memoriable website for starda since stardane will be closing in 5 days!", "repo": "https://github.com/DevAyaan123/we-miss-stardance", "demo": "https://devayaan123.github.io/we-miss-stardance/"}]...
|
[{"post_id": 73171, "ts": "202 [{"post_id": 73171, "ts": "2026-09-24T15:08:34Z", "hours": 1.95, "text": "So guys, since stardance will be closing in 5 days we all will leave a memorial website for it !"}]...
|
Title: We miss stardance by @MAyaanBaig2013 | Star Title: We miss stardance by @MAyaanBaig2013 | Stardance
Devlogs:
So guys, since stardance will be closing in 5 days we all will leave a memorial website for it !
Ships:
I made an memoriable website for starda since stardane will be closing in 5 days!...
|
1792817246.7322164
|
1792903646.7322164
|
|
38756
|
Dragonfly Control Software by @dr_aerospace | Star Dragonfly Control Software by @dr_aerospace | Stardance...
|
dr_aerospace
|
1
|
35.0
|
515
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T15:04:18Z", "hours": 35.0, "multiplier": 12.24, "payout": 515, "blessing": "neutral", "text": "I made a program, written in the KerboScript language, to autonomously control a replica of NASA’s Dragonfly mission (or any kind of rotorcraft) in Kerbal Space Program. Aside of selecting your target altitude or waypoint, the script is designed to be completely independent of human interaction. To use this program, you will need a ship with rotors that can maneuver in any direction and a kOS-enabled probe core. The script also integrates with the SCANsat mod to show the user telemetry and ETA data in the terminal (you can still use the script if you don’t have the SCANsat mod). The program’s flight profile divides into four main stages Liftoff , Cruise , Approach , and Landing . Each one of these has its own variables, loops, conditionals, and triggers. The script’s flow is designed to move on with each stage in an orderly manner. Each stage also has controls for altitude, pitch, and throttle depending on which stage is the code running. Besides the main control functions, the script also has two safety function to prevent crashes or rolling down slopes. The first one of this functions is Landing Abort . This function activates the exact second the drone lands and checks for five seconds if its pitch or roll exceed dangerous angles. If so happens, the script will take off rapidly, fly in a straight line for 30 seconds, and attempt to land again. If the drone lands in stable ground, it simply understands that it landed in safe ground and that landing abort is not needed. The other safety function is called the Safe Altitude Maintenance . This function executes with every refresh of the Cruise loop, and checks if the drone is within its target altitude margin and the distance to the ground goes below 500 meters. If that occurs, the drone accelerates to climb and maintain a 500 meter distance to the ground. When the drone returns to its target altitude margin and the distance to the ground becomes greater than 500, it returns to its normal Cruise mode. This is especially useful when flying at low altitude and near mountainous regions. After the drone lands and confirms it is safely leveled, it activates the Scientific Analysis Sequence . This sequence is composed by PRINT, action group, and WAIT commands. The main idea of this function is that it is completely customizable; this way, the user can select which instruments activate at what time. Also, there is another function that, in a fraction of a second, activates only one action group just after the Cruise loop’s conditionals are fulfilled and before the Approach loop activates. The objective is to place either telemetry or barometric scans while the drone is airborne. The objective of this script is to make powered flight in KSP rather an autonomous, stress-free experience. Any KSP player, from newbie to experienced can use the script to automate planet exploration.", "repo": "https://github.com/JuanD0409/Dragonfly-Control-Software", "demo": "https://youtu.be/TBGFOX5xo8Q"}]...
|
[{"post_id": 72805, "ts": "202 [{"post_id": 72805, "ts": "2026-09-23T19:27:24Z", "hours": 2.4856, "text": "Devlog 8 (and final) of the Dragonfly Control Software I’m pleased to announce that the Dragonfly Control Software is ready to ship for review! Aside from final touches and adjustments, the last thing I made for the program is a function that triggers an action group set to activate telemetry scans from SCANsat-related parts. The idea for this is to place activation command for these scans in a determined action group triggered by the code itself. This function is called from the Cruise function right after its loop is complete and before the Approach function is called. This way, the telemetry scans are done at Dragonfly’s target altitude. You can see the function in action in the video I left below. Speaking about videos, I should get to editing the Demo video I have to upload. I’m very proud of myself and I hope many KSP players get to use this script since drones are very hard to design and fly in KSP."}, {"post_id": 72072, "ts": "2026-09-22T03:27:39Z", "hours": 3.5306, "text": "Devlog 7 of the Dragonfly Control Software Safety First! This devlog is all about the safety features of Dragonfly’s script. This script has two safety functions that work at certain times of Dragonfly’s flight procedure and for the same idea: NOT CRASHING . The first one is the Landing Abort set of functions (that I have talked about but never shown until today). The main idea of this function is to prevent rolling down a hill or mountain. It works by checking if Dragonfly’s pitch exceeds 45 degrees or if its roll exceeds 30 degrees (each to either side). If so happens, Dragonfly panics, takes off, locks its heading, flies straight for 30 seconds, and attempts to land. Once Dragonfly lands, it re-checks if its pitch or roll exceed the limiters, and takes off again if needed until it finds an adequate landing spot. The second function is a safe altitude maintenance function (something very much like the PULL UP PULL UP or CAUTION, TERRAIN alerts and crash avoidance systems on airplanes). This function constantly executes with every refreshing of the Cruise main UNTIL loop and evaluates the following conditions: if Dragonfly’s altitude over sea level is within a 10-meter margin of error around the target altitude, and if Dragonfly’s altitude over ground level goes below 500 meters. Both conditionals are joined by an AND gate and if both are true, Dragonfly initiates an altitude maintenance mode. It is supposed to maintain a 500 meter distance from the ground until its altitude over ground level is within a 10-meter margin around 500 meters and its altitude over sea level is around the same 10-meter margin around its target altitude. When both conditions are true, Dragonfly understands that it is once again at its target altitude and at a safe distance from the ground, and returns to its normal cruise. This mode is quite useful when flying low to avoid mountains or hills, especially steep ones like the ones in the video. Although this script is very smart are cautious, DO NOT FLY DRAGONFLY TO A MOUNTAIN! During my testing, I have had multiple crashes and errors while attempting to land at the sides or top of mountains. Also, if you fly Dragonfly to a mountain, the landing abort function will go crazy and keep you there for half an hour (or more) trying to land on the mountain. I have given my advice to thee, you shall see if you follow it or reject it."}, {"post_id": 69945, "ts": "2026-09-18T03:29:28Z", "hours": 8.3464, "text": "Devlog 6 of the Dragonfly Control Software I have worked than what should be considered overtime in the project and my effort is giving its fruits! With some help of AI doing a lot of math and calculus, I managed to make an actual approach function. First, Dragonfly calculates the distance to to the target Waypoint as a triangle. This means, in easy words, that the distance to the ground is one side of the triangle, the distance from the current point on the ground that Dragonfly is flying over to the Waypoint is the other side of the triangle, and the distance from the actual craft to the Waypoint is the hypotenuse of the triangle. Therefore, the idea is that Dragonfly follows that hypotenuse (shown in the video) all the way to the waypoint. Then, it levels its nose, activates the landing function, reduces its horizontal velocity to almost 0 by raising its nose (new characteristic), and softly lands. Also, I already wrote the landing abort function I talked about on the last Devlog, however, I had to re-write it since the SCANsat data for slope is apparently not valid or recognized, so, it did not work. What I made instead was a function that evaluates current pitch and roll right at landing, and, if either value crosses a limit, calls another function to make the drone take off, fly in a straight line, and call the landing function to try to land again. If the limit is not crossed, the drone simply activates the scientific analysis sequence. To summarize, this activates a land, check, and abort-or-stay loop of functions. This loop is executed until Dragonfly lands and its limits are not crossed. I will upload a video of it in the next devlog since I need to focus on fine-tuning the main functions first."}, {"post_id": 67002, "ts": "2026-09-13T01:12:05Z", "hours": 5.0267, "text": "Devlog 5 of the Dragonfly Control Software I’m proud to announce that Dragonfly has successfully completed its first trans-oceanic flight! I had previously tested Dragonfly’s cruise altitude range around 5-6 kilometers over sea level, but this time, I decided to go even higher to 10 kilometers. I noticed that, at this altitude, Dragonfly could fly much faster but needed more power to maintain its altitude; just like airplanes do here on Earth. The video below shows Dragonfly exiting one continent and entering another on Tekto. Also, I found out how to make the SCANsat integration work. If you watch the terminal closefully, you can see Dragonfly’s current coordinates changing as it flies, and other telemetry data like current biome, slope, and elevation. Turns out, I had accidentally targeted the side of a mountain as the landing area and Dragonfly almost starts rolling down it, so, that gave me an idea: landing abort. I think the best option to make this work is to use the SCANsat data for slope and, if it is beyond a certain amount, make the drone fly to another area until the slope becomes safe enough to land. I could either make it fly straight until slope decreases to a safe amount, or make the user select an alternative waypoint (preferably flat) to safely land in case Dragonfly cannot. I thought another way to make this work was by detecting if the user presses the abort button on KSP’s UI, but that would ruin the whole point of Dragonfly being completely autonomous. In real space missions there is no abort button (neither is a “revert to assembly” button like in KSP) that works faster than the speed of light, so that is not a viable option. Anyways, I feel this project is getting better and more realistic with every change I make."}, {"post_id": 63974, "ts": "2026-09-08T02:10:41Z", "hours": 4.8742, "text": "Devlog 4 of the Dragonfly Control Software Progress has been made! I have made multiple improvements to the code and its functioning in general. First, I added a telemetry integration function using the SCANsat mod (because what is a drone without telemetry, right?). Second, I wrote the scientific sequence function, but I have not yet integrated it into the drone. I have to assign its scientific devices to the action groups and calibrate their operating times. Third, I upgraded the Approach function and it now makes this butter-smooth leveling maneuver (seen on the video below) while also smoothly controlling its throttle, effectively maintaining its altitude within a 3 meter range. This script still has many improvements to be made, and I will definitely keep working on it."}, {"post_id": 54043, "ts": "2026-08-24T20:05:13Z", "hours": 3.6028, "text": "Devlog 3 of the Dragonfly Control Software After having a break because of medical things, I returned to continue improving my project. I updated the Approach function and now it works better. However, Dragonfly is falling short of its target waypoint so I’ll be fixing that problem. Also, I will leave a video showing the Landing function in action, enjoy it."}, {"post_id": 34974, "ts": "2026-07-26T03:24:59Z", "hours": 4.5442, "text": "Devlog 2 of the Dragonfly Control Software. After a complete code rewrite from scratch , I finally figured out how to make Dragonfly maneuver correctly. However, I need to calibrate a PID controller that makes the drone’s nose wobble up and down, but that is a minor problem now. I will continue to perfect the code to make it behave without any mayor issue. Anyways, here is a video of the drone taking off and cruising to its ideal altitude."}, {"post_id": 33840, "ts": "2026-07-24T02:38:20Z", "hours": 2.6011, "text": "Devlog 1 of the Dragonfly Control Software. I started this new project inspired by NASA’s Dragonfly mission since I wanted a harder challenge than the rover autopilot. However, I was then surprised by how difficult it was to make kOS control a drone’s angles (pitch, yaw, and roll) alongside with throttle, height control, speed, and who knows what more. So, I came up with PID functions that were built into kOS’s libraries that auto-correct the drone’s control variables mentiones before. After 2+ hours of troubleshooting in Kerbal Space Program (that sadly are not registered in Hackatime) I made the drone fly. Now, I need to debug the script even more to make it correct its pitch, and add altitude controls for adequate ascending, descending, and landing. I have the Outer Planets mod installed (quick context: KSP does not have Saturn, Uranus, and Neptune; this planet pack mod adds them and some moons into the game), so I sent Dragonfly to Tekto (recreation of Titan, the target moon for the real mission) where gravity is low and atmospheric pressure is higher than Kerbin (Earth in KSP). This moon is an absolute paradise for rotorcrafts like this. I’ll leave a video of the craft successfully performing its first takeoff below. Also, I totally did NOT almost crash it after assuming control."}]...
|
Title: Dragonfly Control Software by @dr_aerospace Title: Dragonfly Control Software by @dr_aerospace | Stardance
Devlogs:
Devlog 1 of the Dragonfly Control Software. I started this new project inspired by NASA’s Dragonfly mission since I wanted a harder challenge than the rover autopilot. However, I was then surprised by how difficult it was to make kOS control a drone’s angles (pitch, yaw, and roll) alongside with throttle, height control, speed, and who knows what more. So, I came up with PID functions that were built into kOS’s libraries that auto-correct the drone’s control variables mentiones before. After 2+ hours of troubleshooting in Kerbal Space Program (that sadly are not registered in Hackatime) I made the drone fly. Now, I need to debug the script even more to make it correct its pitch, and add altitude controls for adequate ascending, descending, and landing. I have the Outer Planets mod installed (quick context: KSP does not have Saturn, Uranus, and Neptune; this planet pack mod adds them and some moons into the game), so I sent Dragonfly to Tekto (recreation of Titan, the target moon for the real mission) where gravity is low and atmospheric pressure is higher than Kerbin (Earth in KSP). This moon is an absolute paradise for rotorcrafts like this. I’ll leave a video of the craft successfully performing its first takeoff below. Also, I totally did NOT almost crash it after assuming control.
Devlog 2 of the Dragonfly Control Software. After a complete code rewrite from scratch , I finally figured out how to make Dragonfly maneuver correctly. However, I need to calibrate a PID controller that makes the drone’s nose wobble up and down, but that is a minor problem now. I will continue to perfect the code to make it behave without any mayor issue. Anyways, here is a video of the drone taking off and cruising to its ideal altitude.
Devlog 3 of the Dragonfly Control Software After having a break because of medical things, I returned to continue improving my project. I updated the Approach function and now it works better. However, Dragonfly is falling short of its target waypoint so I’ll be fixing that problem. Also, I will leave a video showing the Landing function in action, enjoy it.
Devlog 4 of the Dragonfly Control Software Progress has been made! I have made multiple improvements to the code and its functioning in general. First, I added a telemetry integration function using the SCANsat mod (because what is a drone without telemetry, right?). Second, I wrote the scientific sequence function, but I have not yet integrated it into the drone. I have to assign its scientific devices to the action groups and calibrate their operating times. Third, I upgraded the Approach function and it now makes this butter-smooth leveling maneuver (seen on the video below) while also smoothly controlling its throttle, effectively maintaining its altitude within a 3 meter range. This script still has many improvements to be made, and I will definitely keep working on it.
Devlog 5 of the Dragonfly Control Software I’m proud to announce that Dragonfly has successfully completed its first trans-oceanic flight! I had previously tested Dragonfly’s cruise altitude range around 5-6 kilometers over sea level, but this time, I decided to go even higher to 10 kilometers. I noticed that, at this altitude, Dragonfly could fly much faster but needed more power to maintain its altitude; just like airplanes do here on Earth. The video below shows Dragonfly exiting one continent and entering another on Tekto. Also, I found out how to make the SCANsat integration work. If you watch the terminal closefully, you can see Dragonfly’s current coordinates changing as it flies, and other telemetry data like current biome, slope, and elevation. Turns out, I had accidentally targeted the side of a mountain as the landing area and Dragonfly almost starts rolling down it, so, that gave me an idea: landing abort. I think the best option to make this work is to use the SCANsat data for slope and, if it is beyond a certain amount, make the drone fly to another area until the slope becomes safe enough to land. I could either make it fly straight until slope decreases to a safe amount, or make the user select an alternative waypoint (preferably flat) to safely land in case Dragonfly cannot. I thought another way to make this work was by detecting if the user presses the abort button on KSP’s UI, but that would ruin the whole point of Dragonfly being completely autonomous. In real space missions there is no abort button (neither is a “revert to assembly” button like in KSP) that works faster than the speed of light, so that is not a viable option. Anyways, I feel this project is getting better and more realistic with every change I make.
Devlog 6 of the Dragonfly Control Software I have worked than what should be considered overtime in the project and my effort is giving its fruits! With some help of AI doing a lot of math and calculus, I managed to make an actual approach function. First, Dragonfly calculates the distance to to the target Waypoint as a triangle. This means, in easy words, that the distance to the ground is one side of the triangle, the distance from the current point on the ground that Dragonfly is flying over to the Waypoint is the other side of the triangle, and the distance from the actual craft to the Waypoint is the hypotenuse of the triangle. Therefore, the idea is that Dragonfly follows that hypotenuse (shown in the video) all the way to the waypoint. Then, it levels its nose, activates the landing function, reduces its horizontal velocity to almost 0 by raising its nose (new characteristic), and softly lands. Also, I already wrote the landing abort function I talked about on the last Devlog, however, I had to re-write it since the SCANsat data for slope is apparently not valid or recognized, so, it did not work. What I made instead was a function that evaluates current pitch and roll right at landing, and, if either value crosses a limit, calls another function to make the drone take off, fly in a straight line, and call the landing function to try to land again. If the limit is not crossed, the drone simply activates the scientific analysis sequence. To summarize, this activates a land, check, and abort-or-stay loop of functions. This loop is executed until Dragonfly lands and its limits are not crossed. I will upload a video of it in the next devlog since I need to focus on fine-tuning the main functions first.
Devlog 7 of the Dragonfly Control Software Safety First! This devlog is all about the safety features of Dragonfly’s script. This script has two safety functions that work at certain times of Dragonfly’s flight procedure and for the same idea: NOT CRASHING . The first one is the Landing Abort set of functions (that I have talked about but never shown until today). The main idea of this function is to prevent rolling down a hill or mountain. It works by checking if Dragonfly’s pitch exceeds 45 degrees or if its roll exceeds 30 degrees (each to either side). If so happens, Dragonfly panics, takes off, locks its heading, flies straight for 30 seconds, and attempts to land. Once Dragonfly lands, it re-checks if its pitch or roll exceed the limiters, and takes off again if needed until it finds an adequate landing spot. The second function is a safe altitude maintenance function (something very much like the PULL UP PULL UP or CAUTION, TERRAIN alerts and crash avoidance systems on airplanes). This function constantly executes with every refreshing of the Cruise main UNTIL loop and evaluates the following conditions: if Dragonfly’s altitude over sea level is within a 10-meter margin of error around the target altitude, and if Dragonfly’s altitude over ground level goes below 500 meters. Both conditionals are joined by an AND gate and if both are true, Dragonfly initiates an altitude maintenance mode. It is supposed to maintain a 500 meter distance from the ground until its altitude over ground level is within a 10-meter margin around 500 meters and its altitude over sea level is around the same 10-meter margin around its target altitude. When both conditions are true, Dragonfly understands that it is once again at its target altitude and at a safe distance from the ground, and returns to its normal cruise. This mode is quite useful when flying low to avoid mountains or hills, especially steep ones like the ones in the video. Although this script is very smart are cautious, DO NOT FLY DRAGONFLY TO A MOUNTAIN! During my testing, I have had multiple crashes and errors while attempting to land at the sides or top of mountains. Also, if you fly Dragonfly to a mountain, the landing abort function will go crazy and keep you there for half an hour (or more) trying to land on the mountain. I have given my advice to thee, you shall see if you follow it or reject it.
Devlog 8 (and final) of the Dragonfly Control Software I’m pleased to announce that the Dragonfly Control Software is ready to ship for review! Aside from final touches and adjustments, the last thing I made for the program is a function that triggers an action group set to activate telemetry scans from SCANsat-related parts. The idea for this is to place activation command for these scans in a determined action group triggered by the code itself. This function is called from the Cruise function right after its loop is complete and before the Approach function is called. This way, the telemetry scans are done at Dragonfly’s target altitude. You can see the function in action in the video I left below. Speaking about videos, I should get to editing the Demo video I have to upload. I’m very proud of myself and I hope many KSP players get to use this script since drones are very hard to design and fly in KSP.
Ships:
I made a program, written in the KerboScript language, to autonomously control a replica of NASA’s Dragonfly mission (or any kind of rotorcraft) in Kerbal Space Program. Aside of selecting your target altitude or waypoint, the script is designed to be completely independent of human interaction. To use this program, you will need a ship with rotors that can maneuver in any direction and a kOS-enabled probe core. The script also integrates with the SCANsat mod to show the user telemetry and ETA data in the terminal (you can still use the script if you don’t have the SCANsat mod). The program’s flight profile divides into four main stages Liftoff , Cruise , Approach , and Landing . Each one of these has its own variables, loops, conditionals, and triggers. The script’s flow is designed to move on with each stage in an orderly manner. Each stage also has controls for altitude, pitch, and throttle depending on which stage is the code running. Besides the main control functions, the script also has two safety function to prevent crashes or rolling down slopes. The first one of this functions is Landing Abort . This function activates the exact second the drone lands and checks for five seconds if its pitch or roll exceed dangerous angles. If so happens, the script will take off rapidly, fly in a straight line for 30 seconds, and attempt to land again. If the drone lands in stable ground, it simply understands that it landed in safe ground and that landing abort is not needed. The other safety function is called the Safe Altitude Maintenance . This function executes with every refresh of the Cruise loop, and checks if the drone is within its target altitude margin and the distance to the ground goes below 500 meters. If that occurs, the drone accelerates to climb and maintain a 500 meter distance to the ground. When the drone returns to its target altitude margin and the distance to the ground becomes greater than 500, it returns to its normal Cruise mode. This is especially useful when flying at low altitude and near mountainous regions. After the drone lands and confirms it is safely leveled, it activates the Scientific Analysis Sequence . This sequence is composed by PRINT, action group, and WAIT commands. The main idea of this function is that it is completely customizable; this way, the user can select which instruments activate at what time. Also, there is another function that, in a fraction of a second, activates only one action group just after the Cruise loop’s conditionals are fulfilled and before the Approach loop activates. The objective is to place either telemetry or barometric scans while the drone is airborne. The objective of this script is to make powered flight in KSP rather an autonomous, stress-free experience. Any KSP player, from newbie to experienced can use the script to automate planet exploration....
|
1792853305.0859356
|
1792939705.0859356
|
|
62253
|
GingGong OS by @Tanojimo | Stardance
|
Tanojimo
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T14:52:55Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "GingGong OS, A really weird name I must admit. This is a WebOS that I build to learn about HTML, CSS and JS. It has been great building this thing. I got to learn All the basics. I had fun seeing my idea coming to life after around a 5 hour grind. I think I’ll continue to work on this project and make it even more polished.", "repo": "https://github.com/boomertanjim/GingGongOS", "demo": "https://boomertanjim.github.io/GingGongOS/"}]...
|
[{"post_id": 73159, "ts": "202 [{"post_id": 73159, "ts": "2026-09-24T14:44:30Z", "hours": 0.2908, "text": "Did some final tweaks here: Added a hover effect in the taskbar apps Added the feature to resize Windows Added Storage, so your todo’s don’t get lost when you reload the page"}, {"post_id": 73121, "ts": "2026-09-24T13:09:42Z", "hours": 4.0661, "text": "Kind of did almost everything in this build: Added movable Windows Added Three new apps, To-do App, Notepad app and Image Viewer App Added a cool looking clock in the middle"}, {"post_id": 68228, "ts": "2026-09-14T18:56:06Z", "hours": 0.5389, "text": "Devlog #1 Today I worked out the basics. Setting up the project actually took a while as I am new to this. Then I placed a Background, Added a taskbar with placeholder logo (Yes, I love godot) for the windows button. Future plans: adding movable windows"}]...
|
Title: GingGong OS by @Tanojimo | Stardance
Devlo Title: GingGong OS by @Tanojimo | Stardance
Devlogs:
Devlog #1 Today I worked out the basics. Setting up the project actually took a while as I am new to this. Then I placed a Background, Added a taskbar with placeholder logo (Yes, I love godot) for the windows button. Future plans: adding movable windows
Kind of did almost everything in this build: Added movable Windows Added Three new apps, To-do App, Notepad app and Image Viewer App Added a cool looking clock in the middle
Did some final tweaks here: Added a hover effect in the taskbar apps Added the feature to resize Windows Added Storage, so your todo’s don’t get lost when you reload the page
Ships:
GingGong OS, A really weird name I must admit. This is a WebOS that I build to learn about HTML, CSS and JS. It has been great building this thing. I got to learn All the basics. I had fun seeing my idea coming to life after around a 5 hour grind. I think I’ll continue to work on this project and make it even more polished....
|
1792813924.6470623
|
1792900324.6470623
|
|
50446
|
ISS Live Tracker by @KarthikB | Stardance
|
KarthikB
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T14:50:33Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "ISS Live Tracker 🛰️ A real time web app that tracks the International Space Station’s live position on an interactive map and predicts exactly when and whether it’ll be visible from anywhere on Earth. Click any spot on the map to get the next visible pass for that location, complete with duration and whether you will able to see it. Built from scratch with plain HTML, CSS, and JavaScript — no frameworks. Features a live updating marker with a real orbital trail, real time day/night shading calculated from the sun’s actual position, and a pass predictor powered by real ISS tracking APIs. As a beginner, this was my first fully shipped project, including real deployment debugging (HTTPS/mixed-content issues, case-sensitivity bugs between Windows and Linux, and switching APIs mid-project when one proved unreliable in production). Live demo: https://droid678.github.io/ISS-tracker/ Repo: https://github.com/droid678/ISS-tracker", "repo": "https://github.com/droid678/ISS-tracker", "demo": "https://droid678.github.io/ISS-tracker/"}]...
|
[{"post_id": 72655, "ts": "202 [{"post_id": 72655, "ts": "2026-09-23T13:00:28Z", "hours": 2.1564, "text": "Pass Predictor: Done and Shipped 🛰️ Added the second big feature to my ISS Live Tracker: click anywhere on the map, and it tells you when the ISS will next be visible from that exact spot, not just when it passes overhead, but whether it’ll actually be dark enough and sunlit enough to see with your own eyes. Started by building this with real orbital mechanics using satellite.js, fetching the ISS’s TLE (orbital data) and calculating look angles myself. Got it fully working locally. Then deployment broke almost everything: My ISS position API was using http://, but GitHub Pages serves over HTTPS. Browsers block that mix silently. Switched to an HTTPS-only API. The TLE data source (Celestrak) returned a 403 error specifically when called from my live domain, even though it worked fine locally — likely some kind of bot protection treating GitHub Pages differently. At that point, with the deadline close, I made the call to stop fighting the orbital math myself and switched to a purpose-built free API (Pollux Labs’ ISS Pass API) that does the prediction directly. Simpler, more reliable, and it even factors in visibility (daylight/shadow), which my own calculation didn’t. Also did a UI pass — added a tagline, a live status badge, grouped the info text into a proper panel, and a favicon. Live demo: https://droid678.github.io/ISS-tracker/ Repo: https://github.com/droid678/ISS-tracker.git"}, {"post_id": 48981, "ts": "2026-08-17T15:51:59Z", "hours": 2.0272, "text": "Started my ISS Live Tracker for Stardance 🛰️ Decided to build a real-time tracker for the International Space Station after realizing I wanted something that felt genuinely mine, not a pre-made project idea. Built with plain HTML/CSS/JS + Leaflet.js for the map — no frameworks, kept it simple so I could actually understand every line. What’s working so far: -Live ISS position fetched from the Open Notify API, updating every few seconds -A moving marker with a custom satellite icon -A trail line showing the ISS’s recent path -Real-time day/night shading on the map, using a library that calculates the sun’s actual position -A full dark theme dashboard redesign Funniest bug: my map completely broke and the console said map is not a function, turned out, autocomplete had renamed my L.map(…) calls to LargestContentfulPaint.map(…) without me noticing. Took a while to spot since it looked so plausible at a glance. Next up: either a pass predictor (so you can tell when the ISS is visible from your location) or expanding into a broader space weather dashboard."}]...
|
Title: ISS Live Tracker by @KarthikB | Stardance
Title: ISS Live Tracker by @KarthikB | Stardance
Devlogs:
Started my ISS Live Tracker for Stardance 🛰️ Decided to build a real-time tracker for the International Space Station after realizing I wanted something that felt genuinely mine, not a pre-made project idea. Built with plain HTML/CSS/JS + Leaflet.js for the map — no frameworks, kept it simple so I could actually understand every line. What’s working so far: -Live ISS position fetched from the Open Notify API, updating every few seconds -A moving marker with a custom satellite icon -A trail line showing the ISS’s recent path -Real-time day/night shading on the map, using a library that calculates the sun’s actual position -A full dark theme dashboard redesign Funniest bug: my map completely broke and the console said map is not a function, turned out, autocomplete had renamed my L.map(…) calls to LargestContentfulPaint.map(…) without me noticing. Took a while to spot since it looked so plausible at a glance. Next up: either a pass predictor (so you can tell when the ISS is visible from your location) or expanding into a broader space weather dashboard.
Pass Predictor: Done and Shipped 🛰️ Added the second big feature to my ISS Live Tracker: click anywhere on the map, and it tells you when the ISS will next be visible from that exact spot, not just when it passes overhead, but whether it’ll actually be dark enough and sunlit enough to see with your own eyes. Started by building this with real orbital mechanics using satellite.js, fetching the ISS’s TLE (orbital data) and calculating look angles myself. Got it fully working locally. Then deployment broke almost everything: My ISS position API was using http://, but GitHub Pages serves over HTTPS. Browsers block that mix silently. Switched to an HTTPS-only API. The TLE data source (Celestrak) returned a 403 error specifically when called from my live domain, even though it worked fine locally — likely some kind of bot protection treating GitHub Pages differently. At that point, with the deadline close, I made the call to stop fighting the orbital math myself and switched to a purpose-built free API (Pollux Labs’ ISS Pass API) that does the prediction directly. Simpler, more reliable, and it even factors in visibility (daylight/shadow), which my own calculation didn’t. Also did a UI pass — added a tagline, a live status badge, grouped the info text into a proper panel, and a favicon. Live demo: https://droid678.github.io/ISS-tracker/ Repo: https://github.com/droid678/ISS-tracker.git
Ships:
ISS Live Tracker 🛰️ A real time web app that tracks the International Space Station’s live position on an interactive map and predicts exactly when and whether it’ll be visible from anywhere on Earth. Click any spot on the map to get the next visible pass for that location, complete with duration and whether you will able to see it. Built from scratch with plain HTML, CSS, and JavaScript — no frameworks. Features a live updating marker with a real orbital trail, real time day/night shading calculated from the sun’s actual position, and a pass predictor powered by real ISS tracking APIs. As a beginner, this was my first fully shipped project, including real deployment debugging (HTTPS/mixed-content issues, case-sensitivity bugs between Windows and Linux, and switching APIs mid-project when one proved unreliable in production). Live demo: https://droid678.github.io/ISS-tracker/ Repo: https://github.com/droid678/ISS-tracker...
|
1792853607.7797627
|
1792940007.7797627
|
|
64514
|
YouTube video watcher by @suklaasukkulayt | Starda YouTube video watcher by @suklaasukkulayt | Stardance...
|
suklaasukkulayt
|
1
|
2.0
|
3
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T14:31:30Z", "hours": 2.0, "multiplier": 1.26, "payout": 3, "blessing": "neutral", "text": "I made a site to watch YouTube videos without cookies and without most of the UI. It’s idea is to make it possible to just show one video at a time for example some kiosk projects or something that can load embeds, but no YouTube UI or advanced cookie javascript. It supports most of the YouTube URL’s (shorts, embeds, watch (live support too) and youtu.be) or you could only paste or type in the video ID. Also you can type it in the URL: https://yt-watcher.suklaasukkula.dev/VIDEO_ID_OR_URL_HERE . Please watch the showcase video from my last devlog. This was a pretty simple project compared to my other projects, but it was still fun to make.", "repo": "https://github.com/suklaasukkulayt/youtube-video-watcher", "demo": "https://yt-watcher.suklaasukkula.dev/"}]...
|
[{"post_id": 73056, "ts": "202 [{"post_id": 73056, "ts": "2026-09-24T09:03:11Z", "hours": 0.5008, "text": "Devlog 3 This is the final devlog probably. I have now added the ability to type the video ID straight to the URL . Like this: https://yt-watcher.suklaasukkula.dev/VIDEO_ID_HERE You can even type the YouTube video URL straight to the URL. Like this: https://yt-watcher.suklaasukkula.dev/VIDEO_URL_HERE I had to use a 404 HTML file because otherwise it would just return 404 when you tried to enter the video ID in the URL (and I used AI to help with that)."}, {"post_id": 72717, "ts": "2026-09-23T16:15:12Z", "hours": 0.9939, "text": "Devlog 2 I made the UI a bit better And I finally added support for other YouTube URLs : Shorts works Embed works Live works (atleast with the youtube.com/watch URL) I also swapped the Kevin MacLeod for a random screen test video :) The project is now almost completed, the final feature I want to add is that you could put the video ID in the URL of this website and that would load it."}, {"post_id": 72126, "ts": "2026-09-22T07:47:30Z", "hours": 0.7975, "text": "Devlog 1 I’m making a YouTube video watcher , that you can use to watch YouTube videos without cookies and with super simple UI . Like if you are using an old browser this might work idk. This currently has: A button to show the input field You can enter the video ID , or use a YouTube URL for easy use, but the URL thing doesn’t currently support shorts or embed URL’s. I will make it better next devlog."}]...
|
Title: YouTube video watcher by @suklaasukkulayt | Title: YouTube video watcher by @suklaasukkulayt | Stardance
Devlogs:
Devlog 1 I’m making a YouTube video watcher , that you can use to watch YouTube videos without cookies and with super simple UI . Like if you are using an old browser this might work idk. This currently has: A button to show the input field You can enter the video ID , or use a YouTube URL for easy use, but the URL thing doesn’t currently support shorts or embed URL’s. I will make it better next devlog.
Devlog 2 I made the UI a bit better And I finally added support for other YouTube URLs : Shorts works Embed works Live works (atleast with the youtube.com/watch URL) I also swapped the Kevin MacLeod for a random screen test video :) The project is now almost completed, the final feature I want to add is that you could put the video ID in the URL of this website and that would load it.
Devlog 3 This is the final devlog probably. I have now added the ability to type the video ID straight to the URL . Like this: https://yt-watcher.suklaasukkula.dev/VIDEO_ID_HERE You can even type the YouTube video URL straight to the URL. Like this: https://yt-watcher.suklaasukkula.dev/VIDEO_URL_HERE I had to use a 404 HTML file because otherwise it would just return 404 when you tried to enter the video ID in the URL (and I used AI to help with that).
Ships:
I made a site to watch YouTube videos without cookies and without most of the UI. It’s idea is to make it possible to just show one video at a time for example some kiosk projects or something that can load embeds, but no YouTube UI or advanced cookie javascript. It supports most of the YouTube URL’s (shorts, embeds, watch (live support too) and youtu.be) or you could only paste or type in the video ID. Also you can type it in the URL: https://yt-watcher.suklaasukkula.dev/VIDEO_ID_OR_URL_HERE . Please watch the showcase video from my last devlog. This was a pretty simple project compared to my other projects, but it was still fun to make....
|
1792814149.6734862
|
1792900549.6734862
|
|
54137
|
Telegram assistent bot by @kdenis | Stardance
|
kdenis
|
1
|
18.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T14:27:28Z", "hours": 18.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What did you make? I built a simple Telegram bot that helps users track their daily activities (like sleep, workouts, or study time) and generates visual weekly charts using matplotlib to track progress over time. What was challenging? The most challenging part was understanding how to implement multi-step input flows using conversation handlers (like chaining prompts for logging data) and structuring the memory logic to track user activities dynamically over a week without needing a heavy database setup. What are you proud of? I am proud that I successfully learned Python from scratch while building this project! I used AI purely as a tutor—to explain concepts and guide me—rather than writing the code for me, meaning I wrote and understood every line myself. I am also proud to have mastered building fully functional Telegram bots, dynamic chart rendering, and asynchronous handling. What should people know so they can test your project? Simply open Telegram, search for @MySimpleAssistentBot (or use the link https://t.me/MySimpleAssistentBot ( https://t.me/MySimpleAssistentBot?utm_source=gemini )), and hit /start . You can use /log to record activities, /getstatistic to view your weekly graph, and /help for a list of all commands.", "repo": "https://github.com/deniska-design/telegram-bot", "demo": "https://t.me/MySimpleAssistentBot"}]...
|
[{"post_id": 69656, "ts": "202 [{"post_id": 69656, "ts": "2026-09-17T14:50:21Z", "hours": 7.7464, "text": "Devlog #4: Bot Architecture Cleanup, Persistence & Statistical Charts Hey everyone! Here’s an update on what I’ve been working on for my project over the past few days. 1. Weekly Activity Charts & Statistics The biggest new feature is visual weekly statistics! Now users can see a chart/graph of their activity over the course of the week. The Challenge: Storing data per user, per specific activity, and across each day of the week. The Solution: Kept it clean and simple using user_data . Persistence: Added persistent storage so data isn’t lost on restart. Honestly, I was mind-blown by how powerful Python persistence is—enabling this took literally just a couple of lines of code! 2. Refactoring & Modularizing Code I decided it was time to break up my codebase into multiple modules/files: Separation of Concerns: Initially, my architecture felt a bit messy—files knew too much about each other’s internal logic and were tightly coupled. I refactored the project so that each file and module is more autonomous and encapsulated. Troubleshooting: Splitting the code broke a few things at first, but after a bit of debugging, everything is working smoothly now. 3. User Experience & Input Validation I made several quality-of-life improvements to make the bot feel much more robust: Daily Log Reminders: Added a daily reminder prompting users to log their data for the day. (Note: Users just need to run /start once to initialize reminders and resets). Strict Input Validation: Added input filters. If a step requires a number, invalid text is rejected; if it asks to pick an activity, custom inputs are blocked. Python vs C++ appreciation: Coming from a C++ background, it constantly amazes me how complex user interactions and data handling can be written in just a few lines of Python! What’s Next? Writing a solid README.md Submitting the project!"}, {"post_id": 60747, "ts": "2026-09-03T09:55:40Z", "hours": 3.9458, "text": "Devlog #3: Changes In this update, I focused on refining the user metrics and implementing the automated weekly reset mechanism. Metric Adjustments: Removed water intake tracking from the list of monitored metrics. Simply put, I personally don’t track my daily water intake, so I decided to streamline the bot’s focus. Automated Weekly Reset: Spent most of my development time implementing a scheduled automated reset system that triggers every Saturday at 12:00 PM . While the underlying logic isn’t overly complex, working through it while learning Python took more time than expected. As shown in the screenshot, where test data entered before 11:31 AM was automatically cleared upon trigger. Learnings Logging ( logger.info ): Discovered how extremely valuable logger.info is for debugging scheduled jobs and tracking state transitions. Without proper logging, diagnosing automated execution bugs would have been significantly harder. Next Steps End-of-Week Summary Reporting: Implement logic to show results right before the automated reset occurs. Weekly Analytics & Graphs: Add visual statistics showing daily progress over the past week"}, {"post_id": 56574, "ts": "2026-08-28T11:53:37Z", "hours": 4.8633, "text": "DevLog #2: Switching Libraries Initially, I started building this bot using another library. However, I decided to rewrite the codebase using python-telegram-bot Why? python-telegram-bot is much more practical and scalable for complex, multi-step projects. Since I plan to build bigger features in the future, I figured it was best to learn and adopt a solid framework right now. I spent about an hour migrating my previous logic to PTB, and it was definitely worth it! New Features I added core bot commands and integrated custom reply keyboards: /help : Shows available commands. /log : Prompts you to pick an activity via a custom reply keyboard and log your stats. /analytic : Allows you to select an activity and view your current recorded progress. The trickiest part: was figuring out how to handle sequential user inputs : First function: Catches the initial command (e.g., /log ). Second function: Receives the chosen activity (e.g., Sport ), asks a follow-up question (e.g., “How long have you been doing this?” ) Third function: Takes the entered number/value and saves it to the selected activity state. fix-it list: Custom Prompts per Activity: Currently, selecting “Water” asks “How long have you been doing this?” instead of “How much water did you drink?” . I need to customize questions based on the activity type. Data Accumulation: Right now, logging a value overwrites context.user_data[activity] instead of adding to it. I will fix this so values accumulate properly over time. Weekly Reset: I need to implement an automated mechanism to reset tracking data every Saturday. Since fixing these remaining issues won’t take too much time, I’ll soon be ready to add new features. So let me know if you got any ideas in the comments below"}, {"post_id": 54384, "ts": "2026-08-25T11:25:35Z", "hours": 1.6775, "text": "DevLog #1: Learning Python Through Practice This is my first Python project. Instead of just memorizing syntax from tutorials, I decided to learn the language through hands-on practice. To test this approach, I’m building a simple Telegram Bot designed to track daily health habits. The Core Concept The bot will allow users to quickly log their daily metrics: Sleep duration Water intake Physical activity / workouts It stores this data and, upon clicking a button, generates a weekly summary analysis to track progress. Current Progress So far, I have: Created and structured the GitHub repository. Added essential initial files ( .gitignore , dependencies, configuration). Developed a basic, functional Telegram bot prototype. The Experiment This project isn’t meant to be a full-scale commercial application; it’s a personal challenge: Can I effectively master Python by building functional, real-world projects from scratch?"}]...
|
Title: Telegram assistent bot by @kdenis | Stardan Title: Telegram assistent bot by @kdenis | Stardance
Devlogs:
DevLog #1: Learning Python Through Practice This is my first Python project. Instead of just memorizing syntax from tutorials, I decided to learn the language through hands-on practice. To test this approach, I’m building a simple Telegram Bot designed to track daily health habits. The Core Concept The bot will allow users to quickly log their daily metrics: Sleep duration Water intake Physical activity / workouts It stores this data and, upon clicking a button, generates a weekly summary analysis to track progress. Current Progress So far, I have: Created and structured the GitHub repository. Added essential initial files ( .gitignore , dependencies, configuration). Developed a basic, functional Telegram bot prototype. The Experiment This project isn’t meant to be a full-scale commercial application; it’s a personal challenge: Can I effectively master Python by building functional, real-world projects from scratch?
DevLog #2: Switching Libraries Initially, I started building this bot using another library. However, I decided to rewrite the codebase using python-telegram-bot Why? python-telegram-bot is much more practical and scalable for complex, multi-step projects. Since I plan to build bigger features in the future, I figured it was best to learn and adopt a solid framework right now. I spent about an hour migrating my previous logic to PTB, and it was definitely worth it! New Features I added core bot commands and integrated custom reply keyboards: /help : Shows available commands. /log : Prompts you to pick an activity via a custom reply keyboard and log your stats. /analytic : Allows you to select an activity and view your current recorded progress. The trickiest part: was figuring out how to handle sequential user inputs : First function: Catches the initial command (e.g., /log ). Second function: Receives the chosen activity (e.g., Sport ), asks a follow-up question (e.g., “How long have you been doing this?” ) Third function: Takes the entered number/value and saves it to the selected activity state. fix-it list: Custom Prompts per Activity: Currently, selecting “Water” asks “How long have you been doing this?” instead of “How much water did you drink?” . I need to customize questions based on the activity type. Data Accumulation: Right now, logging a value overwrites context.user_data[activity] instead of adding to it. I will fix this so values accumulate properly over time. Weekly Reset: I need to implement an automated mechanism to reset tracking data every Saturday. Since fixing these remaining issues won’t take too much time, I’ll soon be ready to add new features. So let me know if you got any ideas in the comments below
Devlog #3: Changes In this update, I focused on refining the user metrics and implementing the automated weekly reset mechanism. Metric Adjustments: Removed water intake tracking from the list of monitored metrics. Simply put, I personally don’t track my daily water intake, so I decided to streamline the bot’s focus. Automated Weekly Reset: Spent most of my development time implementing a scheduled automated reset system that triggers every Saturday at 12:00 PM . While the underlying logic isn’t overly complex, working through it while learning Python took more time than expected. As shown in the screenshot, where test data entered before 11:31 AM was automatically cleared upon trigger. Learnings Logging ( logger.info ): Discovered how extremely valuable logger.info is for debugging scheduled jobs and tracking state transitions. Without proper logging, diagnosing automated execution bugs would have been significantly harder. Next Steps End-of-Week Summary Reporting: Implement logic to show results right before the automated reset occurs. Weekly Analytics & Graphs: Add visual statistics showing daily progress over the past week
Devlog #4: Bot Architecture Cleanup, Persistence & Statistical Charts Hey everyone! Here’s an update on what I’ve been working on for my project over the past few days. 1. Weekly Activity Charts & Statistics The biggest new feature is visual weekly statistics! Now users can see a chart/graph of their activity over the course of the week. The Challenge: Storing data per user, per specific activity, and across each day of the week. The Solution: Kept it clean and simple using user_data . Persistence: Added persistent storage so data isn’t lost on restart. Honestly, I was mind-blown by how powerful Python persistence is—enabling this took literally just a couple of lines of code! 2. Refactoring & Modularizing Code I decided it was time to break up my codebase into multiple modules/files: Separation of Concerns: Initially, my architecture felt a bit messy—files knew too much about each other’s internal logic and were tightly coupled. I refactored the project so that each file and module is more autonomous and encapsulated. Troubleshooting: Splitting the code broke a few things at first, but after a bit of debugging, everything is working smoothly now. 3. User Experience & Input Validation I made several quality-of-life improvements to make the bot feel much more robust: Daily Log Reminders: Added a daily reminder prompting users to log their data for the day. (Note: Users just need to run /start once to initialize reminders and resets). Strict Input Validation: Added input filters. If a step requires a number, invalid text is rejected; if it asks to pick an activity, custom inputs are blocked. Python vs C++ appreciation: Coming from a C++ background, it constantly amazes me how complex user interactions and data handling can be written in just a few lines of Python! What’s Next? Writing a solid README.md Submitting the project!
Ships:
What did you make? I built a simple Telegram bot that helps users track their daily activities (like sleep, workouts, or study time) and generates visual weekly charts using matplotlib to track progress over time. What was challenging? The most challenging part was understanding how to implement multi-step input flows using conversation handlers (like chaining prompts for logging data) and structuring the memory logic to track user activities dynamically over a week without needing a heavy database setup. What are you proud of? I am proud that I successfully learned Python from scratch while building this project! I used AI purely as a tutor—to explain concepts and guide me—rather than writing the code for me, meaning I wrote and understood every line myself. I am also proud to have mastered building fully functional Telegram bots, dynamic chart rendering, and asynchronous handling. What should people know so they can test your project? Simply open Telegram, search for @MySimpleAssistentBot (or use the link https://t.me/MySimpleAssistentBot ( https://t.me/MySimpleAssistentBot?utm_source=gemini )), and hit /start . You can use /log to record activities, /getstatistic to view your weekly graph, and /help for a list of all commands....
|
1792856950.9740636
|
1792943350.9740636
|
|
38432
|
Servo Utility Platform by @Kacenta | Stardance
|
Kacenta
|
1
|
74.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T14:18:05Z", "hours": 74.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Devlog #8 - Actually Finished S.U.P. - v1.0 Okay, NOW it’s finished. GO HERE TO SEE VIDEO Last time I said we were getting close. Now I can finally confirm it! S.U.P. is finished. There was still a surprising amount of work left after v0.9.1, especially around handling different servo types. I ended up reworking a lot of the servo logic to make everything work together properly. Important Features Added Full support for different servo types , including 90° , 180° positional , and 360° continuous-rotation servos Added working pulse-width calibration for servo control Added working servo sweeps for testing positional servos Finished the servo type handling system Improved calibration logic so it works correctly with the selected servo type Finished saved profile handling , including persistent storage across resets Finished the joystick calibration system Completed the C.E.A. Laser Calibration system Finished the Settings , Debug , Calibration , Manual Control , and other menu systems Added and tested the final error handling and debugging tools Final Testing I tested the main workflows with real hardware instead of relying on a simulation (as I always have). The Demo Video The final demo video is finished and uploaded here: https://www.youtube.com/watch?v=IzWqsmjGq4U I tried to show the project itself rather than only talking about the code and development process. One thing I did not manage to include properly was footage of the full physical servo calibration process. The only calibration footage I kept was the joystick calibration. Everything works though :D. Sorry about that. The actual calibration system and everything else was still tested and works. I explain the missing footage in the video. Final Result S.U.P. started as a small ESP32 servo tester and grew into a much larger system than I originally expected. TODO There are still ideas I might work on in the future, but they are no longer required for the first release: Custom PCB Custom 3D Case Advanced diagnostics (I’ll have to open up the servo) General code cleanup and optimization For now, though: S.U.P. v1.0 is done.", "repo": "https://github.com/Denkata7622/Servo-Utility-Platform", "demo": ""}]...
|
[{"post_id": 73094, "ts": "202 [{"post_id": 73094, "ts": "2026-09-24T11:30:47Z", "hours": 7.7653, "text": "Devlog #8 - Actually Finished S.U.P. - v1.0 Okay, NOW it’s finished. (GO HERE TO SEE VIDEO: https://www.youtube.com/watch?v=IzWqsmjGq4U ) Last time I said we were getting close. Now I can finally confirm it! S.U.P. is finished. There was still a surprising amount of work left after v0.9.1, especially around handling different servo types. I ended up reworking a lot of the servo logic to make everything work together properly. Important Features Added Full support for different servo types , including 90° , 180° positional, and 360° continuous-rotation servos Added working pulse-width calibration for servo control Added working servo sweeps for testing positional servos Finished the servo type handling system Improved calibration logic so it works correctly with the selected servo type Finished saved profile handling , including persistent storage across resets Finished the joystick calibration system Completed the C.E.A. Laser Calibration system Finished the Settings , Debug , Calibration , Manual Control , and other menu systems Added and tested the final error handling and debugging tools Final Testing I tested the main workflows with real hardware instead of relying on a simulation (as I always have). The Demo Video The final demo video is finished and uploaded here: https://www.youtube.com/watch?v=IzWqsmjGq4U I tried to show the project itself rather than only talking about the code and development process. One thing I did not manage to include properly was footage of the full physical servo calibration process. The only calibration footage I kept was the joystick calibration. Everything works though :D. Sorry about that. The actual calibration system and everything else was still tested and works. I explain the missing footage in the video. Final Result S.U.P. started as a small ESP32 servo tester and grew into a much larger system than I originally expected. TODO There are still ideas I might work on in the future, but they are no longer required for the first release: Custom PCB Custom 3D Case Advanced diagnostics (I’ll have to open up the servo) General code cleanup and optimization For now, though: S.U.P. v1.0 is done."}, {"post_id": 69646, "ts": "2026-09-17T14:15:59Z", "hours": 7.7436, "text": "Devlog #7 - Getting Closer S.U.P. - v0.9.1 To be honest, i kinda lied last time… There is still a lot of work to do, espesially about the servoType handling Important Features Added Added WORKING Joystick Calibration + integrated additional calibration logic directly in joystick movement (toggable, of course) You can finally use the manualControl() with a fully calibrated custom profile . Changing the selected profile now updates automatically . Huge improvements to Selecting Servo Type. Now calibration works for both 90° and 180° servos. Added Servo Test Sweep ! Added a custom option in the main menu to change profiles Wrote the About me Section (Finally) Less Important Features Added Isolated updateSelectedProfile() in its own function so i can reuse it (like 100+ lines of code saved there…) Added debugger function (in “Debug” menu) for testing the joystick calibration Added a global int - actionDelay = 300ms. I have always added a delay(300) before changing display screens, starting/ending actions, ect.. to keep the app posished and remove the irritation of “fake”/“accidental” double, triple and spam clicks Fixed a bug in the normal joystick debugger function TODO [ ] Add support for 360 deg servos basically writing a custom new version of each function but for rotating servos because they are fundamentally different then positional servos (such as 90° and 180°) and don’t integrate well into the current ecosystem. [ ] Show which saved profile is for which servo type [ ] Film the video for the v1.0 release (we are really getting closer :D)."}, {"post_id": 65921, "ts": "2026-09-11T11:51:55Z", "hours": 10.3236, "text": "Devlog #6 - THE “ALMOST FINISHED” [Some original greeting here]! Time goes by, so does progress on this calibrator tool. I really started to like it to be honest. It has been really fun making all the additional systems around the calibration, such as the “Debug”, “Settings”, (soon “About” too), all the UI polish and case handling. Even the NVS storage setup (basically the real ESP32 storage instead of the RAM-like one it usually uses) teached me a lot and I’m proud of how far this project has come. But enough yapping. I FINALLY Taped the Laser module to the servo bracket! Also, I put it in a box of TicTac (image below XD) so it doesnt fall and give wrong reading. Then I filled the box with COINS so it doesn’t wiggle during servo movement. Just WILD XD So, what did i update in this 1 week? - Well… A LOT. If i had to list it: Made the settings finally work! Fixed a bug where option scroll started when there was no need at all Saved all settings, preferences and user profiles to permament NVS storage Changed ALL delay() instances with millis() (Where possible/wanted). Just this took like 4 hours :I (Like I said before) - FINALLY Taped the Laser module to the servo bracket! Also, I put it in a box of TicTac (image below XD) so it doesnt fall and give wrong reading. Then I filled the box with coins so it gets heavy enough to not wiggle during joystick movement :D Changed a breadboard because for some reason my jumper wires started losing lots of voltage and the connectors were really loose for some reason Polished the UI, A LOT. I probably plan to change from normal lists to Flipper Zero-style menu soon. Added a “Simulate Errors” feature in the “Debug” menu to test if my error and case handling works well Fixed multiple smaller bugs… I think that’s pretty much it, there could be more smaller things I don’t remember rn (sorry about that). Notes Sadly went a little above 10 hours this time D; - I sill have lots of things to do - mainly polish messages, small inconsistensies, ect. I kinda gave up on adding a keyboard - it is pretty unnecessary and will add a lot more cases to handle for almost no benefit. These days I will be filming the final video for the v1.0 release! I accept any ideas from you for future features and filming advice."}, {"post_id": 61815, "ts": "2026-09-04T22:00:19Z", "hours": 9.6508, "text": "Devlog #5 - Settings & Profile Storage ## Unknown - 5th September 2026 ### Version: v0.4.0-settinger Hello again! Yeah… I kinda forgot the journal existed again XD A LOT has changed since the last devlog, especially internally. The project is starting to feel less like a giant prototype held together by hopes and prayers and more like an actual tool. ### Main events - Finally started working properly on the Settings menu ! - Added persistent settings using the ESP32’s Preferences storage - Basically all the important environment variables are now stored, including: - - Servo / joystick pins - - Axis inversion and swapping - - Speed settings and multipliers - - Calibration parameters - - Joystick deadzones and offsets - - Debug mode - - Display and scrolling settings - - Calibration list information - - Various delays and timing values - Added saveSettings() and loadSettings() functions so I don’t have to hardcode everything every single time the board boots - Settings also have default values, so if there is no saved value yet, the program still has a working configuration - Started separating the stored data into different Preferences namespaces , so Settings and Servo Profiles don’t all get thrown into one giant storage section - Calibration Lists got actual persistent storage, meaning the calibration data doesn’t disappear every time the ESP32 restarts - Added more profile-related error handling - Continued expanding the 3-digit error code system , which is starting to look suspiciously like I accidentally created my own mini error protocol XD - Did a LOT more bug hunting and general code cleanup - Also spent way too much time making tiny UI things work properly because apparently I have decided that a 128x64 OLED deserves the same amount of attention as a full desktop application :I ### Some of the more important stuff The biggest thing here is probably the storage system. Before, most of the variables were basically just sitting in the code waiting for me to change them manually. Now I can save them to the ESP32 and load them again later. For example: settings . putDouble ( \"speedMultiplier\" , speedMultiplier ); and later: speedMultiplier = settings . getDouble ( \"speedMultiplier\" , 1 ); So if I change a setting, restart the board, and come back later, it stays changed. This also means I finally don’t have to keep scrolling to the top of a 1500+ line sketch every time I want to change something XD ### What’s next? - [ ] Actually TEST the full calibration workflow with a real servo - [ ] Add an X-axis animation to the Settings menu when changing variables - [ ] Add a way to name calibration list slots - [ ] Make the amount of list slots dynamically generated instead of hardcoded - - [ ] Add an “Add New Slot” option - [ ] Add an on-screen keyboard or find a decent library for one - [ ] Add a way to connect to the ESP32-S3’s second USB port and extract saved servo profiles as files - [ ] Keep murdering bugs until the project stops finding new ones ### Notes I’m starting to realize that the actual servo movement part was probably the easy bit. The annoying part is everything around it. Menus, storage, scrolling, profile management, error handling, input validation… At least it makes the project way more interesting :D"}, {"post_id": 53899, "ts": "2026-08-24T16:29:53Z", "hours": 7.9342, "text": "Devlog #4 - UI Polish Hello! Probably not one of the most impressive things, but a good UI is something people always respect (just subcounciously… ). Added prettyPrint() funtion, which essentially gives me the ability to parse any long message into separate pages with skippable delays. All you need to do is just click once you finished reading the page. For now I’m experimenting with the delay but 7.5 seconds feels natural for 64x128 display (probably around ~40 words). Sadly, I need to rework some of the functions for the calibration picker because there is just no way to go back to the main menu at this point.. Added some Display Error Function, which pretty much relies on prettyPrint(). Added some helper functions for things i consistently call to lower the ammount of same-purpose code and managed to bring the sketch down to ~1500 lines! The attached image is the skippable delay I kinda invented because I didn’t want to use milis() XD."}, {"post_id": 48030, "ts": "2026-08-16T10:02:26Z", "hours": 9.9022, "text": "Devlog #3 - Servo Profiles Hello everyone, We just hit a new milestone in the development of this project: Laser Calibration Profiles How do They Work? Right now we have a menu where you can choose between 3 calibration profiles each having a different ammount of samples ( the more, the better, but slower due to the higher ammount of measurements) Basic ( 5 samples ) [0, 45, 90, 135, 180] Accurate ( 9 samples ) [0, 22.5, 45, 67.5, 90, 112.5, 135, 157.5, 180] Servophile ( 17 samples ) [0, 11.25, 22.5, 33.75, 45, 56.25, 67.5, 78.75, 90, 101.25, 112.5, 123.75, 135, 146.25, 157.5, 168.75, 180] (I plan on adding a Super Servophile profile with 33 samples soon!) After choosing the profile (and - in the future - one of the 3 slots each list has), the user will go through with recording distances for each angle using a marking on the wall (use a pencil or just tape a paper and draw on it) That’s it! (At least for the manual input XD) Then the list with colleced measurements gets put in a script and thrown out as a list of angles. Now that’s it! Next Features I plan on adding an expected measurement section in the UI so the user has a better idea what the expected output should be during calibration (also helps with debugging ;) ) Turning the List of angles into a complex map that can directly transform digital angles to calibrated ones Actually using the calilbration profiles when moving servos Adding all environment variables to settings so you can change them during runtime!"}, {"post_id": 39364, "ts": "2026-08-02T09:24:02Z", "hours": 13.0031, "text": "Devlog #2 - The OLED Age SUP! It has been like a week since the last devlog… and a lot happened to be honest. (If you don’t wanna read, just go down to see the SUPER cinematic demo I made for you <3 ) If you read the first devlog, you might remember that the plan was basically: “Make the Servo move” “Then add a Joystick” and then: “Make an OLED Menu” Well, I just finished the OLED Menu! THE CODE This time I spent a LOT more time on the actual code structure (+4 hours wondering why jumper wires (the bare ones with no heads) drop so much voltage, but we don’t talk about that). The sketch has grown up to like ~700 lines, but more importantly, I started optimising it and making the code reusable instead of just putting everything into loop() . I have broken the code down into independent functions like: calculateOffCenter() offCenterToDirection() buildMenu() callMenuOption() drawScrollbar() ... So now everything is more optimised and easier to expand and debug! THE MENU Our menu now consists of: - \"Manual Control\" - \"Calibration\" - \"Debug\" - \"Settings\" I made buildMenu() take an array of options and their length, so I can reuse the same function for all menus. I also added a scrollbar (cause apparently four lines of text just wasn’t enough). Calibration Time This is where things got interesting. I started working on the Calibration menu. Right now it has: - Simple Calibr. - Pulse Width Calibr. - C.E.A. LASER Calibr. - 360deg Servo - 180deg Servo - Go Back Some of these are still placeholders, but LASER Calibration is halfway done. C.E.A. LASER CALIBRATION Yes. I finally found a purpose to my year old laser module :D The idea is pretty simple. Tape a laser to the servo head. Put a piece of paper on a wall. Point the laser at it. Move it a certain ammount of degrees (e.g. 5deg) Then use the distance between the 2 points to figure out how much degrees the servo ACTUALLY moved. And this is where the math comes in. If the servo is L centimeters away from the wall, and the laser spot moves X centimeters, we can calculate the angle with: θ = arctan(X / L) So instead of trusting the servo when sayin’: “Yeah, that’s 90° bro” S.U.P. is able to measure where the servo is actually located. And the best part is that the user doesn’t need to buy some expensive angle sensor (which is the whole idea of the project btw). You need: A laser A ruler A piece of paper A pencil A wall (I hope you have one C: ) That’s it. And I think that’s pretty damn cool. The current prototype goes through: 0° 45° 90° 135° 180° and lets me enter the measured distance (in cm ofc, no freedom units… ) with the joystick. It isn’t finished yet, but the basic system is working. What’s Next? Finish C.E.A. Laser Calibration Make the angle calculation automatic Add proper servo calibration profiles Work on Pulse Width Calibration Figure out 180° vs 360° servos Add joystick calibration Keep improving the OLED interface And hopefully make S.U.P. look less like a breadboard project and more like an actual tool."}, {"post_id": 35165, "ts": "2026-07-26T12:42:25Z", "hours": 7.8275, "text": "Devlog #1 - The Rise of S.U.P. Hello everyone, Welcome to the first ever Devlog of the Servo Utility Platform (aka. S.U.P.) This is the project I decided to make for Stardance , and the first ever solely non-AI-dependent one :D Overview So what even is S.U.P.? [ Demo can be found at the Bottom if you don’t like reading explanations :D] The Servo Utility Platform is, I won’t lie, nothing super wow . The idea is that instead of making a random test circuit every time I wanna test a new servo, I can use S.U.P. to quickly test it, calibrate it, and see if something is wrong with it. At least that’s the plan cuz right now it’s still a bunch of wires on a breadboard :D Hardware Used Currently, S.U.P. uses: ESP-WROOM-32 x1 Small I2C OLED 128x64 Display x1 Joystick Module x1 MG90S Servo Module x1 830-point Breadboard x1 A suspicious amount of jumper wires… The Beginning The first version was… really simple XD. It was literally an ESP32 shooting electricity through a wire and nothing more. [Check out the “Fancy This” picture at the bottom] The goal wasn’t to make something impressive. It was just to make sure I can do the simplest thing imaginable: “Can I make the servo move?” The answer was yes (thankfully XD). After that I added a Volume Knob ( potentiometer ). [Check the Picture that features it (it’s really sad that I can’t put the pictures in-between text)] This helped me control the servo angle , which made it more satisfying to play around with, but felt too weird. It felt like giving a static position to the servo, not making it move . The knob might work for a real 10$ servo tester but it’s just not my style . MEET: The Joystick So I replaced the potentiometer with his cooler Oklahoma bro: The Joystick . [A video of me “casually” testing the hardware can be found down below] And this is where it started feeling like the gadget of my dreams . Instead of: Pot position → Static Servo angle I first changed it to: Joystick Pot position → Static Servo angle wow! amazing! So I had to do a lil more work than changing one wire… The redesigned system was way better: Joystick x-axis position (still a pot just a fancy one ) → offCenter from 0 (we actaully use the middle of the pot as 0 and the ends as -1 and 1) → Velocity → Servo Speed Now moving the joystick slightly makes super small adjustments, while pushing it further makes the servo go wayy faster. To make this feel better, I made my own acceleration function instead of just using a simple linear movement. The final result feels surprisingly nice . Current Prototype Right now S.U.P. has: A working joystick-controlled servo system Acceleration-based movement Speed settings Adjustable servo limits Joystick deadzones A debugging system because manually adding and removing Serial.println() gets old really quickly :I [Now look at the Super Cinematic picture of that MG90S Servo] Things I Learned A few things I learned while making this: Joysticks are basically just two pots and a button The ESP32 ADC reads voltage , not “positions” Tuning acceleration functions is really worth it for making the movement feel good What’s Next? The next steps are: Add joystick calibration Find servo minimum and maximum angles (if even possible idk) Figure out how to detect 180° vs 360° servos Start building the OLED menu system (tbh sounds like the most interesting and hard part at the same time 🙏)"}]...
|
Title: Servo Utility Platform by @Kacenta | Starda Title: Servo Utility Platform by @Kacenta | Stardance
Devlogs:
Devlog #1 - The Rise of S.U.P. Hello everyone, Welcome to the first ever Devlog of the Servo Utility Platform (aka. S.U.P.) This is the project I decided to make for Stardance , and the first ever solely non-AI-dependent one :D Overview So what even is S.U.P.? [ Demo can be found at the Bottom if you don’t like reading explanations :D] The Servo Utility Platform is, I won’t lie, nothing super wow . The idea is that instead of making a random test circuit every time I wanna test a new servo, I can use S.U.P. to quickly test it, calibrate it, and see if something is wrong with it. At least that’s the plan cuz right now it’s still a bunch of wires on a breadboard :D Hardware Used Currently, S.U.P. uses: ESP-WROOM-32 x1 Small I2C OLED 128x64 Display x1 Joystick Module x1 MG90S Servo Module x1 830-point Breadboard x1 A suspicious amount of jumper wires… The Beginning The first version was… really simple XD. It was literally an ESP32 shooting electricity through a wire and nothing more. [Check out the “Fancy This” picture at the bottom] The goal wasn’t to make something impressive. It was just to make sure I can do the simplest thing imaginable: “Can I make the servo move?” The answer was yes (thankfully XD). After that I added a Volume Knob ( potentiometer ). [Check the Picture that features it (it’s really sad that I can’t put the pictures in-between text)] This helped me control the servo angle , which made it more satisfying to play around with, but felt too weird. It felt like giving a static position to the servo, not making it move . The knob might work for a real 10$ servo tester but it’s just not my style . MEET: The Joystick So I replaced the potentiometer with his cooler Oklahoma bro: The Joystick . [A video of me “casually” testing the hardware can be found down below] And this is where it started feeling like the gadget of my dreams . Instead of: Pot position → Static Servo angle I first changed it to: Joystick Pot position → Static Servo angle wow! amazing! So I had to do a lil more work than changing one wire… The redesigned system was way better: Joystick x-axis position (still a pot just a fancy one ) → offCenter from 0 (we actaully use the middle of the pot as 0 and the ends as -1 and 1) → Velocity → Servo Speed Now moving the joystick slightly makes super small adjustments, while pushing it further makes the servo go wayy faster. To make this feel better, I made my own acceleration function instead of just using a simple linear movement. The final result feels surprisingly nice . Current Prototype Right now S.U.P. has: A working joystick-controlled servo system Acceleration-based movement Speed settings Adjustable servo limits Joystick deadzones A debugging system because manually adding and removing Serial.println() gets old really quickly :I [Now look at the Super Cinematic picture of that MG90S Servo] Things I Learned A few things I learned while making this: Joysticks are basically just two pots and a button The ESP32 ADC reads voltage , not “positions” Tuning acceleration functions is really worth it for making the movement feel good What’s Next? The next steps are: Add joystick calibration Find servo minimum and maximum angles (if even possible idk) Figure out how to detect 180° vs 360° servos Start building the OLED menu system (tbh sounds like the most interesting and hard part at the same time 🙏)
Devlog #2 - The OLED Age SUP! It has been like a week since the last devlog… and a lot happened to be honest. (If you don’t wanna read, just go down to see the SUPER cinematic demo I made for you <3 ) If you read the first devlog, you might remember that the plan was basically: “Make the Servo move” “Then add a Joystick” and then: “Make an OLED Menu” Well, I just finished the OLED Menu! THE CODE This time I spent a LOT more time on the actual code structure (+4 hours wondering why jumper wires (the bare ones with no heads) drop so much voltage, but we don’t talk about that). The sketch has grown up to like ~700 lines, but more importantly, I started optimising it and making the code reusable instead of just putting everything into loop() . I have broken the code down into independent functions like: calculateOffCenter() offCenterToDirection() buildMenu() callMenuOption() drawScrollbar() ... So now everything is more optimised and easier to expand and debug! THE MENU Our menu now consists of: - "Manual Control" - "Calibration" - "Debug" - "Settings" I made buildMenu() take an array of options and their length, so I can reuse the same function for all menus. I also added a scrollbar (cause apparently four lines of text just wasn’t enough). Calibration Time This is where things got interesting. I started working on the Calibration menu. Right now it has: - Simple Calibr. - Pulse Width Calibr. - C.E.A. LASER Calibr. - 360deg Servo - 180deg Servo - Go Back Some of these are still placeholders, but LASER Calibration is halfway done. C.E.A. LASER CALIBRATION Yes. I finally found a purpose to my year old laser module :D The idea is pretty simple. Tape a laser to the servo head. Put a piece of paper on a wall. Point the laser at it. Move it a certain ammount of degrees (e.g. 5deg) Then use the distance between the 2 points to figure out how much degrees the servo ACTUALLY moved. And this is where the math comes in. If the servo is L centimeters away from the wall, and the laser spot moves X centimeters, we can calculate the angle with: θ = arctan(X / L) So instead of trusting the servo when sayin’: “Yeah, that’s 90° bro” S.U.P. is able to measure where the servo is actually located. And the best part is that the user doesn’t need to buy some expensive angle sensor (which is the whole idea of the project btw). You need: A laser A ruler A piece of paper A pencil A wall (I hope you have one C: ) That’s it. And I think that’s pretty damn cool. The current prototype goes through: 0° 45° 90° 135° 180° and lets me enter the measured distance (in cm ofc, no freedom units… ) with the joystick. It isn’t finished yet, but the basic system is working. What’s Next? Finish C.E.A. Laser Calibration Make the angle calculation automatic Add proper servo calibration profiles Work on Pulse Width Calibration Figure out 180° vs 360° servos Add joystick calibration Keep improving the OLED interface And hopefully make S.U.P. look less like a breadboard project and more like an actual tool.
Devlog #3 - Servo Profiles Hello everyone, We just hit a new milestone in the development of this project: Laser Calibration Profiles How do They Work? Right now we have a menu where you can choose between 3 calibration profiles each having a different ammount of samples ( the more, the better, but slower due to the higher ammount of measurements) Basic ( 5 samples ) [0, 45, 90, 135, 180] Accurate ( 9 samples ) [0, 22.5, 45, 67.5, 90, 112.5, 135, 157.5, 180] Servophile ( 17 samples ) [0, 11.25, 22.5, 33.75, 45, 56.25, 67.5, 78.75, 90, 101.25, 112.5, 123.75, 135, 146.25, 157.5, 168.75, 180] (I plan on adding a Super Servophile profile with 33 samples soon!) After choosing the profile (and - in the future - one of the 3 slots each list has), the user will go through with recording distances for each angle using a marking on the wall (use a pencil or just tape a paper and draw on it) That’s it! (At least for the manual input XD) Then the list with colleced measurements gets put in a script and thrown out as a list of angles. Now that’s it! Next Features I plan on adding an expected measurement section in the UI so the user has a better idea what the expected output should be during calibration (also helps with debugging ;) ) Turning the List of angles into a complex map that can directly transform digital angles to calibrated ones Actually using the calilbration profiles when moving servos Adding all environment variables to settings so you can change them during runtime!
Devlog #4 - UI Polish Hello! Probably not one of the most impressive things, but a good UI is something people always respect (just subcounciously… ). Added prettyPrint() funtion, which essentially gives me the ability to parse any long message into separate pages with skippable delays. All you need to do is just click once you finished reading the page. For now I’m experimenting with the delay but 7.5 seconds feels natural for 64x128 display (probably around ~40 words). Sadly, I need to rework some of the functions for the calibration picker because there is just no way to go back to the main menu at this point.. Added some Display Error Function, which pretty much relies on prettyPrint(). Added some helper functions for things i consistently call to lower the ammount of same-purpose code and managed to bring the sketch down to ~1500 lines! The attached image is the skippable delay I kinda invented because I didn’t want to use milis() XD.
Devlog #5 - Settings & Profile Storage ## Unknown - 5th September 2026 ### Version: v0.4.0-settinger Hello again! Yeah… I kinda forgot the journal existed again XD A LOT has changed since the last devlog, especially internally. The project is starting to feel less like a giant prototype held together by hopes and prayers and more like an actual tool. ### Main events - Finally started working properly on the Settings menu ! - Added persistent settings using the ESP32’s Preferences storage - Basically all the important environment variables are now stored, including: - - Servo / joystick pins - - Axis inversion and swapping - - Speed settings and multipliers - - Calibration parameters - - Joystick deadzones and offsets - - Debug mode - - Display and scrolling settings - - Calibration list information - - Various delays and timing values - Added saveSettings() and loadSettings() functions so I don’t have to hardcode everything every single time the board boots - Settings also have default values, so if there is no saved value yet, the program still has a working configuration - Started separating the stored data into different Preferences namespaces , so Settings and Servo Profiles don’t all get thrown into one giant storage section - Calibration Lists got actual persistent storage, meaning the calibration data doesn’t disappear every time the ESP32 restarts - Added more profile-related error handling - Continued expanding the 3-digit error code system , which is starting to look suspiciously like I accidentally created my own mini error protocol XD - Did a LOT more bug hunting and general code cleanup - Also spent way too much time making tiny UI things work properly because apparently I have decided that a 128x64 OLED deserves the same amount of attention as a full desktop application :I ### Some of the more important stuff The biggest thing here is probably the storage system. Before, most of the variables were basically just sitting in the code waiting for me to change them manually. Now I can save them to the ESP32 and load them again later. For example: settings . putDouble ( "speedMultiplier" , speedMultiplier ); and later: speedMultiplier = settings . getDouble ( "speedMultiplier" , 1 ); So if I change a setting, restart the board, and come back later, it stays changed. This also means I finally don’t have to keep scrolling to the top of a 1500+ line sketch every time I want to change something XD ### What’s next? - [ ] Actually TEST the full calibration workflow with a real servo - [ ] Add an X-axis animation to the Settings menu when changing variables - [ ] Add a way to name calibration list slots - [ ] Make the amount of list slots dynamically generated instead of hardcoded - - [ ] Add an “Add New Slot” option - [ ] Add an on-screen keyboard or find a decent library for one - [ ] Add a way to connect to the ESP32-S3’s second USB port and extract saved servo profiles as files - [ ] Keep murdering bugs until the project stops finding new ones ### Notes I’m starting to realize that the actual servo movement part was probably the easy bit. The annoying part is everything around it. Menus, storage, scrolling, profile management, error handling, input validation… At least it makes the project way more interesting :D
Devlog #6 - THE “ALMOST FINISHED” [Some original greeting here]! Time goes by, so does progress on this calibrator tool. I really started to like it to be honest. It has been really fun making all the additional systems around the calibration, such as the “Debug”, “Settings”, (soon “About” too), all the UI polish and case handling. Even the NVS storage setup (basically the real ESP32 storage instead of the RAM-like one it usually uses) teached me a lot and I’m proud of how far this project has come. But enough yapping. I FINALLY Taped the Laser module to the servo bracket! Also, I put it in a box of TicTac (image below XD) so it doesnt fall and give wrong reading. Then I filled the box with COINS so it doesn’t wiggle during servo movement. Just WILD XD So, what did i update in this 1 week? - Well… A LOT. If i had to list it: Made the settings finally work! Fixed a bug where option scroll started when there was no need at all Saved all settings, preferences and user profiles to permament NVS storage Changed ALL delay() instances with millis() (Where possible/wanted). Just this took like 4 hours :I (Like I said before) - FINALLY Taped the Laser module to the servo bracket! Also, I put it in a box of TicTac (image below XD) so it doesnt fall and give wrong reading. Then I filled the box with coins so it gets heavy enough to not wiggle during joystick movement :D Changed a breadboard because for some reason my jumper wires started losing lots of voltage and the connectors were really loose for some reason Polished the UI, A LOT. I probably plan to change from normal lists to Flipper Zero-style menu soon. Added a “Simulate Errors” feature in the “Debug” menu to test if my error and case handling works well Fixed multiple smaller bugs… I think that’s pretty much it, there could be more smaller things I don’t remember rn (sorry about that). Notes Sadly went a little above 10 hours this time D; - I sill have lots of things to do - mainly polish messages, small inconsistensies, ect. I kinda gave up on adding a keyboard - it is pretty unnecessary and will add a lot more cases to handle for almost no benefit. These days I will be filming the final video for the v1.0 release! I accept any ideas from you for future features and filming advice.
Devlog #7 - Getting Closer S.U.P. - v0.9.1 To be honest, i kinda lied last time… There is still a lot of work to do, espesially about the servoType handling Important Features Added Added WORKING Joystick Calibration + integrated additional calibration logic directly in joystick movement (toggable, of course) You can finally use the manualControl() with a fully calibrated custom profile . Changing the selected profile now updates automatically . Huge improvements to Selecting Servo Type. Now calibration works for both 90° and 180° servos. Added Servo Test Sweep ! Added a custom option in the main menu to change profiles Wrote the About me Section (Finally) Less Important Features Added Isolated updateSelectedProfile() in its own function so i can reuse it (like 100+ lines of code saved there…) Added debugger function (in “Debug” menu) for testing the joystick calibration Added a global int - actionDelay = 300ms. I have always added a delay(300) before changing display screens, starting/ending actions, ect.. to keep the app posished and remove the irritation of “fake”/“accidental” double, triple and spam clicks Fixed a bug in the normal joystick debugger function TODO [ ] Add support for 360 deg servos basically writing a custom new version of each function but for rotating servos because they are fundamentally different then positional servos (such as 90° and 180°) and don’t integrate well into the current ecosystem. [ ] Show which saved profile is for which servo type [ ] Film the video for the v1.0 release (we are really getting closer :D).
Devlog #8 - Actually Finished S.U.P. - v1.0 Okay, NOW it’s finished. (GO HERE TO SEE VIDEO: https://www.youtube.com/watch?v=IzWqsmjGq4U ) Last time I said we were getting close. Now I can finally confirm it! S.U.P. is finished. There was still a surprising amount of work left after v0.9.1, especially around handling different servo types. I ended up reworking a lot of the servo logic to make everything work together properly. Important Features Added Full support for different servo types , including 90° , 180° positional, and 360° continuous-rotation servos Added working pulse-width calibration for servo control Added working servo sweeps for testing positional servos Finished the servo type handling system Improved calibration logic so it works correctly with the selected servo type Finished saved profile handling , including persistent storage across resets Finished the joystick calibration system Completed the C.E.A. Laser Calibration system Finished the Settings , Debug , Calibration , Manual Control , and other menu systems Added and tested the final error handling and debugging tools Final Testing I tested the main workflows with real hardware instead of relying on a simulation (as I always have). The Demo Video The final demo video is finished and uploaded here: https://www.youtube.com/watch?v=IzWqsmjGq4U I tried to show the project itself rather than only talking about the code and development process. One thing I did not manage to include properly was footage of the full physical servo calibration process. The only calibration footage I kept was the joystick calibration. Everything works though :D. Sorry about that. The actual calibration system and everything else was still tested and works. I explain the missing footage in the video. Final Result S.U.P. started as a small ESP32 servo tester and grew into a much larger system than I originally expected. TODO There are still ideas I might work on in the future, but they are no longer required for the first release: Custom PCB Custom 3D Case Advanced diagnostics (I’ll have to open up the servo) General code cleanup and optimization For now, though: S.U.P. v1.0 is done.
Ships:
Devlog #8 - Actually Finished S.U.P. - v1.0 Okay, NOW it’s finished. GO HERE TO SEE VIDEO Last time I said we were getting close. Now I can finally confirm it! S.U.P. is finished. There was still a surprising amount of work left after v0.9.1, especially around handling different servo types. I ended up reworking a lot of the servo logic to make everything work together properly. Important Features Added Full support for different servo types , including 90° , 180° positional , and 360° continuous-rotation servos Added working pulse-width calibration for servo control Added working servo sweeps for testing positional servos Finished the servo type handling system Improved calibration logic so it works correctly with the selected servo type Finished saved profile handling , including persistent storage across resets Finished the joystick calibration system Completed the C.E.A. Laser Calibration system Finished the Settings , Debug , Calibration , Manual Control , and other menu systems Added and tested the final error handling and debugging tools Final Testing I tested the main workflows with real hardware instead of relying on a simulation (as I always have). The Demo Video The final demo video is finished and uploaded here: https://www.youtube.com/watch?v=IzWqsmjGq4U I tried to show the project itself rather than only talking about the code and development process. One thing I did not manage to include properly was footage of the full physical servo calibration process. The only calibration footage I kept was the joystick calibration. Everything works though :D. Sorry about that. The actual calibration system and everything else was still tested and works. I explain the missing footage in the video. Final Result S.U.P. started as a small ESP32 servo tester and grew into a much larger system than I originally expected. TODO There are still ideas I might work on in the future, but they are no longer required for the first release: Custom PCB Custom 3D Case Advanced diagnostics (I’ll have to open up the servo) General code cleanup and optimization For now, though: S.U.P. v1.0 is done....
|
1792853268.1022978
|
1792939668.1022978
|
|
56694
|
[MOVED] Discord User Apps Bot by @stefdp | Stardan [MOVED] Discord User Apps Bot by @stefdp | Stardance...
|
stefdp
|
1
|
85.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T13:33:42Z", "hours": 85.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I rewrote my userApps Discord bot from TypeScript to Kotlin just because I prefer kotlin now that i’ve been using it for about a while, and in the meanwhile i also added new commands to it", "repo": "https://git.stefdp.com/Stef/userApps", "demo": "https://discord.com/oauth2/authorize?client_id=1223221223685886032"}]...
|
[{"post_id": 72794, "ts": "202 [{"post_id": 72794, "ts": "2026-09-23T19:06:22Z", "hours": 0.3492, "text": "Added environment check in the API endpoint like /status enable command Emoji envs are now correctly formatted in the error message Marked /status command as owner only"}, {"post_id": 72707, "ts": "2026-09-23T15:29:45Z", "hours": 3.7897, "text": "Rewrote the web dashboard to look better (by orangc) Added the API endpoints to manage commands on the dash side Added support for docker compose"}, {"post_id": 70873, "ts": "2026-09-19T22:10:42Z", "hours": 5.3797, "text": "Created the /help command: list all the commands of get info about a specific one Temporarily took the old dashboard and adapted it to the new framework (the html side is gonna get remade by a friend, orangc) Removed some unused envs Added TailwindCSS compiling at startup soit can be used in the dashboard"}, {"post_id": 70257, "ts": "2026-09-18T20:20:48Z", "hours": 5.9111, "text": "Created the /uptime command: display how long the bot has been online for Created the /lyrics command: get the lyrics of a song (uses lrclib.net, lrcmux and lyricsOVH as sources) Fixed /define command failing when there were too many definitions (was going over the 40 components limit) Created the main README file Added ownerOnly property to commands, so when they’re first added to the db, it sets the list of owners in the OWNERS env as allowed users Added attachment options to the /embed command (for some reasons they’re added correctly but image and thumbnail don’t display while footer and author do)"}, {"post_id": 69649, "ts": "2026-09-17T14:30:09Z", "hours": 4.295, "text": "Created the /ubdict command: get the definition of a term from the urban dictionary Created the /wikipedia command: get an article from wikipedia Created the /fact command: get a random fact Created the /joke command: get a random joke Added a util function to split strings in group of approximately X character, but instead of cutting the text at exactly X characters, it cuts at the next end of a sentence after X characters, this way a sentence is never cut in half during pagination (currently only place where it’s used, aka /wikipedia command) Added the User-Agent header to all the HTTP requests Updated HttpLoggingInterceptor to use the correct logger class"}, {"post_id": 68211, "ts": "2026-09-14T18:17:54Z", "hours": 2.95, "text": "Created the /define command: get the definition of a word Updated the /steam game command to use components v2, and also a button to show the full game description if the detailed mode is too long to fit Switched some places from if (xxx) { ... } else { null } to xxx?.let { ... }"}, {"post_id": 67479, "ts": "2026-09-13T16:26:49Z", "hours": 7.7817, "text": "Created the Get User Banner command (user): …what the name says Created the /github command (slash): get info about a GH user, repo or issue/PR Created the /weather command (slash): get the current weather of a specific place /steam game now uses buildString {} instead of adding to a array, then joining and merging it with another string"}, {"post_id": 66516, "ts": "2026-09-12T11:06:55Z", "hours": 6.5256, "text": "Created the /steam command (slash): get info about a Steam game (optional detailed mode) or user Created the /translate command (slash): convert any text from a language to another (about 131 languages available) Installed the MS Azure SDK for the /translate (slash) & Translate Message (message) commands Updated file layout for the dashboard so it looks better Updated API services file layout too Updated Kotlin from 2.4.10 to 2.4.20 and other libs"}, {"post_id": 65657, "ts": "2026-09-10T22:56:19Z", "hours": 4.5164, "text": "Running a command now increases its uses value is the anonymous analytics table Added new env variables and improved the system used to throw errors so it always kills all the processes when calling require Created the dashboard ratelimits, sessions, auth middlewares/systems Created the Discord OAuth2 login Moved kord into a Bot object so it can be used in the dashboard too if needed Created a listener for the discord webhook (stuff like bot authorized, bot deauthorized etc.) [UNTESTED] Created a util function to get the bot’s invite url Created API services for the discord OAuth2 token requesting and apprise API There’s not much frontend / UI change so ima show a pic of the dash module code ig"}, {"post_id": 65422, "ts": "2026-09-10T15:31:24Z", "hours": 5.8289, "text": "Created the /export command (slash): send the file path and export it (as well as give the file’s github url (owner only) Created the Save as Tag command (message): save a message as tag, both embeds & content Created the Convert to QR Code command (message): convert a message’s content to a QR code (either as image or text) Created the Download Voice Message command (message): as the name says, download as MP3 a user’s voice message Created the Set as Reminder command (message): set a user’s message (either content or URL) as a reminder Created the Get Message JSON command (message): get the JSON object of the message Created the Get Member Avatar command (user): get the server specific avatar of the user Created the Get User Avatar command (user): get the global avatar of the user Created the Get User Avatar Decoration command (user): get the avatar decoration of the user Created the Get Member JSON command (user): get the JSON object of the member Created the Get User JSON command (user): get the JSON object of the user Environment variables are now loaded at startup via a gradle task Added a LOG_LEVEL env to choose the level of the console output to show Created a util function for plurals Set tag name limit to 255 chars"}, {"post_id": 64121, "ts": "2026-09-08T10:02:03Z", "hours": 7.1333, "text": "Added the /tag command: save preset messages that you can then send later (they can also contain embeds) it has the following subcommands: content : set or remove the content of a tag embed : add or remove an embed from a tag delete : delete a tag export : export all your tags as a JSON file import : import the JSON file obtained from the export subcommand (in case of conflicts, the old and new tag will be previeable in the bot dashboard if enabled) list : Display all your subcommands get : Get the content & embeds of a specific subcommand Fixed/Impoved the /embed command button & modal handlers & added an ID to buttons & modals to avoid 2 diff commands handling the same interaction"}, {"post_id": 62806, "ts": "2026-09-06T10:14:43Z", "hours": 5.5831, "text": "Created the /gary command: get random images of 4 cats: Gary, Goober, Gulliber (Gully) and Garfield Created the /ping command: get the bot’s ping (pic has high ping cuz it’s running on my laptop, in Italy) Created the /botavatar command: change the bot avatar, either from a file, URL, copy from an user or copy from the bot owner Created the /colorpicker command: give an HEX, RGB or HSL color and it displays it as well as showing its HEX, RGB and HSL variants Added the /reminders command: set a reminder and the bot will send you a DM, reminder can either be single-run, multi-run and inifinitely run (the user defines an interval such as 30m , 2d15h etc., then the bot will send a DM with the reminder after this interval and will repeat it how many times the user defined it to, so if an user defines a reminder with 2h interval and 3 repeats, it will send the same reminder in 2h, 4h and 6h) (hope i explained well ) Switched database initialization from SchemaUtils to MigrationUtils this way if i edit a scheme, it’s also applied at startup instead of just creating new tables and never modifying them Made the dashboard disableable"}, {"post_id": 61179, "ts": "2026-09-03T23:53:05Z", "hours": 6.5219, "text": "Created the /minecraft command: allows to fetch Java and Bedrock edition server data (with mcstatus.io API ) Player info (with Starlight API by lunareclipse.studio ) Player skin rendered as a 3D model in different poses (with Starlight API) Created the /embed command: send anything as an embed Created the /qr command: encode some text into a QR Code (output can be an image or an ASCII text) Updated the dashboard to add a static resource /skinModels which is used for the /minecraft skin sub command to fetch custom made models Added a regex for HEX colors (matches #ffffff , #fff , ffffff and fff ) created a Minecraft object to collect all minecraft related functions Created the starlight and mcstatus.io API services & added them in the API client Update main handleRequest function to add an optional error handler"}, {"post_id": 60524, "ts": "2026-09-02T22:26:55Z", "hours": 3.5928, "text": "Added the /8ball command: ask a question and get a random answer Added topic command: get a random topic to start a conversation Added /qalc command: execute calculation using libqalculate Added /console command: run any shell command Added /animal command: get a random animal (cat, dog, fox, duck) Added /ip command: get info about an IPv4 or IPv6 address Installed the retrofit libs required to make HTTP requests Added a regex to check if a IPv4 or IPv6 is valid (took from networkingtoolbox.net ) Created util function to get the country flag & name from its code (took from my Hackatime android app)"}, {"post_id": 60238, "ts": "2026-09-02T14:13:38Z", "hours": 5.9553, "text": "Added /http command: get a HTTP status with the picture of an animal like cat, dog, goat, duck etc. Added /perms command: add/remove/list the users allowed to use a specific command Added /status command: enable/disable specific commands Added /dig : perform a dig query on a domain Added /whois : perform a WHOIS query on a domain/IP/ASN Fixed database upsert function erroring because no column was being passed as keys (primary) Moved command registration to the onReady event Installed a lib for DNS queries and a lib to check other libs updates Added a utility Domain object that contains the function to perform dig and whois queries Added utility functions to convert a ISO string, epoch seconds or Instant to discord time format"}, {"post_id": 59784, "ts": "2026-09-01T18:32:38Z", "hours": 3.5347, "text": "Created the /eval command Added the registration & handling of the commands (also checks if the user can run the command and if the command is enabled, by checking the enabled status and allowedUsers list in the command_permissions table) Installed some libs to run code at runtime (JavaScript, Python and Kotlin (used in /eval )"}, {"post_id": 59212, "ts": "2026-08-31T21:38:20Z", "hours": 4.8561, "text": "Created the base skeleton with the bot (w/ events), web dashboard (rn just shows “WIP” text) and database with the schemes & some helper functions For the Discord bot i’m using the Kord library For the web dashboard i’m using the Ktor library This is the first time i use either of those 2 libs so my usage may not be the best"}]...
|
Title: [MOVED] Discord User Apps Bot by @stefdp | Title: [MOVED] Discord User Apps Bot by @stefdp | Stardance
Devlogs:
Created the base skeleton with the bot (w/ events), web dashboard (rn just shows “WIP” text) and database with the schemes & some helper functions For the Discord bot i’m using the Kord library For the web dashboard i’m using the Ktor library This is the first time i use either of those 2 libs so my usage may not be the best
Created the /eval command Added the registration & handling of the commands (also checks if the user can run the command and if the command is enabled, by checking the enabled status and allowedUsers list in the command_permissions table) Installed some libs to run code at runtime (JavaScript, Python and Kotlin (used in /eval )
Added /http command: get a HTTP status with the picture of an animal like cat, dog, goat, duck etc. Added /perms command: add/remove/list the users allowed to use a specific command Added /status command: enable/disable specific commands Added /dig : perform a dig query on a domain Added /whois : perform a WHOIS query on a domain/IP/ASN Fixed database upsert function erroring because no column was being passed as keys (primary) Moved command registration to the onReady event Installed a lib for DNS queries and a lib to check other libs updates Added a utility Domain object that contains the function to perform dig and whois queries Added utility functions to convert a ISO string, epoch seconds or Instant to discord time format
Added the /8ball command: ask a question and get a random answer Added topic command: get a random topic to start a conversation Added /qalc command: execute calculation using libqalculate Added /console command: run any shell command Added /animal command: get a random animal (cat, dog, fox, duck) Added /ip command: get info about an IPv4 or IPv6 address Installed the retrofit libs required to make HTTP requests Added a regex to check if a IPv4 or IPv6 is valid (took from networkingtoolbox.net ) Created util function to get the country flag & name from its code (took from my Hackatime android app)
Created the /minecraft command: allows to fetch Java and Bedrock edition server data (with mcstatus.io API ) Player info (with Starlight API by lunareclipse.studio ) Player skin rendered as a 3D model in different poses (with Starlight API) Created the /embed command: send anything as an embed Created the /qr command: encode some text into a QR Code (output can be an image or an ASCII text) Updated the dashboard to add a static resource /skinModels which is used for the /minecraft skin sub command to fetch custom made models Added a regex for HEX colors (matches #ffffff , #fff , ffffff and fff ) created a Minecraft object to collect all minecraft related functions Created the starlight and mcstatus.io API services & added them in the API client Update main handleRequest function to add an optional error handler
Created the /gary command: get random images of 4 cats: Gary, Goober, Gulliber (Gully) and Garfield Created the /ping command: get the bot’s ping (pic has high ping cuz it’s running on my laptop, in Italy) Created the /botavatar command: change the bot avatar, either from a file, URL, copy from an user or copy from the bot owner Created the /colorpicker command: give an HEX, RGB or HSL color and it displays it as well as showing its HEX, RGB and HSL variants Added the /reminders command: set a reminder and the bot will send you a DM, reminder can either be single-run, multi-run and inifinitely run (the user defines an interval such as 30m , 2d15h etc., then the bot will send a DM with the reminder after this interval and will repeat it how many times the user defined it to, so if an user defines a reminder with 2h interval and 3 repeats, it will send the same reminder in 2h, 4h and 6h) (hope i explained well ) Switched database initialization from SchemaUtils to MigrationUtils this way if i edit a scheme, it’s also applied at startup instead of just creating new tables and never modifying them Made the dashboard disableable
Added the /tag command: save preset messages that you can then send later (they can also contain embeds) it has the following subcommands: content : set or remove the content of a tag embed : add or remove an embed from a tag delete : delete a tag export : export all your tags as a JSON file import : import the JSON file obtained from the export subcommand (in case of conflicts, the old and new tag will be previeable in the bot dashboard if enabled) list : Display all your subcommands get : Get the content & embeds of a specific subcommand Fixed/Impoved the /embed command button & modal handlers & added an ID to buttons & modals to avoid 2 diff commands handling the same interaction
Created the /export command (slash): send the file path and export it (as well as give the file’s github url (owner only) Created the Save as Tag command (message): save a message as tag, both embeds & content Created the Convert to QR Code command (message): convert a message’s content to a QR code (either as image or text) Created the Download Voice Message command (message): as the name says, download as MP3 a user’s voice message Created the Set as Reminder command (message): set a user’s message (either content or URL) as a reminder Created the Get Message JSON command (message): get the JSON object of the message Created the Get Member Avatar command (user): get the server specific avatar of the user Created the Get User Avatar command (user): get the global avatar of the user Created the Get User Avatar Decoration command (user): get the avatar decoration of the user Created the Get Member JSON command (user): get the JSON object of the member Created the Get User JSON command (user): get the JSON object of the user Environment variables are now loaded at startup via a gradle task Added a LOG_LEVEL env to choose the level of the console output to show Created a util function for plurals Set tag name limit to 255 chars
Running a command now increases its uses value is the anonymous analytics table Added new env variables and improved the system used to throw errors so it always kills all the processes when calling require Created the dashboard ratelimits, sessions, auth middlewares/systems Created the Discord OAuth2 login Moved kord into a Bot object so it can be used in the dashboard too if needed Created a listener for the discord webhook (stuff like bot authorized, bot deauthorized etc.) [UNTESTED] Created a util function to get the bot’s invite url Created API services for the discord OAuth2 token requesting and apprise API There’s not much frontend / UI change so ima show a pic of the dash module code ig
Created the /steam command (slash): get info about a Steam game (optional detailed mode) or user Created the /translate command (slash): convert any text from a language to another (about 131 languages available) Installed the MS Azure SDK for the /translate (slash) & Translate Message (message) commands Updated file layout for the dashboard so it looks better Updated API services file layout too Updated Kotlin from 2.4.10 to 2.4.20 and other libs
Created the Get User Banner command (user): …what the name says Created the /github command (slash): get info about a GH user, repo or issue/PR Created the /weather command (slash): get the current weather of a specific place /steam game now uses buildString {} instead of adding to a array, then joining and merging it with another string
Created the /define command: get the definition of a word Updated the /steam game command to use components v2, and also a button to show the full game description if the detailed mode is too long to fit Switched some places from if (xxx) { ... } else { null } to xxx?.let { ... }
Created the /ubdict command: get the definition of a term from the urban dictionary Created the /wikipedia command: get an article from wikipedia Created the /fact command: get a random fact Created the /joke command: get a random joke Added a util function to split strings in group of approximately X character, but instead of cutting the text at exactly X characters, it cuts at the next end of a sentence after X characters, this way a sentence is never cut in half during pagination (currently only place where it’s used, aka /wikipedia command) Added the User-Agent header to all the HTTP requests Updated HttpLoggingInterceptor to use the correct logger class
Created the /uptime command: display how long the bot has been online for Created the /lyrics command: get the lyrics of a song (uses lrclib.net, lrcmux and lyricsOVH as sources) Fixed /define command failing when there were too many definitions (was going over the 40 components limit) Created the main README file Added ownerOnly property to commands, so when they’re first added to the db, it sets the list of owners in the OWNERS env as allowed users Added attachment options to the /embed command (for some reasons they’re added correctly but image and thumbnail don’t display while footer and author do)
Created the /help command: list all the commands of get info about a specific one Temporarily took the old dashboard and adapted it to the new framework (the html side is gonna get remade by a friend, orangc) Removed some unused envs Added TailwindCSS compiling at startup soit can be used in the dashboard
Rewrote the web dashboard to look better (by orangc) Added the API endpoints to manage commands on the dash side Added support for docker compose
Added environment check in the API endpoint like /status enable command Emoji envs are now correctly formatted in the error message Marked /status command as owner only
Ships:
I rewrote my userApps Discord bot from TypeScript to Kotlin just because I prefer kotlin now that i’ve been using it for about a while, and in the meanwhile i also added new commands to it...
|
1792853738.6131046
|
1792940138.6131046
|
|
15129
|
Tempname: Engine by @pkncoder | Stardance
|
pkncoder
|
1
|
165.0
|
2930
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T12:06:16Z", "hours": 165.0, "multiplier": 19.97, "payout": 2930, "blessing": "neutral", "text": "—————– Ship #1 —————– - - Welcome - To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). 💚 The current state 💫 There is still no UI, all render control is based in a JSON file. The current only renderer is a custom Deferred Renderer. Note: As this is built for 3d rendering, a modern computer, with a GPU is recommended. Modern Macbooks will run it, however it will be slower as it is basically magic that it works on them. Thank you so much! I’ve spent a lot of time on this. It may not seem like that, however when building this, I decided to do it right (as this is my 3rd attempt). I split the development into phases: Get a window Get something rendering + a camera Get object/material/texture loaders + basic scene managers + basic concept of working Create full scale (professional) renderers/scene managers/resource managers/etc. Get a UI Currently, I’m in getting everything polished in the backend. I didn’t want to move on to the UI, as I didn’t want to rush that. Rushing a UI meant missing other things. So thank you, and I really hope you enjoy. If there are any issues, please report them to the issues page on the github, and message me on slack ( @pkncoder ). Github releases: https://github.com/pkncoder/Engine/releases Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine", "repo": "https://github.com/pkncoder/Engine/", "demo": "https://pkncoder.github.io/Engine/index.html"}]...
|
[{"post_id": 72971, "ts": "202 [{"post_id": 72971, "ts": "2026-09-24T04:20:28Z", "hours": 2.5239, "text": "—————– Devlog XXVII —————– - - Release is out testing time – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Not too much has happened, mostly: Updated README (resources, gallery, installation & use) Updated the landing page (added a tech-stack) Created my first release under the 1.3.x alpha title That big 1.3.x “alpha” release is the big one, as I need some help. If you could just take a bit of time, and you aren’t on linux-arm or apple-intel, could you check out the github releases and try it out, that would be great! I plan to ship tmwr, but I want some testing done first. Thank You for Reading So close!! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 72516, "ts": "2026-09-23T03:30:31Z", "hours": 9.9433, "text": "—————– Devlog XXVI —————– - - Almost… there – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ In order to show the capabilites, I’ve been setting up scenes for my engine to show off, and here are some of the results! It would be great to get your favorite render of these! For the full 9 renders , check out the scrapbook in the slack , as they will be there w/ a thread. Thank You for Reading Hopefully will actually ship tmwr! I’m actually getting kind of sad, I won’t be stopping development by any means, but this has been my summer (although I might not be able to get any stardance tokens, but that’s ok ig…). If you have any questions, feel free to DM me either here, or at @pkncoder on discord if that’s easier for you! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 71565, "ts": "2026-09-21T02:05:45Z", "hours": 2.1433, "text": "—————– Devlog XXV —————– – New JSON scene file 📁 - SHIP TIMEEEEE – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Not that much has happened tbh. All that has really happened… Updated the README a bit more Added a new json parser to spawn the scene from that Added hot reloading of the scene So yea, next should be the ship. When updating the README on the github, I was going through the Usage section, and added a new promise for how people could add their own meshes. In this I created the idea of activeScene.json , a JSON file that listed the scene data (crazy, right?). And so, after I updated the README , I added the new loader, and made the scene reload by pressing the “ r ” key. That’s kinda it… Thank You for Reading Before shipping, I need to… Do another update of the README Create the base Releases for Mac, Windows, and Linux And test these Do a pass through TODO.md Update the landing page Shouldn’t take too long Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 69952, "ts": "2026-09-18T03:52:09Z", "hours": 8.6456, "text": "—————– Devlog XXIV —————– – i HATE shadow maps!!! - Renderer? I hardly know her? – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ WOAH A lot has happened. Previously, I had just implemented a new entity system & a new camera system. So what’s new? I present: The Deferred Renderer !!! Basically, it’s just another way of rendering. HOWEVER , it has some funzies: Mostly together render graph, just a little smthin Shadow Pass G-Buffer Pass Lighting Pass New point lights (replacing the emmissive texture searching before) Looking to add SSAO (hemisphere sampling) in the future!! Now, along with this, I just tested creating a build for windows and testing it on a friends machine, and it worked (his laptop is crap, so it ran slow, but surprisingly fast) . Along with that, I also tried the current build on mac, and it also worked, so that’s also great (I’m supprised)!! However, the real prize, is the trypophobia horrors made along the way!! That’s right! When trying to get textures to work, I ran into a ton of problems (mostly related to the alpha map & image formats) that caused major headaches. Images and videos, where they are a bit compressed, can be found below. Thank You for Reading Almost there, I still need to change up the landing page, rewrite the readme, and merge the main branch, plus try to get a way to change the 3d models for users, but I’m getting there. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 67656, "ts": "2026-09-13T20:09:19Z", "hours": 7.9958, "text": "—————– Devlog XXIII —————– – I NEED TO HURRY UP AAAA - EnTT - Table – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ In my previous devlog, I stated how I was working on the new RenderGraph . I’ve now realized, that I have like until the end of the week for when I need to ship. So instead , my goal is to get this looking impressive . To start, here is what I’ve done so far : Cleaned up system inits Changed how the UUID service works (now you just access it and call generate ) Implemented a new library, EnTT Did some cleanning up Added a PointLightComponent for future use (no dev. yet) Added and implemented the CameraComponent Here are the big things: EnTT EnTT is an open-source library that handles objects within games, editors, etc. It’s creator is: Michele Caini (skypjack on github) . EnTT is a library that exposes something called an Entity Component System (ECS). Basically, instead of saving a bunch of data directly inside of one struct or class, you define an entity (a unique id) and assign that entity components. The components are what actually gives the entity meaning. New Camera If you have ever ued Blender for a bit, you would know that your camera is on the same list as your meshes. This is since, to Blender, they are inherantly the same thing (don’t quote me on that) . Previously, my camera was seperate to all of the rest of the objects. This caused the data to be split, and handling the differences made my architecture a bit weird. Now that I’ve implemented EnTT , I’ve added a CameraComponent that defines things like rotation, FoV, etc - completely erasing the need for a separate camera, and opening the doors to more flexibility. Thank You for Reading New book is great! I won’t get to use too much of it for stardance, but I’m checking out this snowglobe thing that seems like it would be the next area!! Wish me luck on the ship. I want to get it out by the end of the week so I can hopefully still cache in some stardust. Probally won’t get the computer though (high hopes for a living or smthin idk) Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Change my Rasterizer to be a Defered Renderer & implement multiple point lights UI??"}, {"post_id": 61084, "ts": "2026-09-03T20:05:33Z", "hours": 3.7325, "text": "—————– Devlog XXII —————– – BrEaKiNg ChaNGeS - 📖 NEW BOOOKKKK – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Sadly, I’ve done much coding Base list This is what I have done since the last devlog: Planned out a bit more on the inner workings from no Renderer->Rendered Image Created the new Shader & Program classes Updated the workings on RendererManager Started work on the new Renderer / IRenderer class Current commit is now broken (compiles, doesn’t run Overview In my new obsidian vault , I’ve been working on creating the new database on how it all works. Through this, I’ve been using excalidraw (Obsidian) to plan out pipelines & create visuals. Currently, I have 2 main drawings: Shader & Program pipeline Renderer Pipeline The Shader & Program pipeline explains the lifetime and usage of both the Shader and Program (OpenGL program) classes. A program gets created, has shaders attached to it (deleting the shader in the process) , and then the program gets linked & binded. The Renderer Pipeline explains the lifetime and usage of a renderer. Starting from the RendererManager, go through normal rendering stuff, and will end at shutting down the RendererManager. For the inner workings of the new renderer setup, I’ll leave that for (hopefully next devlog) when I get everything working start to finish of the RendererPipeline . Thank You for Reading As for the “ New Book I got, I have just purchased “ Game Engine Architecture Vol. I ” (Jason Gregory) to specialize the program more (most likely after Stardance ends). Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Plan out the RenderGraph Create the base RenderGraph class Create the BlitList Create the INodeInput & INodeOutput"}, {"post_id": 58866, "ts": "2026-08-31T13:21:49Z", "hours": 3.4211, "text": "—————– Devlog XXI —————– – My brain hurts 🧠 - Sharp like glass – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Sadly, I haven’t done much coding Instead, I’ve been trying to figure out how I want my Render Graph to work. To start, what is a render graph? What I am interpreting the render graph as, issss: An API meant to simplify and provide structure to a final renderer. In the final application, the render graph will be an option for a more advanced final render editor. What I am working on now, is how it will be put together so I don’t have a mess in the future. Recently, I’ve been using Obsidian to mark everything down. This also starts a little docs. Using a mix of Obsidian and the excalidraw plugin, I’m able to write everything down and create visuals. Currently, I have a mix of nodes that are the main important ones. These nodes are just the interfaces , so they aren’t specified. They act as a blueprint for any of the full nodes. IRenderOutput - Add textures to a list of blitables IShaderInput - Base input interface IShaderOutput - Base output interface IShaderNode - Node representation of shaders IShaderPassNode - Base shader interface Thank You for Reading I haven’t been home enough to create the “big brain wall” which is sad, but at least my stuff is digital. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Setup current program for Render Graph implementation Implement IShader, IGPUTexture, etc. Create IRenderGraph for the renderers"}, {"post_id": 53552, "ts": "2026-08-24T04:42:42Z", "hours": 3.7022, "text": "—————– Devlog XX —————– – 🌟I have the best one liners 🗿– 🥀 Now I have to be smart ??? 🧠 – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ For the quick overview: Fixed the shadow map issue ( so angry about this, see below ) Fixed an issue with textures not caching Got the very base implementation of Uniform Buffers To start off, in the previous devlog I mentioned I was re-writing the shadow mapping . Shadow Mapping - Rendering a 3d model with the light being the eye. Everything that it can see is not in shadow, everything else is. quick explanation I was having issues with getting the shadows to work correctly. I had ideas for issues, including: (the model matrix , the renderPackets being in a bad order , the far plane ). IT TURNS OUT It was none of these. Whenever I made the code to compile a geometry shader along the vertex & fragment shader, I just copied my old one and spliced in the code. Turns out I forgot to swap some variables, and I was putting code in places it should NOT be at. No idea why it didn’t crash, but it fixed my shadow issues very quick . As for UBOs, I’ll talk about them in a future devlog, when I have everything planned out. Thank You for Reading As I said with “Planning out” everything, I’m going to set up a whiteboard - I’ll have to move my 🏳️🌈 pride flags 🏳️⚧️ :( - Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Refactor Build the big brain wall Do some thinking 🥀 Git Commits🗿 Weird position issue Saving now, I am so angry about this. I was compiling and overwrigting the wrong code :( Made the testing for shadows a bit better, and changed the rendering a bit Fixed issue with textures and full models not actually caching Removed anoying debug line for shadow transform matricies Working on getting the ubos working’ Got it to push First test ubos"}, {"post_id": 52406, "ts": "2026-08-22T15:11:34Z", "hours": 4.0344, "text": "—————– Devlog XIX —————– - 🌲 Textuers 🧚♀️ - 👩💻 Shadoowwsss 💀- To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ To recap on what I did: Got the program to launch to black screen I needed to inject the Asset Manager to a class Got objects loading correctly without shadows Got textures to load Started work on fixing the shadow map Nothing too crazy has been changed, the texture issues were about some compatibility problems and not uploading to the same index. The shadow values are uploaded to a 3d texture, where to calculate if an object is in sight or not, we commit triangles based on their position. The problem now is about the far plane, and hitting triangles that weren’t in shadow. I’m not sure what the problem is, but I’m going to do a bit more looking into it. Thank You for Reading :3-blahaj-spinning I still have to fix the shadows issue (obviuosly) but then I can move onto formatting the data (putting it into buffers, creating wrappers, etc).!! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Write the shadow cubemap geometry shader & ad it to the OpaquePass (temp main pass) Make and debug UBOs replacing base uniforms Refactor / clean Create the real Render Graph? 🥀 Git Commits (shortened)🗿 Commits: https://github.com/pkncoder/Engine/commits/Phase-IV/ Most Recent: Temporary Save"}, {"post_id": 50519, "ts": "2026-08-19T18:20:39Z", "hours": 5.6344, "text": "—————– Devlog XVIII —————– - 🌲 Trees 🧚♀️ - 👩💻 SO MUCH REWRITING 💀- To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ These last few days, I’ve been working on getting my Rasterizer (drawing triangles of a model on screen and coloring them) working. The big changes that I did include: Fixing an issue with textures not loading Updated the Interface for every Renderer. Implemented the extract / prepare / dispatch pipeline into the Rasterizer for real now. Started working on the base ideas of a “Shader Graph” The issue with textures was just moving a line like 3 lines lower . I was freeing the image data before saving it (oops) . The updated interface is the IRenderer class. Each Renderer bases off of the class, supplying it with a framework so each Renderer can be talked to the same way. Here are some of those functions: beginFrame - Clear previous frame data and prepare for a new frame extract - Take raw scene data ( camera , renderables ) and convert it into packets for the next step. prepare - Take each packet from extract and turn them into draw commands for dispatch. dispatch - Take each draw command and send a draw call, along the way binding any textures & uniforms. postProcess - Take the frame and post-process it. This may be removed. present - Take the rendered frame and show it to the screen ( blit it ). To do a quick review on what the Shader Graph is - it is a collection of “nodes,” each with their own inputs and outputs that connect together to render out a frame. I’m still a bit confused, but I’ve been watching presentations on the topic from companies like Unity & Activision . Thank You for Reading Yea, I know it’s been a while since my last devlog. I’ve been making some posts in slack about my Path Tracer, since I spent a little time on that. I’m looking at the timing for everything , the hope is to ship this at the end of Phase-IV and hope that I can get a UI working before too late. I’m hoping I can get enough stardust to pay for a new laptop, but idk that’s a long shot. I still have about 25 more hours if I get a 16x mult (which I can only hope for) before I would hit the mark for the FW 12, which isn’t crazy (the mult is tho). Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Stop the program from crashing to reach a black screen Rewrite shaders to allow for correct models wo/ shadows Write the shadow cubemap geometry shader & ad it to the OpaquePass (temp main pass) Make and debug UBOs replacing base uniforms 🥀 Git Commits (shortened)🗿 https://github.com/pkncoder/Engine/commits/Phase-IV/"}, {"post_id": 45347, "ts": "2026-08-11T18:54:11Z", "hours": 2.9381, "text": "—————– Devlog XVII —————– - Strange Hours - To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ To start off, I did not work directly on my application, but the online demo . It’s like working on the website, but through another editor sometimes. The goal of the Path Tracer is to eventaully get it clean & quick enough to be real-time. This is the first of the 5 renderers that I will be making. I was working on my online shadertoy DEMO for the Path Tracer, specifically the denoiser. The name of the denoiser I am using is the “Edge-Avoiding Á Trous Wavelet Transform” . As a quick overview: It applies a blur “ with holes ” to allow for less to no image distortion Fast enough for realtime Includes “ weights ” based on (in my code): Normal , Depth , and Color . The larger the difference between the center pixel and the scanned pixel * (kernel), the more weight is applied, lessening the amount of blur. This is amazing, however when the camera moves , the denoiser assumes that the current and previous pixel are in the same world postion (when it isn’t). This causes errors when trying to overlay the image and gather data. This is why we track the motion of the camera, creating a vector to get the same world position pixel. I got this wrong on one of the first attempts, the last attachment (videos are compressed) shows that fun video (warning for those who get motion sick). With this, I am able to blur the image, and with some more techniques, I can get rid of “ghosting.” Thank You for Reading In the videos, I rendered them in fullscreen 4k on my better laptop+GPU, don’t worry about your system being too slow, just don’t fullscreen it <3 (the development was done on my lower end mac). The hours logged are from refactoring the project after the last devlog, and editing the code when I didn’t do it in shadertoy’s editor. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🥀 Git Commits 🗿 BREAKING CHANGE - Refactored Buffer & GPUResource managers + IRenderer - Code has been broken for a bit but womp womp Shadertoy shaders path tracer https://www.shadertoy.com/view/7fBSzR"}, {"post_id": 44514, "ts": "2026-08-10T10:13:23Z", "hours": 4.0428, "text": "—————– Devlog XVI —————– So long , gay Bowser ⭐️ – IRenderer, hardly know her? - To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ⭐️ BEFORE ANYTHING - Thanks so much to @AVD for the super star, wasn’t expecting it and I really appreciate it 👏 👏. Now, for what I did: Dealt with an issue in Obsidian, as apparently there was “minor rendering performance improvements.” This is FALSE :( - I just downgraded the version Created the new BufferManager to handle UBOs, SSBOs, VBOs, EBOs, etc. + Dynamic, Static, and Stream buffers. Integrated the RenderTarget & ShaderPass system from PathTracer straight into IRenderer + added base utilities to it. Did some formatting Overall the two big things that I did was the new Buffer system & the updated IRenderer interface. For the new Buffers, previously I had UBOs (dynamic values) & SSBOs (big mostly static information blocks) set up in seperate files, that BufferManager returned. Now, every buffer is a single struct called GPUBuffer , and GPUBuffer has a type, and a usage (see attached photo). Now everything is centralized on that. For the new IRenderer interface, now there are RenderTargets - textures that shaders write to as output - and ShaderPasses - A pass of a shader. These can be added to a registry, keyed by a UUID (big number, in this case). Thanks for reading Again, thanks so much to AVD for the super star! I’m excited for when I can finally start writing my shaders, it’s getting closer & closer!! The fancy Path Tracer will be cool and all, but I have big plans for the Ray Marcher!! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🥀 Git Commits 🗿 Fixed an obsidian issue I ran into, “Minor rendering performance improvements.” was NOT true, broke almost the entire canvas. Fixed it though + new png Created the new buffer managegr system, I need to go through and make changes. Also, on launch there was more blacked out sections, different every launch :( New IRenderer setup for the render targets & render handles Refactor 1-6 Refactor 7-9 for BufferManager"}, {"post_id": 42396, "ts": "2026-08-07T02:46:23Z", "hours": 5.3317, "text": "—————– Devlog XV —————– – Temp code go brrrrr 🔋 - New term : “Far Landing” – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ I tried getting this out before 4 hours, but it just –wouldn’t__ happen. Weird errors kept popping up ( mostly being my fault) . Here’s a list of what I did: Figured out generally how I was going to deal with uploading and caching meshes + textures Put the new GPUResourceManager class into place to do the previously mentioned job Started reworking the renderer pipeline (NOT THE RENDER PIPELINE) on CPU side, and set up the interface class with that Patched together the old Rasterizer renderer to work with the new IRenderer pipeline Fixed errors throughout Split up normal & bump textures Planned out how I will deal with all the different textures on the shader side, cutting the checks out at shader compile time Yea, I know, it’s a lot . It just felt wrong to create a devlog in the middle of everything, since up until after fixing errors I had nothing to show for it. :( I ran into this errors when fixing those errors, where the entire model (I was using the Sponza scene, check the attached video ) was banded, where parts “didn’t exist” and the other bands did . This reminded me a lot of the “Minecraft Farlands” specifically the pocket edition ones. 🔥 What didn’t I do? 💥 To keep this brief: Fully split up the SSBO system in the BufferManager Reimplement good use cases of UBOs (although I did put in place double buffering) Add the more sophicticated data handling in the PathTracer (as I commented it’s existance out so I could complile). Figure out how shadow mapping is going to be cleaned up in the Rasterizer. ❤️ Thanks for reading! These devlogs have been getting more attention, and I’m getting closer to doing a rebrand to finally get my point and final ideas across! :3 Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🥀 Git commits 🗿 Patched in the “new” buffer system - Really just to get it to compile before I do anything big. Attempting to run the app to test resources & scene Well it compiles, runs, and renders. I still need to go through all the models, HOWEVER, I am having an issue with like 3 models in sponza and bump UGH Well, I checked Phase-III, and the issue with those models are there too, probally some texture coord issue or the bump map is messed up (I’ll check in blender), BUT THEN ON FIRST LOAD THE MODEL FRA LANDED????"}, {"post_id": 40154, "ts": "2026-08-03T15:39:36Z", "hours": 3.0697, "text": "—————– Devlog XIV —————– The Planning - The possible NEW NAME??? - The New Project!! To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ So What Happened? 📸 I haven’t done much pure coding, HOWEVER , I am getting ready for some large-scale rewrites and additions to the code. For what has happened: Fully sectioned the resource - disk - and scene - cpu/logic - directories (folders) so there wasn’t any GPU actions taken place. Refactored resource and scene directories Re-implemented Application into CMakeLists so I can compile and link that file. Did some planning for the huge renderer rewrite that is coming up. Along with all of that, I came up with a possible name for the application (since, surprisingly, Tempname: Engine is a temp name) I had it when when gazing at the sun through some clouds over a feild. Although it is super basic, so I’m going to have to play with it. ❤️ Thanks for Reading!!! I might have to take a bit of a break from progress on this project, as I have a website that I’m making for my local fire dept. (look out for a new stardance project)! I’m also planning on doing some re-marketing / re-branding (idk what to call it) to change the descriptions of the project (ex. the “To recap section on my devlogs, and the landing page). I’ve been getting more questions on it, and my current explanations are a bit too much. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🗿 Commits 🥀 (top-oldest : bottom-newest) No more mention of buffer manager or any uploading to gpu in scene & assets. Meshes are now split up from models in the cache, models hold refrences to asset handles to meshes. Refactored and fixed errors in scene and resources. The program won’t work, as only scene and resources are being compiled & linked Added application back into the mix & fixed the scene loading section. Did some planning on how a model will go from spawn to render"}, {"post_id": 38683, "ts": "2026-08-01T06:03:47Z", "hours": 3.0264, "text": "—————– Devlog XIII —————– Spent some time off from working on this project, started the beginnings of another one. Finally ended up getting the interest to come back to this one To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). 💡 Overview Commit message for this devlog: BREAKING CHANGE - New asset system, new scene system, renamed SceneLoader to PrefabSpawner, still need to update rest of code with temp fix until reworking for new system. ✨ What did I do? Previously, the asset manager did still handle caching already loaded assets (models, materials, textures), however the implementation was not professional and temporary: Caching based on a string key (slow) Broke the “single responsibility principal” many times by uploading to the GPU & constructing Scene objects Now, I am using AssetHandles (UUIDs) for caching, and I no longer uploading to the GPU in AssetManager. ❌ What didn’t I do? This new system is a good start for realigning and separating the different parts of the program, but is only about a third of the work. For what I still need to do, this is what follows: Stop uploading to the GPU in the PrefabSpawner (scene) Fix the renderer and find where I will upload the mesh & texture data. Check for compilation and working across the whole project. Change every instance of AssetManager to using AssetHandles. Once I have these, I can move onto redoing the renderers and FINALLY start working on the “fun stuff” ❤️ Thanks for reading Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 36073, "ts": "2026-07-27T22:33:56Z", "hours": 1.5831, "text": "—————– Devlog XII —————– I haven’t done as much programing recently, but yesterday I wanted to finish what I needed to do quickly, as it wouldn’t take that long. To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). 🎯 UUIDs For a quick explanation of what a UUID is: UUID stands for Universally Unique Identifier. In practice it is a random alphanumeric (a-z,0-9) ID between 64-128 bits. For my project, I used an unsigned 64 bit integer (no negative numbers). It isn’t exactly what the standard for a UUID is, as it isn’t alphanumeric, but I think for now 18.4 quintillion ids are just fine. ⬆️ What Next?? Now that I’ve finished this, the next step is to gut & rewrite the entire asset managing system. I need to redo how files are found, how data is stored, how they are retrieved. Basically the CRUD (create, read, update, delete) line and more. ❤️ Thanks for reading Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 32890, "ts": "2026-07-22T10:48:43Z", "hours": 6.8567, "text": "—————– Devlog XI —————– I haven’t been programming as much, as marching band 🎺 has started, so I’ve had less time. But now I can do the really exiting stuff! To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). What did I Do? As I mentioned in the last devlog, I have been working on doing a full passthrough of the entire project to get ready for major rewrites. I have completed by refactor checklist, so I have gone through ever cpp file to: Fix warnings Check object method & attribute visibility Check const, static, and inline declarations Change the placement and formatting of method Going through every line of code to do minor logic changes & change formatting Rename methods, attributes, functions, and variables to better names & names w/ personal conventions. Add comments everywhere Change the placement of the #include statements (main header file, object interfaces, project files, project packages, extra C++ headers) Run a full clean, compile, and test of the application The LIE Technically I didn’t go through every file, as I left AssetManager & Rasterizer . Since these will be completely rewrote soon I felt like it was a waste. What next? Now that I have finished cleaning up the code base, the next projects are to: Move to using UUIDs instead of an entity index in scene Gut AssetManager and rewrite it Change to using metafiles instead of a preditermined path to assets Rework the scene class Extend IRenderer and get ready for the fun part! Thanks for reading! I tried to keep this one shorter for y’all. I don’t normally get too much attention to my devlogs, but I would be more than happy to answer any questions, as there is so much more to this project that even the landing page doesn’t cover (WIP). If you’re curious, feel free to reach out on slack (pkncoder), and here are some extra links about the project: Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 29073, "ts": "2026-07-15T18:41:40Z", "hours": 4.3689, "text": "—————– Devlog X —————– I’ve been working on refactoring my project for the last few hours. Part of how I code includes: Comments throughout to explain the code, strict formatting throughout, and trying to help the compiler with “const” and “inline” keywords. To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). The process My process of refactoring usually happens once I finish a new addition, however I haven’t been adding new things for a while. Now that I’ve added a new addition to the project (Event system & LayerStack), I want to go through the entire codebase under the src/ directory (not the glsl shaders). Project code stats (src/ directory) Running the command line utility “cloc” on my src/ directory to count code stats, I get these counts: ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- C++ 23 646 464 1930 C/C++ Header 47 506 205 1302 ------------------------------------------------------------------------------- SUM: 70 1152 669 3232 ------------------------------------------------------------------------------- Not very big yet, although that will be increased once I get to redoing the entire rendering engine. What I have done Now, back to my refactoring. I got through the basics: removing warnings, double checking the public/private attribute declarations on classes & structs, setting const on functions & params, setting inline on functions. The checklist This is my entire checklist for refactors, this is my first project using it, so it is still being worked on: ### Refactor Checklist (src/) 1. [x] Fix warnings 2. [x] Fix public vs. private 3. [x] Make functions const when needed 4. [x] Make function params const when needed 5. [x] Make functions inline when needed 6. [ ] Fix placement of functions 7. [ ] Refactor step by step in code 8. [ ] Rename things 9. [ ] Add comments 10. [ ] Place the \\#includes in the right spots 11. [ ] Fix file tree 12. [ ] Run ```./fullTest``` 13. [ ] Update the obsidian canvas & png 14. [ ] Update the website Eventually I will also need to make one for the shaders too, as they are sometimes more technical on the code side. Conclusion That’s all that I’ve been doing, thanks for reading. Here is my Github repo & landing page for this application: Source Code: https://github.com/pkncoder/Engine Landing Page: https://pkncoder.github.io/Engine"}, {"post_id": 27729, "ts": "2026-07-13T15:23:24Z", "hours": 8.2792, "text": "Devlog IX I have been working the past week to get the Event system working & trying to fix pointer / referance issues (there are still a few I haven’t figured out). But now I have a working event system. To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). LayerStack recap In my previous devlog, I explained the Layer Stack 🥞, a top-down structure for controlling object ownership and main loop execution. Every frame, the layer stack runs the first layer to poll camera movement inputs (temp), and then next layer is ran to render out the frame through the RendererManager. Events This is great, but where the layer stack really shines is the event system . Events are reactions to when anything happens, keys being pressed / released, the window resizing, etc. When an event is dispatched, the layerstack stops, loops through each layer running it’s “onEvent” function to let that layer react (ex. the final render needing it’s texture resized). If a layer doesn’t want below layers to react to the event, it can consume it, stopping the event dispatching and continuing execution. Struggle and Pointer Nonsense I struggled a ton with the event state not updating correctly, and the camera not giving the right values to render the triangles. It turned out to be objects/classes duplicating, and not being able to update. There is so many debug messages in the terminal 😭 Ends This was all front-end changes (no change in the render), but now there is a better system put in place (back end changes). Github repo: https://github.com/pkncoder/Engine/tree/Phase-IV Landing page / Website: https://pkncoder.github.io/Engine/"}, {"post_id": 23348, "ts": "2026-07-06T07:48:30Z", "hours": 11.7481, "text": "Tempname: Engine update. I am so tired To keep it all contained, since the last devlog I have: Merged Phase-III into main & created a Phase-IV branch Changed the landing page’s color palette Modified the target architecture 4 times (3 committed) Created a rudimentary SceneManager class Implemented an EngineContext class to distribute ownership & to help with data flow+containment Implemented a layer system to help cut down on application & to contain/host the events system. Finally put in the system directory (folder) in the architecture that will host any simulations, computations, and animations. Currently it is the planned details for the camera system. The biggest thing that I have done so far is the layer system & state/context creation. The context of the engine lets managers talk to each other so everything can work together, while keeping everything contained. The state is split up into two parts, state & settings (or state & configuration). The state is meant for information that is meant to change throughout runtime, and the engine depends on it to render the right final result (ex. camera state & position). The settings part is meant for variables that won’t change too much, but if they do it is something that is a large modification to the runtime (ex. window title, rendering engine). The layer system is like a regenerating stack of pancakes 🥞. Before you cast your pancake regeneration spell we all have, you have to prep the pancakes with butter and syrup. Each time you finish the pancakes, a new round starts and you eat them again. Then, once you are done, you have to disable the regeneration spell. The layer system acts the same, but computationally & layers instead of pancakes. Each layer goes through the lifecycle of onAttach -> onUpdate -> onDetach. By far the biggest reason for the layer system is the event system, but I’ll leave that for the next devlog. Here is the github page: https://github.com/pkncoder/Engine/tree/Phase-IV Here is the landing page: https://pkncoder.github.io/Engine/ I still have soooo much to do, especially with & after the event system. I’ve completed most of the easy stuff for Phase-IV. Here is the current architecture & a site screenshot."}, {"post_id": 19362, "ts": "2026-06-30T17:15:23Z", "hours": 5.5031, "text": "Changed my mind on shipping, however I do now have a landing page! I still have to do things like changing the color palette (it’s alright now, but I want something different I think), adding little details to really sell the “Rendering” aspect of Tempname: Engine, etc. etc. Here’s the landing page, please check it out & give any feedback! https://pkncoder.github.io/Engine/index.html Since I changed my mind on shipping, here are those images that I was going to use!"}, {"post_id": 18091, "ts": "2026-06-29T02:57:38Z", "hours": 8.6825, "text": "Just got done with some renders on the engine, been working all day on implementing the things needed. Along with the images, I added: Shadow Mapping for the Rasterizer (only 1 emitter) Tone mapping to the Rasterizer Fog to the Rasterizer A vignette effect to the Rasterizer Transparency maps to the Rasterizer Settings & presets for the renders A new “Queer Room” modeled by me in blender for the Path Tracer (going to post it on ship). I honestly have had so much fun with this. Currently working on a landing page to go in place of my “Online Demo” on stardance (since this isn’t that kind of application D: ). Here’s the github: https://github.com/pkncoder/Engine/tree/Phase-III ! At some point I’ll be redoing the README as well for more info. Also, these images aren’t even the best ones, I’ll leave that for the ship :3"}, {"post_id": 16960, "ts": "2026-06-27T15:16:34Z", "hours": 1.2764, "text": "I’ve done a bunch more Todos in my code, getting ready for shipping Phase-III. However, I realized I forgot in my planned Architechture about Acceleration structures (which are very important). So I planned that out! Currently just: BVH (Bounding Volume Heirarchy) for Ray & Path Tracing SVO (Sparse Voxel Octree) for Ray Marching (Hypothetically) These acceleration structures make rendering methods like Ray & Path Tracing, Ray Marching, Ray Casting, etc. feasible for real-time by “cutting out” data (objects) similar to how a Binary Tree works. Next is more clean up, then creating models for some renders I can use in the banner of this + the github Readme, and finally creating a landing page to put in place of the online demo! Then I can finally ship!!!! Here’s the github (ignore main branch): https://github.com/pkncoder/Engine/tree/Phase-III ."}, {"post_id": 16713, "ts": "2026-06-27T04:43:42Z", "hours": 17.5281, "text": "Working on finishing the current development phase, of my project, which also means finally shipping Tempname Engine: Phase-III. I wanted to plan out Phase IV a little bit more, which will focus on: Getting a structured scene management system Improving the Renderer (ability & architecture) + adding 2 new Renderers Adding scene loading & serialization (and “asset serialization” which is weird name) Here is the current & planned architectures of Phase III & Phase IV, at some point I need to redo Phase-III’s to match the style, but I’m tired of working in obsidian to not even get the hours logged."}, {"post_id": 11788, "ts": "2026-06-19T05:50:41Z", "hours": 7.56, "text": "I have finished getting albedo (basic color) textures loading! To get this working I had to redo how meshes were loaded completely, but I finally finished that. The backrooms model was an issue, as I needed to find one that would work, and then fix it in blender, but I’m glad it’s rendering! As for the promised model of the oiiaioooooiai cat 🐈 (Ethel), I did get the model & textures, but I will have to mess with it more, as the model & texture do not line up yet. If you would like to try for yourself, the github repo is here: https://github.com/pkncoder/Engine/tree/Phase-III . The repo is large currently, as I still need to compress the files, or remove them (gitignore). The path tracer is currently disabled , as I need to swap the textures to handles, and then modify the path tracer to work with the textures. It will look really good once I get that working though!"}, {"post_id": 10063, "ts": "2026-06-16T17:20:32Z", "hours": 2.4, "text": "I haven’t done much work on getting textures or anything, however I was able to re-do the shaders. Just some framework stuff like abstracting the shader models so each renderer can implement them to their need. I also spent some more time getting some generic formatting stuff like naming conventions (mostly naming conventions) I also made an “architecture” diagram, as I was requested for one (plus I needed one anyways). Anything purple (besides the background) is a temporary connection/file. Anything green needs re-worked The “Services” group contains files that are completely static in use, and are accessible globally. It’s still a bit messy, but that’s partly due to the temporary/need re-worked files. There’s a still some spaghetti code due to that. The shader files do look a lot like spaghetti as well, but that is mostly do to positioning. It’s pretty basic, as the ui/ and system/ dirs aren’t in there either (system/ is simulations + any computations that would need to be done (ex. translating data for one renderer to another)). I made the image in Obsidian’s canvas, sadly the wakatime add-on wasn’t working for me, so that time didn’t get counted, but oh well. And if the image is cut-off for you, the Services block has Input.cpp, Timer.cpp, and Logger.cpp. I still have a lot of shader work to redo, but I might try to get textures working soon for the Rasterizer, as I’m wanting them more & more."}, {"post_id": 9647, "ts": "2026-06-16T01:45:44Z", "hours": 19.2833, "text": "Hey everyone, I’m Kia! 👋 I’m currently building a custom 3D Engine from the ground up. While it’s definitely a fun passion project, it’s designed to be a genuinely powerful and useful tool. The scope of this project is pretty massive, but here are the main goals I’m chasing right now: 🎨 Multi-Style Rendering: I want this engine to render scenes in highly stylized ways using a variety of techniques. Currently planning support for: Rasterization Path Tracing Ray Marching Ray Casting (Voxels) Simple and easy: No one likes being thrown to the wolves. The engine will feature a clean, simple UI that scales in complexity as you learn how to use it, rather than overwhelming you right at the start. Accessible Animation: Built-in tools for animations and simulations that are actually easy to understand and use. 🛠️ Latest Update: Path Tracer Rewrite I recently did a complete rewrite of the Path Tracer! This was a massive step to future-proof the engine. It now supports multiple shader passes, debug textures, and is fully prepped for texture mapping. Why am I so excited about getting textures working? Because the second they drop, I am immediately rendering 1) The Backrooms 🟨 and 2) the spinning “Oiiaioooooiai” cat 🐈. Texture support should be ready very soon! Want to check it out (please do)? 💻 GitHub: Check out the code and the todo.md to see what I’m working on next: https://github.com/pkncoder/Engine/tree/Phase-III 🎮 Live Demo: Try out my almost real-time Path Tracer right in your browser (click and drag to look around): Shadertoy Path Tracer Demo: https://www.shadertoy.com/view/7fBSzR"}]...
|
Title: Tempname: Engine by @pkncoder | Stardance
Title: Tempname: Engine by @pkncoder | Stardance
Devlogs:
Hey everyone, I’m Kia! 👋 I’m currently building a custom 3D Engine from the ground up. While it’s definitely a fun passion project, it’s designed to be a genuinely powerful and useful tool. The scope of this project is pretty massive, but here are the main goals I’m chasing right now: 🎨 Multi-Style Rendering: I want this engine to render scenes in highly stylized ways using a variety of techniques. Currently planning support for: Rasterization Path Tracing Ray Marching Ray Casting (Voxels) Simple and easy: No one likes being thrown to the wolves. The engine will feature a clean, simple UI that scales in complexity as you learn how to use it, rather than overwhelming you right at the start. Accessible Animation: Built-in tools for animations and simulations that are actually easy to understand and use. 🛠️ Latest Update: Path Tracer Rewrite I recently did a complete rewrite of the Path Tracer! This was a massive step to future-proof the engine. It now supports multiple shader passes, debug textures, and is fully prepped for texture mapping. Why am I so excited about getting textures working? Because the second they drop, I am immediately rendering 1) The Backrooms 🟨 and 2) the spinning “Oiiaioooooiai” cat 🐈. Texture support should be ready very soon! Want to check it out (please do)? 💻 GitHub: Check out the code and the todo.md to see what I’m working on next: https://github.com/pkncoder/Engine/tree/Phase-III 🎮 Live Demo: Try out my almost real-time Path Tracer right in your browser (click and drag to look around): Shadertoy Path Tracer Demo: https://www.shadertoy.com/view/7fBSzR
I haven’t done much work on getting textures or anything, however I was able to re-do the shaders. Just some framework stuff like abstracting the shader models so each renderer can implement them to their need. I also spent some more time getting some generic formatting stuff like naming conventions (mostly naming conventions) I also made an “architecture” diagram, as I was requested for one (plus I needed one anyways). Anything purple (besides the background) is a temporary connection/file. Anything green needs re-worked The “Services” group contains files that are completely static in use, and are accessible globally. It’s still a bit messy, but that’s partly due to the temporary/need re-worked files. There’s a still some spaghetti code due to that. The shader files do look a lot like spaghetti as well, but that is mostly do to positioning. It’s pretty basic, as the ui/ and system/ dirs aren’t in there either (system/ is simulations + any computations that would need to be done (ex. translating data for one renderer to another)). I made the image in Obsidian’s canvas, sadly the wakatime add-on wasn’t working for me, so that time didn’t get counted, but oh well. And if the image is cut-off for you, the Services block has Input.cpp, Timer.cpp, and Logger.cpp. I still have a lot of shader work to redo, but I might try to get textures working soon for the Rasterizer, as I’m wanting them more & more.
I have finished getting albedo (basic color) textures loading! To get this working I had to redo how meshes were loaded completely, but I finally finished that. The backrooms model was an issue, as I needed to find one that would work, and then fix it in blender, but I’m glad it’s rendering! As for the promised model of the oiiaioooooiai cat 🐈 (Ethel), I did get the model & textures, but I will have to mess with it more, as the model & texture do not line up yet. If you would like to try for yourself, the github repo is here: https://github.com/pkncoder/Engine/tree/Phase-III . The repo is large currently, as I still need to compress the files, or remove them (gitignore). The path tracer is currently disabled , as I need to swap the textures to handles, and then modify the path tracer to work with the textures. It will look really good once I get that working though!
Working on finishing the current development phase, of my project, which also means finally shipping Tempname Engine: Phase-III. I wanted to plan out Phase IV a little bit more, which will focus on: Getting a structured scene management system Improving the Renderer (ability & architecture) + adding 2 new Renderers Adding scene loading & serialization (and “asset serialization” which is weird name) Here is the current & planned architectures of Phase III & Phase IV, at some point I need to redo Phase-III’s to match the style, but I’m tired of working in obsidian to not even get the hours logged.
I’ve done a bunch more Todos in my code, getting ready for shipping Phase-III. However, I realized I forgot in my planned Architechture about Acceleration structures (which are very important). So I planned that out! Currently just: BVH (Bounding Volume Heirarchy) for Ray & Path Tracing SVO (Sparse Voxel Octree) for Ray Marching (Hypothetically) These acceleration structures make rendering methods like Ray & Path Tracing, Ray Marching, Ray Casting, etc. feasible for real-time by “cutting out” data (objects) similar to how a Binary Tree works. Next is more clean up, then creating models for some renders I can use in the banner of this + the github Readme, and finally creating a landing page to put in place of the online demo! Then I can finally ship!!!! Here’s the github (ignore main branch): https://github.com/pkncoder/Engine/tree/Phase-III .
Just got done with some renders on the engine, been working all day on implementing the things needed. Along with the images, I added: Shadow Mapping for the Rasterizer (only 1 emitter) Tone mapping to the Rasterizer Fog to the Rasterizer A vignette effect to the Rasterizer Transparency maps to the Rasterizer Settings & presets for the renders A new “Queer Room” modeled by me in blender for the Path Tracer (going to post it on ship). I honestly have had so much fun with this. Currently working on a landing page to go in place of my “Online Demo” on stardance (since this isn’t that kind of application D: ). Here’s the github: https://github.com/pkncoder/Engine/tree/Phase-III ! At some point I’ll be redoing the README as well for more info. Also, these images aren’t even the best ones, I’ll leave that for the ship :3
Changed my mind on shipping, however I do now have a landing page! I still have to do things like changing the color palette (it’s alright now, but I want something different I think), adding little details to really sell the “Rendering” aspect of Tempname: Engine, etc. etc. Here’s the landing page, please check it out & give any feedback! https://pkncoder.github.io/Engine/index.html Since I changed my mind on shipping, here are those images that I was going to use!
Tempname: Engine update. I am so tired To keep it all contained, since the last devlog I have: Merged Phase-III into main & created a Phase-IV branch Changed the landing page’s color palette Modified the target architecture 4 times (3 committed) Created a rudimentary SceneManager class Implemented an EngineContext class to distribute ownership & to help with data flow+containment Implemented a layer system to help cut down on application & to contain/host the events system. Finally put in the system directory (folder) in the architecture that will host any simulations, computations, and animations. Currently it is the planned details for the camera system. The biggest thing that I have done so far is the layer system & state/context creation. The context of the engine lets managers talk to each other so everything can work together, while keeping everything contained. The state is split up into two parts, state & settings (or state & configuration). The state is meant for information that is meant to change throughout runtime, and the engine depends on it to render the right final result (ex. camera state & position). The settings part is meant for variables that won’t change too much, but if they do it is something that is a large modification to the runtime (ex. window title, rendering engine). The layer system is like a regenerating stack of pancakes 🥞. Before you cast your pancake regeneration spell we all have, you have to prep the pancakes with butter and syrup. Each time you finish the pancakes, a new round starts and you eat them again. Then, once you are done, you have to disable the regeneration spell. The layer system acts the same, but computationally & layers instead of pancakes. Each layer goes through the lifecycle of onAttach -> onUpdate -> onDetach. By far the biggest reason for the layer system is the event system, but I’ll leave that for the next devlog. Here is the github page: https://github.com/pkncoder/Engine/tree/Phase-IV Here is the landing page: https://pkncoder.github.io/Engine/ I still have soooo much to do, especially with & after the event system. I’ve completed most of the easy stuff for Phase-IV. Here is the current architecture & a site screenshot.
Devlog IX I have been working the past week to get the Event system working & trying to fix pointer / referance issues (there are still a few I haven’t figured out). But now I have a working event system. To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). LayerStack recap In my previous devlog, I explained the Layer Stack 🥞, a top-down structure for controlling object ownership and main loop execution. Every frame, the layer stack runs the first layer to poll camera movement inputs (temp), and then next layer is ran to render out the frame through the RendererManager. Events This is great, but where the layer stack really shines is the event system . Events are reactions to when anything happens, keys being pressed / released, the window resizing, etc. When an event is dispatched, the layerstack stops, loops through each layer running it’s “onEvent” function to let that layer react (ex. the final render needing it’s texture resized). If a layer doesn’t want below layers to react to the event, it can consume it, stopping the event dispatching and continuing execution. Struggle and Pointer Nonsense I struggled a ton with the event state not updating correctly, and the camera not giving the right values to render the triangles. It turned out to be objects/classes duplicating, and not being able to update. There is so many debug messages in the terminal 😭 Ends This was all front-end changes (no change in the render), but now there is a better system put in place (back end changes). Github repo: https://github.com/pkncoder/Engine/tree/Phase-IV Landing page / Website: https://pkncoder.github.io/Engine/
—————– Devlog X —————– I’ve been working on refactoring my project for the last few hours. Part of how I code includes: Comments throughout to explain the code, strict formatting throughout, and trying to help the compiler with “const” and “inline” keywords. To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). The process My process of refactoring usually happens once I finish a new addition, however I haven’t been adding new things for a while. Now that I’ve added a new addition to the project (Event system & LayerStack), I want to go through the entire codebase under the src/ directory (not the glsl shaders). Project code stats (src/ directory) Running the command line utility “cloc” on my src/ directory to count code stats, I get these counts: ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- C++ 23 646 464 1930 C/C++ Header 47 506 205 1302 ------------------------------------------------------------------------------- SUM: 70 1152 669 3232 ------------------------------------------------------------------------------- Not very big yet, although that will be increased once I get to redoing the entire rendering engine. What I have done Now, back to my refactoring. I got through the basics: removing warnings, double checking the public/private attribute declarations on classes & structs, setting const on functions & params, setting inline on functions. The checklist This is my entire checklist for refactors, this is my first project using it, so it is still being worked on: ### Refactor Checklist (src/) 1. [x] Fix warnings 2. [x] Fix public vs. private 3. [x] Make functions const when needed 4. [x] Make function params const when needed 5. [x] Make functions inline when needed 6. [ ] Fix placement of functions 7. [ ] Refactor step by step in code 8. [ ] Rename things 9. [ ] Add comments 10. [ ] Place the \#includes in the right spots 11. [ ] Fix file tree 12. [ ] Run ```./fullTest``` 13. [ ] Update the obsidian canvas & png 14. [ ] Update the website Eventually I will also need to make one for the shaders too, as they are sometimes more technical on the code side. Conclusion That’s all that I’ve been doing, thanks for reading. Here is my Github repo & landing page for this application: Source Code: https://github.com/pkncoder/Engine Landing Page: https://pkncoder.github.io/Engine
—————– Devlog XI —————– I haven’t been programming as much, as marching band 🎺 has started, so I’ve had less time. But now I can do the really exiting stuff! To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). What did I Do? As I mentioned in the last devlog, I have been working on doing a full passthrough of the entire project to get ready for major rewrites. I have completed by refactor checklist, so I have gone through ever cpp file to: Fix warnings Check object method & attribute visibility Check const, static, and inline declarations Change the placement and formatting of method Going through every line of code to do minor logic changes & change formatting Rename methods, attributes, functions, and variables to better names & names w/ personal conventions. Add comments everywhere Change the placement of the #include statements (main header file, object interfaces, project files, project packages, extra C++ headers) Run a full clean, compile, and test of the application The LIE Technically I didn’t go through every file, as I left AssetManager & Rasterizer . Since these will be completely rewrote soon I felt like it was a waste. What next? Now that I have finished cleaning up the code base, the next projects are to: Move to using UUIDs instead of an entity index in scene Gut AssetManager and rewrite it Change to using metafiles instead of a preditermined path to assets Rework the scene class Extend IRenderer and get ready for the fun part! Thanks for reading! I tried to keep this one shorter for y’all. I don’t normally get too much attention to my devlogs, but I would be more than happy to answer any questions, as there is so much more to this project that even the landing page doesn’t cover (WIP). If you’re curious, feel free to reach out on slack (pkncoder), and here are some extra links about the project: Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
—————– Devlog XII —————– I haven’t done as much programing recently, but yesterday I wanted to finish what I needed to do quickly, as it wouldn’t take that long. To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). 🎯 UUIDs For a quick explanation of what a UUID is: UUID stands for Universally Unique Identifier. In practice it is a random alphanumeric (a-z,0-9) ID between 64-128 bits. For my project, I used an unsigned 64 bit integer (no negative numbers). It isn’t exactly what the standard for a UUID is, as it isn’t alphanumeric, but I think for now 18.4 quintillion ids are just fine. ⬆️ What Next?? Now that I’ve finished this, the next step is to gut & rewrite the entire asset managing system. I need to redo how files are found, how data is stored, how they are retrieved. Basically the CRUD (create, read, update, delete) line and more. ❤️ Thanks for reading Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
—————– Devlog XIII —————– Spent some time off from working on this project, started the beginnings of another one. Finally ended up getting the interest to come back to this one To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). 💡 Overview Commit message for this devlog: BREAKING CHANGE - New asset system, new scene system, renamed SceneLoader to PrefabSpawner, still need to update rest of code with temp fix until reworking for new system. ✨ What did I do? Previously, the asset manager did still handle caching already loaded assets (models, materials, textures), however the implementation was not professional and temporary: Caching based on a string key (slow) Broke the “single responsibility principal” many times by uploading to the GPU & constructing Scene objects Now, I am using AssetHandles (UUIDs) for caching, and I no longer uploading to the GPU in AssetManager. ❌ What didn’t I do? This new system is a good start for realigning and separating the different parts of the program, but is only about a third of the work. For what I still need to do, this is what follows: Stop uploading to the GPU in the PrefabSpawner (scene) Fix the renderer and find where I will upload the mesh & texture data. Check for compilation and working across the whole project. Change every instance of AssetManager to using AssetHandles. Once I have these, I can move onto redoing the renderers and FINALLY start working on the “fun stuff” ❤️ Thanks for reading Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
—————– Devlog XIV —————– The Planning - The possible NEW NAME??? - The New Project!! To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ So What Happened? 📸 I haven’t done much pure coding, HOWEVER , I am getting ready for some large-scale rewrites and additions to the code. For what has happened: Fully sectioned the resource - disk - and scene - cpu/logic - directories (folders) so there wasn’t any GPU actions taken place. Refactored resource and scene directories Re-implemented Application into CMakeLists so I can compile and link that file. Did some planning for the huge renderer rewrite that is coming up. Along with all of that, I came up with a possible name for the application (since, surprisingly, Tempname: Engine is a temp name) I had it when when gazing at the sun through some clouds over a feild. Although it is super basic, so I’m going to have to play with it. ❤️ Thanks for Reading!!! I might have to take a bit of a break from progress on this project, as I have a website that I’m making for my local fire dept. (look out for a new stardance project)! I’m also planning on doing some re-marketing / re-branding (idk what to call it) to change the descriptions of the project (ex. the “To recap section on my devlogs, and the landing page). I’ve been getting more questions on it, and my current explanations are a bit too much. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🗿 Commits 🥀 (top-oldest : bottom-newest) No more mention of buffer manager or any uploading to gpu in scene & assets. Meshes are now split up from models in the cache, models hold refrences to asset handles to meshes. Refactored and fixed errors in scene and resources. The program won’t work, as only scene and resources are being compiled & linked Added application back into the mix & fixed the scene loading section. Did some planning on how a model will go from spawn to render
—————– Devlog XV —————– – Temp code go brrrrr 🔋 - New term : “Far Landing” – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ I tried getting this out before 4 hours, but it just –wouldn’t__ happen. Weird errors kept popping up ( mostly being my fault) . Here’s a list of what I did: Figured out generally how I was going to deal with uploading and caching meshes + textures Put the new GPUResourceManager class into place to do the previously mentioned job Started reworking the renderer pipeline (NOT THE RENDER PIPELINE) on CPU side, and set up the interface class with that Patched together the old Rasterizer renderer to work with the new IRenderer pipeline Fixed errors throughout Split up normal & bump textures Planned out how I will deal with all the different textures on the shader side, cutting the checks out at shader compile time Yea, I know, it’s a lot . It just felt wrong to create a devlog in the middle of everything, since up until after fixing errors I had nothing to show for it. :( I ran into this errors when fixing those errors, where the entire model (I was using the Sponza scene, check the attached video ) was banded, where parts “didn’t exist” and the other bands did . This reminded me a lot of the “Minecraft Farlands” specifically the pocket edition ones. 🔥 What didn’t I do? 💥 To keep this brief: Fully split up the SSBO system in the BufferManager Reimplement good use cases of UBOs (although I did put in place double buffering) Add the more sophicticated data handling in the PathTracer (as I commented it’s existance out so I could complile). Figure out how shadow mapping is going to be cleaned up in the Rasterizer. ❤️ Thanks for reading! These devlogs have been getting more attention, and I’m getting closer to doing a rebrand to finally get my point and final ideas across! :3 Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🥀 Git commits 🗿 Patched in the “new” buffer system - Really just to get it to compile before I do anything big. Attempting to run the app to test resources & scene Well it compiles, runs, and renders. I still need to go through all the models, HOWEVER, I am having an issue with like 3 models in sponza and bump UGH Well, I checked Phase-III, and the issue with those models are there too, probally some texture coord issue or the bump map is messed up (I’ll check in blender), BUT THEN ON FIRST LOAD THE MODEL FRA LANDED????
—————– Devlog XVI —————– So long , gay Bowser ⭐️ – IRenderer, hardly know her? - To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ⭐️ BEFORE ANYTHING - Thanks so much to @AVD for the super star, wasn’t expecting it and I really appreciate it 👏 👏. Now, for what I did: Dealt with an issue in Obsidian, as apparently there was “minor rendering performance improvements.” This is FALSE :( - I just downgraded the version Created the new BufferManager to handle UBOs, SSBOs, VBOs, EBOs, etc. + Dynamic, Static, and Stream buffers. Integrated the RenderTarget & ShaderPass system from PathTracer straight into IRenderer + added base utilities to it. Did some formatting Overall the two big things that I did was the new Buffer system & the updated IRenderer interface. For the new Buffers, previously I had UBOs (dynamic values) & SSBOs (big mostly static information blocks) set up in seperate files, that BufferManager returned. Now, every buffer is a single struct called GPUBuffer , and GPUBuffer has a type, and a usage (see attached photo). Now everything is centralized on that. For the new IRenderer interface, now there are RenderTargets - textures that shaders write to as output - and ShaderPasses - A pass of a shader. These can be added to a registry, keyed by a UUID (big number, in this case). Thanks for reading Again, thanks so much to AVD for the super star! I’m excited for when I can finally start writing my shaders, it’s getting closer & closer!! The fancy Path Tracer will be cool and all, but I have big plans for the Ray Marcher!! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🥀 Git Commits 🗿 Fixed an obsidian issue I ran into, “Minor rendering performance improvements.” was NOT true, broke almost the entire canvas. Fixed it though + new png Created the new buffer managegr system, I need to go through and make changes. Also, on launch there was more blacked out sections, different every launch :( New IRenderer setup for the render targets & render handles Refactor 1-6 Refactor 7-9 for BufferManager
—————– Devlog XVII —————– - Strange Hours - To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ To start off, I did not work directly on my application, but the online demo . It’s like working on the website, but through another editor sometimes. The goal of the Path Tracer is to eventaully get it clean & quick enough to be real-time. This is the first of the 5 renderers that I will be making. I was working on my online shadertoy DEMO for the Path Tracer, specifically the denoiser. The name of the denoiser I am using is the “Edge-Avoiding Á Trous Wavelet Transform” . As a quick overview: It applies a blur “ with holes ” to allow for less to no image distortion Fast enough for realtime Includes “ weights ” based on (in my code): Normal , Depth , and Color . The larger the difference between the center pixel and the scanned pixel * (kernel), the more weight is applied, lessening the amount of blur. This is amazing, however when the camera moves , the denoiser assumes that the current and previous pixel are in the same world postion (when it isn’t). This causes errors when trying to overlay the image and gather data. This is why we track the motion of the camera, creating a vector to get the same world position pixel. I got this wrong on one of the first attempts, the last attachment (videos are compressed) shows that fun video (warning for those who get motion sick). With this, I am able to blur the image, and with some more techniques, I can get rid of “ghosting.” Thank You for Reading In the videos, I rendered them in fullscreen 4k on my better laptop+GPU, don’t worry about your system being too slow, just don’t fullscreen it <3 (the development was done on my lower end mac). The hours logged are from refactoring the project after the last devlog, and editing the code when I didn’t do it in shadertoy’s editor. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🥀 Git Commits 🗿 BREAKING CHANGE - Refactored Buffer & GPUResource managers + IRenderer - Code has been broken for a bit but womp womp Shadertoy shaders path tracer https://www.shadertoy.com/view/7fBSzR
—————– Devlog XVIII —————– - 🌲 Trees 🧚♀️ - 👩💻 SO MUCH REWRITING 💀- To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ These last few days, I’ve been working on getting my Rasterizer (drawing triangles of a model on screen and coloring them) working. The big changes that I did include: Fixing an issue with textures not loading Updated the Interface for every Renderer. Implemented the extract / prepare / dispatch pipeline into the Rasterizer for real now. Started working on the base ideas of a “Shader Graph” The issue with textures was just moving a line like 3 lines lower . I was freeing the image data before saving it (oops) . The updated interface is the IRenderer class. Each Renderer bases off of the class, supplying it with a framework so each Renderer can be talked to the same way. Here are some of those functions: beginFrame - Clear previous frame data and prepare for a new frame extract - Take raw scene data ( camera , renderables ) and convert it into packets for the next step. prepare - Take each packet from extract and turn them into draw commands for dispatch. dispatch - Take each draw command and send a draw call, along the way binding any textures & uniforms. postProcess - Take the frame and post-process it. This may be removed. present - Take the rendered frame and show it to the screen ( blit it ). To do a quick review on what the Shader Graph is - it is a collection of “nodes,” each with their own inputs and outputs that connect together to render out a frame. I’m still a bit confused, but I’ve been watching presentations on the topic from companies like Unity & Activision . Thank You for Reading Yea, I know it’s been a while since my last devlog. I’ve been making some posts in slack about my Path Tracer, since I spent a little time on that. I’m looking at the timing for everything , the hope is to ship this at the end of Phase-IV and hope that I can get a UI working before too late. I’m hoping I can get enough stardust to pay for a new laptop, but idk that’s a long shot. I still have about 25 more hours if I get a 16x mult (which I can only hope for) before I would hit the mark for the FW 12, which isn’t crazy (the mult is tho). Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Stop the program from crashing to reach a black screen Rewrite shaders to allow for correct models wo/ shadows Write the shadow cubemap geometry shader & ad it to the OpaquePass (temp main pass) Make and debug UBOs replacing base uniforms 🥀 Git Commits (shortened)🗿 https://github.com/pkncoder/Engine/commits/Phase-IV/
—————– Devlog XIX —————– - 🌲 Textuers 🧚♀️ - 👩💻 Shadoowwsss 💀- To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ To recap on what I did: Got the program to launch to black screen I needed to inject the Asset Manager to a class Got objects loading correctly without shadows Got textures to load Started work on fixing the shadow map Nothing too crazy has been changed, the texture issues were about some compatibility problems and not uploading to the same index. The shadow values are uploaded to a 3d texture, where to calculate if an object is in sight or not, we commit triangles based on their position. The problem now is about the far plane, and hitting triangles that weren’t in shadow. I’m not sure what the problem is, but I’m going to do a bit more looking into it. Thank You for Reading :3-blahaj-spinning I still have to fix the shadows issue (obviuosly) but then I can move onto formatting the data (putting it into buffers, creating wrappers, etc).!! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Write the shadow cubemap geometry shader & ad it to the OpaquePass (temp main pass) Make and debug UBOs replacing base uniforms Refactor / clean Create the real Render Graph? 🥀 Git Commits (shortened)🗿 Commits: https://github.com/pkncoder/Engine/commits/Phase-IV/ Most Recent: Temporary Save
—————– Devlog XX —————– – 🌟I have the best one liners 🗿– 🥀 Now I have to be smart ??? 🧠 – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ For the quick overview: Fixed the shadow map issue ( so angry about this, see below ) Fixed an issue with textures not caching Got the very base implementation of Uniform Buffers To start off, in the previous devlog I mentioned I was re-writing the shadow mapping . Shadow Mapping - Rendering a 3d model with the light being the eye. Everything that it can see is not in shadow, everything else is. quick explanation I was having issues with getting the shadows to work correctly. I had ideas for issues, including: (the model matrix , the renderPackets being in a bad order , the far plane ). IT TURNS OUT It was none of these. Whenever I made the code to compile a geometry shader along the vertex & fragment shader, I just copied my old one and spliced in the code. Turns out I forgot to swap some variables, and I was putting code in places it should NOT be at. No idea why it didn’t crash, but it fixed my shadow issues very quick . As for UBOs, I’ll talk about them in a future devlog, when I have everything planned out. Thank You for Reading As I said with “Planning out” everything, I’m going to set up a whiteboard - I’ll have to move my 🏳️🌈 pride flags 🏳️⚧️ :( - Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Refactor Build the big brain wall Do some thinking 🥀 Git Commits🗿 Weird position issue Saving now, I am so angry about this. I was compiling and overwrigting the wrong code :( Made the testing for shadows a bit better, and changed the rendering a bit Fixed issue with textures and full models not actually caching Removed anoying debug line for shadow transform matricies Working on getting the ubos working’ Got it to push First test ubos
—————– Devlog XXI —————– – My brain hurts 🧠 - Sharp like glass – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Sadly, I haven’t done much coding Instead, I’ve been trying to figure out how I want my Render Graph to work. To start, what is a render graph? What I am interpreting the render graph as, issss: An API meant to simplify and provide structure to a final renderer. In the final application, the render graph will be an option for a more advanced final render editor. What I am working on now, is how it will be put together so I don’t have a mess in the future. Recently, I’ve been using Obsidian to mark everything down. This also starts a little docs. Using a mix of Obsidian and the excalidraw plugin, I’m able to write everything down and create visuals. Currently, I have a mix of nodes that are the main important ones. These nodes are just the interfaces , so they aren’t specified. They act as a blueprint for any of the full nodes. IRenderOutput - Add textures to a list of blitables IShaderInput - Base input interface IShaderOutput - Base output interface IShaderNode - Node representation of shaders IShaderPassNode - Base shader interface Thank You for Reading I haven’t been home enough to create the “big brain wall” which is sad, but at least my stuff is digital. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Setup current program for Render Graph implementation Implement IShader, IGPUTexture, etc. Create IRenderGraph for the renderers
—————– Devlog XXII —————– – BrEaKiNg ChaNGeS - 📖 NEW BOOOKKKK – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Sadly, I’ve done much coding Base list This is what I have done since the last devlog: Planned out a bit more on the inner workings from no Renderer->Rendered Image Created the new Shader & Program classes Updated the workings on RendererManager Started work on the new Renderer / IRenderer class Current commit is now broken (compiles, doesn’t run Overview In my new obsidian vault , I’ve been working on creating the new database on how it all works. Through this, I’ve been using excalidraw (Obsidian) to plan out pipelines & create visuals. Currently, I have 2 main drawings: Shader & Program pipeline Renderer Pipeline The Shader & Program pipeline explains the lifetime and usage of both the Shader and Program (OpenGL program) classes. A program gets created, has shaders attached to it (deleting the shader in the process) , and then the program gets linked & binded. The Renderer Pipeline explains the lifetime and usage of a renderer. Starting from the RendererManager, go through normal rendering stuff, and will end at shutting down the RendererManager. For the inner workings of the new renderer setup, I’ll leave that for (hopefully next devlog) when I get everything working start to finish of the RendererPipeline . Thank You for Reading As for the “ New Book I got, I have just purchased “ Game Engine Architecture Vol. I ” (Jason Gregory) to specialize the program more (most likely after Stardance ends). Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Plan out the RenderGraph Create the base RenderGraph class Create the BlitList Create the INodeInput & INodeOutput
—————– Devlog XXIII —————– – I NEED TO HURRY UP AAAA - EnTT - Table – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ In my previous devlog, I stated how I was working on the new RenderGraph . I’ve now realized, that I have like until the end of the week for when I need to ship. So instead , my goal is to get this looking impressive . To start, here is what I’ve done so far : Cleaned up system inits Changed how the UUID service works (now you just access it and call generate ) Implemented a new library, EnTT Did some cleanning up Added a PointLightComponent for future use (no dev. yet) Added and implemented the CameraComponent Here are the big things: EnTT EnTT is an open-source library that handles objects within games, editors, etc. It’s creator is: Michele Caini (skypjack on github) . EnTT is a library that exposes something called an Entity Component System (ECS). Basically, instead of saving a bunch of data directly inside of one struct or class, you define an entity (a unique id) and assign that entity components. The components are what actually gives the entity meaning. New Camera If you have ever ued Blender for a bit, you would know that your camera is on the same list as your meshes. This is since, to Blender, they are inherantly the same thing (don’t quote me on that) . Previously, my camera was seperate to all of the rest of the objects. This caused the data to be split, and handling the differences made my architecture a bit weird. Now that I’ve implemented EnTT , I’ve added a CameraComponent that defines things like rotation, FoV, etc - completely erasing the need for a separate camera, and opening the doors to more flexibility. Thank You for Reading New book is great! I won’t get to use too much of it for stardance, but I’m checking out this snowglobe thing that seems like it would be the next area!! Wish me luck on the ship. I want to get it out by the end of the week so I can hopefully still cache in some stardust. Probally won’t get the computer though (high hopes for a living or smthin idk) Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Change my Rasterizer to be a Defered Renderer & implement multiple point lights UI??
—————– Devlog XXIV —————– – i HATE shadow maps!!! - Renderer? I hardly know her? – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ WOAH A lot has happened. Previously, I had just implemented a new entity system & a new camera system. So what’s new? I present: The Deferred Renderer !!! Basically, it’s just another way of rendering. HOWEVER , it has some funzies: Mostly together render graph, just a little smthin Shadow Pass G-Buffer Pass Lighting Pass New point lights (replacing the emmissive texture searching before) Looking to add SSAO (hemisphere sampling) in the future!! Now, along with this, I just tested creating a build for windows and testing it on a friends machine, and it worked (his laptop is crap, so it ran slow, but surprisingly fast) . Along with that, I also tried the current build on mac, and it also worked, so that’s also great (I’m supprised)!! However, the real prize, is the trypophobia horrors made along the way!! That’s right! When trying to get textures to work, I ran into a ton of problems (mostly related to the alpha map & image formats) that caused major headaches. Images and videos, where they are a bit compressed, can be found below. Thank You for Reading Almost there, I still need to change up the landing page, rewrite the readme, and merge the main branch, plus try to get a way to change the 3d models for users, but I’m getting there. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
—————– Devlog XXV —————– – New JSON scene file 📁 - SHIP TIMEEEEE – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Not that much has happened tbh. All that has really happened… Updated the README a bit more Added a new json parser to spawn the scene from that Added hot reloading of the scene So yea, next should be the ship. When updating the README on the github, I was going through the Usage section, and added a new promise for how people could add their own meshes. In this I created the idea of activeScene.json , a JSON file that listed the scene data (crazy, right?). And so, after I updated the README , I added the new loader, and made the scene reload by pressing the “ r ” key. That’s kinda it… Thank You for Reading Before shipping, I need to… Do another update of the README Create the base Releases for Mac, Windows, and Linux And test these Do a pass through TODO.md Update the landing page Shouldn’t take too long Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
—————– Devlog XXVI —————– - - Almost… there – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ In order to show the capabilites, I’ve been setting up scenes for my engine to show off, and here are some of the results! It would be great to get your favorite render of these! For the full 9 renders , check out the scrapbook in the slack , as they will be there w/ a thread. Thank You for Reading Hopefully will actually ship tmwr! I’m actually getting kind of sad, I won’t be stopping development by any means, but this has been my summer (although I might not be able to get any stardance tokens, but that’s ok ig…). If you have any questions, feel free to DM me either here, or at @pkncoder on discord if that’s easier for you! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
—————– Devlog XXVII —————– - - Release is out testing time – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Not too much has happened, mostly: Updated README (resources, gallery, installation & use) Updated the landing page (added a tech-stack) Created my first release under the 1.3.x alpha title That big 1.3.x “alpha” release is the big one, as I need some help. If you could just take a bit of time, and you aren’t on linux-arm or apple-intel, could you check out the github releases and try it out, that would be great! I plan to ship tmwr, but I want some testing done first. Thank You for Reading So close!! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
Ships:
—————– Ship #1 —————– - - Welcome - To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). 💚 The current state 💫 There is still no UI, all render control is based in a JSON file. The current only renderer is a custom Deferred Renderer. Note: As this is built for 3d rendering, a modern computer, with a GPU is recommended. Modern Macbooks will run it, however it will be slower as it is basically magic that it works on them. Thank you so much! I’ve spent a lot of time on this. It may not seem like that, however when building this, I decided to do it right (as this is my 3rd attempt). I split the development into phases: Get a window Get something rendering + a camera Get object/material/texture loaders + basic scene managers + basic concept of working Create full scale (professional) renderers/scene managers/resource managers/etc. Get a UI Currently, I’m in getting everything polished in the backend. I didn’t want to move on to the UI, as I didn’t want to rush that. Rushing a UI meant missing other things. So thank you, and I really hope you enjoy. If there are any issues, please report them to the issues page on the github, and message me on slack ( @pkncoder ). Github releases: https://github.com/pkncoder/Engine/releases Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine...
|
1792853732.3869977
|
1792940132.3869977
|
|
52846
|
Electronic Calculator by @IndexJson | Stardance
|
IndexJson
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T11:56:56Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made an electronic calculator. That is a tool for hobbyists that want to make cool project and don’t want to deal with a lot of math. This project makes it simple since it bundles the most used equations into 1 program. I wrote it in C++ with Dear ImGui and GLFW. As rendering backend I chose OpenGL. It supports Linux.", "repo": "https://github.com/IndexAsm/ElectronicCalculator", "demo": "https://github.com/IndexAsm/ElectronicCalculator/releases/tag/v1.0"}]...
|
[{"post_id": 66499, "ts": "202 [{"post_id": 66499, "ts": "2026-09-12T10:33:55Z", "hours": 1.01, "text": "Devlog #05 Overview Voltage divider is now finished! Features For this calculator I decided to add combo boxes to select resistance units. It is quite useful sometimes. And everything else is the exact same as Ohm’s law. You fill all the required fields and it calculates as expected."}, {"post_id": 53957, "ts": "2026-08-24T17:45:27Z", "hours": 0.6994, "text": "Devlog #04 Overview I added a menu and fully finished Ohm’s law calculator. Menu From the menu you can now select what calculator you want to use. For now there aren’t too many options but there will be more in the future. Ohm’s Law Calculator This section is now fully finished! You have to select what to calculate, input all remaining parameters and click Calculate."}, {"post_id": 53697, "ts": "2026-08-24T11:28:05Z", "hours": 1.4592, "text": "Devlog #03 Overview So Ohm’s Law calculator is finished! You can select what to calculate and it will do just that. Language support As you can see everything is translated and has no impact on performance. Further plans I still have to add a few calculators. I was thinking about: Voltage divider Capacitor filter for bridge rectifier Transmission lines"}, {"post_id": 53035, "ts": "2026-08-23T12:57:51Z", "hours": 2.0119, "text": "Devlog #02 Overview I finished language manager. Adding translations is now quite easy. Just add a file and that’s it. Languages can be changed at runtime but it still has a few problem. New Font With addition of a new font all characters are displayed correctly. It now supports latin + cyrylic and of couse greek. And whatever else is in the font by default. Ohm’s Law Calculator Ohm’s law section is starting to take shape. Maintenance Also I refactored a lot of code, cleaned up big files, moved code into function and different files."}, {"post_id": 52398, "ts": "2026-08-22T14:54:48Z", "hours": 0.9042, "text": "Devlog #01 Overview I started working on a calculator that would help hobbyist with their electronic projects. Whenever I am designing a project, I use online calculator for many things: Ohm’s Law, Voltage Divider, Transmission Line. These are just the most common. With this project I intend to make it simpler by combining all of these calculators into one. Language & GUI Library I decided to write the project in C++, because it’s my favorite language. As for the GUI Library I went with Dear ImGui with glfw and opengl3. Language support This project is meant to be multilingual, so I decided to make this system first. Languages are stored as text files with .lang extension. Language Manager load text form this file and stores it in a map. This way adding new languages is very simple. Here you can see a quick demo showing that ImGui is working."}]...
|
Title: Electronic Calculator by @IndexJson | Stard Title: Electronic Calculator by @IndexJson | Stardance
Devlogs:
Devlog #01 Overview I started working on a calculator that would help hobbyist with their electronic projects. Whenever I am designing a project, I use online calculator for many things: Ohm’s Law, Voltage Divider, Transmission Line. These are just the most common. With this project I intend to make it simpler by combining all of these calculators into one. Language & GUI Library I decided to write the project in C++, because it’s my favorite language. As for the GUI Library I went with Dear ImGui with glfw and opengl3. Language support This project is meant to be multilingual, so I decided to make this system first. Languages are stored as text files with .lang extension. Language Manager load text form this file and stores it in a map. This way adding new languages is very simple. Here you can see a quick demo showing that ImGui is working.
Devlog #02 Overview I finished language manager. Adding translations is now quite easy. Just add a file and that’s it. Languages can be changed at runtime but it still has a few problem. New Font With addition of a new font all characters are displayed correctly. It now supports latin + cyrylic and of couse greek. And whatever else is in the font by default. Ohm’s Law Calculator Ohm’s law section is starting to take shape. Maintenance Also I refactored a lot of code, cleaned up big files, moved code into function and different files.
Devlog #03 Overview So Ohm’s Law calculator is finished! You can select what to calculate and it will do just that. Language support As you can see everything is translated and has no impact on performance. Further plans I still have to add a few calculators. I was thinking about: Voltage divider Capacitor filter for bridge rectifier Transmission lines
Devlog #04 Overview I added a menu and fully finished Ohm’s law calculator. Menu From the menu you can now select what calculator you want to use. For now there aren’t too many options but there will be more in the future. Ohm’s Law Calculator This section is now fully finished! You have to select what to calculate, input all remaining parameters and click Calculate.
Devlog #05 Overview Voltage divider is now finished! Features For this calculator I decided to add combo boxes to select resistance units. It is quite useful sometimes. And everything else is the exact same as Ohm’s law. You fill all the required fields and it calculates as expected.
Ships:
I made an electronic calculator. That is a tool for hobbyists that want to make cool project and don’t want to deal with a lot of math. This project makes it simple since it bundles the most used equations into 1 program. I wrote it in C++ with Dear ImGui and GLFW. As rendering backend I chose OpenGL. It supports Linux....
|
1792853858.2408555
|
1792940258.2408555
|
|
61385
|
WebOS 1 and 2 by @Parrot | Stardance
|
Parrot
|
4
|
8.6
|
14
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T11:41:42Z", "hours": 1.0, "multiplier": 1.52, "payout": 2, "blessing": "neutral", "text": "Ok guys this time i fully cleaned up my code and added new features to PixelOS ive add a Web, TErminal, and a test bar above I hope this time i get more than 8 Stardust:D also PLs vote Good for me pls pls ive spent 8 hours of my life for 12 stardust in totel and ive only spend like 3 hours on other project and got 60 stardust plessssssssss trust this is not begging for those of you who still have ideas for me can comment down below", "repo": "https://github.com/ryan113cpu/PixelOS-WebOS-2", "demo": "https://ryan113cpu.github.io/PixelOS-WebOS-2/"}, {"ship_num": 2, "ts": "2026-09-23T01:10:10Z", "hours": 2.0, "multiplier": 5.23, "payout": 8, "blessing": "neutral", "text": "Whats up My guys so this hopefully earns me more stardust than last time(i got 4) and this time i genuinly think i did way better than before overall i really hope you guys like this project I spent alot oftime which i dont have cause of homework, cya", "repo": "https://github.com/ryan113cpu/PixelOS-WebOS-2", "demo": "https://ryan113cpu.github.io/PixelOS-WebOS-2/"}, {"ship_num": 3, "ts": "2026-09-18T13:15:54Z", "hours": 4.0, "multiplier": 1.04, "payout": 4, "blessing": "neutral", "text": "OK so this might be it", "repo": "https://github.com/ryan113cpu/PixelOS-WebOS-2", "demo": "https://ryan113cpu.github.io/PixelOS-WebOS-2/"}, {"ship_num": 4, "ts": "2026-09-12T17:17:07Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made PixelOS and its my first work yet And in really Proud of it. And i hope to do better in the futer", "repo": "https://github.com/ryan113cpu/PixelOS-WebOS-2", "demo": "https://ryan113cpu.github.io/PixelOS-WebOS-2/"}]...
|
[{"post_id": 78771, "ts": "202 [{"post_id": 78771, "ts": "2026-10-11T15:35:28Z", "hours": 0.4064, "text": "YOOOOO Sup guys so i tried to make it mac-y again but my old backgoudn wasnt working properly so i made this new feature so that when you move your cursor this firework thing follows you"}, {"post_id": 74591, "ts": "2026-09-27T18:14:05Z", "hours": 0.2833, "text": "Working on making my project feel mac-y like before just for this guy :D"}, {"post_id": 74577, "ts": "2026-09-27T17:37:04Z", "hours": 0.5356, "text": "just to clarify cause a few fo you guys keep on telling me to seperate my code im not doing it because then its harders for you guys to imediatly try the project when i ship it"}, {"post_id": 73930, "ts": "2026-09-26T10:52:52Z", "hours": 0.3739, "text": "yoo whatsup guys, today i worked on new UI!!! moving forward tomaking this project unquie with costum features and something only ive done"}, {"post_id": 72967, "ts": "2026-09-24T04:02:23Z", "hours": 1.45, "text": "What is good every body, yesterday i did my second ship and honeslyty it di way better than my first its still bad but better tho:D Today after the long grind i inally get to show what ive been doing on the long grind YOU guys told me to add a web so i hopped on and imediedly started working on that after my dad gave me the idea of a terminal so i worked on hat then i Added some QOL features and Lowki i forgot to update my Readme last ship LOl maybe that why i only got like 8 stardust heh"}, {"post_id": 72467, "ts": "2026-09-23T01:03:43Z", "hours": 0.9903, "text": "devlog#6 Alright guys Since no one gave me Ideas😢 i asked my friend at school so i lowki made a galaxy theme type more will be coming"}, {"post_id": 71384, "ts": "2026-09-20T18:38:42Z", "hours": 0.5883, "text": "Since you guys didnt like my old project im asking for ideas to make it make and unique"}, {"post_id": 69970, "ts": "2026-09-18T04:33:33Z", "hours": 0.2692, "text": "Lets hope this is my final devlog i faced many hardships during my project for webOS 2 i hope this is the end but if not cya next time"}, {"post_id": 69839, "ts": "2026-09-17T21:42:21Z", "hours": 0.7203, "text": "Ok so i realized my thingy maginy was really buggy cause of the emoji so i had to remove them 😭😭😭😭😭😭"}, {"post_id": 68276, "ts": "2026-09-14T20:36:30Z", "hours": 0.3106, "text": "Make the Sound On/Off Toggle actully turn Audio Off and On (just implemented audio so before did put any code to the sound toggle)"}, {"post_id": 67824, "ts": "2026-09-14T02:34:28Z", "hours": 0.3303, "text": "Made the audio work!!!!!!!!"}, {"post_id": 67629, "ts": "2026-09-13T19:37:23Z", "hours": 1.9992, "text": "Added new Settings feature, Added new Music feature, Added new Files feature"}, {"post_id": 66721, "ts": "2026-09-12T16:44:32Z", "hours": 0.3178, "text": "I worked on my Theme Lab and fixed the wallpaper selector so the different wallpaper options actually change the desktop background. I also tested the feature and updated my GitHub project with the fix."}]...
|
Title: WebOS 1 and 2 by @Parrot | Stardance
Devlo Title: WebOS 1 and 2 by @Parrot | Stardance
Devlogs:
I worked on my Theme Lab and fixed the wallpaper selector so the different wallpaper options actually change the desktop background. I also tested the feature and updated my GitHub project with the fix.
Added new Settings feature, Added new Music feature, Added new Files feature
Made the audio work!!!!!!!!
Make the Sound On/Off Toggle actully turn Audio Off and On (just implemented audio so before did put any code to the sound toggle)
Ok so i realized my thingy maginy was really buggy cause of the emoji so i had to remove them 😭😭😭😭😭😭
Lets hope this is my final devlog i faced many hardships during my project for webOS 2 i hope this is the end but if not cya next time
Since you guys didnt like my old project im asking for ideas to make it make and unique
devlog#6 Alright guys Since no one gave me Ideas😢 i asked my friend at school so i lowki made a galaxy theme type more will be coming
What is good every body, yesterday i did my second ship and honeslyty it di way better than my first its still bad but better tho:D Today after the long grind i inally get to show what ive been doing on the long grind YOU guys told me to add a web so i hopped on and imediedly started working on that after my dad gave me the idea of a terminal so i worked on hat then i Added some QOL features and Lowki i forgot to update my Readme last ship LOl maybe that why i only got like 8 stardust heh
yoo whatsup guys, today i worked on new UI!!! moving forward tomaking this project unquie with costum features and something only ive done
just to clarify cause a few fo you guys keep on telling me to seperate my code im not doing it because then its harders for you guys to imediatly try the project when i ship it
Working on making my project feel mac-y like before just for this guy :D
YOOOOO Sup guys so i tried to make it mac-y again but my old backgoudn wasnt working properly so i made this new feature so that when you move your cursor this firework thing follows you
Ships:
I made PixelOS and its my first work yet And in really Proud of it. And i hope to do better in the futer
OK so this might be it
Whats up My guys so this hopefully earns me more stardust than last time(i got 4) and this time i genuinly think i did way better than before overall i really hope you guys like this project I spent alot oftime which i dont have cause of homework, cya
Ok guys this time i fully cleaned up my code and added new features to PixelOS ive add a Web, TErminal, and a test bar above I hope this time i get more than 8 Stardust:D also PLs vote Good for me pls pls ive spent 8 hours of my life for 12 stardust in totel and ive only spend like 3 hours on other project and got 60 stardust plessssssssss trust this is not begging for those of you who still have ideas for me can comment down below...
|
1792084968.9366322
|
1792948968.9366322
|
|
65098
|
Mining Mod by @aayushbashyal92 | Stardance
|
aayushbashyal92
|
1
|
12.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T11:29:45Z", "hours": 12.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I have made a Minecraft mod in which there are various new items added like Ruby and Sapphire . We have there respective Armors too and all the tools of Ruby. And of Sapphire there is a extreme tool named Sapphire Extreme which is very powerful and have the ability of all the tools like sword, pickaxe, axe, shovel, hoe, and a little feature of trident too that lets the player move through water or rain. people and find the ruby and sapphire ores in the world and mine them like we mine iron ores and diamond ores and it gives Ruby and Sapphire and we can make various tools of them. and the armor of the ruby and sapphire have the special features like when we wear helmet of ruby it gives infinite night vision that helps us easy mining and the sapphire helmet gives us regeneration", "repo": "https://github.com/Aayush-Bashyal/Mining_Mod", "demo": "https://www.curseforge.com/minecraft/mc-mods/miners-adventure"}]...
|
[{"post_id": 72683, "ts": "202 [{"post_id": 72683, "ts": "2026-09-23T14:33:12Z", "hours": 12.2453, "text": "Today i am working on the this Mod where I have created a ruby item and sapphire items with their armor and tools and you can preview the mod by visiting the link https://www.curseforge.com/minecraft/mc-mods/miners-adventure"}]...
|
Title: Mining Mod by @aayushbashyal92 | Stardance
Title: Mining Mod by @aayushbashyal92 | Stardance
Devlogs:
Today i am working on the this Mod where I have created a ruby item and sapphire items with their armor and tools and you can preview the mod by visiting the link https://www.curseforge.com/minecraft/mc-mods/miners-adventure
Ships:
I have made a Minecraft mod in which there are various new items added like Ruby and Sapphire . We have there respective Armors too and all the tools of Ruby. And of Sapphire there is a extreme tool named Sapphire Extreme which is very powerful and have the ability of all the tools like sword, pickaxe, axe, shovel, hoe, and a little feature of trident too that lets the player move through water or rain. people and find the ruby and sapphire ores in the world and mine them like we mine iron ores and diamond ores and it gives Ruby and Sapphire and we can make various tools of them. and the armor of the ruby and sapphire have the special features like when we wear helmet of ruby it gives infinite night vision that helps us easy mining and the sapphire helmet gives us regeneration...
|
1792814200.355613
|
1792900600.355613
|
|
16838
|
AlpineOS by @ashish-raj-singh | Stardance
|
ashish-raj-singh
|
2
|
23.0
|
72
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T08:32:33Z", "hours": 11.0, "multiplier": 6.36, "payout": 72, "blessing": "neutral", "text": "This is AlpineOS 2 (WebOS-2) upgraded from the previous version of AlpineOS 1 (WebOS-2) UPss Window animations are now smoother and more responsive. Introduced Widgets and are draggable anywhere on the desktop screen Truly FullScreen mode is here, previously the fullscreen was still not using the space behind the dock and menu bar at top, now it does Menu Bar improvements, now it has calender, wifi and a brightness slider which actually workd A new Settings app, which now has the personalization settings, and a new Widgets section where you can add widgets to your desktop Auto hide dock is now working, it simply hides the dock and shows on hovering th bottom of the desktop and it can be toggled in the settings app The Challenge? The main hurdle for me was understanding the actual OS, and its working as i hve tried to keep this project as realistic as i could understand other then that, the animations and drag and drop functionality was a bit challenging, so right now drag and drop us not supported as i have my exams coming up ans stardance is also going to end 30 sep to i dont have that much time The Excitement? this project was particularly exiting for me not because of the web technologies like used react heavily i have been a web dev for like a year main thing was the OS part, i have never worked on an OS before and this was a new experience for me, and i really loved it i tried to understand the real Operating System i leanred about scheduling algorithms like FCFS, SJF, memory management,how kernel works and communicated, how things are separated and modularized so much more What can you do? just right click on desktop and try to add a widget try to hide dock from the settings app, and hover at the bottom of the desktop and see the dock appear back try to minimize and maximize the windows and see the animations try increasing and decreasing the brightness from the menu bar", "repo": "https://github.com/ashish757/AlpineOS", "demo": "https://alpine-os-eight.vercel.app"}, {"ship_num": 2, "ts": "2026-06-13T12:16:11Z", "hours": 12.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built AlpineOS, A fully functional, persistent, browser-based operating system, not just a CSS UI mockup it’s powered by a custom Redux “kernel” that actually manages background processes independently from the visual windows. live Activity Manager that tracks active PIDs and simulated CPU/Memory telemetry. It includes a persistent Virtual File System An draggable Window Manager Terminal engine that interacts with the File System Persistency , File and folders are persistennt and so it the state of the OS, you leave and come back just find that it has retained the state. The Challange? The architecture and state management were incredibly complex. Synchonizing the UI with the actual process mangement in the “kernal” Persistence, making the whole website persistence. Creatin an Task manager was fun and exciting, it felt like a real low level OS feature Excitement??? hell yeah my whole time I have been building, high-level websites and backend. I never tried a low level project, although this is not Low Level but it forced me to explore the architecture and concepts of hoow operating system works at Low level, how terminal connect with the file system. who doesn’t get excited by low level ?? Being able to selec multiple files and folder, not dragable yet, but soon will be What can i do? When you boot it up, don’t just click the icons and look and design and colors, stress test the ARCHITECTURE! Open the Terminal , use cd to change directory and try standard commands like mkdir, touch, ls, and interact with the file system Open the Activity Manager side-by-side with other apps to watch the active processes update and check the live charts (dummy) Right-click the desktop to open Personalization and change the wallpaper. Most importantly: Open a few windows, move them around the screen, and then hard refresh your browser or maybe just restart and Watch the persistence engine drop you right back where you left off.", "repo": "https://github.com/ashish757/AlpineOS", "demo": "https://alpine-os-eight.vercel.app"}]...
|
[{"post_id": 73046, "ts": "202 [{"post_id": 73046, "ts": "2026-09-24T08:31:29Z", "hours": 2.3342, "text": "Devlog 3 Launchpad as promised i have created the launchpad , but the serach functionlity is not working in it sorry i know its just s amll filter thing but i got my exmas this week, im in rush need to feactor the whole assets thing as i wasn initially importing the images but now i have moved it to the public and how just load them all updated the readme and added icon for the launchpad A lot can be done i think, but i am limited with this event ending 30 sep and also my exams are coming up SO BYE FOR NOWW, i really loved this project"}, {"post_id": 72817, "ts": "2026-09-23T19:47:31Z", "hours": 3.2872, "text": "Real OS true now this feels like a real operating system Widgets added widgets to the desktop, can be added from the settings right there are jsut widgets for clock and calander but same design can be used to simply add many more kinds of widgets Menu Bar menu bar now has the brightnes control slider and wifi options (obviously wifi are fake here) Dock can now be auto hidden from settings and only shows up when you hover in the bottom jsut like real macos Integrated the perosnalization in the settings app up next i will add a launch pad, some more little apps, fix a issue related to navigation in finder that i just found out"}, {"post_id": 71881, "ts": "2026-09-21T18:06:25Z", "hours": 1.4678, "text": "Devlog 2 i think i have laid a good foundation for process and window management i am now focusing on the UI and UX of the desktop environment and adding some more app, fetures, and more OS like fell Minimizing and maximizing windows implemented feature to minimize and maxiimize the windows maximizing feature existed but there were some bugs and it wasnt really fullscreen so i fixed that and now it works as expected improve Dock to open or focus the app by detecting wheter app is open or closed or minimized Started improving and adding animations used framer-motion to animate the appearance and disappearance of the windows later i will add transitions to other elements as well Created a settings app to handle the widgets , appearance and general setting all i one place also fixed an infinite render issue in ActivityManagerApp that was caused by the useEffect"}, {"post_id": 70213, "ts": "2026-09-18T18:31:33Z", "hours": 4.1772, "text": "Devlog 1 (after shipping webos1) so its been like 2 months since i last worked on this project so i just revised the whole codebase once Realism so when i decided to build this my main goal was to make it as realistic as possible by realistic i mean to make use of concepts that is used in real linux OS, not just UI but the actual inner workking What went down any application when opened in OS has two parts The window The process Like for notepad app, there is a wrapper window which has the close button and menu options and then there is the actual notepad process which handles things related to the creation and saving of the notes file what was the problem In real OS whenever we try to close a window, the window wrapper simply sends a closing signal to the actual process saying hey process user wants to close you for now. after this the process either saves logs, current changes or show user a confirmation dialog before closing but in my webOS i was jsut closign the process when user clicked the close button on the window wrapper, which is not realistic at all There are three kinds of closing signals that a process can receive SIGTERM SIGKILL SIGQUIT i will not get into the details of these signals but they mean different things , like SIGTERM is a request to terminate the process whereas SIGKILL forces the process to terminate. Solution so i basically added a new property to the window state to track if a window has requested to close the process process actively listen to such state change from the window and replies accordingly and closes the app performs tasks like askeing user to save changes, show warning dialog etc before closing the process there are still some bugs and a lot of things to improve in this thing but i will do that in the next devlog"}, {"post_id": 8020, "ts": "2026-06-13T11:46:24Z", "hours": 3.6642, "text": "#update number 0.0000033 The old man, Terminal Now terminal supports file system operations, can create and delete folders and files Textpad now it can open text files and edit those and save, can create new files as well Activity Manger , task manager Shows the currently running processes in the os, also gives and option to forcefully terminate any process, shows CPU and RAM usage (dummy but mindful of currently running processes) Menu bar menu bar now has specific and dynamic context menu options for each app although its not available yet for each app, but the logic is implemented, I just need to write json config for the ui to display Personalization Right click on desktop and click on Personalization to change wallpaper, will support more customization soon Boot added a cool mock up to mimic shutdown and booting process of OS,"}, {"post_id": 7578, "ts": "2026-06-12T17:50:11Z", "hours": 3.2947, "text": "DevLOG FOURRR What do we got this time well well I now have a complete basic file management system build, I can create text files, edit them, open them, save them in any specific location , delete it, terminal now can run more commands ‘’‘ls, mkdir, rm. touch, echo, clear, etc’’’’ context menus It was time taking and exhausting as every section of the operating system required different type of context menus. It was so much messed up. I ended up creating something central where a single config can decide and make a whole context menu, Desktop is ALIVE Long awaited something I wanted to do is to display what there is in the desktop directory directly onto the desktop after making the complete file system."}, {"post_id": 7422, "ts": "2026-06-12T11:20:38Z", "hours": 0.8694, "text": "Dev Log Threeeee Added a browser as of now only a few websites are accessible like wikipedia.org, other websites reject the connection in a iframe, I am looking for solution to this, I was thinking to maybe compile a rust model web browser using ecmascript and run a browser in browser, looks tough for limited time I have for this project , will definitely give it a shot ( if you guys got any idea let me know ) yayyyy File system is now persistent well despite coolest feature this was fairly easy redux-persistence saved the day, used indexDB as localstorage is synchronous and only allows 5MB of storage -> the files created in desktop folder now show up on the desktop on top of wallpaper NEXT GOAL add some more commands in terminal like ls, touch, mkdir, rm ability to create and save text files make files and folders drag-able (DREAMYYYY) personlization options"}, {"post_id": 7393, "ts": "2026-06-12T10:04:18Z", "hours": 0.6861, "text": "Dev Log 2 Implemented resizing and maximizing of windows (easypzy lemon squeeze) Added some dummy options in the menu bar (will soon make them functional too 😉) Improved UI of file manager (Finder)"}, {"post_id": 7245, "ts": "2026-06-12T02:47:35Z", "hours": 3.4803, "text": "AlpineOS, lightweight web os for study and space research(will be coming soon) The name inspiration come from the alpine images of docker “light weight” I am trying to build is os such that user can sort of study about space. as of now I have build some basic file system, dragable windows, I have setup basic architecture for applications, processes, and files and folders hope fully in my next DEVlog, I will have implemented /fixed resizable windows control panel file and folder persistence some cool apps on space theme preventing windows from going out of screen, will try to make terminal somewhat working improve the UI ability to minimize the windows drag and drop upload of files like text, pdf, word excel etc,"}]...
|
Title: AlpineOS by @ashish-raj-singh | Stardance
Title: AlpineOS by @ashish-raj-singh | Stardance
Devlogs:
AlpineOS, lightweight web os for study and space research(will be coming soon) The name inspiration come from the alpine images of docker “light weight” I am trying to build is os such that user can sort of study about space. as of now I have build some basic file system, dragable windows, I have setup basic architecture for applications, processes, and files and folders hope fully in my next DEVlog, I will have implemented /fixed resizable windows control panel file and folder persistence some cool apps on space theme preventing windows from going out of screen, will try to make terminal somewhat working improve the UI ability to minimize the windows drag and drop upload of files like text, pdf, word excel etc,
Dev Log 2 Implemented resizing and maximizing of windows (easypzy lemon squeeze) Added some dummy options in the menu bar (will soon make them functional too 😉) Improved UI of file manager (Finder)
Dev Log Threeeee Added a browser as of now only a few websites are accessible like wikipedia.org, other websites reject the connection in a iframe, I am looking for solution to this, I was thinking to maybe compile a rust model web browser using ecmascript and run a browser in browser, looks tough for limited time I have for this project , will definitely give it a shot ( if you guys got any idea let me know ) yayyyy File system is now persistent well despite coolest feature this was fairly easy redux-persistence saved the day, used indexDB as localstorage is synchronous and only allows 5MB of storage -> the files created in desktop folder now show up on the desktop on top of wallpaper NEXT GOAL add some more commands in terminal like ls, touch, mkdir, rm ability to create and save text files make files and folders drag-able (DREAMYYYY) personlization options
DevLOG FOURRR What do we got this time well well I now have a complete basic file management system build, I can create text files, edit them, open them, save them in any specific location , delete it, terminal now can run more commands ‘’‘ls, mkdir, rm. touch, echo, clear, etc’’’’ context menus It was time taking and exhausting as every section of the operating system required different type of context menus. It was so much messed up. I ended up creating something central where a single config can decide and make a whole context menu, Desktop is ALIVE Long awaited something I wanted to do is to display what there is in the desktop directory directly onto the desktop after making the complete file system.
#update number 0.0000033 The old man, Terminal Now terminal supports file system operations, can create and delete folders and files Textpad now it can open text files and edit those and save, can create new files as well Activity Manger , task manager Shows the currently running processes in the os, also gives and option to forcefully terminate any process, shows CPU and RAM usage (dummy but mindful of currently running processes) Menu bar menu bar now has specific and dynamic context menu options for each app although its not available yet for each app, but the logic is implemented, I just need to write json config for the ui to display Personalization Right click on desktop and click on Personalization to change wallpaper, will support more customization soon Boot added a cool mock up to mimic shutdown and booting process of OS,
Devlog 1 (after shipping webos1) so its been like 2 months since i last worked on this project so i just revised the whole codebase once Realism so when i decided to build this my main goal was to make it as realistic as possible by realistic i mean to make use of concepts that is used in real linux OS, not just UI but the actual inner workking What went down any application when opened in OS has two parts The window The process Like for notepad app, there is a wrapper window which has the close button and menu options and then there is the actual notepad process which handles things related to the creation and saving of the notes file what was the problem In real OS whenever we try to close a window, the window wrapper simply sends a closing signal to the actual process saying hey process user wants to close you for now. after this the process either saves logs, current changes or show user a confirmation dialog before closing but in my webOS i was jsut closign the process when user clicked the close button on the window wrapper, which is not realistic at all There are three kinds of closing signals that a process can receive SIGTERM SIGKILL SIGQUIT i will not get into the details of these signals but they mean different things , like SIGTERM is a request to terminate the process whereas SIGKILL forces the process to terminate. Solution so i basically added a new property to the window state to track if a window has requested to close the process process actively listen to such state change from the window and replies accordingly and closes the app performs tasks like askeing user to save changes, show warning dialog etc before closing the process there are still some bugs and a lot of things to improve in this thing but i will do that in the next devlog
Devlog 2 i think i have laid a good foundation for process and window management i am now focusing on the UI and UX of the desktop environment and adding some more app, fetures, and more OS like fell Minimizing and maximizing windows implemented feature to minimize and maxiimize the windows maximizing feature existed but there were some bugs and it wasnt really fullscreen so i fixed that and now it works as expected improve Dock to open or focus the app by detecting wheter app is open or closed or minimized Started improving and adding animations used framer-motion to animate the appearance and disappearance of the windows later i will add transitions to other elements as well Created a settings app to handle the widgets , appearance and general setting all i one place also fixed an infinite render issue in ActivityManagerApp that was caused by the useEffect
Real OS true now this feels like a real operating system Widgets added widgets to the desktop, can be added from the settings right there are jsut widgets for clock and calander but same design can be used to simply add many more kinds of widgets Menu Bar menu bar now has the brightnes control slider and wifi options (obviously wifi are fake here) Dock can now be auto hidden from settings and only shows up when you hover in the bottom jsut like real macos Integrated the perosnalization in the settings app up next i will add a launch pad, some more little apps, fix a issue related to navigation in finder that i just found out
Devlog 3 Launchpad as promised i have created the launchpad , but the serach functionlity is not working in it sorry i know its just s amll filter thing but i got my exmas this week, im in rush need to feactor the whole assets thing as i wasn initially importing the images but now i have moved it to the public and how just load them all updated the readme and added icon for the launchpad A lot can be done i think, but i am limited with this event ending 30 sep and also my exams are coming up SO BYE FOR NOWW, i really loved this project
Ships:
I built AlpineOS, A fully functional, persistent, browser-based operating system, not just a CSS UI mockup it’s powered by a custom Redux “kernel” that actually manages background processes independently from the visual windows. live Activity Manager that tracks active PIDs and simulated CPU/Memory telemetry. It includes a persistent Virtual File System An draggable Window Manager Terminal engine that interacts with the File System Persistency , File and folders are persistennt and so it the state of the OS, you leave and come back just find that it has retained the state. The Challange? The architecture and state management were incredibly complex. Synchonizing the UI with the actual process mangement in the “kernal” Persistence, making the whole website persistence. Creatin an Task manager was fun and exciting, it felt like a real low level OS feature Excitement??? hell yeah my whole time I have been building, high-level websites and backend. I never tried a low level project, although this is not Low Level but it forced me to explore the architecture and concepts of hoow operating system works at Low level, how terminal connect with the file system. who doesn’t get excited by low level ?? Being able to selec multiple files and folder, not dragable yet, but soon will be What can i do? When you boot it up, don’t just click the icons and look and design and colors, stress test the ARCHITECTURE! Open the Terminal , use cd to change directory and try standard commands like mkdir, touch, ls, and interact with the file system Open the Activity Manager side-by-side with other apps to watch the active processes update and check the live charts (dummy) Right-click the desktop to open Personalization and change the wallpaper. Most importantly: Open a few windows, move them around the screen, and then hard refresh your browser or maybe just restart and Watch the persistence engine drop you right back where you left off.
This is AlpineOS 2 (WebOS-2) upgraded from the previous version of AlpineOS 1 (WebOS-2) UPss Window animations are now smoother and more responsive. Introduced Widgets and are draggable anywhere on the desktop screen Truly FullScreen mode is here, previously the fullscreen was still not using the space behind the dock and menu bar at top, now it does Menu Bar improvements, now it has calender, wifi and a brightness slider which actually workd A new Settings app, which now has the personalization settings, and a new Widgets section where you can add widgets to your desktop Auto hide dock is now working, it simply hides the dock and shows on hovering th bottom of the desktop and it can be toggled in the settings app The Challenge? The main hurdle for me was understanding the actual OS, and its working as i hve tried to keep this project as realistic as i could understand other then that, the animations and drag and drop functionality was a bit challenging, so right now drag and drop us not supported as i have my exams coming up ans stardance is also going to end 30 sep to i dont have that much time The Excitement? this project was particularly exiting for me not because of the web technologies like used react heavily i have been a web dev for like a year main thing was the OS part, i have never worked on an OS before and this was a new experience for me, and i really loved it i tried to understand the real Operating System i leanred about scheduling algorithms like FCFS, SJF, memory management,how kernel works and communicated, how things are separated and modularized so much more What can you do? just right click on desktop and try to add a widget try to hide dock from the settings app, and hover at the bottom of the desktop and see the dock appear back try to minimize and maximize the windows and see the animations try increasing and decreasing the brightness from the menu bar...
|
1792828621.1527221
|
1792915021.1527221
|
|
13666
|
My very own WebOS by @starr | Stardance
|
starr
|
1
|
7.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T08:09:55Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I have finally made my first webOS with a welcome window, notes app and stopwatch app. The most challenging part of this project was learning to use JavaScript and trying to code some of the logic myself (and debugging it too!!).", "repo": "https://github.com/userr73/First-WebOS", "demo": "https://userr73.github.io/First-WebOS/"}]...
|
[{"post_id": 73042, "ts": "202 [{"post_id": 73042, "ts": "2026-09-24T08:07:12Z", "hours": 0.4772, "text": "Made some quick updates to the desktop apps so that is is structured into a grid and also changed some content in the welcome and notes window"}, {"post_id": 71708, "ts": "2026-09-21T10:59:57Z", "hours": 0.9417, "text": "Stopwatch App I found a video tutorial for making a stopwatch in JS. The original vid had three separate buttons for START, STOP and RESET, but I changed this so that the START and STOP button are combined together."}, {"post_id": 68034, "ts": "2026-09-14T12:33:41Z", "hours": 1.1922, "text": "idk - Notes app content update + element exceeding window bug?? I updated the HTML so that I can add content through JavaScript so it does not need to be hard coded into the HTML file. I spent of bit of time debugging this as I couldn’t figure out why some of the content I added to the Notes app was disappearing when I clicked it. Turns out there were a few issues like calling the same function twice, but I also realised I added an event listener that ran the wrong function which was why some of the content was disappearing. Also, I did the ‘additional challenges’ in the guide, mainly the 4th point about the bug where windows can exceed the screen width and height. I used a bit of Gemini here to figure out how to get max and min values from a set of numbers (Maths.min and Maths.max) and also used W3Schools to get the window height and width as well as the div element’s own height and width. Using this, I implemented my own logic (with an if statement) to contain the element within the viewport height and width. This took a tiny bit of trial and error coz I kept getting confused on when to use min and when to use max but I got there eventually"}, {"post_id": 65925, "ts": "2026-09-11T11:55:43Z", "hours": 0.9047, "text": "Update JS code file structure + Creating the Notes app functionality I spent some time updating the structure of my js file by reordering some code and also creating functions for any repeated tasks such as initialising windows. I also worked on my Notes app and played around with some border and outline properties to see what combination of styles would make it easier for users to edit in the app. I ended up with going for a left border indicator type of thing (the colours in the screenshot below aren’t final since I haven’t worked on the overall style of my OS yet so I just went with grey and black)"}, {"post_id": 64728, "ts": "2026-09-09T11:13:39Z", "hours": 0.6311, "text": "Working with z-index Continuing with the guide, I’ve added code that ensures that whenever a window clicks, it rises to the top using the z-index property. I did the same for the top bar. Bugs An issue I faced was when I tried to use the function addWindowTapHandling() for my notes screen but I forgot that I defined the notesScreen variable later on in js file so the notes app disappeared from my OS screen for a bit. I also got really stuck on why my top bar wasn’t rising above the windows so I put my js file into Gemini and I realised it was because I had two openWindow() functions and the second one was the old version that did not have the added lines of code."}, {"post_id": 63485, "ts": "2026-09-07T11:20:20Z", "hours": 1.1106, "text": "Adding my second window I have begun working on my second window which will be a notes app. I continued to follow the guide and created an icon for the app and also a new window for it. It’s mostly taken a while to sort out the js file since I got confused with why the window wasn’t popping up at first (I didn’t name the classes and ids for the divs correctly). Here’s the update:"}, {"post_id": 61460, "ts": "2026-09-04T12:05:06Z", "hours": 2.1317, "text": "Setting up the background, top bar, window So far, I have followed the guide and created the background page with a top bar and created my first welcome page window (the content is random right now - I’ll update this later). The window is also draggable at the handle. I’m still working on what kind of style I want to aim for in my OS… Also, this is kinda my first devlog because I thought my devlogs were broken (turns out I just couldn’t figure out how to use this 💀)"}]...
|
Title: My very own WebOS by @starr | Stardance
De Title: My very own WebOS by @starr | Stardance
Devlogs:
Setting up the background, top bar, window So far, I have followed the guide and created the background page with a top bar and created my first welcome page window (the content is random right now - I’ll update this later). The window is also draggable at the handle. I’m still working on what kind of style I want to aim for in my OS… Also, this is kinda my first devlog because I thought my devlogs were broken (turns out I just couldn’t figure out how to use this 💀)
Adding my second window I have begun working on my second window which will be a notes app. I continued to follow the guide and created an icon for the app and also a new window for it. It’s mostly taken a while to sort out the js file since I got confused with why the window wasn’t popping up at first (I didn’t name the classes and ids for the divs correctly). Here’s the update:
Working with z-index Continuing with the guide, I’ve added code that ensures that whenever a window clicks, it rises to the top using the z-index property. I did the same for the top bar. Bugs An issue I faced was when I tried to use the function addWindowTapHandling() for my notes screen but I forgot that I defined the notesScreen variable later on in js file so the notes app disappeared from my OS screen for a bit. I also got really stuck on why my top bar wasn’t rising above the windows so I put my js file into Gemini and I realised it was because I had two openWindow() functions and the second one was the old version that did not have the added lines of code.
Update JS code file structure + Creating the Notes app functionality I spent some time updating the structure of my js file by reordering some code and also creating functions for any repeated tasks such as initialising windows. I also worked on my Notes app and played around with some border and outline properties to see what combination of styles would make it easier for users to edit in the app. I ended up with going for a left border indicator type of thing (the colours in the screenshot below aren’t final since I haven’t worked on the overall style of my OS yet so I just went with grey and black)
idk - Notes app content update + element exceeding window bug?? I updated the HTML so that I can add content through JavaScript so it does not need to be hard coded into the HTML file. I spent of bit of time debugging this as I couldn’t figure out why some of the content I added to the Notes app was disappearing when I clicked it. Turns out there were a few issues like calling the same function twice, but I also realised I added an event listener that ran the wrong function which was why some of the content was disappearing. Also, I did the ‘additional challenges’ in the guide, mainly the 4th point about the bug where windows can exceed the screen width and height. I used a bit of Gemini here to figure out how to get max and min values from a set of numbers (Maths.min and Maths.max) and also used W3Schools to get the window height and width as well as the div element’s own height and width. Using this, I implemented my own logic (with an if statement) to contain the element within the viewport height and width. This took a tiny bit of trial and error coz I kept getting confused on when to use min and when to use max but I got there eventually
Stopwatch App I found a video tutorial for making a stopwatch in JS. The original vid had three separate buttons for START, STOP and RESET, but I changed this so that the START and STOP button are combined together.
Made some quick updates to the desktop apps so that is is structured into a grid and also changed some content in the welcome and notes window
Ships:
I have finally made my first webOS with a welcome window, notes app and stopwatch app. The most challenging part of this project was learning to use JavaScript and trying to code some of the logic myself (and debugging it too!!)....
|
1792853572.4664989
|
1792939972.4664989
|
|
55343
|
Refracted by @mayoinasu | Stardance
|
mayoinasu
|
1
|
27.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T07:58:04Z", "hours": 27.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is my first puzzle game named Refracted! This is also the first time I have made a game with sprites created by my friend, so I get really excited and want to make it perfect. The hardest challenge when making this game is basically the box. TBH, at first I wanted to make the box able to rotate in 8 directions, while the tutorials that I found on YouTube only do 4 directions. At first, I thought I could change it easily, but it turns out impossible to do. I have to admit that for doing the box thing, I have to ask Claude AI to help me make it into 8 directions, and after I changed a lot of it, it still hasn’t worked. I finally gave up on making it 8 directions, which makes it harder for me to design the level. Another things that hard for me is making the hint. I’m actually having some story in my head about the lore, but when I made it into a hint, it just got blurred. Also, to make the player have to open all the hints in the corridor before doing the next level, I have to make a lot of conditionals, which I know. I think there are better options for doing this, but I’m still a beginner. I’m still using conditionals too much, but I finally made everything work! Also, by adding the BGM, sound effects, making the checkpoints thing, etc. There are many things that I just tried in this game! If you want to play this game, all you need to do is rotate the boxes to refract the light into another box until it reaches the sensor. But, you also need to do it fast! because there’s a hunger bar. Since our character is a human, she needs food to keep going. So, rotate the box, eat, and find the hint about what’s going on!", "repo": "https://github.com/mayoinasu/refracted", "demo": "https://mayoinasu.itch.io/refracted"}]...
|
[{"post_id": 73020, "ts": "202 [{"post_id": 73020, "ts": "2026-09-24T07:11:46Z", "hours": 2.8347, "text": "I’m finally able to make the fading and checkpoint! So, after player’s hungerbar is empty, the screen will faded and player will be revived on their last checkpoint!"}, {"post_id": 71228, "ts": "2026-09-20T14:18:13Z", "hours": 2.1244, "text": "So, I just finished making the hunger bar recover after the player eats food in the game. It’s still a bit delayed, but I hope I can fix it. At least, it works."}, {"post_id": 66638, "ts": "2026-09-12T14:22:26Z", "hours": 1.6164, "text": "I’m adding a hunger bar that decreases over time and also affects the player’s speed. Not only that, but I’m also fixing some of the bugs that appear (failing to change scenes). But for now, it works! I’ll add the audio after this, hoping that it will work well!"}, {"post_id": 61632, "ts": "2026-09-04T16:56:29Z", "hours": 5.3703, "text": "Atp, I just learned that making a level is hard, especially when your game is heavily focused on puzzles. I also confused with how I can make variety of level with a same mechanic"}, {"post_id": 61399, "ts": "2026-09-04T09:13:03Z", "hours": 3.815, "text": "I just realized my typo in this project: “censor” was supposed to be “sensor”, but at least I’m consistent, so it works nicely. 2. I’m finished making the first corridor! So, in my game, each level will be separated by a corridor, which will give a bit of a hint about the mystery. And I still have 4 other corridors to make!"}, {"post_id": 61240, "ts": "2026-09-04T02:28:41Z", "hours": 3.755, "text": "I’m finished making a censor in my game, so after the light is detected by the censor, it will open the door"}, {"post_id": 60819, "ts": "2026-09-03T13:21:38Z", "hours": 7.6197, "text": "For the main focus of my game (puzzle), I am finally able to create this mechanic! So you have to rotate the box to control the light"}]...
|
Title: Refracted by @mayoinasu | Stardance
Devlog Title: Refracted by @mayoinasu | Stardance
Devlogs:
For the main focus of my game (puzzle), I am finally able to create this mechanic! So you have to rotate the box to control the light
I’m finished making a censor in my game, so after the light is detected by the censor, it will open the door
I just realized my typo in this project: “censor” was supposed to be “sensor”, but at least I’m consistent, so it works nicely. 2. I’m finished making the first corridor! So, in my game, each level will be separated by a corridor, which will give a bit of a hint about the mystery. And I still have 4 other corridors to make!
Atp, I just learned that making a level is hard, especially when your game is heavily focused on puzzles. I also confused with how I can make variety of level with a same mechanic
I’m adding a hunger bar that decreases over time and also affects the player’s speed. Not only that, but I’m also fixing some of the bugs that appear (failing to change scenes). But for now, it works! I’ll add the audio after this, hoping that it will work well!
So, I just finished making the hunger bar recover after the player eats food in the game. It’s still a bit delayed, but I hope I can fix it. At least, it works.
I’m finally able to make the fading and checkpoint! So, after player’s hungerbar is empty, the screen will faded and player will be revived on their last checkpoint!
Ships:
This is my first puzzle game named Refracted! This is also the first time I have made a game with sprites created by my friend, so I get really excited and want to make it perfect. The hardest challenge when making this game is basically the box. TBH, at first I wanted to make the box able to rotate in 8 directions, while the tutorials that I found on YouTube only do 4 directions. At first, I thought I could change it easily, but it turns out impossible to do. I have to admit that for doing the box thing, I have to ask Claude AI to help me make it into 8 directions, and after I changed a lot of it, it still hasn’t worked. I finally gave up on making it 8 directions, which makes it harder for me to design the level. Another things that hard for me is making the hint. I’m actually having some story in my head about the lore, but when I made it into a hint, it just got blurred. Also, to make the player have to open all the hints in the corridor before doing the next level, I have to make a lot of conditionals, which I know. I think there are better options for doing this, but I’m still a beginner. I’m still using conditionals too much, but I finally made everything work! Also, by adding the BGM, sound effects, making the checkpoints thing, etc. There are many things that I just tried in this game! If you want to play this game, all you need to do is rotate the boxes to refract the light into another box until it reaches the sensor. But, you also need to do it fast! because there’s a hunger bar. Since our character is a human, she needs food to keep going. So, rotate the box, eat, and find the hint about what’s going on!...
|
1792853292.2606816
|
1792939692.2606816
|
|
29956
|
Barrel Roll Bullet by @ShinyMist | Stardance
|
ShinyMist
|
1
|
118.0
|
2120
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T07:55:16Z", "hours": 118.0, "multiplier": 17.91, "payout": 2120, "blessing": "neutral", "text": "Barrel Roll Bullet A recoil-based platformer where, instead of traditional jumping and movement, you shoot to propel yourself around each level. My game includes multiple abilities, unlockable gun skins and 50 levels. The biggest challenge I faced was developing an accurate and efficient collision system. Initially, I planned to use AABB collision, but because it relies on rectangular bounding boxes, I found that the gun barrel could appear to float when rotating or interacting with objects. I then experimented with mask collision to achieve pixel-perfect accuracy. However, using a large number of masks throughout a level caused noticeable drops in performance. I eventually settled on a middle ground using SAT (Separating Axis Theorem) polygon-based collision. This provided much more accurate collision detection for the rotating gun while being significantly more performant than mask collision, allowing me to maintain both responsive gameplay and consistent performance. I am proud of the persistence I have demonstrated throughout the project. During the early stages of development, I encountered significant gaps in my knowledge, particularly as I was new to object-oriented programming. At times, I struggled with seemingly simple tasks, such as correctly initialising a game window or positioning a rectangle where I intended it to be. Despite these difficulties, I continued to learn, troubleshoot and refine my approach rather than abandoning features when they became challenging.", "repo": "https://github.com/Oliver-Attoe/StarDanceProject_FLStudioGrind", "demo": "https://github.com/Oliver-Attoe/StarDanceProject_FLStudioGrind/releases/tag/v1.0.0"}]...
|
[{"post_id": 73026, "ts": "202 [{"post_id": 73026, "ts": "2026-09-24T07:21:08Z", "hours": 0.5231, "text": "Dev Log #39 . THE FINAL DEV LOG . I am finally ready to ship!!! . I did the following: Made a working read me Made a working exe file of my game Removed de-bugging features so game works as intended. Stopped music overlap from happening Removed all copyrighted music (may have mentioned this previously) I used pyinstaller tocreate my exe file. . Level buttons now only work if player max player level is less than or equal to the level you are selecting. . Stopped music overlap by puting stop music into every game state + in load room function . Its been a pleasure to take part in the stardance event. Lets have a look to see how far this project has come!!!"}, {"post_id": 71415, "ts": "2026-09-20T19:44:37Z", "hours": 2.6217, "text": "Dev Log #38 . DONE . I did the following: Added music that plays while in level Removed copyrighted music Finished all GUI Made code neat using ruff Will ship at some point soon. See you on ship day!!!!"}, {"post_id": 71257, "ts": "2026-09-20T15:13:48Z", "hours": 4.6078, "text": "Dev Log #37 . All code is 100% complete now, the only thing left to do is finish all of the UI and then I am ready to ship. . Today I: Fixed portals Added level skip button Displayed bonus objectives Made button rotation work when pressed also Made gun select display gun images Portal code issue was caused by object overlapping with tiles, cause tile collision resolution to push the player out of the tile, and at times out of the map. Fixed this by teleporting player slightly above the object (above being determined by orientation). . Level skip increases player level, restarts level and spawns player in next level. . Bonus objectives screen.blitted on win, text appears green when objective met, red when it hasn’t . Used updated rotated button rect rather then previous and changed screen.blit to use center of rect rather than topleft . For each button in gun group, i screen.blited that gun into the center of the select gun skin rect . Thats all, hope to ship by tonight."}, {"post_id": 69536, "ts": "2026-09-17T07:47:24Z", "hours": 5.2261, "text": "Dev Log #36 . I have done most of the updating of UI, having only a few assests left and one level left to edit. . In addition to this, I have also made it so that buttons now appear pressed when pressed, rather than disappearing. . My easter egg room also stops the music correctly on level complete. . The final objectives are as follows: Have gun select each have image of gun Waiver has displayed text Hint video made and linked correctly All button can only be pressed when on screen Finish misc Assets Add death, win, and coins/stars collected based on mission objectives complete Thats all, I think 20/09/2026 could still be the date for the books, but I’ve got to put the burners on to get this finsished to a level of polish I’m happy with."}, {"post_id": 66573, "ts": "2026-09-12T12:32:48Z", "hours": 1.6919, "text": "Dev Log #35 . Been a bit distracted from this project due to school starting but I’ve been able to get a few things done. . I have done the following: Finished dialogue texts Made it so that dialogue box only appears when there is text Given kill tiles rotatable counterparts Added muzzle flash Added ability pick up sounds Updated a few more assets My Git commits have started to get a bit sloppy as i do these little bits on during my free periods, but im getting back into the swing of things . The dialogue box will only appear if text != “” and will put the player in the start playing state, without requiring a mouse click like it did previously. . Adding sounds was pretty simple so I wil leave an example bellow if self.rect.colliderect(ability[\"rect\"]): if self.gravity_flip > 0: up_gravity_fx.play() else: down_gravity_fx.play() ability[\"collected\"] = True self.gravity_flip *= -1 That’s all, I think 20/09/2026 will be a date for the books as I’m confident I will be finished by then. ALSO, if anyone sees this before ship, could you let me know any ideas for what my 16x16 tile for regular tiles could look like? Many thanks if you respond"}, {"post_id": 64309, "ts": "2026-09-08T16:27:15Z", "hours": 5.7308, "text": "Dev Log #34. . Just cleaning some things up now, we are in the home stretch . I did the following: Updated assest Updated object display code fixed broken dialogue Most assets have a fresh new look created in photopea . Buttons can now be loaded at rotated orientations . Dialogue now does display and does not disapear on first level load. This is because the start playing state was being skipped, i fixed this by using a continue, which skipped the rest of the current loop iteration, preventing the start-state code from continuing to run after changing playing_state. . Thats all, most of my time when into design. See you next devlog"}, {"post_id": 57440, "ts": "2026-08-29T16:21:03Z", "hours": 9.3847, "text": "Dev Log #33 . As you can probably guess, I have done alot I have done the following: • Gave all levels the correct level variables • Made buttons work correctly when rotated • Made teleport bullets work as intended • Made gates and broken tiles allow bullets to pass through when collision is removed • Created an EXE file of my game for friends to use for playtesting • Made a stat tracker to use playtest information to improve my game • Corrected all file directories that had to be moved for PyInstaller to work properly • Fixed the Easter egg room so it now loads correctly • Added AI declaration comments That is a lots, so let me quick fire explain how i did them Painful repetition, change variables, restart level, change tiles, reset level, change ability position, reset. Repeat for level in levels (do this 50 times) . This was partially assisted by AI, but from what I understand the buttons’ Tiled rotation number is used to adjust the collision rectangle’s position so it matches the rotated button object in tiled. Collision check works as did previously. . Teleport bullets originally tp the player if a bullet fired priviously hit a way after pickup, despite no bullet being fired after pickup and also sometimes caused the player to shoot downwards through tiles. . I fixed the wrong bullet tp by using a self.variable rather than a global one as previously, allowing each bullet to know if they were teleport enabled, rather than all bullets being teleport enabled. . The tile collision isssue was fixed by by moving the player backwards along the bullet’s path until they are outside the tile, preventing the gun from passing through walls and being pulled down . This one will just explain itself (if tile in list, then ignore kill on contact): for tile in Tiles.tiles: if self.rect.colliderect(tile[\"rect\"]): tile_property = tile[\"property\"].get(\"type\") if tile_property in Tiles.open_gates: continue This used pyinstaller, not something i really code or anything so, I’ll just say i did it sucessfully . Stat tracker records bullet count, time and deaths/restarts that a level took on completion. Difficulty of a level can also be decided by a play tester by pressing any number button during a level. . This data is level specific, and on key press of /, will create a json file that holds all the data, which can then be sent for me for review of things like bullet max, time complete bonus time, ect. . Self explanatory, just changed things like “Image/buttn.png” to “Game/Image/button.png” . Restart all function was required in load room function as it contains map load, so the level map that was supposed to load is not displayed instead of the secret easter egg map. . 9.Should have declared AI usage earlier, but I have been checking my chat history and I have been able to determine what sections of my code are AI generated . That’s all, gotta try and keep my daily streak alive this time to score myself a free plush."}, {"post_id": 54686, "ts": "2026-08-25T19:01:58Z", "hours": 3.5433, "text": "Dev Log #32 . Made 50 levels today, that is all. . Every 3 levels, a new ability/feature is added. This allows the player to get used to the new thing added, making their later appearance managble as the player is now used to how they function. . I have not set the player and goal location co-ordinates for each level, or other variables like if mini stars are required. . That’s all for today."}, {"post_id": 54018, "ts": "2026-08-24T19:16:39Z", "hours": 2.2183, "text": "Dev Log #31 . I AM FINISHED!!! . Well, pretty much at least. . Today I: Completed the Waiver Made some more levels I made it so that the text box works with word wrap, enter key and backspace key. . I did this by splitting the text into words and lines, then checking each word’s width against the rect boundaries. . If the word exceeds the boundaries x, the texts’ x position is reset and the Y-coordinate is incremented, creating a new line. . The Enter key creates a new line by resetting x and incrementing y, while Backspace removes the last character from the text string, preventing it from being displayed. . The waiver now checks if all fields are filled and allows you to press a button that is connected to a hyperlink that will, in the future, take you to a video created my me showing how each level is complete. . Also made 12 levels today, each new feature is slowly implemented one at time. . That’s all for today."}, {"post_id": 53326, "ts": "2026-08-23T20:00:08Z", "hours": 2.7178, "text": "Dev Log #30 . The big 30!!! . Done quite a bit today, just last bit of polishing and then we move towards UI, music, level design, ect. . Today I: FINISHED THE DIALOGUE SYTEM Added a leave waiver button (was a softlock) Added a text box to waiver [WIP] Dialogue system works fully (minus sound but thats still a win in my books). Plays on level start and level completion and once dialogue is viewed by the player, it is not shown to them again. . Mouse can be clicked to remove dialogue from the screen, without triggering bullet fire. . Also fixed the issue of the text backround being displayed on re-entry and re-completion of the level, but fixed that easily with a variable, setting it to true or false if level had already been completed, then only displaying the text bg when it was true. . Waiver leave button pretty simple, basic pygame rect collidepoint detection. . Text box sets text_active to true on mouse click, mouse clicks anywhere else set it to false, meaning player can only type when they have clicked on it (when they want to). . I appened every event.unicode into a list on key press, meaning I had a list of the players key storkes, then screen.blitted each letter in the list. . Final touches are making all fields complete required to acess button that is a hyperlink to video of me completing stages with instuctions to help, and also backspace and enter and wordwrap working with the text_box. . Then I think I’m done for the most part on the coding side of things, and will move onto level creation. . The only thing I haven’t completed from my long list from a preious dev_log are: Level editor Upside down ability James bond level start Hint dialogue on multiple deaths Boss fight Not to say these aren’t going to be added but they are not simple things and will not really add to much to my game in all honesty. Given the deadline of end of this month I have given myself, I don’t know if I will have time to add these (except for the James bond level start thing as that is a UI thing that will require art, music ect so might work on that when not coding. . That’s all, thanks for reading (:"}, {"post_id": 52887, "ts": "2026-08-23T08:25:38Z", "hours": 2.2633, "text": "Dev Log #29 . I’m pretty close to finishing the code side of my game now, the rest of my efforts will soon be focous toward things like: Writing dialogue Making nicer looking UI Making tiles look good rather than coloured blocks Animations Music Today I did the following: Re made the dialogue system AGAIN Created a gun selection screen My dialogue system displays a word at a time and plays a short noise for each word shown, similarily to undertale voice blips. However, I think it sounds quite bad and I plan to replace it with a set dialogue sound that plays at the start, like animal crossing. . My dialogue system now plays on level start and level completion, and does not re-trigger on level repeat, using similar code used in my star tracking code. . Gun select code is similar to my level select code, using a different class but the same code, just changing the lock out code to only unlock once star count is >= button number - 1 * 6, so that each button is unlocked for each 6 stars earned, as well as having the default gun already unlocked. . That’s all for today, I hope to have a complete game by the end of the month so I can have this finished before the school year starts."}, {"post_id": 51905, "ts": "2026-08-21T20:16:23Z", "hours": 2.1786, "text": "Dev Log #28 . Didn’t do alot today, or for the 2 other days… . I finally made ghost bullets work correctly and have changed the dialogue sytem a bit . The ghost bullets working and not working previously was juts a matter of using variables inside the bullet class rather than global ones, making it work better for some reason, I had the assistance of a friend in fixing the issue, and safe to say it solved it . Dialogue sytem has only been changed slightly so not much point documenting the changes, spacing, timing of letters, ect. . Sorry for short devlog, I hope I have more tommorrow."}, {"post_id": 49659, "ts": "2026-08-18T15:26:51Z", "hours": 3.4011, "text": "Dev Log #27 . More things checked of the list today: . Today I did: Added gravity flip ability Added teleport bullets Added player mission objectives However, some other things i worked on today are still a work in progress, such as: Diologue system Ghost bullets (travel through walls) Gravity flip works similarily to how slow time works, settings the variable self.gravity_flip to -1 on contact, then multiplying graivty strenght by it, reversing the direction of gravity . This however made my realign function not work when on the ceiling, so i added to re-align that if gravity_flip was negative, to detect ceiling hit rather than grounded, allowing it to work why gravity was flipped. . Teleport bullets work by setting a can teleport function to True on contact, then when true, if bullet collidesrect with tile, self.rect of bullet is equal to self.rect of gun. the can tele[port function is then set to false, making the ability only work once as intended. . Player mission objects are as follows: Complete level Complete level in set ammount of time Complete level with less bullets than provided This uses lists in a way i have never used them before and looks like this total_stars = 0 level_stars = [[False, False, False] for _ in range(levels)] If player completes level, level_stars[Settings.player_level - 1][0] for current player level is set to True. . If player completes level quickly (complete_time < bonus_time), then …[1] is set to true . If player reaches has_won game state with a number of bullets lower than the bullet max, then then …[2] is set to True. . Total stars is incremented by one for each goal completed, and if level_stars[Settings.player_level - 1][1,2 or 3] is already set to true, then the increment is skipped, meaning you can only get 3 stars per level. . That’s all for now, hope to fix the issues I had today in tomorrows devlog!!"}, {"post_id": 49172, "ts": "2026-08-17T20:15:54Z", "hours": 2.1058, "text": "Dev Log #26 . Popped ULT today!!! . Today I added the following: Slow time ability Breakable surfaces Bullet pickup Fixed up dialogue system (Not fully complete) Slow time ability works by setting a time to a decimal then multplying the following by it: Velocity (Bullet + Player) Rotation speed Gravity strength Multiplying by a decimal reduces the numbers, emulating slowed time rather than reducing fps which is a bit of a cop-out . Breakable surfaces work similarly to the gate tiles, the tiles having a alpha value of 0 when bullet rect makes contact with tile of that class and adding that tile type to a list: broken_tiles. . All tiles in that list are then ignored by tile collision . Bullet pickup works by detecting rect collision between the player and the surface, when contact is made the players bullet count (representing bullets shot total) is reduced by one, increasing the number of shots available to the player by one. . Dialogue system now works with full words, voice blips are annoying but will fix late stage when adding polish. Will also make it that player has to click mouse to go to next dialogue screen to give them time to read the text. . That is 3 and a bit things of the list, very good progress, juggling summer work, this and most importantly my Minecraft duties has been an upward hill battle but I’m getting there. . See you next develop with more progress!!!"}, {"post_id": 48445, "ts": "2026-08-16T19:54:18Z", "hours": 0.6561, "text": "Dev Log #25 . My love for videojuegos has got the better of me. . Over theses 2 days all I have done is made some level maps and fixed the spawing positions of both win condition and the player based on the new maps. . But I have structure now, and rather than geting destracted, I have set myself some goals to complete hopefully by the end of the month, leaving me time to make the UI look nice. . I present to you. THE TOD0 LIST: . A - DIOLOGUE Fix dialogue system Add hint dialogue Add new level dialogue Add completed dialogue B - ABILITIES/TILES Bullet Pickup Ghost bullets Teleport bullets Time SLOW (not stop) Gravity flip ? Map flip ? Breakable tiles Level editor ? C - UI James bond level start animation Gun skin menu All menus with all required buttons D - Miscellaneous Mission objectives (Bad piggies esque) Determine gun skin unlock criteria A FINAL BOSS !?!?! I hope tomorrow if filled with WAY more advancements of the work kind rather than the Minecraft kind (;"}, {"post_id": 47115, "ts": "2026-08-14T19:25:06Z", "hours": 2.7211, "text": "Dev Log #24 . A progress full day today, but mabye not for the best?? . Today I done the following: Added a charcater diologue box Fixes re-align function so that it works when rotation direction is reversed Just doing little sidequests for now as I’m trying to hide from my enemy, level design. The things is I’m not very good at games, so i dont have the reaction time to create very punishing levels with little room for error. . So to combat this, I end up making really hard levels or super easy ones. . Additionally, I barley add any time to my total when creating levels as it uses a piece of software outside of visual studio. . My character text box is pretty much a recreation of the ones seen in undertale, even using the voice blip of toriel as a place holder. . This should allow me to add a small story that I will make sure to keep simple, like a mario esque plot. . The re-align function was fixed by using the variable rotation direction, then setting that to 1 or -1 depending on contact with reverse direction ability or not . Then multiplying rot_speed by that value reverse the direction that re-align moves. . I will have to knuckle down on level design tomorrow and make sure each level introduces the abilities and tiles one at a time, letting the player get used to them, allowing for levels that include a mix of multiple to be more approachable."}, {"post_id": 46505, "ts": "2026-08-13T19:34:14Z", "hours": 3.1664, "text": "Dev Log #23 . Very good day today, embracing the foddian likeness of my game, making sure that the player gets as angry as possible, just to make that feeling of victory feel so sweet. . Here’s what I did today: LOSER document created (must be filled in to reveal hints, which will be added later) Change rotation direction ability New map (Still a WIP) Document uses follow mouse function and draw line function. Starting the line at the mouses previous position and ending it at its new position. . This happens very fast, so the lines do not appear blocky and appear like real pencil drawing. . The change rotation ability uses the pbject layer like my previous time stop ability, and now that I understand how object layers work, i was easily able to make this ability by copying my clock abiltiy load and changing the result of contact. . The result being making rotation speed negative, reversing direction of rotation. . The new map uses a mix of many abilities and objects, but I have not added them in just yet. . I could quite easily I feel but I’ve reached my 3 hour brain capacity limit, because realisticly with the time spent making pngs, finding sounds, reading pygame documentation and waching tutorials, I’ve probably spent about 5. . But rewards are not for the weak or the lazy, and this little project of mine is helping me leaps and bounds for my future A-level comp sci journey. . See you next time, with some jucy new progress!!!!"}, {"post_id": 45899, "ts": "2026-08-12T17:26:00Z", "hours": 3.3278, "text": "Dev log #22 . Back to business!! . Today I added: Uncompleted level select lockout Separated tile load into own file Easter egg room added Level lockout works by calculating max_player_level, the furthest level a player can select based on if they have beat the previous levels. . This works buy using a function to check if current player_level is greater than max_player_level, if it is then max_player_level = player level. . Then for level select button with number greater than max_player_level, a red cross is screen.blited ontop,as well as not allowing mouse clicks of the rect from having any function. . Tile file separation helped me remove 150 lines from my main file, improving readability. . My easter egg has a 2% chance of happening and gives the player a custom gun appearance on discovery. . The code used to change the guns appearenece should let me, in future, make custom skins for the gun, skins that could be rewarded for levels complete, secondary level goals reached, ect… . I will not share how to reach my secret room, but I think it would be better for someone to stumble across it by accident. . Good day today, progress is picking up pace again, good job me!!! . Strange, it seems, there is a man here…."}, {"post_id": 45339, "ts": "2026-08-11T18:45:05Z", "hours": 2.1411, "text": "Dev Log #21 . Getting lazy now, saw hacktime was down and decided not to bother doing anything before 12, but I hope I will break this cycle. . Today I added working buttons that when pressed, remove gate blocking path. . Had to over hall all my tile loading and map loading and parts of my collision resolution to allow me to reduce the lag being caused in some levels and be able to remove collision selectively for tile types. . I learn how to use set today. I used a set to store the types of gates that have been opened because it prevents duplicates and allows me to quickly check whether a specific gate is open. . No animations for button presses yet as I want to leave that stuff for the end. . I’m feeling the time crunch now because I really want this to be finished before I get back to school and focus on my studies, but this still counts as practice so I’ll continue a little bit during school days. . I will do better tomorrow I promise, cause I’ve got this far, it would be a waste to stop now."}, {"post_id": 44821, "ts": "2026-08-10T20:55:15Z", "hours": 2.8053, "text": "Dev Log #20 . Sorry for the hiatus, not a lot done, but sure I will be soaring tomorrow. . Today I addded: Killable enemies New reset all function Killable enemies act as win conditions, similar to the mini stars, having to all be killed for the goal polygon to spawn. . The reset function made my code much more readable and allowed me to condense all of the restart events like lose velocity, set position here, screen.blit things again if needed. . I started working on 3 buttons that when pressed, open a gate but didn’t get to finishing it sadly. . I want each button to have different press conditions, one can be pressed by bullets only, one only on direct gun contact and the other working with either or. . In later stages, I will have to think how i will communicate this functionality to the player but I’m saving texturing and making the game look good for last. . Hope to have more progress tomorrow. Fingers crossed."}, {"post_id": 42861, "ts": "2026-08-07T20:19:50Z", "hours": 2.4408, "text": "Dev Log #19 . Getting lazy, need to lock in and get 3 hours tomorrow. . Today I added: Working portals Time stop ability Portals and time stop ability use object layers in tiles, a much easier solution compared to my use of polygons for complete goals, may change that but not sure. . Time stop ability is pretty simple, works like pause menu, but allows image rotation and enables follow mouse. . Portals work by on contact, moving player position centre to other portal centre. . The velocity changes with the exit direction using the following code: rotation_difference = entry_angle - exit_angle self.velocity.rotate_ip(rotation_difference) Overall, ok day, not sure what I’ll do tmr, but I’m sure theres something hiding on my checklist. . ALSO!!, Fix this horrible performance issue I had, see bellow for comparison"}, {"post_id": 42135, "ts": "2026-08-06T18:44:20Z", "hours": 2.5461, "text": "Dev Log #18 . Good day, but stopped early today beacuse, well, i’m afraid… . What I did today: Added mini_stars Added re-align option when grounded Added new map Mini stars are to be collected first, unlocking the finish goal. They are hard coded right now so cant be moved for new levels, but I can change that if need be. . Re-align was initially supposed to allow A to rotate the player one direction and D the other, but my game seemed to really not like decreasing the angle value when grounded. . So I’ve made it so rotation only happens one direction, but a full 360 range of motion is possible. . The new map that uses portals, but the portals are not actually functional yet so, thats a job for tomorrow . . Almost everything added from last devlogs check list, but decided against adding placeholder music during playing state as i think I would go insane from listening to it on loop, so that can wait till the end. . Hope to have a longer more prosperous dev log next time, see you then!!!"}, {"post_id": 41536, "ts": "2026-08-05T20:08:05Z", "hours": 3.6981, "text": "Dev Log #17 . Feel kinda stuck in-between, but once a pass my last hurdle, all of my efforts will be focused on new abilities, new tiles and art, but the basics are sooo close to being complete. . Today i did the following: Level stopwatch Level complete goal changed Edited map Complete goal had to be changed to make animation of win goal possible, like coin pick up in Mario. Uses polygon collision, freezes on contact currently but working on fix. . Level stopwatch works well, and works with pause menu by subtracting time passed in pause menu from counter total on continue button pressed. . Map needed editing as I feel my game is too hard and my muscle memory from 100’s of tries makes it feel easy, but really isn’t. . Tried making a new map that requires you to collect many little stars to reveal the goal but found it hard to find a map that works with wide range of movement. . This issue is caused by gun being useless most of the time on collision with floor as it is aimed the wrong way. . I plan to have the player be able to rotate the gun while its grounded using A or D, this re-ajusting stopping players getting stuck. That or a jump ability. . Next devlog hope to have: Mini stars working New map Rotate/jump when grounded Game in progress music See you next devlog, no 1 day hiatus next time (;"}, {"post_id": 40339, "ts": "2026-08-03T19:40:47Z", "hours": 2.6639, "text": "Dev Log #16 . Today was good. I was welmed. . I did the following today: Added working kill tile Fixed image lagging behind player polygon Switched over to match cases Kill tile works as intended, but doen’t ‘kill’ the player yet, it just freezes everything, plays a sound and propts you to restart. . Image lagging behind was a big issue, causing the kill tile to look as if it were killing without contact, but this was cause by the image lag behind. . I tried changing the order of functions in update() but that didn’t work, tried other stuff like changing how some functions work, in the end, it was because i called update after player_group.draw(). Silly me!! . Match case switch over was easy, just the indentation was at times a pain, but I’ve sorted it now, thank goodness! . Going to try and finish the loss screen that appears, adding a level select button and a return to start, but might not as its not strictly necessary, but does look nice. . Not sure what other stuff to add, maybe a new level? . Who knows, see you next Dev Log!!!!"}, {"post_id": 39640, "ts": "2026-08-02T19:23:20Z", "hours": 3.0406, "text": "#Dev Log 15 . Good day at the office. . Did the following today: Working level select Fixed Music Issue Fixed map loading issues (didn’t discover until today) Added tile classes to replace gid based system for tile specific collision My issues today were caused by my moving of code into separate files, but I’m getting there. I’m no longer using from ___ import * and I am instead using import ______. . The sound issue was caused by a variable in settings setting play music to False without my knowledge. . Map loading broke because my maps are only loaded once outside of the while loop, so I fixed that. . Tiles now have a class that can be checked, allowing for different interactions with tiles dependent on tile class. . Thinking about storing some of my variables into match statements for readability but I find using match cases in Settings.py to be really difficult so I will proceed with caution and immense fear!!! . Not sure what tomorrow holds, thinking about making the kill and win tiles do something rather than print win or killed, but might be held up by this switch from many elifs to match cases. . Staying determined, see you next dev log. . PS, a little hint to my little easter egg 📂︎🖮︎"}, {"post_id": 39080, "ts": "2026-08-01T19:29:51Z", "hours": 4.105, "text": "#Dev Log 14 . Ying ang Yang session today: . I did the following: 2 new maps - one I’m keeping a secret for the complete game >;] Level select rect load (not working YET) Kill tile (detection only) Separating code into files outside of main Music Broke…. Level select menu was a perfect mix of challenge and enjoyability. . I loaded the squares in this even patter by creating a rect at (360, 260), then after the first rectangle is created, add 120 to the x value, until x >= 960. . Then I added 120 to y to create a new line and set x back to 360. . The kill tile collision was done the same way as the win tile collision, using tile ID’s. . The only issue I’ve come across is the music suddenyl not working after moving it into its own seperate file, despite it working like an hour before. . I’ve left this issue for tomorrow as I’ve already got a lot of hours under my belt today. . Also the new level is not possible despite all my effort so will have to change that also. . Good progress today, I’ve made a lit of all I want to achieve in Barrel Roll Bullet before the dedline and one by one, I’m checking that list of. . See you next devlog. Maybe then I’ll reveal the space in-between 💣︎♋︎■︎📬︎□︎♑︎♑︎"}, {"post_id": 38447, "ts": "2026-07-31T20:17:36Z", "hours": 2.0106, "text": "Dev Log #13.Unlucky for some, but not for me! . Collision resolution finally working!!!! . Here’s how it works: . SAT algorithm returns the axis with the smallest overlap (this is the shortest distance to separate the player and the tile). . Correct normal line direction so that it points from the tile to the player. . Move player across MTV (Minimum Translation Vector), pushing player out of the tile. Note: MTV is calculated by choosing the smallest overlap in the direction that moves the two shapes apart. . Remove velocity that is parallel to the collision surface, allowing the object to glide across it without getting stuck. . That’s the jist of it. There are some other things I didn’t include, like how only polygons are made for tiles touching the player’s polygon/rect, but I discussed this in a past dev log. . In all honesty, I don’t fully understand the maths behind it, but I was still able to make my own SAT collision system, so I obviously know enough. . Also added some smaller things like a bullet limit and a restart caused by holding the R button down. . This is good progress and should allow me to add more easily things like level select, new Tiled maps, new tile variants that cause different effects, etc. . Next dev log is going to be packed with stuff!!!!.See you then (;"}, {"post_id": 37832, "ts": "2026-07-30T19:46:46Z", "hours": 2.4217, "text": "#Dev Log 12 . Good honest session today. . Changed my collision resolution as it seemed to be causing me alot of trouble and hurting preformance. . Now using polygon collision detection instead of mask collision as it greatly improves preformance and simplicty of colllision resolution. . Although that is still not perfect. . I had it working quite well to a point but once I tried to prevent wall riding through on ground variables set to True or False, everyhting seemed to go wibledy wobeldy from there. . My collision detection works as follow: Dictionary of tiles is made, each tile with a rect and id (needed to make certain tile types do different things). . From that list, add the tiles with rectangles that colide with the player into a new list . 3.With this list, I then draw a mask on the tile, setting the co-ordinates to the corners of the rect . Last step, use self.polygon_collision() to check for collision . This worked without a hitch, but my collision resolution sytem is not so flawless. . This has been a 3ish day long ordeal, but I want to get it solved now so that once I’ve got the basics done I can divert my attention to more fun things like gun abilities, kill tiles, moving platforms, ect. . Progress is not necessarily slow, just stuck on one convoluted thing. I hope I get things sorted soon, this is starting to be a real de-motervator. . But I got that frisk undertale in me so I’ll stay DETERMINED!!!"}, {"post_id": 37179, "ts": "2026-07-29T18:07:52Z", "hours": 3.7003, "text": "Dev Log #11 . Not Good. Very NOT Good. . What I achieved today Victory tile added Aiming reticle completely destroyed Fixed aiming reticle Mask detection not working as intended Gun no longer stopping rotation on collision complete loss of sanity OK, fun. How did this all happen? . My aiming reticle misangling issue was caused by setting initial rotation angle to 15. I did this to increse rotation speed. . The issue being this caused my gun image to also be rotated 15 degrees, causing the barrel not to point to my mouse. . I solved the issue by making initial rotation angle to 0, only += it to = 15 once first shot had been fired. . The next issue I have yet to solve is collision resolution. . It had been an underlying issue for some time, and i still don’t yet know how to fix it. But in my attempt to fix it, I then broke my stop_rotation function, meaning rotation now continues despite collision. . Hope to fix these issues by next devlog, then also give my recoil a bit of calibrating as each bullet seems to be weaker than the last, i think this is caused by my collision resolution setting velocity to 0. . Next devlog will hopefully be more fruitful!"}, {"post_id": 36456, "ts": "2026-07-28T16:14:07Z", "hours": 3.5108, "text": "Dev log #10 . DOUBLE DIGITS!! . What I did today: Added a working pause menu Fixed start screen size Spruced up mask collisions An issue im having with my new and improved collision sytem is that when i reduce player velocity on collision, as well as rotation speed, my player comes to a hault. . In real life, as im sure many of you know, a gun isnt likely to ballance on the barrel verticly, its handle will fall due to being heavier. . I do not yet know how to combat this issue, but I have brain stormed some ideas. . I was going to try and find a center of mass, but that wouldn’t work because that would cause my barrel to float at times due to being disproportionally lighter compared to the gun grip, meaning when gravity acted on it, it would be lob sided. . My other idea was to break the gun into 3 rectangles, barrel, handel and inbetween, then give these rectangles set weights. But i was unable to implement that. . I’m going to try some other solutions, but i think this is going to be some of my toughest challenges yet! . Still undesided on the goals for next devlog, we will see what my brain decided that faithfull day."}, {"post_id": 35966, "ts": "2026-07-27T19:09:25Z", "hours": 3.4547, "text": "Dev Log #9 . Not the best keyboard clacking session, but not the worst. Looking at you Dev Log #4 >:[ . Today I added pixel perfect collision. . First I got the players mask and a list of the rectangle tiles touching my player rectangle. I then listed these rectangles and was able to detect collision based on if they made contact with the players mask. . The next step was collision resolution. . After a detected collision, the location of collision is then increase the y co-ordinate of the player mask, effectivly keeping the player above the ground. This is how collision resolution works for all the other directions, just with varying positions. . With this I then attempted to add a feature that stopped rotation as a surface was hit, to prevent a constanly spinning gun that sits on the floor. . This is still a WIP, but I have been able to make the gun stop all movement once on contact on a wall, but this is unrealistic as in real life if an object makes contact with a wall it does not loose all its momentum. . I will try to combat this isse by adding a bounce effect that gradually reduces momentum on wall contact, rather than causing it to loose all of it. . Next devlog I hope to have a working wall bounce system and maybe a finish goal that, when entered, plays a victory noise and victory screen. . Holding out hope for the future!!"}, {"post_id": 35259, "ts": "2026-07-26T15:42:00Z", "hours": 2.6272, "text": "Dev Log #8 . I new it was too good to be true, progress has slowed yet again. ): . Today I added: ‘Working’ collisions While my collisions ‘work’, they only work when my player rectangle is unchanged. . The issue being when my gun rotates, its rectangle changes size. . This change of size is interpreted as a movement by my collision sytem, therefore once I come in contact with a tile, the bottom of the rectangle slowly becomes bigger and smaller. . this caused it to move to the tops of different tiles, eventually causing it to be flung out of the game window at rapid speed. . I plan to combat this issue with either of these methods: . OPTION A: Pixel perfect collision done through player masks. . This option is harder and can effect preformance if not implemented properly, but with give a smooth and finished collision effect . OPTION B: Set hitbox collision . This option creates a set region on the player, only that region (probably a rectangle shape to make collision detection easy) being able to collide with tiles. . This option will likely be easier, but will look less pollished as the gun barrel would not fall due to gravity, it would stay above the ground while the grip sits on the ground. . My goals for next dev-log are unclear, but for now I hope to have a working collision system at least!!!"}, {"post_id": 34808, "ts": "2026-07-25T20:07:27Z", "hours": 2.8481, "text": "Dev Log #7 . Another prosperous coding session today! . I have added the following features: Correct bullet orientation Sound effects Tiled surface (no collisions) I also had to change the screen size as its height and length needed to be divisible by 16 in order for my tiles to be used easily. . I added the pytmx python library to allow me to use Tiled, a software that makes level creation very simple and quickly repeatable. . It should significantly increase my workflow speed when I get far enough in development to actually be making levels. . I also did some fine tuning on the strength of recoil, making it stronger but controllable. . Additionally, I increased the speed at which the gun rotates in air to make aiming more difficult but still manageable. . Overall, 7/10 work day today. . By next devlog I hope to have some of the following complete: Working collision Finish goal that takes you to the next level Possible moving colidable tile Bullet limit and UI to show this I’m back in business now, regained most of the knowledge I lost from my 1 week hiatus. Wishing future me luck for the next devlog! . And all you others out there as well. STAY DETERMINED!!!!!"}, {"post_id": 34255, "ts": "2026-07-24T19:58:07Z", "hours": 3.2694, "text": "Dev Log #6 . I have made some absolute serious progress!! . I have added: . Working recoil In-air gun rotation Aiming phase and playing phase (turning aiming guide on and off) Dotted aiming guide This has by far been my best coding session as of late and had little to no complications… . Well there was one… Where my entire recoil system was built on mouse position, a mouse which only controls the direction of the bullet once and never again per level. . So that caused me some grief. But I was able to calculate recoil based on the bullet’s movement rather than the mouse’s position. . A bullet which would spawn and move forward from the barrel despite orientation, solving my problem and making the rest of the other features added much simpler to implement. . In the next few dev logs I hope to have added the following: . Make bullet orientation match barrel orientation Add a start menu soundtrack Bullet trail Sound effects (e.g. gunshot, start button pressed) Complete level (with collisions) I hope progress continues at the rate it is, because if so, I will be drowning in stardust."}, {"post_id": 33415, "ts": "2026-07-23T10:41:34Z", "hours": 1.5733, "text": "Dev Log #5 . I have redeemed myself 10 fold. I have finally added recoil to my game!!!! . This moment shows real progress. I have been trying to implement recoil for a while now, and I have finally done it. . I did this by using the velocity I calculated to determine what direction and what speed bullets are shot at from the gun: def __init__(self, barrel_pos, m_pos): super().__init__() self.image = pygame.image.load(\"Images/BULLET.png\").convert_alpha() self.rect = self.image.get_rect(center=barrel_pos) direction = pygame.Vector2( m_pos[0] - barrel_pos[0], m_pos[1] - barrel_pos[1] ) if direction.length() > 0: direction = direction.normalize() self.velocity = direction * 10 Passing the velocity into my player group and subtracting it from the player’s centre, effectively creating movement opposite to the direction of the bullets, aka recoil!!! def recoil(self, velocity): self.recoiled = velocity self.rect.x -= (self.recoiled.x * 10) self.rect.y -= (self.recoiled.y * 10) I also made it so that bullets despawn once off-screen, optimising performance. . Finally, I re-ordered my code, making debugging and overall readability much easier. . While my recoil is not fully complete, this is a large step in the right direction. . I hope by the next devlog I have a fully working recoil system and possibly a working level. Who knows! . Aim for the stars and you’ll at least reach the moon."}, {"post_id": 33031, "ts": "2026-07-22T16:18:00Z", "hours": 5.3169, "text": "Dev Log Number 4 . With the amount of time logged, you would think a lot has been achieved. But no… . After an almost 2 week long holiday induced hiatus, it seemed I had lost my confidence with pygame, and at some points, felt like i had lost my brain entirely. . My attempt to add shootable bullets should have been a simple task, yet it seemed to be impossible. And its not like I could have packed up shop and tried something else, a shootable bullet is esential for a game where the only playable charcater is, well, A GUN! . The first challenge was getting the bullet to spawn from the correct location. Initially, the bullets appeared from the centre of the gun rather than the barrel. Obviously that was not the intent. . I eventually solved the issue (casued by my own ignorance) and passed the barrel position calculated previously into my bullet class rather than re-calculating this (why would i do this, what on earth was I thinking 😩) . With that issue conquered, i then had to do the maths required to shoot a bullet from the barrel to the position of the mouse. Easy enough. NOT. . To cut a long story short, I used the code attatched to finally make my gun work. . My shootable bullets are far from perfect, they sometimes don’t shoot at all even when the mouse is pressed, their orientation does not match the direction the gun is facing and they are far too small. . I plan to fix this by: killing bullets as they go offscreen, adding some sort of rotation to the bullets and for the bullets not being shot when intended, i have no real plan on how I’m going to fix that. . I hope I come back to you in the next dev log with some actually real progress, because this is a sad excuse. . But with determination and grit and endless scrolling of the pygame documentation, I am sure progress will come as fast as a speeding train [or some sort of blue mammal with quills (^_~)]"}, {"post_id": 24165, "ts": "2026-07-07T15:40:34Z", "hours": 2.0261, "text": "Dev log #3 . Today I got a bit sidetracked and decided to move all of my code within a sprite class to reduce clutter. As a newbie, this was my greatest challenge (besides my arch enemy recoil physics). . This process was tedious and caused my entire code to break completely on multiple occasions. But the risk and complication was worth the reward. I reduced my codes line count by 15. . Due to the length of this process, very little was added. However, I did manage to add a aiming reticle for your first initial shot of the gun. . As seen in the images below, this feature came with its own plethora of annoyances. Annoyances such as multiplying rapidly and staying fixed on the gun trigger rather than the barrel. . I also created a new gun sprite that now faced the mouse correctly. . In the next dev log, I hope I come bearing more features. . I plan to add: .Basic bullet firing .Dotted aiming line instead of solid .Player start game (in which gravity will be applied) .NOT recoil, sadly that will have to wait . Went back to my roots today and used my beginner tutorial to help me learn how to apply the sprite class, video linked here: https://youtu.be/AY9MnQ4x3zk?si=9UtUnmyWYpsHZ6d5 . While the sprite class has acted as a roadblock to speed of development, I believe that by the next devlog, my progress will be sure to amaze (I say with confidence 🤞)"}, {"post_id": 23525, "ts": "2026-07-06T15:26:32Z", "hours": 2.0483, "text": "Dev Log #2 – Start and Turn . Now with the basics ingrained in my head, my game is beginning to take shape. While I wasn’t able to add the recoil mechanics I had hoped for, I was able to: .Create a functioning start screen. .Make my player sprite follow the mouse direction. . Today I used a different tutorial to assist me, linked here: https://youtu.be/WnIycS9Gf_c?si=UhNQQ8ekJLdPhRZO . While these are small achievements, they will help build a much greater finished product. Thanks to implementing these new features, I now understand the importance of game states and how to apply them, as well as how to track mouse movement and mouse input. . The reason I implemented sprite rotation based on mouse direction was to allow the player to aim their initial shot and determine their trajectory. . Later, the player will have to use well-timed shots to control their direction rather than relying on this simpler aiming system, making my game’s movement feel more unique and rewarding fast reaction times. . By the next dev log, I hope to create a new gun sprite that follows the mouse correctly, make a shootable bullet, and finally implement the recoil effect when the gun is fired, although this still seems to be my biggest hurdle. . Progress is picking up pace. Every new feature is another lesson learned, helping build the foundations of what I hope will become my magnum opus. See you in the next dev log. ;)"}, {"post_id": 22879, "ts": "2026-07-05T14:44:05Z", "hours": 2.0386, "text": "Dev Log #1 – Grasping the Basics of Pygame . Since I’m new to Pygame, my first goal has been learning the fundamentals and applying them to build the foundations of my game. . So far I’ve implemented: . .Basic gravity .Collision detection with the floor .Upward player movement using mouse input .Loading and displaying sprites and backgrounds . Building these simple features helped me understand how the game loop works, how collision is detected using rectangles, and how offsetting the player’s y-coordinate can be used to create gravity. . At the moment, the player is represented with a placeholder sprite, as my focus is on the code behind my game (and art has never been my strong suit). . I’ve been using the following tutorial, a learning resource that has helped me greatly: . https://youtu.be/AY9MnQ4x3zk?si=x9KrrOI12N1CwT29 . Now that I have an understanding of the basics, I’m going to start moving towards creating the mechanics required for the actual game. . My goal before the next dev log is to have a basic title screen completed and, if possible, implement the recoil mechanic for my player. . Progress is slow at the moment, but every feature I build teaches me something new. Hopefully, the next update will be bigger and come together more quickly (as long as all goes well 🤞)."}]...
|
Title: Barrel Roll Bullet by @ShinyMist | Stardanc Title: Barrel Roll Bullet by @ShinyMist | Stardance
Devlogs:
Dev Log #1 – Grasping the Basics of Pygame . Since I’m new to Pygame, my first goal has been learning the fundamentals and applying them to build the foundations of my game. . So far I’ve implemented: . .Basic gravity .Collision detection with the floor .Upward player movement using mouse input .Loading and displaying sprites and backgrounds . Building these simple features helped me understand how the game loop works, how collision is detected using rectangles, and how offsetting the player’s y-coordinate can be used to create gravity. . At the moment, the player is represented with a placeholder sprite, as my focus is on the code behind my game (and art has never been my strong suit). . I’ve been using the following tutorial, a learning resource that has helped me greatly: . https://youtu.be/AY9MnQ4x3zk?si=x9KrrOI12N1CwT29 . Now that I have an understanding of the basics, I’m going to start moving towards creating the mechanics required for the actual game. . My goal before the next dev log is to have a basic title screen completed and, if possible, implement the recoil mechanic for my player. . Progress is slow at the moment, but every feature I build teaches me something new. Hopefully, the next update will be bigger and come together more quickly (as long as all goes well 🤞).
Dev Log #2 – Start and Turn . Now with the basics ingrained in my head, my game is beginning to take shape. While I wasn’t able to add the recoil mechanics I had hoped for, I was able to: .Create a functioning start screen. .Make my player sprite follow the mouse direction. . Today I used a different tutorial to assist me, linked here: https://youtu.be/WnIycS9Gf_c?si=UhNQQ8ekJLdPhRZO . While these are small achievements, they will help build a much greater finished product. Thanks to implementing these new features, I now understand the importance of game states and how to apply them, as well as how to track mouse movement and mouse input. . The reason I implemented sprite rotation based on mouse direction was to allow the player to aim their initial shot and determine their trajectory. . Later, the player will have to use well-timed shots to control their direction rather than relying on this simpler aiming system, making my game’s movement feel more unique and rewarding fast reaction times. . By the next dev log, I hope to create a new gun sprite that follows the mouse correctly, make a shootable bullet, and finally implement the recoil effect when the gun is fired, although this still seems to be my biggest hurdle. . Progress is picking up pace. Every new feature is another lesson learned, helping build the foundations of what I hope will become my magnum opus. See you in the next dev log. ;)
Dev log #3 . Today I got a bit sidetracked and decided to move all of my code within a sprite class to reduce clutter. As a newbie, this was my greatest challenge (besides my arch enemy recoil physics). . This process was tedious and caused my entire code to break completely on multiple occasions. But the risk and complication was worth the reward. I reduced my codes line count by 15. . Due to the length of this process, very little was added. However, I did manage to add a aiming reticle for your first initial shot of the gun. . As seen in the images below, this feature came with its own plethora of annoyances. Annoyances such as multiplying rapidly and staying fixed on the gun trigger rather than the barrel. . I also created a new gun sprite that now faced the mouse correctly. . In the next dev log, I hope I come bearing more features. . I plan to add: .Basic bullet firing .Dotted aiming line instead of solid .Player start game (in which gravity will be applied) .NOT recoil, sadly that will have to wait . Went back to my roots today and used my beginner tutorial to help me learn how to apply the sprite class, video linked here: https://youtu.be/AY9MnQ4x3zk?si=9UtUnmyWYpsHZ6d5 . While the sprite class has acted as a roadblock to speed of development, I believe that by the next devlog, my progress will be sure to amaze (I say with confidence 🤞)
Dev Log Number 4 . With the amount of time logged, you would think a lot has been achieved. But no… . After an almost 2 week long holiday induced hiatus, it seemed I had lost my confidence with pygame, and at some points, felt like i had lost my brain entirely. . My attempt to add shootable bullets should have been a simple task, yet it seemed to be impossible. And its not like I could have packed up shop and tried something else, a shootable bullet is esential for a game where the only playable charcater is, well, A GUN! . The first challenge was getting the bullet to spawn from the correct location. Initially, the bullets appeared from the centre of the gun rather than the barrel. Obviously that was not the intent. . I eventually solved the issue (casued by my own ignorance) and passed the barrel position calculated previously into my bullet class rather than re-calculating this (why would i do this, what on earth was I thinking 😩) . With that issue conquered, i then had to do the maths required to shoot a bullet from the barrel to the position of the mouse. Easy enough. NOT. . To cut a long story short, I used the code attatched to finally make my gun work. . My shootable bullets are far from perfect, they sometimes don’t shoot at all even when the mouse is pressed, their orientation does not match the direction the gun is facing and they are far too small. . I plan to fix this by: killing bullets as they go offscreen, adding some sort of rotation to the bullets and for the bullets not being shot when intended, i have no real plan on how I’m going to fix that. . I hope I come back to you in the next dev log with some actually real progress, because this is a sad excuse. . But with determination and grit and endless scrolling of the pygame documentation, I am sure progress will come as fast as a speeding train [or some sort of blue mammal with quills (^_~)]
Dev Log #5 . I have redeemed myself 10 fold. I have finally added recoil to my game!!!! . This moment shows real progress. I have been trying to implement recoil for a while now, and I have finally done it. . I did this by using the velocity I calculated to determine what direction and what speed bullets are shot at from the gun: def __init__(self, barrel_pos, m_pos): super().__init__() self.image = pygame.image.load("Images/BULLET.png").convert_alpha() self.rect = self.image.get_rect(center=barrel_pos) direction = pygame.Vector2( m_pos[0] - barrel_pos[0], m_pos[1] - barrel_pos[1] ) if direction.length() > 0: direction = direction.normalize() self.velocity = direction * 10 Passing the velocity into my player group and subtracting it from the player’s centre, effectively creating movement opposite to the direction of the bullets, aka recoil!!! def recoil(self, velocity): self.recoiled = velocity self.rect.x -= (self.recoiled.x * 10) self.rect.y -= (self.recoiled.y * 10) I also made it so that bullets despawn once off-screen, optimising performance. . Finally, I re-ordered my code, making debugging and overall readability much easier. . While my recoil is not fully complete, this is a large step in the right direction. . I hope by the next devlog I have a fully working recoil system and possibly a working level. Who knows! . Aim for the stars and you’ll at least reach the moon.
Dev Log #6 . I have made some absolute serious progress!! . I have added: . Working recoil In-air gun rotation Aiming phase and playing phase (turning aiming guide on and off) Dotted aiming guide This has by far been my best coding session as of late and had little to no complications… . Well there was one… Where my entire recoil system was built on mouse position, a mouse which only controls the direction of the bullet once and never again per level. . So that caused me some grief. But I was able to calculate recoil based on the bullet’s movement rather than the mouse’s position. . A bullet which would spawn and move forward from the barrel despite orientation, solving my problem and making the rest of the other features added much simpler to implement. . In the next few dev logs I hope to have added the following: . Make bullet orientation match barrel orientation Add a start menu soundtrack Bullet trail Sound effects (e.g. gunshot, start button pressed) Complete level (with collisions) I hope progress continues at the rate it is, because if so, I will be drowning in stardust.
Dev Log #7 . Another prosperous coding session today! . I have added the following features: Correct bullet orientation Sound effects Tiled surface (no collisions) I also had to change the screen size as its height and length needed to be divisible by 16 in order for my tiles to be used easily. . I added the pytmx python library to allow me to use Tiled, a software that makes level creation very simple and quickly repeatable. . It should significantly increase my workflow speed when I get far enough in development to actually be making levels. . I also did some fine tuning on the strength of recoil, making it stronger but controllable. . Additionally, I increased the speed at which the gun rotates in air to make aiming more difficult but still manageable. . Overall, 7/10 work day today. . By next devlog I hope to have some of the following complete: Working collision Finish goal that takes you to the next level Possible moving colidable tile Bullet limit and UI to show this I’m back in business now, regained most of the knowledge I lost from my 1 week hiatus. Wishing future me luck for the next devlog! . And all you others out there as well. STAY DETERMINED!!!!!
Dev Log #8 . I new it was too good to be true, progress has slowed yet again. ): . Today I added: ‘Working’ collisions While my collisions ‘work’, they only work when my player rectangle is unchanged. . The issue being when my gun rotates, its rectangle changes size. . This change of size is interpreted as a movement by my collision sytem, therefore once I come in contact with a tile, the bottom of the rectangle slowly becomes bigger and smaller. . this caused it to move to the tops of different tiles, eventually causing it to be flung out of the game window at rapid speed. . I plan to combat this issue with either of these methods: . OPTION A: Pixel perfect collision done through player masks. . This option is harder and can effect preformance if not implemented properly, but with give a smooth and finished collision effect . OPTION B: Set hitbox collision . This option creates a set region on the player, only that region (probably a rectangle shape to make collision detection easy) being able to collide with tiles. . This option will likely be easier, but will look less pollished as the gun barrel would not fall due to gravity, it would stay above the ground while the grip sits on the ground. . My goals for next dev-log are unclear, but for now I hope to have a working collision system at least!!!
Dev Log #9 . Not the best keyboard clacking session, but not the worst. Looking at you Dev Log #4 >:[ . Today I added pixel perfect collision. . First I got the players mask and a list of the rectangle tiles touching my player rectangle. I then listed these rectangles and was able to detect collision based on if they made contact with the players mask. . The next step was collision resolution. . After a detected collision, the location of collision is then increase the y co-ordinate of the player mask, effectivly keeping the player above the ground. This is how collision resolution works for all the other directions, just with varying positions. . With this I then attempted to add a feature that stopped rotation as a surface was hit, to prevent a constanly spinning gun that sits on the floor. . This is still a WIP, but I have been able to make the gun stop all movement once on contact on a wall, but this is unrealistic as in real life if an object makes contact with a wall it does not loose all its momentum. . I will try to combat this isse by adding a bounce effect that gradually reduces momentum on wall contact, rather than causing it to loose all of it. . Next devlog I hope to have a working wall bounce system and maybe a finish goal that, when entered, plays a victory noise and victory screen. . Holding out hope for the future!!
Dev log #10 . DOUBLE DIGITS!! . What I did today: Added a working pause menu Fixed start screen size Spruced up mask collisions An issue im having with my new and improved collision sytem is that when i reduce player velocity on collision, as well as rotation speed, my player comes to a hault. . In real life, as im sure many of you know, a gun isnt likely to ballance on the barrel verticly, its handle will fall due to being heavier. . I do not yet know how to combat this issue, but I have brain stormed some ideas. . I was going to try and find a center of mass, but that wouldn’t work because that would cause my barrel to float at times due to being disproportionally lighter compared to the gun grip, meaning when gravity acted on it, it would be lob sided. . My other idea was to break the gun into 3 rectangles, barrel, handel and inbetween, then give these rectangles set weights. But i was unable to implement that. . I’m going to try some other solutions, but i think this is going to be some of my toughest challenges yet! . Still undesided on the goals for next devlog, we will see what my brain decided that faithfull day.
Dev Log #11 . Not Good. Very NOT Good. . What I achieved today Victory tile added Aiming reticle completely destroyed Fixed aiming reticle Mask detection not working as intended Gun no longer stopping rotation on collision complete loss of sanity OK, fun. How did this all happen? . My aiming reticle misangling issue was caused by setting initial rotation angle to 15. I did this to increse rotation speed. . The issue being this caused my gun image to also be rotated 15 degrees, causing the barrel not to point to my mouse. . I solved the issue by making initial rotation angle to 0, only += it to = 15 once first shot had been fired. . The next issue I have yet to solve is collision resolution. . It had been an underlying issue for some time, and i still don’t yet know how to fix it. But in my attempt to fix it, I then broke my stop_rotation function, meaning rotation now continues despite collision. . Hope to fix these issues by next devlog, then also give my recoil a bit of calibrating as each bullet seems to be weaker than the last, i think this is caused by my collision resolution setting velocity to 0. . Next devlog will hopefully be more fruitful!
#Dev Log 12 . Good honest session today. . Changed my collision resolution as it seemed to be causing me alot of trouble and hurting preformance. . Now using polygon collision detection instead of mask collision as it greatly improves preformance and simplicty of colllision resolution. . Although that is still not perfect. . I had it working quite well to a point but once I tried to prevent wall riding through on ground variables set to True or False, everyhting seemed to go wibledy wobeldy from there. . My collision detection works as follow: Dictionary of tiles is made, each tile with a rect and id (needed to make certain tile types do different things). . From that list, add the tiles with rectangles that colide with the player into a new list . 3.With this list, I then draw a mask on the tile, setting the co-ordinates to the corners of the rect . Last step, use self.polygon_collision() to check for collision . This worked without a hitch, but my collision resolution sytem is not so flawless. . This has been a 3ish day long ordeal, but I want to get it solved now so that once I’ve got the basics done I can divert my attention to more fun things like gun abilities, kill tiles, moving platforms, ect. . Progress is not necessarily slow, just stuck on one convoluted thing. I hope I get things sorted soon, this is starting to be a real de-motervator. . But I got that frisk undertale in me so I’ll stay DETERMINED!!!
Dev Log #13.Unlucky for some, but not for me! . Collision resolution finally working!!!! . Here’s how it works: . SAT algorithm returns the axis with the smallest overlap (this is the shortest distance to separate the player and the tile). . Correct normal line direction so that it points from the tile to the player. . Move player across MTV (Minimum Translation Vector), pushing player out of the tile. Note: MTV is calculated by choosing the smallest overlap in the direction that moves the two shapes apart. . Remove velocity that is parallel to the collision surface, allowing the object to glide across it without getting stuck. . That’s the jist of it. There are some other things I didn’t include, like how only polygons are made for tiles touching the player’s polygon/rect, but I discussed this in a past dev log. . In all honesty, I don’t fully understand the maths behind it, but I was still able to make my own SAT collision system, so I obviously know enough. . Also added some smaller things like a bullet limit and a restart caused by holding the R button down. . This is good progress and should allow me to add more easily things like level select, new Tiled maps, new tile variants that cause different effects, etc. . Next dev log is going to be packed with stuff!!!!.See you then (;
#Dev Log 14 . Ying ang Yang session today: . I did the following: 2 new maps - one I’m keeping a secret for the complete game >;] Level select rect load (not working YET) Kill tile (detection only) Separating code into files outside of main Music Broke…. Level select menu was a perfect mix of challenge and enjoyability. . I loaded the squares in this even patter by creating a rect at (360, 260), then after the first rectangle is created, add 120 to the x value, until x >= 960. . Then I added 120 to y to create a new line and set x back to 360. . The kill tile collision was done the same way as the win tile collision, using tile ID’s. . The only issue I’ve come across is the music suddenyl not working after moving it into its own seperate file, despite it working like an hour before. . I’ve left this issue for tomorrow as I’ve already got a lot of hours under my belt today. . Also the new level is not possible despite all my effort so will have to change that also. . Good progress today, I’ve made a lit of all I want to achieve in Barrel Roll Bullet before the dedline and one by one, I’m checking that list of. . See you next devlog. Maybe then I’ll reveal the space in-between 💣︎♋︎■︎📬︎□︎♑︎♑︎
#Dev Log 15 . Good day at the office. . Did the following today: Working level select Fixed Music Issue Fixed map loading issues (didn’t discover until today) Added tile classes to replace gid based system for tile specific collision My issues today were caused by my moving of code into separate files, but I’m getting there. I’m no longer using from ___ import * and I am instead using import ______. . The sound issue was caused by a variable in settings setting play music to False without my knowledge. . Map loading broke because my maps are only loaded once outside of the while loop, so I fixed that. . Tiles now have a class that can be checked, allowing for different interactions with tiles dependent on tile class. . Thinking about storing some of my variables into match statements for readability but I find using match cases in Settings.py to be really difficult so I will proceed with caution and immense fear!!! . Not sure what tomorrow holds, thinking about making the kill and win tiles do something rather than print win or killed, but might be held up by this switch from many elifs to match cases. . Staying determined, see you next dev log. . PS, a little hint to my little easter egg 📂︎🖮︎
Dev Log #16 . Today was good. I was welmed. . I did the following today: Added working kill tile Fixed image lagging behind player polygon Switched over to match cases Kill tile works as intended, but doen’t ‘kill’ the player yet, it just freezes everything, plays a sound and propts you to restart. . Image lagging behind was a big issue, causing the kill tile to look as if it were killing without contact, but this was cause by the image lag behind. . I tried changing the order of functions in update() but that didn’t work, tried other stuff like changing how some functions work, in the end, it was because i called update after player_group.draw(). Silly me!! . Match case switch over was easy, just the indentation was at times a pain, but I’ve sorted it now, thank goodness! . Going to try and finish the loss screen that appears, adding a level select button and a return to start, but might not as its not strictly necessary, but does look nice. . Not sure what other stuff to add, maybe a new level? . Who knows, see you next Dev Log!!!!
Dev Log #17 . Feel kinda stuck in-between, but once a pass my last hurdle, all of my efforts will be focused on new abilities, new tiles and art, but the basics are sooo close to being complete. . Today i did the following: Level stopwatch Level complete goal changed Edited map Complete goal had to be changed to make animation of win goal possible, like coin pick up in Mario. Uses polygon collision, freezes on contact currently but working on fix. . Level stopwatch works well, and works with pause menu by subtracting time passed in pause menu from counter total on continue button pressed. . Map needed editing as I feel my game is too hard and my muscle memory from 100’s of tries makes it feel easy, but really isn’t. . Tried making a new map that requires you to collect many little stars to reveal the goal but found it hard to find a map that works with wide range of movement. . This issue is caused by gun being useless most of the time on collision with floor as it is aimed the wrong way. . I plan to have the player be able to rotate the gun while its grounded using A or D, this re-ajusting stopping players getting stuck. That or a jump ability. . Next devlog hope to have: Mini stars working New map Rotate/jump when grounded Game in progress music See you next devlog, no 1 day hiatus next time (;
Dev Log #18 . Good day, but stopped early today beacuse, well, i’m afraid… . What I did today: Added mini_stars Added re-align option when grounded Added new map Mini stars are to be collected first, unlocking the finish goal. They are hard coded right now so cant be moved for new levels, but I can change that if need be. . Re-align was initially supposed to allow A to rotate the player one direction and D the other, but my game seemed to really not like decreasing the angle value when grounded. . So I’ve made it so rotation only happens one direction, but a full 360 range of motion is possible. . The new map that uses portals, but the portals are not actually functional yet so, thats a job for tomorrow . . Almost everything added from last devlogs check list, but decided against adding placeholder music during playing state as i think I would go insane from listening to it on loop, so that can wait till the end. . Hope to have a longer more prosperous dev log next time, see you then!!!
Dev Log #19 . Getting lazy, need to lock in and get 3 hours tomorrow. . Today I added: Working portals Time stop ability Portals and time stop ability use object layers in tiles, a much easier solution compared to my use of polygons for complete goals, may change that but not sure. . Time stop ability is pretty simple, works like pause menu, but allows image rotation and enables follow mouse. . Portals work by on contact, moving player position centre to other portal centre. . The velocity changes with the exit direction using the following code: rotation_difference = entry_angle - exit_angle self.velocity.rotate_ip(rotation_difference) Overall, ok day, not sure what I’ll do tmr, but I’m sure theres something hiding on my checklist. . ALSO!!, Fix this horrible performance issue I had, see bellow for comparison
Dev Log #20 . Sorry for the hiatus, not a lot done, but sure I will be soaring tomorrow. . Today I addded: Killable enemies New reset all function Killable enemies act as win conditions, similar to the mini stars, having to all be killed for the goal polygon to spawn. . The reset function made my code much more readable and allowed me to condense all of the restart events like lose velocity, set position here, screen.blit things again if needed. . I started working on 3 buttons that when pressed, open a gate but didn’t get to finishing it sadly. . I want each button to have different press conditions, one can be pressed by bullets only, one only on direct gun contact and the other working with either or. . In later stages, I will have to think how i will communicate this functionality to the player but I’m saving texturing and making the game look good for last. . Hope to have more progress tomorrow. Fingers crossed.
Dev Log #21 . Getting lazy now, saw hacktime was down and decided not to bother doing anything before 12, but I hope I will break this cycle. . Today I added working buttons that when pressed, remove gate blocking path. . Had to over hall all my tile loading and map loading and parts of my collision resolution to allow me to reduce the lag being caused in some levels and be able to remove collision selectively for tile types. . I learn how to use set today. I used a set to store the types of gates that have been opened because it prevents duplicates and allows me to quickly check whether a specific gate is open. . No animations for button presses yet as I want to leave that stuff for the end. . I’m feeling the time crunch now because I really want this to be finished before I get back to school and focus on my studies, but this still counts as practice so I’ll continue a little bit during school days. . I will do better tomorrow I promise, cause I’ve got this far, it would be a waste to stop now.
Dev log #22 . Back to business!! . Today I added: Uncompleted level select lockout Separated tile load into own file Easter egg room added Level lockout works by calculating max_player_level, the furthest level a player can select based on if they have beat the previous levels. . This works buy using a function to check if current player_level is greater than max_player_level, if it is then max_player_level = player level. . Then for level select button with number greater than max_player_level, a red cross is screen.blited ontop,as well as not allowing mouse clicks of the rect from having any function. . Tile file separation helped me remove 150 lines from my main file, improving readability. . My easter egg has a 2% chance of happening and gives the player a custom gun appearance on discovery. . The code used to change the guns appearenece should let me, in future, make custom skins for the gun, skins that could be rewarded for levels complete, secondary level goals reached, ect… . I will not share how to reach my secret room, but I think it would be better for someone to stumble across it by accident. . Good day today, progress is picking up pace again, good job me!!! . Strange, it seems, there is a man here….
Dev Log #23 . Very good day today, embracing the foddian likeness of my game, making sure that the player gets as angry as possible, just to make that feeling of victory feel so sweet. . Here’s what I did today: LOSER document created (must be filled in to reveal hints, which will be added later) Change rotation direction ability New map (Still a WIP) Document uses follow mouse function and draw line function. Starting the line at the mouses previous position and ending it at its new position. . This happens very fast, so the lines do not appear blocky and appear like real pencil drawing. . The change rotation ability uses the pbject layer like my previous time stop ability, and now that I understand how object layers work, i was easily able to make this ability by copying my clock abiltiy load and changing the result of contact. . The result being making rotation speed negative, reversing direction of rotation. . The new map uses a mix of many abilities and objects, but I have not added them in just yet. . I could quite easily I feel but I’ve reached my 3 hour brain capacity limit, because realisticly with the time spent making pngs, finding sounds, reading pygame documentation and waching tutorials, I’ve probably spent about 5. . But rewards are not for the weak or the lazy, and this little project of mine is helping me leaps and bounds for my future A-level comp sci journey. . See you next time, with some jucy new progress!!!!
Dev Log #24 . A progress full day today, but mabye not for the best?? . Today I done the following: Added a charcater diologue box Fixes re-align function so that it works when rotation direction is reversed Just doing little sidequests for now as I’m trying to hide from my enemy, level design. The things is I’m not very good at games, so i dont have the reaction time to create very punishing levels with little room for error. . So to combat this, I end up making really hard levels or super easy ones. . Additionally, I barley add any time to my total when creating levels as it uses a piece of software outside of visual studio. . My character text box is pretty much a recreation of the ones seen in undertale, even using the voice blip of toriel as a place holder. . This should allow me to add a small story that I will make sure to keep simple, like a mario esque plot. . The re-align function was fixed by using the variable rotation direction, then setting that to 1 or -1 depending on contact with reverse direction ability or not . Then multiplying rot_speed by that value reverse the direction that re-align moves. . I will have to knuckle down on level design tomorrow and make sure each level introduces the abilities and tiles one at a time, letting the player get used to them, allowing for levels that include a mix of multiple to be more approachable.
Dev Log #25 . My love for videojuegos has got the better of me. . Over theses 2 days all I have done is made some level maps and fixed the spawing positions of both win condition and the player based on the new maps. . But I have structure now, and rather than geting destracted, I have set myself some goals to complete hopefully by the end of the month, leaving me time to make the UI look nice. . I present to you. THE TOD0 LIST: . A - DIOLOGUE Fix dialogue system Add hint dialogue Add new level dialogue Add completed dialogue B - ABILITIES/TILES Bullet Pickup Ghost bullets Teleport bullets Time SLOW (not stop) Gravity flip ? Map flip ? Breakable tiles Level editor ? C - UI James bond level start animation Gun skin menu All menus with all required buttons D - Miscellaneous Mission objectives (Bad piggies esque) Determine gun skin unlock criteria A FINAL BOSS !?!?! I hope tomorrow if filled with WAY more advancements of the work kind rather than the Minecraft kind (;
Dev Log #26 . Popped ULT today!!! . Today I added the following: Slow time ability Breakable surfaces Bullet pickup Fixed up dialogue system (Not fully complete) Slow time ability works by setting a time to a decimal then multplying the following by it: Velocity (Bullet + Player) Rotation speed Gravity strength Multiplying by a decimal reduces the numbers, emulating slowed time rather than reducing fps which is a bit of a cop-out . Breakable surfaces work similarly to the gate tiles, the tiles having a alpha value of 0 when bullet rect makes contact with tile of that class and adding that tile type to a list: broken_tiles. . All tiles in that list are then ignored by tile collision . Bullet pickup works by detecting rect collision between the player and the surface, when contact is made the players bullet count (representing bullets shot total) is reduced by one, increasing the number of shots available to the player by one. . Dialogue system now works with full words, voice blips are annoying but will fix late stage when adding polish. Will also make it that player has to click mouse to go to next dialogue screen to give them time to read the text. . That is 3 and a bit things of the list, very good progress, juggling summer work, this and most importantly my Minecraft duties has been an upward hill battle but I’m getting there. . See you next develop with more progress!!!
Dev Log #27 . More things checked of the list today: . Today I did: Added gravity flip ability Added teleport bullets Added player mission objectives However, some other things i worked on today are still a work in progress, such as: Diologue system Ghost bullets (travel through walls) Gravity flip works similarily to how slow time works, settings the variable self.gravity_flip to -1 on contact, then multiplying graivty strenght by it, reversing the direction of gravity . This however made my realign function not work when on the ceiling, so i added to re-align that if gravity_flip was negative, to detect ceiling hit rather than grounded, allowing it to work why gravity was flipped. . Teleport bullets work by setting a can teleport function to True on contact, then when true, if bullet collidesrect with tile, self.rect of bullet is equal to self.rect of gun. the can tele[port function is then set to false, making the ability only work once as intended. . Player mission objects are as follows: Complete level Complete level in set ammount of time Complete level with less bullets than provided This uses lists in a way i have never used them before and looks like this total_stars = 0 level_stars = [[False, False, False] for _ in range(levels)] If player completes level, level_stars[Settings.player_level - 1][0] for current player level is set to True. . If player completes level quickly (complete_time < bonus_time), then …[1] is set to true . If player reaches has_won game state with a number of bullets lower than the bullet max, then then …[2] is set to True. . Total stars is incremented by one for each goal completed, and if level_stars[Settings.player_level - 1][1,2 or 3] is already set to true, then the increment is skipped, meaning you can only get 3 stars per level. . That’s all for now, hope to fix the issues I had today in tomorrows devlog!!
Dev Log #28 . Didn’t do alot today, or for the 2 other days… . I finally made ghost bullets work correctly and have changed the dialogue sytem a bit . The ghost bullets working and not working previously was juts a matter of using variables inside the bullet class rather than global ones, making it work better for some reason, I had the assistance of a friend in fixing the issue, and safe to say it solved it . Dialogue sytem has only been changed slightly so not much point documenting the changes, spacing, timing of letters, ect. . Sorry for short devlog, I hope I have more tommorrow.
Dev Log #29 . I’m pretty close to finishing the code side of my game now, the rest of my efforts will soon be focous toward things like: Writing dialogue Making nicer looking UI Making tiles look good rather than coloured blocks Animations Music Today I did the following: Re made the dialogue system AGAIN Created a gun selection screen My dialogue system displays a word at a time and plays a short noise for each word shown, similarily to undertale voice blips. However, I think it sounds quite bad and I plan to replace it with a set dialogue sound that plays at the start, like animal crossing. . My dialogue system now plays on level start and level completion, and does not re-trigger on level repeat, using similar code used in my star tracking code. . Gun select code is similar to my level select code, using a different class but the same code, just changing the lock out code to only unlock once star count is >= button number - 1 * 6, so that each button is unlocked for each 6 stars earned, as well as having the default gun already unlocked. . That’s all for today, I hope to have a complete game by the end of the month so I can have this finished before the school year starts.
Dev Log #30 . The big 30!!! . Done quite a bit today, just last bit of polishing and then we move towards UI, music, level design, ect. . Today I: FINISHED THE DIALOGUE SYTEM Added a leave waiver button (was a softlock) Added a text box to waiver [WIP] Dialogue system works fully (minus sound but thats still a win in my books). Plays on level start and level completion and once dialogue is viewed by the player, it is not shown to them again. . Mouse can be clicked to remove dialogue from the screen, without triggering bullet fire. . Also fixed the issue of the text backround being displayed on re-entry and re-completion of the level, but fixed that easily with a variable, setting it to true or false if level had already been completed, then only displaying the text bg when it was true. . Waiver leave button pretty simple, basic pygame rect collidepoint detection. . Text box sets text_active to true on mouse click, mouse clicks anywhere else set it to false, meaning player can only type when they have clicked on it (when they want to). . I appened every event.unicode into a list on key press, meaning I had a list of the players key storkes, then screen.blitted each letter in the list. . Final touches are making all fields complete required to acess button that is a hyperlink to video of me completing stages with instuctions to help, and also backspace and enter and wordwrap working with the text_box. . Then I think I’m done for the most part on the coding side of things, and will move onto level creation. . The only thing I haven’t completed from my long list from a preious dev_log are: Level editor Upside down ability James bond level start Hint dialogue on multiple deaths Boss fight Not to say these aren’t going to be added but they are not simple things and will not really add to much to my game in all honesty. Given the deadline of end of this month I have given myself, I don’t know if I will have time to add these (except for the James bond level start thing as that is a UI thing that will require art, music ect so might work on that when not coding. . That’s all, thanks for reading (:
Dev Log #31 . I AM FINISHED!!! . Well, pretty much at least. . Today I: Completed the Waiver Made some more levels I made it so that the text box works with word wrap, enter key and backspace key. . I did this by splitting the text into words and lines, then checking each word’s width against the rect boundaries. . If the word exceeds the boundaries x, the texts’ x position is reset and the Y-coordinate is incremented, creating a new line. . The Enter key creates a new line by resetting x and incrementing y, while Backspace removes the last character from the text string, preventing it from being displayed. . The waiver now checks if all fields are filled and allows you to press a button that is connected to a hyperlink that will, in the future, take you to a video created my me showing how each level is complete. . Also made 12 levels today, each new feature is slowly implemented one at time. . That’s all for today.
Dev Log #32 . Made 50 levels today, that is all. . Every 3 levels, a new ability/feature is added. This allows the player to get used to the new thing added, making their later appearance managble as the player is now used to how they function. . I have not set the player and goal location co-ordinates for each level, or other variables like if mini stars are required. . That’s all for today.
Dev Log #33 . As you can probably guess, I have done alot I have done the following: • Gave all levels the correct level variables • Made buttons work correctly when rotated • Made teleport bullets work as intended • Made gates and broken tiles allow bullets to pass through when collision is removed • Created an EXE file of my game for friends to use for playtesting • Made a stat tracker to use playtest information to improve my game • Corrected all file directories that had to be moved for PyInstaller to work properly • Fixed the Easter egg room so it now loads correctly • Added AI declaration comments That is a lots, so let me quick fire explain how i did them Painful repetition, change variables, restart level, change tiles, reset level, change ability position, reset. Repeat for level in levels (do this 50 times) . This was partially assisted by AI, but from what I understand the buttons’ Tiled rotation number is used to adjust the collision rectangle’s position so it matches the rotated button object in tiled. Collision check works as did previously. . Teleport bullets originally tp the player if a bullet fired priviously hit a way after pickup, despite no bullet being fired after pickup and also sometimes caused the player to shoot downwards through tiles. . I fixed the wrong bullet tp by using a self.variable rather than a global one as previously, allowing each bullet to know if they were teleport enabled, rather than all bullets being teleport enabled. . The tile collision isssue was fixed by by moving the player backwards along the bullet’s path until they are outside the tile, preventing the gun from passing through walls and being pulled down . This one will just explain itself (if tile in list, then ignore kill on contact): for tile in Tiles.tiles: if self.rect.colliderect(tile["rect"]): tile_property = tile["property"].get("type") if tile_property in Tiles.open_gates: continue This used pyinstaller, not something i really code or anything so, I’ll just say i did it sucessfully . Stat tracker records bullet count, time and deaths/restarts that a level took on completion. Difficulty of a level can also be decided by a play tester by pressing any number button during a level. . This data is level specific, and on key press of /, will create a json file that holds all the data, which can then be sent for me for review of things like bullet max, time complete bonus time, ect. . Self explanatory, just changed things like “Image/buttn.png” to “Game/Image/button.png” . Restart all function was required in load room function as it contains map load, so the level map that was supposed to load is not displayed instead of the secret easter egg map. . 9.Should have declared AI usage earlier, but I have been checking my chat history and I have been able to determine what sections of my code are AI generated . That’s all, gotta try and keep my daily streak alive this time to score myself a free plush.
Dev Log #34. . Just cleaning some things up now, we are in the home stretch . I did the following: Updated assest Updated object display code fixed broken dialogue Most assets have a fresh new look created in photopea . Buttons can now be loaded at rotated orientations . Dialogue now does display and does not disapear on first level load. This is because the start playing state was being skipped, i fixed this by using a continue, which skipped the rest of the current loop iteration, preventing the start-state code from continuing to run after changing playing_state. . Thats all, most of my time when into design. See you next devlog
Dev Log #35 . Been a bit distracted from this project due to school starting but I’ve been able to get a few things done. . I have done the following: Finished dialogue texts Made it so that dialogue box only appears when there is text Given kill tiles rotatable counterparts Added muzzle flash Added ability pick up sounds Updated a few more assets My Git commits have started to get a bit sloppy as i do these little bits on during my free periods, but im getting back into the swing of things . The dialogue box will only appear if text != “” and will put the player in the start playing state, without requiring a mouse click like it did previously. . Adding sounds was pretty simple so I wil leave an example bellow if self.rect.colliderect(ability["rect"]): if self.gravity_flip > 0: up_gravity_fx.play() else: down_gravity_fx.play() ability["collected"] = True self.gravity_flip *= -1 That’s all, I think 20/09/2026 will be a date for the books as I’m confident I will be finished by then. ALSO, if anyone sees this before ship, could you let me know any ideas for what my 16x16 tile for regular tiles could look like? Many thanks if you respond
Dev Log #36 . I have done most of the updating of UI, having only a few assests left and one level left to edit. . In addition to this, I have also made it so that buttons now appear pressed when pressed, rather than disappearing. . My easter egg room also stops the music correctly on level complete. . The final objectives are as follows: Have gun select each have image of gun Waiver has displayed text Hint video made and linked correctly All button can only be pressed when on screen Finish misc Assets Add death, win, and coins/stars collected based on mission objectives complete Thats all, I think 20/09/2026 could still be the date for the books, but I’ve got to put the burners on to get this finsished to a level of polish I’m happy with.
Dev Log #37 . All code is 100% complete now, the only thing left to do is finish all of the UI and then I am ready to ship. . Today I: Fixed portals Added level skip button Displayed bonus objectives Made button rotation work when pressed also Made gun select display gun images Portal code issue was caused by object overlapping with tiles, cause tile collision resolution to push the player out of the tile, and at times out of the map. Fixed this by teleporting player slightly above the object (above being determined by orientation). . Level skip increases player level, restarts level and spawns player in next level. . Bonus objectives screen.blitted on win, text appears green when objective met, red when it hasn’t . Used updated rotated button rect rather then previous and changed screen.blit to use center of rect rather than topleft . For each button in gun group, i screen.blited that gun into the center of the select gun skin rect . Thats all, hope to ship by tonight.
Dev Log #38 . DONE . I did the following: Added music that plays while in level Removed copyrighted music Finished all GUI Made code neat using ruff Will ship at some point soon. See you on ship day!!!!
Dev Log #39 . THE FINAL DEV LOG . I am finally ready to ship!!! . I did the following: Made a working read me Made a working exe file of my game Removed de-bugging features so game works as intended. Stopped music overlap from happening Removed all copyrighted music (may have mentioned this previously) I used pyinstaller tocreate my exe file. . Level buttons now only work if player max player level is less than or equal to the level you are selecting. . Stopped music overlap by puting stop music into every game state + in load room function . Its been a pleasure to take part in the stardance event. Lets have a look to see how far this project has come!!!
Ships:
Barrel Roll Bullet A recoil-based platformer where, instead of traditional jumping and movement, you shoot to propel yourself around each level. My game includes multiple abilities, unlockable gun skins and 50 levels. The biggest challenge I faced was developing an accurate and efficient collision system. Initially, I planned to use AABB collision, but because it relies on rectangular bounding boxes, I found that the gun barrel could appear to float when rotating or interacting with objects. I then experimented with mask collision to achieve pixel-perfect accuracy. However, using a large number of masks throughout a level caused noticeable drops in performance. I eventually settled on a middle ground using SAT (Separating Axis Theorem) polygon-based collision. This provided much more accurate collision detection for the rotating gun while being significantly more performant than mask collision, allowing me to maintain both responsive gameplay and consistent performance. I am proud of the persistence I have demonstrated throughout the project. During the early stages of development, I encountered significant gaps in my knowledge, particularly as I was new to object-oriented programming. At times, I struggled with seemingly simple tasks, such as correctly initialising a game window or positioning a rectangle where I intended it to be. Despite these difficulties, I continued to learn, troubleshoot and refine my approach rather than abandoning features when they became challenging....
|
1792853549.024615
|
1792939949.024615
|
|
51360
|
The "I Don't even Know (IDeK) Game" by The "I Don't even Know (IDeK) Game" by @Synxed | Stardance...
|
Synxed
|
1
|
28.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T07:54:49Z", "hours": 28.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I guess this game is ready for its first ship! While it’s not quite in Ship -Shape, It has plenty of cool features that I have spent a LOT of time working on (T^T I hate CSV files SOB). I greatly appreciate feedback, so please leave any issues or suggestions you find in the comments please. I also ask that anyone testing out this project ensure that they have read my README.MD file and have python 3 installed on their laptop/device (I tried running it on a new laptop and got very confused when it didn’t work T^T… Stupid me!). Anyway, thank you for taking the time to read this! (BongoCat is still absent D: Perhaps we will see his return soon… ) -Ta!", "repo": "https://github.com/toosynxed/I-Don-t-even-Know--IDeK--Game", "demo": "https://github.com/toosynxed/I-Don-t-even-Know--IDeK--Game/releases/tag/v1.0"}]...
|
[{"post_id": 73022, "ts": "202 [{"post_id": 73022, "ts": "2026-09-24T07:17:26Z", "hours": 1.0525, "text": "Final Work Before First Ship! Not a lot of work done, mostly just documentation fix-ups and explanations. I did fix up the login/account creation issues between the menu and main files (found when I actually tried to run the entire process instead of just the menu files). So yeah, If you are reading this, please feel free to head to my GitHub project page and download the Pre-Alpha release and follow the instructions in my README.MD file on how to get it working! (BongoCat still not here D: ) -Ta!"}, {"post_id": 71608, "ts": "2026-09-21T04:51:41Z", "hours": 4.9222, "text": "Achievements and Inventory! So, a bit of work has been done, and I might end up just shipping this off as Stardance is coming to a close soon. But here is what has been done! Implemented Bit-wise values/functions for both inventory and achievements for players. Also created a Bit-wise value that tracks if a player has viewed an achievement just yet, not displaying the “NEW” tag after the player has viewed it once. Some more work to come hopefully, but I think I mainly just need to get the central system working so that there is actually a game to play, and not just a whole bunch of features that must manually be toggled inside CSV files to operate anything! Anyways, thanks for reading! (Sorry, ): BongoCat has unfortunately been lost to the ages of storage caps D: ) -Ta !"}, {"post_id": 61162, "ts": "2026-09-03T23:02:04Z", "hours": 10.5028, "text": "I Guess I Fixed It???? IDeK Tbh… What has been done? Created a sorting function that iterates throughout a csv-list using a “shell sorting” (nesting) method (inspired by the YouTube short: https://youtu.be/RDFGkBE2O50?si=yXnJloCW18_o94bB ). Created the visual display of the leaderboard for the terminal game (using the body_text() helper function that I made earlier. Started to try to create a function that takes the integer values that are to be displayed on the leaderboard, and inserts in commas where appropriate: def format_numbers_2(orig): string = str(orig) split_curr = list(string) split_check = list(string) while len(split_curr) > 3: split_curr = split_curr[:-3] split_check.insert(-3,\",\") return \"\".join(split_check) Which only works some of the time… (It still needs a lot of work…) Honestly, I have been strugling with this function, but I think the issue with why I have been unable to get it to work correctly, is because I have not been planning enough around the logic beforehand (Which is my aim going forward). So, what’s next? Pretty much just getting this comma function working, so that the leaderboard display doesn’t look like this! ----------- Welcome, Test User ----------- Cash Leaderboard: 1. four - $21212314.0 2. hill - $5040.0 3. ardangeorge - $5000.0 4. test - $2323.0 5. Ardan George - $502.06 ------------------------------------------ Anyway, thanks for reading! (And don’t forget to say Hi to BongoCat! ) -Ta!"}, {"post_id": 56572, "ts": "2026-08-28T11:51:37Z", "hours": 5.0236, "text": "Brain Implosion Score: 8/10 Honestly, I have not been having much fun lately… Lots of errors for a single function that should be relatively simple! All it needs to do is read each row from a CSV file and order the rows in a list by ascending value for a specific column in the rows. Easy? Right? NO. IT. IS. NOT! This has taken me around 5 hours already! Just to get to a stage where I have finally given up, and have given my AI agent the function and asked it to locate each area that is not working. So, how many areas were there? LIKE 50 MILLION LINES I honestly do not have the brain -width to handle this right now, so I am just going to log my progress and go and vegetate while watching some YouTube now 😭 … Please send some coding help… I need it… (You can check out the menu_terminal.py files on my GitHub under the terminal branch, function: open_leaderboard() ). Don’t forget to say hi to BongoCat! -Ta!"}, {"post_id": 55498, "ts": "2026-08-27T11:53:27Z", "hours": 0.7961, "text": "Bit of an update again! I have ended up switching from just a python Tkinter window version of the command-line game, and instead have switched to a website HTML based version. This will also make it much easier for me to be able to write a lot of the code myself compared to Tkinter. What is my plan going forward? What I think will work best with my coding experience is for me to continue to write in the new features for my game as if they were still in terminal-format, and have AI transform it into the HTML version. This way, I still preserve my originality of ideas and code, but significantly widens the opportunities for further interactivity for my game! Don’t forget to say hi to BongoCat! -Ta! Here is a little snek-pek on the first iteration of the HTML version:"}, {"post_id": 55466, "ts": "2026-08-27T10:21:33Z", "hours": 0.27, "text": "I am beginning to question my sanity… Given the nature of a “stock” market mini-game such as the one in my game, I am beginning to think that perhaps the command-line is not the best place to be interacting with this in. Soooo… I think I’ve gone mad! I am going to start (attempt to at least, might need a bit of AI help ) to port everything across into something like Tkinter… This might go terribly… Say hi to BongoCat! !"}, {"post_id": 55456, "ts": "2026-08-27T09:55:41Z", "hours": 1.0306, "text": "The “Stock” Market Please note that any values or labels in this game are in no way representative of any real-life item, market or currency, and are purely theoretical and random numerical values generated for the sole purpose to be used for this game Creation of the base system: So far, (And it’s been a bit of a struggle), I have begun to lay out the foundations of the “stock” market system for my game, where players can invest in 3 different “risk levels” with differing characteristics to gain (or lose) currency (not yet implemented). I have spent a bit of time on GoodNotes on my iPad, writing out a plan and description of the features and characteristics of the “stock” market, as well as I have begun coding the “market.py” file that will handle the market functions that can be referenced from “main.py”. This has not gone very well , and my progress has slowed. Just the basic functions of the market system are beginning to seem very complex, with a lot of csv retrieval based off conditional statements and checks, calculations performed off specific rows, and logic statements that are making my head hurt! What I have right now: Pretty much, I have created the functions to initialise the 3 different “risk levels” with random values (using random.uniform for float values for cents), and begun the function that causes market changes (will be executing every 3 seconds or so) by calculating changes based off conditions surrounding the previous few market values for each “risk level”. Whilst this may seem simple enough, the need to keep searching the csv file for “risk”-specific rows, is causing my brain to begin imploding I think it is coming along well, but I fear that this will take a decent amount of time to complete just this one function (and then I have to do purchasing and selling ). So please wish me luck D: I hope my brain doesn’t decide to spontaneously combust! Say hi to BongoCat! -Ta!"}, {"post_id": 55393, "ts": "2026-08-27T06:08:37Z", "hours": 0.6569, "text": "Just a quick update on the game: I have just fixed a small bug with the “get” type of the “csv_actions” function that was not accurately looping through all entries to locate the correct row. But that has now been fixed luckily. Also just touched up the “body_text” function (which is the main handler for all the text printing) to accept an option parameter “timing” that can be used in the typewriting effect type to change alter the speed for debug and testing purposes. The function has a default value of 0.5 seconds so that the code will still run as normal if a valid value is not entered into the terminal. (Say hi to BongoCat !) Much more to come! And hopefully some actual game content (maybe a mini simulated stock-market !). -Ta!"}, {"post_id": 54876, "ts": "2026-08-26T02:40:58Z", "hours": 1.0692, "text": "So far, I have now completed the user account creation process for new users, and also added log-in capabilities for users that enter a pre-existing username into the game (uses .lower( ) when checking to minimise accidental account duplication accidents). I have also increased the csv function capabilities, with a new “check” and “get” branch, that supports checking an input to see if it exists in a specific column in any csv, as well as returning a row that has a matching column value that is inputted (is flexible and allows you to modify the input when the function is called to change the scope or target of the location and retrieval) A lot of my functions and processes for my game are now soft-coded, and are very versatile and malleable for different uses going forward with the project, which will continue to be a great benefit for both my coding experience and code readability! Additionally, I have also begun to use ANSI escape sequences in my print statements so that I can utilise font styles. Also, really cool thing this! I found online a python function snippet that actually allowed you to replace your inputted text with hashes or any other character instantly as you type it, allowing me to recreate a sort of privacy guard when users are inputting their passwords to log-in! 🔥 Thanks for reading!"}, {"post_id": 50230, "ts": "2026-08-19T11:38:37Z", "hours": 2.8489, "text": "Initialisation of IDeK! Hmm… It is interesting how the mind works, you begin with one idea… and suddenly find yourself a hour later working on something completely different… This has been me! What began as a project to create a mod for the Steam game: “BongoCat” for a friend turned into a terminal python-based game project! So far, I have started creating the introduction phase/stage of the game, beginning by asking for the user to enter a name, and then has some animations. Initially I was just going to hardcode everything in, including the print statements, but then I thought: “Hey! Why not turn this mini project into a learning experience and try out writing function files that I can use throughout the project by softcoding them!” And I did! What Do I Have Right Now? Aside from “main.py” , there are currently a few other notable files: “functions.py” - which holds the python functions that are used in main, “gen_pass.py” - Which was an AI generated python script to quickly generate 50 random “passwords” from merging a list of words, creating the file: “pass_list.csv” , and lastly, “user_pass.csv” - which serves as a temporary CSV file for storing some user data for the game. Something Really Cool! I ended up falling down into a little bit of a “rabbit-hole” sort of situation here. And spent some time working on expanding my main print function to include a really cool print effect that mimics a typewriter-animation. To do this, I ended up using two nested “ for i in range() ”’s, and a function that runs “os.system(‘clear’)” . The final product? A softcoded function that can be parsed any string or line of text to display with that printing animation! Really cool stuff ngl! And I shall continue to expand the content (hopefully I will actually have something for players to do by next dev-log, but tbh… “I Don’t even Know”"}]...
|
Title: The "I Don't even Know (IDeK) Game& Title: The "I Don't even Know (IDeK) Game" by @Synxed | Stardance
Devlogs:
Initialisation of IDeK! Hmm… It is interesting how the mind works, you begin with one idea… and suddenly find yourself a hour later working on something completely different… This has been me! What began as a project to create a mod for the Steam game: “BongoCat” for a friend turned into a terminal python-based game project! So far, I have started creating the introduction phase/stage of the game, beginning by asking for the user to enter a name, and then has some animations. Initially I was just going to hardcode everything in, including the print statements, but then I thought: “Hey! Why not turn this mini project into a learning experience and try out writing function files that I can use throughout the project by softcoding them!” And I did! What Do I Have Right Now? Aside from “main.py” , there are currently a few other notable files: “functions.py” - which holds the python functions that are used in main, “gen_pass.py” - Which was an AI generated python script to quickly generate 50 random “passwords” from merging a list of words, creating the file: “pass_list.csv” , and lastly, “user_pass.csv” - which serves as a temporary CSV file for storing some user data for the game. Something Really Cool! I ended up falling down into a little bit of a “rabbit-hole” sort of situation here. And spent some time working on expanding my main print function to include a really cool print effect that mimics a typewriter-animation. To do this, I ended up using two nested “ for i in range() ”’s, and a function that runs “os.system(‘clear’)” . The final product? A softcoded function that can be parsed any string or line of text to display with that printing animation! Really cool stuff ngl! And I shall continue to expand the content (hopefully I will actually have something for players to do by next dev-log, but tbh… “I Don’t even Know”
So far, I have now completed the user account creation process for new users, and also added log-in capabilities for users that enter a pre-existing username into the game (uses .lower( ) when checking to minimise accidental account duplication accidents). I have also increased the csv function capabilities, with a new “check” and “get” branch, that supports checking an input to see if it exists in a specific column in any csv, as well as returning a row that has a matching column value that is inputted (is flexible and allows you to modify the input when the function is called to change the scope or target of the location and retrieval) A lot of my functions and processes for my game are now soft-coded, and are very versatile and malleable for different uses going forward with the project, which will continue to be a great benefit for both my coding experience and code readability! Additionally, I have also begun to use ANSI escape sequences in my print statements so that I can utilise font styles. Also, really cool thing this! I found online a python function snippet that actually allowed you to replace your inputted text with hashes or any other character instantly as you type it, allowing me to recreate a sort of privacy guard when users are inputting their passwords to log-in! 🔥 Thanks for reading!
Just a quick update on the game: I have just fixed a small bug with the “get” type of the “csv_actions” function that was not accurately looping through all entries to locate the correct row. But that has now been fixed luckily. Also just touched up the “body_text” function (which is the main handler for all the text printing) to accept an option parameter “timing” that can be used in the typewriting effect type to change alter the speed for debug and testing purposes. The function has a default value of 0.5 seconds so that the code will still run as normal if a valid value is not entered into the terminal. (Say hi to BongoCat !) Much more to come! And hopefully some actual game content (maybe a mini simulated stock-market !). -Ta!
The “Stock” Market Please note that any values or labels in this game are in no way representative of any real-life item, market or currency, and are purely theoretical and random numerical values generated for the sole purpose to be used for this game Creation of the base system: So far, (And it’s been a bit of a struggle), I have begun to lay out the foundations of the “stock” market system for my game, where players can invest in 3 different “risk levels” with differing characteristics to gain (or lose) currency (not yet implemented). I have spent a bit of time on GoodNotes on my iPad, writing out a plan and description of the features and characteristics of the “stock” market, as well as I have begun coding the “market.py” file that will handle the market functions that can be referenced from “main.py”. This has not gone very well , and my progress has slowed. Just the basic functions of the market system are beginning to seem very complex, with a lot of csv retrieval based off conditional statements and checks, calculations performed off specific rows, and logic statements that are making my head hurt! What I have right now: Pretty much, I have created the functions to initialise the 3 different “risk levels” with random values (using random.uniform for float values for cents), and begun the function that causes market changes (will be executing every 3 seconds or so) by calculating changes based off conditions surrounding the previous few market values for each “risk level”. Whilst this may seem simple enough, the need to keep searching the csv file for “risk”-specific rows, is causing my brain to begin imploding I think it is coming along well, but I fear that this will take a decent amount of time to complete just this one function (and then I have to do purchasing and selling ). So please wish me luck D: I hope my brain doesn’t decide to spontaneously combust! Say hi to BongoCat! -Ta!
I am beginning to question my sanity… Given the nature of a “stock” market mini-game such as the one in my game, I am beginning to think that perhaps the command-line is not the best place to be interacting with this in. Soooo… I think I’ve gone mad! I am going to start (attempt to at least, might need a bit of AI help ) to port everything across into something like Tkinter… This might go terribly… Say hi to BongoCat! !
Bit of an update again! I have ended up switching from just a python Tkinter window version of the command-line game, and instead have switched to a website HTML based version. This will also make it much easier for me to be able to write a lot of the code myself compared to Tkinter. What is my plan going forward? What I think will work best with my coding experience is for me to continue to write in the new features for my game as if they were still in terminal-format, and have AI transform it into the HTML version. This way, I still preserve my originality of ideas and code, but significantly widens the opportunities for further interactivity for my game! Don’t forget to say hi to BongoCat! -Ta! Here is a little snek-pek on the first iteration of the HTML version:
Brain Implosion Score: 8/10 Honestly, I have not been having much fun lately… Lots of errors for a single function that should be relatively simple! All it needs to do is read each row from a CSV file and order the rows in a list by ascending value for a specific column in the rows. Easy? Right? NO. IT. IS. NOT! This has taken me around 5 hours already! Just to get to a stage where I have finally given up, and have given my AI agent the function and asked it to locate each area that is not working. So, how many areas were there? LIKE 50 MILLION LINES I honestly do not have the brain -width to handle this right now, so I am just going to log my progress and go and vegetate while watching some YouTube now 😭 … Please send some coding help… I need it… (You can check out the menu_terminal.py files on my GitHub under the terminal branch, function: open_leaderboard() ). Don’t forget to say hi to BongoCat! -Ta!
I Guess I Fixed It???? IDeK Tbh… What has been done? Created a sorting function that iterates throughout a csv-list using a “shell sorting” (nesting) method (inspired by the YouTube short: https://youtu.be/RDFGkBE2O50?si=yXnJloCW18_o94bB ). Created the visual display of the leaderboard for the terminal game (using the body_text() helper function that I made earlier. Started to try to create a function that takes the integer values that are to be displayed on the leaderboard, and inserts in commas where appropriate: def format_numbers_2(orig): string = str(orig) split_curr = list(string) split_check = list(string) while len(split_curr) > 3: split_curr = split_curr[:-3] split_check.insert(-3,",") return "".join(split_check) Which only works some of the time… (It still needs a lot of work…) Honestly, I have been strugling with this function, but I think the issue with why I have been unable to get it to work correctly, is because I have not been planning enough around the logic beforehand (Which is my aim going forward). So, what’s next? Pretty much just getting this comma function working, so that the leaderboard display doesn’t look like this! ----------- Welcome, Test User ----------- Cash Leaderboard: 1. four - $21212314.0 2. hill - $5040.0 3. ardangeorge - $5000.0 4. test - $2323.0 5. Ardan George - $502.06 ------------------------------------------ Anyway, thanks for reading! (And don’t forget to say Hi to BongoCat! ) -Ta!
Achievements and Inventory! So, a bit of work has been done, and I might end up just shipping this off as Stardance is coming to a close soon. But here is what has been done! Implemented Bit-wise values/functions for both inventory and achievements for players. Also created a Bit-wise value that tracks if a player has viewed an achievement just yet, not displaying the “NEW” tag after the player has viewed it once. Some more work to come hopefully, but I think I mainly just need to get the central system working so that there is actually a game to play, and not just a whole bunch of features that must manually be toggled inside CSV files to operate anything! Anyways, thanks for reading! (Sorry, ): BongoCat has unfortunately been lost to the ages of storage caps D: ) -Ta !
Final Work Before First Ship! Not a lot of work done, mostly just documentation fix-ups and explanations. I did fix up the login/account creation issues between the menu and main files (found when I actually tried to run the entire process instead of just the menu files). So yeah, If you are reading this, please feel free to head to my GitHub project page and download the Pre-Alpha release and follow the instructions in my README.MD file on how to get it working! (BongoCat still not here D: ) -Ta!
Ships:
I guess this game is ready for its first ship! While it’s not quite in Ship -Shape, It has plenty of cool features that I have spent a LOT of time working on (T^T I hate CSV files SOB). I greatly appreciate feedback, so please leave any issues or suggestions you find in the comments please. I also ask that anyone testing out this project ensure that they have read my README.MD file and have python 3 installed on their laptop/device (I tried running it on a new laptop and got very confused when it didn’t work T^T… Stupid me!). Anyway, thank you for taking the time to read this! (BongoCat is still absent D: Perhaps we will see his return soon… ) -Ta!...
|
1792853728.0846305
|
1792940128.0846305
|
|
64124
|
OmniWallpapers Showcase by @OmniKing | Stardance
|
OmniKing
|
1
|
8.8
|
13
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T07:41:29Z", "hours": 7.0, "multiplier": 1.95, "payout": 13, "blessing": "neutral", "text": "I made the Website which showcase my wallpapers on it with design which I coded with using any AI or anybody help I am proud that I made the website solely on custom code which looks Amazing to mee and helps me show that I am capable of doing things without any ones help. It shows people that how much beautiful my wallpapers is and let them watch the very own design of me that I code don’t draw . I am also going to add more things on this website of mine in the future . And also that this website also become one of my official pubic website which is connected to the domain and any one in the world can go and see it interact with it or go to download the wallpaper they like . This website name is OmniShowcase and here is the url of the website https://omnishowcase.omniords.com paste this url on your browser and see my website At the last I say that I like building stuff and I am proud on me that I build this website Hope you guys like my website😁.", "repo": "https://github.com/Omniking175/OmniWallpapers-Showcase", "demo": "https://omnishowcase.omniords.com/"}]...
|
[{"post_id": 76769, "ts": "202 [{"post_id": 76769, "ts": "2026-10-04T15:04:48Z", "hours": 1.7986, "text": "Today i added some new Laptop and Mobile wallpapers to my site"}, {"post_id": 73008, "ts": "2026-09-24T06:36:23Z", "hours": 1.5203, "text": "Finaly , I completed website OmniShowcase. I am going to ship it. Today I made two new page Laptop page and Mobile page made the background gradient all links are clickable website have three pages you can go to them from navbar which has three page linked first one is home page, second one is laptop page and third one is mobile page on there pages you can see the details of the wallpapers and if you like them you can download them from the link which redirects you to omniwallpapers.omniords.com which is also my website . The details I added are like Name of the wallpaper , category of it , keywords related to the wallpaper etc. I did’nt use any Ai in building this website . Today I am shipping it but in this website I going to add more things more wallpapers in it in the future. Also this is my first open source code website(project) all my previous websites are not open source even though I make those websites also with custom code without using any AI or help i build those websites through self thought coding and learning things . My website OmniShowcase(this website👇) also have some hover effects it it on the navbar on the download link. Also this is my first project on stardance I really really like my website and also hope you guys also like it after shiping it I am going to make something new most likely from mission section . anyways thanks . Hope you guys like it😁😁."}, {"post_id": 72950, "ts": "2026-09-24T02:57:56Z", "hours": 0.4022, "text": "Hi today I added new wallpaper some changes and going to add some more than ship my project"}, {"post_id": 72674, "ts": "2026-09-23T13:53:11Z", "hours": 1.4339, "text": "Today I added some new pages and new wallpaper and seted everything with the class and done the css now i have only to copy paste my code and change some minor changes to make a new section I am going to ship this website tommorow. hope you all like it."}, {"post_id": 72226, "ts": "2026-09-22T14:19:40Z", "hours": 1.3153, "text": "Hi everyone today i added the proper title of my wallpaper , the category of the wallpaper with the keyword inside the box change the name of the website change the logo font also added wallpaper download button which redirects you to OmniWallpapers download page of this wallpaper. hope it’s good looking and when I ship it I hope this website get good comments"}, {"post_id": 71775, "ts": "2026-09-21T14:56:43Z", "hours": 1.1747, "text": "Devlog #2 Hi every body today i added 1st wallpaper on home screen and created a box but i don’t know how to make that box in the left bottom of the wallpaper if anybody of you know to do it please tell me and those words in the box are just rough words hope you like this devlog"}, {"post_id": 71269, "ts": "2026-09-20T15:34:24Z", "hours": 0.6589, "text": "Hi Everyone I am OmniKing the new bee here but not a pure new bee in coding and creating custom coded things without using ai but this here is my first open-source website here on stardance I am starting this website today by doing stuffs so the website name is OmniWallpapersShowcase this website is an showcase website for my wallpapers which is on my another website OmniWallpapers which is an wallpapers website where you can download 4K wallpapers so this website is going to showcase my wallpapers I just started this website I just make an home page and navbar on it Hope you guys Like it"}]...
|
Title: OmniWallpapers Showcase by @OmniKing | Star Title: OmniWallpapers Showcase by @OmniKing | Stardance
Devlogs:
Hi Everyone I am OmniKing the new bee here but not a pure new bee in coding and creating custom coded things without using ai but this here is my first open-source website here on stardance I am starting this website today by doing stuffs so the website name is OmniWallpapersShowcase this website is an showcase website for my wallpapers which is on my another website OmniWallpapers which is an wallpapers website where you can download 4K wallpapers so this website is going to showcase my wallpapers I just started this website I just make an home page and navbar on it Hope you guys Like it
Devlog #2 Hi every body today i added 1st wallpaper on home screen and created a box but i don’t know how to make that box in the left bottom of the wallpaper if anybody of you know to do it please tell me and those words in the box are just rough words hope you like this devlog
Hi everyone today i added the proper title of my wallpaper , the category of the wallpaper with the keyword inside the box change the name of the website change the logo font also added wallpaper download button which redirects you to OmniWallpapers download page of this wallpaper. hope it’s good looking and when I ship it I hope this website get good comments
Today I added some new pages and new wallpaper and seted everything with the class and done the css now i have only to copy paste my code and change some minor changes to make a new section I am going to ship this website tommorow. hope you all like it.
Hi today I added new wallpaper some changes and going to add some more than ship my project
Finaly , I completed website OmniShowcase. I am going to ship it. Today I made two new page Laptop page and Mobile page made the background gradient all links are clickable website have three pages you can go to them from navbar which has three page linked first one is home page, second one is laptop page and third one is mobile page on there pages you can see the details of the wallpapers and if you like them you can download them from the link which redirects you to omniwallpapers.omniords.com which is also my website . The details I added are like Name of the wallpaper , category of it , keywords related to the wallpaper etc. I did’nt use any Ai in building this website . Today I am shipping it but in this website I going to add more things more wallpapers in it in the future. Also this is my first open source code website(project) all my previous websites are not open source even though I make those websites also with custom code without using any AI or help i build those websites through self thought coding and learning things . My website OmniShowcase(this website👇) also have some hover effects it it on the navbar on the download link. Also this is my first project on stardance I really really like my website and also hope you guys also like it after shiping it I am going to make something new most likely from mission section . anyways thanks . Hope you guys like it😁😁.
Today i added some new Laptop and Mobile wallpapers to my site
Ships:
I made the Website which showcase my wallpapers on it with design which I coded with using any AI or anybody help I am proud that I made the website solely on custom code which looks Amazing to mee and helps me show that I am capable of doing things without any ones help. It shows people that how much beautiful my wallpapers is and let them watch the very own design of me that I code don’t draw . I am also going to add more things on this website of mine in the future . And also that this website also become one of my official pubic website which is connected to the domain and any one in the world can go and see it interact with it or go to download the wallpaper they like . This website name is OmniShowcase and here is the url of the website https://omnishowcase.omniords.com paste this url on your browser and see my website At the last I say that I like building stuff and I am proud on me that I build this website Hope you guys like my website😁....
|
1792814102.6518319
|
1792900502.6518319
|
|
65318
|
Real Estate Portfolio Website by @ctanmay334 | Sta Real Estate Portfolio Website by @ctanmay334 | Stardance...
|
ctanmay334
|
1
|
8.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T07:25:13Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Just a basic website. But really put up all my effort to build it from basic, evrything from basic to adcvanced is built by me. All the animations were a hefty task to d but i did it.", "repo": "https://github.com/tanmayybuilds/realty-blueprint", "demo": "https://vipinchoudhary.com/"}]...
|
[{"post_id": 73007, "ts": "202 [{"post_id": 73007, "ts": "2026-09-24T06:31:52Z", "hours": 8.0814, "text": "IT was awesome and a whoel new experince to build a production grade website"}]...
|
Title: Real Estate Portfolio Website by @ctanmay33 Title: Real Estate Portfolio Website by @ctanmay334 | Stardance
Devlogs:
IT was awesome and a whoel new experince to build a production grade website
Ships:
Just a basic website. But really put up all my effort to build it from basic, evrything from basic to adcvanced is built by me. All the animations were a hefty task to d but i did it....
|
1792817238.9734354
|
1792903638.9734354
|
|
64188
|
My Personal Site by @UmarFarooq | Stardance
|
UmarFarooq
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T07:10:37Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Its my personal site that I have created for Hackclub Stardance Challenge. Sections: Header: Name and social links About Skills: Frontend, Backend, Database Projects: Live Demo and source code links for each project Tech Stack: React (Vite) TailwindCSS for styling react-icons for icons", "repo": "https://codeberg.org/umarfarooq/my-personal-site", "demo": "https://my-personal-site-57.netlify.app/"}]...
|
[{"post_id": 71382, "ts": "202 [{"post_id": 71382, "ts": "2026-09-20T18:36:06Z", "hours": 0.395, "text": "Completed my personal site. I’ve added two more sections that are “About” and “Skills” section."}, {"post_id": 71360, "ts": "2026-09-20T18:05:44Z", "hours": 0.7536, "text": "Welcome to the first devlog of my personal site. I have first setup a vite project, then created a header and provided links of my social profiles in header. Plus, I’ve created a projects section to showcase my projects."}]...
|
Title: My Personal Site by @UmarFarooq | Stardance Title: My Personal Site by @UmarFarooq | Stardance
Devlogs:
Welcome to the first devlog of my personal site. I have first setup a vite project, then created a header and provided links of my social profiles in header. Plus, I’ve created a projects section to showcase my projects.
Completed my personal site. I’ve added two more sections that are “About” and “Skills” section.
Ships:
Its my personal site that I have created for Hackclub Stardance Challenge. Sections: Header: Name and social links About Skills: Frontend, Backend, Database Projects: Live Demo and source code links for each project Tech Stack: React (Vite) TailwindCSS for styling react-icons for icons...
|
1792814107.5236032
|
1792900507.5236032
|
|
65023
|
LOCKIN by @ctanmay334 | Stardance
|
ctanmay334
|
1
|
10.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T06:44:48Z", "hours": 10.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a meme inspired Water Reminder. In India recently Ravi Kishan Ji’s memes flooded the social media and everyone of us loved it. So i decided to build a crazy and creative water reminder which in every set time comes to remind you to drink water in the most creative manner, all his dancing memes and speaking memes brought together, so in the first step when the set time is over, the OG gucci dance will come up from one side and he will go dancing and ask you to drink water and if you try to cut it out, then hes og meme of you will have to do it will play and at every action there is a craxy meme set. GO try each action out youself. This is a Windows APPLICATION, but you can get a small demo on my website.", "repo": "https://github.com/tanmayybuilds/Creative_Water_reminder", "demo": "https://pulseaistudio.in/index12.html"}]...
|
[{"post_id": 72597, "ts": "202 [{"post_id": 72597, "ts": "2026-09-23T09:44:37Z", "hours": 10.3806, "text": "ITs a very creative water reminder application, i was trying to find a good one but couldn’t so i have made a water reminder which is inspired by craxy ravikishan memes who pops up out of nowhere in middle of your screen and you will stop yourself and get reminded to drink water, i have also posted content out of it. Checkout my insta page : tanmayy.builds"}]...
|
Title: LOCKIN by @ctanmay334 | Stardance
Devlogs: Title: LOCKIN by @ctanmay334 | Stardance
Devlogs:
ITs a very creative water reminder application, i was trying to find a good one but couldn’t so i have made a water reminder which is inspired by craxy ravikishan memes who pops up out of nowhere in middle of your screen and you will stop yourself and get reminded to drink water, i have also posted content out of it. Checkout my insta page : tanmayy.builds
Ships:
This is a meme inspired Water Reminder. In India recently Ravi Kishan Ji’s memes flooded the social media and everyone of us loved it. So i decided to build a crazy and creative water reminder which in every set time comes to remind you to drink water in the most creative manner, all his dancing memes and speaking memes brought together, so in the first step when the set time is over, the OG gucci dance will come up from one side and he will go dancing and ask you to drink water and if you try to cut it out, then hes og meme of you will have to do it will play and at every action there is a craxy meme set. GO try each action out youself. This is a Windows APPLICATION, but you can get a small demo on my website....
|
1792814193.6944509
|
1792900593.6944509
|
|
26917
|
Henkan by @Kaanreal | Stardance
|
Kaanreal
|
5
|
87.0
|
1040
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T06:37:02Z", "hours": 24.0, "multiplier": 17.32, "payout": 173, "blessing": "neutral", "text": "This update is mostly about making Henkan feel a lot more complete on desktop. You can now save conversions directly into your detected osu!stable and Etterna song folders, so there’s way less manual moving files around. I also redesigned the desktop navigation and added proper pages for conversion history and your local osu! skin library. Pack conversion got a pretty big upgrade too. You can select which difficulties you actually want to convert, review the metadata for each song, and packs using multiple audio files are now automatically separated into individual songs. I also fixed metadata handling so every map keeps its own artist, title, subtitle, audio and background instead of accidentally sharing data across the pack. Live map detection can now be controlled separately for osu! and Etterna, and Henkan remembers the background of the last map you opened even after restarting. There are a bunch of smaller fixes too: faster pack conversion, better Etterna timing and current-song detection, preserved audio bitrate when changing rates, cleaner loading states and buttons, fixed navigation, plus some macOS and Linux specific fixes. The docs were also refreshed, and Henkan finally has its new domain: https://henkan.kaan.moe", "repo": "https://github.com/kaanreal/henkan", "demo": "http://henkan.kaan.moe/"}, {"ship_num": 2, "ts": "2026-09-06T21:12:59Z", "hours": 5.0, "multiplier": 15.89, "payout": 83, "blessing": "neutral", "text": "This update is mostly about getting Henkan into more places. Henkan can now be installed through winget, Homebrew, the AUR, Chocolatey and nixpkgs. If you use a normal package manager, you don’t have to hunt down the GitHub releases anymore. The site got some attention too. All pages are usable on phones now, and shared links show a proper preview card. I also changed the app icon and logo to a new emblem, which now shows up everywhere, from the desktop app and favicon to the package managers above. Smaller fixes: the preview receptors now line up with the note art, so the editor and the game agree on how the chart looks. You can try the latest release here: https://github.com/kaanreal/henkan/releases Its really hard to provide screenshots or other things cause it is really niche", "repo": "https://github.com/kaanreal/henkan", "demo": "http://henkan.kaan.moe/"}, {"ship_num": 3, "ts": "2026-08-16T23:31:00Z", "hours": 5.0, "multiplier": 18.03, "payout": 88, "blessing": "neutral", "text": "This update is mostly about making Henkan nicer to actually use. The biggest change is the beatmap preview. It can now autoplay the chart when you leave it idle, with notes falling under the receptors like in osu!mania and the HUD staying centered. It makes it way easier to get a feel for a chart before exporting instead of just staring at static note columns. Henkan is also now available in 8 languages . While adding localization, I ended up replacing i18next with a small custom system since I really didn’t need a whole library for what Henkan uses. It’s simpler, lighter, and still covers the entire app. I also added something I’ve wanted for a while: if you import a random .osu file without its audio or background, Henkan can now try to grab the missing files from an osu! mirror automatically. So incomplete beatmap folders are a lot less annoying to deal with. There are some smaller fixes too. Skin images are handled more reliably, previews should match the actual result better, and the updater now gets the real release notes from GitHub instead of showing a placeholder. You can try the latest release here: https://github.com/kaanreal/henkan/releases Its really hard to provide screenshots or other things cause it is really niche", "repo": "https://github.com/kaanreal/henkan", "demo": "http://henkan.kaan.moe/"}, {"ship_num": 4, "ts": "2026-07-27T14:26:43Z", "hours": 32.0, "multiplier": 19.37, "payout": 387, "blessing": "neutral", "text": "Hello, I’ve continued working on Henkan, my osu!mania ↔ Etterna converter, and released several major updates since my first ship. The biggest addition is full skin conversion. Henkan can now convert osu!mania skins into Etterna noteskins and convert Etterna noteskins back into osu!mania skins. This required handling lane textures, sprite sheets, high-resolution assets, Lua files, metrics, redirects, and the different ways both games structure their skins. I also added customizable difficulty name presets. Exported charts can automatically use information such as the title, artist, creator, original difficulty name, or calculated MSD. Users can also change the column width when exporting to osu!mania. Several conversion issues were fixed, including problems with extreme BPM values, export filenames, media files, and configuration support. The web version now behaves much more like the desktop app, with matching exports and features across Rust, Tauri, and WebAssembly. I also improved the project outside of the main application. Windows builds now use NSIS installers, Henkan is available through the AUR, the documentation has been expanded, the CI workflows have been cleaned up, and I added an end-to-end test for the skin converter. Keeping the desktop and web versions consistent is still one of the hardest parts of the project, since converter changes often need separate implementations for Rust and WebAssembly. My goal is still to make Henkan the most reliable way to move charts and skins between osu!mania and Etterna without losing important data.", "repo": "https://github.com/kaanreal/henkan", "demo": "http://henkan.kaan.moe/"}, {"ship_num": 5, "ts": "2026-07-03T22:04:17Z", "hours": 21.0, "multiplier": 18.3, "payout": 309, "blessing": "neutral", "text": "Hello, I made an osu!mania ↔ Etterna converter called Henkan (変換). I started the project because I noticed that most existing converters didn’t preserve maps correctly. Timing would drift, BPM changes would be lost or simplified, and long notes would often break during conversion. I wanted to build a converter that focused on accuracy instead of quick conversions. Henkan converts beatmaps between osu!mania (.osu / .osz) and Etterna/StepMania (.sm) while preserving the original chart as closely as possible. It keeps millisecond-accurate note timing, supports multiple BPM changes, correctly converts long notes, preserves metadata such as title, artist, creator, difficulty, and preview point, and keeps background references. The application is written as a native desktop app using Rust, Tauri, and React, making it lightweight and fast on Windows, macOS, and Linux. It also supports converting entire packs, allowing users to process many maps at once instead of converting them individually. One limitation is that scroll velocity (SV) is not converted from osu!mania to StepMania because the .sm format does not have an equivalent representation for osu!’s green-line SV changes. My goal with Henkan is to provide a reliable converter that players can trust to preserve their charts accurately instead of introducing timing errors or losing important map information.", "repo": "https://github.com/kaanreal/henkan", "demo": "http://henkan.kaan.moe/"}]...
|
[{"post_id": 72835, "ts": "202 [{"post_id": 72835, "ts": "2026-09-23T20:44:40Z", "hours": 12.7947, "text": "Hello! I worked on Henkan a lot again, mostly on making the desktop app nicer and faster to actually use.One of the biggest changes is that Henkan can now save conversions directly into your detected osu!stable or Etterna song folders. So instead of exporting something and moving it into the game manually, you can just convert it and have it show up where it belongs.I also redesigned the desktop navigation and added pages for your conversion history and local osu! skins. The live map detection settings were improved too, so osu! and Etterna hooks can now be enabled separately.Pack conversion got a lot of work as well. You can select individual difficulties before converting, check the metadata for every song, and packs with different audio files are now split into separate songs automatically. I also fixed a bunch of cases where maps inside a pack could lose their own artist, title, audio or background.The converter now remembers the background of the last map you opened too, even after restarting Henkan. It’s a small thing but makes the home screen feel a lot less empty.There were also a bunch of smaller changes. Loading states and buttons are more consistent, navigation is less messy, pack conversion is faster, Etterna timing and current song detection were improved, and changing song rate now keeps the original audio bitrate.I fixed some platform specific stuff too, mainly the osu!lazer background bridge on macOS and Etterna song detection on Linux.I also refreshed the docs and finally moved Henkan to its new domain https://henkan.kaan.moe registrar might be slow so try https://henkan-chi.vercel.app/"}, {"post_id": 69360, "ts": "2026-09-16T21:49:50Z", "hours": 10.9842, "text": "Hello! I worked on Henkan again and added something I’ve wanted for a while. Henkan can now detect the map you currently have open in osu!stable, osu!lazer, or Etterna and show it directly in the converter. No tosu or any other external tool required.This makes it much faster to open Henkan and immediately work with the chart you’re currently playing or editing.Still working on making the whole workflow between osu!mania and Etterna feel as seamless as possible."}, {"post_id": 63187, "ts": "2026-09-06T21:07:39Z", "hours": 5.2017, "text": "Hello! I’ve kept working on Henkan, and shipped quite a few updates since v1.5.0. The biggest new feature is a playable beatmap preview. The editor can now autoplay charts when you’re not interacting with it, notes render underneath the receptors like they do in osu!mania, and the HUD stays properly centered. It makes it much easier to get a feel for how a chart actually plays before exporting it instead of only looking at the note data.Henkan also supports 8 languages now. While adding localization, I ended up removing i18next and replacing it with a much smaller custom localization system. Henkan doesn’t really need everything i18next provides, so this keeps things simpler and lighter.I also improved importing incomplete osu! beatmaps. If you only have an .osu file and the audio or background is missing, Henkan can now automatically try to fetch the missing files from an osu! mirror.There were also a bunch of smaller conversion fixes. Skin images are handled more reliably, and previews should now be closer to what you actually see in-game. Release notes are fetched properly from GitHub instead of using the old placeholder, and config overrides now work consistently in both conversion directions.osu! exports got some fixes too. Backgrounds are included even when the source chart doesn’t directly reference them, cdtitle files are only copied when they’re actually needed, and hold notes were cleaned up to follow the normal osu!mania format with proper hitsounds and clean samples instead of creating unnecessary or broken sound files.I’ve also been trying to close the gap between the desktop and web versions. The web build now has much closer feature and export parity with the Rust/Tauri version, and CI automatically rebuilds the WebAssembly binaries whenever something is pushed to main.Keeping both versions in sync is still one of the more annoying parts of working on Henkan, since some converter changes have to be implemented separately for Rust and WebAssembly, but it’s getting a lot better.The goal is still the same: make Henkan the most reliable way to move charts and skins between osu!mania and Etterna without randomly losing important data."}, {"post_id": 48540, "ts": "2026-08-16T23:29:21Z", "hours": 4.8736, "text": "Hello! I’ve kept working on Henkan, my osu!mania ↔ Etterna converter, and shipped quite a few updates since v1.5.0.The biggest new feature is a playable beatmap preview. The editor can now autoplay charts when you’re not interacting with it, notes render underneath the receptors like they do in osu!mania, and the HUD stays properly centered. It makes it much easier to get a feel for how a chart actually plays before exporting it instead of only looking at the note data.Henkan also supports 8 languages now. While adding localization, I ended up removing i18next and replacing it with a much smaller custom localization system. Henkan doesn’t really need everything i18next provides, so this keeps things simpler and lighter.I also improved importing incomplete osu! beatmaps. If you only have an .osu file and the audio or background is missing, Henkan can now automatically try to fetch the missing files from an osu! mirror.There were also a bunch of smaller conversion fixes. Skin images are handled more reliably, and previews should now be closer to what you actually see in-game. Release notes are fetched properly from GitHub instead of using the old placeholder, and config overrides now work consistently in both conversion directions.osu! exports got some fixes too. Backgrounds are included even when the source chart doesn’t directly reference them, cdtitle files are only copied when they’re actually needed, and hold notes were cleaned up to follow the normal osu!mania format with proper hitsounds and clean samples instead of creating unnecessary or broken sound files.I’ve also been trying to close the gap between the desktop and web versions. The web build now has much closer feature and export parity with the Rust/Tauri version, and CI automatically rebuilds the WebAssembly binaries whenever something is pushed to main.Keeping both versions in sync is still one of the more annoying parts of working on Henkan, since some converter changes have to be implemented separately for Rust and WebAssembly, but it’s getting a lot better.The goal is still the same: make Henkan the most reliable way to move charts and skins between osu!mania and Etterna without randomly losing important data."}, {"post_id": 35508, "ts": "2026-07-26T23:56:48Z", "hours": 12.4944, "text": "Henkan Devlog (v1.3.1 → v1.5.0) v1.4.0 (July 20-23) This update was mainly about skin conversion. I added support for converting osu!mania skins to Etterna noteskins and back. It ended up being much bigger than I expected, with over 1,600 lines of code just for the converter. I also added difficulty name presets with placeholders like title, artist, creator, difficulty, and MSD, fixed an issue with extreme BPM values, and added a column width setting for osu!mania exports. Outside of the app, I improved CI, switched Windows installers to NSIS, added AUR support, improved the documentation, and wrote a full end-to-end test for skin conversion. v1.5.0 (July 24-26) This update focused on making the web version behave the same as the desktop app. I fixed export names, media handling, and config support so browser exports now match Tauri. I also fixed a spacebar shortcut bug, made update notes render as Markdown, and cleaned up the CI workflows. Keeping the web and desktop versions in sync is still one of the hardest parts since every converter change has to work in both Rust and WASM."}, {"post_id": 31742, "ts": "2026-07-20T11:47:27Z", "hours": 19.8603, "text": "Devlog — Countdown fix + WASM sync Fixed countdown being on by default when converting Etterna to osu. Added Countdown: 0 to the [General] section in the converter, the dummy diff generator, and the TypeScript equivalent. Discovered the web version was using a stale pre-built WASM binary that didn’t have any of the Rust fixes. Created wasm-core/ — a new crate that builds WASM from the same Rust source via #[path] references. No code duplication. Added npm run build:wasm for local rebuilds and a CI job that auto-rebuilds WASM on push to main so it never goes stale again"}, {"post_id": 21788, "ts": "2026-07-03T22:01:33Z", "hours": 1.7431, "text": "Hello, today I polished and finished the newest version of Henkan! This version is now the most stable version that also introduced an web based app."}, {"post_id": 21102, "ts": "2026-07-02T21:55:30Z", "hours": 5.2581, "text": "Hello, today I fully worked on making my project available for the web via Vercel! I had to solve many issues like permission issues , timing issues , upload issues and more , I eventually fixed it and can say that it’s working stable now! Now I have to sleep…"}, {"post_id": 19532, "ts": "2026-06-30T21:09:08Z", "hours": 14.2728, "text": "Hello, this is my first log! I have to admit that my project is kinda niche but it fills the gaps of the rhythm game community. Short introduction : Im making an advanced osu!mania ↔ Etterna beatmap converter to simplify the mapping and playing of maps. I really depend on making it high performance and feature rich, for example: I had to go through many issues like fixing timing issues , conversion logic , or other things, but I learned from it and fixed them in a way that sets other converters in the ground. I started my project a few days before I found out about stardance hack club so im kinda sad that this time doesn’t count :(. Anyways, im happy to share my progress from now on. Today I focused on developing the CLI for my project and polishing some things, I think it turned out great"}]...
|
Title: Henkan by @Kaanreal | Stardance
Devlogs:
H Title: Henkan by @Kaanreal | Stardance
Devlogs:
Hello, this is my first log! I have to admit that my project is kinda niche but it fills the gaps of the rhythm game community. Short introduction : Im making an advanced osu!mania ↔ Etterna beatmap converter to simplify the mapping and playing of maps. I really depend on making it high performance and feature rich, for example: I had to go through many issues like fixing timing issues , conversion logic , or other things, but I learned from it and fixed them in a way that sets other converters in the ground. I started my project a few days before I found out about stardance hack club so im kinda sad that this time doesn’t count :(. Anyways, im happy to share my progress from now on. Today I focused on developing the CLI for my project and polishing some things, I think it turned out great
Hello, today I fully worked on making my project available for the web via Vercel! I had to solve many issues like permission issues , timing issues , upload issues and more , I eventually fixed it and can say that it’s working stable now! Now I have to sleep…
Hello, today I polished and finished the newest version of Henkan! This version is now the most stable version that also introduced an web based app.
Devlog — Countdown fix + WASM sync Fixed countdown being on by default when converting Etterna to osu. Added Countdown: 0 to the [General] section in the converter, the dummy diff generator, and the TypeScript equivalent. Discovered the web version was using a stale pre-built WASM binary that didn’t have any of the Rust fixes. Created wasm-core/ — a new crate that builds WASM from the same Rust source via #[path] references. No code duplication. Added npm run build:wasm for local rebuilds and a CI job that auto-rebuilds WASM on push to main so it never goes stale again
Henkan Devlog (v1.3.1 → v1.5.0) v1.4.0 (July 20-23) This update was mainly about skin conversion. I added support for converting osu!mania skins to Etterna noteskins and back. It ended up being much bigger than I expected, with over 1,600 lines of code just for the converter. I also added difficulty name presets with placeholders like title, artist, creator, difficulty, and MSD, fixed an issue with extreme BPM values, and added a column width setting for osu!mania exports. Outside of the app, I improved CI, switched Windows installers to NSIS, added AUR support, improved the documentation, and wrote a full end-to-end test for skin conversion. v1.5.0 (July 24-26) This update focused on making the web version behave the same as the desktop app. I fixed export names, media handling, and config support so browser exports now match Tauri. I also fixed a spacebar shortcut bug, made update notes render as Markdown, and cleaned up the CI workflows. Keeping the web and desktop versions in sync is still one of the hardest parts since every converter change has to work in both Rust and WASM.
Hello! I’ve kept working on Henkan, my osu!mania ↔ Etterna converter, and shipped quite a few updates since v1.5.0.The biggest new feature is a playable beatmap preview. The editor can now autoplay charts when you’re not interacting with it, notes render underneath the receptors like they do in osu!mania, and the HUD stays properly centered. It makes it much easier to get a feel for how a chart actually plays before exporting it instead of only looking at the note data.Henkan also supports 8 languages now. While adding localization, I ended up removing i18next and replacing it with a much smaller custom localization system. Henkan doesn’t really need everything i18next provides, so this keeps things simpler and lighter.I also improved importing incomplete osu! beatmaps. If you only have an .osu file and the audio or background is missing, Henkan can now automatically try to fetch the missing files from an osu! mirror.There were also a bunch of smaller conversion fixes. Skin images are handled more reliably, and previews should now be closer to what you actually see in-game. Release notes are fetched properly from GitHub instead of using the old placeholder, and config overrides now work consistently in both conversion directions.osu! exports got some fixes too. Backgrounds are included even when the source chart doesn’t directly reference them, cdtitle files are only copied when they’re actually needed, and hold notes were cleaned up to follow the normal osu!mania format with proper hitsounds and clean samples instead of creating unnecessary or broken sound files.I’ve also been trying to close the gap between the desktop and web versions. The web build now has much closer feature and export parity with the Rust/Tauri version, and CI automatically rebuilds the WebAssembly binaries whenever something is pushed to main.Keeping both versions in sync is still one of the more annoying parts of working on Henkan, since some converter changes have to be implemented separately for Rust and WebAssembly, but it’s getting a lot better.The goal is still the same: make Henkan the most reliable way to move charts and skins between osu!mania and Etterna without randomly losing important data.
Hello! I’ve kept working on Henkan, and shipped quite a few updates since v1.5.0. The biggest new feature is a playable beatmap preview. The editor can now autoplay charts when you’re not interacting with it, notes render underneath the receptors like they do in osu!mania, and the HUD stays properly centered. It makes it much easier to get a feel for how a chart actually plays before exporting it instead of only looking at the note data.Henkan also supports 8 languages now. While adding localization, I ended up removing i18next and replacing it with a much smaller custom localization system. Henkan doesn’t really need everything i18next provides, so this keeps things simpler and lighter.I also improved importing incomplete osu! beatmaps. If you only have an .osu file and the audio or background is missing, Henkan can now automatically try to fetch the missing files from an osu! mirror.There were also a bunch of smaller conversion fixes. Skin images are handled more reliably, and previews should now be closer to what you actually see in-game. Release notes are fetched properly from GitHub instead of using the old placeholder, and config overrides now work consistently in both conversion directions.osu! exports got some fixes too. Backgrounds are included even when the source chart doesn’t directly reference them, cdtitle files are only copied when they’re actually needed, and hold notes were cleaned up to follow the normal osu!mania format with proper hitsounds and clean samples instead of creating unnecessary or broken sound files.I’ve also been trying to close the gap between the desktop and web versions. The web build now has much closer feature and export parity with the Rust/Tauri version, and CI automatically rebuilds the WebAssembly binaries whenever something is pushed to main.Keeping both versions in sync is still one of the more annoying parts of working on Henkan, since some converter changes have to be implemented separately for Rust and WebAssembly, but it’s getting a lot better.The goal is still the same: make Henkan the most reliable way to move charts and skins between osu!mania and Etterna without randomly losing important data.
Hello! I worked on Henkan again and added something I’ve wanted for a while. Henkan can now detect the map you currently have open in osu!stable, osu!lazer, or Etterna and show it directly in the converter. No tosu or any other external tool required.This makes it much faster to open Henkan and immediately work with the chart you’re currently playing or editing.Still working on making the whole workflow between osu!mania and Etterna feel as seamless as possible.
Hello! I worked on Henkan a lot again, mostly on making the desktop app nicer and faster to actually use.One of the biggest changes is that Henkan can now save conversions directly into your detected osu!stable or Etterna song folders. So instead of exporting something and moving it into the game manually, you can just convert it and have it show up where it belongs.I also redesigned the desktop navigation and added pages for your conversion history and local osu! skins. The live map detection settings were improved too, so osu! and Etterna hooks can now be enabled separately.Pack conversion got a lot of work as well. You can select individual difficulties before converting, check the metadata for every song, and packs with different audio files are now split into separate songs automatically. I also fixed a bunch of cases where maps inside a pack could lose their own artist, title, audio or background.The converter now remembers the background of the last map you opened too, even after restarting Henkan. It’s a small thing but makes the home screen feel a lot less empty.There were also a bunch of smaller changes. Loading states and buttons are more consistent, navigation is less messy, pack conversion is faster, Etterna timing and current song detection were improved, and changing song rate now keeps the original audio bitrate.I fixed some platform specific stuff too, mainly the osu!lazer background bridge on macOS and Etterna song detection on Linux.I also refreshed the docs and finally moved Henkan to its new domain https://henkan.kaan.moe registrar might be slow so try https://henkan-chi.vercel.app/
Ships:
Hello, I made an osu!mania ↔ Etterna converter called Henkan (変換). I started the project because I noticed that most existing converters didn’t preserve maps correctly. Timing would drift, BPM changes would be lost or simplified, and long notes would often break during conversion. I wanted to build a converter that focused on accuracy instead of quick conversions. Henkan converts beatmaps between osu!mania (.osu / .osz) and Etterna/StepMania (.sm) while preserving the original chart as closely as possible. It keeps millisecond-accurate note timing, supports multiple BPM changes, correctly converts long notes, preserves metadata such as title, artist, creator, difficulty, and preview point, and keeps background references. The application is written as a native desktop app using Rust, Tauri, and React, making it lightweight and fast on Windows, macOS, and Linux. It also supports converting entire packs, allowing users to process many maps at once instead of converting them individually. One limitation is that scroll velocity (SV) is not converted from osu!mania to StepMania because the .sm format does not have an equivalent representation for osu!’s green-line SV changes. My goal with Henkan is to provide a reliable converter that players can trust to preserve their charts accurately instead of introducing timing errors or losing important map information.
Hello, I’ve continued working on Henkan, my osu!mania ↔ Etterna converter, and released several major updates since my first ship. The biggest addition is full skin conversion. Henkan can now convert osu!mania skins into Etterna noteskins and convert Etterna noteskins back into osu!mania skins. This required handling lane textures, sprite sheets, high-resolution assets, Lua files, metrics, redirects, and the different ways both games structure their skins. I also added customizable difficulty name presets. Exported charts can automatically use information such as the title, artist, creator, original difficulty name, or calculated MSD. Users can also change the column width when exporting to osu!mania. Several conversion issues were fixed, including problems with extreme BPM values, export filenames, media files, and configuration support. The web version now behaves much more like the desktop app, with matching exports and features across Rust, Tauri, and WebAssembly. I also improved the project outside of the main application. Windows builds now use NSIS installers, Henkan is available through the AUR, the documentation has been expanded, the CI workflows have been cleaned up, and I added an end-to-end test for the skin converter. Keeping the desktop and web versions consistent is still one of the hardest parts of the project, since converter changes often need separate implementations for Rust and WebAssembly. My goal is still to make Henkan the most reliable way to move charts and skins between osu!mania and Etterna without losing important data.
This update is mostly about making Henkan nicer to actually use. The biggest change is the beatmap preview. It can now autoplay the chart when you leave it idle, with notes falling under the receptors like in osu!mania and the HUD staying centered. It makes it way easier to get a feel for a chart before exporting instead of just staring at static note columns. Henkan is also now available in 8 languages . While adding localization, I ended up replacing i18next with a small custom system since I really didn’t need a whole library for what Henkan uses. It’s simpler, lighter, and still covers the entire app. I also added something I’ve wanted for a while: if you import a random .osu file without its audio or background, Henkan can now try to grab the missing files from an osu! mirror automatically. So incomplete beatmap folders are a lot less annoying to deal with. There are some smaller fixes too. Skin images are handled more reliably, previews should match the actual result better, and the updater now gets the real release notes from GitHub instead of showing a placeholder. You can try the latest release here: https://github.com/kaanreal/henkan/releases Its really hard to provide screenshots or other things cause it is really niche
This update is mostly about getting Henkan into more places. Henkan can now be installed through winget, Homebrew, the AUR, Chocolatey and nixpkgs. If you use a normal package manager, you don’t have to hunt down the GitHub releases anymore. The site got some attention too. All pages are usable on phones now, and shared links show a proper preview card. I also changed the app icon and logo to a new emblem, which now shows up everywhere, from the desktop app and favicon to the package managers above. Smaller fixes: the preview receptors now line up with the note art, so the editor and the game agree on how the chart looks. You can try the latest release here: https://github.com/kaanreal/henkan/releases Its really hard to provide screenshots or other things cause it is really niche
This update is mostly about making Henkan feel a lot more complete on desktop. You can now save conversions directly into your detected osu!stable and Etterna song folders, so there’s way less manual moving files around. I also redesigned the desktop navigation and added proper pages for conversion history and your local osu! skin library. Pack conversion got a pretty big upgrade too. You can select which difficulties you actually want to convert, review the metadata for each song, and packs using multiple audio files are now automatically separated into individual songs. I also fixed metadata handling so every map keeps its own artist, title, subtitle, audio and background instead of accidentally sharing data across the pack. Live map detection can now be controlled separately for osu! and Etterna, and Henkan remembers the background of the last map you opened even after restarting. There are a bunch of smaller fixes too: faster pack conversion, better Etterna timing and current-song detection, preserved audio bitrate when changing rates, cleaner loading states and buttons, fixed navigation, plus some macOS and Linux specific fixes. The docs were also refreshed, and Henkan finally has its new domain: https://henkan.kaan.moe...
|
1792810350.6755803
|
1792896750.6755803
|
|
65314
|
vector by @itzprodhosh | Stardance
|
itzprodhosh
|
1
|
7.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T05:54:03Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "soo vector is a student task management app this is a really coool ui and minimalist app that i did it only has the essential features a student needs of course we can do lot of integrations, more pages etc but i feel we dont do it consistently in such apps made using nextjs, typescript, zustand, resend, supabase lemme know ur thoughts", "repo": "https://github.com/prodhosh/vector", "demo": "https://vector.prodhosh.me"}]...
|
[{"post_id": 72993, "ts": "202 [{"post_id": 72993, "ts": "2026-09-24T05:51:03Z", "hours": 7.1556, "text": "ive built the dashboard, initialzed the components etc and worked on these 3 pages again my main goal is to keep these app as mimalistic and only the essential features only in here"}]...
|
Title: vector by @itzprodhosh | Stardance
Devlogs Title: vector by @itzprodhosh | Stardance
Devlogs:
ive built the dashboard, initialzed the components etc and worked on these 3 pages again my main goal is to keep these app as mimalistic and only the essential features only in here
Ships:
soo vector is a student task management app this is a really coool ui and minimalist app that i did it only has the essential features a student needs of course we can do lot of integrations, more pages etc but i feel we dont do it consistently in such apps made using nextjs, typescript, zustand, resend, supabase lemme know ur thoughts...
|
1792817238.109997
|
1792903638.109997
|
|
62653
|
cute usagi game by @RobbieMa | Stardance
|
RobbieMa
|
1
|
12.0
|
76
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T05:01:59Z", "hours": 12.0, "multiplier": 6.3, "payout": 76, "blessing": "neutral", "text": "I made a softbody playground for Usagi the bunny. This is NOT a game!! It is purely a physics demo showing what can be done in Unity3D. It made me learn a lot about physics based movement in unity as well as setting up softbodies and ragdolls in a 3D space. The most challenging part was probably getting the player to reset the softbody without breaking the whole thing. Enjoy!", "repo": "https://github.com/Hello-Grow/usagi-softbody/", "demo": "https://github.com/Hello-Grow/usagi-softbody/releases/tag/1.0"}]...
|
[{"post_id": 72930, "ts": "202 [{"post_id": 72930, "ts": "2026-09-24T01:57:13Z", "hours": 1.1022, "text": "worked on a time slow feature where players can slow down time by scrolling, and adding some awesome destruction test like smashing blocks, block hit into wall, and more!"}, {"post_id": 72094, "ts": "2026-09-22T04:54:19Z", "hours": 1.6667, "text": "adding sounds for usagi and adding more graphical elements like bushes and a giant blender. Sounds are all one-shot audio from usagi episodes with background music and noise removed."}, {"post_id": 71427, "ts": "2026-09-20T20:00:29Z", "hours": 1.5667, "text": "Worked on more softbody functions, using custom scripts that works along with my softbody player controller, Usagi will now seamlessly ragdoll when player presses R and also ragdolls when touching certain objects. Players can also squish other Usagi’s too, maybe multiplayer in the future?? There is one problem though with the ragdoll script, i can’t seem to make it seamlessly go into player controlled mode and out of ragdoll mode… it keeps clipping into the ground"}, {"post_id": 70432, "ts": "2026-09-19T05:48:27Z", "hours": 0.9, "text": "Usagi can now WALK!! using standard third person controls and physics based steps, players can control usagi using WASD and mouse to look around. Hardest part here wasn’t the movement itself, it was the player rotating with the camera, since the gameobject doesnt rotate, the softbody points do."}, {"post_id": 70310, "ts": "2026-09-18T22:22:32Z", "hours": 4.2667, "text": "Added a softbody system using a crazy amount of points that makes a network that impacts the player mesh. Editing the mesh and getting the body structure right took up the majority of the time, tweaking various settings, very boring. Though the reward is great! It is really satisfying to squish and deform."}, {"post_id": 69520, "ts": "2026-09-17T07:12:55Z", "hours": 0.4, "text": "Using unity’s toon shader to make it actually feel like it’s drawn and not rendered in a traditional sense. The outlines look a bit wonky at the ears though because the normals are just positioned weird"}, {"post_id": 69454, "ts": "2026-09-17T02:49:04Z", "hours": 1.2667, "text": "Made it a ragdoll in unity, had to figure out what counted as a hip and spines, but got it working! it is very satisfying to play with."}, {"post_id": 69010, "ts": "2026-09-16T06:44:15Z", "hours": 0.9333, "text": "Rigged Usagi in blender for unity and fixed material/texturing"}]...
|
Title: cute usagi game by @RobbieMa | Stardance
D Title: cute usagi game by @RobbieMa | Stardance
Devlogs:
Rigged Usagi in blender for unity and fixed material/texturing
Made it a ragdoll in unity, had to figure out what counted as a hip and spines, but got it working! it is very satisfying to play with.
Using unity’s toon shader to make it actually feel like it’s drawn and not rendered in a traditional sense. The outlines look a bit wonky at the ears though because the normals are just positioned weird
Added a softbody system using a crazy amount of points that makes a network that impacts the player mesh. Editing the mesh and getting the body structure right took up the majority of the time, tweaking various settings, very boring. Though the reward is great! It is really satisfying to squish and deform.
Usagi can now WALK!! using standard third person controls and physics based steps, players can control usagi using WASD and mouse to look around. Hardest part here wasn’t the movement itself, it was the player rotating with the camera, since the gameobject doesnt rotate, the softbody points do.
Worked on more softbody functions, using custom scripts that works along with my softbody player controller, Usagi will now seamlessly ragdoll when player presses R and also ragdolls when touching certain objects. Players can also squish other Usagi’s too, maybe multiplayer in the future?? There is one problem though with the ragdoll script, i can’t seem to make it seamlessly go into player controlled mode and out of ragdoll mode… it keeps clipping into the ground
adding sounds for usagi and adding more graphical elements like bushes and a giant blender. Sounds are all one-shot audio from usagi episodes with background music and noise removed.
worked on a time slow feature where players can slow down time by scrolling, and adding some awesome destruction test like smashing blocks, block hit into wall, and more!
Ships:
I made a softbody playground for Usagi the bunny. This is NOT a game!! It is purely a physics demo showing what can be done in Unity3D. It made me learn a lot about physics based movement in unity as well as setting up softbodies and ragdolls in a 3D space. The most challenging part was probably getting the player to reset the softbody without breaking the whole thing. Enjoy!...
|
1792813959.3751087
|
1792900359.3751087
|
|
39444
|
Flappy Rocket by @brandon | Stardance
|
brandon
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T04:34:09Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made my official first game without fully relying on AI. I did use videos to help me code, as I am still a beginner when it comes to that, especially using c#. I learned a lot off this one project. For example, how to add a scrolling background. And even if they aren’t perfect, I think it is enough for a very simple game that was completed in a somewhat short amount of coding time. There was a moment where I gave up on the project because I couldn’t figure it out. Since I was trying my absolute best to not use AI once, I drained myself out and left this alone for about a month or so. I ended up using AI to fix this one problem, and although I don’t remember the exact problem off the top of my head, I did remember how small of a problem it was. I only needed to change one thing. Even though this challenge is ending very soon, and I have very little hours. I will try my best to make one last project that I will focus on for the next week and few days. I hope you all enjoy this game and hopefully stick around to see my new project! (might be 3D :0 )", "repo": "https://github.com/Br4ndon-aero/Flappy-Rocket", "demo": "https://github.com/Br4ndon-aero/Flappy-Rocket/releases/tag/v1.0.0"}]...
|
[{"post_id": 72972, "ts": "202 [{"post_id": 72972, "ts": "2026-09-24T04:21:29Z", "hours": 0.2808, "text": "I completed my satellites!! I believe that is all I will work on for this game, for now. I will try to make another game and get my hours up starting tonight!!"}, {"post_id": 72100, "ts": "2026-09-22T05:18:09Z", "hours": 0.7136, "text": "I completed adding the background. I am now currently working on adding a satellite that spawns here and there that the rocket can collide with and lose. Next up, levels?"}, {"post_id": 69925, "ts": "2026-09-18T02:25:22Z", "hours": 0.8772, "text": "Slowed down for a minute because I was trying to figure out how to move my project into a laptop (had me stressing even though it was so easy). Now that I am able to work from my laptop, hopefully I can get more hours into my work! Apart from that, I am currently working on figuring out how to make a scrolling background that continues endlessly. Next up, adding levels and increasing speed per every 5-10 points!"}, {"post_id": 67119, "ts": "2026-09-13T05:35:49Z", "hours": 0.7344, "text": "I think because I have been inactive for about a month, my hours that were logged were reset. But anyway, I leanred how to remove the rockets from spawning in and never deleting, I finished making a “game over” overlay after the rocket hits the asteroid, and included a “try again” button that resets the whole game. I had a huge issue with the reset button that made me give up this game for a moment since I was trying my very best to not use AI and simply figure it out through other methods. I was able to fix it now, but unfortunately, had to use AI :(. Now that I am done with that, I will try to make the background a outer space background, with stars and everything that might be a image from google, I dont know yet though. Any ideas? leave them in the comments!"}, {"post_id": 42441, "ts": "2026-08-07T05:04:44Z", "hours": 1.1867, "text": "What I have been working on is making the rocket move up and down (basically jump with the spacebar), I added asteroids as a way to lose the game if you collide with them, I made the asteroids move from left to right, and right now, I am trying to add a score using UI. I struggle here and there to make this game fun by changing the speed and stuff but so far no AI! (Still a LOT to fix)"}, {"post_id": 34453, "ts": "2026-07-25T05:40:45Z", "hours": 0.4136, "text": "So far, on my new project I am trying to figure out basic steps on Unity. As a start, I am planning on making this game into a Flappy bird type of game, but instead of a bird, its a rocket. So far, NO AI, just youtube!"}]...
|
Title: Flappy Rocket by @brandon | Stardance
Devl Title: Flappy Rocket by @brandon | Stardance
Devlogs:
So far, on my new project I am trying to figure out basic steps on Unity. As a start, I am planning on making this game into a Flappy bird type of game, but instead of a bird, its a rocket. So far, NO AI, just youtube!
What I have been working on is making the rocket move up and down (basically jump with the spacebar), I added asteroids as a way to lose the game if you collide with them, I made the asteroids move from left to right, and right now, I am trying to add a score using UI. I struggle here and there to make this game fun by changing the speed and stuff but so far no AI! (Still a LOT to fix)
I think because I have been inactive for about a month, my hours that were logged were reset. But anyway, I leanred how to remove the rockets from spawning in and never deleting, I finished making a “game over” overlay after the rocket hits the asteroid, and included a “try again” button that resets the whole game. I had a huge issue with the reset button that made me give up this game for a moment since I was trying my very best to not use AI and simply figure it out through other methods. I was able to fix it now, but unfortunately, had to use AI :(. Now that I am done with that, I will try to make the background a outer space background, with stars and everything that might be a image from google, I dont know yet though. Any ideas? leave them in the comments!
Slowed down for a minute because I was trying to figure out how to move my project into a laptop (had me stressing even though it was so easy). Now that I am able to work from my laptop, hopefully I can get more hours into my work! Apart from that, I am currently working on figuring out how to make a scrolling background that continues endlessly. Next up, adding levels and increasing speed per every 5-10 points!
I completed adding the background. I am now currently working on adding a satellite that spawns here and there that the rocket can collide with and lose. Next up, levels?
I completed my satellites!! I believe that is all I will work on for this game, for now. I will try to make another game and get my hours up starting tonight!!
Ships:
I made my official first game without fully relying on AI. I did use videos to help me code, as I am still a beginner when it comes to that, especially using c#. I learned a lot off this one project. For example, how to add a scrolling background. And even if they aren’t perfect, I think it is enough for a very simple game that was completed in a somewhat short amount of coding time. There was a moment where I gave up on the project because I couldn’t figure it out. Since I was trying my absolute best to not use AI once, I drained myself out and left this alone for about a month or so. I ended up using AI to fix this one problem, and although I don’t remember the exact problem off the top of my head, I did remember how small of a problem it was. I only needed to change one thing. Even though this challenge is ending very soon, and I have very little hours. I will try my best to make one last project that I will focus on for the next week and few days. I hope you all enjoy this game and hopefully stick around to see my new project! (might be 3D :0 )...
|
1792853483.734361
|
1792939883.734361
|
|
20231
|
Tao - a wearable digital pet by @academicalvin | S Tao - a wearable digital pet by @academicalvin | Stardance...
|
academicalvin
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T03:29:03Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I tried replicating this digital pet I’ve seen on the internet and I absolutely love it. It’s not as sensor packed as the real thing but Tao packs an IMU, round LCD screen, haptic motor, and a temperature sensor. When turned on, it has a fun little expressive face that reacts to the world around it. Shake it –> it’ll get dizzy Leave it alone –> it gets sleepy Drop it –> it feels that Move it around –> its eyes moves", "repo": "https://github.com/alvi-n/TaoTheWearableDigitalPet", "demo": ""}]...
|
[{"post_id": 24416, "ts": "202 [{"post_id": 24416, "ts": "2026-07-07T23:22:51Z", "hours": 1.25, "text": "Time skip - I finished all the CAD and code for the project and I think it’s about time to submit! I added a charzard silkscreen design and it looks pretty cool the case has a pretty big back for the battery but I guess it’s not too noticable the main thing i’m not too sure about is the schematic and pcb wiring but hopefully if the design comes back to be for a redo I can do that fast this was a really fun project and I’m suprised myself i was able to remain consistent with this project"}, {"post_id": 22293, "ts": "2026-07-04T18:01:39Z", "hours": 1.9775, "text": "Taking out the NFC, Retracing Everything This took a little too long. Turns out since I didn’t have a LCD screen footprint I didn’t really know where the middle of the screen would be relative to the rest of the PCB. When I put everything into my 3d modeling software (Shapr3d), I realized it would be better if the screen was directly in the middle of the pcb by making it vertical. Which ultimately means I have to retrace almost everything."}, {"post_id": 18122, "ts": "2026-06-29T04:08:06Z", "hours": 3.1003, "text": "Honestly, I do not think I can get past the cut Spent too long trying to figure out how to make my own NFC chip antenna and for the time I’m trying to rush this project I don’t think I can. I think I will end up using a module with header pins for it instead of making it myself, it’s really devastating but for the sake of maintaining my enjoyment throughout this project I’m going to lower my scope."}, {"post_id": 15494, "ts": "2026-06-25T05:55:08Z", "hours": 1.3628, "text": "PCB routing - continued So far I believe I setted up the temperature sensor, motor driver, and accelerometer well and by that, I mean just the capacitors and resistors. I’m planning on putting this esp32 on the back side where I’ll also keep the battery so it doesn’t interfere with the lcd screen. This has been quite fun so far."}, {"post_id": 15364, "ts": "2026-06-24T23:49:22Z", "hours": 0.5, "text": "Outlining my pcb Not much was done in these 30 minutes, just imported a drawing of the shape of the pet."}, {"post_id": 14894, "ts": "2026-06-24T05:50:35Z", "hours": 0.8503, "text": "A little bit of this and a little bit of that. Today I started on my actual PCB design and turns out it’s harder than I thought. My schematic is like a maze, some lines in my schematic going two directions. Figuring out the best way to put everything is definitely a challenge. Tomorrow, I’ll start working on the edge cuts first and try to get 50% of the pcb wired."}, {"post_id": 13558, "ts": "2026-06-22T06:08:19Z", "hours": 2.3167, "text": "Tao Now Has an Accelerometer, NFC Reader, and a Temperature Sensor all powered by the xiao esp-32 s3 I never realized how powerful development boards are. Last session, I took an hour trying to figure out how make a buck converter, battery charger, and an external usb-c connector -> turns out the xiao board does all of that for me. Now instead of focusing my time on the power managing side of my project which was really confusing for me, I could now focus on adding additional fun elements to my project such as a haptic motor and temperature sensor Overall this project has been pretty fun so far, next step is working on the pcb layout and thinking about the shape of my digital pet."}, {"post_id": 10451, "ts": "2026-06-17T05:41:13Z", "hours": 1.0139, "text": "No modules, everything on a PCB. I’ve been seeing these digital pet accessories, similar to a Tamagotchi, on my feed a lot and the company selling these were listing them for ~$300 and I thought “I could definitely make this myself”. These things interact with the environment with some basic sensors which gives the face a signal to change its animation. Turns out its wayy harder than I thought to make myself. considering my only hardware project I’ve made was a macropad. There is a lot of pieces and I obviously haven’t built anything like this ever. Instead of adding modules that hook up to a breadboard, I realized that all of those parts can be added to the PCB itself and it all starts with the chip. I looked for the best chip for each of the different features and looked at the schematic for each. The only chip with a datasheet that actually made sense was for the battery charger, the rest…it took a bit more work. Anyways tomorrow, I’m planning on trying to finish the schematics so make sure to follow!"}]...
|
Title: Tao - a wearable digital pet by @academical Title: Tao - a wearable digital pet by @academicalvin | Stardance
Devlogs:
No modules, everything on a PCB. I’ve been seeing these digital pet accessories, similar to a Tamagotchi, on my feed a lot and the company selling these were listing them for ~$300 and I thought “I could definitely make this myself”. These things interact with the environment with some basic sensors which gives the face a signal to change its animation. Turns out its wayy harder than I thought to make myself. considering my only hardware project I’ve made was a macropad. There is a lot of pieces and I obviously haven’t built anything like this ever. Instead of adding modules that hook up to a breadboard, I realized that all of those parts can be added to the PCB itself and it all starts with the chip. I looked for the best chip for each of the different features and looked at the schematic for each. The only chip with a datasheet that actually made sense was for the battery charger, the rest…it took a bit more work. Anyways tomorrow, I’m planning on trying to finish the schematics so make sure to follow!
Tao Now Has an Accelerometer, NFC Reader, and a Temperature Sensor all powered by the xiao esp-32 s3 I never realized how powerful development boards are. Last session, I took an hour trying to figure out how make a buck converter, battery charger, and an external usb-c connector -> turns out the xiao board does all of that for me. Now instead of focusing my time on the power managing side of my project which was really confusing for me, I could now focus on adding additional fun elements to my project such as a haptic motor and temperature sensor Overall this project has been pretty fun so far, next step is working on the pcb layout and thinking about the shape of my digital pet.
A little bit of this and a little bit of that. Today I started on my actual PCB design and turns out it’s harder than I thought. My schematic is like a maze, some lines in my schematic going two directions. Figuring out the best way to put everything is definitely a challenge. Tomorrow, I’ll start working on the edge cuts first and try to get 50% of the pcb wired.
Outlining my pcb Not much was done in these 30 minutes, just imported a drawing of the shape of the pet.
PCB routing - continued So far I believe I setted up the temperature sensor, motor driver, and accelerometer well and by that, I mean just the capacitors and resistors. I’m planning on putting this esp32 on the back side where I’ll also keep the battery so it doesn’t interfere with the lcd screen. This has been quite fun so far.
Honestly, I do not think I can get past the cut Spent too long trying to figure out how to make my own NFC chip antenna and for the time I’m trying to rush this project I don’t think I can. I think I will end up using a module with header pins for it instead of making it myself, it’s really devastating but for the sake of maintaining my enjoyment throughout this project I’m going to lower my scope.
Taking out the NFC, Retracing Everything This took a little too long. Turns out since I didn’t have a LCD screen footprint I didn’t really know where the middle of the screen would be relative to the rest of the PCB. When I put everything into my 3d modeling software (Shapr3d), I realized it would be better if the screen was directly in the middle of the pcb by making it vertical. Which ultimately means I have to retrace almost everything.
Time skip - I finished all the CAD and code for the project and I think it’s about time to submit! I added a charzard silkscreen design and it looks pretty cool the case has a pretty big back for the battery but I guess it’s not too noticable the main thing i’m not too sure about is the schematic and pcb wiring but hopefully if the design comes back to be for a redo I can do that fast this was a really fun project and I’m suprised myself i was able to remain consistent with this project
Ships:
I tried replicating this digital pet I’ve seen on the internet and I absolutely love it. It’s not as sensor packed as the real thing but Tao packs an IMU, round LCD screen, haptic motor, and a temperature sensor. When turned on, it has a fun little expressive face that reacts to the world around it. Shake it –> it’ll get dizzy Leave it alone –> it gets sleepy Drop it –> it feels that Move it around –> its eyes moves...
|
1792856963.0922213
|
1792943363.0922213
|
|
62010
|
Hex-2048 by @CadenO | Stardance
|
CadenO
|
1
|
4.0
|
23
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T02:57:15Z", "hours": 4.0, "multiplier": 5.24, "payout": 23, "blessing": "neutral", "text": "I made the classic 2048 number game, but in a hexagon instead of a square! I think that it looks mostly clean, and I find it pretty fun to play. It is a vanilla browser page, and can take input from a keyboard or a touchscreen.", "repo": "https://github.com/cesium72/Hex-2048", "demo": "https://cesium72.github.io/Hex-2048"}]...
|
[{"post_id": 72946, "ts": "202 [{"post_id": 72946, "ts": "2026-09-24T02:53:25Z", "hours": 0.7361, "text": "It’s finally actually done! The mobile input is now working and the game is pretty fun (in my opinion)"}, {"post_id": 71574, "ts": "2026-09-21T02:31:16Z", "hours": 0.63, "text": "I’ve basically finished my hexagonal 2048 game! The game itself, saving, help, and reset are all working, and the only thing left to add is a README (ugh). I think the game is pretty fun, though."}, {"post_id": 70985, "ts": "2026-09-20T04:58:55Z", "hours": 0.7875, "text": "I have made progress on my hexagonal 2048 game! 1) There is now a help screen, and 2) I got an 8192! Then, I decided that I have much better uses for my time. After I add the scoring, I’ll probably be about done, so I seem to be on track for my goal of a quick project."}, {"post_id": 69841, "ts": "2026-09-17T21:48:53Z", "hours": 2.1936, "text": "I’ve been making a hexagonal 2048 game! The game mechanics are working fine, and the logic is all in place. The only real things I have left to do are to add touchscreen input (swiping), scoring, and add functionality to reset and help buttons. (OK, fine, and write a README)."}]...
|
Title: Hex-2048 by @CadenO | Stardance
Devlogs:
I Title: Hex-2048 by @CadenO | Stardance
Devlogs:
I’ve been making a hexagonal 2048 game! The game mechanics are working fine, and the logic is all in place. The only real things I have left to do are to add touchscreen input (swiping), scoring, and add functionality to reset and help buttons. (OK, fine, and write a README).
I have made progress on my hexagonal 2048 game! 1) There is now a help screen, and 2) I got an 8192! Then, I decided that I have much better uses for my time. After I add the scoring, I’ll probably be about done, so I seem to be on track for my goal of a quick project.
I’ve basically finished my hexagonal 2048 game! The game itself, saving, help, and reset are all working, and the only thing left to add is a README (ugh). I think the game is pretty fun, though.
It’s finally actually done! The mobile input is now working and the game is pretty fun (in my opinion)
Ships:
I made the classic 2048 number game, but in a hexagon instead of a square! I think that it looks mostly clean, and I find it pretty fun to play. It is a vanilla browser page, and can take input from a keyboard or a touchscreen....
|
1792813907.6341145
|
1792900307.6341145
|
|
53586
|
Recurrent Neural Network by @crazydave | Stardance
|
|
1
|
32.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T02:26:15Z", "hours": 32.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a recurrent neural network from scratch in Python using numpy, which generates text one character at a time in the style of Shakespeare. Because it keeps a memory of what it has recently seen, it learnt capitalisation, line breaks, punctuation, character-name formatting and roughly what English words look like, starting from nothing but the raw text, which I think is super cool! The most challenging part of this project was getting it to produce good output, first through backpropagation through time, where off-by-one bugs in the hidden state indexing and a bias gradient I forgot to update meant it wasn’t training properly, and then after training it with more layers, the error was much lower but the output was terrible, which took me a very long time to figure out. It turned out the model had barely ever seen a blank memory during training, so I fixed it by building up its memory on some text before it starts generating. I also added command line arguments to the code so that people can generate text or train their own model in their terminal without editing the python file. To test it, follow the install instructions on the README, you can either download the python code and run that, or download the compiled versions in the releases page on Github.", "repo": "https://github.com/rufus-gh/recurrent-neural-network", "demo": "https://github.com/rufus-gh/recurrent-neural-network/releases"}]...
|
[{"post_id": 72936, "ts": "202 [{"post_id": 72936, "ts": "2026-09-24T02:19:48Z", "hours": 0.3175, "text": "Added some code so that users can pass in arguments. I also spent a while trying to set up the releases page using github actions, and I used claude to make the github actions script for me (none of this went towards logged hours as it wasn’t in the IDE), but I finally got the releases to work (ignore the 1.0.4, I was trying to get it to work). I had three problems. One of them was that I accidentally named the “github” folder “github” (without the dot) so it wasn’t correctly running as an action. Another problem was pyinstaller using relative paths but remembered the same thing happened to me on my last project so i just used the same fix. The final problem was that my model checkpoint file somehow got deleted and it was needed for the Github actions but I had another copy so I put it back into the project and committed it, and it finally worked. I also got Al to help me write the README as it is boring to do. It will be shipped shortly so please check it out. (also dont mind the screenshot below being a screenshot of stardance, when I tried to post this, the site froze, so I screenshotted it first to make sure I didn’t lose it, and then it broke so I did it again)."}, {"post_id": 60564, "ts": "2026-09-02T23:54:38Z", "hours": 6.5103, "text": "After training it with the updated code, the output was terrible although the error was much lower, so I was really confused. I wasn’t sure what went wrong, and it took me a very long time to figure it out. When training, I feed in the previous step’s memory back into it and in training the memory is never wiped each epoch. However, when testing the output, I initialised it with a memory of just zeros, which it had barely experienced training with so wasn’t able to output meaningful things. I was able to fix it by initialising its memory on the training text itself to give it a memory state it is used to and that fixed it. You can see an output from it below."}, {"post_id": 55079, "ts": "2026-08-26T14:56:00Z", "hours": 5.5619, "text": "I did multiple training sessions and tweaked the learning rate, as after training with more layers and complexity, the model ended up with a much worse rate. I tried decreasing the learning rate and that led to a much better result. I then implemented something which reduces the learning rate over time, so that hopefully it will not plateau. I am thinking that to get to more levels of complexity in terms of producing actual content i will need to turn it into a LSTM, which has long and short memory. I am going to train it for a while now with the update and see how it goes."}, {"post_id": 54376, "ts": "2026-08-25T10:53:01Z", "hours": 6.1772, "text": "I updated the rnn to support multiple hidden layers, as previously it had a single layer, so I had to update the forward and backwards passes as well as the adagrad to account for the multiple layers. I started off with two and tested it with a hidden size of 256, but I didn’t see any improvement, however I didn’t train it for as long. I am now in the process of implementing a variable number of layers from 1 to any number, so that the model can learn greater complexity, however this comes at the cost of much slower training. Currently the training on 2 layers is a decent slowdown compared to with 1 layer, as i also increased hidden size to 512. So far I have made the forward pass work for multiple layers (greater than 2) but the rest of it still only supports 2 layers."}, {"post_id": 54127, "ts": "2026-08-24T23:04:59Z", "hours": 13.3083, "text": "I am making a recurrent neural network from scratch in python using numpy, trained on Shakespeare text to generate character-by-character in his style.This is an improvement on the previous neural network that I made as it keeps a memory based on the things it has recently seen, so it’s next prediction depends on what it has previously seen which will hopefully make it be able to learn more advanced patterns.I added loading and chunking of data, so basically it takes in a text file, and then it splits it into chunks (I use 25 character long chunks) in pairs with one shifted across by one and saves it as input and targets.I wrote the forward pass, loops through each character in a chunk, updates a hidden state with tanh, then a softmax over the vocab to predict the next character.I implemented backprop through time, which was definitely the hardest part, had a few off-by-one bugs in the hidden state indexing that took a while to track down.I did a numerical gradient check to double-check the backward pass against finite differences before training it, and realised I forgot to update the bias gradient so it wasn’t training properly.I used adagrad as the matrix updater from the gradients which works by updating the gradients by a smaller and smaller amount each time (I looked it up and apparently it is a good way to do it).I wrote the output function where I give it an input function, and then the model predicts the next character, and then it feeds the output back into the model and repeats for as many characters as I want.I then trained it on Shakespeare text and ran 100k iterations at hidden size 100, took about 2 mins and started outputting vaguely word-shaped gibberish with correct capitalisation and character-name formatting.I then increased the hidden size from 100 to 256 and trained it more, and it still looks like gibberish but improved a bit, some of the output is what you can see in the screenshot."}]...
|
Title: Recurrent Neural Network by @crazydave | St Title: Recurrent Neural Network by @crazydave | Stardance
Devlogs:
I am making a recurrent neural network from scratch in python using numpy, trained on Shakespeare text to generate character-by-character in his style.This is an improvement on the previous neural network that I made as it keeps a memory based on the things it has recently seen, so it’s next prediction depends on what it has previously seen which will hopefully make it be able to learn more advanced patterns.I added loading and chunking of data, so basically it takes in a text file, and then it splits it into chunks (I use 25 character long chunks) in pairs with one shifted across by one and saves it as input and targets.I wrote the forward pass, loops through each character in a chunk, updates a hidden state with tanh, then a softmax over the vocab to predict the next character.I implemented backprop through time, which was definitely the hardest part, had a few off-by-one bugs in the hidden state indexing that took a while to track down.I did a numerical gradient check to double-check the backward pass against finite differences before training it, and realised I forgot to update the bias gradient so it wasn’t training properly.I used adagrad as the matrix updater from the gradients which works by updating the gradients by a smaller and smaller amount each time (I looked it up and apparently it is a good way to do it).I wrote the output function where I give it an input function, and then the model predicts the next character, and then it feeds the output back into the model and repeats for as many characters as I want.I then trained it on Shakespeare text and ran 100k iterations at hidden size 100, took about 2 mins and started outputting vaguely word-shaped gibberish with correct capitalisation and character-name formatting.I then increased the hidden size from 100 to 256 and trained it more, and it still looks like gibberish but improved a bit, some of the output is what you can see in the screenshot.
I updated the rnn to support multiple hidden layers, as previously it had a single layer, so I had to update the forward and backwards passes as well as the adagrad to account for the multiple layers. I started off with two and tested it with a hidden size of 256, but I didn’t see any improvement, however I didn’t train it for as long. I am now in the process of implementing a variable number of layers from 1 to any number, so that the model can learn greater complexity, however this comes at the cost of much slower training. Currently the training on 2 layers is a decent slowdown compared to with 1 layer, as i also increased hidden size to 512. So far I have made the forward pass work for multiple layers (greater than 2) but the rest of it still only supports 2 layers.
I did multiple training sessions and tweaked the learning rate, as after training with more layers and complexity, the model ended up with a much worse rate. I tried decreasing the learning rate and that led to a much better result. I then implemented something which reduces the learning rate over time, so that hopefully it will not plateau. I am thinking that to get to more levels of complexity in terms of producing actual content i will need to turn it into a LSTM, which has long and short memory. I am going to train it for a while now with the update and see how it goes.
After training it with the updated code, the output was terrible although the error was much lower, so I was really confused. I wasn’t sure what went wrong, and it took me a very long time to figure it out. When training, I feed in the previous step’s memory back into it and in training the memory is never wiped each epoch. However, when testing the output, I initialised it with a memory of just zeros, which it had barely experienced training with so wasn’t able to output meaningful things. I was able to fix it by initialising its memory on the training text itself to give it a memory state it is used to and that fixed it. You can see an output from it below.
Added some code so that users can pass in arguments. I also spent a while trying to set up the releases page using github actions, and I used claude to make the github actions script for me (none of this went towards logged hours as it wasn’t in the IDE), but I finally got the releases to work (ignore the 1.0.4, I was trying to get it to work). I had three problems. One of them was that I accidentally named the “github” folder “github” (without the dot) so it wasn’t correctly running as an action. Another problem was pyinstaller using relative paths but remembered the same thing happened to me on my last project so i just used the same fix. The final problem was that my model checkpoint file somehow got deleted and it was needed for the Github actions but I had another copy so I put it back into the project and committed it, and it finally worked. I also got Al to help me write the README as it is boring to do. It will be shipped shortly so please check it out. (also dont mind the screenshot below being a screenshot of stardance, when I tried to post this, the site froze, so I screenshotted it first to make sure I didn’t lose it, and then it broke so I did it again).
Ships:
I made a recurrent neural network from scratch in Python using numpy, which generates text one character at a time in the style of Shakespeare. Because it keeps a memory of what it has recently seen, it learnt capitalisation, line breaks, punctuation, character-name formatting and roughly what English words look like, starting from nothing but the raw text, which I think is super cool! The most challenging part of this project was getting it to produce good output, first through backpropagation through time, where off-by-one bugs in the hidden state indexing and a bias gradient I forgot to update meant it wasn’t training properly, and then after training it with more layers, the error was much lower but the output was terrible, which took me a very long time to figure out. It turned out the model had barely ever seen a blank memory during training, so I fixed it by building up its memory on some text before it starts generating. I also added command line arguments to the code so that people can generate text or train their own model in their terminal without editing the python file. To test it, follow the install instructions on the README, you can either download the python code and run that, or download the compiled versions in the releases page on Github....
|
1792932877.1052053
|
1793019277.1052053
|
|
43024
|
nwwm by @pinetree182 | Stardance
|
pinetree182
|
1
|
30.0
|
496
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T02:18:12Z", "hours": 30.0, "multiplier": 16.48, "payout": 496, "blessing": "neutral", "text": "I made nwwm, a simple tiling window manager for the X windowing system, a popular display server for Linux. Its job is basically to decide where windows go on the screen and how they should look, as well as listen to keypresses and decide what should happen. I ran into quite a few issues since I was using Rust which is not a language I’m 100% familiar with, and this was also my first proper systems-level project, but I managed to pull through and I’m really happy with where nwwm has gotten. Some features include: Tiling Multiple workspaces Support for docked windows, like statusbars Config loading from ~/.config/nwwm/config.toml Configurable keybinds (Barebones) EWMH support Since this is a Linux project, I know that most people won’t be able to test it so I’ve made a small video showing off some of the core features. You can view this video on the website, just scroll down to the “Demo” section and play the video.", "repo": "https://github.com/annaxiomm/nwwm", "demo": "https://annaxiomm.github.io/nwwm"}]...
|
[{"post_id": 72932, "ts": "202 [{"post_id": 72932, "ts": "2026-09-24T02:13:03Z", "hours": 5.9592, "text": "devlog #8 - the end is near stardance is coming to a close, the school holidays are nearing, and I’m running out of things to add to nwwm so I think I’m going to ship it here. I’m really happy with how far I’ve come in this project and I’ve learned a ton about X11, Rust, and myself. GAPS!! every good modern tiling window manager has gaps, so naturally I added them to nwwm. you can configure them in the config.toml through the gaps_inner and gaps_outer rules. gaps_inner controls the gaps between the windows themselves, and gaps_outer controls the gaps between the windows and the outer edge of the screen. other essentials I also added the ability to move windows between two workspaces. you can now set keybinds with the movetoworkspace <workspace> action to move the currently focused window to <workspace> . this was fairly easy to implement but I did run into a bug where the wm wasn’t correctly selecting a new window to focus after the focused window was moved to another workspace. I also finally added the ability to move focus backwards instead of just forwards, which you can do with the focus last action. promotional material I also sunk a few hours into making a cool little website for nwwm. it’s pretty generic but it gets the job done, and has a demo, config, screenshot, project description, and an example config file. you can see the website at annaxiomm.github.io/nwwm . finally, I made a simple logo in the form of a compass (because nwwm stands for N orth W est W indow M anager ) next steps ship it cash in my loot"}, {"post_id": 67018, "ts": "2026-09-13T01:49:32Z", "hours": 1.0403, "text": "devlog #7 - sanity check a bit of a short devlog here, but I decided to take a break from programming to make the repo look a bit more presentable (I’m planning to ship soon so it needs to look good for the camera!) README changes the existing README was quite barebones so I fully fleshed it out with a bunch of new stuff, including a proper testing tutorial, configuration help, and an entire section dedicated to what’s wrong with the project and what I’m going to fix when I decide to try and rewrite this bowl of spaghetti at some point next steps cleaning up the project, writting code comments, etc polishing up the project with some final features, like vanity gaps making a landing page for the wm because I know that when it comes time to ship, most people won’t be able to try out nwwm for themselves so I want to make a little showcase (so I don’t get a bad grade for usability!)"}, {"post_id": 66302, "ts": "2026-09-12T02:00:06Z", "hours": 3.9894, "text": "devlog #6 - CONFIGURATION!!! adding a config file has been in the next steps of just about every devlog i’ve made, and i finally got around to doing it! config.toml nwwm wouldn’t be a cliche rust project without a config.toml . but in all seriousness, i really like toml as a configuration language and it integrates really cleanly with rust anyway. so far, you can set parameters like window border, mod key, and default layout in $HOME/.config/nwwm/config.toml and nwwm will read those and apply them at runtime. unfortunately, config isn’t reloadable at the moment (next step?). you can also configure keybinds and even startup commands! i would really have liked to have lua scripting as a config but it’s just a bit too hard for a first wm project. the error handling is pretty hairy at the moment but i’ll fix that soon i promise other stuff i’ve changed not much else happened, but i added a feature where debug logging only happens if you run nwwm with -v or --verbose . next steps better error handling in config loading config re loading at runtime better documentation (maybe a website?)"}, {"post_id": 64645, "ts": "2026-09-09T06:37:27Z", "hours": 6.4375, "text": "devlog #5 - self hosted? ok it’s been quite a while since my last devlog but i’ve added a ton of new stuff - to the point where nwwm might become my main window manager soon! docks n’ struts “what even are those?” i hear you ask, and fear not because i am here to answer. a docked window is any kind of window that isn’t tiled, doesn’t belong to any workspace, and reserves space on the screen that other windows can’t take up. a really common example is a status bar: it persists between desktops, and reserves space on the screen. a strut is basically the space on the screen that it reserves. i implemented support for this so you can now use your favourite status bar with nwwm! i also spent like 3 hours debugging an error that happened sometimes when you closed a docked window, and ended up fixing it by complete accident workspaces 🧰 a window manager is basically useless without workspaces, so naturally i’ve added them to nwwm. they were actually quite easy to implement since i’ve technically supported them since day 1 i just never added workspace switching. basically when you switch a workspace it checks to see if the workspace exists, then it unfocuses the current window, unmaps (hides) all the windows in the current workspace, switches to the new workspace, maps (shows) all the windows in the new workspace, and focuses the first window in the new workspace. phew, try saying that in one breath! status bar compatibility as i mentioned earlier, i added struts and docks so that status bars can reserve space on the screen, but i also added some ewmh hints that allow status bars to see and change the current desktop. this was really easy, i just had to add some atoms and listen for ClientMessage events, and then connect those to my existing code next steps config file loading more ewmh 😭"}, {"post_id": 46047, "ts": "2026-08-12T23:48:13Z", "hours": 3.6097, "text": "devlog #4 - +10 usability! we’re now shifting from the realm of “experimental” to “experimental but usable ”. i’ve added a ton of new features recently and i’m really happy with how nwwm is coming together. actually good tiling i’ve added 2 new tiling layouts: monocle, and master/stack. monocle is the easiest to understand: all windows are the same size as the screen, and the currently focused window is brought to the front. master/stack is the traditional layout you see in wms like dwm, where there is a “master” window that takes up half of the screen and the rest split vertically (or “stack”) on the other half of the screen. i also added keybinds that switch between layouts revamped keybind system previously, the keybind system was just using raw x11 keycodes which were really annoying because they don’t match up with any other system (25 = w??) and are keymap-dependant. so, i switched to using xkbcommon and now keybinds are defined with more human-readable keysyms like KEY_w or KEY_Return . i also implemented a small command runner system so now you can launch commands with keybinds. so far i’ve set Mod+Enter to launch kitty and ofc these will all be configurable through the config file mysterious bugs i spent ages trying to debug some weird behaviour where bound keys wouldn’t register as keypresses if no windows had been opened in nwwm yet. after a lot of trial and error, and a few ChatGPT therapy sessions, i discovered that my error was one letter: i had keyboard_mode in the global mouse grab (which i need for click to focus) set to GrabMode::Sync instead of GrabMode::Async (fml) next steps more usability (moving windows, closing windows) better EWMH compliance support for temporary and permanent floating windows (i.e. tiled windows that you make float, and windows that only float like rofi) config file when?"}, {"post_id": 42968, "ts": "2026-08-07T23:32:08Z", "hours": 3.5736, "text": "devlog #3 - wow! visuals! how many times can i call conn.send_request() in one program?? config file i made a struct called Config which the wm owns, and it has values like border width, color, and keybinds. eventually it will read from a config.toml file but for now it’s all hard coded in the source code. window borders windows now have borders with color and width deriving from the Config (meaning they’ll be configurable through a config file at some point!). also, the currently focused window has a different border color (also configurable!) modular keybinds instead of hard-coding keybinds, i gave Config a child called Keybinds , which are hard coded in the source code… but eventually they’ll be part of the config file. when each keybind is called, it calls an Action which is linked to a function call in the wm. later there’ll be plenty of actions for anything you can think of, but for now theres only FocusNext which… focuses the next window! next steps config.toml loading better tiling (again) gaps EWMH compliance"}, {"post_id": 42307, "ts": "2026-08-06T23:15:26Z", "hours": 2.8794, "text": "devlog #2 - an actual window manager x11 is an ancient beast, full of mismatched types (screen height is a u16, window height is a u32, window position is an i32, etc), difficult protocols, and more double colons than you can shake a stick at, but i’m working through it. a (tiling) window manager i started off by storing a list of open workspaces in the main wm struct, and each workspace has a list of open windows (and a tiling layout). then, i made the wm listen for DestroyNotify events and remove them from their respective workspaces. soon after marvelling at my creation i realised that i could only see one window at a time, so i worked on implementing a basic tiling algorithm. so far, all i have is columns ( window_width = screen_width / num_of_windows ) but i’m working on adding master-stack tiling (what dwm uses) focus! i also realised that it’s no use having multiple windows if you can only use type on one, so i made each window grab the left click, and then listen for ButtonPress events, focusing the clicked window. next steps more tiling layouts cosmetic stuff (borders, gaps) keyboard shortcuts"}, {"post_id": 40452, "ts": "2026-08-03T23:38:06Z", "hours": 2.6114, "text": "devlog #1 - getting things started after working on tundra I decided that I wanted to make a window manager for an actual os instead, so I loaded arch onto an old macbook and got started. xlib woes I initially started by loosely following a tutorial that uses xlib for rust, but I soon realised that any direct mapping to C from rust is going to be an absolute horror to use (literally every function call had to be unsafe), so I switched to xcb. it has a slightly different API but it’s cleaner and i3 uses it so it must be good. current features: it runs it doesn’t crash you can open a window (by externally injecting it from a command prompt next steps: storing open windows in a struct / list basic tiling"}]...
|
Title: nwwm by @pinetree182 | Stardance
Devlogs:
Title: nwwm by @pinetree182 | Stardance
Devlogs:
devlog #1 - getting things started after working on tundra I decided that I wanted to make a window manager for an actual os instead, so I loaded arch onto an old macbook and got started. xlib woes I initially started by loosely following a tutorial that uses xlib for rust, but I soon realised that any direct mapping to C from rust is going to be an absolute horror to use (literally every function call had to be unsafe), so I switched to xcb. it has a slightly different API but it’s cleaner and i3 uses it so it must be good. current features: it runs it doesn’t crash you can open a window (by externally injecting it from a command prompt next steps: storing open windows in a struct / list basic tiling
devlog #2 - an actual window manager x11 is an ancient beast, full of mismatched types (screen height is a u16, window height is a u32, window position is an i32, etc), difficult protocols, and more double colons than you can shake a stick at, but i’m working through it. a (tiling) window manager i started off by storing a list of open workspaces in the main wm struct, and each workspace has a list of open windows (and a tiling layout). then, i made the wm listen for DestroyNotify events and remove them from their respective workspaces. soon after marvelling at my creation i realised that i could only see one window at a time, so i worked on implementing a basic tiling algorithm. so far, all i have is columns ( window_width = screen_width / num_of_windows ) but i’m working on adding master-stack tiling (what dwm uses) focus! i also realised that it’s no use having multiple windows if you can only use type on one, so i made each window grab the left click, and then listen for ButtonPress events, focusing the clicked window. next steps more tiling layouts cosmetic stuff (borders, gaps) keyboard shortcuts
devlog #3 - wow! visuals! how many times can i call conn.send_request() in one program?? config file i made a struct called Config which the wm owns, and it has values like border width, color, and keybinds. eventually it will read from a config.toml file but for now it’s all hard coded in the source code. window borders windows now have borders with color and width deriving from the Config (meaning they’ll be configurable through a config file at some point!). also, the currently focused window has a different border color (also configurable!) modular keybinds instead of hard-coding keybinds, i gave Config a child called Keybinds , which are hard coded in the source code… but eventually they’ll be part of the config file. when each keybind is called, it calls an Action which is linked to a function call in the wm. later there’ll be plenty of actions for anything you can think of, but for now theres only FocusNext which… focuses the next window! next steps config.toml loading better tiling (again) gaps EWMH compliance
devlog #4 - +10 usability! we’re now shifting from the realm of “experimental” to “experimental but usable ”. i’ve added a ton of new features recently and i’m really happy with how nwwm is coming together. actually good tiling i’ve added 2 new tiling layouts: monocle, and master/stack. monocle is the easiest to understand: all windows are the same size as the screen, and the currently focused window is brought to the front. master/stack is the traditional layout you see in wms like dwm, where there is a “master” window that takes up half of the screen and the rest split vertically (or “stack”) on the other half of the screen. i also added keybinds that switch between layouts revamped keybind system previously, the keybind system was just using raw x11 keycodes which were really annoying because they don’t match up with any other system (25 = w??) and are keymap-dependant. so, i switched to using xkbcommon and now keybinds are defined with more human-readable keysyms like KEY_w or KEY_Return . i also implemented a small command runner system so now you can launch commands with keybinds. so far i’ve set Mod+Enter to launch kitty and ofc these will all be configurable through the config file mysterious bugs i spent ages trying to debug some weird behaviour where bound keys wouldn’t register as keypresses if no windows had been opened in nwwm yet. after a lot of trial and error, and a few ChatGPT therapy sessions, i discovered that my error was one letter: i had keyboard_mode in the global mouse grab (which i need for click to focus) set to GrabMode::Sync instead of GrabMode::Async (fml) next steps more usability (moving windows, closing windows) better EWMH compliance support for temporary and permanent floating windows (i.e. tiled windows that you make float, and windows that only float like rofi) config file when?
devlog #5 - self hosted? ok it’s been quite a while since my last devlog but i’ve added a ton of new stuff - to the point where nwwm might become my main window manager soon! docks n’ struts “what even are those?” i hear you ask, and fear not because i am here to answer. a docked window is any kind of window that isn’t tiled, doesn’t belong to any workspace, and reserves space on the screen that other windows can’t take up. a really common example is a status bar: it persists between desktops, and reserves space on the screen. a strut is basically the space on the screen that it reserves. i implemented support for this so you can now use your favourite status bar with nwwm! i also spent like 3 hours debugging an error that happened sometimes when you closed a docked window, and ended up fixing it by complete accident workspaces 🧰 a window manager is basically useless without workspaces, so naturally i’ve added them to nwwm. they were actually quite easy to implement since i’ve technically supported them since day 1 i just never added workspace switching. basically when you switch a workspace it checks to see if the workspace exists, then it unfocuses the current window, unmaps (hides) all the windows in the current workspace, switches to the new workspace, maps (shows) all the windows in the new workspace, and focuses the first window in the new workspace. phew, try saying that in one breath! status bar compatibility as i mentioned earlier, i added struts and docks so that status bars can reserve space on the screen, but i also added some ewmh hints that allow status bars to see and change the current desktop. this was really easy, i just had to add some atoms and listen for ClientMessage events, and then connect those to my existing code next steps config file loading more ewmh 😭
devlog #6 - CONFIGURATION!!! adding a config file has been in the next steps of just about every devlog i’ve made, and i finally got around to doing it! config.toml nwwm wouldn’t be a cliche rust project without a config.toml . but in all seriousness, i really like toml as a configuration language and it integrates really cleanly with rust anyway. so far, you can set parameters like window border, mod key, and default layout in $HOME/.config/nwwm/config.toml and nwwm will read those and apply them at runtime. unfortunately, config isn’t reloadable at the moment (next step?). you can also configure keybinds and even startup commands! i would really have liked to have lua scripting as a config but it’s just a bit too hard for a first wm project. the error handling is pretty hairy at the moment but i’ll fix that soon i promise other stuff i’ve changed not much else happened, but i added a feature where debug logging only happens if you run nwwm with -v or --verbose . next steps better error handling in config loading config re loading at runtime better documentation (maybe a website?)
devlog #7 - sanity check a bit of a short devlog here, but I decided to take a break from programming to make the repo look a bit more presentable (I’m planning to ship soon so it needs to look good for the camera!) README changes the existing README was quite barebones so I fully fleshed it out with a bunch of new stuff, including a proper testing tutorial, configuration help, and an entire section dedicated to what’s wrong with the project and what I’m going to fix when I decide to try and rewrite this bowl of spaghetti at some point next steps cleaning up the project, writting code comments, etc polishing up the project with some final features, like vanity gaps making a landing page for the wm because I know that when it comes time to ship, most people won’t be able to try out nwwm for themselves so I want to make a little showcase (so I don’t get a bad grade for usability!)
devlog #8 - the end is near stardance is coming to a close, the school holidays are nearing, and I’m running out of things to add to nwwm so I think I’m going to ship it here. I’m really happy with how far I’ve come in this project and I’ve learned a ton about X11, Rust, and myself. GAPS!! every good modern tiling window manager has gaps, so naturally I added them to nwwm. you can configure them in the config.toml through the gaps_inner and gaps_outer rules. gaps_inner controls the gaps between the windows themselves, and gaps_outer controls the gaps between the windows and the outer edge of the screen. other essentials I also added the ability to move windows between two workspaces. you can now set keybinds with the movetoworkspace <workspace> action to move the currently focused window to <workspace> . this was fairly easy to implement but I did run into a bug where the wm wasn’t correctly selecting a new window to focus after the focused window was moved to another workspace. I also finally added the ability to move focus backwards instead of just forwards, which you can do with the focus last action. promotional material I also sunk a few hours into making a cool little website for nwwm. it’s pretty generic but it gets the job done, and has a demo, config, screenshot, project description, and an example config file. you can see the website at annaxiomm.github.io/nwwm . finally, I made a simple logo in the form of a compass (because nwwm stands for N orth W est W indow M anager ) next steps ship it cash in my loot
Ships:
I made nwwm, a simple tiling window manager for the X windowing system, a popular display server for Linux. Its job is basically to decide where windows go on the screen and how they should look, as well as listen to keypresses and decide what should happen. I ran into quite a few issues since I was using Rust which is not a language I’m 100% familiar with, and this was also my first proper systems-level project, but I managed to pull through and I’m really happy with where nwwm has gotten. Some features include: Tiling Multiple workspaces Support for docked windows, like statusbars Config loading from ~/.config/nwwm/config.toml Configurable keybinds (Barebones) EWMH support Since this is a Linux project, I know that most people won’t be able to test it so I’ve made a small video showing off some of the core features. You can view this video on the website, just scroll down to the “Demo” section and play the video....
|
1792853400.3687747
|
1792939800.3687747
|
|
12071
|
Matrix Encoder by @Silvend | Stardance
|
Silvend
|
1
|
11.0
|
131
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T01:53:10Z", "hours": 11.0, "multiplier": 12.37, "payout": 131, "blessing": "neutral", "text": "Hello, I am Eli, and I created a decoder/encoder that utilizes matrices! The encoder works by assigning each letter of your input text a numerical value. Then, the numbers are arranged into pairs like this: [8 5][12 12][15 0]. Finally, these small matrices are multiplied by a key matrix. This multiplication gives you the final result for the encoded message. The decoder works by taking numerical input and transforming it into a decoded message. The numerical input is also arranged into pairs. These pairs are then multiplied by the inverse of the key matrix. Finally, using the numbers you calculate for, you translate into their alphabetical equivalent. Did that make no sense? Do not worry! My website also includes a page explaining the process behind using matrices in cryptography. It does not only include text, but also little silly graphics to help you understand better. The goal isn’t just to have decoder, but also to spread my love of math to others!! Challenges: The biggest challenge I went through was that my code was not working according to my math. Instead of multiplying my pairs by the key matrix, it was multiplying them in the incorrect order. This caused the resulting output to be very off. Thankfully, was able to determine what to swap to make my encoder work. The best part: my favorite part of this project was creating the graphics. Even if they are not a major part of my project, they still add a cute whimsy to it!", "repo": "https://github.com/SILVENDz/matrixencoder", "demo": "https://silvendz.github.io/matrixencoder/"}]...
|
[{"post_id": 72502, "ts": "202 [{"post_id": 72502, "ts": "2026-09-23T02:54:19Z", "hours": 1.5458, "text": "Devlog #10: Hello! I have finalized the last couple of updates to my project. It’s been so fun! I added a new page that explains the basics of matrices(such as multiplication, finding the determinant, and solving for inverse matrices) in addition to the key page. Additionally, I just made a couple of CSS changes to the images, buttons, and lists in order for it to not look as cluttered. After this, my project should be ready to ship for approval!!"}, {"post_id": 68442, "ts": "2026-09-15T03:57:54Z", "hours": 0.6228, "text": "Devlog #9 : Hello! I apologize for the short devlog, I recently began my Third-Space project so it became kinda hard to manage both of my projects at the same time. Today, I focused mostly on simple CSS updates. I wanted to make my website a bit more “dynamic” even if the changes were minimal. You know, a little goes a long way. I just set up space for future explanations, made some dividers smaller by adding a scrolling feature, and added hover background-color change to all of the buttons!"}, {"post_id": 67739, "ts": "2026-09-13T23:31:01Z", "hours": 0.9078, "text": "Devlog #8 : Hello! I finalized the decoder!! Now, my website can both encode and decode messages. It took a while cuz I kept misspelling a bunch of stuff, but it works at last! Technically, my project is done, but I still want to add more information about matrices and cryptography for those who are also interested."}, {"post_id": 66935, "ts": "2026-09-12T22:12:45Z", "hours": 0.9322, "text": "Devlog #7: Hi! Today I revised my code to ensure that it was working according to my mathematical process. For my javascript, I just switched around the vector and matrix and defined spaces as zeros. Before, the values were not being multiplied in the correct order and a space was numerically identified as 27 rather than zero, which altered the final message by A LOT. After these fixes, the encoded message given by my code and by my math were the same!! (See images below) I’m really happy to see this project starting to work like intended. My next update will be on the decoder"}, {"post_id": 66309, "ts": "2026-09-12T02:17:19Z", "hours": 1.0292, "text": "Devlog #6: Hi! Today, I was able to get started on the actual encoder! I used a bit ai to help me understand the javascript code as well as where I could modify it in order to make it fit my matrix key. However, I ran the code through several trials and encoded the text manually, and it seems that there must be something wrong with my code. The response I got from my encoder and from my own math were pretty different… Therefore, I will try to look for what went wrong and hopefully fix it so that it works according to plan!! Once that is settled, I look forward to also adding a matrix decoder using inverse matrices."}, {"post_id": 65746, "ts": "2026-09-11T03:07:59Z", "hours": 1.3411, "text": "Devlog #5: Hi! Today I was able to work more on explaining how encoding with matrices actually works. Alongside the steps, I also included cute visual representations for the matrices. Currently, I am only missing one more visual for my explanation. I also made the containers scrollable (using overflow.y: auto) because it was slightlyyyy overwhelming without it. Now, this page is a little more organized. After I finish visually demonstrating how matrices are multiplied, I will move on to the actual encoder (the scary part) 。°(°¯᷄◠¯᷅°)°。 Also, don’t mind my kaomoji overuse.."}, {"post_id": 65149, "ts": "2026-09-10T02:47:34Z", "hours": 1.1711, "text": "Devlog #4: Hi again! Today, I was able to work more on explaining how matrices allow you to encode messages. So far, I only have my key for each letter as well as the matrix key I will be using to encode the messages. I will, more than likely, rearrange the way the images are placed on the website. Additionally, I’ll explain how messages are transformed into smaller matrices that are multiplied by the given matrix key. I’ll also explain how inverse matrices can be used to decode those messages!"}, {"post_id": 64583, "ts": "2026-09-09T02:52:11Z", "hours": 0.6175, "text": "Devlog #3: Hello! This is a tiny devlog, mainly just css updates, sorryyy. Basically, I updated the “How?” page in order for it to look like the home page. Now, both of them have marquees and placeholder divs for the input, output, explanation, and some images! I took away the lettering I did, I didn’t really like it that muchh (╥﹏╥). I will TRY to actually get started on the explanation tomorrow (beware, I’m very passionate about matrices)"}, {"post_id": 63985, "ts": "2026-09-08T02:32:42Z", "hours": 1.595, "text": "Deblog #2 : Hello again! Today, I did some text for the navigation section using Ibis paint and lapse to track my time. They came out a little lopsided, but it adds to personality of the website, in a way… I’m currently trying to make it cool using CSS. (yes, I’m trying to delay doing the actual javascript code for the encoder…) Just for detail, I did a marquee container in order for the welcome text to scroll. I plan on doing my matrix explanation next under the “HOW” section"}, {"post_id": 63328, "ts": "2026-09-07T02:56:23Z", "hours": 0.7994, "text": "Devlog #1: Hello! This is a new project I am working on called “Matrix Encoder.” The goal is for users to be able to input any message they wish to encode and the software will turn it into a list of numbers. Currently, I only plan to make an encoder, but hopefully I am able to also include decoding capabilities. So far, I started with the website layout using HTML and CSS. I included two pages using the nav tag. One will be the actual encoder and the second one will be a (NOT)small explanation of how matrices are used in cryptography! I look forward to creating art that fits the website’s terminal-esque aesthetic!"}]...
|
Title: Matrix Encoder by @Silvend | Stardance
Dev Title: Matrix Encoder by @Silvend | Stardance
Devlogs:
Devlog #1: Hello! This is a new project I am working on called “Matrix Encoder.” The goal is for users to be able to input any message they wish to encode and the software will turn it into a list of numbers. Currently, I only plan to make an encoder, but hopefully I am able to also include decoding capabilities. So far, I started with the website layout using HTML and CSS. I included two pages using the nav tag. One will be the actual encoder and the second one will be a (NOT)small explanation of how matrices are used in cryptography! I look forward to creating art that fits the website’s terminal-esque aesthetic!
Deblog #2 : Hello again! Today, I did some text for the navigation section using Ibis paint and lapse to track my time. They came out a little lopsided, but it adds to personality of the website, in a way… I’m currently trying to make it cool using CSS. (yes, I’m trying to delay doing the actual javascript code for the encoder…) Just for detail, I did a marquee container in order for the welcome text to scroll. I plan on doing my matrix explanation next under the “HOW” section
Devlog #3: Hello! This is a tiny devlog, mainly just css updates, sorryyy. Basically, I updated the “How?” page in order for it to look like the home page. Now, both of them have marquees and placeholder divs for the input, output, explanation, and some images! I took away the lettering I did, I didn’t really like it that muchh (╥﹏╥). I will TRY to actually get started on the explanation tomorrow (beware, I’m very passionate about matrices)
Devlog #4: Hi again! Today, I was able to work more on explaining how matrices allow you to encode messages. So far, I only have my key for each letter as well as the matrix key I will be using to encode the messages. I will, more than likely, rearrange the way the images are placed on the website. Additionally, I’ll explain how messages are transformed into smaller matrices that are multiplied by the given matrix key. I’ll also explain how inverse matrices can be used to decode those messages!
Devlog #5: Hi! Today I was able to work more on explaining how encoding with matrices actually works. Alongside the steps, I also included cute visual representations for the matrices. Currently, I am only missing one more visual for my explanation. I also made the containers scrollable (using overflow.y: auto) because it was slightlyyyy overwhelming without it. Now, this page is a little more organized. After I finish visually demonstrating how matrices are multiplied, I will move on to the actual encoder (the scary part) 。°(°¯᷄◠¯᷅°)°。 Also, don’t mind my kaomoji overuse..
Devlog #6: Hi! Today, I was able to get started on the actual encoder! I used a bit ai to help me understand the javascript code as well as where I could modify it in order to make it fit my matrix key. However, I ran the code through several trials and encoded the text manually, and it seems that there must be something wrong with my code. The response I got from my encoder and from my own math were pretty different… Therefore, I will try to look for what went wrong and hopefully fix it so that it works according to plan!! Once that is settled, I look forward to also adding a matrix decoder using inverse matrices.
Devlog #7: Hi! Today I revised my code to ensure that it was working according to my mathematical process. For my javascript, I just switched around the vector and matrix and defined spaces as zeros. Before, the values were not being multiplied in the correct order and a space was numerically identified as 27 rather than zero, which altered the final message by A LOT. After these fixes, the encoded message given by my code and by my math were the same!! (See images below) I’m really happy to see this project starting to work like intended. My next update will be on the decoder
Devlog #8 : Hello! I finalized the decoder!! Now, my website can both encode and decode messages. It took a while cuz I kept misspelling a bunch of stuff, but it works at last! Technically, my project is done, but I still want to add more information about matrices and cryptography for those who are also interested.
Devlog #9 : Hello! I apologize for the short devlog, I recently began my Third-Space project so it became kinda hard to manage both of my projects at the same time. Today, I focused mostly on simple CSS updates. I wanted to make my website a bit more “dynamic” even if the changes were minimal. You know, a little goes a long way. I just set up space for future explanations, made some dividers smaller by adding a scrolling feature, and added hover background-color change to all of the buttons!
Devlog #10: Hello! I have finalized the last couple of updates to my project. It’s been so fun! I added a new page that explains the basics of matrices(such as multiplication, finding the determinant, and solving for inverse matrices) in addition to the key page. Additionally, I just made a couple of CSS changes to the images, buttons, and lists in order for it to not look as cluttered. After this, my project should be ready to ship for approval!!
Ships:
Hello, I am Eli, and I created a decoder/encoder that utilizes matrices! The encoder works by assigning each letter of your input text a numerical value. Then, the numbers are arranged into pairs like this: [8 5][12 12][15 0]. Finally, these small matrices are multiplied by a key matrix. This multiplication gives you the final result for the encoded message. The decoder works by taking numerical input and transforming it into a decoded message. The numerical input is also arranged into pairs. These pairs are then multiplied by the inverse of the key matrix. Finally, using the numbers you calculate for, you translate into their alphabetical equivalent. Did that make no sense? Do not worry! My website also includes a page explaining the process behind using matrices in cryptography. It does not only include text, but also little silly graphics to help you understand better. The goal isn’t just to have decoder, but also to spread my love of math to others!! Challenges: The biggest challenge I went through was that my code was not working according to my math. Instead of multiplying my pairs by the key matrix, it was multiplying them in the incorrect order. This caused the resulting output to be very off. Thankfully, was able to determine what to swap to make my encoder work. The best part: my favorite part of this project was creating the graphics. Even if they are not a major part of my project, they still add a cute whimsy to it!...
|
1792853358.3311617
|
1792939758.3311617
|
|
61558
|
ButterOS by @butterlabs | Stardance
|
butterlabs
|
2
|
22.73
|
20
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T01:45:18Z", "hours": 5.0, "multiplier": 4.24, "payout": 20, "blessing": "neutral", "text": "What did I make? Well I added quite a lot this update, including a cloud based music app, working terminal with a file system, and an app with info about the project! What are some challenges? Mainly the file system, it took a lot of time figuring out how caching works. Overall a solid ship with the terminal being my favorite part!", "repo": "https://github.com/Butterific/ButterOS", "demo": "https://butteros.butterlabs.app/"}, {"ship_num": 2, "ts": "2026-09-17T17:11:20Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What Did I make I made ButterOS, a lightweight easy to use opertating system powered by html, css, and js. Apps This WebOS currently features 2 app: Calculator - Calculates stuff SimplyEpic - Google search but no ai and only searches academic sites (3 to be exact) Plans for the future Add support with Streamables inorder to build a cloud based music app using stream codes. Remake the toolbar from scratch because its not much different from the guide add support for connecting to other butterlabs services What I struggled with Sizing.", "repo": "https://github.com/Butterific/ButterOS", "demo": "https://butteros.butterlabs.app/"}]...
|
[{"post_id": 80542, "ts": "202 [{"post_id": 80542, "ts": "2026-10-18T04:02:03Z", "hours": 3.5881, "text": "Devlog #9 MAJOR PROGRESS I made MAJOR progress on the operating system! Including a huge overall of the ui to a gold/rosegold style, you can view the old vs new here Old ui https://a430d5e1.butteros.pages.dev/ new ui https://butteros.blrc.me/ also added a new settings app and games app!"}, {"post_id": 79365, "ts": "2026-10-13T17:34:32Z", "hours": 2.2164, "text": "Devlog #8 Animated background Startup animation i did spend alot of time coding the background with the help of ai because it is just a html script rendered as a video, the old html for the video is in one of the commits recently"}, {"post_id": 77049, "ts": "2026-10-05T14:25:01Z", "hours": 2.9272, "text": "Devlog #7 I mainly fixed bugs during these 3 hours from the past ship some of these bugs include fixing scrolling in SimplyEpic opening new tabs from SimplyEpic in a new tab instead of a popup fixed the hidden c in the calculator window for smaller window sizes ADDED A SAVED TRACK LIST TO MUSIC (FINNIALY) A lot of the fixes were added with the help of ai (cache music list and hidden c due to it being this out of my current skill level) Future plans WIndow closing and opening animations Higher quality bg add better styling to the notes app (unfinished) (ignored the blocked, its just my school mac)"}, {"post_id": 72923, "ts": "2026-09-24T01:42:39Z", "hours": 2.1103, "text": "Devlog #6 I made a working command line with a cached file system!!!"}, {"post_id": 71911, "ts": "2026-09-21T19:12:23Z", "hours": 0.3869, "text": "Devlog #5 I added a working info app! not that much for this log"}, {"post_id": 71597, "ts": "2026-09-21T03:53:50Z", "hours": 2.1403, "text": "Devlog #4 I ADD A WORKING CLOUD BASED MUSIC APP todo: make some songs just for butteros cuz im to lazy to make them (I WILL use ai for tracks idk)"}, {"post_id": 69714, "ts": "2026-09-17T17:07:20Z", "hours": 0.5283, "text": "Devlog #3 finished writing the readme and adding a gallery, Im gonna ship this soon"}, {"post_id": 69258, "ts": "2026-09-16T18:05:05Z", "hours": 4.2694, "text": "Devlog #2 Major progress once again Got 2 working apps - Calculator and SimplyEpic finished the welcome screen and desktop got a working background"}, {"post_id": 67596, "ts": "2026-09-13T18:58:00Z", "hours": 4.0636, "text": "Devlog #1 Major progress regarding windows! i got the main window system and welcome message setup. Also got a working topbar!"}]...
|
Title: ButterOS by @butterlabs | Stardance
Devlog Title: ButterOS by @butterlabs | Stardance
Devlogs:
Devlog #1 Major progress regarding windows! i got the main window system and welcome message setup. Also got a working topbar!
Devlog #2 Major progress once again Got 2 working apps - Calculator and SimplyEpic finished the welcome screen and desktop got a working background
Devlog #3 finished writing the readme and adding a gallery, Im gonna ship this soon
Devlog #4 I ADD A WORKING CLOUD BASED MUSIC APP todo: make some songs just for butteros cuz im to lazy to make them (I WILL use ai for tracks idk)
Devlog #5 I added a working info app! not that much for this log
Devlog #6 I made a working command line with a cached file system!!!
Devlog #7 I mainly fixed bugs during these 3 hours from the past ship some of these bugs include fixing scrolling in SimplyEpic opening new tabs from SimplyEpic in a new tab instead of a popup fixed the hidden c in the calculator window for smaller window sizes ADDED A SAVED TRACK LIST TO MUSIC (FINNIALY) A lot of the fixes were added with the help of ai (cache music list and hidden c due to it being this out of my current skill level) Future plans WIndow closing and opening animations Higher quality bg add better styling to the notes app (unfinished) (ignored the blocked, its just my school mac)
Devlog #8 Animated background Startup animation i did spend alot of time coding the background with the help of ai because it is just a html script rendered as a video, the old html for the video is in one of the commits recently
Devlog #9 MAJOR PROGRESS I made MAJOR progress on the operating system! Including a huge overall of the ui to a gold/rosegold style, you can view the old vs new here Old ui https://a430d5e1.butteros.pages.dev/ new ui https://butteros.blrc.me/ also added a new settings app and games app!
Ships:
What Did I make I made ButterOS, a lightweight easy to use opertating system powered by html, css, and js. Apps This WebOS currently features 2 app: Calculator - Calculates stuff SimplyEpic - Google search but no ai and only searches academic sites (3 to be exact) Plans for the future Add support with Streamables inorder to build a cloud based music app using stream codes. Remake the toolbar from scratch because its not much different from the guide add support for connecting to other butterlabs services What I struggled with Sizing.
What did I make? Well I added quite a lot this update, including a cloud based music app, working terminal with a file system, and an app with info about the project! What are some challenges? Mainly the file system, it took a lot of time figuring out how caching works. Overall a solid ship with the terminal being my favorite part!...
|
1792813857.059196
|
1792900257.059196
|
|
65044
|
NASA APOD Viewer by @Coding-AN | Stardance
|
Coding-AN
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T01:11:20Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This site is a viewer for NASA’s Astronomy Picture of the Day. It features a clean interface that shows the picture, along with its title and explanation, as well as an animated background and sidebars. It’s lightweight by design, and also marks the first time I’ve made an API call for a web project.", "repo": "https://github.com/Coding-AN/NASA-APOD-Viewer", "demo": "https://coding-an.github.io/NASA-APOD-Viewer/"}]...
|
[{"post_id": 72909, "ts": "202 [{"post_id": 72909, "ts": "2026-09-24T00:40:11Z", "hours": 1.2261, "text": "I added all the CSS, so the site looks really good now. One touch I added at the end that I really liked was an animated background. The stars subtly twinkle, and I think it looks really cool. Although I was originally planning to expand this into a full new tab page after this, I’ve decided to finish this project here, since I don’t think it would look that good if I took what I have now and delegate it to a corner of the page. Since this site is now complete, I will now be shipping it soon."}, {"post_id": 72873, "ts": "2026-09-23T22:21:22Z", "hours": 0.9253, "text": "I finally got the API call to work, and the image is finally displaying. The reason it took so long to work was because I gave my env file a name, which meant that vite couldn’t recognize it and the API call failed. Luckily, I was finally able to figure it out, which means that I’m now moving on to css styling."}, {"post_id": 72615, "ts": "2026-09-23T11:02:30Z", "hours": 0.4786, "text": "I started the Custom New Tab mission, and got all of the setup finished. It took way longer than expected because the .env file kept showing up in the repo even though it was in the gitignore. I finally fixed it after adding *.env to the gitignore, but it took me a while to figure that out."}]...
|
Title: NASA APOD Viewer by @Coding-AN | Stardance
Title: NASA APOD Viewer by @Coding-AN | Stardance
Devlogs:
I started the Custom New Tab mission, and got all of the setup finished. It took way longer than expected because the .env file kept showing up in the repo even though it was in the gitignore. I finally fixed it after adding *.env to the gitignore, but it took me a while to figure that out.
I finally got the API call to work, and the image is finally displaying. The reason it took so long to work was because I gave my env file a name, which meant that vite couldn’t recognize it and the API call failed. Luckily, I was finally able to figure it out, which means that I’m now moving on to css styling.
I added all the CSS, so the site looks really good now. One touch I added at the end that I really liked was an animated background. The stars subtly twinkle, and I think it looks really cool. Although I was originally planning to expand this into a full new tab page after this, I’ve decided to finish this project here, since I don’t think it would look that good if I took what I have now and delegate it to a corner of the page. Since this site is now complete, I will now be shipping it soon.
Ships:
This site is a viewer for NASA’s Astronomy Picture of the Day. It features a clean interface that shows the picture, along with its title and explanation, as well as an animated background and sidebars. It’s lightweight by design, and also marks the first time I’ve made an API call for a web project....
|
1792814197.3455973
|
1792900597.3455973
|
|
62298
|
Minesweeper Game by @Sadiya | Stardance
|
Sadiya
|
1
|
4.0
|
4
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T00:17:35Z", "hours": 4.0, "multiplier": 1.17, "payout": 4, "blessing": "neutral", "text": "I made a Minesweeper game that has randomly placed bombs with buttons. A challenge was getting the game logic to work. I am proud of being able to finish this project.", "repo": "https://github.com/sadiyameem/minesweeper-game", "demo": "https://sadiyameem.github.io/minesweeper-game/"}]...
|
[{"post_id": 72904, "ts": "202 [{"post_id": 72904, "ts": "2026-09-24T00:13:52Z", "hours": 1.8356, "text": "I was finally able to get this to work and I can finally say I am proud of it."}, {"post_id": 71514, "ts": "2026-09-20T23:46:42Z", "hours": 0.8789, "text": "I have decided to start over and I want to take the time to find a simpler and better way on making this project so have fun looking at a blank image."}, {"post_id": 70862, "ts": "2026-09-19T21:47:22Z", "hours": 0.8619, "text": "I have realized that I have not posted a devlog for this project so here it is. I have done the html but I think there are some mistakes and I am currently doing the css and I think for both the html and css I will fix later."}]...
|
Title: Minesweeper Game by @Sadiya | Stardance
De Title: Minesweeper Game by @Sadiya | Stardance
Devlogs:
I have realized that I have not posted a devlog for this project so here it is. I have done the html but I think there are some mistakes and I am currently doing the css and I think for both the html and css I will fix later.
I have decided to start over and I want to take the time to find a simpler and better way on making this project so have fun looking at a blank image.
I was finally able to get this to work and I can finally say I am proud of it.
Ships:
I made a Minesweeper game that has randomly placed bombs with buttons. A challenge was getting the game logic to work. I am proud of being able to finish this project....
|
1792813932.8996053
|
1792900332.8996053
|
|
21103
|
Ritualia by @gabriel_ferreira | Stardance
|
gabriel_ferreira
|
1
|
148.7
|
2310
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-23T23:45:29Z", "hours": 148.0, "multiplier": 18.45, "payout": 2310, "blessing": "neutral", "text": "What did i made I made an complete music play system that will help users to learn while listening to musics! I used youtube, flask, python, mysql, js and hope to make this! What else Solved a lot of painful bugs that were stopping the project from working Finished and made the music queue work Added music description labels Improved a lot the performance Made the website responsive Added a keyboard based navigation Fixed so much errors at the cover-flow that now i forgot how many Added bug checks before the play of each video on the player Created an toast component to show errors or infos Added 54 musics to choose and listen Challenges The most painful code was the player and the cover-flow, they were with a lot of hidden bugs that i had to figure out, feats that i had to make and pain to suffer! Now i figured out that i love and HATE making a website responsive! What im proud of MutationObserver: An observer that loads / hides an image based on its position at the cover-flow, this system took a while and worked very well. Error checks at player: The system can handle the error that happen and dont crash! Keyboard navigation: Everyone can use the keyboard to navigate now! Oracle VM: For the first time i used an ssh and hosted an website in my own machine (oracle, not mine)! How to test Access http://ritualia.duckdns.org/ , when you join and the page loads you will find a screen to choose an genre, select which one you want, after you will see an emotion selector, select the emotion that you wanna feel! You will see the player screen and an audio explaining the music (The audio is in portuguese), after the audio the music will play. Notice: The github and the website are in portuguese, please use your browser built-in translator or any that you want to use the software properly! Follow the installation guides at github if you want to install", "repo": "https://github.com/GF-Silva/Ritualia", "demo": "https://ritualia.hackclub.app"}]...
|
[{"post_id": 73067, "ts": "202 [{"post_id": 73067, "ts": "2026-09-24T09:47:16Z", "hours": 0.6983, "text": "Added english readme I created an english readme, api and install Guide, so it will be easier to read and more accessible for worl-wide users"}, {"post_id": 72881, "ts": "2026-09-23T22:36:56Z", "hours": 0.3906, "text": "It is time to ship! Now the system is working perfectly fine running at a vm in oracle cloud with a public domain, and a dns with duckdns at http://ritualia.duckdns.org/ Warning: It is just HTTP!"}, {"post_id": 72810, "ts": "2026-09-23T19:36:13Z", "hours": 1.3461, "text": "Configuring an ssh server! I configured an oracle cloud vm with ubuntu to host my website 24/7, that was because nest wasnt working in a while. Im running it at a local IP with http only, i will configure https today and maybe an domain, the IP is http://164.152.55.252 , notice that some browsers may block you from accessing and http website. UPDATE AFTER THE DEVLOG: I put an domain using duck dns: http://ritualia.duckdns.org Hardwork I had absolutely not a single knowledge about oracle cloud vm, so configuring it was an hell. Sometime my internet stopped working so i had to use my smartphone, this lead me to configuring an invalid ssh key and i had do configure everything from scratch, i spent 5 hours configuring everything, but that was ssh and wasnt tracked. But now everything is working fine. Thx oracle This vm is a 24/7 entire OS (Virtual Machine) that has some good free plans, without any cold start. Thx stardance Stardance now will have one more mount!!!!!! I still has roughly 40 hours of deep development to do after this ship, i will love to finish that in stardance!"}, {"post_id": 70936, "ts": "2026-09-20T02:22:48Z", "hours": 2.9706, "text": "Added install guides Now there is guides to help the user install for ubuntu, arch and windows. Notice that im a linux user and my pc is weak, so i could not test it on another operational system. Also the guide is in portuguese (all of them), please use your browser built-in translator or any of them to read if u dont understands portuguese I could test it on another linux distro, but i would have to go through all the install steps. Also i cannot try installing windows because it normally wipe out another OS installed on the same disc (i know that it just replaces the bootloader) and using a VM was not possible due to the amount of RAM and the processor that i have."}, {"post_id": 69913, "ts": "2026-09-18T01:53:38Z", "hours": 0.3256, "text": "All done, it is time to ship Every metric at lighthouse it nearly perfect, im so exited to ship it!"}, {"post_id": 69904, "ts": "2026-09-18T01:19:42Z", "hours": 4.9561, "text": "The accessibility workings is done Features Now the system has a new navigation system that allow users to navigate with just the keyboard! (The video was with just the keyboard) Why Why not? It was meant to improve the accessibility for users without mouse, or any another problem and because i was tired of having to use the mouse to debug something. How it was made Again with a lot of pain, the feature itself was easy but i had to fix some errors that went unnoticed, so it took more time. The feature detects when the user press a key and do an action based on wich key was. The accessibility was easy to get 100, but the metrics at lighthouse dont give all what the users will need, i had to think about the website usage and how would be the easiest way for the user. Results The accessibility went from nearly 69 to 100! What next Now i will work on the best practices! Update after the devlog: Nearly every metric is already maxed out lol, i will ship it very soon!"}, {"post_id": 69444, "ts": "2026-09-17T02:13:13Z", "hours": 1.6906, "text": "The performance workings is finished and bug fix Fixes Now the logo z-index is lower, that is because the logo was ‘eating’ the click in more important elements. Also i did a small change at the cover-flow, that change fix the bug of the scroll at the element sudently stoping when at a certain position. The copa script had some old references to images that were leading to bugs, i changed it. Performance I already finished it in the past devlog, i was just checking if there was anything worth improving, but everything is working fine and now is time to improve acessibility. Most of the logged time was me trying to improve more some metrics at the lighthouse, but the work was too much for anything that is already good, so i decided to stop before i started focusing too much in it."}, {"post_id": 69395, "ts": "2026-09-16T23:43:00Z", "hours": 1.505, "text": "Fixing an error at the youtubeHelper Now the youtubeHelpers checks if the youtube API is ready before sending commands. Why Sometimes the API maybe is not finished yet, that was leaving an untreated error that was braking the entire website. How was made With a lot of pain and suffer. I thought “Oh hey, that will be a 15 minutes fix” - i spent 1 HOUR FIGHTING with the iframe itself, nothing was working and at some point i started thinking that even the API of YOUTUBE wasnt working, even the most basic function that should be triggered when the youtube finished the loading wasnt beeing activated, even the console.log(“Api READY!”) wasnt working, even when it worked it wasnt working well, the variable of the player was a promise and not the result. At the end i shut down my PC, defeated, without any energy left, with just hope that in the next day (this) that would be fixed (if not i was planning to ignore and make it a feature “Easter egg, if u dont join the website for a while it will not load!”. The problem here was just the position were the iframe api was in the HTML, it was being loaded before the helper script, so the helper was not there to check if it the iframe was ready or not, the fix was just move it a little down. Architecture It was just an promise, if the function checks that the iframe isnt available it await for it to be available. The check if it was available use the onYoutubeIframeAPIReady, easy easy (except for all the suffer that i went into)."}, {"post_id": 68896, "ts": "2026-09-15T23:59:43Z", "hours": 1.1389, "text": "The loading is done and working! Fix I fixed the error that were happening when the cover had a certain amount of elements. Problems The fix itself was very easy to do, but doing it in a readable or without using 10 lines of code (i want things concise) was way harder than i expected. So i spent this entire time trying different ways to do it, each of them making everything worse. Reasoning The bug were with less than 14 elements, the script were calculating the first and last element index, it happened that these elements were behind the screen focus. Why? Because the values that the system was using were leaving these values, so i had to fix the way it was calculating things."}, {"post_id": 68865, "ts": "2026-09-15T22:15:27Z", "hours": 1.3303, "text": "The loading is done Features Now the loading at the mutationObserver is finished, it finally loads or unloads the images that should be (or not) loaded! The new observer is way faster, because it can detect the image way before it enters the screen, loading it before and having more time to do it. Also the system loads just a maximum of images (with the configs that i put it is 13), so it will not fry an cellphone. Problems The loading part was easy to do, i already done it before in the past observer (intersectionObserver), so i just had to pass the old code to the new part. But when the cover-flow element dont got atleast 13 elements the mutationObserver code breaks completely! Im still pondering how to solve it, when i do i will post about! Results The performance went from 78 to 100! The system is way faster! The user does not see a blank image anymore! Why The old method was slow even with a good internet connection, because it was loading the images just when the element was already in the screen, leaving to a perceptive delay for the user and a blank image to the user. Also i thought about creating an observer from scratch (maybe i was a little off my ideas, because that was insane), but the browser already had exactly what i wanted (the mutationObserver) Videos The new features The performance of the new feats The old features Reasoning While i was trying to sleep i thought about a system that fill the cover-flow with a maximum of images (like 10, or 13, or the code decides) at the DOM, using less memory to run. That system will free a lot of memory based on how many cards the cover-flow have. But that will have noticeable effects just with a lot of elements and probably would be hard to develop, maybe i will do in next updates. What next Im leading to the shipping, so i will improve metrics about the lighthouse, improve the readme and post it."}, {"post_id": 68449, "ts": "2026-09-15T04:25:35Z", "hours": 7.2278, "text": "Adding a mutationObserver Now, instead of an intersectionObserver, the system use a mutationObserver that monitors the angle of the cylinder itself. With that the loading of the images will be insanely better, faster and user-friendly. Now the changes in the cover-flow is observed at the cylinder angle, not at each card. There was some problems in the journey like, for some reason, unexpected cards being loaded or not, the loading script at the observer dont triggering at all (that was caused by the speed of the observer) and an insane amount of cards being triggered at the same time (i still did not figured out why, but that isnt ‘harmful’). But man, i had to be creative here and remember about some concepts like concurrent programming, buffer / queue and apply some delays (because the mutationObserver is insanely fast and can trigger every millisecond). That all was meant to decrease the speed of the mutationObserver, because it was triggering with the most small change in the cylinder, so i made it trigger just when an expected amount of movement was made. The red/yellow collor is for me to visualize the loading state, it is just for debug The code isnt finished, i still need to implement the loading part, for now i just implemented the observer and basics of the loading part"}, {"post_id": 67841, "ts": "2026-09-14T03:19:48Z", "hours": 4.2825, "text": "The observer is finished (nearly) Now the cover-flow has an observer that checks the position of the images and changes it styles based on that, so the images that the user is seeing is loaded while the others is hide. It still has some bugs and space for improvements that im still figuring out how to solve, like the image loading too late on the screen or, in slow internet connections, the image takes too long to load. Most of these bugs are because the observer (an intersectionObserver ) was designed for 2d contexts, not 3d (that were and still is an giant problem to solve). For this reason i was thinking about creating an observer from scratch in C++ that can work better in my 3d element, but the overhead would be high so im trying to solve in other ways before that. The feature was made using fetchPriority, contentVisibility and src (the system add the source just when the image is near the screen). OBS: I found about MutationObserver after this post, maybe i will use that instead of insersectionObserver. Oh man, at least if had found about this before… Aaaaaahhhhh i spent 9 hours in that, but at least a Lot of the new logic will be used. Anyway, lets cook"}, {"post_id": 67151, "ts": "2026-09-13T06:53:12Z", "hours": 5.4219, "text": "Adding an observer Now the script observe the card elements at the cover-flow component, classify their position and changes it visibility based on that. Im using an IntersectionObserver to observe every card, but it was designed to observe the position of 2d elements, so i had to figure out how to make it work well in an 3d element. The way it works is when the observe activates (it basically means that some card is in the range to load) it get the card info (like position and angle) and changes it visibility state based on that. Simple, right? No, it was a headache for the start to the top, nearly 4 hours of what i did was to fix the fact that it was meant for 2d. The observer were activating for cards that were in the back of the element, so i had to classify the card position into back or front by using its angle. But if i tried to use the card angle without anything else the script would broke (and did for 3 hours until i realized how to fix), so i had to use an second angle which is 360 - cardAngle (the 360 is the angle of an circle), so this new angle is based on the circle end while the other is based on the circle start. But the system still broke, because at some point one of these values would become negative and makes the if that classify the elements fail. The fix was using the absolute value in the if (it took 1 hour until i figured that; oh i were so happy when it worked). Why To improve the performance, so the browser will just load what is really important and not 50 images that the user cant even see. What else All that work definitely improved a lot my logic thinking and for the first time i used the truth table well. Now i just need to use the new code to change more the style of the images that are not in the screen. I did not deleted the code that i wrote in the past devlog, it was used in the new code to select how many images should be loaded in the same time. ** The first video is the result, the others is some problems that i had **"}, {"post_id": 66316, "ts": "2026-09-12T02:31:12Z", "hours": 4.5481, "text": "Improving the loading performance Now the system selects some images that needs to be shown faster than the others and making them load with priority. It was made by selecting the images that the user is seeing and defining some params like fetchPriority = \"high\" and decoding=\"sync\" , the other images have the params: decoding=\"async\"; loading=\"lazy\"; contentVisibility=\"auto\"; . With that config the LCP went from 2.4s to 0.5s . Also it loads the image in the start and dont change that config again, so the browser will be lazy while downloading these images. The problem is: only the first images are chosen as high priority, but their positions will be changed while the configs stays the same, that makes the browser lazy while loading them and makes the runtime performance became worse. To fix that i found about IntersectionObserver, that are meant to solve the problem of updating the images position fast. It was not applied yet, i found about it like 1 hour ago. What else Now the perspective of the emotionDrum is based on the elements that it have, before it was based just in the screen and would broke if something changes. I did a little change in the way that the script checks for clicks in the screen, now it has more accuracy (I changed the round system)."}, {"post_id": 64533, "ts": "2026-09-09T00:41:52Z", "hours": 7.6869, "text": "Improving the LCP (Largest content paint) performance I am improving the way that the website create and downloads the images, the main reason is to make the user see something faster. Before the system were doing 2 main things: Go trough the entire list of images, creating the elements and placing them into the page. Position them. But the position of the items were being done after the creation of the images, in another function. Now they are in the same function: it create the element, position it and add it to the page. That does not seem like much, but the code got way faster with that, probably because it dont need to go item by item in an list twice just to create an element. I tested the time to load the first element and it went from 8.63s to 6.43s , the test was made with 2200 elements (Yeah ik, it is a lot and normally it isnt that much, but i had to see how they were holding with more than 22 items). Also i fixed a bug that passed unnoticed while improving the responsiveness: At some point of images the visibility of the elements broke, that was because the perspective (what makes the 3D perspective of the component, and makes it visible with 3D effects) was based on the screen size, not the elements itself. What was the problem in that: Each element takes a size in the screen ‘makes the circle that shows the element be more and more near of our point of view’ (i cant explain it any better, search what is ‘perspective in an 3d element at HTML’ ). While it was approaching our point of view (POV), our POV were exactly at the same position (based on the screen size), so at some point the circle perspective would pass the POV and we would be unable of seeing it well. Now it is based on the elements: The 3d elements were basically a circle, i just used the diameter to change the perspective based on it. TODO: Maybe i lowered the image quality too much… I will fix it in the next updates. Also i were trying to improve the font settings to improve the performance, but that wast working so i decided to move on to this because it was more critical (took a while for me to jump to this, maybe like 2 hours trying and trying values in the font settings). i am also working in a way to load the images in parallel, with that it will take way less time (I didnt known about LCP before so i spent a while figuring out the way it works)."}, {"post_id": 63656, "ts": "2026-09-07T16:11:33Z", "hours": 2.6633, "text": "Improving the performance After finishing the improvements in the responsiveness, now i decided to improve the performance. I used lighthouse to get insights (i learned about it in an tiktok video) and figured out that the images size were too high (were an png of 1280x1280px), so i saw more about that in the page: https://developer.chrome.com/docs/performance/insights/image-delivery (an link that google lighthouse gave). With that i saw how to decrease the size while staying with quality, i reached up to the sharp-cli tool, that makes the work of resize, convert and compress the image for me. The command used was that: npx sharp-cli -i * .png -o ./output resize 320 -f avif -q 50 --effort 6 --smartDeblock --preset photo The 320 is the size that i want it to be at the end, i got that value by seeing what was the computed value (the value that is being used in the website) in an high resolution pc (not the most higher one, the high but normal pc) with the resolution of 2500x1714px . With this simple changing the image went from 2mb to 40Kb! Nearly 100% decrease, and take in mind that there is more than one img, so the change were even higher. Also i created 5 different images: 320px, 480px, 640px, 960px e 1280px. With them the browser can choose which one is better for each device. With these changes i went from 35 points of performance to 59."}, {"post_id": 63459, "ts": "2026-09-07T10:10:31Z", "hours": 0.8717, "text": "The home is now fully responsive Ah that took a while, but finally it is fully responsive. Now the description at the player UI resizes based on the screen size and active a scroll behaviour when need, also i did some minor change at the emotionDrum perspective to make it show more emotions at the same time, removed the padding in the arrows at the emotionDrum so they will have more space and fixed an error in the genre drum that was making it perspective broke. After all these devlogs i improved how i make a code responsive."}, {"post_id": 63436, "ts": "2026-09-07T08:55:04Z", "hours": 2.5378, "text": "The emotionDrum is now responsive! Now the buttons that you use to select the emotion are in the same side as the div that displays the emotion, so they dont fight for space anymore. This change is meant to fix the low size of the items in screens that are too small, in the new way we have more free space to display the emotions, there is not much to say. What else I did some minor changes in the size of some items at the player area, now they are easier to read! (I increased the size of some items)"}, {"post_id": 63379, "ts": "2026-09-07T05:17:01Z", "hours": 6.6125, "text": "Im nearly finishing the workings on the responsiveness. Now the entire player screen is responsive and do not breaks the texts anymore (except for the description area), also the buttons that show you the next screen (the ones that displays ‘player’ and ‘generos’) are responsive too, the music queue is working perfectly fine, and the area that is used to select an emotion is nearly responsive too, it just needs some adjusts in the two buttons that change the current emotion because they become too small and uses a lot of space when the screen is too small, after that this screen will be finished. It is taking a really long time, the fact of how many different screen sizes exists makes it harder to finish, but now there is times that i even cannot see if i changed the resolution in some areas, because the system looks the same. I spent quite a while testing different resolutions and combinations of size, i didnt even noticed that i where 6 hours here, but now ik more about css (things like container-type + container based sizes and more ways to set the size of an text) The video shows how it is now, if u want to see the before just checks the past devlog."}, {"post_id": 62723, "ts": "2026-09-06T06:59:19Z", "hours": 0.7094, "text": "Finished the correction of the errors at the perspective and click in the cover-flow component. Now the perspective stays the same 150vw value (that is based on the screen width) and stays normal, with everything working. Oh man, that needed a lot of logic and out of box thinking finding another ways to check where the user clicked without using an normal click event listener (for those who lost the past devlog or didnt understood, i cannot use a normal eventListener in that because the clicks is detected in another element or in nothing, even with z-index or more in css, so the solution should be done entirely on javascript logic). The first video is the new way, the second is how it was before all changes in it"}, {"post_id": 62679, "ts": "2026-09-06T05:10:34Z", "hours": 5.5194, "text": "i finished the workings on the section of the home page that i where doing before, now has a good responsiveness for pc and a decent one for mobile. Now im working on the main area of the home page, the one where the user selects the desired genre for the music (second img). It may looks completely fine, but that same element already was a headache before and is here again. The given area is the cover-flow component, before i already fixed it (or so i thought), but it was looking bad (the 3d perspective where a bit strange) and would probably broken if i added new genres. I were trying to figure out a way to listen to the clicks in the card without any problems, that seems easy at first glance, but the 3d perspective in the element make other elements eat the click from one another, make the clicks dont be listened and so many problems that i nearly decided to erase it and write from scratch. I already found a way to do it by using the mouse position, the center of the screen and the card width (the genre img) to transform it in an value that can be used to select the exact card without any dependencies on the doom selector. It basically uses just some values, put in some calcs and get the difference between the current card (genre) index and the clicked. Im nearly finishing it, but i still need to figure out some values and more."}, {"post_id": 61879, "ts": "2026-09-05T01:17:53Z", "hours": 1.1772, "text": "Im improving the responsiveness at the home page (before was the player page), but for some reason that idk the emotion selection div is having a strange behavior, i will update what it is after i fix it. Take a look: (the item in the center should be centered)"}, {"post_id": 61218, "ts": "2026-09-04T01:30:11Z", "hours": 0.725, "text": "Hi again! Like said in the past devlog, im improving the responsiveness of the website, specifically in the player part. But it had some problems and where distorting when playing an video, now it resizes based on the screen size in a way that it stays ¨normal¨. The first video is the new way, the second is the old way. It still needs a lot of improvements, but it is going!"}, {"post_id": 60619, "ts": "2026-09-03T02:22:12Z", "hours": 1.4631, "text": "Making the website responsive Hi again! Like i said in some devlog, the website dont have support for mobile, that was because it was designed to be at kiosk mode and work just in desktops. but i decided to change that. First of all: the site where using a lot of absolute values of dimensions, so it where braking even in the desktops (it wasnt responsive at all). But i spent a while changing it, it is isnt ready and has some problems, but is better than before. (The mobile is still strange, i did not started fixing it yet). Credits: https://css-tricks.com/snippets/css/fluid-typography/ - This website shows about a way to make the texts become responsive for the screen using some calcs, it is worth seeing. The first video is how it was before, the second is how it is now"}, {"post_id": 60559, "ts": "2026-09-02T23:48:07Z", "hours": 0.7944, "text": "Creating a new helper Context: There was an class called youtubeFrameControls , this class basically where designed as an structure to help using the youtube iframe API, but with the time this class where becoming basically to hold just an function (and in a very inefficient way), because the methods that it had before (like the one that runs when the iframe is loaded) had to have more and more specific logic in the codes that used it, so they where useless (because the codes that where using it where rewriting it). What i did: I picked the only function that where being used and transformed it in an helpers (that can easily be customized). This function was the one that creates the player of the musics, and the function where called createPlayer . Also i removed the old class (youtubeFrameControls) and replaced it for this helper in every place that used it. It now is way more simple than before and can me more customized."}, {"post_id": 60001, "ts": "2026-09-02T02:58:53Z", "hours": 2.1603, "text": "Refactoring the copa script I where placing some scripts in a class. These scripts are related with the player functions of the copa script, so i pick all of them and placed in the same class. I did it to follow best practices, but i confess that i still got some doubts about when to create an class and when the variable or method should be static or private (#property), i will search and learn more about because maybe i will have to refactor some parts of the code following these rules of best practices. That was all for now, see ya!"}, {"post_id": 59339, "ts": "2026-09-01T02:28:57Z", "hours": 2.4744, "text": "Adding more bug checks I added some checks in the player class at the startExplication function that checks if the src (the url for the audio) is valid or not by doing an fetch with the HEAD method and checking if the return is an valid audio before trying anything in this function. Also i solved this error in the same function: Uncaught (in promise) AbortError: The play() request was interrupted because the media was removed from the document. https://goo.gl/LdLk22 This error was because the startExplication function where trying to play the audio before it was loaded, i solved it by making it play the audio just after it was load with the event listener canplaythrough . There was another error at the playMusic function where the code where trying to play the youtube video before it was loaded, i solved it by making it wait until it was CUED (Where the video isnt playing, but is loaded and showed). (The website was not created to be in mobile and dont has a lot of support, the video where recorded in my smartphone because i had to record the audio and the audio on my pc dont work. In the Future i Will add mobile suport, but right now im finishing the bugs and etc)"}, {"post_id": 58653, "ts": "2026-08-31T04:27:35Z", "hours": 2.7947, "text": "Adding a new description feature So basically there was an place where was designed to have the description about an music, but that was empty and where only finished today What it do It is petty simple, it just show an text about the music that is currently playing, also there is an audio that plays before the music starts playing, but this audios is played just one time before the music so if someone loses it or didnt listen well there was not a second chance to listen for that audio. Now there is this place that holds the same content, but in the format of an text that can be read whenever they want while the music is being played, that was what i added. Also that text can be hidden, so it will not stay using half of the screen every time (in the screenshot it is active) What this audios do This audio / text is part of the main purpose of the website, they give some fun facts about the music that may be useful someday in some kind of quiz or essay. Also the audio is played before the music and the music plays just after the audio finishes. That is to make whoever is listening listen to the entire audio before having what he (or she) wants, so they will not listen to the music and skip the audio."}, {"post_id": 58526, "ts": "2026-08-30T23:20:27Z", "hours": 1.3911, "text": "Studing about cache So basically i where studing about cache, the main ideia was to implement it in the sistem, but then i realized something: Theres is nearly no difference between cache and a normal request in an localhost project, adding the cache would not improve anything, sometimes it maybe even slow the website, because the page would need load more code. I realized it afther a while studing about it, but anyway lets focus on another thing. Also i where studing with google for devs: https://developer.chrome.com/docs/workbox/caching-strategies-overview"}, {"post_id": 56374, "ts": "2026-08-28T03:45:15Z", "hours": 1.0169, "text": "Toast applied and tested The toast notification component is now being used at the player class, i did some tests and it is working very nice, hopefully the user will not see it very often (because that would be a problem, the user must not see it unless there is an error playing the music). But why did i make it? It is used to show more about what is going on for the user, so they will not become anxious if it something is working or not. Why not use another notification system? Each notification system has its own use cases, the others would be very painful for the user. Imagine every time a simple error (that is simple for me) like the music fail to play there was an error that interrupt the use of the app with an popup or alert, that would be painful, dont it? That is why i used an toast notification, because it is temporary (disappears after some seconds) and dont stop the use of the website. Also there is a feature that i implemented for the same reason a few devlogs ago that add a fallback in the music search, so it wont show a message at every single combination. Lets calculate how many combinations we have: there is around 50 musics in the database, 22 genres and around 40 emotions, multiplying the genres and the music 880 combinations that the user can make. Now lets see how many musics we can get: each music have around 1.2 emotions and 1.2 genres, so we get 72 combinations that lead to an music . With that in mind, we can see that from 880 combinations, just 72 of them are useful combinations, so we get a 8.18% for getting a music, and 91,12% of not getting one. Consider that each failed attempt shows an error that stop the use flow of the website, but that was before the past devlog, now it tries again and again and only afther failing everything it shows an error, at that point it must really show an error. Thats all, sorry for the long boring text and thanks everyone that read, see yall later"}, {"post_id": 56331, "ts": "2026-08-28T01:58:42Z", "hours": 3.1336, "text": "The toast notification is finished So i finished it, it is a component that u adds in the code that u wants to use. I added 2 icons, 1 for infos and another for warnings. What i used and did The element that holds it all is an dialog , the icons are svg , the text is a span and the element that shows the time left is an progress . To update the time left i used an setInterval that runs at a 10ms delay and deduce 0.01 of the dialog value, so it will be smooth to see. Also there is an if inside that destroy the element and clear the interval when the value of the dialog reaches zero or less (In the past devlog i said about not using an if, but considering how low the cost for an if in that time is i decided to use it anyway). The function that creates the toast receives some params that will let it be customized by whoever is calling it: const icons = Object . freeze ({ INFO : infoIcon (), WARNING : warningIcon () }); function createToast ({ message , time = 5 , styles , icon = icons . INFO }) // the `message` is the displayed message // the `time` is the time until close // the `styles` is custom css styles for the element, it uses the dictionary format {} // the `icon` is the svg icon What else? I will apply it in some elements and post about. See you later!"}, {"post_id": 56188, "ts": "2026-08-27T20:27:52Z", "hours": 1.5956, "text": "Creating a toast notification system So rn im creating what i said in the past devlog about a toast navigation. This isnt finished yet, im still figuring out an way to check the end of the timer, i found some ways to do it, like using an simple if inside the countdown. I didnt comment but i am using an setInterval to decrease the time and an <progress> tag to show the value but that is a bad ideia, imagine doing 1 if every 50 ms? that dont cost a lot of processing power, but i still will search for other ways to do it just to check, if yall got any hints or ideas leave a comment. Also i will improve the design, the design is petty poor."}, {"post_id": 55334, "ts": "2026-08-27T02:23:29Z", "hours": 4.2383, "text": "Fixing errors and adding bug checks Hi everyone, so i were fixing some bugs that i saw that may broke the app, i fixed all of them (for now), here they are: There was a logic bug that a class (the one that controls the youtube iframe) where doing stuff that it wasnt supposed to do (not an unexpected behavior, but a logic that should be outside of it), it was an easy fix. There was a bug at the player class that when the provided sourceId (for the youtube iframe) where wrong or unable to use it crash and stopped doing anything else (like playing another musics). I tryied solving it in various ways, one was beffore the changes that i did in my last devlog, but i failed because the class that holds the player where hard to fix, this devlog fix it. I fixed it by adding some bug checks and, when some error ocurred, it play the next music. There was also a bug at the player class and youtube-iframe-controls class, that for a couple seconds in the start of the website it would broke if u tried to play a music. It was because in the start of the program the youtube API where unable to be used. To fix it i just made it wait until the API where ready using an ASYNC function. There was also a bug that, afther the past devlog, it was doing and request at the /api/songs with params at the wrong format. Afther the past devlog the API started using the params genre_id and emotion_id , but the frontend where passing with the incorrect name (genre, emotion). Something that i implemented I upgraded the mysql query that where being used to get more infos about the music, before it where just returning infos like name, author, sourceId, etc, but now it also returns the genre and emotion from that given music. I added a bug check at the player class, now if it fails it pass to the next music. Something that i want implement I want to implement a simple toast notification system that will apear when something fails, like the playing of some music. Others The youtube docs for the iframe where very helpful for this changes, check it out: https://developers.google.com/youtube/iframe_api_reference?hl=pt-br"}, {"post_id": 54690, "ts": "2026-08-25T19:06:05Z", "hours": 3.2633, "text": "Optimizating some piece of code So there was a certain part of the code responsible for the songs queue in the main route, that piece is a core function but where running a while true loop for no reason , here is the part: async start () { while ( true ) { // { emotion, genre, author, name, sourceId } const musicData = await this . #musicQueue . get (); this . createPlayer ( musicData [ ' sourceId ' ], null ); this . #showMusicInfos ( musicData [ ' name ' ], musicData [ ' author ' ]); this . #queueList . removeChild ( this . #queueList . children [ 0 ]); await this . #startExplication ( `/storage/ ${ musicData [ ' explicationSource ' ]} ` ); this . player . playVideo (); await this . #musicFinished . when ( true ); this . #musicFinished . set ( false ); } } Basically the code were calling it at the start and running it forever, but that code where a nightmare to maintain / implement, i tried to implement a safe check here for over 2 hours, but wasnt possible. I replaced it for a more efficient approach that do a loop in a different way, here it is: when adding a music, it checks if it is already playing, if no starts to play. when start to play it checks if there is a music in the queue for it to play, if no it stops playing, if yes it get it and play. When the music that is playing ends, it call the play function (from the above topic). That is just it, no while or constant loops, no overhead, it works by basically connecting all the codes in a way that they work together to maintain (or stop) the loop (notice how i said loop, it uses a loop but isnt a while or for loop, it connects the end of one code and the start of another, like a chain . I made it in the pull request #2, check it out: here"}, {"post_id": 54151, "ts": "2026-08-24T23:51:28Z", "hours": 5.8114, "text": "Fixing some forgoten code and more So at this devlog i were fixing some bugs in a specific ui / route called ¨copa¨, this is a special route added because a teacher asked our team to create them to use at some football games in our school. But since it was a hiddend route and mostly like a easter egg it hasnt been updated in a while and wasnt working anymore. What i fixed i was following a pattern where most of the images that each route used should be in a special foulder of storage (literally called /storage), but this mode (copa) where created before it and was following the old way Also there was some errors ocurred afther i changed the entire folder structure, so the copa mode where completely broken, i fixed it too. What i added I had a class about PHP + Laravel | API | Controlers in my course, afther that class i realized that the way the API (copa) where searching for data based on ID where wrong (was doing copa?id=…), i changed it to /copa/id There is a function that show the teams to the user to select one that he wants, but the teams list where hard coded and wasnt synced with the database. I made it use the database data instead of a hardcoded value ** That where all for that mode, but i didnt spent 5 hours just on it, i made more: ** Fixing (or making) some other bugs There is a script that controls the database that where holding and infinite single connection with the database, something like this conn = mysql . connector . connect ( ** configs ) cursor = conn . cursor ( Dictionary = True ) But all the codes where using the same connection and cursor, so i decided to apply a connecton pool and make each database call get a connection and a new cursor. Also i added some functions to abstrac the connection and query part: def __get_connection ( self ): conn = self . db_pool . get_connection () conn . ping ( reconnect = True , attempts = 3 , delay = 1 ) return conn def __execute_query ( self , query : str , params : list | None = None , dictionary = True , query_type : QueryTypes = QueryTypes . ALL ): conn = self . __get_connection () try : with conn . cursor ( dictionary = dictionary ) as cursor : cursor . execute ( query , ( params ) or ()) match query_type : case QueryTypes . ALL : return cursor . fetchall () case QueryTypes . ONE : return cursor . fetchone () case QueryTypes . EXECUTE : cursor . commit () return cursor . lastrowid or cursor . rowcount case _ : raise ValueError ( f \" Tipo de consulta não suportado: { query_type } \" ) If yall want to see it check here at my repo That was also the first time that i used a Enum (on code) and branchs (on github, but i didnt used them properly) Others There was also some other changes, check the repo GF-Silva/Ritualia What next Now i will add some bug checks on a piece of code that handle the video display using an youtube iframe."}, {"post_id": 52754, "ts": "2026-08-23T03:00:03Z", "hours": 4.8206, "text": "Changing some values to be relative I spent a while (more than i expected) changing some strange values that control some settings of a component called cover-flow (this component create and control the images that are displayed in the home screen). I spent more time figuring out what where each variable and lhe logic behind than acually writing.Before it had some hardcoded values that would probably broke if anything changes, i saw it and solved. I wasnt here for it, i was fixing another bug and fixed it before it broke. I also used some basic math of circles like angle of an arc. That is all for today"}, {"post_id": 52465, "ts": "2026-08-22T16:18:22Z", "hours": 3.1097, "text": "I spent some time correcting errors and logic problems, here they are: Error Correction Music playback would freeze when the music queue ended : This problem would break the app until you restarted it, but it was very simple to solve. I had simply made it remove the first instance of music from the HTML twice, which caused it to try to remove an element that didn’t exist, thus freezing the app. Removed an unnecessary loop : In the player section, there was a loop that iterated through all the elements (emotions) in a list to toggle the state of ONLY 1 ELEMENT. With the few elements it had (there were 3), this was minimal, but adding more could be detrimental to functionality. It only did this to toggle the state of the PREVIOUS element from active to inactive. I solved this simply by making it save the index of the last element and use that to access it. It took a while to work because javascript was treating 0 (the first indice / old indice when u start) as false in the if, but afther i figured out why it was simple to solve (if oldIndice != null) Implementations / Changes I separated the API/WEB routes : Previously, the routes exposed by the backend (such as /songs) were in the same file. This wasn’t a problem before, but with the addition of new functions, it could become difficult to maintain and prone to various errors, as the routes weren’t separated (a name could be the same). Therefore, I separated them into: /api (backend API codes) and / (frontend web codes). I put the genres in the database : Previously, the genres were in the frontend, and to add a new one, I would have to update both the backend and the frontend. To solve this, I simply added a route that retrieves the current genres (from the database) and uses the data (name / location) to load them into the frontend. I added the emotions to the database : The emotions had the same problem; although both (they and the genres) were in the database, the frontend wasn’t based on that data, so I did the same thing I did with the genres. I changed the name of where the music explanations were saved : I must have mentioned in a devlog that the folder inside storage was called /explication_source, and I also mentioned that the name was incorrect (because the audio source wasn’t there, nor would it be; the audio files themselves are there), so I changed it to /explication_audios"}, {"post_id": 48602, "ts": "2026-08-17T02:01:56Z", "hours": 3.6708, "text": "Updating the README I saw a post about how to structure a README, how to make it clear and etc. Afther i realized how wrong the old README was (it was confusing, and also was months out of date). So I chose some topics that would be interesting to include in and filled in a skeleton, spending some time learning what to do and what not to do. I also didn’t fill in some fields because they aren’t ready yet (they now are stored in my memory to add later). How it was before: https://github.com/GF-Silva/RitualIa/blob/9a2a7756c777a7042eca28309924e5a408bd561f/README.md How it is now: https://github.com/GF-Silva/RitualIa/blob/2dea5f80266f06e8633af1aa3c9430065cde9231/README.md There is a huge difference. Also i did some bugs and noticed how bad my commits are"}, {"post_id": 47776, "ts": "2026-08-15T22:55:35Z", "hours": 32.5314, "text": "After a development pause, here are the various changes made. Also, I never mentioned it, but this project was made by students focused on the school environment. (This time I finally got around to writing the devlog myself): Structure Moved main.py to the root Replaced mysql-connector with the official version : The added library was a version I didn’t recognize; I added the official one instead. Cleanup Removed some Code that wasnt being used. Backend Change the return value of the SQL cursor : Previously, the cursor returned an array, but for code readability and security, I opted to change it to an array. Structured Error 404 : The backend used abort in certain parts, but it returns HTML and certain parts of the frontend expected JSON, so I formatted the abort to JSON. This caused a headache, I hadn’t tested it (again lol) and when I saw it, it was time to present the project at school and I was having this error. frontend Fixed the CoverFlow component : An error went unnoticed in the creation of the component, this made the size and spacing of the images look strange, it was fixed to a certain extent. I implemented a new playback policy : The text about it got so long that I decided to open an extra topic. Playback Policy Now it search for the requested emotion + genre that the user choose, If It fails It search Just for the genre, if It fails again it search for anything. Now it falls into a fallback: This policy change was motivated by having to find a song to show in a presentation and failing. I reflected that if it was annoying for me, it would be for the end user (students) as well. Database Added new songs : I added 50 extras and their respective genres/emotions. (Also i wrote some helpers in python to help me categorize and search for the musics in youtube and get and structured sql output, that took quite a while) Saved the songs locally : Topic local saving Local saving But why would saving the songs in the cloud be a problem? Nothing comes for free, the server we were using to host the music had a monthly access limit, which was a silent problem that, thankfully, was noticed before it happened. My mistake, I didn’t even think about the possibility of saving locally and went straight to saving in the cloud, it must have been due to haste and inattention (always plan well what you are going to do before you do it, weigh the risks and benefits). Now, how it works The audios are saved inside the /storage folder. The database still saves the location, but this time it saves the relative path (e.g., /explication_audiis/fun_audio.extension). Why save the folder path as well? Won’t the audios always be there? Yes, but at some point the path might change (e.g., explication_source/youtube/audio_legal.extension). Future plans I’m going to improve my devlogs lol, this one got huge"}, {"post_id": 12818, "ts": "2026-06-20T23:46:13Z", "hours": 5.5386, "text": "RitualIa in Evolution: Refactoring, Optimization, and New Features 🎶 Hey everyone! I’m back with a cool update on what’s been happening here at RitualIa. After that commit where we transformed some scripts into helpers, things have evolved quite a bit. We’ve been doing a heavy refactoring of the project, focusing on organization, performance, and better code architecture . What’s changed: Structure & Organization: I removed legacy folders that weren’t being used, did a mega merge bringing everything from /frontend (the folder that where holding ALL the frontend logics) to the project root (with that the frontend and backend are in the same folder), and switched from FastAPI to Flask on the backend. Why the change of FastAPI to Flask: Because my supervisor or mentor (something like this) said and said again to, because there was other guys in the project (still is, but im the main developer, the others stopped doing anything like mounths Ago, and even while they where doing something i still was the main dev), these other guys where total starters and could not hold the learning curve of FastAPI (even with the fact that was Just me that where using It, because it was at the backend and i was the only developing at back). Code Quality: We made several methods private in the PlayerControls class, making the API cleaner and more secure. We also fixed the “enclosing class errors” that appeared. These small fixes make a huge difference in code reliability. UI/UX Improvements: We created a new CoverFlow component to replace GenreCylinder on the homepage – it’s much smoother and prettier now. We added support for async onClick, grab + touch in CoverFlow, and adjusted visual positioning to keep everything aligned. Oh, and we removed that unnecessary playerText that was cluttering the interface. New Features: A really cool feature that was added was the checking for duplicate songs in the queue . Nothing worse than accidentally playing the same song twice, right? Now that doesn’t happen anymore. Maintenance & Updates: We updated the fetches to call the new routes, moved the favicon to assets (because everything has its place), and focused on the details. What’s coming next: We are in a consolidation phase, laying a solid foundation for the upcoming features. The focus now is on ensuring that each component is doing exactly what it needs to do, nothing more, nothing less. Thanks for following along!"}, {"post_id": 11702, "ts": "2026-06-19T02:03:07Z", "hours": 1.0236, "text": "I’m transforming some duplicate code into helpers so they can be more easily used in new code."}, {"post_id": 11412, "ts": "2026-06-18T17:53:37Z", "hours": 1.2881, "text": "Introducing: The ‘Ritualia’ project is a project developed by me and some colleagues with the help of the school. In it, we have done and continue to do research and assembly with the aim of impacting the daily lives of students in our school and (in the future) other schools. It is an open-source project with an article soon to be published detailing the foundations used, etc. The readme is currently outdated because I am redoing part of the current architecture, but I will update it later to include information on how to assemble and create your own version. The project is divided into hardware and software. I, along with other members, am responsible for the software (which is usable on most computers), and the hardware is relatively simple (it only depends on a display + sound + a controller with an OS + the preparations for installation)."}]...
|
Title: Ritualia by @gabriel_ferreira | Stardance
Title: Ritualia by @gabriel_ferreira | Stardance
Devlogs:
Introducing: The ‘Ritualia’ project is a project developed by me and some colleagues with the help of the school. In it, we have done and continue to do research and assembly with the aim of impacting the daily lives of students in our school and (in the future) other schools. It is an open-source project with an article soon to be published detailing the foundations used, etc. The readme is currently outdated because I am redoing part of the current architecture, but I will update it later to include information on how to assemble and create your own version. The project is divided into hardware and software. I, along with other members, am responsible for the software (which is usable on most computers), and the hardware is relatively simple (it only depends on a display + sound + a controller with an OS + the preparations for installation).
I’m transforming some duplicate code into helpers so they can be more easily used in new code.
RitualIa in Evolution: Refactoring, Optimization, and New Features 🎶 Hey everyone! I’m back with a cool update on what’s been happening here at RitualIa. After that commit where we transformed some scripts into helpers, things have evolved quite a bit. We’ve been doing a heavy refactoring of the project, focusing on organization, performance, and better code architecture . What’s changed: Structure & Organization: I removed legacy folders that weren’t being used, did a mega merge bringing everything from /frontend (the folder that where holding ALL the frontend logics) to the project root (with that the frontend and backend are in the same folder), and switched from FastAPI to Flask on the backend. Why the change of FastAPI to Flask: Because my supervisor or mentor (something like this) said and said again to, because there was other guys in the project (still is, but im the main developer, the others stopped doing anything like mounths Ago, and even while they where doing something i still was the main dev), these other guys where total starters and could not hold the learning curve of FastAPI (even with the fact that was Just me that where using It, because it was at the backend and i was the only developing at back). Code Quality: We made several methods private in the PlayerControls class, making the API cleaner and more secure. We also fixed the “enclosing class errors” that appeared. These small fixes make a huge difference in code reliability. UI/UX Improvements: We created a new CoverFlow component to replace GenreCylinder on the homepage – it’s much smoother and prettier now. We added support for async onClick, grab + touch in CoverFlow, and adjusted visual positioning to keep everything aligned. Oh, and we removed that unnecessary playerText that was cluttering the interface. New Features: A really cool feature that was added was the checking for duplicate songs in the queue . Nothing worse than accidentally playing the same song twice, right? Now that doesn’t happen anymore. Maintenance & Updates: We updated the fetches to call the new routes, moved the favicon to assets (because everything has its place), and focused on the details. What’s coming next: We are in a consolidation phase, laying a solid foundation for the upcoming features. The focus now is on ensuring that each component is doing exactly what it needs to do, nothing more, nothing less. Thanks for following along!
After a development pause, here are the various changes made. Also, I never mentioned it, but this project was made by students focused on the school environment. (This time I finally got around to writing the devlog myself): Structure Moved main.py to the root Replaced mysql-connector with the official version : The added library was a version I didn’t recognize; I added the official one instead. Cleanup Removed some Code that wasnt being used. Backend Change the return value of the SQL cursor : Previously, the cursor returned an array, but for code readability and security, I opted to change it to an array. Structured Error 404 : The backend used abort in certain parts, but it returns HTML and certain parts of the frontend expected JSON, so I formatted the abort to JSON. This caused a headache, I hadn’t tested it (again lol) and when I saw it, it was time to present the project at school and I was having this error. frontend Fixed the CoverFlow component : An error went unnoticed in the creation of the component, this made the size and spacing of the images look strange, it was fixed to a certain extent. I implemented a new playback policy : The text about it got so long that I decided to open an extra topic. Playback Policy Now it search for the requested emotion + genre that the user choose, If It fails It search Just for the genre, if It fails again it search for anything. Now it falls into a fallback: This policy change was motivated by having to find a song to show in a presentation and failing. I reflected that if it was annoying for me, it would be for the end user (students) as well. Database Added new songs : I added 50 extras and their respective genres/emotions. (Also i wrote some helpers in python to help me categorize and search for the musics in youtube and get and structured sql output, that took quite a while) Saved the songs locally : Topic local saving Local saving But why would saving the songs in the cloud be a problem? Nothing comes for free, the server we were using to host the music had a monthly access limit, which was a silent problem that, thankfully, was noticed before it happened. My mistake, I didn’t even think about the possibility of saving locally and went straight to saving in the cloud, it must have been due to haste and inattention (always plan well what you are going to do before you do it, weigh the risks and benefits). Now, how it works The audios are saved inside the /storage folder. The database still saves the location, but this time it saves the relative path (e.g., /explication_audiis/fun_audio.extension). Why save the folder path as well? Won’t the audios always be there? Yes, but at some point the path might change (e.g., explication_source/youtube/audio_legal.extension). Future plans I’m going to improve my devlogs lol, this one got huge
Updating the README I saw a post about how to structure a README, how to make it clear and etc. Afther i realized how wrong the old README was (it was confusing, and also was months out of date). So I chose some topics that would be interesting to include in and filled in a skeleton, spending some time learning what to do and what not to do. I also didn’t fill in some fields because they aren’t ready yet (they now are stored in my memory to add later). How it was before: https://github.com/GF-Silva/RitualIa/blob/9a2a7756c777a7042eca28309924e5a408bd561f/README.md How it is now: https://github.com/GF-Silva/RitualIa/blob/2dea5f80266f06e8633af1aa3c9430065cde9231/README.md There is a huge difference. Also i did some bugs and noticed how bad my commits are
I spent some time correcting errors and logic problems, here they are: Error Correction Music playback would freeze when the music queue ended : This problem would break the app until you restarted it, but it was very simple to solve. I had simply made it remove the first instance of music from the HTML twice, which caused it to try to remove an element that didn’t exist, thus freezing the app. Removed an unnecessary loop : In the player section, there was a loop that iterated through all the elements (emotions) in a list to toggle the state of ONLY 1 ELEMENT. With the few elements it had (there were 3), this was minimal, but adding more could be detrimental to functionality. It only did this to toggle the state of the PREVIOUS element from active to inactive. I solved this simply by making it save the index of the last element and use that to access it. It took a while to work because javascript was treating 0 (the first indice / old indice when u start) as false in the if, but afther i figured out why it was simple to solve (if oldIndice != null) Implementations / Changes I separated the API/WEB routes : Previously, the routes exposed by the backend (such as /songs) were in the same file. This wasn’t a problem before, but with the addition of new functions, it could become difficult to maintain and prone to various errors, as the routes weren’t separated (a name could be the same). Therefore, I separated them into: /api (backend API codes) and / (frontend web codes). I put the genres in the database : Previously, the genres were in the frontend, and to add a new one, I would have to update both the backend and the frontend. To solve this, I simply added a route that retrieves the current genres (from the database) and uses the data (name / location) to load them into the frontend. I added the emotions to the database : The emotions had the same problem; although both (they and the genres) were in the database, the frontend wasn’t based on that data, so I did the same thing I did with the genres. I changed the name of where the music explanations were saved : I must have mentioned in a devlog that the folder inside storage was called /explication_source, and I also mentioned that the name was incorrect (because the audio source wasn’t there, nor would it be; the audio files themselves are there), so I changed it to /explication_audios
Changing some values to be relative I spent a while (more than i expected) changing some strange values that control some settings of a component called cover-flow (this component create and control the images that are displayed in the home screen). I spent more time figuring out what where each variable and lhe logic behind than acually writing.Before it had some hardcoded values that would probably broke if anything changes, i saw it and solved. I wasnt here for it, i was fixing another bug and fixed it before it broke. I also used some basic math of circles like angle of an arc. That is all for today
Fixing some forgoten code and more So at this devlog i were fixing some bugs in a specific ui / route called ¨copa¨, this is a special route added because a teacher asked our team to create them to use at some football games in our school. But since it was a hiddend route and mostly like a easter egg it hasnt been updated in a while and wasnt working anymore. What i fixed i was following a pattern where most of the images that each route used should be in a special foulder of storage (literally called /storage), but this mode (copa) where created before it and was following the old way Also there was some errors ocurred afther i changed the entire folder structure, so the copa mode where completely broken, i fixed it too. What i added I had a class about PHP + Laravel | API | Controlers in my course, afther that class i realized that the way the API (copa) where searching for data based on ID where wrong (was doing copa?id=…), i changed it to /copa/id There is a function that show the teams to the user to select one that he wants, but the teams list where hard coded and wasnt synced with the database. I made it use the database data instead of a hardcoded value ** That where all for that mode, but i didnt spent 5 hours just on it, i made more: ** Fixing (or making) some other bugs There is a script that controls the database that where holding and infinite single connection with the database, something like this conn = mysql . connector . connect ( ** configs ) cursor = conn . cursor ( Dictionary = True ) But all the codes where using the same connection and cursor, so i decided to apply a connecton pool and make each database call get a connection and a new cursor. Also i added some functions to abstrac the connection and query part: def __get_connection ( self ): conn = self . db_pool . get_connection () conn . ping ( reconnect = True , attempts = 3 , delay = 1 ) return conn def __execute_query ( self , query : str , params : list | None = None , dictionary = True , query_type : QueryTypes = QueryTypes . ALL ): conn = self . __get_connection () try : with conn . cursor ( dictionary = dictionary ) as cursor : cursor . execute ( query , ( params ) or ()) match query_type : case QueryTypes . ALL : return cursor . fetchall () case QueryTypes . ONE : return cursor . fetchone () case QueryTypes . EXECUTE : cursor . commit () return cursor . lastrowid or cursor . rowcount case _ : raise ValueError ( f " Tipo de consulta não suportado: { query_type } " ) If yall want to see it check here at my repo That was also the first time that i used a Enum (on code) and branchs (on github, but i didnt used them properly) Others There was also some other changes, check the repo GF-Silva/Ritualia What next Now i will add some bug checks on a piece of code that handle the video display using an youtube iframe.
Optimizating some piece of code So there was a certain part of the code responsible for the songs queue in the main route, that piece is a core function but where running a while true loop for no reason , here is the part: async start () { while ( true ) { // { emotion, genre, author, name, sourceId } const musicData = await this . #musicQueue . get (); this . createPlayer ( musicData [ ' sourceId ' ], null ); this . #showMusicInfos ( musicData [ ' name ' ], musicData [ ' author ' ]); this . #queueList . removeChild ( this . #queueList . children [ 0 ]); await this . #startExplication ( `/storage/ ${ musicData [ ' explicationSource ' ]} ` ); this . player . playVideo (); await this . #musicFinished . when ( true ); this . #musicFinished . set ( false ); } } Basically the code were calling it at the start and running it forever, but that code where a nightmare to maintain / implement, i tried to implement a safe check here for over 2 hours, but wasnt possible. I replaced it for a more efficient approach that do a loop in a different way, here it is: when adding a music, it checks if it is already playing, if no starts to play. when start to play it checks if there is a music in the queue for it to play, if no it stops playing, if yes it get it and play. When the music that is playing ends, it call the play function (from the above topic). That is just it, no while or constant loops, no overhead, it works by basically connecting all the codes in a way that they work together to maintain (or stop) the loop (notice how i said loop, it uses a loop but isnt a while or for loop, it connects the end of one code and the start of another, like a chain . I made it in the pull request #2, check it out: here
Fixing errors and adding bug checks Hi everyone, so i were fixing some bugs that i saw that may broke the app, i fixed all of them (for now), here they are: There was a logic bug that a class (the one that controls the youtube iframe) where doing stuff that it wasnt supposed to do (not an unexpected behavior, but a logic that should be outside of it), it was an easy fix. There was a bug at the player class that when the provided sourceId (for the youtube iframe) where wrong or unable to use it crash and stopped doing anything else (like playing another musics). I tryied solving it in various ways, one was beffore the changes that i did in my last devlog, but i failed because the class that holds the player where hard to fix, this devlog fix it. I fixed it by adding some bug checks and, when some error ocurred, it play the next music. There was also a bug at the player class and youtube-iframe-controls class, that for a couple seconds in the start of the website it would broke if u tried to play a music. It was because in the start of the program the youtube API where unable to be used. To fix it i just made it wait until the API where ready using an ASYNC function. There was also a bug that, afther the past devlog, it was doing and request at the /api/songs with params at the wrong format. Afther the past devlog the API started using the params genre_id and emotion_id , but the frontend where passing with the incorrect name (genre, emotion). Something that i implemented I upgraded the mysql query that where being used to get more infos about the music, before it where just returning infos like name, author, sourceId, etc, but now it also returns the genre and emotion from that given music. I added a bug check at the player class, now if it fails it pass to the next music. Something that i want implement I want to implement a simple toast notification system that will apear when something fails, like the playing of some music. Others The youtube docs for the iframe where very helpful for this changes, check it out: https://developers.google.com/youtube/iframe_api_reference?hl=pt-br
Creating a toast notification system So rn im creating what i said in the past devlog about a toast navigation. This isnt finished yet, im still figuring out an way to check the end of the timer, i found some ways to do it, like using an simple if inside the countdown. I didnt comment but i am using an setInterval to decrease the time and an <progress> tag to show the value but that is a bad ideia, imagine doing 1 if every 50 ms? that dont cost a lot of processing power, but i still will search for other ways to do it just to check, if yall got any hints or ideas leave a comment. Also i will improve the design, the design is petty poor.
The toast notification is finished So i finished it, it is a component that u adds in the code that u wants to use. I added 2 icons, 1 for infos and another for warnings. What i used and did The element that holds it all is an dialog , the icons are svg , the text is a span and the element that shows the time left is an progress . To update the time left i used an setInterval that runs at a 10ms delay and deduce 0.01 of the dialog value, so it will be smooth to see. Also there is an if inside that destroy the element and clear the interval when the value of the dialog reaches zero or less (In the past devlog i said about not using an if, but considering how low the cost for an if in that time is i decided to use it anyway). The function that creates the toast receives some params that will let it be customized by whoever is calling it: const icons = Object . freeze ({ INFO : infoIcon (), WARNING : warningIcon () }); function createToast ({ message , time = 5 , styles , icon = icons . INFO }) // the `message` is the displayed message // the `time` is the time until close // the `styles` is custom css styles for the element, it uses the dictionary format {} // the `icon` is the svg icon What else? I will apply it in some elements and post about. See you later!
Toast applied and tested The toast notification component is now being used at the player class, i did some tests and it is working very nice, hopefully the user will not see it very often (because that would be a problem, the user must not see it unless there is an error playing the music). But why did i make it? It is used to show more about what is going on for the user, so they will not become anxious if it something is working or not. Why not use another notification system? Each notification system has its own use cases, the others would be very painful for the user. Imagine every time a simple error (that is simple for me) like the music fail to play there was an error that interrupt the use of the app with an popup or alert, that would be painful, dont it? That is why i used an toast notification, because it is temporary (disappears after some seconds) and dont stop the use of the website. Also there is a feature that i implemented for the same reason a few devlogs ago that add a fallback in the music search, so it wont show a message at every single combination. Lets calculate how many combinations we have: there is around 50 musics in the database, 22 genres and around 40 emotions, multiplying the genres and the music 880 combinations that the user can make. Now lets see how many musics we can get: each music have around 1.2 emotions and 1.2 genres, so we get 72 combinations that lead to an music . With that in mind, we can see that from 880 combinations, just 72 of them are useful combinations, so we get a 8.18% for getting a music, and 91,12% of not getting one. Consider that each failed attempt shows an error that stop the use flow of the website, but that was before the past devlog, now it tries again and again and only afther failing everything it shows an error, at that point it must really show an error. Thats all, sorry for the long boring text and thanks everyone that read, see yall later
Studing about cache So basically i where studing about cache, the main ideia was to implement it in the sistem, but then i realized something: Theres is nearly no difference between cache and a normal request in an localhost project, adding the cache would not improve anything, sometimes it maybe even slow the website, because the page would need load more code. I realized it afther a while studing about it, but anyway lets focus on another thing. Also i where studing with google for devs: https://developer.chrome.com/docs/workbox/caching-strategies-overview
Adding a new description feature So basically there was an place where was designed to have the description about an music, but that was empty and where only finished today What it do It is petty simple, it just show an text about the music that is currently playing, also there is an audio that plays before the music starts playing, but this audios is played just one time before the music so if someone loses it or didnt listen well there was not a second chance to listen for that audio. Now there is this place that holds the same content, but in the format of an text that can be read whenever they want while the music is being played, that was what i added. Also that text can be hidden, so it will not stay using half of the screen every time (in the screenshot it is active) What this audios do This audio / text is part of the main purpose of the website, they give some fun facts about the music that may be useful someday in some kind of quiz or essay. Also the audio is played before the music and the music plays just after the audio finishes. That is to make whoever is listening listen to the entire audio before having what he (or she) wants, so they will not listen to the music and skip the audio.
Adding more bug checks I added some checks in the player class at the startExplication function that checks if the src (the url for the audio) is valid or not by doing an fetch with the HEAD method and checking if the return is an valid audio before trying anything in this function. Also i solved this error in the same function: Uncaught (in promise) AbortError: The play() request was interrupted because the media was removed from the document. https://goo.gl/LdLk22 This error was because the startExplication function where trying to play the audio before it was loaded, i solved it by making it play the audio just after it was load with the event listener canplaythrough . There was another error at the playMusic function where the code where trying to play the youtube video before it was loaded, i solved it by making it wait until it was CUED (Where the video isnt playing, but is loaded and showed). (The website was not created to be in mobile and dont has a lot of support, the video where recorded in my smartphone because i had to record the audio and the audio on my pc dont work. In the Future i Will add mobile suport, but right now im finishing the bugs and etc)
Refactoring the copa script I where placing some scripts in a class. These scripts are related with the player functions of the copa script, so i pick all of them and placed in the same class. I did it to follow best practices, but i confess that i still got some doubts about when to create an class and when the variable or method should be static or private (#property), i will search and learn more about because maybe i will have to refactor some parts of the code following these rules of best practices. That was all for now, see ya!
Creating a new helper Context: There was an class called youtubeFrameControls , this class basically where designed as an structure to help using the youtube iframe API, but with the time this class where becoming basically to hold just an function (and in a very inefficient way), because the methods that it had before (like the one that runs when the iframe is loaded) had to have more and more specific logic in the codes that used it, so they where useless (because the codes that where using it where rewriting it). What i did: I picked the only function that where being used and transformed it in an helpers (that can easily be customized). This function was the one that creates the player of the musics, and the function where called createPlayer . Also i removed the old class (youtubeFrameControls) and replaced it for this helper in every place that used it. It now is way more simple than before and can me more customized.
Making the website responsive Hi again! Like i said in some devlog, the website dont have support for mobile, that was because it was designed to be at kiosk mode and work just in desktops. but i decided to change that. First of all: the site where using a lot of absolute values of dimensions, so it where braking even in the desktops (it wasnt responsive at all). But i spent a while changing it, it is isnt ready and has some problems, but is better than before. (The mobile is still strange, i did not started fixing it yet). Credits: https://css-tricks.com/snippets/css/fluid-typography/ - This website shows about a way to make the texts become responsive for the screen using some calcs, it is worth seeing. The first video is how it was before, the second is how it is now
Hi again! Like said in the past devlog, im improving the responsiveness of the website, specifically in the player part. But it had some problems and where distorting when playing an video, now it resizes based on the screen size in a way that it stays ¨normal¨. The first video is the new way, the second is the old way. It still needs a lot of improvements, but it is going!
Im improving the responsiveness at the home page (before was the player page), but for some reason that idk the emotion selection div is having a strange behavior, i will update what it is after i fix it. Take a look: (the item in the center should be centered)
i finished the workings on the section of the home page that i where doing before, now has a good responsiveness for pc and a decent one for mobile. Now im working on the main area of the home page, the one where the user selects the desired genre for the music (second img). It may looks completely fine, but that same element already was a headache before and is here again. The given area is the cover-flow component, before i already fixed it (or so i thought), but it was looking bad (the 3d perspective where a bit strange) and would probably broken if i added new genres. I were trying to figure out a way to listen to the clicks in the card without any problems, that seems easy at first glance, but the 3d perspective in the element make other elements eat the click from one another, make the clicks dont be listened and so many problems that i nearly decided to erase it and write from scratch. I already found a way to do it by using the mouse position, the center of the screen and the card width (the genre img) to transform it in an value that can be used to select the exact card without any dependencies on the doom selector. It basically uses just some values, put in some calcs and get the difference between the current card (genre) index and the clicked. Im nearly finishing it, but i still need to figure out some values and more.
Finished the correction of the errors at the perspective and click in the cover-flow component. Now the perspective stays the same 150vw value (that is based on the screen width) and stays normal, with everything working. Oh man, that needed a lot of logic and out of box thinking finding another ways to check where the user clicked without using an normal click event listener (for those who lost the past devlog or didnt understood, i cannot use a normal eventListener in that because the clicks is detected in another element or in nothing, even with z-index or more in css, so the solution should be done entirely on javascript logic). The first video is the new way, the second is how it was before all changes in it
Im nearly finishing the workings on the responsiveness. Now the entire player screen is responsive and do not breaks the texts anymore (except for the description area), also the buttons that show you the next screen (the ones that displays ‘player’ and ‘generos’) are responsive too, the music queue is working perfectly fine, and the area that is used to select an emotion is nearly responsive too, it just needs some adjusts in the two buttons that change the current emotion because they become too small and uses a lot of space when the screen is too small, after that this screen will be finished. It is taking a really long time, the fact of how many different screen sizes exists makes it harder to finish, but now there is times that i even cannot see if i changed the resolution in some areas, because the system looks the same. I spent quite a while testing different resolutions and combinations of size, i didnt even noticed that i where 6 hours here, but now ik more about css (things like container-type + container based sizes and more ways to set the size of an text) The video shows how it is now, if u want to see the before just checks the past devlog.
The emotionDrum is now responsive! Now the buttons that you use to select the emotion are in the same side as the div that displays the emotion, so they dont fight for space anymore. This change is meant to fix the low size of the items in screens that are too small, in the new way we have more free space to display the emotions, there is not much to say. What else I did some minor changes in the size of some items at the player area, now they are easier to read! (I increased the size of some items)
The home is now fully responsive Ah that took a while, but finally it is fully responsive. Now the description at the player UI resizes based on the screen size and active a scroll behaviour when need, also i did some minor change at the emotionDrum perspective to make it show more emotions at the same time, removed the padding in the arrows at the emotionDrum so they will have more space and fixed an error in the genre drum that was making it perspective broke. After all these devlogs i improved how i make a code responsive.
Improving the performance After finishing the improvements in the responsiveness, now i decided to improve the performance. I used lighthouse to get insights (i learned about it in an tiktok video) and figured out that the images size were too high (were an png of 1280x1280px), so i saw more about that in the page: https://developer.chrome.com/docs/performance/insights/image-delivery (an link that google lighthouse gave). With that i saw how to decrease the size while staying with quality, i reached up to the sharp-cli tool, that makes the work of resize, convert and compress the image for me. The command used was that: npx sharp-cli -i * .png -o ./output resize 320 -f avif -q 50 --effort 6 --smartDeblock --preset photo The 320 is the size that i want it to be at the end, i got that value by seeing what was the computed value (the value that is being used in the website) in an high resolution pc (not the most higher one, the high but normal pc) with the resolution of 2500x1714px . With this simple changing the image went from 2mb to 40Kb! Nearly 100% decrease, and take in mind that there is more than one img, so the change were even higher. Also i created 5 different images: 320px, 480px, 640px, 960px e 1280px. With them the browser can choose which one is better for each device. With these changes i went from 35 points of performance to 59.
Improving the LCP (Largest content paint) performance I am improving the way that the website create and downloads the images, the main reason is to make the user see something faster. Before the system were doing 2 main things: Go trough the entire list of images, creating the elements and placing them into the page. Position them. But the position of the items were being done after the creation of the images, in another function. Now they are in the same function: it create the element, position it and add it to the page. That does not seem like much, but the code got way faster with that, probably because it dont need to go item by item in an list twice just to create an element. I tested the time to load the first element and it went from 8.63s to 6.43s , the test was made with 2200 elements (Yeah ik, it is a lot and normally it isnt that much, but i had to see how they were holding with more than 22 items). Also i fixed a bug that passed unnoticed while improving the responsiveness: At some point of images the visibility of the elements broke, that was because the perspective (what makes the 3D perspective of the component, and makes it visible with 3D effects) was based on the screen size, not the elements itself. What was the problem in that: Each element takes a size in the screen ‘makes the circle that shows the element be more and more near of our point of view’ (i cant explain it any better, search what is ‘perspective in an 3d element at HTML’ ). While it was approaching our point of view (POV), our POV were exactly at the same position (based on the screen size), so at some point the circle perspective would pass the POV and we would be unable of seeing it well. Now it is based on the elements: The 3d elements were basically a circle, i just used the diameter to change the perspective based on it. TODO: Maybe i lowered the image quality too much… I will fix it in the next updates. Also i were trying to improve the font settings to improve the performance, but that wast working so i decided to move on to this because it was more critical (took a while for me to jump to this, maybe like 2 hours trying and trying values in the font settings). i am also working in a way to load the images in parallel, with that it will take way less time (I didnt known about LCP before so i spent a while figuring out the way it works).
Improving the loading performance Now the system selects some images that needs to be shown faster than the others and making them load with priority. It was made by selecting the images that the user is seeing and defining some params like fetchPriority = "high" and decoding="sync" , the other images have the params: decoding="async"; loading="lazy"; contentVisibility="auto"; . With that config the LCP went from 2.4s to 0.5s . Also it loads the image in the start and dont change that config again, so the browser will be lazy while downloading these images. The problem is: only the first images are chosen as high priority, but their positions will be changed while the configs stays the same, that makes the browser lazy while loading them and makes the runtime performance became worse. To fix that i found about IntersectionObserver, that are meant to solve the problem of updating the images position fast. It was not applied yet, i found about it like 1 hour ago. What else Now the perspective of the emotionDrum is based on the elements that it have, before it was based just in the screen and would broke if something changes. I did a little change in the way that the script checks for clicks in the screen, now it has more accuracy (I changed the round system).
Adding an observer Now the script observe the card elements at the cover-flow component, classify their position and changes it visibility based on that. Im using an IntersectionObserver to observe every card, but it was designed to observe the position of 2d elements, so i had to figure out how to make it work well in an 3d element. The way it works is when the observe activates (it basically means that some card is in the range to load) it get the card info (like position and angle) and changes it visibility state based on that. Simple, right? No, it was a headache for the start to the top, nearly 4 hours of what i did was to fix the fact that it was meant for 2d. The observer were activating for cards that were in the back of the element, so i had to classify the card position into back or front by using its angle. But if i tried to use the card angle without anything else the script would broke (and did for 3 hours until i realized how to fix), so i had to use an second angle which is 360 - cardAngle (the 360 is the angle of an circle), so this new angle is based on the circle end while the other is based on the circle start. But the system still broke, because at some point one of these values would become negative and makes the if that classify the elements fail. The fix was using the absolute value in the if (it took 1 hour until i figured that; oh i were so happy when it worked). Why To improve the performance, so the browser will just load what is really important and not 50 images that the user cant even see. What else All that work definitely improved a lot my logic thinking and for the first time i used the truth table well. Now i just need to use the new code to change more the style of the images that are not in the screen. I did not deleted the code that i wrote in the past devlog, it was used in the new code to select how many images should be loaded in the same time. ** The first video is the result, the others is some problems that i had **
The observer is finished (nearly) Now the cover-flow has an observer that checks the position of the images and changes it styles based on that, so the images that the user is seeing is loaded while the others is hide. It still has some bugs and space for improvements that im still figuring out how to solve, like the image loading too late on the screen or, in slow internet connections, the image takes too long to load. Most of these bugs are because the observer (an intersectionObserver ) was designed for 2d contexts, not 3d (that were and still is an giant problem to solve). For this reason i was thinking about creating an observer from scratch in C++ that can work better in my 3d element, but the overhead would be high so im trying to solve in other ways before that. The feature was made using fetchPriority, contentVisibility and src (the system add the source just when the image is near the screen). OBS: I found about MutationObserver after this post, maybe i will use that instead of insersectionObserver. Oh man, at least if had found about this before… Aaaaaahhhhh i spent 9 hours in that, but at least a Lot of the new logic will be used. Anyway, lets cook
Adding a mutationObserver Now, instead of an intersectionObserver, the system use a mutationObserver that monitors the angle of the cylinder itself. With that the loading of the images will be insanely better, faster and user-friendly. Now the changes in the cover-flow is observed at the cylinder angle, not at each card. There was some problems in the journey like, for some reason, unexpected cards being loaded or not, the loading script at the observer dont triggering at all (that was caused by the speed of the observer) and an insane amount of cards being triggered at the same time (i still did not figured out why, but that isnt ‘harmful’). But man, i had to be creative here and remember about some concepts like concurrent programming, buffer / queue and apply some delays (because the mutationObserver is insanely fast and can trigger every millisecond). That all was meant to decrease the speed of the mutationObserver, because it was triggering with the most small change in the cylinder, so i made it trigger just when an expected amount of movement was made. The red/yellow collor is for me to visualize the loading state, it is just for debug The code isnt finished, i still need to implement the loading part, for now i just implemented the observer and basics of the loading part
The loading is done Features Now the loading at the mutationObserver is finished, it finally loads or unloads the images that should be (or not) loaded! The new observer is way faster, because it can detect the image way before it enters the screen, loading it before and having more time to do it. Also the system loads just a maximum of images (with the configs that i put it is 13), so it will not fry an cellphone. Problems The loading part was easy to do, i already done it before in the past observer (intersectionObserver), so i just had to pass the old code to the new part. But when the cover-flow element dont got atleast 13 elements the mutationObserver code breaks completely! Im still pondering how to solve it, when i do i will post about! Results The performance went from 78 to 100! The system is way faster! The user does not see a blank image anymore! Why The old method was slow even with a good internet connection, because it was loading the images just when the element was already in the screen, leaving to a perceptive delay for the user and a blank image to the user. Also i thought about creating an observer from scratch (maybe i was a little off my ideas, because that was insane), but the browser already had exactly what i wanted (the mutationObserver) Videos The new features The performance of the new feats The old features Reasoning While i was trying to sleep i thought about a system that fill the cover-flow with a maximum of images (like 10, or 13, or the code decides) at the DOM, using less memory to run. That system will free a lot of memory based on how many cards the cover-flow have. But that will have noticeable effects just with a lot of elements and probably would be hard to develop, maybe i will do in next updates. What next Im leading to the shipping, so i will improve metrics about the lighthouse, improve the readme and post it.
The loading is done and working! Fix I fixed the error that were happening when the cover had a certain amount of elements. Problems The fix itself was very easy to do, but doing it in a readable or without using 10 lines of code (i want things concise) was way harder than i expected. So i spent this entire time trying different ways to do it, each of them making everything worse. Reasoning The bug were with less than 14 elements, the script were calculating the first and last element index, it happened that these elements were behind the screen focus. Why? Because the values that the system was using were leaving these values, so i had to fix the way it was calculating things.
Fixing an error at the youtubeHelper Now the youtubeHelpers checks if the youtube API is ready before sending commands. Why Sometimes the API maybe is not finished yet, that was leaving an untreated error that was braking the entire website. How was made With a lot of pain and suffer. I thought “Oh hey, that will be a 15 minutes fix” - i spent 1 HOUR FIGHTING with the iframe itself, nothing was working and at some point i started thinking that even the API of YOUTUBE wasnt working, even the most basic function that should be triggered when the youtube finished the loading wasnt beeing activated, even the console.log(“Api READY!”) wasnt working, even when it worked it wasnt working well, the variable of the player was a promise and not the result. At the end i shut down my PC, defeated, without any energy left, with just hope that in the next day (this) that would be fixed (if not i was planning to ignore and make it a feature “Easter egg, if u dont join the website for a while it will not load!”. The problem here was just the position were the iframe api was in the HTML, it was being loaded before the helper script, so the helper was not there to check if it the iframe was ready or not, the fix was just move it a little down. Architecture It was just an promise, if the function checks that the iframe isnt available it await for it to be available. The check if it was available use the onYoutubeIframeAPIReady, easy easy (except for all the suffer that i went into).
The performance workings is finished and bug fix Fixes Now the logo z-index is lower, that is because the logo was ‘eating’ the click in more important elements. Also i did a small change at the cover-flow, that change fix the bug of the scroll at the element sudently stoping when at a certain position. The copa script had some old references to images that were leading to bugs, i changed it. Performance I already finished it in the past devlog, i was just checking if there was anything worth improving, but everything is working fine and now is time to improve acessibility. Most of the logged time was me trying to improve more some metrics at the lighthouse, but the work was too much for anything that is already good, so i decided to stop before i started focusing too much in it.
The accessibility workings is done Features Now the system has a new navigation system that allow users to navigate with just the keyboard! (The video was with just the keyboard) Why Why not? It was meant to improve the accessibility for users without mouse, or any another problem and because i was tired of having to use the mouse to debug something. How it was made Again with a lot of pain, the feature itself was easy but i had to fix some errors that went unnoticed, so it took more time. The feature detects when the user press a key and do an action based on wich key was. The accessibility was easy to get 100, but the metrics at lighthouse dont give all what the users will need, i had to think about the website usage and how would be the easiest way for the user. Results The accessibility went from nearly 69 to 100! What next Now i will work on the best practices! Update after the devlog: Nearly every metric is already maxed out lol, i will ship it very soon!
All done, it is time to ship Every metric at lighthouse it nearly perfect, im so exited to ship it!
Added install guides Now there is guides to help the user install for ubuntu, arch and windows. Notice that im a linux user and my pc is weak, so i could not test it on another operational system. Also the guide is in portuguese (all of them), please use your browser built-in translator or any of them to read if u dont understands portuguese I could test it on another linux distro, but i would have to go through all the install steps. Also i cannot try installing windows because it normally wipe out another OS installed on the same disc (i know that it just replaces the bootloader) and using a VM was not possible due to the amount of RAM and the processor that i have.
Configuring an ssh server! I configured an oracle cloud vm with ubuntu to host my website 24/7, that was because nest wasnt working in a while. Im running it at a local IP with http only, i will configure https today and maybe an domain, the IP is http://164.152.55.252 , notice that some browsers may block you from accessing and http website. UPDATE AFTER THE DEVLOG: I put an domain using duck dns: http://ritualia.duckdns.org Hardwork I had absolutely not a single knowledge about oracle cloud vm, so configuring it was an hell. Sometime my internet stopped working so i had to use my smartphone, this lead me to configuring an invalid ssh key and i had do configure everything from scratch, i spent 5 hours configuring everything, but that was ssh and wasnt tracked. But now everything is working fine. Thx oracle This vm is a 24/7 entire OS (Virtual Machine) that has some good free plans, without any cold start. Thx stardance Stardance now will have one more mount!!!!!! I still has roughly 40 hours of deep development to do after this ship, i will love to finish that in stardance!
It is time to ship! Now the system is working perfectly fine running at a vm in oracle cloud with a public domain, and a dns with duckdns at http://ritualia.duckdns.org/ Warning: It is just HTTP!
Added english readme I created an english readme, api and install Guide, so it will be easier to read and more accessible for worl-wide users
Ships:
What did i made I made an complete music play system that will help users to learn while listening to musics! I used youtube, flask, python, mysql, js and hope to make this! What else Solved a lot of painful bugs that were stopping the project from working Finished and made the music queue work Added music description labels Improved a lot the performance Made the website responsive Added a keyboard based navigation Fixed so much errors at the cover-flow that now i forgot how many Added bug checks before the play of each video on the player Created an toast component to show errors or infos Added 54 musics to choose and listen Challenges The most painful code was the player and the cover-flow, they were with a lot of hidden bugs that i had to figure out, feats that i had to make and pain to suffer! Now i figured out that i love and HATE making a website responsive! What im proud of MutationObserver: An observer that loads / hides an image based on its position at the cover-flow, this system took a while and worked very well. Error checks at player: The system can handle the error that happen and dont crash! Keyboard navigation: Everyone can use the keyboard to navigate now! Oracle VM: For the first time i used an ssh and hosted an website in my own machine (oracle, not mine)! How to test Access http://ritualia.duckdns.org/ , when you join and the page loads you will find a screen to choose an genre, select which one you want, after you will see an emotion selector, select the emotion that you wanna feel! You will see the player screen and an audio explaining the music (The audio is in portuguese), after the audio the music will play. Notice: The github and the website are in portuguese, please use your browser built-in translator or any that you want to use the software properly! Follow the installation guides at github if you want to install...
|
1792856941.6754558
|
1792943341.6754558
|
|
64661
|
ash's right hand by @aashvik | Stardance
|
aashvik
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-23T22:42:03Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Devlog The hardest part was getting the DM system to work with multiple DMs and replies. The fun part was adding the random roasts, 67 reaction, and completely random woof feature. : D", "repo": "https://github.com/koditra/slack-bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0C3VCB477V"}]...
|
[{"post_id": 72879, "ts": "202 [{"post_id": 72879, "ts": "2026-09-23T22:36:06Z", "hours": 1.1672, "text": "I finished making this bot It now has: /ash-ping, /ash-roast, /ash-dms, plus the 67 reaction and random woof replies. The DM system was probably the most fun part to build."}]...
|
Title: ash's right hand by @aashvik | Stardanc Title: ash's right hand by @aashvik | Stardance
Devlogs:
I finished making this bot It now has: /ash-ping, /ash-roast, /ash-dms, plus the 67 reaction and random woof replies. The DM system was probably the most fun part to build.
Ships:
Devlog The hardest part was getting the DM system to work with multiple DMs and replies. The fun part was adding the random roasts, 67 reaction, and completely random woof feature. : D...
|
1792814169.860026
|
1792900569.860026
|