|
50720
|
AxionOS by @Akkorpy | Stardance
|
Akkorpy
|
0
|
14.41
|
0
|
[]
|
[{"post_id": 80865, "ts": "202 [{"post_id": 80865, "ts": "2026-10-19T02:54:50Z", "hours": 2.0039, "text": "Made a contact app. Now you can write an email and it will be addressed straight to me. It works through Formspree. I made it with Claude (I know, I use AI more than I should, but there is a lot of things I want to create but I don’t know how). I’ll add also About Me app, Music playerm Weather app and browser (maybe). For now, my OS is almost complete"}, {"post_id": 78934, "ts": "2026-10-12T02:47:02Z", "hours": 2.1689, "text": "Finally! Renamed simply Notes by Cosmic Journal, made navigation for it and added some text. Moving content to JS was the only challenge. Used Claude for troubleshooting and Gemini a little for designs and adapting the code from the instruction for my project (however, its visual needs some update), especially in the last part (navigation and JS content)."}, {"post_id": 77000, "ts": "2026-10-05T10:04:33Z", "hours": 1.2914, "text": "Finally! I fixed the main problem with dragging and closing the windows. I haven’t completed my notes app, so it looks really raw and… empty. However, now it will be easier for me. And honestly, I only used Claude for troubleshooting, debugging and making the code easier to read, especially for this issue, but nothing more than that!"}, {"post_id": 72488, "ts": "2026-09-23T02:14:32Z", "hours": 2.3156, "text": "Today, I was working on my first app for the OS. I guess I didn’t fully understand the instructions for Jam Part-4, as my code for window dragging and closing stopped working for both the Notes app window and the Welcome screen (it was working for the Welcome screen until I added the app code). I’m not sure what I should do to fix it yet, even after asking Gemini, but I’ll try to debug and fix it today. If you have any solutions, please leave them in the comments!"}, {"post_id": 69235, "ts": "2026-09-16T17:03:11Z", "hours": 1.1761, "text": "Made its visual slightly more interesting - added a gif wallpaper insted of png. Also added a handle for Welcome screen"}, {"post_id": 62388, "ts": "2026-09-05T18:42:26Z", "hours": 2.3306, "text": "Finally finished making window openable, closable and, of course, draggable. I spent most of the time fixing some text bugs and how the Welcome window appeared when opened. Next step is to create my first app"}, {"post_id": 62123, "ts": "2026-09-05T11:44:54Z", "hours": 2.0556, "text": "Just finished making top bar and desktop, time track and also defining my welcome window. It’s hard to read the code, so next time I will move styles to CSS file and scripts to JS file. Also, I will make windows movable, openable and closeable"}, {"post_id": 49805, "ts": "2026-08-18T19:05:00Z", "hours": 1.0633, "text": "Just finished making my Welcome Screen. It seems awkward at the moment, but I will be upgrading it every day till shipping. Tomorrow I will update its visual appearance"}]...
|
Title: AxionOS by @Akkorpy | Stardance
Devlogs:
J Title: AxionOS by @Akkorpy | Stardance
Devlogs:
Just finished making my Welcome Screen. It seems awkward at the moment, but I will be upgrading it every day till shipping. Tomorrow I will update its visual appearance
Just finished making top bar and desktop, time track and also defining my welcome window. It’s hard to read the code, so next time I will move styles to CSS file and scripts to JS file. Also, I will make windows movable, openable and closeable
Finally finished making window openable, closable and, of course, draggable. I spent most of the time fixing some text bugs and how the Welcome window appeared when opened. Next step is to create my first app
Made its visual slightly more interesting - added a gif wallpaper insted of png. Also added a handle for Welcome screen
Today, I was working on my first app for the OS. I guess I didn’t fully understand the instructions for Jam Part-4, as my code for window dragging and closing stopped working for both the Notes app window and the Welcome screen (it was working for the Welcome screen until I added the app code). I’m not sure what I should do to fix it yet, even after asking Gemini, but I’ll try to debug and fix it today. If you have any solutions, please leave them in the comments!
Finally! I fixed the main problem with dragging and closing the windows. I haven’t completed my notes app, so it looks really raw and… empty. However, now it will be easier for me. And honestly, I only used Claude for troubleshooting, debugging and making the code easier to read, especially for this issue, but nothing more than that!
Finally! Renamed simply Notes by Cosmic Journal, made navigation for it and added some text. Moving content to JS was the only challenge. Used Claude for troubleshooting and Gemini a little for designs and adapting the code from the instruction for my project (however, its visual needs some update), especially in the last part (navigation and JS content).
Made a contact app. Now you can write an email and it will be addressed straight to me. It works through Formspree. I made it with Claude (I know, I use AI more than I should, but there is a lot of things I want to create but I don’t know how). I’ll add also About Me app, Music playerm Weather app and browser (maybe). For now, my OS is almost complete...
|
1792641157.8968778
|
1793245957.8968778
|
|
63324
|
Yahtzee by @BlueCheckmate | Stardance
|
BlueCheckmate
|
0
|
16.22
|
0
|
[]
|
[{"post_id": 80869, "ts": "202 [{"post_id": 80869, "ts": "2026-10-19T03:31:38Z", "hours": 0.9897, "text": "WOHOO WE DONEE!!! I made sure that if you switch between modes it resets everything. Had some issues because I stored the 2nd players scores in something that was also an html element, so it didnt work out originally, but a quick fix in adding variables to store score and changing scoring mechanisms was quick and efficient. Then a copius amount of testing to see for bugs. You’ll see one in the video below where it displays who won twice, but thats my fault cus in my code it waits three seconds before running, so if player 2 finishes within 3 seconds of player 1, itll run twice, so quick fix there. Then more testing and I havent encountered bugs in a while so I’m calling it a wrap! Tomorrow and Tuesday is ReadMe work, and Tuesday we shipping."}, {"post_id": 80507, "ts": "2026-10-17T22:00:11Z", "hours": 0.5361, "text": "NO BUGGSS!!! So I spent a grueling amount of time testing and fixing, but the bug fix was like I expected. I know that once a 0 is recorded, it resets the rollcounter to 0, so I made sure you can only add a 0 if rollcounter is greater than 0. That way, the event listerns can run multiple times, but only the first one can do something. After that, I spent a loooong time in testing And I just caught some 3 errors in my code that wasnt too bad. Then I spent some more time testing, the first time where Player 2 tests the upper section on how it handles 0s while Player 2 tests Lower section, and the second game was vice versa, Player 2 test upper section while Player 1 tests lower section. All in all, happy with my work. Tomorrow I make sure it resets everything when you switch between modes, and Monday/Tuesday can be ReadMe, so I can ship and finish Sticky Streak!!!"}, {"post_id": 80286, "ts": "2026-10-17T03:49:09Z", "hours": 1.9294, "text": "I am going to start bashing my head in the wall cus I have an UNBELIEVABLE AMOUNT OF BUGS So I finished the scoring for the lower section in multiplayer, which is fine, and compiled lower score but now the bugs start: Grand Total won’t show - I spent like 20 minutes figuring out why because variable names matched in both html and js, but then I look a little bit more closely and then instead of GrandTotalScore2 = document.querySelector(\"#GrandTotalScore2) its GrandTotalScore = document.querySelector(\"#GrandScore2) Im going to tweak. Sometimes if you record a zero for player 1, it also feels the need to give a 0 to player 2. This is because of too many event listeners nesting, and they never really go away (a previous issue that was fixed with a current checker) so a quick solution for that, or so I thought, it is not the case right now, because I added an if statement that actually means nothing, because If you decline a 0, and then score a 0 for the other players, both columns get a 0. because of… 🥁 I nested the event listeners too much!! and I am NOT rewriting all the code because thats too much and im in too deep. So I think I now the solution right now, because it resets the dice count each time, so I just need to make sure if the dice is reset you cant do it again, but I’m too tired for that. The video below shows the 2nd/3rd bugin effect, and Im not filming something new cus im too tired. The second video shows the 1st bug. Enjoy, sorry for the long devlog but I barely kept sticky streak past couple days so basically no time to devlog."}, {"post_id": 79223, "ts": "2026-10-13T02:48:21Z", "hours": 0.6819, "text": "So some more scoring for the 2s through 6s in multiplayer. Pretty straightforward I though, until during recording I encountered some bugs that I have no clue whats up with that, but Im not touching them today. dont have the energy for that."}, {"post_id": 78917, "ts": "2026-10-12T01:20:18Z", "hours": 0.3247, "text": "So I added started Scoring if there is a 2 player. I spent some time trying to find out the best way to tackle it while adding the least amount as possible, and I believe I did. while It will be a while before I bug test the whole thing, theres 2 situations in which you score the first column, so thats an if ((situation1)||(situation2)){scoring1} and then an else{scoring2} for the second column, so I think it works out nice. So i think it should become easier for the rest. Also a snippet of code if you’re interested"}, {"post_id": 78914, "ts": "2026-10-12T00:55:05Z", "hours": 0.7431, "text": "Ughhh, this is more complicated than I thought. So initially my codespace was buggin out cus stuff wouldnt load, took me some time to make the second chart for scoring, and positioning the circles and Multi/Single player circles to show modes. And now Ive though of how much of a headache this is gonna be to make. But we’ll persevere"}, {"post_id": 78513, "ts": "2026-10-11T01:44:14Z", "hours": 0.5286, "text": "Ok, so now I am done with the basic version, everything should work, touched up the intro stuff, and added one page for how to play and rules, and another for scoring. I also topped up an issue I just had with myself that you can open multiple tabs like how to play and New game that overlay each other, so I made sure that doesnt happen. Also when touching up the intro, I wanted Next page and Close next to each other, but then they didnt have any bottom margin, so I used bottom: 16px that applied only to the visible box and not the whole scrollable thing, so then I had to create a div with display: flex, and do it there, which worked out, but still annoying nonetheless when im just about done. I’ll add a version where you can do 2 player, and then I’ll ship!"}, {"post_id": 78483, "ts": "2026-10-10T22:33:35Z", "hours": 0.3814, "text": "Worked on the New Game button. Just a monolith of a hundred different verifiers getting reset to false, and a bunch of .innerhtml = \"\" Also, fun quirk in my code I figured when I tried to copy all the verifiers. My OneChecker variable was actually OneChekcer, so the ck was a kc, so when I try to copy paste and all of the other checkers arent recognized, I quickly figured it out."}, {"post_id": 78474, "ts": "2026-10-10T21:58:58Z", "hours": 0.8186, "text": "Getting there. So I added the grand total mechanism, then also decided to pop up a window with you’re score and how good of a score that is. And then theres some bugs I encountered, so some general fixes and making sure everything works smoothly. I’m gonna work on new game now, and then the intro"}, {"post_id": 78450, "ts": "2026-10-10T20:28:56Z", "hours": 0.6828, "text": "Almost Done (for the basic version) So I added the things for 3 of a kind, 4 of a kind, and Full house, which is all of them!!! I did a quick optimization because for chance, 3 of a kind, and 4 of a kind, the score is all the dice added. So I did a quick adding function, but then for some reason it wouldn’t work, even though the variable was global, but apparantly i needed to store it, even though I thought I did, so the fix was score = adding() But thats kinda it, everything can get scored now, so I need to make sure it can all get added up to the Lower score, then the grand total, make sure new game works, and I’ll touch up the intro, make it better."}, {"post_id": 78246, "ts": "2026-10-10T03:52:14Z", "hours": 0.7481, "text": "Some complicated work done and learnt some new stuff BY MYSELF!!! So basically, a long straight is all 5 in a row, like 1,2,3,4,5, or 2,3,4,5,6, and its going to be an if statement of doom and despair if I do it like that. SO, I put them in an array, and sort them from least to greatest, so my long straight code looks like this if (Dice[0] + 1 == Dice[1] && Dice[1] + 1 == Dice[2] && Dice[2] + 1 == Dice[3] && Dice[3] + 1 == Dice[4]) and I also remembed to make Dice a global value, so it doesnt exist only in that function, which is what I didnt realize a couple days ago, which is why it was better to start from simple to harder. and I figured this out ALL BY MYSELF, NO AI, JUST PURE LOGIC now for small straight, it was a bit more complicated, cus its only 4 in a row, so there can be duplicates, so theres 4 situtaions in which it can work. I got the first 2 light work, then I realized later I needed the other 2. Now here is where AI got involved, cus Im thinking if I do if (situation1) else if (situation 2) else if (situation 3 ) else if (situation 4) else and repeat the same instructions 4 times, if it can be condensed, and then Gemini told me about if ((situation 1) || (situation2) || (situation3) || (situation4)) and then only one set of instructions. Nice to know that. Happy with my progress here."}, {"post_id": 78240, "ts": "2026-10-10T02:45:56Z", "hours": 0.4528, "text": "So I fixed the previous bug, by making creating a variable that each section has a specific number, so the score 0 can only be applied when the section number matches the variables number at that time. I then also added scoring for chance and yahtzee (which dont require an array) That was pretty simple, just adding em all up for chance, and making sure they all equal each other for yahtzee, which took a long time becuase I limited myself to only 3 rolls Then I had the bright idea to just change the amount of rolls im allowed so I make sure it works. It does."}, {"post_id": 77977, "ts": "2026-10-09T02:52:34Z", "hours": 0.785, "text": "So maybe less visual progres today: I just made sure that if the score is 0, then you gotta confirm that you’re scoring a zero. I’m getting better at recognizing that when I have a lot of repeting code, to start using functions But sadly not for this, because I though that itll do the function, and then just record a zero without waiting for my input, so I added event listeners everywhere, and it worked so I’m not complaining. I caught a bug that if you hit no multiple times, then if you hit yes it logs multiple 0s, but the fix was ___Score.innerhtml = Score instead of ___Score.innerhtml += Score Then there was an issue where the confirmation window vertically stacked Yes and no, which is not what I wanted, but I forgot to add Position: absolute And lastly theres a bug where if you click multiple sections that can be 0, when you eventually click yes on one of them, it logs 0 to all I clicked. But I aint fixing that today, thats a tomorrow problem, so see you all tomorrow."}, {"post_id": 77727, "ts": "2026-10-08T03:10:38Z", "hours": 0.4811, "text": "Perhaps a day with more noticable progress. I finished up the scoring for the upper section, and added the function to check if you get the bonus or not, and making sure that you’ve scored everything before deserving it or not. So a bunch of copy pasting the same code for the 2s-6s, and then some writing for the Bonus function, tomorrow will probably be less work, just confirming that is you’re scoring a 0 you know you’re doing it."}, {"post_id": 77455, "ts": "2026-10-07T02:28:08Z", "hours": 0.6047, "text": "I am continously amazed at how much more work is actually showing itself up rn. I planned to start the 2s, 3s, 4s, 5s, 6s, but I just spent today with rules. I wanted to commit on pop-ups removing everything except the warning so it looks nice, but closing a bunch of windows each time is tedious. Lucky me.. I remembered functions exist!!!! so now I have a closebunch and openbunch functions that close or open a bunch of windows depending on what I want it to do. so nice. and then theres a bunch of things you can do, so instead of each being its own warning, I bunched that into one with just a list of things you cant do should you try, and I called that one function NoNo() I also reset the dice after you score yourself, can’t lock the dice when they’re reset and made sure you can only score yourself in proper conditions, and cant rescore So no bugs now, which is great. Heres some good progress (longer video, more to show off). But hey, I also figured out that this qualifies as making a game in a non-game engine, so if I have 10 hours from now till then I get it so got my work cut out for me."}, {"post_id": 77209, "ts": "2026-10-06T03:05:54Z", "hours": 0.6022, "text": "Man………………… I’ve got a LOT to learn. So I started out with a filter function, just to arrange the dice rolls from greatest to largest, then started an if statement were if any equal 1, then thats the score, and put it into the innerhtml. If only it were that easy right. I dont think a single line of code was right there . I didn’t put the filter function outside of it, so it wasnt even called upon, and basically nothing was right. So I decided to start with basics, if I click this button will it show a number. It does, So then if this die value is 1, add 1 to the tally, and then display the tally score. That doesnt work. It was because the die’s value is locked in a function, so it needs to exist in the main script. easy fix, and now it works . But the code is very simple, it’ll work for 1s-6s, which is nice, but I want a deeper code understanding. I’ll have to use an array, and index it for short/long straight. I’ll have to make sure you can only click it once, verify if your score will be 0, and reset dice rolls to make sure you can roll again. But thats a problem for another day. So adios"}, {"post_id": 76921, "ts": "2026-10-05T02:50:28Z", "hours": 0.4847, "text": "Gotta do something everyday, and today was busy so not much. Before I start the array of doom and despair, I first needed to assign variables to all sections of the table, and then put that over into the javascript. How Fun. So that means 34 variable names I gotta put in the HTML and in the JavaScript. So after all that, I go to make sure my website still runs. Ladies and Gentlemen… The close button on how to play no longer works. So now I gotta look through all variable names to see my error. And it was because SixeScore was supposed to be SixScore, and GrandScore was actually GrandTotalScore. So 2 fixes, not bad, but it still doesnt work. Then the big GPT tells me that I have id 3Kind and 4Kind, instead of ThreeKind and FourKind, which I did change for the scores but not for the original. I changed because javadoesnt like a number as the leading string for a variable so I changed it, but then forgot to change it on the other end of the line. So overall, very fun guys trust. Heres a video of what my UI does so far:"}, {"post_id": 76539, "ts": "2026-10-03T21:25:26Z", "hours": 0.2736, "text": "It’s slowly coming to fruition I added the rest of the tables for scoring and it’s looking good now, less janky when just the left side was there But now I get to the hard part I need to store the dice’s values in an array, and then call on specific values based on what scoring category. While that’s easy for 1s-6s, and chance, it gets harder for more specialized sections. Also I need to make sure you cant score for the same thing. and then add all the values up and make sure you can actually get a bonus…. All in all… its gonna be a learning experience (hopefully a fun one)"}, {"post_id": 76271, "ts": "2026-10-03T00:52:44Z", "hours": 0.4636, "text": "So I’m starting the table of the scoring, and I’m doing that through separate divs and css. Now you might wonder, why dont you use <table> <tr> <td></td></tr></table> ? and thats a completely valid question your answer: I dont want to I find it much easier to copy paste divs with the same border box class and a <p> and do that. I am not you Great, we got that out of the way. Overall light work, looks kinda weird right now but I think when I add the other stuff its gonna look good. also I fixed a thing from last time, in which when you get the roll warning or the how to play, it would keep the dice lock on, and I need that display off, but when you come back, you need it back on. That took some time as well"}, {"post_id": 76014, "ts": "2026-10-02T01:51:25Z", "hours": 0.385, "text": "So I comitted to a sticky streak so I gotta do stuff everyday, and today was lowkey tiring so I didnt do much. Just added some technicalities and made it look a little better cus when the rules open on top the dice it looks terrible so I just made the dice disappear when rules are open, and made sure you can’t roll more than 3 times."}, {"post_id": 75765, "ts": "2026-10-01T01:13:23Z", "hours": 0.6214, "text": "YES IT’S WORKING!!! You can now keep a dice value that you like, and it was surprisingly simple to make if im being honest. First, I added the toggle to show when the die is locked or not (took a bit of time to position properly). Next, I gave an id, and created a true false value to track, and when you click the die, it toggles it on/off. and then I went into the functions that handle the dice roll, and only allow it when the lock is off. Good job, me"}, {"post_id": 75760, "ts": "2026-10-01T00:10:08Z", "hours": 0.5294, "text": "Guys, I’m genuinely getting better at this I created the function that can roll the dice and create random values. Little bit help from W3 school on creating the random number, but I got the comparison right and making sure that the correct dice value is added. Very little debugging. That being said, its SUPER repetitive code and copy+paste gonna come in clutch, so theres definitely going to be a more optimized way, but the lion does not concern himself with optimizations while working on the cloud Anyway, gotta make sure you can keep dice rolls that you like."}, {"post_id": 74204, "ts": "2026-09-26T22:18:35Z", "hours": 1.1225, "text": "I genuinely believe that Fraud Squad gonna reduce my hours on this project 😭 Heres Why: I spend an hour creating dice . While I know how to create dice under NORMAL circumstance (create a box and put pips in them), these are not normal circumstances, because I will need to manipulate their values. The rightmost die might be a 3 this turn, but in a minute it could become a 5, and I need to adjust for that. Therefore, I need CSS, and if you’ve seen my ChessOS project, you know that CSS and me are no bueno for the most part. Dont understand it at all for the most part, and definitely not incorporating multiple CSS into one element. 1st Attempt I tried styling the base box, a dice pip and putting multiple pips in a dice, I got this far: .dice{stuff} .dicepip{stuff} .dice1{ .dice .dicepip} Shocker, CSS doesn’t work that way 2nd Attempt On the main div that’ll display dice, I need to just put multiple classes in, and create a second div that contains the dicepip div <div class=\"dice dice1 dice2> <div class=\"dicepip\"> That worked for die #1, so I thought, lets do it for the other 6, cus monkey see monkey do . That resulted in one pip per dice in one of the correct spots, because as Gemini told me, It can only include 1 pip. So theres some time over there 3rd Attempt So AI directed me over to multiple background images, with positioning, with code radial-gradiant... then background-positioning and I only got a singular centre pip for all dice no matter if the code had more than 1 (image to show this) The answer to this one is that radial-gradient naturally wants to take up all the space so only one can fit in. 4th Attempt radial-gradient(circle at 15% 15%, black 12px, transparent 13px), For all the pips in die, and now it works!!! works, and I can manipulate which dies get which value, which will be hopefully smooth sailing in that aspect"}, {"post_id": 74170, "ts": "2026-09-26T20:31:55Z", "hours": 0.5367, "text": "I’MMMM BAAACKKK!!! After some slight demoralization in the fact I had to do a lot of things in a little amount of time, hearing stardance get extended revived me, as I now have more time, and will do a lot more things. It starts with Yahtzee. I did the rules, and now Im going to start getting into the hard stuff"}, {"post_id": 69949, "ts": "2026-09-18T03:47:10Z", "hours": 0.5142, "text": "I can’t lie, Fraud Squad gonna have a field day with me A whole 30 minutes to create this I’m genuinely fried. But I have a reason behind that: I spent the first 15 or so minutes trying to get the correct background because even though I was doing background-size: cover It would show a blurry-ish image that was not the whole image, it was cut-off, and idk why. So I went with this. Then I spent some trouble with centring yahtzee, then the 2 boxes I needed to be perfect. So yeah, I deeply apologize fraud squad. Also here’s some pictures of the first wallpapers I tried to put."}]...
|
Title: Yahtzee by @BlueCheckmate | Stardance
Devl Title: Yahtzee by @BlueCheckmate | Stardance
Devlogs:
I can’t lie, Fraud Squad gonna have a field day with me A whole 30 minutes to create this I’m genuinely fried. But I have a reason behind that: I spent the first 15 or so minutes trying to get the correct background because even though I was doing background-size: cover It would show a blurry-ish image that was not the whole image, it was cut-off, and idk why. So I went with this. Then I spent some trouble with centring yahtzee, then the 2 boxes I needed to be perfect. So yeah, I deeply apologize fraud squad. Also here’s some pictures of the first wallpapers I tried to put.
I’MMMM BAAACKKK!!! After some slight demoralization in the fact I had to do a lot of things in a little amount of time, hearing stardance get extended revived me, as I now have more time, and will do a lot more things. It starts with Yahtzee. I did the rules, and now Im going to start getting into the hard stuff
I genuinely believe that Fraud Squad gonna reduce my hours on this project 😭 Heres Why: I spend an hour creating dice . While I know how to create dice under NORMAL circumstance (create a box and put pips in them), these are not normal circumstances, because I will need to manipulate their values. The rightmost die might be a 3 this turn, but in a minute it could become a 5, and I need to adjust for that. Therefore, I need CSS, and if you’ve seen my ChessOS project, you know that CSS and me are no bueno for the most part. Dont understand it at all for the most part, and definitely not incorporating multiple CSS into one element. 1st Attempt I tried styling the base box, a dice pip and putting multiple pips in a dice, I got this far: .dice{stuff} .dicepip{stuff} .dice1{ .dice .dicepip} Shocker, CSS doesn’t work that way 2nd Attempt On the main div that’ll display dice, I need to just put multiple classes in, and create a second div that contains the dicepip div <div class="dice dice1 dice2> <div class="dicepip"> That worked for die #1, so I thought, lets do it for the other 6, cus monkey see monkey do . That resulted in one pip per dice in one of the correct spots, because as Gemini told me, It can only include 1 pip. So theres some time over there 3rd Attempt So AI directed me over to multiple background images, with positioning, with code radial-gradiant... then background-positioning and I only got a singular centre pip for all dice no matter if the code had more than 1 (image to show this) The answer to this one is that radial-gradient naturally wants to take up all the space so only one can fit in. 4th Attempt radial-gradient(circle at 15% 15%, black 12px, transparent 13px), For all the pips in die, and now it works!!! works, and I can manipulate which dies get which value, which will be hopefully smooth sailing in that aspect
Guys, I’m genuinely getting better at this I created the function that can roll the dice and create random values. Little bit help from W3 school on creating the random number, but I got the comparison right and making sure that the correct dice value is added. Very little debugging. That being said, its SUPER repetitive code and copy+paste gonna come in clutch, so theres definitely going to be a more optimized way, but the lion does not concern himself with optimizations while working on the cloud Anyway, gotta make sure you can keep dice rolls that you like.
YES IT’S WORKING!!! You can now keep a dice value that you like, and it was surprisingly simple to make if im being honest. First, I added the toggle to show when the die is locked or not (took a bit of time to position properly). Next, I gave an id, and created a true false value to track, and when you click the die, it toggles it on/off. and then I went into the functions that handle the dice roll, and only allow it when the lock is off. Good job, me
So I comitted to a sticky streak so I gotta do stuff everyday, and today was lowkey tiring so I didnt do much. Just added some technicalities and made it look a little better cus when the rules open on top the dice it looks terrible so I just made the dice disappear when rules are open, and made sure you can’t roll more than 3 times.
So I’m starting the table of the scoring, and I’m doing that through separate divs and css. Now you might wonder, why dont you use <table> <tr> <td></td></tr></table> ? and thats a completely valid question your answer: I dont want to I find it much easier to copy paste divs with the same border box class and a <p> and do that. I am not you Great, we got that out of the way. Overall light work, looks kinda weird right now but I think when I add the other stuff its gonna look good. also I fixed a thing from last time, in which when you get the roll warning or the how to play, it would keep the dice lock on, and I need that display off, but when you come back, you need it back on. That took some time as well
It’s slowly coming to fruition I added the rest of the tables for scoring and it’s looking good now, less janky when just the left side was there But now I get to the hard part I need to store the dice’s values in an array, and then call on specific values based on what scoring category. While that’s easy for 1s-6s, and chance, it gets harder for more specialized sections. Also I need to make sure you cant score for the same thing. and then add all the values up and make sure you can actually get a bonus…. All in all… its gonna be a learning experience (hopefully a fun one)
Gotta do something everyday, and today was busy so not much. Before I start the array of doom and despair, I first needed to assign variables to all sections of the table, and then put that over into the javascript. How Fun. So that means 34 variable names I gotta put in the HTML and in the JavaScript. So after all that, I go to make sure my website still runs. Ladies and Gentlemen… The close button on how to play no longer works. So now I gotta look through all variable names to see my error. And it was because SixeScore was supposed to be SixScore, and GrandScore was actually GrandTotalScore. So 2 fixes, not bad, but it still doesnt work. Then the big GPT tells me that I have id 3Kind and 4Kind, instead of ThreeKind and FourKind, which I did change for the scores but not for the original. I changed because javadoesnt like a number as the leading string for a variable so I changed it, but then forgot to change it on the other end of the line. So overall, very fun guys trust. Heres a video of what my UI does so far:
Man………………… I’ve got a LOT to learn. So I started out with a filter function, just to arrange the dice rolls from greatest to largest, then started an if statement were if any equal 1, then thats the score, and put it into the innerhtml. If only it were that easy right. I dont think a single line of code was right there . I didn’t put the filter function outside of it, so it wasnt even called upon, and basically nothing was right. So I decided to start with basics, if I click this button will it show a number. It does, So then if this die value is 1, add 1 to the tally, and then display the tally score. That doesnt work. It was because the die’s value is locked in a function, so it needs to exist in the main script. easy fix, and now it works . But the code is very simple, it’ll work for 1s-6s, which is nice, but I want a deeper code understanding. I’ll have to use an array, and index it for short/long straight. I’ll have to make sure you can only click it once, verify if your score will be 0, and reset dice rolls to make sure you can roll again. But thats a problem for another day. So adios
I am continously amazed at how much more work is actually showing itself up rn. I planned to start the 2s, 3s, 4s, 5s, 6s, but I just spent today with rules. I wanted to commit on pop-ups removing everything except the warning so it looks nice, but closing a bunch of windows each time is tedious. Lucky me.. I remembered functions exist!!!! so now I have a closebunch and openbunch functions that close or open a bunch of windows depending on what I want it to do. so nice. and then theres a bunch of things you can do, so instead of each being its own warning, I bunched that into one with just a list of things you cant do should you try, and I called that one function NoNo() I also reset the dice after you score yourself, can’t lock the dice when they’re reset and made sure you can only score yourself in proper conditions, and cant rescore So no bugs now, which is great. Heres some good progress (longer video, more to show off). But hey, I also figured out that this qualifies as making a game in a non-game engine, so if I have 10 hours from now till then I get it so got my work cut out for me.
Perhaps a day with more noticable progress. I finished up the scoring for the upper section, and added the function to check if you get the bonus or not, and making sure that you’ve scored everything before deserving it or not. So a bunch of copy pasting the same code for the 2s-6s, and then some writing for the Bonus function, tomorrow will probably be less work, just confirming that is you’re scoring a 0 you know you’re doing it.
So maybe less visual progres today: I just made sure that if the score is 0, then you gotta confirm that you’re scoring a zero. I’m getting better at recognizing that when I have a lot of repeting code, to start using functions But sadly not for this, because I though that itll do the function, and then just record a zero without waiting for my input, so I added event listeners everywhere, and it worked so I’m not complaining. I caught a bug that if you hit no multiple times, then if you hit yes it logs multiple 0s, but the fix was ___Score.innerhtml = Score instead of ___Score.innerhtml += Score Then there was an issue where the confirmation window vertically stacked Yes and no, which is not what I wanted, but I forgot to add Position: absolute And lastly theres a bug where if you click multiple sections that can be 0, when you eventually click yes on one of them, it logs 0 to all I clicked. But I aint fixing that today, thats a tomorrow problem, so see you all tomorrow.
So I fixed the previous bug, by making creating a variable that each section has a specific number, so the score 0 can only be applied when the section number matches the variables number at that time. I then also added scoring for chance and yahtzee (which dont require an array) That was pretty simple, just adding em all up for chance, and making sure they all equal each other for yahtzee, which took a long time becuase I limited myself to only 3 rolls Then I had the bright idea to just change the amount of rolls im allowed so I make sure it works. It does.
Some complicated work done and learnt some new stuff BY MYSELF!!! So basically, a long straight is all 5 in a row, like 1,2,3,4,5, or 2,3,4,5,6, and its going to be an if statement of doom and despair if I do it like that. SO, I put them in an array, and sort them from least to greatest, so my long straight code looks like this if (Dice[0] + 1 == Dice[1] && Dice[1] + 1 == Dice[2] && Dice[2] + 1 == Dice[3] && Dice[3] + 1 == Dice[4]) and I also remembed to make Dice a global value, so it doesnt exist only in that function, which is what I didnt realize a couple days ago, which is why it was better to start from simple to harder. and I figured this out ALL BY MYSELF, NO AI, JUST PURE LOGIC now for small straight, it was a bit more complicated, cus its only 4 in a row, so there can be duplicates, so theres 4 situtaions in which it can work. I got the first 2 light work, then I realized later I needed the other 2. Now here is where AI got involved, cus Im thinking if I do if (situation1) else if (situation 2) else if (situation 3 ) else if (situation 4) else and repeat the same instructions 4 times, if it can be condensed, and then Gemini told me about if ((situation 1) || (situation2) || (situation3) || (situation4)) and then only one set of instructions. Nice to know that. Happy with my progress here.
Almost Done (for the basic version) So I added the things for 3 of a kind, 4 of a kind, and Full house, which is all of them!!! I did a quick optimization because for chance, 3 of a kind, and 4 of a kind, the score is all the dice added. So I did a quick adding function, but then for some reason it wouldn’t work, even though the variable was global, but apparantly i needed to store it, even though I thought I did, so the fix was score = adding() But thats kinda it, everything can get scored now, so I need to make sure it can all get added up to the Lower score, then the grand total, make sure new game works, and I’ll touch up the intro, make it better.
Getting there. So I added the grand total mechanism, then also decided to pop up a window with you’re score and how good of a score that is. And then theres some bugs I encountered, so some general fixes and making sure everything works smoothly. I’m gonna work on new game now, and then the intro
Worked on the New Game button. Just a monolith of a hundred different verifiers getting reset to false, and a bunch of .innerhtml = "" Also, fun quirk in my code I figured when I tried to copy all the verifiers. My OneChecker variable was actually OneChekcer, so the ck was a kc, so when I try to copy paste and all of the other checkers arent recognized, I quickly figured it out.
Ok, so now I am done with the basic version, everything should work, touched up the intro stuff, and added one page for how to play and rules, and another for scoring. I also topped up an issue I just had with myself that you can open multiple tabs like how to play and New game that overlay each other, so I made sure that doesnt happen. Also when touching up the intro, I wanted Next page and Close next to each other, but then they didnt have any bottom margin, so I used bottom: 16px that applied only to the visible box and not the whole scrollable thing, so then I had to create a div with display: flex, and do it there, which worked out, but still annoying nonetheless when im just about done. I’ll add a version where you can do 2 player, and then I’ll ship!
Ughhh, this is more complicated than I thought. So initially my codespace was buggin out cus stuff wouldnt load, took me some time to make the second chart for scoring, and positioning the circles and Multi/Single player circles to show modes. And now Ive though of how much of a headache this is gonna be to make. But we’ll persevere
So I added started Scoring if there is a 2 player. I spent some time trying to find out the best way to tackle it while adding the least amount as possible, and I believe I did. while It will be a while before I bug test the whole thing, theres 2 situations in which you score the first column, so thats an if ((situation1)||(situation2)){scoring1} and then an else{scoring2} for the second column, so I think it works out nice. So i think it should become easier for the rest. Also a snippet of code if you’re interested
So some more scoring for the 2s through 6s in multiplayer. Pretty straightforward I though, until during recording I encountered some bugs that I have no clue whats up with that, but Im not touching them today. dont have the energy for that.
I am going to start bashing my head in the wall cus I have an UNBELIEVABLE AMOUNT OF BUGS So I finished the scoring for the lower section in multiplayer, which is fine, and compiled lower score but now the bugs start: Grand Total won’t show - I spent like 20 minutes figuring out why because variable names matched in both html and js, but then I look a little bit more closely and then instead of GrandTotalScore2 = document.querySelector("#GrandTotalScore2) its GrandTotalScore = document.querySelector("#GrandScore2) Im going to tweak. Sometimes if you record a zero for player 1, it also feels the need to give a 0 to player 2. This is because of too many event listeners nesting, and they never really go away (a previous issue that was fixed with a current checker) so a quick solution for that, or so I thought, it is not the case right now, because I added an if statement that actually means nothing, because If you decline a 0, and then score a 0 for the other players, both columns get a 0. because of… 🥁 I nested the event listeners too much!! and I am NOT rewriting all the code because thats too much and im in too deep. So I think I now the solution right now, because it resets the dice count each time, so I just need to make sure if the dice is reset you cant do it again, but I’m too tired for that. The video below shows the 2nd/3rd bugin effect, and Im not filming something new cus im too tired. The second video shows the 1st bug. Enjoy, sorry for the long devlog but I barely kept sticky streak past couple days so basically no time to devlog.
NO BUGGSS!!! So I spent a grueling amount of time testing and fixing, but the bug fix was like I expected. I know that once a 0 is recorded, it resets the rollcounter to 0, so I made sure you can only add a 0 if rollcounter is greater than 0. That way, the event listerns can run multiple times, but only the first one can do something. After that, I spent a loooong time in testing And I just caught some 3 errors in my code that wasnt too bad. Then I spent some more time testing, the first time where Player 2 tests the upper section on how it handles 0s while Player 2 tests Lower section, and the second game was vice versa, Player 2 test upper section while Player 1 tests lower section. All in all, happy with my work. Tomorrow I make sure it resets everything when you switch between modes, and Monday/Tuesday can be ReadMe, so I can ship and finish Sticky Streak!!!
WOHOO WE DONEE!!! I made sure that if you switch between modes it resets everything. Had some issues because I stored the 2nd players scores in something that was also an html element, so it didnt work out originally, but a quick fix in adding variables to store score and changing scoring mechanisms was quick and efficient. Then a copius amount of testing to see for bugs. You’ll see one in the video below where it displays who won twice, but thats my fault cus in my code it waits three seconds before running, so if player 2 finishes within 3 seconds of player 1, itll run twice, so quick fix there. Then more testing and I havent encountered bugs in a while so I’m calling it a wrap! Tomorrow and Tuesday is ReadMe work, and Tuesday we shipping....
|
1792442831.1730192
|
1793047631.1730192
|
|
28495
|
Projects/Devlog Site by @ritvikgrandhi | Stardance
|
ritvikgrandhi
|
2
|
17.29
|
32
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T22:14:18Z", "hours": 9.0, "multiplier": 3.54, "payout": 32, "blessing": "neutral", "text": "##Ship 2! Hello, reviewers! This is an updated, more useful version of my portfolio website that can now log projects and devlogs, similar to Stardance! I made this after realizing that after Stardance is over, I’ll have nowhere to log my projects and the progress I make on them! To keep a good habit going and log my projects for everyone to see, I decided to edit this portfolio site into a dedicated server for all of my projects, after realizing that I already have a good portfolio that I constantly edit at school. This ship does not have full functionality: it can save any number of projects and devlogs, but once you reload, they are all gone. I can safely say that it was a pain to create a new project and devlog for testing, and now you get to do it too! As you might see in my last devlog, I’m currently shipping this so that everyone can see the project and devlog adding functionality now, because later I’ll add an admin login page so that I can only add my projects, while others who access the website can see them but not edit them. Anyway, that’s all, and have fun!", "repo": "https://github.com/ritvikgrandhi-hue/stardancechallengewebsite", "demo": "https://ritvikgrandhi-hue.github.io/stardancechallengewebsite/"}, {"ship_num": 2, "ts": "2026-08-09T17:10:42Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hello, here is my portfolio website, which will eventually contain information about me and my life. So far, I have done the minimum requirements for this beginner project, which is why I am shipping it. However, I am pretty excited and happy about how it currently looks. What I did find challenging is that I haven’t used html and css in a while, which meant I had to relearn almost everything while juggling extracurriculars and school events. This personal project will grow as I achieve more things, but for now, the index page is the only truly functional page, which has more than 3 sections. I hope everyone will be able to see my passion and encourage me to continue into the future!", "repo": "https://github.com/ritvikgrandhi-hue/stardancechallengewebsite", "demo": "https://ritvikgrandhi-hue.github.io/stardancechallengewebsite/"}]...
|
[{"post_id": 80870, "ts": "202 [{"post_id": 80870, "ts": "2026-10-19T03:42:06Z", "hours": 2.2892, "text": "Working on the Backend: Literally no functionality has changed yet, this is just me trying to configure node.js to do everything 😭 . Anyway, sorry for not updating in a while, I promise I’ll get back to work on it soon!"}, {"post_id": 64478, "ts": "2026-09-08T22:06:46Z", "hours": 1.865, "text": "Devlog 5: 9/8/26 Nothing much, I managed to get the node.js server running and got the css and html to work, but its nowhere near done. Anyway, for now, I’m going to ship this project so that reviewers can actually see and try to use the add project and add devlog functions. Stay tuned!"}, {"post_id": 63315, "ts": "2026-09-07T02:07:35Z", "hours": 3.3178, "text": "Devlog: 9/6/2026 I made SO much progress!! Changes: Can now create devlogs within projects Can edit those devlogs Can add multiple images and videos within the devlogs When you click on the images, they open in a new window above the page New Navbar and logo design, courtesy of this video: https://www.youtube.com/watch?v=uTPO6fKtBvM Can delete devlogs Devlogs gain certain ids based on the date and time, so each devlog has a unique id to allow for edits and deletions For the JavaScript, the basic functionality was carried over from the notes app on my NINJAGO WEBOS, but I did need AI to educate me on how to implement new functions. Also, the CSS and HTML were written mostly by me with the help of tutorials."}, {"post_id": 60407, "ts": "2026-09-02T18:24:33Z", "hours": 2.5461, "text": "Woohoo, some functionality! Ok, so far I haven’t differentiated a backend and frontend for the projects tab, but for now you can add projects with an image, title, and summary, and they’ll appear as projects on the projects tab. Also, when you click on them, it brings you to a separate viewing tab to see all about the project, although I haven’t started working on the part where you can add devlogs. Also, adding projects isn’t permanent, as when I reload the tab, they all disappear (since I want it to save to the website for everyone to see, I have to implement a Node.js backend, which I haven’t learned about yet). I also slightly changed the theme into dark mode and made the buttons to enter the project look futuristic. They are NOT AI; I made them with the help of this video: ( https://www.youtube.com/watch?v=a1NVen8SaqE ), but it does look a bit different for reasons unknown. Anyway, stay tuned!"}, {"post_id": 59970, "ts": "2026-09-02T01:30:45Z", "hours": 1.4286, "text": "NEW DESIGN: For those that don’t want to read: I’m tearing down most of the site to make it a dedicated project site. After realizing that I already have most of my accomplishments and extracurriculars on a different project that I’m making in school, I understood that maintaining a second site would be kind of useless. So, in an attempt to salvage my efforts and make it something worth using, I’m going to take my Javascript knowledge from the NINJAGO OS project I’m also currently making to create a project and devlog site, similar to stardance, as I want to have a place to store all of my hobby projects. However, I don’t want anyone adding information to my site but me, so i’m biting the bullet and learning to differentiate a frontend and backend (with minor AI help), while salvaging the about page of the already existing porfolio. This way, when people online stumble upon it (as i’ll use the grant I got for purchasing a website domain), they’ll know about me first before moving on to my projects. That’s pretty much it! Looking forward to it!"}, {"post_id": 43725, "ts": "2026-08-09T04:13:32Z", "hours": 5.9075, "text": "This project isn’t just a portfolio, but an entrance into my world. Hey everyone, welcome to my portfolio website! After exams up until the beginning of August, I’ve finally found time to begin developing a website. First, this website only has one functioning page as of yet, which is the index page. I admit, at first I did try vibecoding(using AI), to see what it would do and if I could understand and learn from, but it turned out to be utterly useless in that regard, and so I’ve built it up again mostly from scratch to get to this point, although some traces of AI remain in the other pages, which I will delete remove. However, I am proud of how far it has gotten since I’ve imagined how it would be like. My plan for this website is to include everything I’ve accomplished or done here so people can learn who I am as a person. To do this, and to separate it from other portfolios, I believe I will eventually put in a blog of projects I’ve done to further my career path, as well as write and teach others on certain topics. However, this will take some time, so stay tuned! Up next is the Extracurriculars and Skills pages to fix."}]...
|
Title: Projects/Devlog Site by @ritvikgrandhi | St Title: Projects/Devlog Site by @ritvikgrandhi | Stardance
Devlogs:
This project isn’t just a portfolio, but an entrance into my world. Hey everyone, welcome to my portfolio website! After exams up until the beginning of August, I’ve finally found time to begin developing a website. First, this website only has one functioning page as of yet, which is the index page. I admit, at first I did try vibecoding(using AI), to see what it would do and if I could understand and learn from, but it turned out to be utterly useless in that regard, and so I’ve built it up again mostly from scratch to get to this point, although some traces of AI remain in the other pages, which I will delete remove. However, I am proud of how far it has gotten since I’ve imagined how it would be like. My plan for this website is to include everything I’ve accomplished or done here so people can learn who I am as a person. To do this, and to separate it from other portfolios, I believe I will eventually put in a blog of projects I’ve done to further my career path, as well as write and teach others on certain topics. However, this will take some time, so stay tuned! Up next is the Extracurriculars and Skills pages to fix.
NEW DESIGN: For those that don’t want to read: I’m tearing down most of the site to make it a dedicated project site. After realizing that I already have most of my accomplishments and extracurriculars on a different project that I’m making in school, I understood that maintaining a second site would be kind of useless. So, in an attempt to salvage my efforts and make it something worth using, I’m going to take my Javascript knowledge from the NINJAGO OS project I’m also currently making to create a project and devlog site, similar to stardance, as I want to have a place to store all of my hobby projects. However, I don’t want anyone adding information to my site but me, so i’m biting the bullet and learning to differentiate a frontend and backend (with minor AI help), while salvaging the about page of the already existing porfolio. This way, when people online stumble upon it (as i’ll use the grant I got for purchasing a website domain), they’ll know about me first before moving on to my projects. That’s pretty much it! Looking forward to it!
Woohoo, some functionality! Ok, so far I haven’t differentiated a backend and frontend for the projects tab, but for now you can add projects with an image, title, and summary, and they’ll appear as projects on the projects tab. Also, when you click on them, it brings you to a separate viewing tab to see all about the project, although I haven’t started working on the part where you can add devlogs. Also, adding projects isn’t permanent, as when I reload the tab, they all disappear (since I want it to save to the website for everyone to see, I have to implement a Node.js backend, which I haven’t learned about yet). I also slightly changed the theme into dark mode and made the buttons to enter the project look futuristic. They are NOT AI; I made them with the help of this video: ( https://www.youtube.com/watch?v=a1NVen8SaqE ), but it does look a bit different for reasons unknown. Anyway, stay tuned!
Devlog: 9/6/2026 I made SO much progress!! Changes: Can now create devlogs within projects Can edit those devlogs Can add multiple images and videos within the devlogs When you click on the images, they open in a new window above the page New Navbar and logo design, courtesy of this video: https://www.youtube.com/watch?v=uTPO6fKtBvM Can delete devlogs Devlogs gain certain ids based on the date and time, so each devlog has a unique id to allow for edits and deletions For the JavaScript, the basic functionality was carried over from the notes app on my NINJAGO WEBOS, but I did need AI to educate me on how to implement new functions. Also, the CSS and HTML were written mostly by me with the help of tutorials.
Devlog 5: 9/8/26 Nothing much, I managed to get the node.js server running and got the css and html to work, but its nowhere near done. Anyway, for now, I’m going to ship this project so that reviewers can actually see and try to use the add project and add devlog functions. Stay tuned!
Working on the Backend: Literally no functionality has changed yet, this is just me trying to configure node.js to do everything 😭 . Anyway, sorry for not updating in a while, I promise I’ll get back to work on it soon!
Ships:
Hello, here is my portfolio website, which will eventually contain information about me and my life. So far, I have done the minimum requirements for this beginner project, which is why I am shipping it. However, I am pretty excited and happy about how it currently looks. What I did find challenging is that I haven’t used html and css in a while, which meant I had to relearn almost everything while juggling extracurriculars and school events. This personal project will grow as I achieve more things, but for now, the index page is the only truly functional page, which has more than 3 sections. I hope everyone will be able to see my passion and encourage me to continue into the future!
##Ship 2! Hello, reviewers! This is an updated, more useful version of my portfolio website that can now log projects and devlogs, similar to Stardance! I made this after realizing that after Stardance is over, I’ll have nowhere to log my projects and the progress I make on them! To keep a good habit going and log my projects for everyone to see, I decided to edit this portfolio site into a dedicated server for all of my projects, after realizing that I already have a good portfolio that I constantly edit at school. This ship does not have full functionality: it can save any number of projects and devlogs, but once you reload, they are all gone. I can safely say that it was a pain to create a new project and devlog for testing, and now you get to do it too! As you might see in my last devlog, I’m currently shipping this so that everyone can see the project and devlog adding functionality now, because later I’ll add an admin login page so that I can only add my projects, while others who access the website can see them but not edit them. Anyway, that’s all, and have fun!...
|
1792849671.740578
|
1792936071.740578
|
|
58729
|
Custom Alarm Clock by @chriszamora9876 | Stardance
|
chriszamora9876
|
0
|
13.04
|
0
|
[]
|
[{"post_id": 80871, "ts": "202 [{"post_id": 80871, "ts": "2026-10-19T03:42:55Z", "hours": 9.135, "text": "Some structural issues after I realized that I placed the mounting holes too far from the edges of the PCB, but this is the basic foundation complete. Went for a NYC on top afterwards :)"}, {"post_id": 73455, "ts": "2026-09-25T04:01:40Z", "hours": 3.9014, "text": "Just finished my pcb design (first time ever). I changed the location of the parts to be different from he guideline"}]...
|
Title: Custom Alarm Clock by @chriszamora9876 | St Title: Custom Alarm Clock by @chriszamora9876 | Stardance
Devlogs:
Just finished my pcb design (first time ever). I changed the location of the parts to be different from he guideline
Some structural issues after I realized that I placed the mounting holes too far from the edges of the PCB, but this is the basic foundation complete. Went for a NYC on top afterwards :)...
|
1792767082.461462
|
1793371882.461462
|
|
29326
|
X-fight by @Eshan | Stardance
|
Eshan
|
0
|
100.3
|
0
|
[]
|
[{"post_id": 80872, "ts": "202 [{"post_id": 80872, "ts": "2026-10-19T03:45:33Z", "hours": 10.0886, "text": "Devlog 10 Hi, everybody! In my previous devlog, I mentioned that this would be my last devlog. But unfortunately, while integrating the features, I faced some unexpected issues related to match results, logic, and friendly match integration. 1. Working on the UI Most of my time went into completing the pending UI work. After that, I started fixing logical errors related to friendly matches and result uploading. 2. The Friendly Match Integration Problem Most of my existing match logic was designed for tournaments, which have an event ID. But friendly matches don’t belong to any tournament, so they don’t have an event ID. To solve this, I made the event ID optional in the match room function. def match_room ( request , match_room_id , event_id = None ): I also created separate URL patterns for tournament and friendly matches and used conditional logic to handle them differently. if not match . friendly_match_room : # Tournament logic pass else : # Friendly match logic pass 3. Fixing the Match Result Processing System My website uses JSON to pass match and tournament details. Friendly matches caused errors because they don’t have tournament information. So, I added conditional logic to set tournament-related values to None for friendly matches. if not match . friendly_match_room : tournament_name = match . tournament . name tournament_id = match . tournament . id winner_team = match . winner_team else : tournament_name = None tournament_id = None winner_team = None I then passed these variables into the JSON response. 4. Implementing the Loot Transfer Logic I also worked on the loot system for friendly matches. Loot refers to the coins players contribute to the match. For example, if four players contribute 100 coins each, the total loot pool becomes 400 coins, which the winner receives. I implemented this logic in the views so that loot is transferred only after a valid match result is determined. If a match is cancelled or ends without a valid result, no coins are transferred. So these are things I have done in this time period and so next will be last devlog I hope"}, {"post_id": 76159, "ts": "2026-10-02T15:17:51Z", "hours": 9.6864, "text": "Devlog-9 Hi everyone in my previous develog, I mentioned that this would probably be my last develog . However, after working on the project for several more hours, there are still a few UI improvements left to complete. So, this is approximately the final develog. The next update will definitely be the last one, as only a few UI changes remain. Almost all the major features and functionality are now completed. What I Worked On After the Previous Update In the previous update, I mentioned that I had integrated voice and video calling using ZEGOCLOUD. At that point, the calling functionality was working, but the UI was still based around the initial implementation. So, this time, I focused mainly on creating and integrating a custom calling UI of x-fight the black, red theme with ZEGOCLOUD. Major Update Revealing The Coin Transfer System One of the major new features I worked on is the coin system. The first part of this system is coin transfer between Game Mates. Users can now transfer their points to another game mate. The system includes the required forms, validation, calculations, through Django’s database transaction system. This ensures that the transfer is handled safely and consistently rather than simply changing the balance directly. ##Coin Transfer History I also implemented a Coin Transfer History feature. Users can now see their previous transfers and information such as: -Who they transferred points to -How many points were transferred -The transfer record -When the transfer happened This gives users a proper record of their coin activity. Tournament Entry Fees Another feature I integrated is tournament entry fees. Tournament creators can now choose whether a tournament has an entry fee or not. If a tournament has an entry fee, the required points are deducted when the player or team joins the tournament. The points are then handled as part of the tournament system, and the winner can receive the applicable reward mostly will be coins. Now after this feature only free tournaments issue is solved only as free competitions. Stats and Ranking System Finally, I have been working on connecting the points system with a new stats (ranking system). The idea is that players can use their coins to build their stats by buying it. These stats will then contribute to their position on the X-fight leaderboard. This gives the points system a purpose inside the X-fight ecosystem rather than making them simply numbers displayed on a profile. These are main feature I have worked in this time period"}, {"post_id": 71236, "ts": "2026-09-20T14:36:01Z", "hours": 9.8744, "text": "Devlog 8: Hey everyone! First of all, I’m sorry. In my last devlog, I said that it would be my final one before shipping the project. But unfortunately, I still had a few features left to complete, so I couldn’t finish everything as planned. So, most probably, the next devlog will be my last one, and after that, I’ll be shipping the project. Let me explain what happened. In my previous devlog, I mentioned that I was planning to integrate ZeeCloud and add voice and video calling to the chat application. My plan was to include voice calls, video calls, group voice calls, and group video calls. I spent almost 10 hours working on this integration. And honestly, I managed to get everything working. The calling features were functional, but I faced one major issue: I couldn’t properly integrate my own UI with the calling system. I tried different approaches and followed several tutorials, but I still couldn’t get the UI working the way I wanted. So, to be honest, I decided to delete all the code related to the calling features and start fresh. I felt that starting from scratch would be a better option than continuing with an approach that wasn’t working for me. That took up most of my time. With the remaining time, I worked on a few other features. The main feature I added was file sharing in the chat application. Until now, users couldn’t upload files in the chat. So, I integrated file uploading, and now users can send GIFs, photos, files, and other attachments. I also added an animation for the upload feature to make the experience a little smoother and more interactive. So, that’s pretty much what I’ve worked on this time. I couldn’t finish everything I had planned, but I still managed to make some progress. Hopefully, the next devlog will actually be the final one, and I’ll finally be shipping the project."}, {"post_id": 64835, "ts": "2026-09-09T15:01:36Z", "hours": 9.8286, "text": "Devlog - 7 Hi I thought this would be the last devlog of this project I thought this project will be finalized but unfortunately, it didn’t finish. so, in this time, I planned to do like there are some features which are incomplete like in notification, game scoreboard analyzing model, about page etc. so these are the changes I made. notification panel so, in this I have made in previous I just created it simply like a panel with message display but now i have added these features all clear button when a game mate request is sent if the action buttons are clicked then the notification will be cleared -when a game mate sends a chat message or through group chat then the notification will be displayed in this layout also, it has changes like it was placed in the navbar and when it is clicked a box will appear near to that were it display all the notification but due to responsive issue, I changed it into a centralized popup screen and a close button to close that. layout changes Actually, I have some design works to do so I have done that. some page mainly forms lie team register tournament register, so I have applied themes of the whole site so next I did was not in my plan list, but when I am testing it I notice a drawback like when a user creates a team, they cannot modify it, so I have added that feature, so these are that features overview it just like in normal dashboard displaying No. of tournaments, Mathes and members displaying them Team captain this idea sparkled when I was playing football game so in this they who can schedule meetings give directions through team chat room Election system this was basically an election for team captain everyone has the right to vote there and who has more vote they will be the team captain instead of manual update . meeting room this a place where the team captian can schedule team meeting and a conference window will be opened they can do a face-to-face video call .so here I need to tell you something here Zee cloud helped like instead of writing a huge code of webrtc,django channel it helps to do integrated video conference through Api and it is very useful when we are starting Chatroom a place for team members can chat without creating a chatgroup next I added some more features in Matchroom these are the features in Matchroom ##more game models I have added like game model option for other it is a general for all games Ready or Not Ready this was the old same feature, but I have integrated the Django channels and web sockets count down here if every player clicks the ready button the 12 sec countdowns will be starting and after that they cannot press the no ready button and the match duration will be done then they have to end it and upload the photo by the persons from two teams and then we will cross check it and it is matched then the points will be credited otherwise it will be rejected and the match may reconduct it will be based on the tournament admins like if they want to conduct then they can otherwise the match will be abandoned these are the things I have done I think next will be the last devlog"}, {"post_id": 56747, "ts": "2026-08-28T17:02:28Z", "hours": 9.4822, "text": "Develog 6 Hi everybody it’s been a while. I was on break for some days due to my exams. so up to this time I was mainly focused on the design of the website here in many parts I have completely changed the layout in some places, and I came to a final color theme black red white these are the main color theme up to this time in dashboard the sidebar was just for a show it doesn’t work but now I made it functional and these are the options dashboard – it just shows a summary like the rank on the leaderboard, total tournaments joined, etc. tournaments matches game mates – it displays all the game mates and options to block, remove chats – display all the chats like to chat with the game mates and group chats logout in chat there is like i implemented a minimal clean look and it also has a sidebar whith these options display all chats search bar filter button – All, Game mates, Group Chats in right side I has like normal like chat and when a group invite is sent then in a different style in sender the request will be sent these are major layout changes in all other I just charge the color theme."}, {"post_id": 46358, "ts": "2026-08-13T15:07:00Z", "hours": 8.5808, "text": "Develog -5 hi everybody i have now completed the chat feature in my website. in this there are three types like group chat, privet chat and announcement chat. Group chat in this group chat it’s like normal chat like here you can make groups with the game mates only I have done making this chat system here the flow is like in the the inter face there is a button called create chatgroup if that we click then it will ask for the name, we should enter the name then the group will be created and after that it will take to the chat interface in that we have button called info were all the group members are listed and who re the admins and the group name there we have button called invite when that clicked then ta popup will be coming and all the game mates will be displayed along with send button when the send button is clicked then a special type message will send I call that as a group invite request and if they press the join then they will be added as a member. the group admin has the access to delete or make a member as admin o remove from admin position and users have option to let the group Privet Chat in this privet chat if like to chat with the game mates. the workflow is like there will be like in the chat interface all the game mates are listed if we click on them then the chatting interface will be opened where we can chat as normal and there is a button indicate online or not Announcement Chat here it like all the tournament owners can create a chat room to announce the news of their tournaments it will be admin message only chat players cannot send any messages if any doubt is there then a chatroom will also open there, they can ask doubt. chat interface the chat interface like I has designed like in dashboard there will be a button called enter the community like all the chat will be listed only one there. and it has button call return to base camp if that press then it will be returned to the dashboard. while making this like this is the first time I am working with WebSocket’s and Django channels I got many errors so that time I have mainly used the stack overflow and after I got the base of Django channels the first project to try that is this project the uploaded photo is the chat interface and I am not that good Ui design building I find a similar theme in internet I don’t know this is good anyone has suggestion please put in comments"}, {"post_id": 42666, "ts": "2026-08-07T14:45:52Z", "hours": 11.1, "text": "Develog-4 Up to this time as I said in previous develog that planning to integrate a XP point addition no I have done that. if a player one a game that player now will get a 50XP point. but I am planning like for some team game to split the total xp-points to every team member. After that I moved to make the chatting system here up to this time I have done to create a public chatroom were everyone can join and chat but after the creation of this public chat I will be creating a two-type chatroom one is 1v1 chat and group chat and I am doing this with WebSocket’s and Django channels and I have created a friend request method also were every player dashboard has a notification bar and every players can send a friend request to every other players and instead of this normal name called as friend request I named it as game-mate request and every players can chat with their game mate and they can create groups with their game mate and they can reject the request also and if they try to send request multiple times it won’t work it will directly redirect to dashboard and the player search screen will display with the z index in dashboard and I have temporary added this design tike that chat interface al to make the functionalities"}, {"post_id": 39320, "ts": "2026-08-02T06:55:42Z", "hours": 10.4797, "text": "Develog - 3 This week I have mainly worked on creating Ai for the updating scoreboard with just a screen shot of the game scoreboard and up to this time I have added only for e-football and I am planning to add specific for some games and one for general. in this journey I tried mainly to create the AI myself so I researched how to do then I came to the idea of like it extract text from the image and I have used these three text excretion library called Easyocr, Pyteseract and Paddleocr but this I tried but here the main problem I faced is that they just extract the text but some time that will not able to I identify some small text and from that I cannot set who is the winner then I came to an idea to create an LLM using Pytorch with these neural network but when I started to do I faced a problem that my laptop is a office laptop so I cannot make such kind of LLM by my own because this lap cannot handle it. so I decided to use the google ai vision tool so now know from the beginning but I just want to create my own but due to this problems I use google ai vision it good by using a specific model I got 500 request per day(RPD) and now I have integrated that withe frontend like when they upload the scoreboard it will say analyzing the match after the Gemini response and save data in Json file in a format with some extra details like which match came the result came then only it will redirect to the main page and now I need to add the scoreboard, I am planning to add XP-points and some special extraction of score for some specific game"}, {"post_id": 30497, "ts": "2026-07-18T03:47:21Z", "hours": 9.5078, "text": "Devlog #2 This week, I worked mainly on improving the tournament flow and adding several new features to make the experience smoother for players. The first thing I completed was the User Dashboard and the Tournament Settings Dashboard. I also redesigned their UI to make them cleaner and easier to use. I then updated the tournament listing page so that it only shows tournaments that the user has not joined yet. This keeps the page organized and avoids showing tournaments that are already in the player’s list. On the User Dashboard, players can now see every tournament they have joined. Clicking on any of them opens the Tournament Dashboard, where they can view all the matches scheduled for that tournament. In the Tournament Dashboard, there is a Scheduled Match button that takes users to the Match Creation page. The match list has also been filtered so that only upcoming and currently active matches are displayed. Each match has an Enter button. When players enter the Match Room, they can see all the members of both teams along with their current status. A Ready button is available for every player. Once a player clicks it, their status changes from Waiting to Ready, allowing everyone to know who is prepared for the match.When every player is marked as Ready, a 15-second countdown starts automatically. During the first few seconds, players can still change their status back to Not Ready if needed. However, once the countdown reaches 7 seconds, the Ready status is locked, preventing anyone from switching back. This helps avoid last-second cancellations and keeps matches starting on time. These changes make the tournament system more organized and improve the overall experience before a match begins."}, {"post_id": 25452, "ts": "2026-07-09T18:44:38Z", "hours": 11.6717, "text": "i am building a website for gamers were they can create or schedule matches and win points and they can conduct tournaments and were they can set the price and sent to the winners it has a leaderboard and the top 3 will be displayed on homepage and they can even talk each other via chat message up to now i have made tournament registration like ere the users can create a tournament and enter the details such as name ,game, name whether is a teams or solo match tournament and the points and i have also created the team creation were every users can create a team by selecting their team mates ani have most of the time for creating this Ui like searching for a good theme and i have added login and registration were users can Create account and they can upload profile picture"}]...
|
Title: X-fight by @Eshan | Stardance
Devlogs:
i a Title: X-fight by @Eshan | Stardance
Devlogs:
i am building a website for gamers were they can create or schedule matches and win points and they can conduct tournaments and were they can set the price and sent to the winners it has a leaderboard and the top 3 will be displayed on homepage and they can even talk each other via chat message up to now i have made tournament registration like ere the users can create a tournament and enter the details such as name ,game, name whether is a teams or solo match tournament and the points and i have also created the team creation were every users can create a team by selecting their team mates ani have most of the time for creating this Ui like searching for a good theme and i have added login and registration were users can Create account and they can upload profile picture
Devlog #2 This week, I worked mainly on improving the tournament flow and adding several new features to make the experience smoother for players. The first thing I completed was the User Dashboard and the Tournament Settings Dashboard. I also redesigned their UI to make them cleaner and easier to use. I then updated the tournament listing page so that it only shows tournaments that the user has not joined yet. This keeps the page organized and avoids showing tournaments that are already in the player’s list. On the User Dashboard, players can now see every tournament they have joined. Clicking on any of them opens the Tournament Dashboard, where they can view all the matches scheduled for that tournament. In the Tournament Dashboard, there is a Scheduled Match button that takes users to the Match Creation page. The match list has also been filtered so that only upcoming and currently active matches are displayed. Each match has an Enter button. When players enter the Match Room, they can see all the members of both teams along with their current status. A Ready button is available for every player. Once a player clicks it, their status changes from Waiting to Ready, allowing everyone to know who is prepared for the match.When every player is marked as Ready, a 15-second countdown starts automatically. During the first few seconds, players can still change their status back to Not Ready if needed. However, once the countdown reaches 7 seconds, the Ready status is locked, preventing anyone from switching back. This helps avoid last-second cancellations and keeps matches starting on time. These changes make the tournament system more organized and improve the overall experience before a match begins.
Develog - 3 This week I have mainly worked on creating Ai for the updating scoreboard with just a screen shot of the game scoreboard and up to this time I have added only for e-football and I am planning to add specific for some games and one for general. in this journey I tried mainly to create the AI myself so I researched how to do then I came to the idea of like it extract text from the image and I have used these three text excretion library called Easyocr, Pyteseract and Paddleocr but this I tried but here the main problem I faced is that they just extract the text but some time that will not able to I identify some small text and from that I cannot set who is the winner then I came to an idea to create an LLM using Pytorch with these neural network but when I started to do I faced a problem that my laptop is a office laptop so I cannot make such kind of LLM by my own because this lap cannot handle it. so I decided to use the google ai vision tool so now know from the beginning but I just want to create my own but due to this problems I use google ai vision it good by using a specific model I got 500 request per day(RPD) and now I have integrated that withe frontend like when they upload the scoreboard it will say analyzing the match after the Gemini response and save data in Json file in a format with some extra details like which match came the result came then only it will redirect to the main page and now I need to add the scoreboard, I am planning to add XP-points and some special extraction of score for some specific game
Develog-4 Up to this time as I said in previous develog that planning to integrate a XP point addition no I have done that. if a player one a game that player now will get a 50XP point. but I am planning like for some team game to split the total xp-points to every team member. After that I moved to make the chatting system here up to this time I have done to create a public chatroom were everyone can join and chat but after the creation of this public chat I will be creating a two-type chatroom one is 1v1 chat and group chat and I am doing this with WebSocket’s and Django channels and I have created a friend request method also were every player dashboard has a notification bar and every players can send a friend request to every other players and instead of this normal name called as friend request I named it as game-mate request and every players can chat with their game mate and they can create groups with their game mate and they can reject the request also and if they try to send request multiple times it won’t work it will directly redirect to dashboard and the player search screen will display with the z index in dashboard and I have temporary added this design tike that chat interface al to make the functionalities
Develog -5 hi everybody i have now completed the chat feature in my website. in this there are three types like group chat, privet chat and announcement chat. Group chat in this group chat it’s like normal chat like here you can make groups with the game mates only I have done making this chat system here the flow is like in the the inter face there is a button called create chatgroup if that we click then it will ask for the name, we should enter the name then the group will be created and after that it will take to the chat interface in that we have button called info were all the group members are listed and who re the admins and the group name there we have button called invite when that clicked then ta popup will be coming and all the game mates will be displayed along with send button when the send button is clicked then a special type message will send I call that as a group invite request and if they press the join then they will be added as a member. the group admin has the access to delete or make a member as admin o remove from admin position and users have option to let the group Privet Chat in this privet chat if like to chat with the game mates. the workflow is like there will be like in the chat interface all the game mates are listed if we click on them then the chatting interface will be opened where we can chat as normal and there is a button indicate online or not Announcement Chat here it like all the tournament owners can create a chat room to announce the news of their tournaments it will be admin message only chat players cannot send any messages if any doubt is there then a chatroom will also open there, they can ask doubt. chat interface the chat interface like I has designed like in dashboard there will be a button called enter the community like all the chat will be listed only one there. and it has button call return to base camp if that press then it will be returned to the dashboard. while making this like this is the first time I am working with WebSocket’s and Django channels I got many errors so that time I have mainly used the stack overflow and after I got the base of Django channels the first project to try that is this project the uploaded photo is the chat interface and I am not that good Ui design building I find a similar theme in internet I don’t know this is good anyone has suggestion please put in comments
Develog 6 Hi everybody it’s been a while. I was on break for some days due to my exams. so up to this time I was mainly focused on the design of the website here in many parts I have completely changed the layout in some places, and I came to a final color theme black red white these are the main color theme up to this time in dashboard the sidebar was just for a show it doesn’t work but now I made it functional and these are the options dashboard – it just shows a summary like the rank on the leaderboard, total tournaments joined, etc. tournaments matches game mates – it displays all the game mates and options to block, remove chats – display all the chats like to chat with the game mates and group chats logout in chat there is like i implemented a minimal clean look and it also has a sidebar whith these options display all chats search bar filter button – All, Game mates, Group Chats in right side I has like normal like chat and when a group invite is sent then in a different style in sender the request will be sent these are major layout changes in all other I just charge the color theme.
Devlog - 7 Hi I thought this would be the last devlog of this project I thought this project will be finalized but unfortunately, it didn’t finish. so, in this time, I planned to do like there are some features which are incomplete like in notification, game scoreboard analyzing model, about page etc. so these are the changes I made. notification panel so, in this I have made in previous I just created it simply like a panel with message display but now i have added these features all clear button when a game mate request is sent if the action buttons are clicked then the notification will be cleared -when a game mate sends a chat message or through group chat then the notification will be displayed in this layout also, it has changes like it was placed in the navbar and when it is clicked a box will appear near to that were it display all the notification but due to responsive issue, I changed it into a centralized popup screen and a close button to close that. layout changes Actually, I have some design works to do so I have done that. some page mainly forms lie team register tournament register, so I have applied themes of the whole site so next I did was not in my plan list, but when I am testing it I notice a drawback like when a user creates a team, they cannot modify it, so I have added that feature, so these are that features overview it just like in normal dashboard displaying No. of tournaments, Mathes and members displaying them Team captain this idea sparkled when I was playing football game so in this they who can schedule meetings give directions through team chat room Election system this was basically an election for team captain everyone has the right to vote there and who has more vote they will be the team captain instead of manual update . meeting room this a place where the team captian can schedule team meeting and a conference window will be opened they can do a face-to-face video call .so here I need to tell you something here Zee cloud helped like instead of writing a huge code of webrtc,django channel it helps to do integrated video conference through Api and it is very useful when we are starting Chatroom a place for team members can chat without creating a chatgroup next I added some more features in Matchroom these are the features in Matchroom ##more game models I have added like game model option for other it is a general for all games Ready or Not Ready this was the old same feature, but I have integrated the Django channels and web sockets count down here if every player clicks the ready button the 12 sec countdowns will be starting and after that they cannot press the no ready button and the match duration will be done then they have to end it and upload the photo by the persons from two teams and then we will cross check it and it is matched then the points will be credited otherwise it will be rejected and the match may reconduct it will be based on the tournament admins like if they want to conduct then they can otherwise the match will be abandoned these are the things I have done I think next will be the last devlog
Devlog 8: Hey everyone! First of all, I’m sorry. In my last devlog, I said that it would be my final one before shipping the project. But unfortunately, I still had a few features left to complete, so I couldn’t finish everything as planned. So, most probably, the next devlog will be my last one, and after that, I’ll be shipping the project. Let me explain what happened. In my previous devlog, I mentioned that I was planning to integrate ZeeCloud and add voice and video calling to the chat application. My plan was to include voice calls, video calls, group voice calls, and group video calls. I spent almost 10 hours working on this integration. And honestly, I managed to get everything working. The calling features were functional, but I faced one major issue: I couldn’t properly integrate my own UI with the calling system. I tried different approaches and followed several tutorials, but I still couldn’t get the UI working the way I wanted. So, to be honest, I decided to delete all the code related to the calling features and start fresh. I felt that starting from scratch would be a better option than continuing with an approach that wasn’t working for me. That took up most of my time. With the remaining time, I worked on a few other features. The main feature I added was file sharing in the chat application. Until now, users couldn’t upload files in the chat. So, I integrated file uploading, and now users can send GIFs, photos, files, and other attachments. I also added an animation for the upload feature to make the experience a little smoother and more interactive. So, that’s pretty much what I’ve worked on this time. I couldn’t finish everything I had planned, but I still managed to make some progress. Hopefully, the next devlog will actually be the final one, and I’ll finally be shipping the project.
Devlog-9 Hi everyone in my previous develog, I mentioned that this would probably be my last develog . However, after working on the project for several more hours, there are still a few UI improvements left to complete. So, this is approximately the final develog. The next update will definitely be the last one, as only a few UI changes remain. Almost all the major features and functionality are now completed. What I Worked On After the Previous Update In the previous update, I mentioned that I had integrated voice and video calling using ZEGOCLOUD. At that point, the calling functionality was working, but the UI was still based around the initial implementation. So, this time, I focused mainly on creating and integrating a custom calling UI of x-fight the black, red theme with ZEGOCLOUD. Major Update Revealing The Coin Transfer System One of the major new features I worked on is the coin system. The first part of this system is coin transfer between Game Mates. Users can now transfer their points to another game mate. The system includes the required forms, validation, calculations, through Django’s database transaction system. This ensures that the transfer is handled safely and consistently rather than simply changing the balance directly. ##Coin Transfer History I also implemented a Coin Transfer History feature. Users can now see their previous transfers and information such as: -Who they transferred points to -How many points were transferred -The transfer record -When the transfer happened This gives users a proper record of their coin activity. Tournament Entry Fees Another feature I integrated is tournament entry fees. Tournament creators can now choose whether a tournament has an entry fee or not. If a tournament has an entry fee, the required points are deducted when the player or team joins the tournament. The points are then handled as part of the tournament system, and the winner can receive the applicable reward mostly will be coins. Now after this feature only free tournaments issue is solved only as free competitions. Stats and Ranking System Finally, I have been working on connecting the points system with a new stats (ranking system). The idea is that players can use their coins to build their stats by buying it. These stats will then contribute to their position on the X-fight leaderboard. This gives the points system a purpose inside the X-fight ecosystem rather than making them simply numbers displayed on a profile. These are main feature I have worked in this time period
Devlog 10 Hi, everybody! In my previous devlog, I mentioned that this would be my last devlog. But unfortunately, while integrating the features, I faced some unexpected issues related to match results, logic, and friendly match integration. 1. Working on the UI Most of my time went into completing the pending UI work. After that, I started fixing logical errors related to friendly matches and result uploading. 2. The Friendly Match Integration Problem Most of my existing match logic was designed for tournaments, which have an event ID. But friendly matches don’t belong to any tournament, so they don’t have an event ID. To solve this, I made the event ID optional in the match room function. def match_room ( request , match_room_id , event_id = None ): I also created separate URL patterns for tournament and friendly matches and used conditional logic to handle them differently. if not match . friendly_match_room : # Tournament logic pass else : # Friendly match logic pass 3. Fixing the Match Result Processing System My website uses JSON to pass match and tournament details. Friendly matches caused errors because they don’t have tournament information. So, I added conditional logic to set tournament-related values to None for friendly matches. if not match . friendly_match_room : tournament_name = match . tournament . name tournament_id = match . tournament . id winner_team = match . winner_team else : tournament_name = None tournament_id = None winner_team = None I then passed these variables into the JSON response. 4. Implementing the Loot Transfer Logic I also worked on the loot system for friendly matches. Loot refers to the coins players contribute to the match. For example, if four players contribute 100 coins each, the total loot pool becomes 400 coins, which the winner receives. I implemented this logic in the views so that loot is transferred only after a valid match result is determined. If a match is cancelled or ends without a valid result, no coins are transferred. So these are things I have done in this time period and so next will be last devlog I hope...
|
1792511259.2017822
|
1793116059.2017822
|
|
8348
|
MineJS by @vaito | Stardance
|
vaito
|
2
|
109.0
|
950
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-19T04:02:17Z", "hours": 49.0, "multiplier": 10.9, "payout": 0, "blessing": "neutral", "text": "There is a lot of changes since the last ship (I have made more 15 release since it). To sum up: Multi version support :D 26.3 is partially supported because there is some issue with decoding packets Container is here (but you can’t interact with it yet, just viewing) You can chat now I have implemented online account protocol but there is an issue prevent me from testing it so it is considered as unstable for now. There is some small changed in protocol Fix some bugs in physics engine", "repo": "https://github.com/VaitoSoi/minejs/", "demo": "https://www.npmjs.com/package/@vaitosoi/minejs"}, {"ship_num": 2, "ts": "2026-07-16T12:50:01Z", "hours": 60.0, "multiplier": 15.92, "payout": 950, "blessing": "neutral", "text": "This is a Minecraft client package, allow you to create Minecraft bot and joining server. This ship provide some basic functionality of Minecraft bot, including: Walking around Getting blocks Also, this ship include the low-level client for talking directly to the server.", "repo": "https://github.com/VaitoSoi/minejs/", "demo": "https://www.npmjs.com/package/@vaitosoi/minejs"}]...
|
[{"post_id": 80874, "ts": "202 [{"post_id": 80874, "ts": "2026-10-19T03:56:17Z", "hours": 2.7606, "text": "I’m not doing much these day beside fixing bugs because I’m quite busy with uni homework and I’m quite bored now I post this devlog to submit all of my hours before Stardance end"}, {"post_id": 74028, "ts": "2026-09-26T15:37:46Z", "hours": 1.4769, "text": "The container is finally opened, turn out there is a bug in my code which tell the server the wrong location of the chest ;-; P/s: Thank you Claude for helping me find this issue"}, {"post_id": 73148, "ts": "2026-09-24T14:14:32Z", "hours": 5.7178, "text": "I have implemented the Use item on packet for interacting with block, but seem like there was something wrong with it because it is expected to return an open screen packet but nothing returned. Beside that, I have implemented the tablist. Now you can see the header and footer Also, I’m preparing for supporting version 26.3. I’m wondering whether should I make a new ship. P/s: Rust rewrite when >:)"}, {"post_id": 65383, "ts": "2026-09-10T14:17:17Z", "hours": 1.8811, "text": "I added container But it is just clientbound Add container and block interaction soon"}, {"post_id": 64194, "ts": "2026-09-08T12:52:05Z", "hours": 5.9608, "text": "I have completed the reading slot part. I just know that a slot can hold that many data ;-; Btw, I’ll soon complete the container part, meaning that you can use chest now"}, {"post_id": 59464, "ts": "2026-09-01T10:24:05Z", "hours": 4.2389, "text": "The bot can chat now I have to reimplement the bitset to let this run btw"}, {"post_id": 53887, "ts": "2026-08-24T16:16:27Z", "hours": 3.5672, "text": "Hello again, I’m sorry for not update this project much since I’m working on the other. I just found out that the Mojang just revoke my app approval without any notification ;-; Btw, I fixed the bug that ignore the chunk packet and update the README about the current situation ;-;"}, {"post_id": 44586, "ts": "2026-08-10T13:25:50Z", "hours": 8.7567, "text": "Hello again, sorry for a almost-9-hour devlogs I’m just making the auth part for joining premium server and the thing is not going well for now ;-; I have registered the app for accessing Minecraft API but by some magic, I’m still blocked I’m also making the feature for verifying message signature"}, {"post_id": 40068, "ts": "2026-08-03T13:15:54Z", "hours": 6.7083, "text": "I do so much work that I forgot what to summarize here So before, everything is placed in TCPClient, which is fine for hard-coded packets. But now, I’m making the dynamic packet translating for multiple version supports. And while making it, it need reference from TCPClient, then TCPClient need to a reference of it and so on… So I have split the functionality into corresponding space. So now, each of class has its own responsibility: TCPClient for throwing and receiving packets through TCP connection VersionCodec for translating packets Dispatcher for handling packet SharedState for holding states So that is the whole update. Hope youre enjoy your day, also this project :D"}, {"post_id": 37686, "ts": "2026-07-30T16:10:51Z", "hours": 8.1078, "text": "Sorry for another 8-hour devlog ;-; Now MineJS support 26.2 I’m working on a system for mapping version and packet so MineJS can support multiple version at the same time, instead of one atm (because the packet ID is hard-coded). I also make another tool for scrapping Minecraft Wiki for packet structure (disclaimer: This is not an automate running so it will not spam the Wiki, please don’t ban me ;-;). Thats it, have a great day"}, {"post_id": 29459, "ts": "2026-07-16T12:40:35Z", "hours": 5.4361, "text": "Oh, I spent 5h for setting up documents? That’s crazy :D Btw, I have setup an auto document page using TypeDoc. I also setup Github Action for automating publish package and build document page."}, {"post_id": 28434, "ts": "2026-07-14T17:52:04Z", "hours": 5.855, "text": "NOW MY BOT CAN WALK ON STAIR I think it is ready to be publish ONE MORE TIME, I’m very sorry for not logging this painful process much, please please please forgive me"}, {"post_id": 27246, "ts": "2026-07-12T17:09:55Z", "hours": 2.0628, "text": "MY BOT CAN WALK NOW 🎉"}, {"post_id": 26816, "ts": "2026-07-11T20:33:54Z", "hours": 8.795, "text": "Hello, sorry for forget logging regularly In the last whole week, my only job is looking at Minecraft code, ask Claude what the beep beep is that, arguing with myself do I have to do this and then continue Btw I managed to write the trimmed Minecraft physics engine and ready to test it out Unfortunately, my code isn’t reading the Registry well so maybe tomorrow :D P/s: If you still read this, have a good day and please vote for me ;-;"}, {"post_id": 22246, "ts": "2026-07-04T16:43:26Z", "hours": 0.6108, "text": "I’m getting through clipping function, which is mandatory to calculate the damage from falling"}, {"post_id": 21570, "ts": "2026-07-03T16:24:49Z", "hours": 1.2514, "text": "Finally done the collide function ;-;"}, {"post_id": 20886, "ts": "2026-07-02T16:42:55Z", "hours": 1.2506, "text": "I have implemented the base collide function and ready for the entity collide :D"}, {"post_id": 19423, "ts": "2026-06-30T19:00:04Z", "hours": 2.0781, "text": "I added VoxelShape and some math related to it. Now I can reconstruct the collision the shape of the block and, hopefully, mobs. Thats mean I’m ready to let my client be able to move, I hope so"}, {"post_id": 18504, "ts": "2026-06-29T17:51:18Z", "hours": 6.9461, "text": "Now I’m implementing the “move” method for the client, which invokes physics things, which is very very difficult for me That why I’m not updating regularly ;-; (I’m sorry)"}, {"post_id": 16401, "ts": "2026-06-26T18:01:32Z", "hours": 4.4861, "text": "I’m making auth system and this takes me so much timeeeeeeeeeee Btw, I’m waiting for Mojang to approve my Azure app so I can test the auth API"}, {"post_id": 15114, "ts": "2026-06-24T15:35:22Z", "hours": 1.1408, "text": "I’m working on parsing player chat message now"}, {"post_id": 14337, "ts": "2026-06-23T13:07:17Z", "hours": 4.6081, "text": "This whole week is filled with debugging and small updates so here is the summary: Now the Client can handle Chunk datas, including blocks, biomes and block entites I also add more packet handling, events and decoder function. I’m moving to high-level client and the first function is move. Todo list: Inspect how Minecraft code handle movement and collision. Implement it :D"}, {"post_id": 9222, "ts": "2026-06-15T14:30:17Z", "hours": 3.2814, "text": "I’m on my way to reading chunk data. I have burnt all of my Github Copilot monthly credit only to realize that Copilot inserted a redundant read that collapse all reading latter :_D"}, {"post_id": 8565, "ts": "2026-06-14T07:26:57Z", "hours": 1.1917, "text": "It is finally working 🎉"}, {"post_id": 8530, "ts": "2026-06-14T06:05:46Z", "hours": 1.9508, "text": "I have handled all required packet so this should be theoretically playable. I also do some refactoring for a cleaner codebase :D"}, {"post_id": 8158, "ts": "2026-06-13T16:34:15Z", "hours": 2.3169, "text": "I forgot to make the devlogs so here is all of the updates: I’m heading towards making the main client All decoder and encoder have been merged to a single file for simpler file structure I’m making the encrypting things"}, {"post_id": 4223, "ts": "2026-06-07T13:37:37Z", "hours": 0.7256, "text": "The SNBT decoder is kinda work for now :D I’m moving to encoder (or should I >:D)"}, {"post_id": 3586, "ts": "2026-06-06T16:15:08Z", "hours": 1.8761, "text": "I’m working on SNBT decoder, which is way more trickier than NBT ;-; I’m just done the basic part and planning for nested object."}, {"post_id": 2804, "ts": "2026-06-05T16:59:44Z", "hours": 3.8261, "text": "I have made a NBT decoder and encoder. You can see it encode and decode in the terminal :D"}]...
|
Title: MineJS by @vaito | Stardance
Devlogs:
I ha Title: MineJS by @vaito | Stardance
Devlogs:
I have made a NBT decoder and encoder. You can see it encode and decode in the terminal :D
I’m working on SNBT decoder, which is way more trickier than NBT ;-; I’m just done the basic part and planning for nested object.
The SNBT decoder is kinda work for now :D I’m moving to encoder (or should I >:D)
I forgot to make the devlogs so here is all of the updates: I’m heading towards making the main client All decoder and encoder have been merged to a single file for simpler file structure I’m making the encrypting things
I have handled all required packet so this should be theoretically playable. I also do some refactoring for a cleaner codebase :D
It is finally working 🎉
I’m on my way to reading chunk data. I have burnt all of my Github Copilot monthly credit only to realize that Copilot inserted a redundant read that collapse all reading latter :_D
This whole week is filled with debugging and small updates so here is the summary: Now the Client can handle Chunk datas, including blocks, biomes and block entites I also add more packet handling, events and decoder function. I’m moving to high-level client and the first function is move. Todo list: Inspect how Minecraft code handle movement and collision. Implement it :D
I’m working on parsing player chat message now
I’m making auth system and this takes me so much timeeeeeeeeeee Btw, I’m waiting for Mojang to approve my Azure app so I can test the auth API
Now I’m implementing the “move” method for the client, which invokes physics things, which is very very difficult for me That why I’m not updating regularly ;-; (I’m sorry)
I added VoxelShape and some math related to it. Now I can reconstruct the collision the shape of the block and, hopefully, mobs. Thats mean I’m ready to let my client be able to move, I hope so
I have implemented the base collide function and ready for the entity collide :D
Finally done the collide function ;-;
I’m getting through clipping function, which is mandatory to calculate the damage from falling
Hello, sorry for forget logging regularly In the last whole week, my only job is looking at Minecraft code, ask Claude what the beep beep is that, arguing with myself do I have to do this and then continue Btw I managed to write the trimmed Minecraft physics engine and ready to test it out Unfortunately, my code isn’t reading the Registry well so maybe tomorrow :D P/s: If you still read this, have a good day and please vote for me ;-;
MY BOT CAN WALK NOW 🎉
NOW MY BOT CAN WALK ON STAIR I think it is ready to be publish ONE MORE TIME, I’m very sorry for not logging this painful process much, please please please forgive me
Oh, I spent 5h for setting up documents? That’s crazy :D Btw, I have setup an auto document page using TypeDoc. I also setup Github Action for automating publish package and build document page.
Sorry for another 8-hour devlog ;-; Now MineJS support 26.2 I’m working on a system for mapping version and packet so MineJS can support multiple version at the same time, instead of one atm (because the packet ID is hard-coded). I also make another tool for scrapping Minecraft Wiki for packet structure (disclaimer: This is not an automate running so it will not spam the Wiki, please don’t ban me ;-;). Thats it, have a great day
I do so much work that I forgot what to summarize here So before, everything is placed in TCPClient, which is fine for hard-coded packets. But now, I’m making the dynamic packet translating for multiple version supports. And while making it, it need reference from TCPClient, then TCPClient need to a reference of it and so on… So I have split the functionality into corresponding space. So now, each of class has its own responsibility: TCPClient for throwing and receiving packets through TCP connection VersionCodec for translating packets Dispatcher for handling packet SharedState for holding states So that is the whole update. Hope youre enjoy your day, also this project :D
Hello again, sorry for a almost-9-hour devlogs I’m just making the auth part for joining premium server and the thing is not going well for now ;-; I have registered the app for accessing Minecraft API but by some magic, I’m still blocked I’m also making the feature for verifying message signature
Hello again, I’m sorry for not update this project much since I’m working on the other. I just found out that the Mojang just revoke my app approval without any notification ;-; Btw, I fixed the bug that ignore the chunk packet and update the README about the current situation ;-;
The bot can chat now I have to reimplement the bitset to let this run btw
I have completed the reading slot part. I just know that a slot can hold that many data ;-; Btw, I’ll soon complete the container part, meaning that you can use chest now
I added container But it is just clientbound Add container and block interaction soon
I have implemented the Use item on packet for interacting with block, but seem like there was something wrong with it because it is expected to return an open screen packet but nothing returned. Beside that, I have implemented the tablist. Now you can see the header and footer Also, I’m preparing for supporting version 26.3. I’m wondering whether should I make a new ship. P/s: Rust rewrite when >:)
The container is finally opened, turn out there is a bug in my code which tell the server the wrong location of the chest ;-; P/s: Thank you Claude for helping me find this issue
I’m not doing much these day beside fixing bugs because I’m quite busy with uni homework and I’m quite bored now I post this devlog to submit all of my hours before Stardance end
Ships:
This is a Minecraft client package, allow you to create Minecraft bot and joining server. This ship provide some basic functionality of Minecraft bot, including: Walking around Getting blocks Also, this ship include the low-level client for talking directly to the server.
There is a lot of changes since the last ship (I have made more 15 release since it). To sum up: Multi version support :D 26.3 is partially supported because there is some issue with decoding packets Container is here (but you can’t interact with it yet, just viewing) You can chat now I have implemented online account protocol but there is an issue prevent me from testing it so it is considered as unstable for now. There is some small changed in protocol Fix some bugs in physics engine...
|
1792824795.7877336
|
1792911195.7877336
|
|
69135
|
My Website by @KelvinY | Stardance
|
KelvinY
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-19T04:54:22Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Yooo it’s done! Got it under 3 days, 3 hrs. Now the final step is to get the free domain >:) A secret feature is coming after this..", "repo": "https://github.com/kelvinyhf/my-website", "demo": "https://kelviny.pages.dev"}]...
|
[{"post_id": 80876, "ts": "202 [{"post_id": 80876, "ts": "2026-10-19T03:58:19Z", "hours": 2.0742, "text": "Added two very very very cool feature: random useless facts and leave a message!! I dropped down many random useless facts about me and you can click roll to view them it’s addictive And the coollllllest thing is that you can leave an anonymous message to me just by typing it and click, that’s it! It will being sent to my mailbox automatically! It’s made using formspree a free service for this, but there’s a free limit of 50 messages per month THAT’S SO LITTLE so don’t spam lol"}, {"post_id": 80284, "ts": "2026-10-17T03:28:02Z", "hours": 1.2044, "text": "I spent a half hr try to find the right style.. and I did! I really love this simple style, and the notebook like background :) i guess i can ship it under 3 days since its simple"}]...
|
Title: My Website by @KelvinY | Stardance
Devlogs Title: My Website by @KelvinY | Stardance
Devlogs:
I spent a half hr try to find the right style.. and I did! I really love this simple style, and the notebook like background :) i guess i can ship it under 3 days since its simple
Added two very very very cool feature: random useless facts and leave a message!! I dropped down many random useless facts about me and you can click roll to view them it’s addictive And the coollllllest thing is that you can leave an anonymous message to me just by typing it and click, that’s it! It will being sent to my mailbox automatically! It’s made using formspree a free service for this, but there’s a free limit of 50 messages per month THAT’S SO LITTLE so don’t spam lol
Ships:
Yooo it’s done! Got it under 3 days, 3 hrs. Now the final step is to get the free domain >:) A secret feature is coming after this.....
|
1792857219.8310804
|
1792943619.8310804
|
|
4211
|
Wheat Operating System (WheatOS) by @Ravduct | Sta Wheat Operating System (WheatOS) by @Ravduct | Stardance...
|
Ravduct
|
0
|
60.63
|
0
|
[]
|
[{"post_id": 80878, "ts": "202 [{"post_id": 80878, "ts": "2026-10-19T04:37:06Z", "hours": 9.5486, "text": "Heap Allocation For Kernel I make heap allocations for the kernel (kmalloc and kfree). It will reserve a certain amount of memory for the kernel. I will do heap allocation for user later."}, {"post_id": 76992, "ts": "2026-10-05T08:56:10Z", "hours": 13.0931, "text": "Adding typing feature I did a lot of memory management before this to get the keyboard to work in my kernel. I also optimized and organized my source code a little bit."}, {"post_id": 70995, "ts": "2026-09-20T05:39:23Z", "hours": 8.3692, "text": "Foundation of Kernel I finished the basic printing functions. E820 Memory Map I also loaded the E820 memory map into the kernel so the kernel knows which areas of memory are usable or reserved. Screenshot Information In the picture below, the first row of numbers is the base address . The second row of numbers is the memory length (base address - memory length = physical memory area). The third row of numbers indicates the memory type (usable or reserved). In addition, the memory information will differ depending on how much memory I allocated to QEMU. In conclusion, the usable memory is 8.59GB."}, {"post_id": 63390, "ts": "2026-09-07T06:04:58Z", "hours": 9.6458, "text": "My bootloader Is Finished!!! It loads into Protected Mode (32-bit) and Long Mode (64-bit), and then jumps to the kernel. My Next Goal My next goal is to work on my kernel. Can y’all give me some ideas about the kernel? What features should it have?"}, {"post_id": 45570, "ts": "2026-08-12T04:53:27Z", "hours": 9.4389, "text": "Protected Mode (32-bit) Enabled I got into protected mode in my stage 2 bootloader. 1. A20 Line First, I have to enable the A20 line to give the computer permission to access more than 1MB memory. 2. E820 Memory Map Next, I write a part of code that informs the computer of the safe physical memory access range (tells the computer about memory areas) 3. Global Descriptor Table (GDT) Before switching to protected mode, the kernel has to know what memory areas is for what. That is why we have GDT to inform the kernel. 4. CR0.PE = 1 Finally, I enable protected mode through the register CR0."}, {"post_id": 31066, "ts": "2026-07-19T04:57:36Z", "hours": 4.2417, "text": "Stage 1 Rebuild I rebuilt the Stage 1 bootloader in a new way. It successfully loaded into the Stage 2 bootloader, but I didn’t fully develop the Stage 2 bootloader. Disk.asm I made a new file named “disk.asm” to load data from the disk into memory. It will be used by both Stage 1 and 2 bootloaders."}, {"post_id": 20557, "ts": "2026-07-02T05:17:15Z", "hours": 0.4719, "text": "Finished Stage 1 Everything in Stage 1 is done. It only works for x86 machines that have a BIOS from 1998 or later because it supports the feature that my Stage 1 bootloader has (Int 0x13, AH=0x42). What’s Next? I will work on the Stage 2 bootloader and load the machine into Long Mode (64-bit). First of all is get the Real Mode setup."}, {"post_id": 18450, "ts": "2026-06-29T16:42:59Z", "hours": 0.8031, "text": "Final of Stage 1, Beginning of Stage 2 I just found out that there are some final tasks I have to do in Stage 1 before I can completely switch to Stage 2. What’s Wrong I need to make sure the BIOS supports the function to switch to Stage 2"}, {"post_id": 14881, "ts": "2026-06-24T04:57:26Z", "hours": 0.6, "text": "Bootloader Stage 2 (still in progress) After stage 1, I continue with stage 2, which will extend the memory limit, so the os can handle more complex tasks. What Happened? Surprisingly, I don’t know why it has an error. disk_address_packet: db 0x10 db 0 dw 1 dw 0x8000 dw 0x0000 dq 1 disk_error: mov si, disk_error_message call print_loop jmp hang ret “disk_address_packet” and “disk_error” labels are to allow you to understand my screenshots more easily."}, {"post_id": 14193, "ts": "2026-06-23T05:50:17Z", "hours": 0.9475, "text": "Stage 1 Bootloader I just realized that I have lost in my own project 😅. I didn’t know what I was doing or whether it was right. Today, I finally kinda make a Stage 1 bootloader"}, {"post_id": 13554, "ts": "2026-06-22T05:56:27Z", "hours": 0.4569, "text": "Switching to A New Virtual Machine I have switched to a new virtual machine, QEMU, because I can compile and run my Assembly file (.asm) more quickly. My file will output “ Loading into Protected Mode 32-bit ” once it runs.😅 😅 😅 I am still stuck in Real Mode and still can’t get to Protected mode."}, {"post_id": 11805, "ts": "2026-06-19T06:47:33Z", "hours": 0.7722, "text": "Trying to switch CPU mode in bootloader (Part 2) Today, I am still stuck with the process of how to switch from Real Mode (16-bit) to Protected Mode (32-bit), but I think a little bit outside the box. Not only focused on A20, but I also researched the other parts in Real and Protected Mode."}, {"post_id": 11136, "ts": "2026-06-18T06:43:00Z", "hours": 0.7986, "text": "Trying to switch CPU mode in bootloader I’m currently working on the bootloader to make it from Real Mode (16-bit) to Protected Mode (32-bit) I’m still stuck with the A20 gate. I need to learn more about Assembly syntax, so it will help me understand how my CPU actually works."}, {"post_id": 7908, "ts": "2026-06-13T06:01:20Z", "hours": 0.8483, "text": "Shortcut for building files I just made a shortcut today, so it will help me later in this project. PowerShell file I have added a PowerShell file to build a Binary file (.bin) and other files (.img, .vdi) from my main Assembly file (.asm). & \"C:\\Program Files\\NASM\\nasm.exe\" -f bin boot.asm -o boot.bin del disk.img -ErrorAction SilentlyContinue del disk.vdi -ErrorAction SilentlyContinue $disk= New-Object byte[] (1474560) [IO.File]::WriteAllBytes(\"disk.img\", $disk) $boot= [IO.File]::ReadAllBytes(\"boot.bin\") $disk= [IO.File]::ReadAllBytes(\"disk.img\") [Array]::Copy($boot, 0, $disk, 0, 512) [IO.File]::WriteAllBytes(\"disk.img\", $disk) & \"C:\\Program Files\\Oracle\\VirtualBox\\VBoxManage.exe\" convertfromraw disk.img disk.vdi --format VDI"}, {"post_id": 6620, "ts": "2026-06-11T03:18:59Z", "hours": 0.3044, "text": "I finally get my operating system on a virtual machine and make it output some words"}, {"post_id": 6600, "ts": "2026-06-11T02:28:18Z", "hours": 0.2869, "text": "I am researching assembly programming and how hardware and software work together."}]...
|
Title: Wheat Operating System (WheatOS) by @Ravduc Title: Wheat Operating System (WheatOS) by @Ravduct | Stardance
Devlogs:
I am researching assembly programming and how hardware and software work together.
I finally get my operating system on a virtual machine and make it output some words
Shortcut for building files I just made a shortcut today, so it will help me later in this project. PowerShell file I have added a PowerShell file to build a Binary file (.bin) and other files (.img, .vdi) from my main Assembly file (.asm). & "C:\Program Files\NASM\nasm.exe" -f bin boot.asm -o boot.bin del disk.img -ErrorAction SilentlyContinue del disk.vdi -ErrorAction SilentlyContinue $disk= New-Object byte[] (1474560) [IO.File]::WriteAllBytes("disk.img", $disk) $boot= [IO.File]::ReadAllBytes("boot.bin") $disk= [IO.File]::ReadAllBytes("disk.img") [Array]::Copy($boot, 0, $disk, 0, 512) [IO.File]::WriteAllBytes("disk.img", $disk) & "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" convertfromraw disk.img disk.vdi --format VDI
Trying to switch CPU mode in bootloader I’m currently working on the bootloader to make it from Real Mode (16-bit) to Protected Mode (32-bit) I’m still stuck with the A20 gate. I need to learn more about Assembly syntax, so it will help me understand how my CPU actually works.
Trying to switch CPU mode in bootloader (Part 2) Today, I am still stuck with the process of how to switch from Real Mode (16-bit) to Protected Mode (32-bit), but I think a little bit outside the box. Not only focused on A20, but I also researched the other parts in Real and Protected Mode.
Switching to A New Virtual Machine I have switched to a new virtual machine, QEMU, because I can compile and run my Assembly file (.asm) more quickly. My file will output “ Loading into Protected Mode 32-bit ” once it runs.😅 😅 😅 I am still stuck in Real Mode and still can’t get to Protected mode.
Stage 1 Bootloader I just realized that I have lost in my own project 😅. I didn’t know what I was doing or whether it was right. Today, I finally kinda make a Stage 1 bootloader
Bootloader Stage 2 (still in progress) After stage 1, I continue with stage 2, which will extend the memory limit, so the os can handle more complex tasks. What Happened? Surprisingly, I don’t know why it has an error. disk_address_packet: db 0x10 db 0 dw 1 dw 0x8000 dw 0x0000 dq 1 disk_error: mov si, disk_error_message call print_loop jmp hang ret “disk_address_packet” and “disk_error” labels are to allow you to understand my screenshots more easily.
Final of Stage 1, Beginning of Stage 2 I just found out that there are some final tasks I have to do in Stage 1 before I can completely switch to Stage 2. What’s Wrong I need to make sure the BIOS supports the function to switch to Stage 2
Finished Stage 1 Everything in Stage 1 is done. It only works for x86 machines that have a BIOS from 1998 or later because it supports the feature that my Stage 1 bootloader has (Int 0x13, AH=0x42). What’s Next? I will work on the Stage 2 bootloader and load the machine into Long Mode (64-bit). First of all is get the Real Mode setup.
Stage 1 Rebuild I rebuilt the Stage 1 bootloader in a new way. It successfully loaded into the Stage 2 bootloader, but I didn’t fully develop the Stage 2 bootloader. Disk.asm I made a new file named “disk.asm” to load data from the disk into memory. It will be used by both Stage 1 and 2 bootloaders.
Protected Mode (32-bit) Enabled I got into protected mode in my stage 2 bootloader. 1. A20 Line First, I have to enable the A20 line to give the computer permission to access more than 1MB memory. 2. E820 Memory Map Next, I write a part of code that informs the computer of the safe physical memory access range (tells the computer about memory areas) 3. Global Descriptor Table (GDT) Before switching to protected mode, the kernel has to know what memory areas is for what. That is why we have GDT to inform the kernel. 4. CR0.PE = 1 Finally, I enable protected mode through the register CR0.
My bootloader Is Finished!!! It loads into Protected Mode (32-bit) and Long Mode (64-bit), and then jumps to the kernel. My Next Goal My next goal is to work on my kernel. Can y’all give me some ideas about the kernel? What features should it have?
Foundation of Kernel I finished the basic printing functions. E820 Memory Map I also loaded the E820 memory map into the kernel so the kernel knows which areas of memory are usable or reserved. Screenshot Information In the picture below, the first row of numbers is the base address . The second row of numbers is the memory length (base address - memory length = physical memory area). The third row of numbers indicates the memory type (usable or reserved). In addition, the memory information will differ depending on how much memory I allocated to QEMU. In conclusion, the usable memory is 8.59GB.
Adding typing feature I did a lot of memory management before this to get the keyboard to work in my kernel. I also optimized and organized my source code a little bit.
Heap Allocation For Kernel I make heap allocations for the kernel (kmalloc and kfree). It will reserve a certain amount of memory for the kernel. I will do heap allocation for user later....
|
1792713180.2731435
|
1793317980.2731435
|
|
54938
|
My Website by @FC-107446 | Stardance
|
FC-107446
|
1
|
9.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-19T04:42:09Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made my first proper website with HTML and CSS. I learnt lots about website making, and div tags. I also included a mini game which AI made for me because I was bored.", "repo": "https://github.com/FC-107446/my_website", "demo": "https://fc-107446.github.io/my_website/"}]...
|
[{"post_id": 80879, "ts": "202 [{"post_id": 80879, "ts": "2026-10-19T04:39:31Z", "hours": 3.9869, "text": "Changed the layout to a masonry layout"}, {"post_id": 78465, "ts": "2026-10-10T21:03:10Z", "hours": 1.6194, "text": "Added a nav bar, more sections, and more pages."}, {"post_id": 66386, "ts": "2026-09-12T06:07:46Z", "hours": 1.1981, "text": "Almost ready! I was cheating the widths before, but they now work whatever the window size is. Slowly replacing the lorem ipsum."}, {"post_id": 60653, "ts": "2026-09-03T04:43:36Z", "hours": 0.9603, "text": "I added lorem ipsum as I don’t have enough text to put in the div tags. I changed the colours, and changed some widths."}, {"post_id": 57921, "ts": "2026-08-30T08:00:55Z", "hours": 0.3883, "text": "Div tags working!"}, {"post_id": 57032, "ts": "2026-08-29T03:20:27Z", "hours": 0.5933, "text": "Starting the website The div tags are not working"}]...
|
Title: My Website by @FC-107446 | Stardance
Devlo Title: My Website by @FC-107446 | Stardance
Devlogs:
Starting the website The div tags are not working
Div tags working!
I added lorem ipsum as I don’t have enough text to put in the div tags. I changed the colours, and changed some widths.
Almost ready! I was cheating the widths before, but they now work whatever the window size is. Slowly replacing the lorem ipsum.
Added a nav bar, more sections, and more pages.
Changed the layout to a masonry layout
Ships:
I made my first proper website with HTML and CSS. I learnt lots about website making, and div tags. I also included a mini game which AI made for me because I was bored....
|
1792857071.5283742
|
1792943471.5283742
|
|
39938
|
My very own ZenOS by @jegtaiwo | Stardance
|
jegtaiwo
|
0
|
62.64
|
0
|
[]
|
[{"post_id": 80883, "ts": "202 [{"post_id": 80883, "ts": "2026-10-19T04:50:54Z", "hours": 21.8356, "text": "So far have not been able to write any devlog. This is what i built so far not ai built 😭😭"}, {"post_id": 58598, "ts": "2026-08-31T02:19:57Z", "hours": 10.4986, "text": "Currently working the Spotify integration to my WEBOS and adding some nice features"}, {"post_id": 54916, "ts": "2026-08-26T04:18:21Z", "hours": 10.1431, "text": "Starting my web OS all over again, i wasn’t feeling confident with my first idea. So i start building from starch"}, {"post_id": 47793, "ts": "2026-08-15T23:38:49Z", "hours": 10.3475, "text": "Another 8 hours spent working on ZenOS. ☯️ Today I mostly worked on making the desktop feel more like an actual OS instead of just a UI. I spent time working on the built-in apps and getting more of them working properly, including Finder, TextEdit, Notes, Paint, Calculator, Calendar, Terminal, Preview, and the other system apps. I also worked more on things like window management, the dock, Spotlight, notifications, keyboard shortcuts, and how the apps open and interact with the desktop. There’s still a lot that needs fixing and improving, but it’s starting to feel much more like an actual desktop environment now. 18 hours in so far. And I’m definitely not done yet. There’s still a lot more I want to add to ZenOS. ☯️ #ZenOS #DevLog #BuildInPublic #WebDevelopment #JavaScript #HTML #CSS"}, {"post_id": 41924, "ts": "2026-08-06T13:28:41Z", "hours": 9.8106, "text": "Devlog #1 It’s still rough around the edges, but every OS starts somewhere. Day one of building ZenOS. The foundation is finally taking shape. ☯️🚀"}]...
|
Title: My very own ZenOS by @jegtaiwo | Stardance
Title: My very own ZenOS by @jegtaiwo | Stardance
Devlogs:
Devlog #1 It’s still rough around the edges, but every OS starts somewhere. Day one of building ZenOS. The foundation is finally taking shape. ☯️🚀
Another 8 hours spent working on ZenOS. ☯️ Today I mostly worked on making the desktop feel more like an actual OS instead of just a UI. I spent time working on the built-in apps and getting more of them working properly, including Finder, TextEdit, Notes, Paint, Calculator, Calendar, Terminal, Preview, and the other system apps. I also worked more on things like window management, the dock, Spotlight, notifications, keyboard shortcuts, and how the apps open and interact with the desktop. There’s still a lot that needs fixing and improving, but it’s starting to feel much more like an actual desktop environment now. 18 hours in so far. And I’m definitely not done yet. There’s still a lot more I want to add to ZenOS. ☯️ #ZenOS #DevLog #BuildInPublic #WebDevelopment #JavaScript #HTML #CSS
Starting my web OS all over again, i wasn’t feeling confident with my first idea. So i start building from starch
Currently working the Spotify integration to my WEBOS and adding some nice features
So far have not been able to write any devlog. This is what i built so far not ai built 😭😭...
|
1792680636.9540184
|
1793285436.9540184
|
|
62762
|
Hydrover by @bhanu-8215 | Stardance
|
bhanu-8215
|
0
|
11.68
|
0
|
[]
|
[{"post_id": 80888, "ts": "202 [{"post_id": 80888, "ts": "2026-10-19T05:24:52Z", "hours": 1.6094, "text": "DEVLOG-10 : Finally the arm of my rover is taking shape . what remains is its sample collecting tray and a mechanism through which it rm can deliver sample collected to onboard sample collecting tray ."}, {"post_id": 78446, "ts": "2026-10-10T20:17:34Z", "hours": 0.5481, "text": "DEVLOG 9 : This is my first time writing code . I have been watching tutorials and videos to learn how to code ."}, {"post_id": 76698, "ts": "2026-10-04T11:25:19Z", "hours": 0.7433, "text": "Devlog - 8 : All the tires are installed and i wired all the motors temporary to check its body structure and suspension ."}, {"post_id": 76678, "ts": "2026-10-04T10:15:03Z", "hours": 1.1658, "text": "Devlog - 7 : Today i do all the soldering work ."}, {"post_id": 75580, "ts": "2026-09-30T14:09:34Z", "hours": 0.3364, "text": "Devlog - 6 : Reporting back after a long break . The designing of the driler and arm of my rover is completed ."}, {"post_id": 72288, "ts": "2026-09-22T16:18:53Z", "hours": 1.2039, "text": "just make rover structure stand ."}, {"post_id": 71888, "ts": "2026-09-21T18:16:19Z", "hours": 2.2897, "text": "Devlog - 4: Suspension work is almost completed ."}, {"post_id": 71606, "ts": "2026-09-21T04:48:49Z", "hours": 1.6181, "text": "Devlog-3 : the work on ground has started . I has made a very basic shape for my rover."}, {"post_id": 71148, "ts": "2026-09-20T11:00:39Z", "hours": 1.0219, "text": "DEVLOG-2 : Now my plan has changed instead of sodium ion rover I am now designing a rover to conduct experiments about future fuels for outer space on our moon with water present their . Therefore name is changed to Hydrover from so-lo."}, {"post_id": 70296, "ts": "2026-09-18T21:54:27Z", "hours": 1.1442, "text": "I am building a space rover powered by a sodium ion battery . This battery pack will help it to function even in very harsh temperature .Now I have a clear plan and diagrames to work on it . most of my time is spend in researching because the design of space rovers are very complex."}]...
|
Title: Hydrover by @bhanu-8215 | Stardance
Devlog Title: Hydrover by @bhanu-8215 | Stardance
Devlogs:
I am building a space rover powered by a sodium ion battery . This battery pack will help it to function even in very harsh temperature .Now I have a clear plan and diagrames to work on it . most of my time is spend in researching because the design of space rovers are very complex.
DEVLOG-2 : Now my plan has changed instead of sodium ion rover I am now designing a rover to conduct experiments about future fuels for outer space on our moon with water present their . Therefore name is changed to Hydrover from so-lo.
Devlog-3 : the work on ground has started . I has made a very basic shape for my rover.
Devlog - 4: Suspension work is almost completed .
just make rover structure stand .
Devlog - 6 : Reporting back after a long break . The designing of the driler and arm of my rover is completed .
Devlog - 7 : Today i do all the soldering work .
Devlog - 8 : All the tires are installed and i wired all the motors temporary to check its body structure and suspension .
DEVLOG 9 : This is my first time writing code . I have been watching tutorials and videos to learn how to code .
DEVLOG-10 : Finally the arm of my rover is taking shape . what remains is its sample collecting tray and a mechanism through which it rm can deliver sample collected to onboard sample collecting tray ....
|
1792439315.6699145
|
1793044115.6699145
|
|
66718
|
willie and lue OS by @lueyun | Stardance
|
lueyun
|
0
|
2.6
|
0
|
[]
|
[{"post_id": 80889, "ts": "202 [{"post_id": 80889, "ts": "2026-10-19T05:32:15Z", "hours": 1.0908, "text": "devlog #3 uhmmmmmm theres an error and idk how to fix it 🥲anyways: working timer >:D tried to make a moveable window sigh uhm i hope i can fix this"}, {"post_id": 80873, "ts": "2026-10-19T03:46:45Z", "hours": 1.1572, "text": "devlog #2: wow hi guys. im back with some progress: added welcome box (not sure what its called) background top and bottom text im working on the time (yes javascript 🥲) and currently im running some trouble with it but who cares ahahaha- lets just see how it goes"}, {"post_id": 80834, "ts": "2026-10-18T23:10:10Z", "hours": 0.3517, "text": "devlog #1: hello!! new webOS of willie and lue!! i want to try to tackle the more advanced parts of website building (idk what thats called). here, its just a simple process to start things off!! added image of them added div (thus the boarder hehe) i wonder if i can make better than my personal website 🥲"}]...
|
Title: willie and lue OS by @lueyun | Stardance
D Title: willie and lue OS by @lueyun | Stardance
Devlogs:
devlog #1: hello!! new webOS of willie and lue!! i want to try to tackle the more advanced parts of website building (idk what thats called). here, its just a simple process to start things off!! added image of them added div (thus the boarder hehe) i wonder if i can make better than my personal website 🥲
devlog #2: wow hi guys. im back with some progress: added welcome box (not sure what its called) background top and bottom text im working on the time (yes javascript 🥲) and currently im running some trouble with it but who cares ahahaha- lets just see how it goes
devlog #3 uhmmmmmm theres an error and idk how to fix it 🥲anyways: working timer >:D tried to make a moveable window sigh uhm i hope i can fix this...
|
1792461199.2310257
|
1793065999.2310257
|
|
69677
|
Dark Web OS by @Jazil | Stardance
|
Jazil
|
1
|
6.29
|
18
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-18T06:33:23Z", "hours": 6.0, "multiplier": 2.84, "payout": 18, "blessing": "neutral", "text": "I made my WEb OS with on dark theme What i build I build a DARK WEB OS with using javascript,html and css and it have 3 apps like claculator,terminal and a fun web broswer Features I gived it hacker based thmes also like hacalc,hacbrowse and hackterm It do not have password and it is opensoure i gived styling as much i can ab it is cool for me it is wer you can drag and drop and it can maximaze and minmaze I Gived that MIT license so its have copyright what i am proud of I made a web os is the thing that i am proud of and it is made on my mind theme challenges I got challenging while writing responsive to design on min maze and maximaze and draging and also writing html Thank you If you like it please give me a star because i want to get that badge of 15 stars and still i do not get it please give me start", "repo": "https://github.com/JazilJafar/Dark-Web-OS", "demo": "https://darkwebos.vercel.app/"}]...
|
[{"post_id": 80890, "ts": "202 [{"post_id": 80890, "ts": "2026-10-19T05:43:26Z", "hours": 0.2883, "text": "I fixed all bugs in my code and add more stylings"}, {"post_id": 80440, "ts": "2026-10-17T16:59:32Z", "hours": 1.0381, "text": "My web os project is complete take a look at https://darkwebos.vercel.app/ and https://github.com/JazilJafar/Dark-Web-OS"}, {"post_id": 80404, "ts": "2026-10-17T15:23:00Z", "hours": 0.6636, "text": "i completed terminal like other styling still wanted"}, {"post_id": 80361, "ts": "2026-10-17T12:33:08Z", "hours": 0.5253, "text": "completed calculator but not styling i will do it but calculator finished"}, {"post_id": 80327, "ts": "2026-10-17T09:40:48Z", "hours": 0.7217, "text": "comleted calculator html and other etc writing its html is quite difficult"}, {"post_id": 79859, "ts": "2026-10-15T17:13:01Z", "hours": 0.7272, "text": "I am doing calculator of that os"}, {"post_id": 79809, "ts": "2026-10-15T14:36:10Z", "hours": 0.8033, "text": "still doing windows in adjusting its size with apps"}, {"post_id": 79698, "ts": "2026-10-15T03:13:01Z", "hours": 0.2839, "text": "doing windows based operations"}, {"post_id": 79692, "ts": "2026-10-15T02:35:35Z", "hours": 0.2942, "text": "I am doing js after completing some css like click on button os boot"}, {"post_id": 79687, "ts": "2026-10-15T02:05:45Z", "hours": 0.2839, "text": "doing styling for inside icons and etc but not complete"}, {"post_id": 79562, "ts": "2026-10-14T16:38:11Z", "hours": 0.3656, "text": "completed html and doing some css"}, {"post_id": 79557, "ts": "2026-10-14T16:11:43Z", "hours": 0.5519, "text": "I am doing html and adding icons and names and name is Dark Web OS"}]...
|
Title: Dark Web OS by @Jazil | Stardance
Devlogs: Title: Dark Web OS by @Jazil | Stardance
Devlogs:
I am doing html and adding icons and names and name is Dark Web OS
completed html and doing some css
doing styling for inside icons and etc but not complete
I am doing js after completing some css like click on button os boot
doing windows based operations
still doing windows in adjusting its size with apps
I am doing calculator of that os
comleted calculator html and other etc writing its html is quite difficult
completed calculator but not styling i will do it but calculator finished
i completed terminal like other styling still wanted
My web os project is complete take a look at https://darkwebos.vercel.app/ and https://github.com/JazilJafar/Dark-Web-OS
I fixed all bugs in my code and add more stylings
Ships:
I made my WEb OS with on dark theme What i build I build a DARK WEB OS with using javascript,html and css and it have 3 apps like claculator,terminal and a fun web broswer Features I gived it hacker based thmes also like hacalc,hacbrowse and hackterm It do not have password and it is opensoure i gived styling as much i can ab it is cool for me it is wer you can drag and drop and it can maximaze and minmaze I Gived that MIT license so its have copyright what i am proud of I made a web os is the thing that i am proud of and it is made on my mind theme challenges I got challenging while writing responsive to design on min maze and maximaze and draging and also writing html Thank you If you like it please give me a star because i want to get that badge of 15 stars and still i do not get it please give me start...
|
1792857311.120805
|
1792943711.120805
|
|
69559
|
Aperture Website by @GrowSquid | Stardance
|
GrowSquid
|
1
|
11.0
|
11
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-19T06:37:51Z", "hours": 11.0, "multiplier": 1.07, "payout": 11, "blessing": "neutral", "text": "I have created a website in HTML based on Aperture Science’s past; Includes images and working navigation buttons; I couldn’t create a live demo as the images wouldn’t load :( Pls download the source code and run locally", "repo": "https://github.com/GrowSquid/Aperture-Labs-Web", "demo": "https://growsquid.github.io/Aperture-Labs-Web/"}]...
|
[{"post_id": 80892, "ts": "202 [{"post_id": 80892, "ts": "2026-10-19T05:52:52Z", "hours": 1.0936, "text": "FINISHED :) Worked on the image backgrounds and title formats"}, {"post_id": 80593, "ts": "2026-10-18T07:58:33Z", "hours": 3.9286, "text": "Added better formatting,images, and redirected buttons"}, {"post_id": 79790, "ts": "2026-10-15T12:34:28Z", "hours": 3.9139, "text": "Made a skeleton of the website"}, {"post_id": 79408, "ts": "2026-10-13T20:49:23Z", "hours": 1.7469, "text": "Formatting and style comparisons"}]...
|
Title: Aperture Website by @GrowSquid | Stardance
Title: Aperture Website by @GrowSquid | Stardance
Devlogs:
Formatting and style comparisons
Made a skeleton of the website
Added better formatting,images, and redirected buttons
FINISHED :) Worked on the image backgrounds and title formats
Ships:
I have created a website in HTML based on Aperture Science’s past; Includes images and working navigation buttons; I couldn’t create a live demo as the images wouldn’t load :( Pls download the source code and run locally...
|
1792857120.394918
|
1792943520.394918
|
|
56632
|
MiSide VR Mod by @Glitchtest | Stardance
|
Glitchtest
|
1
|
14.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-19T06:07:52Z", "hours": 14.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "MiSide VR is a mod which makes MiSide fully playable in VR with full 6DoF support! It’s not perfect, it still has a couple dozen of bugs, a couple of un-implemented interactions, and a lot of polish before it feels fully native, but nonetheless the full game is comfortably playable in VR. Features: Full 6DoF headset and controller tracking. Roomscale movement and physical turning. (WIP) Configurable snap and smooth turning. IK support (WIP) All effects rendered in VR. Minigames playable in VR with controllers. Left-handed mode and height calibration. Work in progress, but most of the game is playable in VR. Download NOW on Nexus Mods or Github.", "repo": "https://github.com/Glitchtest51/MiSide_VR", "demo": "https://www.nexusmods.com/miside/mods/788"}]...
|
[{"post_id": 80893, "ts": "202 [{"post_id": 80893, "ts": "2026-10-19T05:55:01Z", "hours": 8.9533, "text": "Ready to ship! Mod has been posted to Nexus and Github."}, {"post_id": 72451, "ts": "2026-09-23T00:34:20Z", "hours": 1.4383, "text": "MiSide VR - 100% Complete! I have attached a video of the Hetoor minigame, other than this I had to implement a couple interactions (eg filling sleepy Mita’s kettle), but alas, I was able to beat the game! Currently prepping a 0.9 public release!"}, {"post_id": 71529, "ts": "2026-09-21T00:38:43Z", "hours": 1.0478, "text": "MiSide VR - 55% Complete! Implemented the dummy minigame, realistically I believe the mod is 95% playable, I only have to add a handful of more interactions till fully playable!"}, {"post_id": 67128, "ts": "2026-09-13T06:01:04Z", "hours": 1.7319, "text": "MiSide VR - 40% Complete! The mod is fully playable till the end of Cappie so far!"}, {"post_id": 59119, "ts": "2026-08-31T19:04:04Z", "hours": 0.3533, "text": "VRIK Implemented, you can now control the players arms and hold with items."}, {"post_id": 59024, "ts": "2026-08-31T16:39:43Z", "hours": 0.3125, "text": "VR progress video recorded on August 28th. Will record a longer one later, already implemented newer features."}]...
|
Title: MiSide VR Mod by @Glitchtest | Stardance
D Title: MiSide VR Mod by @Glitchtest | Stardance
Devlogs:
VR progress video recorded on August 28th. Will record a longer one later, already implemented newer features.
VRIK Implemented, you can now control the players arms and hold with items.
MiSide VR - 40% Complete! The mod is fully playable till the end of Cappie so far!
MiSide VR - 55% Complete! Implemented the dummy minigame, realistically I believe the mod is 95% playable, I only have to add a handful of more interactions till fully playable!
MiSide VR - 100% Complete! I have attached a video of the Hetoor minigame, other than this I had to implement a couple interactions (eg filling sleepy Mita’s kettle), but alas, I was able to beat the game! Currently prepping a 0.9 public release!
Ready to ship! Mod has been posted to Nexus and Github.
Ships:
MiSide VR is a mod which makes MiSide fully playable in VR with full 6DoF support! It’s not perfect, it still has a couple dozen of bugs, a couple of un-implemented interactions, and a lot of polish before it feels fully native, but nonetheless the full game is comfortably playable in VR. Features: Full 6DoF headset and controller tracking. Roomscale movement and physical turning. (WIP) Configurable snap and smooth turning. IK support (WIP) All effects rendered in VR. Minigames playable in VR with controllers. Left-handed mode and height calibration. Work in progress, but most of the game is playable in VR. Download NOW on Nexus Mods or Github....
|
1792673310.8531315
|
1792759710.8531315
|
|
46890
|
Relay by @aydinmrnv | Stardance
|
aydinmrnv
|
1
|
25.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-19T06:07:21Z", "hours": 25.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built relay: a tool that lets you create workflows that run on your github actions. You can have a automated workflow that takes a issue ticket to a pull request ready for you to review. It uses your existing ai subscriptions to run the ai agents, and executes the actions in your github repo.", "repo": "https://github.com/aydinmrnv/relay", "demo": "https://relay-olive-omega.vercel.app/"}]...
|
[{"post_id": 80897, "ts": "202 [{"post_id": 80897, "ts": "2026-10-19T06:03:50Z", "hours": 2.1869, "text": "Prepared for shipping the project, cleaned up some bugs, finished the demo wf, and minor changes"}, {"post_id": 76968, "ts": "2026-10-05T07:17:35Z", "hours": 1.8036, "text": "fixed bug where integrations would randomly deauthenticate, added mcp support for linear in codex, and cleaned up some ui elements"}, {"post_id": 76011, "ts": "2026-10-02T01:14:35Z", "hours": 3.8756, "text": "Implemented login with codex, made a demo environment at /play, and added to npm, also fixed bugs on landing page and dashboard"}, {"post_id": 75476, "ts": "2026-09-30T06:25:08Z", "hours": 1.4658, "text": "Integrated auth for integrations allowing users to connect other services to relay"}, {"post_id": 73870, "ts": "2026-09-26T07:08:14Z", "hours": 1.3831, "text": "Fixed worktree manager, updated dashboard ui, cleaned up landing page, and added support for bring your own subscription on codex and claude"}, {"post_id": 73314, "ts": "2026-09-24T20:46:51Z", "hours": 1.6728, "text": "Updated landing page, set up azure vm for cloud workflow runners, and fixed the node workflow builder, and set up clerk authentication"}, {"post_id": 72989, "ts": "2026-09-24T05:37:08Z", "hours": 1.6531, "text": "Developed the web interface for building agentic workflows, fixed linear integration, and added support for bring your own subscription for AI providers"}, {"post_id": 72542, "ts": "2026-09-23T05:23:05Z", "hours": 1.4292, "text": "working on the cross-agent communication, and support for linear tickets"}, {"post_id": 46545, "ts": "2026-08-13T20:57:55Z", "hours": 3.2497, "text": "Added the ability to create a workspace without a ticket, added error logs, fixed pipeline bugs"}, {"post_id": 46154, "ts": "2026-08-13T05:24:30Z", "hours": 1.1706, "text": "Added support for codex harness, and made some changes to the workflows and system level prompt that go to the agents (i also now use relay to work on relay itself sometimes)"}, {"post_id": 46069, "ts": "2026-08-13T00:46:39Z", "hours": 3.6433, "text": "Re designed the CLI UX and updated the review model consistency, i also fixed a bug where it would stay at plan mode and not move on"}, {"post_id": 45586, "ts": "2026-08-12T05:28:34Z", "hours": 1.6531, "text": "I am working on implementing the ai agent harness which will allow users to use their existing claude or codex subscriptions inside of my tool using oAuth link"}]...
|
Title: Relay by @aydinmrnv | Stardance
Devlogs:
I Title: Relay by @aydinmrnv | Stardance
Devlogs:
I am working on implementing the ai agent harness which will allow users to use their existing claude or codex subscriptions inside of my tool using oAuth link
Re designed the CLI UX and updated the review model consistency, i also fixed a bug where it would stay at plan mode and not move on
Added support for codex harness, and made some changes to the workflows and system level prompt that go to the agents (i also now use relay to work on relay itself sometimes)
Added the ability to create a workspace without a ticket, added error logs, fixed pipeline bugs
working on the cross-agent communication, and support for linear tickets
Developed the web interface for building agentic workflows, fixed linear integration, and added support for bring your own subscription for AI providers
Updated landing page, set up azure vm for cloud workflow runners, and fixed the node workflow builder, and set up clerk authentication
Fixed worktree manager, updated dashboard ui, cleaned up landing page, and added support for bring your own subscription on codex and claude
Integrated auth for integrations allowing users to connect other services to relay
Implemented login with codex, made a demo environment at /play, and added to npm, also fixed bugs on landing page and dashboard
fixed bug where integrations would randomly deauthenticate, added mcp support for linear in codex, and cleaned up some ui elements
Prepared for shipping the project, cleaned up some bugs, finished the demo wf, and minor changes
Ships:
I built relay: a tool that lets you create workflows that run on your github actions. You can have a automated workflow that takes a issue ticket to a pull request ready for you to review. It uses your existing ai subscriptions to run the ai agents, and executes the actions in your github repo....
|
1792857279.4077628
|
1792943679.4077628
|
|
51729
|
Nixos Configs by @java | Stardance
|
java
|
1
|
72.98
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-04T04:16:42Z", "hours": 16.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Well, First Ship Java learns how to use nix. The desktop is hyprland The Shell is Noctalia The terminal is kitty I may make things latter on more modular however since nixos is declarative you should just be able to clone the repo and things just work. anyway hope you guys like it.", "repo": "https://github.com/Java-Coffee1/Nix-Config", "demo": "https://github.com/Java-Coffee1/Nix-Config/releases/tag/fw-laptop-btw"}]...
|
[{"post_id": 80901, "ts": "202 [{"post_id": 80901, "ts": "2026-10-19T06:12:06Z", "hours": 8.4625, "text": "I had a bug in my system where old backups were not being remove anyway I have 50gib of jellyfin backups and my homelab was not working anyway its fix now yay"}, {"post_id": 79192, "ts": "2026-10-12T23:35:34Z", "hours": 4.4242, "text": "I added granfana. more things been added to the homelab. we got granfan and treafik montioring"}, {"post_id": 77763, "ts": "2026-10-08T06:13:21Z", "hours": 6.6419, "text": "yay I addded email things as well as polish my configs more. tada i hate stmp but i got it working now"}, {"post_id": 76042, "ts": "2026-10-02T04:55:49Z", "hours": 2.2736, "text": "wow copyparty now I needed to migrate copyparty to be come nix so I did that yay anyway I did it."}, {"post_id": 75951, "ts": "2026-10-01T18:20:39Z", "hours": 7.5422, "text": "added jellyfin. jellyfin sucks. its like I can’t do anything declative and I want to tie it into authentik so I need to use ldap so I set that and its just like no u can’t set it declatvie. so I have to do it via the ui. anyway here a pic of what I have done now"}, {"post_id": 72987, "ts": "2026-09-24T05:25:49Z", "hours": 3.2997, "text": "yay I added some backups scirpts I also mount my truenas to my machine. this is for my homelab but it is still part of my nix configs"}, {"post_id": 72799, "ts": "2026-09-23T19:14:12Z", "hours": 3.9972, "text": "hmmm I added authtink and a postgress database"}, {"post_id": 72559, "ts": "2026-09-23T06:58:14Z", "hours": 4.4831, "text": "Well I added more things such as a postgress and treafik as well anyway here I go and try building things. yay"}, {"post_id": 72101, "ts": "2026-09-22T05:23:19Z", "hours": 15.8539, "text": "well I re arrange things and now I am turning my nixconfigs to mannag my homlab as well"}, {"post_id": 61286, "ts": "2026-09-04T04:12:14Z", "hours": 1.4633, "text": "Well here I am…. nix is hard but I love how delcative it is. most of the time I spend is reading the wiki and learning how to config things which is fun. I rearrage files and I also was able to config the look and feel of things for me."}, {"post_id": 60052, "ts": "2026-09-02T05:03:31Z", "hours": 5.0036, "text": "So… I am using noclalia right now and hyprland I am not sure if I want to switch to nir as I don’t like the creator of hyprland hower it looks nice I think and this is declarative which is nice."}, {"post_id": 56528, "ts": "2026-08-28T10:09:27Z", "hours": 9.7361, "text": "javi learns how to rice there linux desktop… anyway here I am learning how to rice my linux desktop. this is what I have gotten so far I have been just playing around with the waybar learning how the code works as well as nix. nothing is fancy however it’s been 8 hours so I think Im learning things idk I am using less ai so I think that progress"}]...
|
Title: Nixos Configs by @java | Stardance
Devlogs Title: Nixos Configs by @java | Stardance
Devlogs:
javi learns how to rice there linux desktop… anyway here I am learning how to rice my linux desktop. this is what I have gotten so far I have been just playing around with the waybar learning how the code works as well as nix. nothing is fancy however it’s been 8 hours so I think Im learning things idk I am using less ai so I think that progress
So… I am using noclalia right now and hyprland I am not sure if I want to switch to nir as I don’t like the creator of hyprland hower it looks nice I think and this is declarative which is nice.
Well here I am…. nix is hard but I love how delcative it is. most of the time I spend is reading the wiki and learning how to config things which is fun. I rearrage files and I also was able to config the look and feel of things for me.
well I re arrange things and now I am turning my nixconfigs to mannag my homlab as well
Well I added more things such as a postgress and treafik as well anyway here I go and try building things. yay
hmmm I added authtink and a postgress database
yay I added some backups scirpts I also mount my truenas to my machine. this is for my homelab but it is still part of my nix configs
added jellyfin. jellyfin sucks. its like I can’t do anything declative and I want to tie it into authentik so I need to use ldap so I set that and its just like no u can’t set it declatvie. so I have to do it via the ui. anyway here a pic of what I have done now
wow copyparty now I needed to migrate copyparty to be come nix so I did that yay anyway I did it.
yay I addded email things as well as polish my configs more. tada i hate stmp but i got it working now
I added granfana. more things been added to the homelab. we got granfan and treafik montioring
I had a bug in my system where old backups were not being remove anyway I have 50gib of jellyfin backups and my homelab was not working anyway its fix now yay
Ships:
Well, First Ship Java learns how to use nix. The desktop is hyprland The Shell is Noctalia The terminal is kitty I may make things latter on more modular however since nixos is declarative you should just be able to clone the repo and things just work. anyway hope you guys like it....
|
1792817653.8847084
|
1792904053.8847084
|
|
27442
|
StorageStandby by @james-lian | Stardance
|
james-lian
|
0
|
107.48
|
0
|
[]
|
[{"post_id": 80904, "ts": "202 [{"post_id": 80904, "ts": "2026-10-19T06:34:50Z", "hours": 10.0353, "text": "Devlog #14: sync.tsx page, Cloud Assignments, QoL features UI/UX implementation is a slow but steady WIP. Add directory tree dialog A QoL feature that, when the user clicks a folder in folders.tsx, displays the folder’s subdirectories and shows which paths are affected by the IgnoreRules prop. sync.tsx page The layout of the sync.tsx page is mostly finished! It contains three tables: Current jobs (displays what is being currently uploaded) Pending cloud assignments (new remote locations assigned by the user for a folder, or “removal” assignments issued by the user to remove a folder from a specific remote location) Upcoming sync queue (table that displays the modifications and updates that will be applied to folders that already have existing remote locations) PendingChanges display dialog A table that shows the user the list of edits made to the folder or the folder’s subdirectories, in order. It displays the tracked information from the FileSystemWatcher API. SyncFrequency input dialog An input dialog that allows the user to set how frequently they want a folder to be synced. Includes Daily, Weekly, Monthly, and an “Inactive” option."}, {"post_id": 79761, "ts": "2026-10-15T09:23:14Z", "hours": 8.1225, "text": "Devlog #13: UI/UX Implementation (WIP) With the backend functionality (mostly) complete, I’ve been working on implementing a smooth and easy-to-use user interface. Added system tray icon I added a system tray icon to allow the user to easily relaunch the UI while the backend continuously runs in the background. Cloud-folder assignment combobox + two-stage assignment system Instead of one-shotting everything, there’s now a two-stage system to cloud assignment. When a user adds a cloud to a folder, it first is added to UserAssignedClouds. During the next synchronization, the service will: check UserAssignedClouds upload the folder to the remote locations in those clouds move the clouds from UserAssignedClouds to AssignedClouds (this way, we know where the folder currently exists at) Add an IgnoreRules editor for WatchedFolders I had previously coded an ignore rules popup with a visual and raw rules editor, and I implemented it today specifically for WatchedFolders. The user can now set ignore rule globs (according to VS Code glob rules: https://code.visualstudio.com/docs/editor/glob-patterns ) to give themselves more control over what the service syncs and what it doesn’t. Miscellaneous UI improvements + functionalities completed folders.tsx page added web hook listener in WebView2 to natively open File Explorer for folders redid the styling for the sync.tsx page (still a WIP) Fix Dropbox/OneDrive OAuth triggers and revocations There were previously issues with the Dropbox (wrong redirectURI) and OneDrive (wrong OAuth consumer link) flows that I fixed after some testing. Everything regarding different accounts should work 100%!"}, {"post_id": 79374, "ts": "2026-10-13T18:24:46Z", "hours": 10.21, "text": "Devlog #12: Architectural Cleanup Dropbox and OneDrive providers are complete I reused the same overall logic for the Google Drive provider to write code for the Dropbox and OneDrive providers. I’m using the .NET REST APIs for both to handle file chunking and uploads automatically. Implement PKCE for all provider OAuth2 flows for better security To enhance the security of the OAuth2 process from a local desktop app like mine, I’ve implemented the PKCE security extension for all providers, to prevent authorization code interception and injection. Resolve Architectural Drift Over the development of this app, I’ve been continually implementing new ideas and removing what hasn’t worked. Eventually, it got to a point where I had thousands of lines of redundant or mismatched code for the sync engine, redundant features laying in my scripts that were no longer planned or used, and many redundant properties for the database schemas as well. Overall I was losing track of my original vision and goals, and development was becoming increasingly slow and stressful. To help me get out of this development rut, I turned to AI. Specifically, here was a portion of my prompt to Github Copilot: Please do the following: 1. Analyze my code to figure out the current architecture 2. Identify: a) areas of weakness b) inconsistencies c) what doesn't work, dead code, etc. 3. Ask me necessary questions needed to clear up any design (or for us to figure out the system architecture together) Finally, only help me fix any issues in the code once we have a clear idea of everything (and I give you the go ahead). Over the next day, I went over each of the identified errors or weaknesses one-by-one with the AI. It helped me pinpoint exactly the areas of my code that needed work, and I used it to successfully reintegrated the code with my original vision. Note: I use ‘cloud’ to refer to a provider-account pair. For example, a Google Drive provider with a specific email is one cloud. A different cloud would be the same provider but a different email, or a different provider altogether. Here’s a breakdown of what I did: Remove architectural drift, abandoned code, and unused features (e.g. GlobalIgnoreRules, automatic destination selection, FileSyncRecord and FolderSyncRecord) Implement a new-cloud bootstrap (when the user uploads stuff to a new cloud, perform a bootstrap operation to create all existing files and folders) Implement destructive cloud removal for when the user removes a cloud assignment Add pre-sync validation (reject missing local roots, reject invalid assignments) Make Watcher queuing reliable (detect unmonitored changes, etc.)"}, {"post_id": 71733, "ts": "2026-09-21T12:36:01Z", "hours": 10.1264, "text": "Devlog #11: Cloud Provider File Actions 2 (WIP) Google Drive Cloud Provider Actions Complete Since the last devlog, I’ve successfully completed the logic required to sync files and folders to Google Drive accounts using the Google Drive .NET REST API. Using the .NET REST API involves first building a drive client service object, through which you’ll use to interact with the REST API for actions like uploading files or deleting them. The logic is written to keep an exact carbon copy of the local version of any watched folders on the cloud. It does so by storing a queue of all of the changes a user makes to a folder and its children, and automatically ignores any conflicting changes from FileSystemWatcher that could be simplified (e.g. if a user changes an item before deleting it, we can just delete it instead of first updating the changed file AND THEN deleting it). As the REST API does not support uploading multiple items or entire folders, every file is uploaded one-by-one via a stream. All cloud items are tracked not by their cloud IDs, but rather through their hierarchical relationship with the overarching folder parent (WatchedFolder). Google OAuth2 Flows Since the drive client service is created via access tokens (which expire), there’s a very real possibility of our cached access token expiring in the middle of an operation. Thus, I decided to use the Google OAuth2 Flows library to automatically refresh the access token when it expires. Microsoft Graph and Dropbox File APIs (WIP) The Microsoft Graph and Dropbox File Action APIs should follow mostly the same high-level structure as before, with minor changes made to accommodate differences in how each of the APIs work. Microsoft OAuth2 access token expiry handling With the Microsoft API, I instead implemented a custom class TokenManagerAccessTokenProvider which inherits from IAccessTokenprovider, before passing this into building the GraphServiceClient."}, {"post_id": 65732, "ts": "2026-09-11T02:23:47Z", "hours": 8.4417, "text": "Devlog #10: Cloud Provider File Actions (WIP) Currently working on the cloud provider services API of my backend, making file actions such as uploading files from the local filesystem to a cloud provider (Google Drive, OneDrive, Dropbox) possible. Cloud Provider Services (WIP) I recently just implemented the OAuth process for Microsoft Entra/Graph in order to access the Microsoft OneDrive API, which differs quite significantly from the Google Cloud OAuth process for Google Drive API, despite the fact that both services use the OAuth2.0 protocol. For one, Google uses centralized endpoints and the unified Cloud dashboard to manage desktop apps that require access to Google user information. Microsoft uses their identity platform (Microsoft Entra UID) with endpoints that can be multi- or single-tenant. The actual scopes where the REST APIs for Microsoft OneDrive and other services resides in Microsoft Graph. Implemented Glob Processing + Ignore Rules for FileSystemWatcher In my application, the user can implement ignore rules for specific folders, allowing the application to prevent any matching files or folders from being monitored and uploaded to the cloud. The specific glob rules I referenced come from the VS Code docs: https://code.visualstudio.com/docs/editor/glob-patterns Essentially, I have a collection of methods that parse the glob and turn it into a regex, which I can confirm is a match with a specific path through Regex.IsMatch()."}, {"post_id": 64456, "ts": "2026-09-08T21:06:25Z", "hours": 8.4975, "text": "Devlog #9: FileSystem Events I’ve been spending some time reworking and polishing the logic and database schemas that allows the OS to monitor changes made to WatchedFolders through the FileSystemWatcher class. Handling FileSystem Events Here’s the current rundown of how my program monitors for filesystem events (e.g. file created, deleted, renamed, moved, or changed) filesystem event -> record the change in a database queue -> return When a scheduled backup runs, the program reads the queue and the associated changes made to each file/folder, and then updates the corresponding item in the cloud. scheduled backup -> read queued changes -> check whether the file still exists -> wait/retry if it is locked -> upload the latest version -> remove the queue item/mark as complete I’ve also made edits to the OnFileRenamedEvent() to differentiate between renames and moves, which both use the “Renamed” event. PendingSyncItem This will be a SQLite table that stores pending sync actions upon being handled by the event handler. The PendingSyncItem works in a simple way for both files and folders. It tracks five types of boolean events props in terms of cascading importance. Multiple event props can be true. Deleted - the most important event prop. If this prop is true, all other event props are skipped (as they matter not if the file was deleted). A deleted API request will be sent to the corresponding REST API. Moved - creates the file if the file did not previously exist. References the string OriginalLocalPath. Renamed - sends a rename API request. Changed - finds the existing file in the cloud and updates the file. Created - creates a new file. If a file was Created, Deleted, and then Created, two PendingSyncItems will be created. The first one will be overlooked as the Deleted prop is true."}, {"post_id": 58424, "ts": "2026-08-30T20:39:10Z", "hours": 9.1125, "text": "Devlog #8 Database schemas + API planning I’ve mostly been working on database schemas and models since the last devlog, and I’ve created APIs to allow the frontend to access this information from the database as well. A lot of systems design work has been going on in the background. As I’m still a beginner to such concepts, a lot of rewriting code has also been going on in the background! To be honest, progress has slowed since I’ve been splitting myself between working on the frontend and backend. I often find myself getting a bit stuck or lost in what’s happening. I think I’ll work on completely finishing one thing before moving onto the next for the next devlog. Below are snippets of what I’ve been working on, including API methods for the frontend, the API endpoints for the backend, and some peeks at some of the changes I’ve made to existing models/new models that I’ve created. FileSystemWatcher I’ll be using the built-in C# FileSystemWatcher in order to track which files and folders the user has made changes to. The alternative is polling for these changes on-demand (e.g. checking the folder’s “Last-Modified” date). However, the problem with such an approach is that Windows does not automatically update a folder’s “Last Modified” date exactly when a file inside that folder is changed. Thus, to confirm whether any changes actually occurred to a folder or not, the program would have to poll ALL subdirectories and files, which could be performance-intensive. On the other hand, FileSystemWatcher is an abstraction over OS-level kernel APIs. The kernel itself registers a listener on an attached folder when FileSystemWatcher is used. Thus it is very efficient and much more accurate than polling a folder’s properties."}, {"post_id": 52774, "ts": "2026-08-23T03:44:40Z", "hours": 9.5183, "text": "Devlog #7 API errors fixed - OAuth now works 100% In my specific architecture, API calls from frontend to backend work like so: fetch() call from Vite frontend --> intercepted by WPF WebService2 middleware shell --> forwards down NamedPipe --> received by Kestrel (cross-platform web server) on the ASP.NET Core C# backend. For the longest time, I just couldn’t get API calls from the frontend to reach the backend. I would always end up with a TypeError: failed to fetch() , which, as I found out, could mean a lot of things. Initially, I thought it was a CORS issue with the backend. I added builder.Services.AddCors() to allow cross-origin requests, and also adjusted the content-headers included with the fetch() request on the frontend, but I still experienced the same issue. Eventually, I discovered that it was a CORS issue with the MIDDLEWARE. It turns out after the WPF WebView2 shell forwards the fetch() request down the NamedPipe and retrieves a response from the backend, it actually creates a new web request to return it to the frontend with createWebResourceRequest(). This new response DOESN’T COPY the CORS headers from the backend, meaning the Access-Control-Allow-Origin header was missing from the response despite the backend returning a 200 OK status code. This blocks the frontend from reading the response, and a generic TypeError: Failed to fetch is thrown. Since the desktop app is essentially a proxy/interceptor - it’s creating its own HTTP response, so it needs to handle CORS headers itself. I was also missing an OPTIONS preflight responder on the backend, so I added that in as well. Listener callback dynamic port access When OAuth is requested from the frontend to the backend, the backend adds a listener to the provider’s OAuth function call. This way, say when the user completes Google’s OAuth process, Google redirects to our listener url, and we can display a Success page to the user. I had a minor logic error in my listener callback implementation where the same port was always used, even if it was unavailable. For this reason, if the user were to leave the OAuth page and retry the OAuth process, they would encounter an error if the listener was still not cleaned up. I implemented a dynamic port searcher to automatically serve the user a port that was free and unused. Implementing EF Core Backend System and FileSystem schemas I’m currently planning to implement the core of the backend functionality, which is to monitor file changes occuring to “watched” folders and upload them asynchronously and autonomously to providers the user has signed into. A great way I’ve found to map out future app functionality is to map out schemas for anything that needs to be stored locally. Currently, I’m working on schemas for SystemSettings , SyncEvents , and FileSystemWatcherWorker . Below is a short overview of the current basic features of the app, including OAuth account management + a notification/error-logging system."}, {"post_id": 49724, "ts": "2026-08-18T17:09:33Z", "hours": 9.7303, "text": "Devlog #6 These past days I’ve been focused on cleaning up the auth code and setting up frontend-backend communication. IScopeFactory - Singletons and Scoped Objects .NET (modern C#) features native dependency injection, where abstractions can be mapped directly to a class, in order to allow that class to receive its required objects from an external source in a more efficient and cleaner manner. In ASP.NET Core C#, you can register classes as a couple of different types of services to be injected into other classes. I mainly use singletons and scoped objects. Singletons, like their name suggests, are long-lived classes, of which a single instance exists throughout the application’s lifecycle. By contrast, scoped objects are created once per client request before being destroyed. The problem is that when you use dependency injection, you cannot inject a shorter-lifespan class into a longer-lifespan class (e.g. a scoped into a singleton). This necessitates the use of IServiceScopeFactory to automatically manage the lifetimes of these child classes. Thread-Safe Singletons By default, the System.Collections.Generic library in C# is NOT threadsafe. That means that, if multiple scoped objects or singletons access the same Dictionary, that could throw an error. Thus, I switched them out for ConcurrentDictionaries throughout my app. Multi-Account Functionality Integration I further integrated functionality that allows my app to store MULTIPLE accounts per provider (e.g. 3 OneDrive accounts, 4 Google Drive accounts). This required refactoring the CloudToken object to include a new AccountId prop, retrieving that prop from the OAuth2.0 protocol, and rewriting some logic in TokenManager to include AccountId validity checks. RevokeOAuthSync I added a method to revoke OAuth by terminating the refresh and access tokens using the revoke OAuth2.0 endpoint. Frontend-Backend Communication With the basics of the auth protocol API and TokenManager API setup, I’ve begun attempting to facilitate API calls between the React Vite frontend and the ASP.NET Core C# backend. It’s still a WIP, but things are moving! I also added some additional UI to allow the user to select and manage their accounts on different providers."}, {"post_id": 44606, "ts": "2026-08-10T14:23:16Z", "hours": 9.9117, "text": "Devlog #5 I’m currently on vacation, but I’m trying to stay productive by working on some software projects. OAuth2.0 Token Management + EF Core SQLite Setup + HTTPClient/DPAPI The past few days, I’ve been working on setting up some basic OAuth functionality for Google and Google Drive. I thought it would be very simple at first, but perhaps since I’m new to C# and on vacation, it took me a bit to get used to the C#/ASP.NET features and development patterns, such as dependency injection. Additionally, there’s plenty more to using OAuth 2.0 that I was not aware of at first. Step 1) involved acquiring ClientId and Clientsecret values from the Google Dev Console page. These were stored in User Secrets in Visual Studio along with the project. For desktop clients, clients use the provider’s OAuth API link to apply for a long-lived Refresh Token . This Refresh Token, once encrypted and stored securely, is used to continuously request for short-lived Access Tokens, which is what is actually used for Google’s API services, like the Google Drive API. Encryption was setup using the .NET data protection API, DPAPI. I created two classes: a GoogleDriveProvider to manage Google-specific OAuth setup and Drive API calls, and a generic TokenManager that handles the refresh-access token exchange for all OAuth-related providers, including ones I will add in the future such as OneDrive and Dropbox. For the HTTPClients used to make the web requests, I decided to add an HTTPClient to GoogleDriveProvider using builder.Services.AddHttpClient(). Finally, all pertinent information to the app is stored within an SQLite database using EF Core. Refresh Tokens are stored within an object called CloudTokens. I have the basic functionality for the OAuth setup, so my next steps will just be to test it out and debug for any errors. Below are some snapshots from the code I wrote."}, {"post_id": 22395, "ts": "2026-07-04T21:13:39Z", "hours": 0.7128, "text": "Devlog #4 WPF WebView2 Setup Succeeded in porting (?) the Vite frontend to Wpf WebView2! I’m just happy it works now. There was an issue with the Configuration Manager/build setup, where WebView2 turned out to be incompatible with the Any CPU build, and so I had to convert the solution to an x64 platform build, which works out since that’s what I intended to do in the first place. For now, the source of the WebView2 WPF frame is just a localhost url. When prod version comes out, I’ll be bundling a folder containing the Vite frontend along with the app, which will then become the new source."}, {"post_id": 22311, "ts": "2026-07-04T18:25:04Z", "hours": 5.5144, "text": "Devlog #3 React Vite UI work I’ve finished the skeleton and main UI features of my frontend Vite app (unfortunately took longer than expected). Nothing actually works cause it’s just a frontend for now. I added… A dashboard page (for quickly viewing information about cloud providers and storage quotas) A folders & files page (for “staging” folders and files for autonomous backups in the background) A sync page (for pausing/starting sync) A timeline page (for viewing sync events and chronology) A link services page (for linking accounts from different cloud providers) An about page No functionality actually exists yet as it’s just for planning. I’ll be implementing the backend next and the WebView2 functionality, before establishing communication between the frontend and backend via Windows pipes."}, {"post_id": 19314, "ts": "2026-06-30T16:16:14Z", "hours": 3.2725, "text": "Devlog #2 React Vite + WebView2 + ASP.NET Core C# transition I’m in the middle of transitioning from a Winforms + Windows Service backend architecture to a decoupled C# ASP.NET Web Service + React Vite frontend with WebView2. WebView2 allows developers to embed web content (HTML/CSS/JS) directly into native Windows apps. I considered using Electron, but WebView2 is widely seen as more performant as it uses the Chromium runtime already built into Windows, as opposed to Electron which bundles a SEPARATE instance of Chromium and Node.js into every app, resulting in a large footprint. I’ve redone the UI in Vite and setup the basic ASP.NET endpoints using pipes. The next steps would be to finalize a good-looking UI and create the WPF project that would host the WebView capabilities."}, {"post_id": 18774, "ts": "2026-06-29T23:48:42Z", "hours": 4.2747, "text": "Devlog #1 Basic Winforms UI Setup a basic UI in Winforms, which took longer than I thought. Unforunately, at the time I started this project, I didn’t know about the possibilities of a ASP.NET + React setup. I wanted to avoid Electron due to the heavy resource consumption, but since the possibility of using WebView2 exists for me now, I might transition to that soon. I just don’t mesh very well with Winforms…"}]...
|
Title: StorageStandby by @james-lian | Stardance
Title: StorageStandby by @james-lian | Stardance
Devlogs:
Devlog #1 Basic Winforms UI Setup a basic UI in Winforms, which took longer than I thought. Unforunately, at the time I started this project, I didn’t know about the possibilities of a ASP.NET + React setup. I wanted to avoid Electron due to the heavy resource consumption, but since the possibility of using WebView2 exists for me now, I might transition to that soon. I just don’t mesh very well with Winforms…
Devlog #2 React Vite + WebView2 + ASP.NET Core C# transition I’m in the middle of transitioning from a Winforms + Windows Service backend architecture to a decoupled C# ASP.NET Web Service + React Vite frontend with WebView2. WebView2 allows developers to embed web content (HTML/CSS/JS) directly into native Windows apps. I considered using Electron, but WebView2 is widely seen as more performant as it uses the Chromium runtime already built into Windows, as opposed to Electron which bundles a SEPARATE instance of Chromium and Node.js into every app, resulting in a large footprint. I’ve redone the UI in Vite and setup the basic ASP.NET endpoints using pipes. The next steps would be to finalize a good-looking UI and create the WPF project that would host the WebView capabilities.
Devlog #3 React Vite UI work I’ve finished the skeleton and main UI features of my frontend Vite app (unfortunately took longer than expected). Nothing actually works cause it’s just a frontend for now. I added… A dashboard page (for quickly viewing information about cloud providers and storage quotas) A folders & files page (for “staging” folders and files for autonomous backups in the background) A sync page (for pausing/starting sync) A timeline page (for viewing sync events and chronology) A link services page (for linking accounts from different cloud providers) An about page No functionality actually exists yet as it’s just for planning. I’ll be implementing the backend next and the WebView2 functionality, before establishing communication between the frontend and backend via Windows pipes.
Devlog #4 WPF WebView2 Setup Succeeded in porting (?) the Vite frontend to Wpf WebView2! I’m just happy it works now. There was an issue with the Configuration Manager/build setup, where WebView2 turned out to be incompatible with the Any CPU build, and so I had to convert the solution to an x64 platform build, which works out since that’s what I intended to do in the first place. For now, the source of the WebView2 WPF frame is just a localhost url. When prod version comes out, I’ll be bundling a folder containing the Vite frontend along with the app, which will then become the new source.
Devlog #5 I’m currently on vacation, but I’m trying to stay productive by working on some software projects. OAuth2.0 Token Management + EF Core SQLite Setup + HTTPClient/DPAPI The past few days, I’ve been working on setting up some basic OAuth functionality for Google and Google Drive. I thought it would be very simple at first, but perhaps since I’m new to C# and on vacation, it took me a bit to get used to the C#/ASP.NET features and development patterns, such as dependency injection. Additionally, there’s plenty more to using OAuth 2.0 that I was not aware of at first. Step 1) involved acquiring ClientId and Clientsecret values from the Google Dev Console page. These were stored in User Secrets in Visual Studio along with the project. For desktop clients, clients use the provider’s OAuth API link to apply for a long-lived Refresh Token . This Refresh Token, once encrypted and stored securely, is used to continuously request for short-lived Access Tokens, which is what is actually used for Google’s API services, like the Google Drive API. Encryption was setup using the .NET data protection API, DPAPI. I created two classes: a GoogleDriveProvider to manage Google-specific OAuth setup and Drive API calls, and a generic TokenManager that handles the refresh-access token exchange for all OAuth-related providers, including ones I will add in the future such as OneDrive and Dropbox. For the HTTPClients used to make the web requests, I decided to add an HTTPClient to GoogleDriveProvider using builder.Services.AddHttpClient(). Finally, all pertinent information to the app is stored within an SQLite database using EF Core. Refresh Tokens are stored within an object called CloudTokens. I have the basic functionality for the OAuth setup, so my next steps will just be to test it out and debug for any errors. Below are some snapshots from the code I wrote.
Devlog #6 These past days I’ve been focused on cleaning up the auth code and setting up frontend-backend communication. IScopeFactory - Singletons and Scoped Objects .NET (modern C#) features native dependency injection, where abstractions can be mapped directly to a class, in order to allow that class to receive its required objects from an external source in a more efficient and cleaner manner. In ASP.NET Core C#, you can register classes as a couple of different types of services to be injected into other classes. I mainly use singletons and scoped objects. Singletons, like their name suggests, are long-lived classes, of which a single instance exists throughout the application’s lifecycle. By contrast, scoped objects are created once per client request before being destroyed. The problem is that when you use dependency injection, you cannot inject a shorter-lifespan class into a longer-lifespan class (e.g. a scoped into a singleton). This necessitates the use of IServiceScopeFactory to automatically manage the lifetimes of these child classes. Thread-Safe Singletons By default, the System.Collections.Generic library in C# is NOT threadsafe. That means that, if multiple scoped objects or singletons access the same Dictionary, that could throw an error. Thus, I switched them out for ConcurrentDictionaries throughout my app. Multi-Account Functionality Integration I further integrated functionality that allows my app to store MULTIPLE accounts per provider (e.g. 3 OneDrive accounts, 4 Google Drive accounts). This required refactoring the CloudToken object to include a new AccountId prop, retrieving that prop from the OAuth2.0 protocol, and rewriting some logic in TokenManager to include AccountId validity checks. RevokeOAuthSync I added a method to revoke OAuth by terminating the refresh and access tokens using the revoke OAuth2.0 endpoint. Frontend-Backend Communication With the basics of the auth protocol API and TokenManager API setup, I’ve begun attempting to facilitate API calls between the React Vite frontend and the ASP.NET Core C# backend. It’s still a WIP, but things are moving! I also added some additional UI to allow the user to select and manage their accounts on different providers.
Devlog #7 API errors fixed - OAuth now works 100% In my specific architecture, API calls from frontend to backend work like so: fetch() call from Vite frontend --> intercepted by WPF WebService2 middleware shell --> forwards down NamedPipe --> received by Kestrel (cross-platform web server) on the ASP.NET Core C# backend. For the longest time, I just couldn’t get API calls from the frontend to reach the backend. I would always end up with a TypeError: failed to fetch() , which, as I found out, could mean a lot of things. Initially, I thought it was a CORS issue with the backend. I added builder.Services.AddCors() to allow cross-origin requests, and also adjusted the content-headers included with the fetch() request on the frontend, but I still experienced the same issue. Eventually, I discovered that it was a CORS issue with the MIDDLEWARE. It turns out after the WPF WebView2 shell forwards the fetch() request down the NamedPipe and retrieves a response from the backend, it actually creates a new web request to return it to the frontend with createWebResourceRequest(). This new response DOESN’T COPY the CORS headers from the backend, meaning the Access-Control-Allow-Origin header was missing from the response despite the backend returning a 200 OK status code. This blocks the frontend from reading the response, and a generic TypeError: Failed to fetch is thrown. Since the desktop app is essentially a proxy/interceptor - it’s creating its own HTTP response, so it needs to handle CORS headers itself. I was also missing an OPTIONS preflight responder on the backend, so I added that in as well. Listener callback dynamic port access When OAuth is requested from the frontend to the backend, the backend adds a listener to the provider’s OAuth function call. This way, say when the user completes Google’s OAuth process, Google redirects to our listener url, and we can display a Success page to the user. I had a minor logic error in my listener callback implementation where the same port was always used, even if it was unavailable. For this reason, if the user were to leave the OAuth page and retry the OAuth process, they would encounter an error if the listener was still not cleaned up. I implemented a dynamic port searcher to automatically serve the user a port that was free and unused. Implementing EF Core Backend System and FileSystem schemas I’m currently planning to implement the core of the backend functionality, which is to monitor file changes occuring to “watched” folders and upload them asynchronously and autonomously to providers the user has signed into. A great way I’ve found to map out future app functionality is to map out schemas for anything that needs to be stored locally. Currently, I’m working on schemas for SystemSettings , SyncEvents , and FileSystemWatcherWorker . Below is a short overview of the current basic features of the app, including OAuth account management + a notification/error-logging system.
Devlog #8 Database schemas + API planning I’ve mostly been working on database schemas and models since the last devlog, and I’ve created APIs to allow the frontend to access this information from the database as well. A lot of systems design work has been going on in the background. As I’m still a beginner to such concepts, a lot of rewriting code has also been going on in the background! To be honest, progress has slowed since I’ve been splitting myself between working on the frontend and backend. I often find myself getting a bit stuck or lost in what’s happening. I think I’ll work on completely finishing one thing before moving onto the next for the next devlog. Below are snippets of what I’ve been working on, including API methods for the frontend, the API endpoints for the backend, and some peeks at some of the changes I’ve made to existing models/new models that I’ve created. FileSystemWatcher I’ll be using the built-in C# FileSystemWatcher in order to track which files and folders the user has made changes to. The alternative is polling for these changes on-demand (e.g. checking the folder’s “Last-Modified” date). However, the problem with such an approach is that Windows does not automatically update a folder’s “Last Modified” date exactly when a file inside that folder is changed. Thus, to confirm whether any changes actually occurred to a folder or not, the program would have to poll ALL subdirectories and files, which could be performance-intensive. On the other hand, FileSystemWatcher is an abstraction over OS-level kernel APIs. The kernel itself registers a listener on an attached folder when FileSystemWatcher is used. Thus it is very efficient and much more accurate than polling a folder’s properties.
Devlog #9: FileSystem Events I’ve been spending some time reworking and polishing the logic and database schemas that allows the OS to monitor changes made to WatchedFolders through the FileSystemWatcher class. Handling FileSystem Events Here’s the current rundown of how my program monitors for filesystem events (e.g. file created, deleted, renamed, moved, or changed) filesystem event -> record the change in a database queue -> return When a scheduled backup runs, the program reads the queue and the associated changes made to each file/folder, and then updates the corresponding item in the cloud. scheduled backup -> read queued changes -> check whether the file still exists -> wait/retry if it is locked -> upload the latest version -> remove the queue item/mark as complete I’ve also made edits to the OnFileRenamedEvent() to differentiate between renames and moves, which both use the “Renamed” event. PendingSyncItem This will be a SQLite table that stores pending sync actions upon being handled by the event handler. The PendingSyncItem works in a simple way for both files and folders. It tracks five types of boolean events props in terms of cascading importance. Multiple event props can be true. Deleted - the most important event prop. If this prop is true, all other event props are skipped (as they matter not if the file was deleted). A deleted API request will be sent to the corresponding REST API. Moved - creates the file if the file did not previously exist. References the string OriginalLocalPath. Renamed - sends a rename API request. Changed - finds the existing file in the cloud and updates the file. Created - creates a new file. If a file was Created, Deleted, and then Created, two PendingSyncItems will be created. The first one will be overlooked as the Deleted prop is true.
Devlog #10: Cloud Provider File Actions (WIP) Currently working on the cloud provider services API of my backend, making file actions such as uploading files from the local filesystem to a cloud provider (Google Drive, OneDrive, Dropbox) possible. Cloud Provider Services (WIP) I recently just implemented the OAuth process for Microsoft Entra/Graph in order to access the Microsoft OneDrive API, which differs quite significantly from the Google Cloud OAuth process for Google Drive API, despite the fact that both services use the OAuth2.0 protocol. For one, Google uses centralized endpoints and the unified Cloud dashboard to manage desktop apps that require access to Google user information. Microsoft uses their identity platform (Microsoft Entra UID) with endpoints that can be multi- or single-tenant. The actual scopes where the REST APIs for Microsoft OneDrive and other services resides in Microsoft Graph. Implemented Glob Processing + Ignore Rules for FileSystemWatcher In my application, the user can implement ignore rules for specific folders, allowing the application to prevent any matching files or folders from being monitored and uploaded to the cloud. The specific glob rules I referenced come from the VS Code docs: https://code.visualstudio.com/docs/editor/glob-patterns Essentially, I have a collection of methods that parse the glob and turn it into a regex, which I can confirm is a match with a specific path through Regex.IsMatch().
Devlog #11: Cloud Provider File Actions 2 (WIP) Google Drive Cloud Provider Actions Complete Since the last devlog, I’ve successfully completed the logic required to sync files and folders to Google Drive accounts using the Google Drive .NET REST API. Using the .NET REST API involves first building a drive client service object, through which you’ll use to interact with the REST API for actions like uploading files or deleting them. The logic is written to keep an exact carbon copy of the local version of any watched folders on the cloud. It does so by storing a queue of all of the changes a user makes to a folder and its children, and automatically ignores any conflicting changes from FileSystemWatcher that could be simplified (e.g. if a user changes an item before deleting it, we can just delete it instead of first updating the changed file AND THEN deleting it). As the REST API does not support uploading multiple items or entire folders, every file is uploaded one-by-one via a stream. All cloud items are tracked not by their cloud IDs, but rather through their hierarchical relationship with the overarching folder parent (WatchedFolder). Google OAuth2 Flows Since the drive client service is created via access tokens (which expire), there’s a very real possibility of our cached access token expiring in the middle of an operation. Thus, I decided to use the Google OAuth2 Flows library to automatically refresh the access token when it expires. Microsoft Graph and Dropbox File APIs (WIP) The Microsoft Graph and Dropbox File Action APIs should follow mostly the same high-level structure as before, with minor changes made to accommodate differences in how each of the APIs work. Microsoft OAuth2 access token expiry handling With the Microsoft API, I instead implemented a custom class TokenManagerAccessTokenProvider which inherits from IAccessTokenprovider, before passing this into building the GraphServiceClient.
Devlog #12: Architectural Cleanup Dropbox and OneDrive providers are complete I reused the same overall logic for the Google Drive provider to write code for the Dropbox and OneDrive providers. I’m using the .NET REST APIs for both to handle file chunking and uploads automatically. Implement PKCE for all provider OAuth2 flows for better security To enhance the security of the OAuth2 process from a local desktop app like mine, I’ve implemented the PKCE security extension for all providers, to prevent authorization code interception and injection. Resolve Architectural Drift Over the development of this app, I’ve been continually implementing new ideas and removing what hasn’t worked. Eventually, it got to a point where I had thousands of lines of redundant or mismatched code for the sync engine, redundant features laying in my scripts that were no longer planned or used, and many redundant properties for the database schemas as well. Overall I was losing track of my original vision and goals, and development was becoming increasingly slow and stressful. To help me get out of this development rut, I turned to AI. Specifically, here was a portion of my prompt to Github Copilot: Please do the following: 1. Analyze my code to figure out the current architecture 2. Identify: a) areas of weakness b) inconsistencies c) what doesn't work, dead code, etc. 3. Ask me necessary questions needed to clear up any design (or for us to figure out the system architecture together) Finally, only help me fix any issues in the code once we have a clear idea of everything (and I give you the go ahead). Over the next day, I went over each of the identified errors or weaknesses one-by-one with the AI. It helped me pinpoint exactly the areas of my code that needed work, and I used it to successfully reintegrated the code with my original vision. Note: I use ‘cloud’ to refer to a provider-account pair. For example, a Google Drive provider with a specific email is one cloud. A different cloud would be the same provider but a different email, or a different provider altogether. Here’s a breakdown of what I did: Remove architectural drift, abandoned code, and unused features (e.g. GlobalIgnoreRules, automatic destination selection, FileSyncRecord and FolderSyncRecord) Implement a new-cloud bootstrap (when the user uploads stuff to a new cloud, perform a bootstrap operation to create all existing files and folders) Implement destructive cloud removal for when the user removes a cloud assignment Add pre-sync validation (reject missing local roots, reject invalid assignments) Make Watcher queuing reliable (detect unmonitored changes, etc.)
Devlog #13: UI/UX Implementation (WIP) With the backend functionality (mostly) complete, I’ve been working on implementing a smooth and easy-to-use user interface. Added system tray icon I added a system tray icon to allow the user to easily relaunch the UI while the backend continuously runs in the background. Cloud-folder assignment combobox + two-stage assignment system Instead of one-shotting everything, there’s now a two-stage system to cloud assignment. When a user adds a cloud to a folder, it first is added to UserAssignedClouds. During the next synchronization, the service will: check UserAssignedClouds upload the folder to the remote locations in those clouds move the clouds from UserAssignedClouds to AssignedClouds (this way, we know where the folder currently exists at) Add an IgnoreRules editor for WatchedFolders I had previously coded an ignore rules popup with a visual and raw rules editor, and I implemented it today specifically for WatchedFolders. The user can now set ignore rule globs (according to VS Code glob rules: https://code.visualstudio.com/docs/editor/glob-patterns ) to give themselves more control over what the service syncs and what it doesn’t. Miscellaneous UI improvements + functionalities completed folders.tsx page added web hook listener in WebView2 to natively open File Explorer for folders redid the styling for the sync.tsx page (still a WIP) Fix Dropbox/OneDrive OAuth triggers and revocations There were previously issues with the Dropbox (wrong redirectURI) and OneDrive (wrong OAuth consumer link) flows that I fixed after some testing. Everything regarding different accounts should work 100%!
Devlog #14: sync.tsx page, Cloud Assignments, QoL features UI/UX implementation is a slow but steady WIP. Add directory tree dialog A QoL feature that, when the user clicks a folder in folders.tsx, displays the folder’s subdirectories and shows which paths are affected by the IgnoreRules prop. sync.tsx page The layout of the sync.tsx page is mostly finished! It contains three tables: Current jobs (displays what is being currently uploaded) Pending cloud assignments (new remote locations assigned by the user for a folder, or “removal” assignments issued by the user to remove a folder from a specific remote location) Upcoming sync queue (table that displays the modifications and updates that will be applied to folders that already have existing remote locations) PendingChanges display dialog A table that shows the user the list of edits made to the folder or the folder’s subdirectories, in order. It displays the tracked information from the FileSystemWatcher API. SyncFrequency input dialog An input dialog that allows the user to set how frequently they want a folder to be synced. Includes Daily, Weekly, Monthly, and an “Inactive” option....
|
1792688010.960317
|
1793292810.960317
|
|
68073
|
Rc Garbage Cleaning Boat by @yaj_09 | Stardance
|
yaj_09
|
0
|
4.39
|
0
|
[]
|
[{"post_id": 80906, "ts": "202 [{"post_id": 80906, "ts": "2026-10-19T06:41:06Z", "hours": 4.3864, "text": "I am working on a rc trash cleaning boat. Today I saw videos for coding. And made some connections."}]...
|
Title: Rc Garbage Cleaning Boat by @yaj_09 | Stard Title: Rc Garbage Cleaning Boat by @yaj_09 | Stardance
Devlogs:
I am working on a rc trash cleaning boat. Today I saw videos for coding. And made some connections....
|
1792468489.107557
|
1793073289.107557
|
|
28602
|
Gudetama Macropad by @mian | Stardance
|
mian
|
0
|
15.99
|
0
|
[]
|
[{"post_id": 80908, "ts": "202 [{"post_id": 80908, "ts": "2026-10-19T07:00:06Z", "hours": 1.0333, "text": "Devlog #11 Case is done! Added all the gudetama decorations. Next will be working on firmware."}, {"post_id": 80624, "ts": "2026-10-18T10:21:42Z", "hours": 3.3722, "text": "Devlog #10 Another frustrating session lol. I had to fix up a bit of my pcb so it would align with my case. I kind of finished the case but I want to add like graphic decorations so I’ll do that in the next session and the firmware as well. There was just too too much math when doing the case which was really really annoying but I’m I got it done and over with. My new favourite onshape tool is the dimensions one, it was the life saver when making this case."}, {"post_id": 80342, "ts": "2026-10-17T10:15:53Z", "hours": 3.7322, "text": "Devlog #9 Finished the pcb! There are 5 buttons, one rotary, one oled, and 3 LEDs. Using the silkscreen I put my name and the gudetamas that I want to be seen through the transparent clear acrylic. Also, I spent like half an hour trying to solve all the issues I had with my pcb. It turns out the wires that were connected to the LEDS had to go to the back since thats where the LEDS were connected from. I also worked on my case which is on Onshape."}, {"post_id": 79258, "ts": "2026-10-13T07:24:26Z", "hours": 1.6753, "text": "Devlog #8 Did more of the PCB. I realised that I didn’t put the correct footprint library for the LED thats why it didn’t appear so I corrected it and fixed it up in the schematic. I made my shape rounded in the corner and did some wiring. I think doing the wiring is like solving a puzzle cause I have to make it connect but sometimes my other wires block the way. In the next session, I’ll have to continue wiring. I stopped because I was strugglying to find the area I can connect them. Should probably redraw some wires next time too."}, {"post_id": 79007, "ts": "2026-10-12T09:59:57Z", "hours": 0.4994, "text": "Devlog #7 I did the layout of my pcb! I’m not entirely sure of the exact mm measurements for the oled so I just did a rough rectangle. This follows my plan that I drew earlier"}, {"post_id": 78666, "ts": "2026-10-11T07:11:15Z", "hours": 1.9531, "text": "Devlog #6 I finished the schematic for my hackpad! I think I figured out how the labeling works. You still use wires but instead of all the wires going to one place you need, the labels kind of mean the same thing as that place and you can connect the label and the location you want with the wires, making it less messy. I did a couple of mistakes where I thought I could just just all the wires to one label but when I searched it up, it turns out it kind of messes things up so new thing learnt. I also did a bit of pcb thing and I thought I worked all the correct measurements but for some reason the rotary switch didn’t align with my SW5 which made me utterly confused. Funny, I spent like 20 mins trying to work out how to make it accurate but idk if I even did it correctly cause I was unsure on how to use the measurement tool. Next session I’m gonna continue my pcb board and hopefully can get all the measurement!"}, {"post_id": 78042, "ts": "2026-10-09T10:02:05Z", "hours": 0.4267, "text": "Devlog #5 So I thought I found a very easy way to connect things as it gets really messy and hard to read with a lot of wires but it turns out I did not understand how to do it at all lol. As you can tell, I used both labels and wires to do as I thought the labels just are there as naming but oops turns out I was completely wrong. I think I might just stick to plain wires for the future."}, {"post_id": 77801, "ts": "2026-10-08T11:05:51Z", "hours": 0.8094, "text": "Devlog #4 So honestly I didn’t do it for a day because I got lost on what to do when the tutorial ended. In this session I spent like half an hour doing research in which I made a small design plan with the components I want to add and a drawing of my expected outcome for the hackpad. I also added all the new components in the schematic. I just need to wire them now. I learnt a trick where wiring starts to get really confusing and messy when there is a lot so we can use labels to make things neater. In the next session I plan to finish up the schematic and move on to the pcb!"}, {"post_id": 77235, "ts": "2026-10-06T06:40:52Z", "hours": 0.7939, "text": "Devlog #3 This was really confusing. So I made the usb port slot and the lid where the keys will be and then the tutorial just ended. The dxf I imported in wouldn’t connect with the other part of the top case when using boolean so I had to slightly increase the size in which I hope doesn’t affect. I know I’m suppose to make it my own now but I am really lost on what to do. Like I genuiely have no idea had the stuff connects or works as I am a complete beginner. I think next session I’ll idk try to watch some tutorials and understand this more. I really hope the hackpad tutorial would go into more further detail though becuase I thought this was beginner friendly 😭"}, {"post_id": 76964, "ts": "2026-10-05T07:02:45Z", "hours": 1.0658, "text": "Devlog #2 This was a real pain to do. In the tutorial, it said to use to Fusion360 which I decided to try out for the first time but it was really confusing and hard to understand. The tutorials I searched up were also very limited for the parts I couldn’t get. Like for example, I needed the exact measurement but the dimensions wouldn’t appear for me to change. I only found out how to do it after searching in the comments which was to press D. So well… I kind of gave up and went back to Onshape. I created a bit of the case and the holes. I think in the next session, I might learn how to transfer the Onshape case to Fusion360 as it seems I need to put in some data from the tutorial. I’ll try my best to learn how to use FUsion360!"}, {"post_id": 76580, "ts": "2026-10-04T01:29:24Z", "hours": 0.6328, "text": "Devlog #1 Following the Hackpad guide, I made my schematic and some of the PCB parts in Kicad. This was my first time using Kicad."}]...
|
Title: Gudetama Macropad by @mian | Stardance
Dev Title: Gudetama Macropad by @mian | Stardance
Devlogs:
Devlog #1 Following the Hackpad guide, I made my schematic and some of the PCB parts in Kicad. This was my first time using Kicad.
Devlog #2 This was a real pain to do. In the tutorial, it said to use to Fusion360 which I decided to try out for the first time but it was really confusing and hard to understand. The tutorials I searched up were also very limited for the parts I couldn’t get. Like for example, I needed the exact measurement but the dimensions wouldn’t appear for me to change. I only found out how to do it after searching in the comments which was to press D. So well… I kind of gave up and went back to Onshape. I created a bit of the case and the holes. I think in the next session, I might learn how to transfer the Onshape case to Fusion360 as it seems I need to put in some data from the tutorial. I’ll try my best to learn how to use FUsion360!
Devlog #3 This was really confusing. So I made the usb port slot and the lid where the keys will be and then the tutorial just ended. The dxf I imported in wouldn’t connect with the other part of the top case when using boolean so I had to slightly increase the size in which I hope doesn’t affect. I know I’m suppose to make it my own now but I am really lost on what to do. Like I genuiely have no idea had the stuff connects or works as I am a complete beginner. I think next session I’ll idk try to watch some tutorials and understand this more. I really hope the hackpad tutorial would go into more further detail though becuase I thought this was beginner friendly 😭
Devlog #4 So honestly I didn’t do it for a day because I got lost on what to do when the tutorial ended. In this session I spent like half an hour doing research in which I made a small design plan with the components I want to add and a drawing of my expected outcome for the hackpad. I also added all the new components in the schematic. I just need to wire them now. I learnt a trick where wiring starts to get really confusing and messy when there is a lot so we can use labels to make things neater. In the next session I plan to finish up the schematic and move on to the pcb!
Devlog #5 So I thought I found a very easy way to connect things as it gets really messy and hard to read with a lot of wires but it turns out I did not understand how to do it at all lol. As you can tell, I used both labels and wires to do as I thought the labels just are there as naming but oops turns out I was completely wrong. I think I might just stick to plain wires for the future.
Devlog #6 I finished the schematic for my hackpad! I think I figured out how the labeling works. You still use wires but instead of all the wires going to one place you need, the labels kind of mean the same thing as that place and you can connect the label and the location you want with the wires, making it less messy. I did a couple of mistakes where I thought I could just just all the wires to one label but when I searched it up, it turns out it kind of messes things up so new thing learnt. I also did a bit of pcb thing and I thought I worked all the correct measurements but for some reason the rotary switch didn’t align with my SW5 which made me utterly confused. Funny, I spent like 20 mins trying to work out how to make it accurate but idk if I even did it correctly cause I was unsure on how to use the measurement tool. Next session I’m gonna continue my pcb board and hopefully can get all the measurement!
Devlog #7 I did the layout of my pcb! I’m not entirely sure of the exact mm measurements for the oled so I just did a rough rectangle. This follows my plan that I drew earlier
Devlog #8 Did more of the PCB. I realised that I didn’t put the correct footprint library for the LED thats why it didn’t appear so I corrected it and fixed it up in the schematic. I made my shape rounded in the corner and did some wiring. I think doing the wiring is like solving a puzzle cause I have to make it connect but sometimes my other wires block the way. In the next session, I’ll have to continue wiring. I stopped because I was strugglying to find the area I can connect them. Should probably redraw some wires next time too.
Devlog #9 Finished the pcb! There are 5 buttons, one rotary, one oled, and 3 LEDs. Using the silkscreen I put my name and the gudetamas that I want to be seen through the transparent clear acrylic. Also, I spent like half an hour trying to solve all the issues I had with my pcb. It turns out the wires that were connected to the LEDS had to go to the back since thats where the LEDS were connected from. I also worked on my case which is on Onshape.
Devlog #10 Another frustrating session lol. I had to fix up a bit of my pcb so it would align with my case. I kind of finished the case but I want to add like graphic decorations so I’ll do that in the next session and the firmware as well. There was just too too much math when doing the case which was really really annoying but I’m I got it done and over with. My new favourite onshape tool is the dimensions one, it was the life saver when making this case.
Devlog #11 Case is done! Added all the gudetama decorations. Next will be working on firmware....
|
1792630339.9337192
|
1793235139.9337192
|
|
66335
|
3D AIM TRAINER by @brijeshkumar724282 | Stardance
|
brijeshkumar724282
|
2
|
32.0
|
262
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-19T08:00:07Z", "hours": 15.0, "multiplier": 15.47, "payout": 229, "blessing": "neutral", "text": "I have made a Web based AIM TRAINER written in html, CSS, JS and THREE.js. IT HAS 4 GAMEMODES FOR NOW: GRIDSHOT, SIXSHOT, PRECISION, AND TRACKING. The most challenging part was every mode has to be written the same code again and again when adding a new gamemode. So I had to move it all into one shared core code, Now adding new modes is easier. I am really proud of developing the shared core code. when I made it, It actually made my work easier. It’s now scalable and i can add add many gamemodes easier than before. Before it i had to write the same code again and again probably 400+ lines now cutdown to less than 100 (tracking.js is an exception) To test my game, A person needs a mouse to aim and shoot.", "repo": "https://github.com/brijeshkumar724282-beep/web-Aim-Trainer", "demo": "https://brijeshkumar724282-beep.github.io/web-Aim-Trainer/"}, {"ship_num": 2, "ts": "2026-10-09T04:29:04Z", "hours": 17.0, "multiplier": 1.97, "payout": 33, "blessing": "neutral", "text": "I made a 3D web based Aim trainer in html, css, JS and three.js. Few of the most challenging parts were funny, adjusting the texture packs evenly among all the walls, adjusting the lightning to make it look right and The aiming mechanism, I was getting tilting issues in the starting, its fixed now. I am proud of the menu animation and making 2 modes work well. They just need to know how to click and move their mouse! its so simple.", "repo": "https://github.com/brijeshkumar724282-beep/web-Aim-Trainer", "demo": "https://brijeshkumar724282-beep.github.io/web-Aim-Trainer/"}]...
|
[{"post_id": 80909, "ts": "202 [{"post_id": 80909, "ts": "2026-10-19T07:00:48Z", "hours": 5.1058, "text": "REBUILT AND MADE THE GAME SCALABLE AND ADDED NEW MORE 2 GAME MODES , So basically each gamemode used to have everything built inside it. So if i ever wanted to add a new game mode, I will have to write the same code again and again, So I put the core parts they all shared into one place, So its easier to add new game modes now. ROOM, AIMING SYSTEM, TIMER, etc are built once and used by all of them, SO this made speeds up adding new game modes. I have added 2 new Modes : 1. TRACKING MODE, 2. PRECISION MODE. I have also changed the UI of The menu a little bit. The ROOM is Rebuilt too because the old one was way too flat looking for my game. Now I have also added Best score feature for each mode, i have used Local storage for storing your best score. Also added an sfx whenever you switch modes in the menu which gives life to the menu selection."}, {"post_id": 80380, "ts": "2026-10-17T13:48:48Z", "hours": 4.53, "text": "Finished the menu and most of the review feedback , Since the last post, I have been working mainly on the Menu and a few things : 1. The menu is now in a good shape too. 2.Added a settings popup where you could change sensitivity from. 3.removed the browser alert for results and made a dedicated page for results. 4.Added background music, So actually I used AI to generate the bgm. 5.Made a favicon and added an MIT License."}, {"post_id": 79717, "ts": "2026-10-15T06:21:39Z", "hours": 5.1894, "text": "REBUILDING AND FIXING EVERYTHING. After reading the reviews, I came to a conclusion that My game was hanging on most people’s device, it was more because of uncapped fps as of i think. here are a few things that I did: 1. I removed all the texture packs (made the game heavy and also caused lag for some people). 2. Using whitish color design (Flat colours) and added Grid helper. 3. Made the targets Blue colored and glossy looking. 4. I have already rebuilding the menu, the old one killed the whole gaming vibe (old one was kinda luxury lmao)."}, {"post_id": 77991, "ts": "2026-10-09T04:05:41Z", "hours": 5.2161, "text": "The enviroment and textures are in good shape now, It look right in the game!! The main work that I did since the last time file structuring and organizing files in folders, and removing the code that was crashing my game, and also solved few bugs, like screen freezing. menu.html is now index.html, added features to select and play different game modes using from menu. Only Gridshot and Sixshot are live for v1. I will ship this project v1. I am looking forward to add more game modes and make a seperate page for results."}, {"post_id": 75810, "ts": "2026-10-01T07:09:56Z", "hours": 3.6597, "text": "I have been working on the room and textures. I cant give proper finishing to the textures, they dont look good, so I skipped it for now. I am working on the Menu/Game mode selector. I have implemented smooth scroll to select animation using gsap, and its pretty smooth."}, {"post_id": 75513, "ts": "2026-09-30T10:22:58Z", "hours": 3.9586, "text": "spent most of my time working on the enviroment, the room i mean and optimizing the game a little. So i added 1 boxes each sides to add depth, etc. I had to adjust the sun light and the roof that wasted most of my time. The shadows were pixelated too much so I tried blurring them a little to smooth them out, also added score and accuracy system. I might work on the UI too."}, {"post_id": 74783, "ts": "2026-09-28T07:35:12Z", "hours": 3.9172, "text": "##Devlog 1, BUILDING A WEB BASED AIM TRAINER WRITTEN IN HTML, CSS AND JS I am building a broswer/web based Aim trainer for competitive games, like aimlabs but entirely written in HTML, CSS, JS and THREE.js.My primary goal was to match the aiming feel of competitive games like Valorant. Because three.js uses vertical field of vieww by default, i had to implement a dynamic conversion formula that would lock the horizontal FOV to 103. I also mapped shooter mouse sensitivity scaled directly into radian angle increaments per mouse count, to make the flick distances fell well and authentic. for handling movements, I integrated the pointer lock API for raw mouse input that will feel just like any competitive game. I fixed a bug that made the camera tilt sideways and also stopped the screen from flipping upside down when looking up and all. also added a \"+\" crosshair in the middle. Also built a training room with walls, roofs and floor, and also a little depth. added realisitc sunlight shadow casting. For testing, I built a 4x3 grid system that keeps three targets active. clicking mouse triggers center screen raycast to detect hits, free up occupied slots, etc. And also added fps counter and removed the fps cap restrictions. The target and aiming system is working fine and its fully responsive."}]...
|
Title: 3D AIM TRAINER by @brijeshkumar724282 | Sta Title: 3D AIM TRAINER by @brijeshkumar724282 | Stardance
Devlogs:
##Devlog 1, BUILDING A WEB BASED AIM TRAINER WRITTEN IN HTML, CSS AND JS I am building a broswer/web based Aim trainer for competitive games, like aimlabs but entirely written in HTML, CSS, JS and THREE.js.My primary goal was to match the aiming feel of competitive games like Valorant. Because three.js uses vertical field of vieww by default, i had to implement a dynamic conversion formula that would lock the horizontal FOV to 103. I also mapped shooter mouse sensitivity scaled directly into radian angle increaments per mouse count, to make the flick distances fell well and authentic. for handling movements, I integrated the pointer lock API for raw mouse input that will feel just like any competitive game. I fixed a bug that made the camera tilt sideways and also stopped the screen from flipping upside down when looking up and all. also added a "+" crosshair in the middle. Also built a training room with walls, roofs and floor, and also a little depth. added realisitc sunlight shadow casting. For testing, I built a 4x3 grid system that keeps three targets active. clicking mouse triggers center screen raycast to detect hits, free up occupied slots, etc. And also added fps counter and removed the fps cap restrictions. The target and aiming system is working fine and its fully responsive.
spent most of my time working on the enviroment, the room i mean and optimizing the game a little. So i added 1 boxes each sides to add depth, etc. I had to adjust the sun light and the roof that wasted most of my time. The shadows were pixelated too much so I tried blurring them a little to smooth them out, also added score and accuracy system. I might work on the UI too.
I have been working on the room and textures. I cant give proper finishing to the textures, they dont look good, so I skipped it for now. I am working on the Menu/Game mode selector. I have implemented smooth scroll to select animation using gsap, and its pretty smooth.
The enviroment and textures are in good shape now, It look right in the game!! The main work that I did since the last time file structuring and organizing files in folders, and removing the code that was crashing my game, and also solved few bugs, like screen freezing. menu.html is now index.html, added features to select and play different game modes using from menu. Only Gridshot and Sixshot are live for v1. I will ship this project v1. I am looking forward to add more game modes and make a seperate page for results.
REBUILDING AND FIXING EVERYTHING. After reading the reviews, I came to a conclusion that My game was hanging on most people’s device, it was more because of uncapped fps as of i think. here are a few things that I did: 1. I removed all the texture packs (made the game heavy and also caused lag for some people). 2. Using whitish color design (Flat colours) and added Grid helper. 3. Made the targets Blue colored and glossy looking. 4. I have already rebuilding the menu, the old one killed the whole gaming vibe (old one was kinda luxury lmao).
Finished the menu and most of the review feedback , Since the last post, I have been working mainly on the Menu and a few things : 1. The menu is now in a good shape too. 2.Added a settings popup where you could change sensitivity from. 3.removed the browser alert for results and made a dedicated page for results. 4.Added background music, So actually I used AI to generate the bgm. 5.Made a favicon and added an MIT License.
REBUILT AND MADE THE GAME SCALABLE AND ADDED NEW MORE 2 GAME MODES , So basically each gamemode used to have everything built inside it. So if i ever wanted to add a new game mode, I will have to write the same code again and again, So I put the core parts they all shared into one place, So its easier to add new game modes now. ROOM, AIMING SYSTEM, TIMER, etc are built once and used by all of them, SO this made speeds up adding new game modes. I have added 2 new Modes : 1. TRACKING MODE, 2. PRECISION MODE. I have also changed the UI of The menu a little bit. The ROOM is Rebuilt too because the old one was way too flat looking for my game. Now I have also added Best score feature for each mode, i have used Local storage for storing your best score. Also added an sfx whenever you switch modes in the menu which gives life to the menu selection.
Ships:
I made a 3D web based Aim trainer in html, css, JS and three.js. Few of the most challenging parts were funny, adjusting the texture packs evenly among all the walls, adjusting the lightning to make it look right and The aiming mechanism, I was getting tilting issues in the starting, its fixed now. I am proud of the menu animation and making 2 modes work well. They just need to know how to click and move their mouse! its so simple.
I have made a Web based AIM TRAINER written in html, CSS, JS and THREE.js. IT HAS 4 GAMEMODES FOR NOW: GRIDSHOT, SIXSHOT, PRECISION, AND TRACKING. The most challenging part was every mode has to be written the same code again and again when adding a new gamemode. So I had to move it all into one shared core code, Now adding new modes is easier. I am really proud of developing the shared core code. when I made it, It actually made my work easier. It’s now scalable and i can add add many gamemodes easier than before. Before it i had to write the same code again and again probably 400+ lines now cutdown to less than 100 (tracking.js is an exception) To test my game, A person needs a mouse to aim and shoot....
|
1792817327.0948093
|
1792903727.0948093
|
|
17973
|
Tamawotchu by @stargaze | Stardance
|
stargaze
|
0
|
0.35
|
0
|
[]
|
[{"post_id": 8091, "ts": "2026 [{"post_id": 8091, "ts": "2026-06-13T14:42:59Z", "hours": 0.3531, "text": "only working on it when on edge, half completed thoughts only"}]...
|
Title: Tamawotchu by @stargaze | Stardance
Devlog Title: Tamawotchu by @stargaze | Stardance
Devlogs:
only working on it when on edge, half completed thoughts only...
|
1792723964.0488021
|
1793328764.0488021
|
|
62550
|
Koku Slack bot by @Abhishek-mee | Stardance
|
Abhishek-mee
|
0
|
0.44
|
0
|
[]
|
[{"post_id": 80911, "ts": "202 [{"post_id": 80911, "ts": "2026-10-19T07:15:31Z", "hours": 0.4428, "text": "koku bot"}]...
|
Title: Koku Slack bot by @Abhishek-mee | Stardance Title: Koku Slack bot by @Abhishek-mee | Stardance
Devlogs:
koku bot...
|
1792436051.9014957
|
1793040851.9014957
|
|
70448
|
Air by @shivakaushal | Stardance
|
shivakaushal
|
0
|
0.36
|
0
|
[]
|
[{"post_id": 80913, "ts": "202 [{"post_id": 80913, "ts": "2026-10-19T07:27:16Z", "hours": 0.3608, "text": "So right now I am working on Air, this is a mission so i am making related to it, and opening the guide just beside the code server. finally I have worked on the environment, i had also host it on vercel, the guides shows github pages, but didn’t use that."}]...
|
Title: Air by @shivakaushal | Stardance
Devlogs:
Title: Air by @shivakaushal | Stardance
Devlogs:
So right now I am working on Air, this is a mission so i am making related to it, and opening the guide just beside the code server. finally I have worked on the environment, i had also host it on vercel, the guides shows github pages, but didn’t use that....
|
1792396026.457481
|
1793000826.457481
|
|
69105
|
Python Chess by @itzdeep2 | Stardance
|
itzdeep2
|
2
|
3.0
|
4
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-19T07:44:37Z", "hours": 1.0, "multiplier": 1.72, "payout": 2, "blessing": "neutral", "text": "Built an interactive Python chess game using tkinter and integrated the Stockfish Engine( https://github.com/official-stockfish/Stockfish ) via a UCI subprocess bridge. Challenges: Parsing real-time board states into FEN strings and syncing asynchronous background AI moves smoothly with the GUI canvas. Proud of: Successfully deploying a native chess AI player inside a Python app without external web dependencies. Test it by downloading the release binary and playing against Stockfish!", "repo": "https://github.com/itzdeep2/Python-Chess", "demo": "https://github.com/itzdeep2/Python-Chess/releases/tag/v1.0.0"}, {"ship_num": 2, "ts": "2026-10-11T06:11:59Z", "hours": 2.0, "multiplier": 1.03, "payout": 2, "blessing": "neutral", "text": "Built a lightweight 2D chess GUI from scratch using Python’s standard tkinter library. Squashed tricky sprite scaling and click-handler indentation bugs so pieces follow authentic movement rules instead of teleporting. Proud of making a clean, responsive game with zero external dependencies. Run python chess.py alongside the assets folder to test!", "repo": "https://github.com/itzdeep2/Python-Chess", "demo": "https://github.com/itzdeep2/Python-Chess/releases/tag/v1.0.0"}]...
|
[{"post_id": 80917, "ts": "202 [{"post_id": 80917, "ts": "2026-10-19T07:42:51Z", "hours": 1.4306, "text": "Just shipped a massive update to Python Chess! I built a fully playable 2D GUI from scratch using tkinter with custom piece sprites and strict movement validation—no more pieces teleporting across the board. The coolest part? I integrated the powerful open-source Stockfish engine (Stockfish GitHub) into the background via a UCI subprocess bridge, so you can actually play against a real chess AI. Bundling it all into a standalone macOS app with PyInstaller was a headache with pathing quirks, but we cracked it. Next up, I’m thinking about building a custom evaluation bot from scratch!"}, {"post_id": 78656, "ts": "2026-10-11T06:06:58Z", "hours": 1.6969, "text": "Just dropped v1 of my GUI chess game in Python! Indentation errors and oversized piece sprites had me stressed, but we cooked and fixed it. Pieces now move with legit rules instead of teleporting. Next up, I’m locking in to build a custom chess bot engine. No cap, it’s peak."}]...
|
Title: Python Chess by @itzdeep2 | Stardance
Devl Title: Python Chess by @itzdeep2 | Stardance
Devlogs:
Just dropped v1 of my GUI chess game in Python! Indentation errors and oversized piece sprites had me stressed, but we cooked and fixed it. Pieces now move with legit rules instead of teleporting. Next up, I’m locking in to build a custom chess bot engine. No cap, it’s peak.
Just shipped a massive update to Python Chess! I built a fully playable 2D GUI from scratch using tkinter with custom piece sprites and strict movement validation—no more pieces teleporting across the board. The coolest part? I integrated the powerful open-source Stockfish engine (Stockfish GitHub) into the background via a UCI subprocess bridge, so you can actually play against a real chess AI. Bundling it all into a standalone macOS app with PyInstaller was a headache with pathing quirks, but we cracked it. Next up, I’m thinking about building a custom evaluation bot from scratch!
Ships:
Built a lightweight 2D chess GUI from scratch using Python’s standard tkinter library. Squashed tricky sprite scaling and click-handler indentation bugs so pieces follow authentic movement rules instead of teleporting. Proud of making a clean, responsive game with zero external dependencies. Run python chess.py alongside the assets folder to test!
Built an interactive Python chess game using tkinter and integrated the Stockfish Engine( https://github.com/official-stockfish/Stockfish ) via a UCI subprocess bridge. Challenges: Parsing real-time board states into FEN strings and syncing asynchronous background AI moves smoothly with the GUI canvas. Proud of: Successfully deploying a native chess AI player inside a Python app without external web dependencies. Test it by downloading the release binary and playing against Stockfish!...
|
1792817499.0453815
|
1792903899.0453815
|
|
65089
|
New ANIME Tab by @Athannn | Stardance
|
Athannn
|
1
|
5.0
|
15
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-19T08:32:34Z", "hours": 5.0, "multiplier": 2.84, "payout": 15, "blessing": "neutral", "text": "Finally shipping New ANIME Tab !! So wlcm back to New Anime Tab. Ywahh I got bored of the empty Chrome tab looking vry plainn as usual, and also the Stardance mission was there obvv, so ywahh I made my own anime-themed one :D For Reviewerss :–> It has an anime background with the clean frosted look, a 12-hour clock with seconds, the date, four bookmarks, and a Google search box. There’s also a timer with +, -, Play, and Reset, and u can click the time to type it in too, including hours. When it hits 00 00 it keeps beepingg loud and the red Stop Timer button shows up. And then there’s the Music player hehe It opens a little draggable window with 10 SoundHelix songs and a Spotify embed. The X hides the window but Spotify keeps playing, which is kinda the point, and the red Stop button stops both. I tried making my own loops first, but ngl they sounded awful & i mean a lot awful, so those old wavs are still in the repo but aren’t used anymore :p Also the Spotify playlist is MY OWN PERSONAL ONE (plss dont judge my taste plzz). I had to turn CSS minifying off in Vite cuz it was messing with the blur, but thankfully the frosted look stays now. And it’s on my custom subdomain as always hehe. That’s basically it, Myy own anime-themed NEW tab !! Go try it out and let’s see what you think :D Also Follow here & Star on Github if u LIKE itt :)", "repo": "https://github.com/its-techxtreme/newanimetab", "demo": "https://animetab.techxtreme.me"}]...
|
[{"post_id": 80926, "ts": "202 [{"post_id": 80926, "ts": "2026-10-19T08:13:10Z", "hours": 1.3253, "text": "Devloggg #4 So wlcm back to the New AnimeTab. I know this is a devlog after a lot of time. I mean, a lot Btw actually, I was having many exams, so I just didn’t get the time to work on it. So I was just working on the hardware project AniPad. So there are not many significant changes. What I did was I added the README for this project, and after that, while using my tab website, ywahh I was actually using it + _ +. So I encountered a few bugs in the music player. I fixed those and changed the playlist to MY OWN PERSONAL ONE (plss dont judge my taset ), and also I made the timer so that it’s typeable instead of I need to just spam the plus button if I need to set a larger timer. So I just made it that you can type the time amount, and I made it so that there are options for hours too now. Yahh, that’s basically it. TYSMMM !"}, {"post_id": 74560, "ts": "2026-09-27T17:07:50Z", "hours": 2.6461, "text": "Devloggg #3 Wlcm back to New ANIME Tab again :) Sooo after the search box I hv also added a timer card under the clock. You can use “+” & “-” to set a timing,then hit Play, and then u can also Reset if you mess it up. Another thing when it hits 00:00 it starts beeping, and a red “Stop Timer” button shows up so you can that annoying beeping sound off Under that there is a Most exciting Music player button. Rnn It opens a little dark window that you can drag around, and there is an X to close it. Rnnn inside are abt ten songs. First I tried making my own little loops and they sounded awful to my ears So I pointed them at the same SoundHelix tracks I already use on my other sites. Tho the old files are still in the repo (in case if i try it again in v2 or smth), I just do not play them anymore in the code :) There is also an Most wanted Open Spotify button. Once the embed is up it switches to Close Spotify cuz I was kinda sick of those “x” to close after adding them so many times to this project & mainly Myy ColorfulNook OS project. Also If a song is playing and you hit X, the window goes away btw Spotify & Soundhelix songs keeps going Also The red Stop button next to the “x” kills whatever is playing, the Song or Spotify. Also got it on GitHub Pages published, tho the link I am aiming for is animetab.techxtreme.me (a custom subdomain as always hehe) Thats All for the this Devlogg, C’ya Next time :D"}, {"post_id": 74306, "ts": "2026-09-27T04:57:26Z", "hours": 0.7056, "text": "Devloggg #2 Wlcm back to THE New Anime Tab project :) The main thing is that clock actually runs now, its like 12 hour one with seconds, and the date sits under it so easy to see both at once. Also I dropped the empty clock box look and put four bookmarks on the card for easy access YouTube, My GitHub, My Stardance profile, and Instagram hehe (promoting myy Accs ) The blur on the card was getting very wrecked when the page built, so I turned CSS minifying off in Vite & thankfully that kept the frosted look ALSoo Under the bookmarks there is a Search box. U can type something and hit Enter and it opens Google with that search, thats obv duhh. Thats All for the devlog :D"}, {"post_id": 74062, "ts": "2026-09-26T16:43:45Z", "hours": 0.6717, "text": "Devloggg #1 Welcome to New Anime Tab. Sooo this is my second project after the new start. Rnn I have got vite running and hooked up the GitHub pages workflow so it can go live later.I thought about doing the NASA Apod from guide, btw Nahh i amma do a simple anime tab & scrapping it. The background is an anime picture and the middle of the page is just a frosted card rnn with a kind of a blur effect on it. Inside that, I started the clock face btw it is just a empty box for now, so the time won’t show up anywhere Next what I’m planning to do is the actual clock and the date, plus a few bookmarks for the site that I actually open, that is for today. That is it for this devlog. TYSMMMM for Readingggg :)"}]...
|
Title: New ANIME Tab by @Athannn | Stardance
Devl Title: New ANIME Tab by @Athannn | Stardance
Devlogs:
Devloggg #1 Welcome to New Anime Tab. Sooo this is my second project after the new start. Rnn I have got vite running and hooked up the GitHub pages workflow so it can go live later.I thought about doing the NASA Apod from guide, btw Nahh i amma do a simple anime tab & scrapping it. The background is an anime picture and the middle of the page is just a frosted card rnn with a kind of a blur effect on it. Inside that, I started the clock face btw it is just a empty box for now, so the time won’t show up anywhere Next what I’m planning to do is the actual clock and the date, plus a few bookmarks for the site that I actually open, that is for today. That is it for this devlog. TYSMMMM for Readingggg :)
Devloggg #2 Wlcm back to THE New Anime Tab project :) The main thing is that clock actually runs now, its like 12 hour one with seconds, and the date sits under it so easy to see both at once. Also I dropped the empty clock box look and put four bookmarks on the card for easy access YouTube, My GitHub, My Stardance profile, and Instagram hehe (promoting myy Accs ) The blur on the card was getting very wrecked when the page built, so I turned CSS minifying off in Vite & thankfully that kept the frosted look ALSoo Under the bookmarks there is a Search box. U can type something and hit Enter and it opens Google with that search, thats obv duhh. Thats All for the devlog :D
Devloggg #3 Wlcm back to New ANIME Tab again :) Sooo after the search box I hv also added a timer card under the clock. You can use “+” & “-” to set a timing,then hit Play, and then u can also Reset if you mess it up. Another thing when it hits 00:00 it starts beeping, and a red “Stop Timer” button shows up so you can that annoying beeping sound off Under that there is a Most exciting Music player button. Rnn It opens a little dark window that you can drag around, and there is an X to close it. Rnnn inside are abt ten songs. First I tried making my own little loops and they sounded awful to my ears So I pointed them at the same SoundHelix tracks I already use on my other sites. Tho the old files are still in the repo (in case if i try it again in v2 or smth), I just do not play them anymore in the code :) There is also an Most wanted Open Spotify button. Once the embed is up it switches to Close Spotify cuz I was kinda sick of those “x” to close after adding them so many times to this project & mainly Myy ColorfulNook OS project. Also If a song is playing and you hit X, the window goes away btw Spotify & Soundhelix songs keeps going Also The red Stop button next to the “x” kills whatever is playing, the Song or Spotify. Also got it on GitHub Pages published, tho the link I am aiming for is animetab.techxtreme.me (a custom subdomain as always hehe) Thats All for the this Devlogg, C’ya Next time :D
Devloggg #4 So wlcm back to the New AnimeTab. I know this is a devlog after a lot of time. I mean, a lot Btw actually, I was having many exams, so I just didn’t get the time to work on it. So I was just working on the hardware project AniPad. So there are not many significant changes. What I did was I added the README for this project, and after that, while using my tab website, ywahh I was actually using it + _ +. So I encountered a few bugs in the music player. I fixed those and changed the playlist to MY OWN PERSONAL ONE (plss dont judge my taset ), and also I made the timer so that it’s typeable instead of I need to just spam the plus button if I need to set a larger timer. So I just made it that you can type the time amount, and I made it so that there are options for hours too now. Yahh, that’s basically it. TYSMMM !
Ships:
Finally shipping New ANIME Tab !! So wlcm back to New Anime Tab. Ywahh I got bored of the empty Chrome tab looking vry plainn as usual, and also the Stardance mission was there obvv, so ywahh I made my own anime-themed one :D For Reviewerss :–> It has an anime background with the clean frosted look, a 12-hour clock with seconds, the date, four bookmarks, and a Google search box. There’s also a timer with +, -, Play, and Reset, and u can click the time to type it in too, including hours. When it hits 00 00 it keeps beepingg loud and the red Stop Timer button shows up. And then there’s the Music player hehe It opens a little draggable window with 10 SoundHelix songs and a Spotify embed. The X hides the window but Spotify keeps playing, which is kinda the point, and the red Stop button stops both. I tried making my own loops first, but ngl they sounded awful & i mean a lot awful, so those old wavs are still in the repo but aren’t used anymore :p Also the Spotify playlist is MY OWN PERSONAL ONE (plss dont judge my taste plzz). I had to turn CSS minifying off in Vite cuz it was messing with the blur, but thankfully the frosted look stays now. And it’s on my custom subdomain as always hehe. That’s basically it, Myy own anime-themed NEW tab !! Go try it out and let’s see what you think :D Also Follow here & Star on Github if u LIKE itt :)...
|
1792857143.2607949
|
1792943543.2607949
|
|
44119
|
Riggurly by @infinite_silly | Stardance
|
infinite_silly
|
0
|
150.23
|
0
|
[]
|
[{"post_id": 80938, "ts": "202 [{"post_id": 80938, "ts": "2026-10-19T09:22:13Z", "hours": 8.6244, "text": "Scooby-Doo Hello friends! I just got an email from Stardance saying I have 8+ unlogged hours, so let’s dive in? I Wish That I Could [Fail] I haven’t exactly done much of aything since my last devlog. I’ve written two unit tests, I guess, which do partially (mostly) address the situation with ensuring that ROM state isn’t changed by a bad save, such as with an RTC or loading in a bad save. I covered the case for two MBCs (MBC1 and MBC3) that the number of banks for the save is mismatched with what ROM was loaded (eg. 4 banks on a 1 bank ROM or MBC2 style ram on an MBC3 rom, though I will cover this case in the future). As for where the time came from, it may be that I stared at my TODO list too hard, as I have my TODOs for Riggurly in one emacs split and my TODOs for school in the other, but I have my school.org in a completely different location in my FS, in my org directory ~/org instead of my my Riggurly directory ~/projects/riggurly, but I have no clue. I didn’t even edit either file for more than a total of 5 minutes!!! Anyway, that’s all for now folks! Make sure to keep listening to Jamie Paige and drop @ElffawIThink a follow! Also, the novel is a stupid ad I saw on Royal Road whiul ereading 1% lifesteal"}, {"post_id": 79844, "ts": "2026-10-15T16:31:09Z", "hours": 3.4033, "text": "Failing Tests Hello everybody! We’re back with another devlog! Let’s dive right in so I can got to bed! All Tests Pass A good bit of test writing has happened since the last devlog. The ROM suite has gone from a measly 3 tests to a much nicer 16, though still incomplete. I wrote more tests to test combinations of roms and save sizes that are meant to work, as well as a bunch of those that also test RTC functionality for MBC3. I ended up putting ROM construction into a helper, as well as making a helper for most of the save round trip tests, probably saving a few hundred lines of code. Next tests are probably going to be broken saves, saves that don’t match, etc. etc. to see that ROMs are preserved and such. Algospeak Going back to the RTC, I remade the function that adds a number of seconds to the internal RTC. What I was doing before was calling a function that ticked by ticks with an amount of ticks equal to 1 second FOR EACH SECOND. That’s often hundreds of thousands or millions of function calls, with O(n) time complexity. I was pretty easily able to swap it for an O(1) modulus thingy. Switchie-Shwoo Going back to ROM preservation, I recently realised that it was loading in new timestamp data before checking save validity, which could end up being problematic. I just swapped the order of those two and the problem was solved, though, as I said before, this needs to be test-enforced. That’s it for now folks! See y’all next time!"}, {"post_id": 78970, "ts": "2026-10-12T06:56:19Z", "hours": 2.3525, "text": "sleep(); sleep(); sleep(); allTestsPass() Hello everyone! Let’s dive in so I can get back to work before I go to bed! Testing, Testing, 1, 2, 3 For the last couple hours, I’ve been writing unit tests for the ROM module. I’ve been going on and off with unit tests for a while. Before, I wanted to write unit test for cpu instructions before realising Blarrg made test ROMs for that. Because of that, test ROMs are the primary mode of testing out Riggurly, especially since test ROM developers know much more about specifics, like the halt bug, than I do. However, trest ROMs don’t test things like saving and loading, which is something I CAN write tests for in a reasonable amount of time. A lot of the work I’ve done was just making one helper function and figuring out what I wanted to be covered by it and what I want the tests to do. I might also refactor some repeated stuff into another helper for more efficient code after I finish writing the save round trip unit tests. That’s it for now friends, and don’t forget to listen to Flavor Foley’s new album, Mirror Modulation, which dropped today? on all music streaming platforms"}, {"post_id": 78511, "ts": "2026-10-11T01:38:07Z", "hours": 2.9031, "text": "Little Bonuses Hello Everyone! I have to go walk the dogs, so let’s dive right in! Building Codes Since I want a few more hours to try to see if I can get a Framework 13 and Celeste, I decided it would be good to add all the nicities I did for my last CLI, leading-zero-util (I know, terribly named), namely, man file and completion generation. On lzu, I used a hidden flag for completions and had a build.rs for the man page. However, I found it best to merge all of them into one hidden flag for ease of use. At first I tried a build.rs, but it kinda made dependencies annoying and made either my or lib users’ lives worse. That’s it for now folks! Next I’ll be working on unit tests for ROM stuff."}, {"post_id": 77765, "ts": "2026-10-08T06:16:50Z", "hours": 5.5431, "text": "Much TODO About Nothing Hello everyone! We are finally back after a devlog hiatus due to me having to write essays to apply for my school’s software team! Let’s dive in so I can work on my history homework! Read It and Weep Last time, I talked about, in one title line by accident, how writing documentation and documenting my software’s flaws really exposed what was wrong with it. This update is all about fixing those flaws (mostly) A Multitude of Screams One of the biggest issues with my emulator was the audio. Not in the backend, but the frontend. Due to laziness, I didn’t bother adding mono audio support, which ended up being a 5-minute fix. There was also another glaring issue with the audio: Once it crashed, it wouldn’t rebuild the stream. If you unplugged your headphones, thinking the audio would continue on your other speakers, it would just turn it off and modulate speed with std:🧵 :sleep() . It took me a while to write all the rebuilding code in such a way to maximise user QoL for all users. When did I download you?! Since Riggurly is both a CLI AND a library, it has dependencies that are used only in the CLI that are still a part of the package as a whole. Library users still have to download and compile these dependencies, which can be a hassle and a waste of time. I’ve been meaning to put CLI-only dependencies behind a feature so library users can easily prevent themselves from downloading and compiling a bunch of heavy extra dependencies. This also taught me how to use features, which was good. You’re a Waste of the Air You Breathe! One thing that’s been bugging me for a while is efficiency. My array for the fallback memory bus array in the memory bus struct has always been 0x10000 bytes long (1 mebibyte, how much ram a GB has (kind of)). How reading and writing has worked is that there are match statements you go through to see if you access that array or you access the rom or if you access the vram or something else. The problem is that over 3/4 of that array’s length is useless and shadowed by ROM/CRAM/VRAM. I was wasting 768 kb of heap-memory. I ended up dropping the first 3/4 and just having a smaller array. Unfortunately, some space is still wasted, but it’s not much compared to before. I showed @ElffawIThink and they though it was funny. Also, one of the ROM types comes with 512 HALF-BYTES(nibbles) of RAM, which I had been representing with a [u8,512] with the upper nibbles of EVERY BYTE going unused. I shrank this down to a [u8,256] and use both nibbles for a fish in the sea . Take Me Home Before, I had to put a disclaimer in my README that you couldn’t use ~ as your home directory in your default ROM path in your config.toml because different users have different home directories and I have to use the dirs crate to find that out at runtime. This was a surprisingly long fix, though it was quite simple. Just a few lines of code to strip the ~ and replace it with the already found home directory. That’s all for tonight comrades! Make sure to listen to Jamie Paige, especially Clover! That song is now the first song in my playlist with vocal (sequentially, obviously my playlist has other songs with vocals), overtaking Lemon Boy by Cavetown, it’s just that good. It has also shown itself to be a better daily anthem than Villain by Teniwoha and Schifty Five, the YouTube classic."}, {"post_id": 76331, "ts": "2026-10-03T07:10:40Z", "hours": 2.3758, "text": "Lover Tell Me if You CanHello everyone! Let’s dive in so I can work on improving the user experience!## ManThis devlog is all about README. I have actually never used Markdown before, only org, Emacs’s outliner/md format, because it is more intuitive and Emacs gives you more toys. My style guide is in org, my todo lists are in org; the only things that aren’t are the AGENTS.md I stole from Ghostty and the README.md. I ended up using a combination of the Stardance and Phantom README guides to help me figure out what to put in it and how to do syntax. Working on the README put an emphasis on some flaws in my code:- config path ~ not expanding- my glaring lack of a homebrew tap- mono audio still being unsupported- feature gating on binary-only depsThat’s it for now folks!"}, {"post_id": 75838, "ts": "2026-10-01T09:37:11Z", "hours": 3.2122, "text": "Erroneous Hello everyone! I have a history in-class-writing in 6 hours, so let’s dive right in! Error 404 Once I started adding support for loading ROMs and saves, failure points became possible. I hadn’t previously written errors before, so I just wrote strings and propagated them through with Result< T, Box> and the ? operator, with no regard to API users that may want to recover from a failure. I’ve been putting this off for so long, and was even considering doing this after shipping, but since I have so much time on my hands and the only other big TODOs left are the README.md and the Homebrew tap, I decided, why not? This has been a very interesting process over all, and it even gave me the impetus to do some proper gating on load_rom. Different MBCs only support some cram sizes, but because I wasn’t gating on load, these would fail at runtime with a mismatch. Read All About It Next up is the README. I previously had a mediocre, small, incomplete README in a file formet I forgot crates.io doesn’t have a renderer for, so I figured it would be best to start from scratch in Markdown instead of trying to port it over from Org. I also chnaged the name to Riggurly since that rolls off the tongue more. That’s it for this morning! I also found the bathroom in ENA: Dream BBQ, which was cool. I still need to go inside. Also, make sure to listen to Jamie Paige, as she always boosts my productivity!"}, {"post_id": 75451, "ts": "2026-09-30T04:14:29Z", "hours": 4.1544, "text": "Vendetta Hello everyone! Let’s dive right in so I can work on my math homework so I don’t fail my calc test next week! TUIzers I COMPLETED THE TUIIIIII!!! I added a text entry box for people to manually enter the names of their new saves. I also stylised the highlighting a bit more, and , even though its not in the video, now, the color changes to green when you’re selecting a save. This was a really fun learning experience. I originally wanted to make a TUI because one of the raters on my last project, leading zero util , complained about having to use a simple CLI and told me it wasn’t that good because of the lack of TUI, so this has been kind of a personal vendetta against that person to improve my software and user experience. The Other Interface This project isn’t just a CLI utility. The entire time I’ve been building this, I’ve wanted to enable others to make a frontend for it, whether it be on the web or a gui or some port of it in something. I’ve maintained a careful separation between lib and bin, with the exception that they are the same crate. For library users, dealing with my errors would be impossible since many of them are just strings and they are all just Box. Before throwing this on crates.io, I want to make error enums and stuff so people can do error matching. Tap Tap After completing error enums and stuff, I’m going to throw it on crates.io and make a github release so I can make a Homebrew tap. The last time I made a homebrew tap, I gave the project it’s own separate tap repo, but this time I’ll keep all my taps in a new tap repo on my GitHub instead of Codeberg for users. That’s it for now! I’m excited to make error enums so I can have that skill under my belt as well! Also, I’ve reached the point where shipping would probably let me get a framework 12, which is very exciting for me."}, {"post_id": 74790, "ts": "2026-09-28T08:03:25Z", "hours": 3.5664, "text": "Pick Me Hello everyone! Let’s dive in so I can go feed my gecko and sleep! Seleccionar For the past few hours, I’ve been working on the file picker for selecting a rom and a save file. A lot of it is just learning about how to use Ratatui. Originally, I was going to have the selecting happen all at once, by one function, but I switched it to two calls so that load_rom() and has_battery() can be called to check whether the save menu should even come up. Write-In Candidate The thing is, since with a new save, the file has to be constructed by the emulator and it doesn’t exist. Right now, I’m writing a little text input field to be triggered if the save menu gets close with Esc. This will be pretty short, and won’t require a large change to existing code. After that, I’ll wire it in and test. Next Steps Homebrew Cask Separating frontend from backend crate by crate, so lib users don’t have to deal with frontend only imports."}, {"post_id": 73502, "ts": "2026-09-25T07:49:51Z", "hours": 2.4244, "text": "Ratatouille Hello everyone, we’re back with another devlog! Let’s dive right in so I can hit bed so I can go rafting the day after tomorrow! Compliance Chips I’ve finally finished dealing with compliance! I’m surprised by how many extranneous parentheses I had! I knew I had a lot, but I didn’t know it was this much! I’m so happy that is over so I can get to real work! Tui T. Sutherland The last big feature I wanted to add before shipping was a TUI for selecting ROMs and saves. To do this, I need to use the ratatui crate, which fortunately run off the same crossterm my project already does. So far, all I’ve done is learn about it and write the fn for getting the directories/files with the appropriate endings and sorting them for display use. I’ll see y’all in a couple days!"}, {"post_id": 73040, "ts": "2026-09-24T08:03:54Z", "hours": 1.5953, "text": "Comply-cations Hello everyone!! We’re back with another devlog today. Let’s dive right in so I can start the next step! Parensal Issues As I said in my last devlog, while working on compliance for joypad.rs, I realised that I needed to delete extra parentheses around operators with obvious precedence. After working on that file, I continued down the buffers open in Neovim, also correcting that issue in addition to the others. Because I only caught it midway through, I have to complete a second pass of compliance editing. Fortunately, I have mini.surround installed, so deleting parentheses is really easy. That’s all that really happened. Make sure to listen to the daily dose of Jamie Paige and Vane Lily’s new song!"}, {"post_id": 72583, "ts": "2026-09-23T08:54:29Z", "hours": 1.9347, "text": "You Will Be Terminated Hello everyone! We’re back with another devlog! Let’s dive right in since it is 02:00 over here! Lookin’ So Fab I have contined with my quest to implement my BEAUTIFUL and living style guide. Here’s what I did, since this work is mostly just repetitive and long. gpu.rs and memory_bs.rs publicity compliance. Before today, 4/6 of Gpu’s fields were pub(crate) something they had no business being, so I refactored so everything uses methods. Took a chunk of time but it was very worth it. registers.rs This one was pretty stupid. It had two main issues, publicity and masks. The lackluster and incomplete guide I was following had me write registers.rs with a ton of bitmasks it didn’t need it in a way that was ugly and sad, so I dropped the masks. All of Registers’ field and subfields are pub(crate), which I determined is optimal because it would be a major and massive chang to Cpu, and the registers are purely for the Cpu to use, and are part of the Cpu. rom.rs rom.rs was pretty chill, only a few things here and there. joypad.rs Despite this one taking a matter of minutes, this one is going to cause my so much work. All of its publicity was correct, as well as bit selecting formatting. Turns out I’ve been forgetting to remove parentheses around my files! Simply ridiculous! ANyway, that’s all for now, since I need to go touch bed. So y’all later, and keep listening to Jamie Paige!"}, {"post_id": 72213, "ts": "2026-09-22T13:50:31Z", "hours": 2.2914, "text": "If You Do Not Comply Hello everyone! We’re back with another devlog! I need to go to school soon, so let’s dive right in! Numerics, Literally Since I made the style guide, it was time to start implementing it. So far, I’ve gone through emulator.rs, memory_bus.rs, apu.rs, and cpu.rs. emulator.rs This one just needed doccomment formatting. memory-bus.rs This one needed a few numeric literal changes. I also directly accesses the stat field of gpu, which is unnacceptable, but since I’m doing gpu.rs next, I left it for the time being. apu.rs Despite being the file in which I came up with a chunk of my numeric literal style while writing, it felt like every literal was wrong. cpu.rs This was the second easiest file, despite it being the longest by a wide margin. There was some repetitive numeric literal issues in the methods, but that was it. I also tried to split it into multiple files for length since it is double the size of any other file, but I lowkey failed. Next up is gpu.rs compliance. I’ll see y’all next time!"}, {"post_id": 71902, "ts": "2026-09-21T18:55:47Z", "hours": 4.1017, "text": "Dripmogging Hello developer theme users! It’s been a couple days since my last devlog, since I couldn’t make one last night since my dad thought I had school today, so let’s dive in so I can work on compliance and becoming a peer tutor for math for my school! Bitmasks: origins One of the biggest parts of this project is working with bytes and getting data from bytes. To do this, you have to shift the bits you want to the end and then mask them like (byte >> shift) & bitmask . I feel like I’ve gone through dozens of different styles for bitmask and shift numeric literals, which is where the whole style guide idea came from. Personal Stylist For the past 4 hours, I’ve been perfecting a style guide for my codebase. It’s a beautiful org doc with that sweet sweet table of contents with rules on everything from numeric literals to tests to error enums. There’s not to much to say except the next step is going over all 5000+ lines of code to enforce compliance. I’d like that written up A quick note on org. Many online code hosting services like GitHub and Codeberg support org rendering. Rather unfortunately, crates.io only supports a README.md, and not a README.org, which gives me a big sad, especially since I’ll haveto rewrite my README in markdown (ew), which does not give me the luxury of an automatically generated table of contents. That’s it for now folks, see y’all tonight!"}, {"post_id": 70463, "ts": "2026-09-19T07:33:42Z", "hours": 5.4736, "text": "Scream it Loud and Scream it Proud Hello everyone! We are back with the once again DAILY devlog!!! Let’s dive right in! IT LIIIIIVES!!! This morning, as soon as I came up, I sat my @ down to trouble shoot my audio processing on 4 hours of sleep . Despite adding the manual sleep time reduction, I was still experiencing some crackling, so I found a bug in the channels, solving which didn’t solve anything, but switching timing to be based off of audio when available worked like a charm, giving better and more accuracte speeds and crisp audio, so I was able to show off my COMPLETED EMULATOR CORE to some of my friends (as well as my backpack with Ferris on it). IT DIIIIIES!!! After adding the audio, I had to make sure that it wouldn’t cause the emulator to break, so I added a timeout that shuts off audio if it’s broken for more than 500 ms YES CAAAAAAP Because of how I was translating from u16 audio to f32, I was getting popping, so I implemented a software capacitor to slowly dampen sounds closer to EQUILIBRIUM SWITCH IT UUUUP After audio had all it needed, it was time to work on something I had long anticipated, a lib.rs for people o build their own frontends on top of my emulator. I also added an Emulator wrapper struct around Cpu so that it would be easier to manage pub methods and such without the ~1550 other lines in cpu.rs making things hard. There’s a reason this project isn’t just one big file of 5000 SLoC. I also added some documentation, and I found the best use of Claude Code is checking for spelling errors (it’s like I’m illiterate!) Speaking of SLoC, I cracked 5000 today! This is about 3.5x larger than my last two projects combined! I’ll see y’all next time, and don’t forget to listen to beabadoobee’s new album Pylon and Jamie Paige!"}, {"post_id": 70001, "ts": "2026-09-18T07:59:49Z", "hours": 5.9544, "text": "BLAAALAKKLJHSLJHDKHJALKJHLKGSFG Hello everyone! It seems that the devlogs have become oppositely bidaily — just this once, don’t you worry — than my last two devlogs. Let’s dive right in since we have so much to cover. audio output master race After I finished chan 4, it was time to implement master apu registers and channel mixing and panning. Most of the registers were pretty simple, except the one with the master APU power on/power off, as to implement it I had to gate every write on whether it was on, except the wave RAM. I also did that during my PE class (while exercising, of course), which contributed to the difficulty. Fortunately, I write my code in Neovim, so it really sped things up, including 1-handed editing. With that, the backend was nearly done, and I had reached the point at which I would no longer need Pan Docs or anything of the like, just straight Rust sailing. Thread the Needle In order to get the audio timed correctly, I had to hook up tick_channels() to a channel on which it sends a tuple of u16s (left and right amplitudes) to some receiver. This lets the audio be decoupled from whatever frontend one has. Your Pal, CPAL cpal is a a Rust crate for audio and stuff. Here’s the audio stuff because I can’t think straight it’s so late & I have an integration by parts quiz tomorrow and I don’t want to fail something light b/c I didn’t sleep. fn get_audio_stream ( cpu : & mut Cpu ) -> Result < Option < Stream > , Box < dyn std :: error : : Error >> { if true && let Some ( device ) = cpal :: default_host () .default_output_device () { let supported_stream_config = device .default_output_config () ? ; let stream_config = supported_stream_config .config (); let sample_format = supported_stream_config .sample_format (); let ( sender , receiver ) = std :: sync :: mpsc :: sync_channel :: < ( u16 , u16 ) > ( 5000 ); let error_callback = | _err : cpal :: Error | {}; cpu .set_audio_sample_rate ( stream_config .sample_rate ); cpu .set_audio_sample_sender ( sender ); let stream = match sample_format { cpal :: SampleFormat :: F32 => { let data_callback = make_data_callback :: < f32 > ( receiver , stream_config .channels ); let stream = device .build_output_stream ( stream_config , data_callback , error_callback , None , ) ? ; stream .play () ? ; Some ( stream ) } cpal :: SampleFormat :: I16 => { let data_callback = make_data_callback :: < i16 > ( receiver , stream_config .channels ); let stream = device .build_output_stream ( stream_config , data_callback , error_callback , None , ) ? ; stream .play () ? ; Some ( stream ) } cpal :: SampleFormat :: U16 => { let data_callback = make_data_callback :: < u16 > ( receiver , stream_config .channels ); let stream = device .build_output_stream ( stream_config , data_callback , error_callback , None , ) ? ; stream .play () ? ; Some ( stream ) } _ => Err ( \"Audio output sample format not supported! Try disabling audio in your config with 'audio = false'\" , ) ? , }; return Ok ( stream ); } Ok ( None ) } // makedatacallback not shown due to char limits Position,Velocity, Acceleration, Jerk, Snap, Crackle, and Pop After that, I tested it, but there was some terrible audio crackling. Turns out it was due to oversleeping when trying to time things correctly, though before finding this out, I ended up slightly optimising draw_frame().The artifacts seem to be mostly gone and I will leave this to tomorrow silly. nearly @ 5000 sloc"}, {"post_id": 69022, "ts": "2026-09-16T07:14:24Z", "hours": 1.4908, "text": "Madra Channels Here we are; we’re back again, making this a bidaily devlog?! Let’s dive into the last 1½ hours of development so I can touch bed. Me-Chan Navigator After finishing channel 4, it was time to tackle the most complicated (maybe, but 4 is pretty funky), or at least the weirdest. I thought channel 3 varied it’s pitch based on the info in the wave ram, BUT NOOO, it varies the waveform instead. It let’s the gameboy make more varied sounds rather than just variations of beeps, like saw waves and stuff. Lots of its machinery is reused from the other channels, and it also doesn’t have envelope because you can vary the volume yourself. That’s it for this devlog! See y’all tomorrow as I probably will finish audio tomorrow! I don’t think there is an applicable image for this, so have some xkcds"}, {"post_id": 68979, "ts": "2026-09-16T04:46:04Z", "hours": 3.0544, "text": "4Chan Hello everyone! Welcome back to the Daily Devlog, where we go over the new developments in RustyGameGirl!! Let’s get started with today’s broadcast! White Noise, Brown Noise, Black Noise, Grey Noise, What’s the Difference? After finishing the two pulse channels, 1 and 2, it was time to start a new one. I went with channel 4 since it is the closest to 1 and 2 in terms of structure and simplicity. Channel 4 is a randomised noise channel thingy, for stuff, like gunfire maybe? Here’s the summary from Pan Docs: This channel is used to output white noise, which is done by randomly switching the amplitude between two levels fairly fast. The frequency can be adjusted in order to make the noise appear “harder” (lower frequency) or “softer” (higher frequency). The random function that switches the output level can also be manipulated. Certain settings can cause the wave to be more regular, sounding closer to a pulse than noise. A lot of channel 4’s machinery is the same as 1 and 2’s, like envelope and length, which brings us to our next section. Adaptive Water Body Until today, I have never written a trait in Rust. I’ve used them, of course, especially Default and Drop, but also the num-traits crate from when I was making my fast-factor crate, but I’ve never written one before. I figured now was as good a time as any, especially since all four channels share many similar methods, like the nrxy reads and writes, output (to u8 only), clock_length, tick_period, etc., so I added the three following traits: trait Channel { fn output ( & self ) -> u8 ; fn tick_period ( & mut self , ticks : u32 ); fn clock_length ( & mut self ); fn nrx1_read ( & self ) -> u8 ; fn nrx2_read ( & self ) -> u8 ; fn nrx3_read ( & self ) -> u8 ; fn nrx4_read ( & self ) -> u8 ; fn nrx1_write ( & mut self , byte : u8 ); fn nrx2_write ( & mut self , byte : u8 ); fn nrx3_write ( & mut self , byte : u8 ); fn nrx4_write ( & mut self , byte : u8 ); } trait ChannelWithEnvelope { fn clock_envelope ( & mut self ); } trait ChannelSpecificFeature { fn nrx0_read ( & self ) -> u8 ; fn nrx0_write ( & mut self , byte : u8 ); } Having all the separate impl blocks forced and ordered the same makes the code far more readable, and it’s not like this will slow the code, and it sped up the creation of channel 4 and will likely speed up channel 3’s creation. Notes Rather unfortunately, since I was coding piecemeal today and I was to lazy (probably b/c of the gudetama shirt I’m wearing), I didn’t start listening to music until ater I was done coding, while I was working on homework (English I think? It was the only real homework I had today since I did most of the rest in class), but a Polyphia song just popped up in my shuffle (Reverie), and I locked in so much harder. Also, once I started working on the APU, I cracked 4000 SLoC!!! That’s more than my last two projects doubled and combined. It’s also likely the majority of code I’ve written in the 7 years I’ve been programming. I am currently at 4509 SLoC, which is over triple my last two projects combined! See y’all tomorrow, if not later tonight!"}, {"post_id": 68505, "ts": "2026-09-15T07:22:17Z", "hours": 2.2572, "text": "Sweep It Under the Rug Hello humans! We’re back with the DAILY DEVLOG!!!!! I need to go to bed and feed my geck, so let’s dive right in! No Sweeping for You! Today, I finished up last night’s work of finishing channel 2. All that was left was adding an output to u8 fn that’s just sitting there as dead code rn and wiring it up to read_byte(). relatively uneventful, except for when I forgot how bitwise operations work. WeeeWoooWeeeWooo After channel 2, the obvious next step was channel 1. Channel 1 is just channel 2 with an extra feature: sweep. Sweep is kinda funky. I thought it changes envelope, but it actually changes pitch. It does some weird funky shenanigans to change the pitch and also on note trigger. A lot of building channel 1 was just making echo fns for proper layering of structs. Pan docs was once again confusing. Notes A side note on documentation. While working, I decided to read the forword of pan docs, and lo and behold, its built for game developers, but there’s also a Complete GB Technical Reference which was supposedly built for emulator builders. I decided to check it out and see if it would be more useful than pan docs. BUT GUESS WHAT?? It had EVRYTHING EXCEPT AUDIO in there!! The word “audio” was used exactly once!! Apu wasn’t even mentioned!!! SO I have to continue with pan docs, which does have decentish detail for audio. Music I ended up listening to a lot of Chappell Roan, Cavetown, CITY LIMITS, and MAFUMAFU this session. Y’all should listen to the PEAK music of Sorry Ghost as well. See y’all next time!"}, {"post_id": 67901, "ts": "2026-09-14T06:27:32Z", "hours": 3.3375, "text": "Apu, like from The Simpsons ? Hello beautiful humans! We’re back, and I’ve finally stopped procrastinating on the APU! Let’s dive right in! CPU, GPU, TPU, NPU, LPU, DPU, and now APU?! I’ve been very scared of dealing with the APU, since it’s seemed like the hairiest thing to deal with, and it’s also the last part of the emulator core. The APU has four channels and mixing and fading and stuff I will get into. 2 Chan The first channel I started with was channel 2, since it is the simplest (1 has an extra feature, but otherwise, they’re the same) There are four things one needs to understand for these channels: Period Duty Length Envelope Duty is the waveform of the audio, like what percentage of the square wave is at level 1 vs level 0. This changes the timbre of the sound. Length is the amount of time the note plays for. It’s harder for devs to have to manually turn off the notes on their own b/c of timing. Envelope is the fade in/fade out of the sound Also, on channel 1, there is sweep, which changes envelope I think? I don’t know b/c Pan Docs is confusing for this (built for game developers it feels) Aaaanyways, that’s it from me for now, as I have a history in-class writing test thing tomorrow and I’ve already hit my 2½ hour goal for the day. Also, I was listening to Constant Companions and I realised I probably never listened to the album hard enough b/c “Clouddrop” is a lot more depressing than I remember, and I got ts on vinyl soo that’s something I will be embarrassed to tell my friends. Also, y’all should listen to Constant Companions to increase her listeners so that one day, Jamie can have her Paige again."}, {"post_id": 67127, "ts": "2026-09-13T05:58:53Z", "hours": 0.7461, "text": "Blink Twice Hello everyone! This is going to be a shorter devlog, so let’s dive right in! NOOOOOOOOOOOooooooooo When I set up the keypress handling a bit back, I wanted to use the default Retroarch keybinds so that anyone who had ever used Retroarch could use RGG without difficulty. The one discrepancy was that you only had to click escape one singular time to quit the emulator. I am no stranger to mistaken clicks, and today I realised this could be an issue for anyone who shares some of my clumsy tendencies. I figured it iwould be good to better copy Retroarch’s binds by making it so that you had to click Esc twice in quick succession to quit. A nice and easy change tha’s completion will probably force me to actually stop procrastinating audio/APU. Anyyywayyy, y’all should listen to CityLimits , DeltaFey , and Black Polish . I feel all of their music is great for programming. We’ll see if I can post another devlog today. ¡Adiós!"}, {"post_id": 66415, "ts": "2026-09-12T07:26:24Z", "hours": 0.7267, "text": "Frontman Hello everyone! This will probably, maybe, be the shortest amount of time for a devlog, so let’s hop to it! I’ll never let you go Last night, I implemented the backend funtionality and started on frontend functionality, a ’lil bit. Over the past 30 odd minutes, I finished up the saver struct. I wanted to have Saver be have a custom drop impl, but that would require it to carry an immutable reference to the CPU through the running of the emulator, which would break ownership rules due to having to make a mutable reference to the CPU to step it. What I did was I isolated the loop into a function and saved the return value to a variable, which gets propogated after the emulator attempts to save. The video is of me loading in a save into Pokémon Red! Comment which theme you want me to show off next!"}, {"post_id": 65817, "ts": "2026-09-11T06:36:19Z", "hours": 2.92, "text": "SAAAAAAAVVVEEE MEEEEEEE Hello everyone, we’re back with our daily devlog, this time before midnight! Let’s dive in! I’ll never forget you After finishing the MBCs, it was time to work on saving the game state. I had to save the data in binary form. Originally, I was going to use bincode, but I switched to postcard since bincode has been deprecated. I managed to get the plumbing working, so now I just have to implement the saving in main.rs. I had to keep this short since I need to go to bed. See y’all!"}, {"post_id": 65238, "ts": "2026-09-10T07:13:40Z", "hours": 1.3814, "text": "Rap It Up Hello friends! We’re back with the Daily Devlog! This one’s a quickie because the docs were (mostly) clear and I was listening to Rob Apollo while working. Let’s dive right in so I can run a mile on 5.5 hours of sleep rather than only 5! The Final Boss of MBCs When I started to do MBCs, the scope of this project was to do no MBC, MBC1, MBC2, MBC3, and maybe MBC5. I have been completing them largely in sequence: MBC1 MBC2 No MBC MBC3 (yesterday) This leaves only MBC5, today’s feature. I thought MBC5 was going to be difficult, but it was probably the easiest MBC besides no MBC, which isn’t even an MBC! MBC5 is basically a simpler and bigger version of MBC1, with two exceptions: Rumble: Apparently, cartridges can shake it down because some MBC5 variants have a rumble motor controlled by bit 3 of the CRAM selector. If there is rumble, that bit is dead. Chunks Every other MBC I’ve implemented followed this general rule: the ROM is exposed of 0x8000 bytes. Those bytes are split into four sections, each of 0x2000 bytes. Depending on which register you wrote to, it would be a different MBC command/"}, {"post_id": 64657, "ts": "2026-09-09T07:16:11Z", "hours": 2.3947, "text": "Third Time’s the Charm Hello everyone! I would have devlogged sooner, but I’ve spent most of the last time between this devlog and the last on a single feature, and the rest on YouTube. Let’s dive right in! Clock Iiiiit! After adding MBC2 and No MBC, the natural next step was MBC3. MBC3 is a lot like MBC1. It uses mostly the same register, many of which are direct copies or basically the same. There are only two key differences: MBC3 supports more RAM and has an RTC (real time clock). The more RAM wasn’t much to deal with, but the RTC kinda was. I messed up a good deal of the ticking on the irst pass of writing it, and I kept forgetting how if let worked, which did end up slowing me down. Anyway, it’s well past midnight and I need to smash my face in my pillow. My one regret is that I didn’t listen to enough Jamie Paige while devving."}, {"post_id": 64608, "ts": "2026-09-09T03:53:21Z", "hours": 3.1956, "text": "Clip It Hello comrades! We’re back with yet another devlog! Let’s dive in so I can get back to programming! Memory Control (Not 1984 Style) A bit ago, I mentioned that since cartridges were physical pieces of hardware, they could have logic chips of their own controlling their own RAM, so I would have to emulate those on top of the functionality of the actual GameBoy’s hardware. The next MBC (memory bank controller) to emulate was MBC2. MBC2 is weird. It has ROM banks as standard, but it also has 512 half-bytes of RAM built straight into the MBC chip for some reason. Those were a little weird to emulate, but altogether straightforward. I also had duplicated RAM indexing logic for both reading and writing to the cartridge RAM, which I marked todo in my code, so I had an excuse to do a quick refactor. After handling the weird little freak that is MBC2 was implementing No MBC. You may be asking, V, what’s there to emulate if there is nothing to emulate? And to that I say, it is once again weird and silly, just how we like it. Even if a game has no MBC, it can still have some RAM; it’s just always on and has no logic for accessing it. It ended up with me having to deal with a lil extra changes to handle some things I was not anticipating. Looks Like You’re Trying to Kill a Stick Figure A while ago, I watched a prime video (who was also the source of the idea for this project) about the Power of 10. I’ve since thought these rules are pretty neat and can serve to make code better (with possibly the exception of rule 7). I decided that I wanted to follow rule 10 for my code, so I foolishly set all lints to max pedantic, thinking I would have some lints, but I ENDED UP HAVING HUNDREDS OF MOSTLY USELESS LINTS, many of which ended up being me using as for casting causing less readable behaviour. Some of them were useful, such as me allocating MASSIVE arrays on the stack, even if they were boxed. Turns out Box::new([0; 0x20000]) creates the array on the stack first before memcopying to the heap in unoptimised builds, which is completely unnacceptable. Also, may of my other arrays were just straight up massive and unboxed, like the framebuffer or bus memory flat array. Anyways, after spending the bulk of this devlog’s time dealing with that, I gave up knowing the rest of the lints were harmless and pointless and clogging up important lints. In other news, despite listening to Jamie Paige for many hours this weekend, I still ended up needing my fren to tell me about it’s new song with Vane Lily and Yuma . I also showed them to Developer theme and it brought them some joy. I’m also very happy I got the thermometer question right, especially since I have an infrared thermometer on my desk and I had to find the correct emissivity setting to use on milk yesterday since my dad was making yoghurt. Anyway, I’ll end this before Grammarly shows me any more lints for this devlog."}, {"post_id": 63424, "ts": "2026-09-07T08:10:14Z", "hours": 5.5439, "text": "Can It Tetris? I say hello to you again, my near and dear viewers, as I begin this devlog with a frustratingly long amount of time logged. Let’s dive in so I can put the last few days behind me. DMing the Memory Last time I menioned that there was a feature I needed to add that allowed the cpu to write a byte to a register in memory to trigger a transfer of data from the address specified by the written byte to the OAM (object attribute memory — sprites and stuff; this transfer is the DMA OAM tranfer) because that was the main way stuff was written to oam b/c otherwise it would be too slow. Originally, I wrote a doubly recursive function kinda thing b/c it called read_byte() when it itself was called indirectly by read_byte() and it also called itself, but I scrapped it due to unguarenteed tail recursion and the slowness of repeatedly matching the section of memory being written to/read from, so I just used copy_within(). This also somehow fixed my input issues, so idk. Double Bug Whammy This is the part of the last few days that has been a slog and a horror. After adding the DMA OAM transfer, I tried running Tetris, and it worked…until I got into gameplay. The sprite showing the selected player amount on the start screen was working and it would respond to user input. However, when it hit actual gameplay, it wouldn’t render the tetromino sprites until they were baked into the background as part of setting in place. To try and diagnose the problem, I ran blarrg’s big cpu_instrs.gb test ROM, and it stopped rendering frames in the middle of the 3rd test, the standalone ROM for which had been working without a flaw. Testing in mGBA through RetroArch (I don’t have mGBA installed standalone on this device), I found that the test takes a second to run, but doesn’t cause the whole emulator to hang. Also, since new frames weren’t being completed, it wouldn’t poll for input since it only polls on a frame completion, which meant I had to close the terminal session to quit the emulator. I spent hours running tests just to find that it was getting hit by a STOP instruction it couldn’t escape. I checked Pan Docs and found there had been some unimplemented STOP behaviours. After implementing those and it still not working, I set STOP to only stop for a single cycle, which let the test ROM pass all the tests with no timing issues. After that, within 2 minutes, I was able to find an incorrect == (should have been !=) in my sprite attributes bit 7 sprite priority control, allowing Tetris to finally work!!! Next up is: MBC2 MBC3 MBC5 Saving Audio TUI rather than bare CLI a lib.rs so others can write a frontend on top of Rusty Game Girl A style guide and making my code compliant (hard to do while writing and over a codebase who’s size is at least 4.5x bigger than anything else I’ve ever worked with) Unit tests also here’s a video of me selling at Tetris b/c I wasn’t listening to Jamie Paige while playing"}, {"post_id": 61315, "ts": "2026-09-04T05:11:57Z", "hours": 2.0253, "text": "RAM or ROM Hello everyone! I’ve finally logged a normal amount of time again! Let’s dive right in! MBC Say One! I managed to bang out my first supported MBC (memory bank controller), a lot of it done while walking on the treadmill this morning. I had already implemented the ROM bank switching by this morning, so next I had to implement switching RAM banks, which has some pretty funky indexing. Grace Hopper Naturally, what does one do when they have a hopefully working MBC system, you try a rom!. I only found out tetris doesn’t use an mbc after removing my basic mbc substitute stuff that enabled me to run simple roms. Speaking of Tetris, the screenshots are me attempting to run tetris iwth different themes (the themes work, tetris doesn’t which we’ll get to). The themes in order Wisteria GBGRreen Jungle Developer (Don’t worry, there’s more themes, and you can always submit an issue or PR with a new theme) Let’s get back to BUGSSSS!! When I tried to run tetris, it wasn’t accepting input and the arrow showing which options are selected was unpresent. These issues are the next things to resolve. I found that there was a critical error in the read methods on my button data stuct Here is the commit with the changes in case you are curious. I found out that there is a spot in memory you can write to to load a sprite from some address into OAM. This is the next thing I will be implementing before I try finding the next issue with input so I can at least see some pretty sprites. Anyway, see y’all tomorrow after I hopefully get tetris working!"}, {"post_id": 60661, "ts": "2026-09-03T05:07:00Z", "hours": 3.2858, "text": "You can switch the banks, switch banks, swi- swi- swi- swi- swi- — until you’re full of life Hello everyone! I changed the name of my project directory, so I wasn’t seeing my hackatime or had the ability to write a devlog until I realised the problem, so let’s just dive right in! Bank It The next thing to deal with was bank switching and better behaviour for handling roms. Cartridges are physical objects, and thus can have extra RAM and storage for the gameboy. These are controlled by MBCs (memory bank controllers). The most common ones are MBC1, MBC2, MBC3, and MBC5. For this project, for now, I am only emulating 1, 2, and 3. In the future, I will probably add more controllers once the full architecture is done for at least these three so I have an idea of hwo the skeletons should look. The first step of bank switching was having the rom portion of the memory be read-only and writes to it do certain mbc actions, like enable ram or switch banks or switch ram. I am currently implementing the switching of banks. I need to get back to MBC1-specific flags and writes. See y’all next time!"}, {"post_id": 59742, "ts": "2026-09-01T17:50:39Z", "hours": 7.8103, "text": "Human Error Hello everyone! I got too much in the flow and in the RAGE, which is why I logged nearly 8 hours since the last devlog! Let’s get in the weeds! Loading Bay I added ROM loading!!!!! I can actually load a test ROM in now!!! Naturally, I immediately loaded one in, and that brings us to our first issue. Speed? Issues When I was loading in a test ROM, the text of the name of the test would peek from the bottom of the screen, then jump up and not show passed. I probably spent 2 HOURS on trying to fix this. I thought it was a speed issue, and I ended up making a ton of optimisations and added alternate screen switching. BUT GUESS WHAT??? I zoomed out my terminal window, and there it was: Passed. I would share a screenshot, but I am currently working on changes to load_rom() that break the emulator currently (bank switching). Don’t Stop I mentioned a while ago that I had to emulate a bug in the hardware that caused the next instruction to occur twice if HALT is called when there is an interrupt pending and IME (interrupt master enable) is off. My implementation caused it to infinitely stall instead. So I fixed that bit, but the HALT bug test rom still wasn’t running the tests, so I found that LY couldn’t be read from memory, so fixing that fixed the thing, allowing the tests to run and FAIL. So I had to run a disassembler on the HALT bug test to find the exact mechanics of the HALT bug, then write it. Even though the values for the result were correct, it still wouldn’t pass. This was because of an oversight on my part when I was writing the interrupt handling. The IF byte (0xff0f, pending interrupts, whether or not they’re enabled) in hardware always has its highest 3 bits as 1, and I didn’t think it was necesary to implement this when I was writing interrupt handling, so I ignored it. And finally, fixing that, the HALT bug worked. The screenshots are: Gambatte failing the test. mGBA passing. RustBoy (May change to GameGirl/RustGirl for uniqueness and searchability) passing. See y’all next time!"}, {"post_id": 58276, "ts": "2026-08-30T17:25:28Z", "hours": 4.9708, "text": "You’ve Been Selected for a “Random” Screening Hello Everyone! We are back! I don’t know how it’s already been over 4½ hours! Let’s dive straight into the progress! They Know How to Push Each Other’s Buttons After making constructors for the structs and refactoring the button data struct, I added a loop to handle all waiting button presses and set the data in the button data struct. Not particularly complicated, though it was fun to test something that actually did something. Staaaaahhp Instructions take a set amount of time, so it is necessary to have a pause, since even a TI-84 (buy the CG-50 or HP Prime G2 instead; don’t get the CG-100, it lacks plugin support, which is why I recommend the CG-50 at all) is faster. Since systems can’t pause for a single tick, it pauses frame-by-frame instead. How to Exit Neovim I didn’t take the time to add a break condition, so I added a check to see if the escape key had been pressed, and if it had, it quit the application. Show Me the Money The biggest development was the render loop. Now, there is actually a visual to see and play with. Paint a Pretty Picture I also felt it would be boring if there was only one colour theme, so I added an enum along with PixelValue => Colour matching so that you can pick a theme! Speaking of picking… Staring at a Config File Since the user has to be able to pick a theme, I felt it would be good to have config.toml support for ease of use."}, {"post_id": 57137, "ts": "2026-08-29T07:35:57Z", "hours": 5.585, "text": "Building Buttons Hi everyone!! It seems that time has slipped away from me yet again, so let’s dive straight into your scheduled content! Pushy Pushy Buttons After dealing with sprites (oh! the horror! the suffering! the despair!), it was time to deal with a new kind of beast: the joypad. Implementing joypad functionality meant it was time to make a frontend (ew) instead of just building subsystems and cobbling them together later. This meant it was time to learn stuff about the crossterm crate and make some constructor functions. The screenshot is my current struct for storing the button push data. It used to be 8 bools, but that was 7 bytes too many, so it’s just a u8 wrapper now. Cross-multiply Those Terms! Crossterm is a crate for dealing with terminal keyboard interrupt and such. The first and only thing I’ve done so far was make a wrapper with a custom destructor for Keyboard enhancement flags. struct TerminalGuard { enhancement_pushed : bool , } impl TerminalGuard { fn new () -> std :: io :: Result < Self > { enable_raw_mode () ? ; let enhancement_pushed = supports_keyboard_enhancement () .unwrap_or ( false ); if enhancement_pushed { execute! ( stdout (), PushKeyboardEnhancementFlags ( KeyboardEnhancementFlags :: REPORT_EVENT_TYPES ) ) ? ; } Ok ( Self { enhancement_pushed }) } } impl Drop for TerminalGuard { fn drop ( & mut self ) { if self .enhancement_pushed { let _ = execute! ( stdout (), PopKeyboardEnhancementFlags ); } let _ = disable_raw_mode (); } } Computah, Make me a New Computah Since it was time to write a main() fn, it meant I also had to write constructor functions for CPU and all it’s subsidiaries, since I’ve not bothered to do it before. That’s it folks! See y’all next time!"}, {"post_id": 53353, "ts": "2026-08-23T21:11:57Z", "hours": 2.6878, "text": "Crack Open a Sprite Hello everyone! This dvelopment took longer than expected, so let’s just dive right in! County Rogues, Bring me lOAM After I finished the window layer, it was time to deal with sprites. Where each sprite is on the screen, which tiles to use, and sprite-specific render attributes are stored in a section of memory called OAM. 40 sprites’ data can be stored in OAM, each 4 bytes: the x position, y position, which tile(s) to use, and the attributes of that sprite (height, when to render, etc.) Unlike the background and window, sprites have a lot more moving parts. Here’s my code for rendering the sprites to the buffer. fn render_sprites ( & mut self ) { let lcdc = self .read_byte ( 0xff40 ); if lcdc >> 1 & 0x1 == 0 { return ; } let mut indexes = ( 0 .. 40 ) .collect :: < Vec < u16 >> (); indexes .sort_unstable_by_key (| n | ( self .read_byte ( 0xfe01 + n * 4 ) as i16 - 8 , * n )); let indexes : Vec <& u16 > = indexes .iter () .rev () .collect (); let height = if lcdc >> 2 & 0x1 == 0 { 8 } else { 16 }; for n in indexes { let entry = 0xfe00 + n * 4 ; let sprite_y = self .read_byte ( entry ) as i16 - 16 ; let sprite_x = self .read_byte ( entry + 0x1 ) as i16 - 8 ; let tile_index = self .read_byte ( entry + 0x2 ); let attributes = self .read_byte ( entry + 0x3 ); let palette = if ( attributes >> 4 ) & 0x1 == 0 { 0xff48 } else { 0xff49 }; for row in sprite_y .clamp ( 0 , 144 ) as u8 .. ( sprite_y + height ) .clamp ( 0 , 144 ) as u8 { for column in sprite_x .clamp ( 0 , 160 ) as u8 .. ( sprite_x + 8 ) .clamp ( 0 , 160 ) as u8 { if ( attributes >> 7 ) & 0x1 == 1 && self .bit_7_check ( row , column ) { continue ; } let row_in_sprite = if ( attributes >> 6 ) & 0x1 == 0 { ( row as i16 - sprite_y ) as usize } else { height as usize - ( row as i16 - sprite_y ) as usize - 1 }; let column_in_sprite = if ( attributes >> 5 ) & 0x1 == 0 { ( column as i16 - sprite_x ) as usize } else { 7 - ( column as i16 - sprite_x ) as usize }; let which_tile = if row_in_sprite < 8 { ( 0 , 0 ) } else { ( 1 , 8 ) }; let pixel = self .index_to_tile_unsigned ( tile_index + which_tile .0 ) [ row_in_sprite - which_tile .1 ][ column_in_sprite ]; if pixel == TilePixelValue :: Zero { continue ; } let value = self .palette_lookup ( pixel , palette ); self .gpu .set_pixel ( row , column , value ); } } } } fn bit_7_check ( & self , row : u8 , column : u8 ) -> bool { if self .window_active_for_pixel ( column , row ) { if self .window_pixel_value ( column , row ) == TilePixelValue :: Zero { return false ; } return true ; } if self .background_pixel_value ( column , row ) == TilePixelValue :: Zero { return false ; } true } This also excludes any boilerplate for window and background that I had to reuse. The most annoying part was dealing with ordering indexes efficiently, because the x value of the sprite is used as the method for sprite precedence over layers. I didn’t realise that sort_unstable_by_key dealt with like tuples and you could use that for precedence and tiebreaking. Anyway, that’s all folks! see y’all next time!"}, {"post_id": 51464, "ts": "2026-08-21T05:58:56Z", "hours": 1.9039, "text": "Ogres are like Onions Hello everyone! This time, I’ve fortunately logged a normal amount of time. Let’s dive in! Close the Window! After the background rendering was complete, it was time to work on the next layer: the window. The window is exactly as it sounds — the layer between sprites and the background that can have ui and stuff. The window starts at a position dictated by wx and wy (0xff4b and 0xff4a in memory), and those two dictate the top-left corner of the window layer (though wx - 7 is the actual top-left x coord). If a game wants to have a window layer that ends, it will switch off the window layer BETWEEN scanlines, which my current implementation cannot do because I render the whole frame at VBlank (after all scanlines) for simplicity, and it’s not strictly necessary. The code implementation of the window layer was relatively similar to background: fn window_active_for_pixel ( & self , screen_x : u8 , screen_y : u8 ) -> bool { if ( self .read_byte ( 0xff40 ) >> 5 ) & 0x1 == 0 { return false ; } let wy = self .read_byte ( 0xff4a ); let wx = self .read_byte ( 0xff4b ); if screen_y >= wy && screen_x >= wx .saturating_sub ( 7 ) { return true ; } false } fn window_pixel_value ( & self , screen_x : u8 , screen_y : u8 ) -> TilePixelValue { let window_y = screen_y - self .read_byte ( 0xff4a ); let window_x = screen_x + 7 - self .read_byte ( 0xff4b ); let window_tile_map_index = ( window_y / 8 ) as u16 * 32 + ( window_x / 8 ) as u16 ; let window_tile_map_base = if ( self .read_byte ( 0xff40 ) >> 6 ) & 0x1 == 0 { 0x9800 } else { 0x9c00 }; let tile = & self .index_to_tile ( self .read_byte ( window_tile_map_base + window_tile_map_index )); tile [( window_y % 8 ) as usize ][( window_x % 8 ) as usize ] } The next step is the final layer: Sprites! Sprites will be more involved and unique compared to background and window. I still can’t believe the Sharp SM83 did all this for developers. See y’all next time!"}, {"post_id": 50574, "ts": "2026-08-19T19:34:48Z", "hours": 4.8942, "text": "No More GPU Crisis Hello everyone! It seems that, yet again, time has slipped away from me! Let’s dive back in! STATistics When the chip swaps rendering modes, depending on whether the STAT register enables that specific interrupt, it will trigger a STAT interrupt (priority level 2). I had to set up a loop to shift modes so that each mode can easily be fully handled (see screenshot). This was just a matter of finding out how long each mode and line lasted, relatively simple. Render Engines After this, I had to start adding rendering features. There are three components to the rendering: Background Window Sprites The first, and easiest part, was the background. Which tiles compose the background is dictated by a series of bytes after either 0x9800 or 0x9c00, which have references to tiles in memory. Pretty simple. fn render_to_buffer ( & mut self ) { for row in 0 .. 144 { for column in 0 .. 160 { self .gpu .set_pixel ( row , column , self .bgp_palette_lookup ( self .pixel_value ( column , row )), ); } } } fn pixel_value ( & self , screen_x : u8 , screen_y : u8 ) -> TilePixelValue { let map_y = self .read_byte ( 0xff42 ) .wrapping_add ( screen_y ); let map_x = self .read_byte ( 0xff43 ) .wrapping_add ( screen_x ); let tile_map_index = ( map_y / 8 ) as u16 * 32 + ( map_x / 8 ) as u16 ; let tile_map_base = if ( self .read_byte ( 0xff40 ) >> 3 ) & 0x1 != 0 { 0x9c00 } else { 0x9800 }; let tile : & Tile = & self .index_to_tile ( self .read_byte ( tile_map_base + tile_map_index )); tile [( map_y % 8 ) as usize ][( map_x % 8 ) as usize ] } fn index_to_tile ( & self , index : u8 ) -> Tile { let unsigned = ( self .read_byte ( 0xff40 ) >> 4 ) & 0x1 != 0 ; if unsigned { return self .gpu.tile_set [ index as usize ]; } let signed_index = ( 256 + ( index as i8 as i16 )) as usize ; self .gpu.tile_set [ signed_index ] } fn bgp_palette_lookup ( & self , value : TilePixelValue ) -> PixelValue { let index = value as u8 ; match ( self .read_byte ( 0xff47 ) >> ( index * 2 )) & 0b11 { 0 => PixelValue :: White , 1 => PixelValue :: LightGray , 2 => PixelValue :: DarkGray , 3 => PixelValue :: Black , _ => panic! ( \"Unknown shade\" ), } } The next step is the window, then the sprites. Sprites will be hard due to their varied size. See y’all next time!"}, {"post_id": 48739, "ts": "2026-08-17T08:32:42Z", "hours": 2.0075, "text": "Div(isions of time) Hello everyone! This time, I actually remembered to make a devlog! Let’s dive in! Div(vy up Labour) Remember how I added the number of ticks each instruction took as a return value from the execute() fn? Well, it actually got put to use now! There is an internal 16-bit timer in the Sharp SM83, the upper 8 bits of which are exposed at memory address 0xff04. Programming this was pretty easy once I realised I could have read_byte() and write_byte() directly access the counter (Originally, I was going to have an update_div thingy probably and have the bte in memory and the accumulator be separate rather than this simpler approach). pub fn read_byte ( & self , address : u16 ) -> u8 { let address = address as usize ; match address { VRAM_BEGIN ..= VRAM_END => self .gpu .read_vram ( address - VRAM_BEGIN ), 0xff04 => ( self .div_accumulator >> 8 ) as u8 , _ => self .memory [ address ], } } pub fn write_byte ( & mut self , address : u16 , byte : u8 ) { let address = address as usize ; match address { VRAM_BEGIN ..= VRAM_END => self .gpu .write_vram ( address - VRAM_BEGIN , byte ), // Any write to div resets it and its accumulator 0xff04 => self .div_accumulator = 0 , _ => self .memory [ address ] = byte , }; } Now, last time, I set up interrupts, so with div set up, it was time to set up timer interrupts. TIMA Time What actually triggers timer interrupts, rather than div, is a separate timer called TIMA (0xff05 in memory). TIMA has settings set in TAC (0xff07 in memory). Bits 0 and 1 of TAC dictate which bit of the DIV accumulator (let’s call it divacc) to watch to see when TIMA should be incremented. Bit 2 dictates whether TIMA should be incremented at all. TIMA gets incremented whenever the indicated bit of divacc falls from 1 → 0. This can sometimes be as few as every 16 ticks, and since instructions can take up to 24 ticks, this can cause the bit to go from 1 → 0 → 1, which means that you can’t just check the new divacc against the old one to see whether the bit fell, though I tried this as a temporary solution. This is what I had to do instead (see screenshot). I wish it could be prettier, but what can you do? Anyways, y’all, see you next time!"}, {"post_id": 47323, "ts": "2026-08-15T06:28:37Z", "hours": 2.7594, "text": "Interrupting Cow Hello everyone! This took a lot longer than I expected due to a large amount of me getting confused by how interrupts work. Let’s dive in! Halt! After dealing with tick returns, the next step was dealing with interrupts. There are two bytes in memory that concern interrupts. One is IE (0xffff), which tells which interrupts to listen for, and the other is IF (0xff0f), which tells which interrupts are currently pending. Dealing with these was easy enough, but there was another thing that needed addressing: The Halt Bug The halt bug is a known bug that, should Halt be ran when there are interrupts pending and the IME (interrupt master enable I think) is off, it doesn’t halt and the next instruction runs twice. I was both confused by how this behaved and how it was triggered, which caused issues with my code that had to be addressed. I wasn’t able to deal with anything besides interrupt handling , so that’s all for now!"}, {"post_id": 46748, "ts": "2026-08-14T07:06:18Z", "hours": 3.7389, "text": "Ticking Time Bomb Hello everyone! It seems that, yet again, I have forgotten to make a devlog for a few hours, so let’s dive in! Fortunately, not much has happened. 16 GB of VRAM As I said in my last devlog, it was time to get started on graphical stuff. I set up a GPU struct with a separate VRAM, and set up the memory to write to that VRAM instead of the regular bus when it’s supposed to. This was also the last part of the docs I’ve been following, so I’ve been on my own since this point. It’s a little pesky that my best resources on how the GB works are now Claude Code and a random opcode table, but what can you do? Tick-Tock Goes the Clock Different operations in the GB’s processor take different numbers of clock cycles to do, so I had to add this as a second return value to execute to add slowing in the future. This was the majority of the hours I logged, staring at the opcode table and trying to figure out the patterns in the timings. Anyway, see y’all next time! These are some silly things that will probably land for at least some of you."}, {"post_id": 46058, "ts": "2026-08-13T00:13:53Z", "hours": 1.3156, "text": "Where are my keys? Hello everyone! We are back with a little news, so let’s dive right in! Hashmap, was not, in fact, the solution The mapping from opcode to instruction enum (fn from_byte()) is finally done. Not much to say except that it was a very tedious process. While working, I realised I hadn’t implemented ADD SP, i8 (addassign a signed integer to the stack pointer) yet, so I quickly added that. Unfortunately, that’s all folks! Next, I’m going to start dealing with graphics."}, {"post_id": 45921, "ts": "2026-08-12T18:07:20Z", "hours": 1.9139, "text": "Miscellany Hello everyone! Let’s keep this quick because I have much tedium to get through. What the Hecc is JR?! I finished most of instructions, so I needed to figure out which ones I forgot. I was looking at the opcode table and I realised I had no idea what JR or DAA did, so I had to figure out what they did. JR is just a relative jump rather than an absolute one, and DAA does some number formatting after an arithmetic op for better display. Let’s Table this Discussion Since the instructions that I can implement right now (very nearly all of them, except for stop and interrupts, etc.), it’s been time to update the Instruction::from_byte() fn with all the new instructions. I’m still doing this, and it is purely looking at the opcode table, entering something, looking at the opcode table again, looking at what I wrote, and repeating this over and over and over again. I’m not even done with this! Anyway, enjoy a hashmap meme that doesn’t apply to me b/c I am using a match"}, {"post_id": 45633, "ts": "2026-08-12T08:00:46Z", "hours": 1.6425, "text": "Pushpops Hello everyone! This time, I actually logged a normal amount of time! Let’s dive in! Loading Shipments I finally finished up the LD instruction! once I got through the weird targets, everything was smooth sailing. Stack Overflow Once LD was done, it was time to implement the stack. If you don’t know what (a/the) stack is, reference the wikipedia screenshot. For the GB, the two methods are PUSH and POP, and the stack actually goes down in memory from the end of the memory bus rather than from the beginning. Dear Functional Bros When I finished implementing the stack, which I though was going to be a lot harder, it was time to add functions to it. This was pretty simple: a CALL instr. that jumps to a point and puts the place where it left off on the stack and a RET instr. that goes to the last location on the stack."}, {"post_id": 45566, "ts": "2026-08-12T04:30:55Z", "hours": 3.2408, "text": "Loading Jump Time Hello everyone! I lost track of time, and it appears I have once more logged too many hours with no devlog, yet no excuses I have. Let’s get right to it! HL and D8 A lot of Instructions that I had already made have an HL target, in which they use the value in the joint register HL as an address in memory, and perform the operation on that byte. Up until this point, all HL targets were todos, but, since I had created the memory bus, I was able to quickly wire up those targets. A lot of those same instructions could also take the next byte in memory as the input (D8) so I wired those up too (though before HL). I actually wasn’t sure whether HL targets used a different memory bus than the one used for operations. JP Morgan The next instruction to deal with was JP (jump). Based on different conditions (the state of the zero flag or carry flag, or always) it would or wouldn’t jump to the address encoded over the next two bytes. Probably one of the easier instructions I’ve made. Loading… After JP was load. LD just copies data from one place to another. There are so many variations that I can’t talk about all of them, and there my code is too long for this devlog, so: Byte: Load a byte from point a to point b Word: just like the Byte type except with 16-bit valuesAFromIndirect: load the A register with the contents from a value from a memory location whose address is stored in some locationIndirectFromA: load a memory location whose address is stored in some location with the contents of the A registerAFromByteAddress: Just like AFromIndirect except the memory address is some address in the very last byte of memory.ByteAddressFromA: Just like IndirectFromA except the memory address is some address in the very last byte of memory. This is the opcode table I’ve been using"}, {"post_id": 45409, "ts": "2026-08-11T20:46:14Z", "hours": 4.115, "text": "Timeliness Rather unfortunately, a lot of work has been done since the last devlog due to yesterday’s hackatime outage. Let’s get started! House of Memories As I mentioned in the last devlog, the next step was to create a program counter (pc, marks where in the program we are) and the memory bus (with all the instructions we have been emulating for the GB to run, and others) Bite the Code The instructions are not stored as plain text of enums, they are stored as bytes , one byte for each combination of instruction and target. I thus have to map each bytecode to each instruction that I have added so far. Not English Class! Anything but English! There are much more than 256 different bytecodes; there are actually nearly 512. To accomplish this and still have memory be 1 byte, there is a bytecode prefix , 0xcb, which tells the chip that the real instruction is the next one, and to look it up on a different table. PCMR To go through each instruction, I added a step function: fn step ( & mut self ) { let ( instruction_byte , prefixed ) = { let temp_byte = self .bus .read_byte ( self .pc ); if temp_byte == 0xcb { ( self .bus .read_byte ( self .pc + 1 ), true ) } else { ( temp_byte , false ) } }; let next_pc = if let Some ( instruction ) = Instruction :: from_byte ( instruction_byte , prefixed ) { self .execute ( instruction ) } else { panic! ( \"Unknown instruction found for: 0x{:x}\" , instruction_byte ); }; self .pc = next_pc ; } As you can see, execute returns the next pc value, something it didn’t do before. So, I had to go and make all the match arms blocks that do their associated action and also return self.pc.wrapping_add(1) for non-0xcb functions and self.pc.wrapping_add(2) for 0xcb functions, since no function that modifies the pc has been added yet. Next is added yet more instructions! See y’all next time!"}, {"post_id": 44287, "ts": "2026-08-09T22:52:31Z", "hours": 2.3447, "text": "Registering New Data Hello Everyone! You know what they say: mo’ code mo’ devlogs. To the right, to the right, to the right, the right, the right I finished up all the instructions that act on register data!!! Specifically, these ones: ADD - Add the value of the target register to the A register. ADDHL (add to HL) - just like ADD except that the target is added to the HL register ADC (add with carry) - just like ADD except that the value of the carry flag is also added to the number SUB (subtract) - subtract the value stored in a specific register with the value in the A register SBC (subtract with carry) - just like ADD except that the value of the carry flag is also subtracted from the number AND (logical and) - do a bitwise and on the value in a specific register and the value in the A register OR (logical or) - do a bitwise or on the value in a specific register and the value in the A register XOR (logical xor) - do a bitwise xor on the value in a specific register and the value in the A register CP (compare) - just like SUB except the result of the subtraction is not stored back into A INC (increment) - increment the value in a specific register by 1 DEC (decrement) - decrement the value in a specific register by 1 CCF (complement carry flag) - toggle the value of the carry flag SCF (set carry flag) - set the carry flag to true RRA (rotate right A register) - bit rotate A register right through the carry flag RLA (rotate left A register) - bit rotate A register left through the carry flag RRCA (rotate right A register) - bit rotate A register right (not through the carry flag) RLCA (rotate left A register) - bit rotate A register left (not through the carry flag) CPL (complement) - toggle every bit of the A registerBIT (bit test) - test to see if a specific bit of a specific register is set RES (bit reset) - set a specific bit of a specific register to 0 SET (bit set) - set a specific bit of a specific register to 1 SRL (shift right logical) - bit shift a specific register right by 1 RR (rotate right) - bit rotate a specific register right by 1 through the carry flag RL (rotate left) - bit rotate a specific register left by 1 through the carry flag RRC (rorate right) - bit rotate a specific register right by 1 (not through the carry flag) RLC (rorate left) - bit rotate a specific register left by 1 (not through the carry flag) SRA (shift right arithmetic) - arithmetic shift a specific register right by 1 SLA (shift left arithmetic) - arithmetic shift a specific register left by 1 SWAP (swap nibbles) - switch upper and lower nibble of a specific register Some of the bitwise ops for rotation were a little difficult, but I was able to troubleshoot. Next is the game ROM, the program counter, prefix instructions, and jump instructions!"}, {"post_id": 43849, "ts": "2026-08-09T08:49:27Z", "hours": 1.5925, "text": "Untargeted Improvements Hello everyone! New day, new devlog! I added some new instructions! CCF — Clear Carry Flag SCF — Set Carry Flag RRA — Rotate Right A RLA — Rotate Left A RRCA — Rotate Right Circular A RLCA — Rotate Left Circular A CPL — Complement Bits of A Register Figuring out some of the bitwise logic for the rotation command, especially RLA (and because I was working in the car) was kind of difficult. fn rra ( & mut self ) -> u8 { let carry = if self .registers.f.carry { 1 } else { 0 }; let value = self .registers.a ; self .registers.f.zero = false ; self .registers.f.subtract = false ; self .registers.f.carry = value & 0x1 == 1 ; self .registers.f.half_carry = false ; ( value >> 1 ) | ( carry << 7 ) } fn rla ( & mut self ) -> u8 { let carry = if self .registers.f.carry { 1 } else { 0 }; let value = self .registers.a ; self .registers.f.zero = false ; self .registers.f.subtract = false ; self .registers.f.carry = ( value >> 7 ) & 0x1 == 1 ; // Originally I was doing the bit isolation before the bitshift, // and I forgot about the bitshift initially, // so I was just doing a bit isolation and then clippy complained b/c it would never be true. self .registers.f.half_carry = false ; ( value << 1 ) | carry } Next are BIT, RES, and SET, and then more instructions! The image is a question I saw on Protobowl a few months back."}, {"post_id": 43618, "ts": "2026-08-09T00:03:21Z", "hours": 2.3414, "text": "Target Practise Hello everyone! We’re back with another devlog! Instructor I managed to finish up all the instructions (minus the HL sections of those because that uses the value in the combined HL register as a pointer to memory, which I did not yet add) that were already in the enum (screenshot from last devlog). I also just added the INC and DEC instructions, which increment or decrement the value in the target register or byte in memory pointed to by HL. It was a bit of a hassle to figure out how I should do the target enums, since there is an 8 and 16 bit version of each INC and DEC, each with different targets. INC8 can target the byte of memory pointed to by HL, whereas INC16 can point to HL itself and the other 3 16 bit registers. See y’all next time!"}, {"post_id": 43150, "ts": "2026-08-08T08:10:23Z", "hours": 1.7228, "text": "We’ve Brought Some New Additions After finishing up the LZU and its associated rating, it’s time to get back to work on this project! There are no Antarctic Pyramids Ever since I heard about the wonderful site that is Codeberg, I’ve wanted to swap to there, but the thing stopping me was this challenge, because I thought it only worked with GitHub, but when I was rating projects, I found that one of them was on Codeberg. Because of that, I swapped over this repo to Codeberg, which it made very easy, and continued on my coding journey. Yesop Like I said in my last devlog, I have to implement the instructions for the CPU in code! I managed to create most of the implementations for AddHL and Adc, only stopped by the fact that I still need to emulate memory. The next step is to finish Sub and the rest of the ops in this enum, then the rest of the instructions! See y’all next time!"}, {"post_id": 42269, "ts": "2026-08-06T21:57:24Z", "hours": 1.3686, "text": "Register Additions Welcome to my first devlog! I am building a GameBoy emulator in Rust!! Didn’t Register The first step was emulating the registers. The GB has 8 8-bit registers, and sometimes they are combined 2-together to form 16-bit registers. 1 of the registers, register f, is the flag register. It’s upper four bits are different flags for things like carry and half carry. Didn’t Compute Next, I had to start making the cpu struct. It has to be capable of executing commands, like ADD, so there is a command enum with different commands, though it only has ADD right now, and I still need to figure out all the possible ADD targets."}]...
|
Title: Riggurly by @infinite_silly | Stardance
De Title: Riggurly by @infinite_silly | Stardance
Devlogs:
Register Additions Welcome to my first devlog! I am building a GameBoy emulator in Rust!! Didn’t Register The first step was emulating the registers. The GB has 8 8-bit registers, and sometimes they are combined 2-together to form 16-bit registers. 1 of the registers, register f, is the flag register. It’s upper four bits are different flags for things like carry and half carry. Didn’t Compute Next, I had to start making the cpu struct. It has to be capable of executing commands, like ADD, so there is a command enum with different commands, though it only has ADD right now, and I still need to figure out all the possible ADD targets.
We’ve Brought Some New Additions After finishing up the LZU and its associated rating, it’s time to get back to work on this project! There are no Antarctic Pyramids Ever since I heard about the wonderful site that is Codeberg, I’ve wanted to swap to there, but the thing stopping me was this challenge, because I thought it only worked with GitHub, but when I was rating projects, I found that one of them was on Codeberg. Because of that, I swapped over this repo to Codeberg, which it made very easy, and continued on my coding journey. Yesop Like I said in my last devlog, I have to implement the instructions for the CPU in code! I managed to create most of the implementations for AddHL and Adc, only stopped by the fact that I still need to emulate memory. The next step is to finish Sub and the rest of the ops in this enum, then the rest of the instructions! See y’all next time!
Target Practise Hello everyone! We’re back with another devlog! Instructor I managed to finish up all the instructions (minus the HL sections of those because that uses the value in the combined HL register as a pointer to memory, which I did not yet add) that were already in the enum (screenshot from last devlog). I also just added the INC and DEC instructions, which increment or decrement the value in the target register or byte in memory pointed to by HL. It was a bit of a hassle to figure out how I should do the target enums, since there is an 8 and 16 bit version of each INC and DEC, each with different targets. INC8 can target the byte of memory pointed to by HL, whereas INC16 can point to HL itself and the other 3 16 bit registers. See y’all next time!
Untargeted Improvements Hello everyone! New day, new devlog! I added some new instructions! CCF — Clear Carry Flag SCF — Set Carry Flag RRA — Rotate Right A RLA — Rotate Left A RRCA — Rotate Right Circular A RLCA — Rotate Left Circular A CPL — Complement Bits of A Register Figuring out some of the bitwise logic for the rotation command, especially RLA (and because I was working in the car) was kind of difficult. fn rra ( & mut self ) -> u8 { let carry = if self .registers.f.carry { 1 } else { 0 }; let value = self .registers.a ; self .registers.f.zero = false ; self .registers.f.subtract = false ; self .registers.f.carry = value & 0x1 == 1 ; self .registers.f.half_carry = false ; ( value >> 1 ) | ( carry << 7 ) } fn rla ( & mut self ) -> u8 { let carry = if self .registers.f.carry { 1 } else { 0 }; let value = self .registers.a ; self .registers.f.zero = false ; self .registers.f.subtract = false ; self .registers.f.carry = ( value >> 7 ) & 0x1 == 1 ; // Originally I was doing the bit isolation before the bitshift, // and I forgot about the bitshift initially, // so I was just doing a bit isolation and then clippy complained b/c it would never be true. self .registers.f.half_carry = false ; ( value << 1 ) | carry } Next are BIT, RES, and SET, and then more instructions! The image is a question I saw on Protobowl a few months back.
Registering New Data Hello Everyone! You know what they say: mo’ code mo’ devlogs. To the right, to the right, to the right, the right, the right I finished up all the instructions that act on register data!!! Specifically, these ones: ADD - Add the value of the target register to the A register. ADDHL (add to HL) - just like ADD except that the target is added to the HL register ADC (add with carry) - just like ADD except that the value of the carry flag is also added to the number SUB (subtract) - subtract the value stored in a specific register with the value in the A register SBC (subtract with carry) - just like ADD except that the value of the carry flag is also subtracted from the number AND (logical and) - do a bitwise and on the value in a specific register and the value in the A register OR (logical or) - do a bitwise or on the value in a specific register and the value in the A register XOR (logical xor) - do a bitwise xor on the value in a specific register and the value in the A register CP (compare) - just like SUB except the result of the subtraction is not stored back into A INC (increment) - increment the value in a specific register by 1 DEC (decrement) - decrement the value in a specific register by 1 CCF (complement carry flag) - toggle the value of the carry flag SCF (set carry flag) - set the carry flag to true RRA (rotate right A register) - bit rotate A register right through the carry flag RLA (rotate left A register) - bit rotate A register left through the carry flag RRCA (rotate right A register) - bit rotate A register right (not through the carry flag) RLCA (rotate left A register) - bit rotate A register left (not through the carry flag) CPL (complement) - toggle every bit of the A registerBIT (bit test) - test to see if a specific bit of a specific register is set RES (bit reset) - set a specific bit of a specific register to 0 SET (bit set) - set a specific bit of a specific register to 1 SRL (shift right logical) - bit shift a specific register right by 1 RR (rotate right) - bit rotate a specific register right by 1 through the carry flag RL (rotate left) - bit rotate a specific register left by 1 through the carry flag RRC (rorate right) - bit rotate a specific register right by 1 (not through the carry flag) RLC (rorate left) - bit rotate a specific register left by 1 (not through the carry flag) SRA (shift right arithmetic) - arithmetic shift a specific register right by 1 SLA (shift left arithmetic) - arithmetic shift a specific register left by 1 SWAP (swap nibbles) - switch upper and lower nibble of a specific register Some of the bitwise ops for rotation were a little difficult, but I was able to troubleshoot. Next is the game ROM, the program counter, prefix instructions, and jump instructions!
Timeliness Rather unfortunately, a lot of work has been done since the last devlog due to yesterday’s hackatime outage. Let’s get started! House of Memories As I mentioned in the last devlog, the next step was to create a program counter (pc, marks where in the program we are) and the memory bus (with all the instructions we have been emulating for the GB to run, and others) Bite the Code The instructions are not stored as plain text of enums, they are stored as bytes , one byte for each combination of instruction and target. I thus have to map each bytecode to each instruction that I have added so far. Not English Class! Anything but English! There are much more than 256 different bytecodes; there are actually nearly 512. To accomplish this and still have memory be 1 byte, there is a bytecode prefix , 0xcb, which tells the chip that the real instruction is the next one, and to look it up on a different table. PCMR To go through each instruction, I added a step function: fn step ( & mut self ) { let ( instruction_byte , prefixed ) = { let temp_byte = self .bus .read_byte ( self .pc ); if temp_byte == 0xcb { ( self .bus .read_byte ( self .pc + 1 ), true ) } else { ( temp_byte , false ) } }; let next_pc = if let Some ( instruction ) = Instruction :: from_byte ( instruction_byte , prefixed ) { self .execute ( instruction ) } else { panic! ( "Unknown instruction found for: 0x{:x}" , instruction_byte ); }; self .pc = next_pc ; } As you can see, execute returns the next pc value, something it didn’t do before. So, I had to go and make all the match arms blocks that do their associated action and also return self.pc.wrapping_add(1) for non-0xcb functions and self.pc.wrapping_add(2) for 0xcb functions, since no function that modifies the pc has been added yet. Next is added yet more instructions! See y’all next time!
Loading Jump Time Hello everyone! I lost track of time, and it appears I have once more logged too many hours with no devlog, yet no excuses I have. Let’s get right to it! HL and D8 A lot of Instructions that I had already made have an HL target, in which they use the value in the joint register HL as an address in memory, and perform the operation on that byte. Up until this point, all HL targets were todos, but, since I had created the memory bus, I was able to quickly wire up those targets. A lot of those same instructions could also take the next byte in memory as the input (D8) so I wired those up too (though before HL). I actually wasn’t sure whether HL targets used a different memory bus than the one used for operations. JP Morgan The next instruction to deal with was JP (jump). Based on different conditions (the state of the zero flag or carry flag, or always) it would or wouldn’t jump to the address encoded over the next two bytes. Probably one of the easier instructions I’ve made. Loading… After JP was load. LD just copies data from one place to another. There are so many variations that I can’t talk about all of them, and there my code is too long for this devlog, so: Byte: Load a byte from point a to point b Word: just like the Byte type except with 16-bit valuesAFromIndirect: load the A register with the contents from a value from a memory location whose address is stored in some locationIndirectFromA: load a memory location whose address is stored in some location with the contents of the A registerAFromByteAddress: Just like AFromIndirect except the memory address is some address in the very last byte of memory.ByteAddressFromA: Just like IndirectFromA except the memory address is some address in the very last byte of memory. This is the opcode table I’ve been using
Pushpops Hello everyone! This time, I actually logged a normal amount of time! Let’s dive in! Loading Shipments I finally finished up the LD instruction! once I got through the weird targets, everything was smooth sailing. Stack Overflow Once LD was done, it was time to implement the stack. If you don’t know what (a/the) stack is, reference the wikipedia screenshot. For the GB, the two methods are PUSH and POP, and the stack actually goes down in memory from the end of the memory bus rather than from the beginning. Dear Functional Bros When I finished implementing the stack, which I though was going to be a lot harder, it was time to add functions to it. This was pretty simple: a CALL instr. that jumps to a point and puts the place where it left off on the stack and a RET instr. that goes to the last location on the stack.
Miscellany Hello everyone! Let’s keep this quick because I have much tedium to get through. What the Hecc is JR?! I finished most of instructions, so I needed to figure out which ones I forgot. I was looking at the opcode table and I realised I had no idea what JR or DAA did, so I had to figure out what they did. JR is just a relative jump rather than an absolute one, and DAA does some number formatting after an arithmetic op for better display. Let’s Table this Discussion Since the instructions that I can implement right now (very nearly all of them, except for stop and interrupts, etc.), it’s been time to update the Instruction::from_byte() fn with all the new instructions. I’m still doing this, and it is purely looking at the opcode table, entering something, looking at the opcode table again, looking at what I wrote, and repeating this over and over and over again. I’m not even done with this! Anyway, enjoy a hashmap meme that doesn’t apply to me b/c I am using a match
Where are my keys? Hello everyone! We are back with a little news, so let’s dive right in! Hashmap, was not, in fact, the solution The mapping from opcode to instruction enum (fn from_byte()) is finally done. Not much to say except that it was a very tedious process. While working, I realised I hadn’t implemented ADD SP, i8 (addassign a signed integer to the stack pointer) yet, so I quickly added that. Unfortunately, that’s all folks! Next, I’m going to start dealing with graphics.
Ticking Time Bomb Hello everyone! It seems that, yet again, I have forgotten to make a devlog for a few hours, so let’s dive in! Fortunately, not much has happened. 16 GB of VRAM As I said in my last devlog, it was time to get started on graphical stuff. I set up a GPU struct with a separate VRAM, and set up the memory to write to that VRAM instead of the regular bus when it’s supposed to. This was also the last part of the docs I’ve been following, so I’ve been on my own since this point. It’s a little pesky that my best resources on how the GB works are now Claude Code and a random opcode table, but what can you do? Tick-Tock Goes the Clock Different operations in the GB’s processor take different numbers of clock cycles to do, so I had to add this as a second return value to execute to add slowing in the future. This was the majority of the hours I logged, staring at the opcode table and trying to figure out the patterns in the timings. Anyway, see y’all next time! These are some silly things that will probably land for at least some of you.
Interrupting Cow Hello everyone! This took a lot longer than I expected due to a large amount of me getting confused by how interrupts work. Let’s dive in! Halt! After dealing with tick returns, the next step was dealing with interrupts. There are two bytes in memory that concern interrupts. One is IE (0xffff), which tells which interrupts to listen for, and the other is IF (0xff0f), which tells which interrupts are currently pending. Dealing with these was easy enough, but there was another thing that needed addressing: The Halt Bug The halt bug is a known bug that, should Halt be ran when there are interrupts pending and the IME (interrupt master enable I think) is off, it doesn’t halt and the next instruction runs twice. I was both confused by how this behaved and how it was triggered, which caused issues with my code that had to be addressed. I wasn’t able to deal with anything besides interrupt handling , so that’s all for now!
Div(isions of time) Hello everyone! This time, I actually remembered to make a devlog! Let’s dive in! Div(vy up Labour) Remember how I added the number of ticks each instruction took as a return value from the execute() fn? Well, it actually got put to use now! There is an internal 16-bit timer in the Sharp SM83, the upper 8 bits of which are exposed at memory address 0xff04. Programming this was pretty easy once I realised I could have read_byte() and write_byte() directly access the counter (Originally, I was going to have an update_div thingy probably and have the bte in memory and the accumulator be separate rather than this simpler approach). pub fn read_byte ( & self , address : u16 ) -> u8 { let address = address as usize ; match address { VRAM_BEGIN ..= VRAM_END => self .gpu .read_vram ( address - VRAM_BEGIN ), 0xff04 => ( self .div_accumulator >> 8 ) as u8 , _ => self .memory [ address ], } } pub fn write_byte ( & mut self , address : u16 , byte : u8 ) { let address = address as usize ; match address { VRAM_BEGIN ..= VRAM_END => self .gpu .write_vram ( address - VRAM_BEGIN , byte ), // Any write to div resets it and its accumulator 0xff04 => self .div_accumulator = 0 , _ => self .memory [ address ] = byte , }; } Now, last time, I set up interrupts, so with div set up, it was time to set up timer interrupts. TIMA Time What actually triggers timer interrupts, rather than div, is a separate timer called TIMA (0xff05 in memory). TIMA has settings set in TAC (0xff07 in memory). Bits 0 and 1 of TAC dictate which bit of the DIV accumulator (let’s call it divacc) to watch to see when TIMA should be incremented. Bit 2 dictates whether TIMA should be incremented at all. TIMA gets incremented whenever the indicated bit of divacc falls from 1 → 0. This can sometimes be as few as every 16 ticks, and since instructions can take up to 24 ticks, this can cause the bit to go from 1 → 0 → 1, which means that you can’t just check the new divacc against the old one to see whether the bit fell, though I tried this as a temporary solution. This is what I had to do instead (see screenshot). I wish it could be prettier, but what can you do? Anyways, y’all, see you next time!
No More GPU Crisis Hello everyone! It seems that, yet again, time has slipped away from me! Let’s dive back in! STATistics When the chip swaps rendering modes, depending on whether the STAT register enables that specific interrupt, it will trigger a STAT interrupt (priority level 2). I had to set up a loop to shift modes so that each mode can easily be fully handled (see screenshot). This was just a matter of finding out how long each mode and line lasted, relatively simple. Render Engines After this, I had to start adding rendering features. There are three components to the rendering: Background Window Sprites The first, and easiest part, was the background. Which tiles compose the background is dictated by a series of bytes after either 0x9800 or 0x9c00, which have references to tiles in memory. Pretty simple. fn render_to_buffer ( & mut self ) { for row in 0 .. 144 { for column in 0 .. 160 { self .gpu .set_pixel ( row , column , self .bgp_palette_lookup ( self .pixel_value ( column , row )), ); } } } fn pixel_value ( & self , screen_x : u8 , screen_y : u8 ) -> TilePixelValue { let map_y = self .read_byte ( 0xff42 ) .wrapping_add ( screen_y ); let map_x = self .read_byte ( 0xff43 ) .wrapping_add ( screen_x ); let tile_map_index = ( map_y / 8 ) as u16 * 32 + ( map_x / 8 ) as u16 ; let tile_map_base = if ( self .read_byte ( 0xff40 ) >> 3 ) & 0x1 != 0 { 0x9c00 } else { 0x9800 }; let tile : & Tile = & self .index_to_tile ( self .read_byte ( tile_map_base + tile_map_index )); tile [( map_y % 8 ) as usize ][( map_x % 8 ) as usize ] } fn index_to_tile ( & self , index : u8 ) -> Tile { let unsigned = ( self .read_byte ( 0xff40 ) >> 4 ) & 0x1 != 0 ; if unsigned { return self .gpu.tile_set [ index as usize ]; } let signed_index = ( 256 + ( index as i8 as i16 )) as usize ; self .gpu.tile_set [ signed_index ] } fn bgp_palette_lookup ( & self , value : TilePixelValue ) -> PixelValue { let index = value as u8 ; match ( self .read_byte ( 0xff47 ) >> ( index * 2 )) & 0b11 { 0 => PixelValue :: White , 1 => PixelValue :: LightGray , 2 => PixelValue :: DarkGray , 3 => PixelValue :: Black , _ => panic! ( "Unknown shade" ), } } The next step is the window, then the sprites. Sprites will be hard due to their varied size. See y’all next time!
Ogres are like Onions Hello everyone! This time, I’ve fortunately logged a normal amount of time. Let’s dive in! Close the Window! After the background rendering was complete, it was time to work on the next layer: the window. The window is exactly as it sounds — the layer between sprites and the background that can have ui and stuff. The window starts at a position dictated by wx and wy (0xff4b and 0xff4a in memory), and those two dictate the top-left corner of the window layer (though wx - 7 is the actual top-left x coord). If a game wants to have a window layer that ends, it will switch off the window layer BETWEEN scanlines, which my current implementation cannot do because I render the whole frame at VBlank (after all scanlines) for simplicity, and it’s not strictly necessary. The code implementation of the window layer was relatively similar to background: fn window_active_for_pixel ( & self , screen_x : u8 , screen_y : u8 ) -> bool { if ( self .read_byte ( 0xff40 ) >> 5 ) & 0x1 == 0 { return false ; } let wy = self .read_byte ( 0xff4a ); let wx = self .read_byte ( 0xff4b ); if screen_y >= wy && screen_x >= wx .saturating_sub ( 7 ) { return true ; } false } fn window_pixel_value ( & self , screen_x : u8 , screen_y : u8 ) -> TilePixelValue { let window_y = screen_y - self .read_byte ( 0xff4a ); let window_x = screen_x + 7 - self .read_byte ( 0xff4b ); let window_tile_map_index = ( window_y / 8 ) as u16 * 32 + ( window_x / 8 ) as u16 ; let window_tile_map_base = if ( self .read_byte ( 0xff40 ) >> 6 ) & 0x1 == 0 { 0x9800 } else { 0x9c00 }; let tile = & self .index_to_tile ( self .read_byte ( window_tile_map_base + window_tile_map_index )); tile [( window_y % 8 ) as usize ][( window_x % 8 ) as usize ] } The next step is the final layer: Sprites! Sprites will be more involved and unique compared to background and window. I still can’t believe the Sharp SM83 did all this for developers. See y’all next time!
Crack Open a Sprite Hello everyone! This dvelopment took longer than expected, so let’s just dive right in! County Rogues, Bring me lOAM After I finished the window layer, it was time to deal with sprites. Where each sprite is on the screen, which tiles to use, and sprite-specific render attributes are stored in a section of memory called OAM. 40 sprites’ data can be stored in OAM, each 4 bytes: the x position, y position, which tile(s) to use, and the attributes of that sprite (height, when to render, etc.) Unlike the background and window, sprites have a lot more moving parts. Here’s my code for rendering the sprites to the buffer. fn render_sprites ( & mut self ) { let lcdc = self .read_byte ( 0xff40 ); if lcdc >> 1 & 0x1 == 0 { return ; } let mut indexes = ( 0 .. 40 ) .collect :: < Vec < u16 >> (); indexes .sort_unstable_by_key (| n | ( self .read_byte ( 0xfe01 + n * 4 ) as i16 - 8 , * n )); let indexes : Vec <& u16 > = indexes .iter () .rev () .collect (); let height = if lcdc >> 2 & 0x1 == 0 { 8 } else { 16 }; for n in indexes { let entry = 0xfe00 + n * 4 ; let sprite_y = self .read_byte ( entry ) as i16 - 16 ; let sprite_x = self .read_byte ( entry + 0x1 ) as i16 - 8 ; let tile_index = self .read_byte ( entry + 0x2 ); let attributes = self .read_byte ( entry + 0x3 ); let palette = if ( attributes >> 4 ) & 0x1 == 0 { 0xff48 } else { 0xff49 }; for row in sprite_y .clamp ( 0 , 144 ) as u8 .. ( sprite_y + height ) .clamp ( 0 , 144 ) as u8 { for column in sprite_x .clamp ( 0 , 160 ) as u8 .. ( sprite_x + 8 ) .clamp ( 0 , 160 ) as u8 { if ( attributes >> 7 ) & 0x1 == 1 && self .bit_7_check ( row , column ) { continue ; } let row_in_sprite = if ( attributes >> 6 ) & 0x1 == 0 { ( row as i16 - sprite_y ) as usize } else { height as usize - ( row as i16 - sprite_y ) as usize - 1 }; let column_in_sprite = if ( attributes >> 5 ) & 0x1 == 0 { ( column as i16 - sprite_x ) as usize } else { 7 - ( column as i16 - sprite_x ) as usize }; let which_tile = if row_in_sprite < 8 { ( 0 , 0 ) } else { ( 1 , 8 ) }; let pixel = self .index_to_tile_unsigned ( tile_index + which_tile .0 ) [ row_in_sprite - which_tile .1 ][ column_in_sprite ]; if pixel == TilePixelValue :: Zero { continue ; } let value = self .palette_lookup ( pixel , palette ); self .gpu .set_pixel ( row , column , value ); } } } } fn bit_7_check ( & self , row : u8 , column : u8 ) -> bool { if self .window_active_for_pixel ( column , row ) { if self .window_pixel_value ( column , row ) == TilePixelValue :: Zero { return false ; } return true ; } if self .background_pixel_value ( column , row ) == TilePixelValue :: Zero { return false ; } true } This also excludes any boilerplate for window and background that I had to reuse. The most annoying part was dealing with ordering indexes efficiently, because the x value of the sprite is used as the method for sprite precedence over layers. I didn’t realise that sort_unstable_by_key dealt with like tuples and you could use that for precedence and tiebreaking. Anyway, that’s all folks! see y’all next time!
Building Buttons Hi everyone!! It seems that time has slipped away from me yet again, so let’s dive straight into your scheduled content! Pushy Pushy Buttons After dealing with sprites (oh! the horror! the suffering! the despair!), it was time to deal with a new kind of beast: the joypad. Implementing joypad functionality meant it was time to make a frontend (ew) instead of just building subsystems and cobbling them together later. This meant it was time to learn stuff about the crossterm crate and make some constructor functions. The screenshot is my current struct for storing the button push data. It used to be 8 bools, but that was 7 bytes too many, so it’s just a u8 wrapper now. Cross-multiply Those Terms! Crossterm is a crate for dealing with terminal keyboard interrupt and such. The first and only thing I’ve done so far was make a wrapper with a custom destructor for Keyboard enhancement flags. struct TerminalGuard { enhancement_pushed : bool , } impl TerminalGuard { fn new () -> std :: io :: Result < Self > { enable_raw_mode () ? ; let enhancement_pushed = supports_keyboard_enhancement () .unwrap_or ( false ); if enhancement_pushed { execute! ( stdout (), PushKeyboardEnhancementFlags ( KeyboardEnhancementFlags :: REPORT_EVENT_TYPES ) ) ? ; } Ok ( Self { enhancement_pushed }) } } impl Drop for TerminalGuard { fn drop ( & mut self ) { if self .enhancement_pushed { let _ = execute! ( stdout (), PopKeyboardEnhancementFlags ); } let _ = disable_raw_mode (); } } Computah, Make me a New Computah Since it was time to write a main() fn, it meant I also had to write constructor functions for CPU and all it’s subsidiaries, since I’ve not bothered to do it before. That’s it folks! See y’all next time!
You’ve Been Selected for a “Random” Screening Hello Everyone! We are back! I don’t know how it’s already been over 4½ hours! Let’s dive straight into the progress! They Know How to Push Each Other’s Buttons After making constructors for the structs and refactoring the button data struct, I added a loop to handle all waiting button presses and set the data in the button data struct. Not particularly complicated, though it was fun to test something that actually did something. Staaaaahhp Instructions take a set amount of time, so it is necessary to have a pause, since even a TI-84 (buy the CG-50 or HP Prime G2 instead; don’t get the CG-100, it lacks plugin support, which is why I recommend the CG-50 at all) is faster. Since systems can’t pause for a single tick, it pauses frame-by-frame instead. How to Exit Neovim I didn’t take the time to add a break condition, so I added a check to see if the escape key had been pressed, and if it had, it quit the application. Show Me the Money The biggest development was the render loop. Now, there is actually a visual to see and play with. Paint a Pretty Picture I also felt it would be boring if there was only one colour theme, so I added an enum along with PixelValue => Colour matching so that you can pick a theme! Speaking of picking… Staring at a Config File Since the user has to be able to pick a theme, I felt it would be good to have config.toml support for ease of use.
Human Error Hello everyone! I got too much in the flow and in the RAGE, which is why I logged nearly 8 hours since the last devlog! Let’s get in the weeds! Loading Bay I added ROM loading!!!!! I can actually load a test ROM in now!!! Naturally, I immediately loaded one in, and that brings us to our first issue. Speed? Issues When I was loading in a test ROM, the text of the name of the test would peek from the bottom of the screen, then jump up and not show passed. I probably spent 2 HOURS on trying to fix this. I thought it was a speed issue, and I ended up making a ton of optimisations and added alternate screen switching. BUT GUESS WHAT??? I zoomed out my terminal window, and there it was: Passed. I would share a screenshot, but I am currently working on changes to load_rom() that break the emulator currently (bank switching). Don’t Stop I mentioned a while ago that I had to emulate a bug in the hardware that caused the next instruction to occur twice if HALT is called when there is an interrupt pending and IME (interrupt master enable) is off. My implementation caused it to infinitely stall instead. So I fixed that bit, but the HALT bug test rom still wasn’t running the tests, so I found that LY couldn’t be read from memory, so fixing that fixed the thing, allowing the tests to run and FAIL. So I had to run a disassembler on the HALT bug test to find the exact mechanics of the HALT bug, then write it. Even though the values for the result were correct, it still wouldn’t pass. This was because of an oversight on my part when I was writing the interrupt handling. The IF byte (0xff0f, pending interrupts, whether or not they’re enabled) in hardware always has its highest 3 bits as 1, and I didn’t think it was necesary to implement this when I was writing interrupt handling, so I ignored it. And finally, fixing that, the HALT bug worked. The screenshots are: Gambatte failing the test. mGBA passing. RustBoy (May change to GameGirl/RustGirl for uniqueness and searchability) passing. See y’all next time!
You can switch the banks, switch banks, swi- swi- swi- swi- swi- — until you’re full of life Hello everyone! I changed the name of my project directory, so I wasn’t seeing my hackatime or had the ability to write a devlog until I realised the problem, so let’s just dive right in! Bank It The next thing to deal with was bank switching and better behaviour for handling roms. Cartridges are physical objects, and thus can have extra RAM and storage for the gameboy. These are controlled by MBCs (memory bank controllers). The most common ones are MBC1, MBC2, MBC3, and MBC5. For this project, for now, I am only emulating 1, 2, and 3. In the future, I will probably add more controllers once the full architecture is done for at least these three so I have an idea of hwo the skeletons should look. The first step of bank switching was having the rom portion of the memory be read-only and writes to it do certain mbc actions, like enable ram or switch banks or switch ram. I am currently implementing the switching of banks. I need to get back to MBC1-specific flags and writes. See y’all next time!
RAM or ROM Hello everyone! I’ve finally logged a normal amount of time again! Let’s dive right in! MBC Say One! I managed to bang out my first supported MBC (memory bank controller), a lot of it done while walking on the treadmill this morning. I had already implemented the ROM bank switching by this morning, so next I had to implement switching RAM banks, which has some pretty funky indexing. Grace Hopper Naturally, what does one do when they have a hopefully working MBC system, you try a rom!. I only found out tetris doesn’t use an mbc after removing my basic mbc substitute stuff that enabled me to run simple roms. Speaking of Tetris, the screenshots are me attempting to run tetris iwth different themes (the themes work, tetris doesn’t which we’ll get to). The themes in order Wisteria GBGRreen Jungle Developer (Don’t worry, there’s more themes, and you can always submit an issue or PR with a new theme) Let’s get back to BUGSSSS!! When I tried to run tetris, it wasn’t accepting input and the arrow showing which options are selected was unpresent. These issues are the next things to resolve. I found that there was a critical error in the read methods on my button data stuct Here is the commit with the changes in case you are curious. I found out that there is a spot in memory you can write to to load a sprite from some address into OAM. This is the next thing I will be implementing before I try finding the next issue with input so I can at least see some pretty sprites. Anyway, see y’all tomorrow after I hopefully get tetris working!
Can It Tetris? I say hello to you again, my near and dear viewers, as I begin this devlog with a frustratingly long amount of time logged. Let’s dive in so I can put the last few days behind me. DMing the Memory Last time I menioned that there was a feature I needed to add that allowed the cpu to write a byte to a register in memory to trigger a transfer of data from the address specified by the written byte to the OAM (object attribute memory — sprites and stuff; this transfer is the DMA OAM tranfer) because that was the main way stuff was written to oam b/c otherwise it would be too slow. Originally, I wrote a doubly recursive function kinda thing b/c it called read_byte() when it itself was called indirectly by read_byte() and it also called itself, but I scrapped it due to unguarenteed tail recursion and the slowness of repeatedly matching the section of memory being written to/read from, so I just used copy_within(). This also somehow fixed my input issues, so idk. Double Bug Whammy This is the part of the last few days that has been a slog and a horror. After adding the DMA OAM transfer, I tried running Tetris, and it worked…until I got into gameplay. The sprite showing the selected player amount on the start screen was working and it would respond to user input. However, when it hit actual gameplay, it wouldn’t render the tetromino sprites until they were baked into the background as part of setting in place. To try and diagnose the problem, I ran blarrg’s big cpu_instrs.gb test ROM, and it stopped rendering frames in the middle of the 3rd test, the standalone ROM for which had been working without a flaw. Testing in mGBA through RetroArch (I don’t have mGBA installed standalone on this device), I found that the test takes a second to run, but doesn’t cause the whole emulator to hang. Also, since new frames weren’t being completed, it wouldn’t poll for input since it only polls on a frame completion, which meant I had to close the terminal session to quit the emulator. I spent hours running tests just to find that it was getting hit by a STOP instruction it couldn’t escape. I checked Pan Docs and found there had been some unimplemented STOP behaviours. After implementing those and it still not working, I set STOP to only stop for a single cycle, which let the test ROM pass all the tests with no timing issues. After that, within 2 minutes, I was able to find an incorrect == (should have been !=) in my sprite attributes bit 7 sprite priority control, allowing Tetris to finally work!!! Next up is: MBC2 MBC3 MBC5 Saving Audio TUI rather than bare CLI a lib.rs so others can write a frontend on top of Rusty Game Girl A style guide and making my code compliant (hard to do while writing and over a codebase who’s size is at least 4.5x bigger than anything else I’ve ever worked with) Unit tests also here’s a video of me selling at Tetris b/c I wasn’t listening to Jamie Paige while playing
Clip It Hello comrades! We’re back with yet another devlog! Let’s dive in so I can get back to programming! Memory Control (Not 1984 Style) A bit ago, I mentioned that since cartridges were physical pieces of hardware, they could have logic chips of their own controlling their own RAM, so I would have to emulate those on top of the functionality of the actual GameBoy’s hardware. The next MBC (memory bank controller) to emulate was MBC2. MBC2 is weird. It has ROM banks as standard, but it also has 512 half-bytes of RAM built straight into the MBC chip for some reason. Those were a little weird to emulate, but altogether straightforward. I also had duplicated RAM indexing logic for both reading and writing to the cartridge RAM, which I marked todo in my code, so I had an excuse to do a quick refactor. After handling the weird little freak that is MBC2 was implementing No MBC. You may be asking, V, what’s there to emulate if there is nothing to emulate? And to that I say, it is once again weird and silly, just how we like it. Even if a game has no MBC, it can still have some RAM; it’s just always on and has no logic for accessing it. It ended up with me having to deal with a lil extra changes to handle some things I was not anticipating. Looks Like You’re Trying to Kill a Stick Figure A while ago, I watched a prime video (who was also the source of the idea for this project) about the Power of 10. I’ve since thought these rules are pretty neat and can serve to make code better (with possibly the exception of rule 7). I decided that I wanted to follow rule 10 for my code, so I foolishly set all lints to max pedantic, thinking I would have some lints, but I ENDED UP HAVING HUNDREDS OF MOSTLY USELESS LINTS, many of which ended up being me using as for casting causing less readable behaviour. Some of them were useful, such as me allocating MASSIVE arrays on the stack, even if they were boxed. Turns out Box::new([0; 0x20000]) creates the array on the stack first before memcopying to the heap in unoptimised builds, which is completely unnacceptable. Also, may of my other arrays were just straight up massive and unboxed, like the framebuffer or bus memory flat array. Anyways, after spending the bulk of this devlog’s time dealing with that, I gave up knowing the rest of the lints were harmless and pointless and clogging up important lints. In other news, despite listening to Jamie Paige for many hours this weekend, I still ended up needing my fren to tell me about it’s new song with Vane Lily and Yuma . I also showed them to Developer theme and it brought them some joy. I’m also very happy I got the thermometer question right, especially since I have an infrared thermometer on my desk and I had to find the correct emissivity setting to use on milk yesterday since my dad was making yoghurt. Anyway, I’ll end this before Grammarly shows me any more lints for this devlog.
Third Time’s the Charm Hello everyone! I would have devlogged sooner, but I’ve spent most of the last time between this devlog and the last on a single feature, and the rest on YouTube. Let’s dive right in! Clock Iiiiit! After adding MBC2 and No MBC, the natural next step was MBC3. MBC3 is a lot like MBC1. It uses mostly the same register, many of which are direct copies or basically the same. There are only two key differences: MBC3 supports more RAM and has an RTC (real time clock). The more RAM wasn’t much to deal with, but the RTC kinda was. I messed up a good deal of the ticking on the irst pass of writing it, and I kept forgetting how if let worked, which did end up slowing me down. Anyway, it’s well past midnight and I need to smash my face in my pillow. My one regret is that I didn’t listen to enough Jamie Paige while devving.
Rap It Up Hello friends! We’re back with the Daily Devlog! This one’s a quickie because the docs were (mostly) clear and I was listening to Rob Apollo while working. Let’s dive right in so I can run a mile on 5.5 hours of sleep rather than only 5! The Final Boss of MBCs When I started to do MBCs, the scope of this project was to do no MBC, MBC1, MBC2, MBC3, and maybe MBC5. I have been completing them largely in sequence: MBC1 MBC2 No MBC MBC3 (yesterday) This leaves only MBC5, today’s feature. I thought MBC5 was going to be difficult, but it was probably the easiest MBC besides no MBC, which isn’t even an MBC! MBC5 is basically a simpler and bigger version of MBC1, with two exceptions: Rumble: Apparently, cartridges can shake it down because some MBC5 variants have a rumble motor controlled by bit 3 of the CRAM selector. If there is rumble, that bit is dead. Chunks Every other MBC I’ve implemented followed this general rule: the ROM is exposed of 0x8000 bytes. Those bytes are split into four sections, each of 0x2000 bytes. Depending on which register you wrote to, it would be a different MBC command/
SAAAAAAAVVVEEE MEEEEEEE Hello everyone, we’re back with our daily devlog, this time before midnight! Let’s dive in! I’ll never forget you After finishing the MBCs, it was time to work on saving the game state. I had to save the data in binary form. Originally, I was going to use bincode, but I switched to postcard since bincode has been deprecated. I managed to get the plumbing working, so now I just have to implement the saving in main.rs. I had to keep this short since I need to go to bed. See y’all!
Frontman Hello everyone! This will probably, maybe, be the shortest amount of time for a devlog, so let’s hop to it! I’ll never let you go Last night, I implemented the backend funtionality and started on frontend functionality, a ’lil bit. Over the past 30 odd minutes, I finished up the saver struct. I wanted to have Saver be have a custom drop impl, but that would require it to carry an immutable reference to the CPU through the running of the emulator, which would break ownership rules due to having to make a mutable reference to the CPU to step it. What I did was I isolated the loop into a function and saved the return value to a variable, which gets propogated after the emulator attempts to save. The video is of me loading in a save into Pokémon Red! Comment which theme you want me to show off next!
Blink Twice Hello everyone! This is going to be a shorter devlog, so let’s dive right in! NOOOOOOOOOOOooooooooo When I set up the keypress handling a bit back, I wanted to use the default Retroarch keybinds so that anyone who had ever used Retroarch could use RGG without difficulty. The one discrepancy was that you only had to click escape one singular time to quit the emulator. I am no stranger to mistaken clicks, and today I realised this could be an issue for anyone who shares some of my clumsy tendencies. I figured it iwould be good to better copy Retroarch’s binds by making it so that you had to click Esc twice in quick succession to quit. A nice and easy change tha’s completion will probably force me to actually stop procrastinating audio/APU. Anyyywayyy, y’all should listen to CityLimits , DeltaFey , and Black Polish . I feel all of their music is great for programming. We’ll see if I can post another devlog today. ¡Adiós!
Apu, like from The Simpsons ? Hello beautiful humans! We’re back, and I’ve finally stopped procrastinating on the APU! Let’s dive right in! CPU, GPU, TPU, NPU, LPU, DPU, and now APU?! I’ve been very scared of dealing with the APU, since it’s seemed like the hairiest thing to deal with, and it’s also the last part of the emulator core. The APU has four channels and mixing and fading and stuff I will get into. 2 Chan The first channel I started with was channel 2, since it is the simplest (1 has an extra feature, but otherwise, they’re the same) There are four things one needs to understand for these channels: Period Duty Length Envelope Duty is the waveform of the audio, like what percentage of the square wave is at level 1 vs level 0. This changes the timbre of the sound. Length is the amount of time the note plays for. It’s harder for devs to have to manually turn off the notes on their own b/c of timing. Envelope is the fade in/fade out of the sound Also, on channel 1, there is sweep, which changes envelope I think? I don’t know b/c Pan Docs is confusing for this (built for game developers it feels) Aaaanyways, that’s it from me for now, as I have a history in-class writing test thing tomorrow and I’ve already hit my 2½ hour goal for the day. Also, I was listening to Constant Companions and I realised I probably never listened to the album hard enough b/c “Clouddrop” is a lot more depressing than I remember, and I got ts on vinyl soo that’s something I will be embarrassed to tell my friends. Also, y’all should listen to Constant Companions to increase her listeners so that one day, Jamie can have her Paige again.
Sweep It Under the Rug Hello humans! We’re back with the DAILY DEVLOG!!!!! I need to go to bed and feed my geck, so let’s dive right in! No Sweeping for You! Today, I finished up last night’s work of finishing channel 2. All that was left was adding an output to u8 fn that’s just sitting there as dead code rn and wiring it up to read_byte(). relatively uneventful, except for when I forgot how bitwise operations work. WeeeWoooWeeeWooo After channel 2, the obvious next step was channel 1. Channel 1 is just channel 2 with an extra feature: sweep. Sweep is kinda funky. I thought it changes envelope, but it actually changes pitch. It does some weird funky shenanigans to change the pitch and also on note trigger. A lot of building channel 1 was just making echo fns for proper layering of structs. Pan docs was once again confusing. Notes A side note on documentation. While working, I decided to read the forword of pan docs, and lo and behold, its built for game developers, but there’s also a Complete GB Technical Reference which was supposedly built for emulator builders. I decided to check it out and see if it would be more useful than pan docs. BUT GUESS WHAT?? It had EVRYTHING EXCEPT AUDIO in there!! The word “audio” was used exactly once!! Apu wasn’t even mentioned!!! SO I have to continue with pan docs, which does have decentish detail for audio. Music I ended up listening to a lot of Chappell Roan, Cavetown, CITY LIMITS, and MAFUMAFU this session. Y’all should listen to the PEAK music of Sorry Ghost as well. See y’all next time!
4Chan Hello everyone! Welcome back to the Daily Devlog, where we go over the new developments in RustyGameGirl!! Let’s get started with today’s broadcast! White Noise, Brown Noise, Black Noise, Grey Noise, What’s the Difference? After finishing the two pulse channels, 1 and 2, it was time to start a new one. I went with channel 4 since it is the closest to 1 and 2 in terms of structure and simplicity. Channel 4 is a randomised noise channel thingy, for stuff, like gunfire maybe? Here’s the summary from Pan Docs: This channel is used to output white noise, which is done by randomly switching the amplitude between two levels fairly fast. The frequency can be adjusted in order to make the noise appear “harder” (lower frequency) or “softer” (higher frequency). The random function that switches the output level can also be manipulated. Certain settings can cause the wave to be more regular, sounding closer to a pulse than noise. A lot of channel 4’s machinery is the same as 1 and 2’s, like envelope and length, which brings us to our next section. Adaptive Water Body Until today, I have never written a trait in Rust. I’ve used them, of course, especially Default and Drop, but also the num-traits crate from when I was making my fast-factor crate, but I’ve never written one before. I figured now was as good a time as any, especially since all four channels share many similar methods, like the nrxy reads and writes, output (to u8 only), clock_length, tick_period, etc., so I added the three following traits: trait Channel { fn output ( & self ) -> u8 ; fn tick_period ( & mut self , ticks : u32 ); fn clock_length ( & mut self ); fn nrx1_read ( & self ) -> u8 ; fn nrx2_read ( & self ) -> u8 ; fn nrx3_read ( & self ) -> u8 ; fn nrx4_read ( & self ) -> u8 ; fn nrx1_write ( & mut self , byte : u8 ); fn nrx2_write ( & mut self , byte : u8 ); fn nrx3_write ( & mut self , byte : u8 ); fn nrx4_write ( & mut self , byte : u8 ); } trait ChannelWithEnvelope { fn clock_envelope ( & mut self ); } trait ChannelSpecificFeature { fn nrx0_read ( & self ) -> u8 ; fn nrx0_write ( & mut self , byte : u8 ); } Having all the separate impl blocks forced and ordered the same makes the code far more readable, and it’s not like this will slow the code, and it sped up the creation of channel 4 and will likely speed up channel 3’s creation. Notes Rather unfortunately, since I was coding piecemeal today and I was to lazy (probably b/c of the gudetama shirt I’m wearing), I didn’t start listening to music until ater I was done coding, while I was working on homework (English I think? It was the only real homework I had today since I did most of the rest in class), but a Polyphia song just popped up in my shuffle (Reverie), and I locked in so much harder. Also, once I started working on the APU, I cracked 4000 SLoC!!! That’s more than my last two projects doubled and combined. It’s also likely the majority of code I’ve written in the 7 years I’ve been programming. I am currently at 4509 SLoC, which is over triple my last two projects combined! See y’all tomorrow, if not later tonight!
Madra Channels Here we are; we’re back again, making this a bidaily devlog?! Let’s dive into the last 1½ hours of development so I can touch bed. Me-Chan Navigator After finishing channel 4, it was time to tackle the most complicated (maybe, but 4 is pretty funky), or at least the weirdest. I thought channel 3 varied it’s pitch based on the info in the wave ram, BUT NOOO, it varies the waveform instead. It let’s the gameboy make more varied sounds rather than just variations of beeps, like saw waves and stuff. Lots of its machinery is reused from the other channels, and it also doesn’t have envelope because you can vary the volume yourself. That’s it for this devlog! See y’all tomorrow as I probably will finish audio tomorrow! I don’t think there is an applicable image for this, so have some xkcds
BLAAALAKKLJHSLJHDKHJALKJHLKGSFG Hello everyone! It seems that the devlogs have become oppositely bidaily — just this once, don’t you worry — than my last two devlogs. Let’s dive right in since we have so much to cover. audio output master race After I finished chan 4, it was time to implement master apu registers and channel mixing and panning. Most of the registers were pretty simple, except the one with the master APU power on/power off, as to implement it I had to gate every write on whether it was on, except the wave RAM. I also did that during my PE class (while exercising, of course), which contributed to the difficulty. Fortunately, I write my code in Neovim, so it really sped things up, including 1-handed editing. With that, the backend was nearly done, and I had reached the point at which I would no longer need Pan Docs or anything of the like, just straight Rust sailing. Thread the Needle In order to get the audio timed correctly, I had to hook up tick_channels() to a channel on which it sends a tuple of u16s (left and right amplitudes) to some receiver. This lets the audio be decoupled from whatever frontend one has. Your Pal, CPAL cpal is a a Rust crate for audio and stuff. Here’s the audio stuff because I can’t think straight it’s so late & I have an integration by parts quiz tomorrow and I don’t want to fail something light b/c I didn’t sleep. fn get_audio_stream ( cpu : & mut Cpu ) -> Result < Option < Stream > , Box < dyn std :: error : : Error >> { if true && let Some ( device ) = cpal :: default_host () .default_output_device () { let supported_stream_config = device .default_output_config () ? ; let stream_config = supported_stream_config .config (); let sample_format = supported_stream_config .sample_format (); let ( sender , receiver ) = std :: sync :: mpsc :: sync_channel :: < ( u16 , u16 ) > ( 5000 ); let error_callback = | _err : cpal :: Error | {}; cpu .set_audio_sample_rate ( stream_config .sample_rate ); cpu .set_audio_sample_sender ( sender ); let stream = match sample_format { cpal :: SampleFormat :: F32 => { let data_callback = make_data_callback :: < f32 > ( receiver , stream_config .channels ); let stream = device .build_output_stream ( stream_config , data_callback , error_callback , None , ) ? ; stream .play () ? ; Some ( stream ) } cpal :: SampleFormat :: I16 => { let data_callback = make_data_callback :: < i16 > ( receiver , stream_config .channels ); let stream = device .build_output_stream ( stream_config , data_callback , error_callback , None , ) ? ; stream .play () ? ; Some ( stream ) } cpal :: SampleFormat :: U16 => { let data_callback = make_data_callback :: < u16 > ( receiver , stream_config .channels ); let stream = device .build_output_stream ( stream_config , data_callback , error_callback , None , ) ? ; stream .play () ? ; Some ( stream ) } _ => Err ( "Audio output sample format not supported! Try disabling audio in your config with 'audio = false'" , ) ? , }; return Ok ( stream ); } Ok ( None ) } // makedatacallback not shown due to char limits Position,Velocity, Acceleration, Jerk, Snap, Crackle, and Pop After that, I tested it, but there was some terrible audio crackling. Turns out it was due to oversleeping when trying to time things correctly, though before finding this out, I ended up slightly optimising draw_frame().The artifacts seem to be mostly gone and I will leave this to tomorrow silly. nearly @ 5000 sloc
Scream it Loud and Scream it Proud Hello everyone! We are back with the once again DAILY devlog!!! Let’s dive right in! IT LIIIIIVES!!! This morning, as soon as I came up, I sat my @ down to trouble shoot my audio processing on 4 hours of sleep . Despite adding the manual sleep time reduction, I was still experiencing some crackling, so I found a bug in the channels, solving which didn’t solve anything, but switching timing to be based off of audio when available worked like a charm, giving better and more accuracte speeds and crisp audio, so I was able to show off my COMPLETED EMULATOR CORE to some of my friends (as well as my backpack with Ferris on it). IT DIIIIIES!!! After adding the audio, I had to make sure that it wouldn’t cause the emulator to break, so I added a timeout that shuts off audio if it’s broken for more than 500 ms YES CAAAAAAP Because of how I was translating from u16 audio to f32, I was getting popping, so I implemented a software capacitor to slowly dampen sounds closer to EQUILIBRIUM SWITCH IT UUUUP After audio had all it needed, it was time to work on something I had long anticipated, a lib.rs for people o build their own frontends on top of my emulator. I also added an Emulator wrapper struct around Cpu so that it would be easier to manage pub methods and such without the ~1550 other lines in cpu.rs making things hard. There’s a reason this project isn’t just one big file of 5000 SLoC. I also added some documentation, and I found the best use of Claude Code is checking for spelling errors (it’s like I’m illiterate!) Speaking of SLoC, I cracked 5000 today! This is about 3.5x larger than my last two projects combined! I’ll see y’all next time, and don’t forget to listen to beabadoobee’s new album Pylon and Jamie Paige!
Dripmogging Hello developer theme users! It’s been a couple days since my last devlog, since I couldn’t make one last night since my dad thought I had school today, so let’s dive in so I can work on compliance and becoming a peer tutor for math for my school! Bitmasks: origins One of the biggest parts of this project is working with bytes and getting data from bytes. To do this, you have to shift the bits you want to the end and then mask them like (byte >> shift) & bitmask . I feel like I’ve gone through dozens of different styles for bitmask and shift numeric literals, which is where the whole style guide idea came from. Personal Stylist For the past 4 hours, I’ve been perfecting a style guide for my codebase. It’s a beautiful org doc with that sweet sweet table of contents with rules on everything from numeric literals to tests to error enums. There’s not to much to say except the next step is going over all 5000+ lines of code to enforce compliance. I’d like that written up A quick note on org. Many online code hosting services like GitHub and Codeberg support org rendering. Rather unfortunately, crates.io only supports a README.md, and not a README.org, which gives me a big sad, especially since I’ll haveto rewrite my README in markdown (ew), which does not give me the luxury of an automatically generated table of contents. That’s it for now folks, see y’all tonight!
If You Do Not Comply Hello everyone! We’re back with another devlog! I need to go to school soon, so let’s dive right in! Numerics, Literally Since I made the style guide, it was time to start implementing it. So far, I’ve gone through emulator.rs, memory_bus.rs, apu.rs, and cpu.rs. emulator.rs This one just needed doccomment formatting. memory-bus.rs This one needed a few numeric literal changes. I also directly accesses the stat field of gpu, which is unnacceptable, but since I’m doing gpu.rs next, I left it for the time being. apu.rs Despite being the file in which I came up with a chunk of my numeric literal style while writing, it felt like every literal was wrong. cpu.rs This was the second easiest file, despite it being the longest by a wide margin. There was some repetitive numeric literal issues in the methods, but that was it. I also tried to split it into multiple files for length since it is double the size of any other file, but I lowkey failed. Next up is gpu.rs compliance. I’ll see y’all next time!
You Will Be Terminated Hello everyone! We’re back with another devlog! Let’s dive right in since it is 02:00 over here! Lookin’ So Fab I have contined with my quest to implement my BEAUTIFUL and living style guide. Here’s what I did, since this work is mostly just repetitive and long. gpu.rs and memory_bs.rs publicity compliance. Before today, 4/6 of Gpu’s fields were pub(crate) something they had no business being, so I refactored so everything uses methods. Took a chunk of time but it was very worth it. registers.rs This one was pretty stupid. It had two main issues, publicity and masks. The lackluster and incomplete guide I was following had me write registers.rs with a ton of bitmasks it didn’t need it in a way that was ugly and sad, so I dropped the masks. All of Registers’ field and subfields are pub(crate), which I determined is optimal because it would be a major and massive chang to Cpu, and the registers are purely for the Cpu to use, and are part of the Cpu. rom.rs rom.rs was pretty chill, only a few things here and there. joypad.rs Despite this one taking a matter of minutes, this one is going to cause my so much work. All of its publicity was correct, as well as bit selecting formatting. Turns out I’ve been forgetting to remove parentheses around my files! Simply ridiculous! ANyway, that’s all for now, since I need to go touch bed. So y’all later, and keep listening to Jamie Paige!
Comply-cations Hello everyone!! We’re back with another devlog today. Let’s dive right in so I can start the next step! Parensal Issues As I said in my last devlog, while working on compliance for joypad.rs, I realised that I needed to delete extra parentheses around operators with obvious precedence. After working on that file, I continued down the buffers open in Neovim, also correcting that issue in addition to the others. Because I only caught it midway through, I have to complete a second pass of compliance editing. Fortunately, I have mini.surround installed, so deleting parentheses is really easy. That’s all that really happened. Make sure to listen to the daily dose of Jamie Paige and Vane Lily’s new song!
Ratatouille Hello everyone, we’re back with another devlog! Let’s dive right in so I can hit bed so I can go rafting the day after tomorrow! Compliance Chips I’ve finally finished dealing with compliance! I’m surprised by how many extranneous parentheses I had! I knew I had a lot, but I didn’t know it was this much! I’m so happy that is over so I can get to real work! Tui T. Sutherland The last big feature I wanted to add before shipping was a TUI for selecting ROMs and saves. To do this, I need to use the ratatui crate, which fortunately run off the same crossterm my project already does. So far, all I’ve done is learn about it and write the fn for getting the directories/files with the appropriate endings and sorting them for display use. I’ll see y’all in a couple days!
Pick Me Hello everyone! Let’s dive in so I can go feed my gecko and sleep! Seleccionar For the past few hours, I’ve been working on the file picker for selecting a rom and a save file. A lot of it is just learning about how to use Ratatui. Originally, I was going to have the selecting happen all at once, by one function, but I switched it to two calls so that load_rom() and has_battery() can be called to check whether the save menu should even come up. Write-In Candidate The thing is, since with a new save, the file has to be constructed by the emulator and it doesn’t exist. Right now, I’m writing a little text input field to be triggered if the save menu gets close with Esc. This will be pretty short, and won’t require a large change to existing code. After that, I’ll wire it in and test. Next Steps Homebrew Cask Separating frontend from backend crate by crate, so lib users don’t have to deal with frontend only imports.
Vendetta Hello everyone! Let’s dive right in so I can work on my math homework so I don’t fail my calc test next week! TUIzers I COMPLETED THE TUIIIIII!!! I added a text entry box for people to manually enter the names of their new saves. I also stylised the highlighting a bit more, and , even though its not in the video, now, the color changes to green when you’re selecting a save. This was a really fun learning experience. I originally wanted to make a TUI because one of the raters on my last project, leading zero util , complained about having to use a simple CLI and told me it wasn’t that good because of the lack of TUI, so this has been kind of a personal vendetta against that person to improve my software and user experience. The Other Interface This project isn’t just a CLI utility. The entire time I’ve been building this, I’ve wanted to enable others to make a frontend for it, whether it be on the web or a gui or some port of it in something. I’ve maintained a careful separation between lib and bin, with the exception that they are the same crate. For library users, dealing with my errors would be impossible since many of them are just strings and they are all just Box. Before throwing this on crates.io, I want to make error enums and stuff so people can do error matching. Tap Tap After completing error enums and stuff, I’m going to throw it on crates.io and make a github release so I can make a Homebrew tap. The last time I made a homebrew tap, I gave the project it’s own separate tap repo, but this time I’ll keep all my taps in a new tap repo on my GitHub instead of Codeberg for users. That’s it for now! I’m excited to make error enums so I can have that skill under my belt as well! Also, I’ve reached the point where shipping would probably let me get a framework 12, which is very exciting for me.
Erroneous Hello everyone! I have a history in-class-writing in 6 hours, so let’s dive right in! Error 404 Once I started adding support for loading ROMs and saves, failure points became possible. I hadn’t previously written errors before, so I just wrote strings and propagated them through with Result< T, Box> and the ? operator, with no regard to API users that may want to recover from a failure. I’ve been putting this off for so long, and was even considering doing this after shipping, but since I have so much time on my hands and the only other big TODOs left are the README.md and the Homebrew tap, I decided, why not? This has been a very interesting process over all, and it even gave me the impetus to do some proper gating on load_rom. Different MBCs only support some cram sizes, but because I wasn’t gating on load, these would fail at runtime with a mismatch. Read All About It Next up is the README. I previously had a mediocre, small, incomplete README in a file formet I forgot crates.io doesn’t have a renderer for, so I figured it would be best to start from scratch in Markdown instead of trying to port it over from Org. I also chnaged the name to Riggurly since that rolls off the tongue more. That’s it for this morning! I also found the bathroom in ENA: Dream BBQ, which was cool. I still need to go inside. Also, make sure to listen to Jamie Paige, as she always boosts my productivity!
Lover Tell Me if You CanHello everyone! Let’s dive in so I can work on improving the user experience!## ManThis devlog is all about README. I have actually never used Markdown before, only org, Emacs’s outliner/md format, because it is more intuitive and Emacs gives you more toys. My style guide is in org, my todo lists are in org; the only things that aren’t are the AGENTS.md I stole from Ghostty and the README.md. I ended up using a combination of the Stardance and Phantom README guides to help me figure out what to put in it and how to do syntax. Working on the README put an emphasis on some flaws in my code:- config path ~ not expanding- my glaring lack of a homebrew tap- mono audio still being unsupported- feature gating on binary-only depsThat’s it for now folks!
Much TODO About Nothing Hello everyone! We are finally back after a devlog hiatus due to me having to write essays to apply for my school’s software team! Let’s dive in so I can work on my history homework! Read It and Weep Last time, I talked about, in one title line by accident, how writing documentation and documenting my software’s flaws really exposed what was wrong with it. This update is all about fixing those flaws (mostly) A Multitude of Screams One of the biggest issues with my emulator was the audio. Not in the backend, but the frontend. Due to laziness, I didn’t bother adding mono audio support, which ended up being a 5-minute fix. There was also another glaring issue with the audio: Once it crashed, it wouldn’t rebuild the stream. If you unplugged your headphones, thinking the audio would continue on your other speakers, it would just turn it off and modulate speed with std:🧵 :sleep() . It took me a while to write all the rebuilding code in such a way to maximise user QoL for all users. When did I download you?! Since Riggurly is both a CLI AND a library, it has dependencies that are used only in the CLI that are still a part of the package as a whole. Library users still have to download and compile these dependencies, which can be a hassle and a waste of time. I’ve been meaning to put CLI-only dependencies behind a feature so library users can easily prevent themselves from downloading and compiling a bunch of heavy extra dependencies. This also taught me how to use features, which was good. You’re a Waste of the Air You Breathe! One thing that’s been bugging me for a while is efficiency. My array for the fallback memory bus array in the memory bus struct has always been 0x10000 bytes long (1 mebibyte, how much ram a GB has (kind of)). How reading and writing has worked is that there are match statements you go through to see if you access that array or you access the rom or if you access the vram or something else. The problem is that over 3/4 of that array’s length is useless and shadowed by ROM/CRAM/VRAM. I was wasting 768 kb of heap-memory. I ended up dropping the first 3/4 and just having a smaller array. Unfortunately, some space is still wasted, but it’s not much compared to before. I showed @ElffawIThink and they though it was funny. Also, one of the ROM types comes with 512 HALF-BYTES(nibbles) of RAM, which I had been representing with a [u8,512] with the upper nibbles of EVERY BYTE going unused. I shrank this down to a [u8,256] and use both nibbles for a fish in the sea . Take Me Home Before, I had to put a disclaimer in my README that you couldn’t use ~ as your home directory in your default ROM path in your config.toml because different users have different home directories and I have to use the dirs crate to find that out at runtime. This was a surprisingly long fix, though it was quite simple. Just a few lines of code to strip the ~ and replace it with the already found home directory. That’s all for tonight comrades! Make sure to listen to Jamie Paige, especially Clover! That song is now the first song in my playlist with vocal (sequentially, obviously my playlist has other songs with vocals), overtaking Lemon Boy by Cavetown, it’s just that good. It has also shown itself to be a better daily anthem than Villain by Teniwoha and Schifty Five, the YouTube classic.
Little Bonuses Hello Everyone! I have to go walk the dogs, so let’s dive right in! Building Codes Since I want a few more hours to try to see if I can get a Framework 13 and Celeste, I decided it would be good to add all the nicities I did for my last CLI, leading-zero-util (I know, terribly named), namely, man file and completion generation. On lzu, I used a hidden flag for completions and had a build.rs for the man page. However, I found it best to merge all of them into one hidden flag for ease of use. At first I tried a build.rs, but it kinda made dependencies annoying and made either my or lib users’ lives worse. That’s it for now folks! Next I’ll be working on unit tests for ROM stuff.
sleep(); sleep(); sleep(); allTestsPass() Hello everyone! Let’s dive in so I can get back to work before I go to bed! Testing, Testing, 1, 2, 3 For the last couple hours, I’ve been writing unit tests for the ROM module. I’ve been going on and off with unit tests for a while. Before, I wanted to write unit test for cpu instructions before realising Blarrg made test ROMs for that. Because of that, test ROMs are the primary mode of testing out Riggurly, especially since test ROM developers know much more about specifics, like the halt bug, than I do. However, trest ROMs don’t test things like saving and loading, which is something I CAN write tests for in a reasonable amount of time. A lot of the work I’ve done was just making one helper function and figuring out what I wanted to be covered by it and what I want the tests to do. I might also refactor some repeated stuff into another helper for more efficient code after I finish writing the save round trip unit tests. That’s it for now friends, and don’t forget to listen to Flavor Foley’s new album, Mirror Modulation, which dropped today? on all music streaming platforms
Failing Tests Hello everybody! We’re back with another devlog! Let’s dive right in so I can got to bed! All Tests Pass A good bit of test writing has happened since the last devlog. The ROM suite has gone from a measly 3 tests to a much nicer 16, though still incomplete. I wrote more tests to test combinations of roms and save sizes that are meant to work, as well as a bunch of those that also test RTC functionality for MBC3. I ended up putting ROM construction into a helper, as well as making a helper for most of the save round trip tests, probably saving a few hundred lines of code. Next tests are probably going to be broken saves, saves that don’t match, etc. etc. to see that ROMs are preserved and such. Algospeak Going back to the RTC, I remade the function that adds a number of seconds to the internal RTC. What I was doing before was calling a function that ticked by ticks with an amount of ticks equal to 1 second FOR EACH SECOND. That’s often hundreds of thousands or millions of function calls, with O(n) time complexity. I was pretty easily able to swap it for an O(1) modulus thingy. Switchie-Shwoo Going back to ROM preservation, I recently realised that it was loading in new timestamp data before checking save validity, which could end up being problematic. I just swapped the order of those two and the problem was solved, though, as I said before, this needs to be test-enforced. That’s it for now folks! See y’all next time!
Scooby-Doo Hello friends! I just got an email from Stardance saying I have 8+ unlogged hours, so let’s dive in? I Wish That I Could [Fail] I haven’t exactly done much of aything since my last devlog. I’ve written two unit tests, I guess, which do partially (mostly) address the situation with ensuring that ROM state isn’t changed by a bad save, such as with an RTC or loading in a bad save. I covered the case for two MBCs (MBC1 and MBC3) that the number of banks for the save is mismatched with what ROM was loaded (eg. 4 banks on a 1 bank ROM or MBC2 style ram on an MBC3 rom, though I will cover this case in the future). As for where the time came from, it may be that I stared at my TODO list too hard, as I have my TODOs for Riggurly in one emacs split and my TODOs for school in the other, but I have my school.org in a completely different location in my FS, in my org directory ~/org instead of my my Riggurly directory ~/projects/riggurly, but I have no clue. I didn’t even edit either file for more than a total of 5 minutes!!! Anyway, that’s all for now folks! Make sure to keep listening to Jamie Paige and drop @ElffawIThink a follow! Also, the novel is a stupid ad I saw on Royal Road whiul ereading 1% lifesteal...
|
1792572850.1101463
|
1793177650.1101463
|
|
68951
|
Nexus - All in One by @yeagerist | Stardance
|
yeagerist
|
1
|
8.96
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-13T15:57:55Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I Built NEXUS, my own new tab dashboard! It has a live analog clock, daily tasks features, shortcuts section , and a 5-minute focus timer for god knows why. Getting everything to work together and setting up GitHub Pages deployment was a good learning experience. Still got ideas for improvements, but I’m happy with where it is right now. Give it a try: https://aarjal.github.io/Nexus/", "repo": "https://github.com/Aarjal/Nexus", "demo": "https://aarjal.github.io/Nexus/"}]...
|
[{"post_id": 80939, "ts": "202 [{"post_id": 80939, "ts": "2026-10-19T09:42:30Z", "hours": 1.9617, "text": "My final log for NEXUS– I’ve added an actual background this time removing just the color gradient one. The whole UI theme is now based on the new bg. New layouts. Removed whole box- designs and unnecessary css. This time there’s mobile responsiveness as well. Here’s a before vs after for you."}, {"post_id": 79344, "ts": "2026-10-13T15:55:26Z", "hours": 0.6906, "text": "In this session I wrote the readme file for Nexus. I also made Nexus deployable and hosted through github pages. I took help from the guide for this process. Finally Nexus is live now"}, {"post_id": 79270, "ts": "2026-10-13T08:37:22Z", "hours": 1.4753, "text": "Two major updates at once this time.. –I’ve completed the daily task feature which was previously only a skeleton. Now you can add your tasks and mark it checked as in the pic after youve completed it. –I’ve also added the focus timer for you lots to get over-stimulated :) . For now, only I can choose the timer time which I’ve chosen 5 mins. You can pause and resume the timer. (adding this feature reminded me I’m good at maths ><)"}, {"post_id": 79010, "ts": "2026-10-12T10:25:54Z", "hours": 0.7928, "text": "I made the shortcuts section responsive and usuable. You can add a new shortcut with its link and it’ll update in the main page. It vanishes just after a reload tho >< Finally functions like an actual new tab page now"}, {"post_id": 78998, "ts": "2026-10-12T09:33:35Z", "hours": 0.8472, "text": "As promised, Nexus has its own analog clock now.. This design was what I initially envisioned. The previous version was just a placeholder for my html section. This one little update took a lot cus my math wasn’t mathing at all. After trials and error, I looked up some reference and finally managed a live-working one. Hope yall like the update"}, {"post_id": 78809, "ts": "2026-10-11T17:48:26Z", "hours": 0.9786, "text": "Nexus gets little life now.. I’ve added some JS functions for date and time functionality. The page even greets you as per your time of the day. Also added a feature for remaining time of the day to boost up your morale haha. I also embedded lucide for header icons and implemented the relevant CSS. Well, finally it’s now a html+css+js thing but still need to add more.. (dw i’ll replace that dirty thing with an analog clock later)"}, {"post_id": 78438, "ts": "2026-10-10T20:02:49Z", "hours": 1.0056, "text": "Nexus has its own look now. This session was supposed to be CSS along with JS but i figured i could just separate the logs for them. SO this is just the part for visual foundation. I’d envisioned a dark purpulish theme and pre-designed the layout in canva but implementing that in actual code was really troublesome. I’ve been trying to make the page fit-to-screen with all the sections unhindered but cant seem to manage it idk why. for now I’ve just decreased the box size of shortcuts and workspace to make it fit but later after actual content is added idk how I’m gonna manage that. If anyone can help, I’d be glad. Here’s the current look after CSS foundation."}, {"post_id": 78285, "ts": "2026-10-10T08:46:59Z", "hours": 0.8636, "text": "NEXUS- All in ONE –I’ve kicked off my new stardance mission - Give your website a pulse with “Nexus” which is a custom new-tab-style dashboard designed to make opening a new tab little more useful. I’ve spent the first hour of work setting up the project with Vite and Vanilla JS and planning the main sections and look of page in Canva and implementing it in html. So yes, The UI is still a skeleton right now, but the foundation is in place. Next up, I’ll be giving my page a little life with CSS and JS"}]...
|
Title: Nexus - All in One by @yeagerist | Stardanc Title: Nexus - All in One by @yeagerist | Stardance
Devlogs:
NEXUS- All in ONE –I’ve kicked off my new stardance mission - Give your website a pulse with “Nexus” which is a custom new-tab-style dashboard designed to make opening a new tab little more useful. I’ve spent the first hour of work setting up the project with Vite and Vanilla JS and planning the main sections and look of page in Canva and implementing it in html. So yes, The UI is still a skeleton right now, but the foundation is in place. Next up, I’ll be giving my page a little life with CSS and JS
Nexus has its own look now. This session was supposed to be CSS along with JS but i figured i could just separate the logs for them. SO this is just the part for visual foundation. I’d envisioned a dark purpulish theme and pre-designed the layout in canva but implementing that in actual code was really troublesome. I’ve been trying to make the page fit-to-screen with all the sections unhindered but cant seem to manage it idk why. for now I’ve just decreased the box size of shortcuts and workspace to make it fit but later after actual content is added idk how I’m gonna manage that. If anyone can help, I’d be glad. Here’s the current look after CSS foundation.
Nexus gets little life now.. I’ve added some JS functions for date and time functionality. The page even greets you as per your time of the day. Also added a feature for remaining time of the day to boost up your morale haha. I also embedded lucide for header icons and implemented the relevant CSS. Well, finally it’s now a html+css+js thing but still need to add more.. (dw i’ll replace that dirty thing with an analog clock later)
As promised, Nexus has its own analog clock now.. This design was what I initially envisioned. The previous version was just a placeholder for my html section. This one little update took a lot cus my math wasn’t mathing at all. After trials and error, I looked up some reference and finally managed a live-working one. Hope yall like the update
I made the shortcuts section responsive and usuable. You can add a new shortcut with its link and it’ll update in the main page. It vanishes just after a reload tho >< Finally functions like an actual new tab page now
Two major updates at once this time.. –I’ve completed the daily task feature which was previously only a skeleton. Now you can add your tasks and mark it checked as in the pic after youve completed it. –I’ve also added the focus timer for you lots to get over-stimulated :) . For now, only I can choose the timer time which I’ve chosen 5 mins. You can pause and resume the timer. (adding this feature reminded me I’m good at maths ><)
In this session I wrote the readme file for Nexus. I also made Nexus deployable and hosted through github pages. I took help from the guide for this process. Finally Nexus is live now
My final log for NEXUS– I’ve added an actual background this time removing just the color gradient one. The whole UI theme is now based on the new bg. New layouts. Removed whole box- designs and unnecessary css. This time there’s mobile responsiveness as well. Here’s a before vs after for you.
Ships:
I Built NEXUS, my own new tab dashboard! It has a live analog clock, daily tasks features, shortcuts section , and a 5-minute focus timer for god knows why. Getting everything to work together and setting up GitHub Pages deployment was a good learning experience. Still got ideas for improvements, but I’m happy with where it is right now. Give it a try: https://aarjal.github.io/Nexus/...
|
1792857215.8376584
|
1792943615.8376584
|
|
50004
|
Guess It! by @akisarke | Stardance
|
akisarke
|
1
|
57.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-17T14:07:14Z", "hours": 53.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Guess It! is finally live! A daily estimation game. Three questions a day, you lock in a number, and get scored on how close you got. The lower the better. I added: a daily puzzle with three questions, a full reveal, and where your guess landed in the distribution AI-generated questions so it never runs dry. They’re checked before they go in the catalog and burned once they’ve been used anonymous play, so you can try it before you make an account email sign up and Hack Club OAuth, with verification and password reset streaks, badges, pinned badges, avatars, bios leaderboards for today, this week, and friends only duels - challenge someone to a live 1v1, three rounds, one shared reveal matchmaking, if you’d rather get paired with a stranger generated sets, for when you want more than the daily puzzle notifications and friend requests React and Fastify on PostgreSQL. No questions are on the backend. The honest part: some of this only broke once it was already live. The question catalog ran all the way down so the questions can repeat. And for a while the AI generation was down because I’m using the free tier of gemini models. You can try it at https://guessit.akisarke.xyz or click the try project button below. See ya later! 👋", "repo": "https://github.com/akisarke/guess-it", "demo": "https://guessit.akisarke.xyz"}]...
|
[{"post_id": 80940, "ts": "202 [{"post_id": 80940, "ts": "2026-10-19T09:43:56Z", "hours": 3.9994, "text": "Devlog 11 After the first ship it got declined because the UI was too AI, and i see it now. So thats why i tried my best to make it less look like it was AI-made. And I think i was pretty successful. I hope you like it!"}, {"post_id": 80379, "ts": "2026-10-17T13:48:17Z", "hours": 3.69, "text": "#Devlog 10 - THE FINAL DEVLOG! As you see the site is fully deployed and on my domain! I’m very exited for you guys to try it but dont expect anything special there will be bugs (since this is my first time working with a backend). Shipping soon! Bye for now! 👋"}, {"post_id": 79422, "ts": "2026-10-13T22:15:36Z", "hours": 7.0172, "text": "Devlog 9 Hey guys! This will probably be the last devlog before shipping. I just fixed some bugs and added more animations and redid the spacing of elements. It isnt still perfect but it gets the job done. Anyway since i dont have anything to show you heres a picture of my cat. His name is Leo if anyone is curious. Thats all. Bye for now! 👋"}, {"post_id": 76761, "ts": "2026-10-04T14:50:16Z", "hours": 9.3736, "text": "Devlog 8 Hi guys I was locking in for the stardance end but then it turns out it got extended by one month so thats cool. Anyways getting close for shipping i just need more questions so i have enough for the daily ones, if you want leave some ideas in the comments down below. Also I need to fix the email verification for the accounts and thats pretty much it. Bye for now! 👋"}, {"post_id": 72156, "ts": "2026-09-22T10:28:44Z", "hours": 8.7528, "text": "Devlog 7 Fixing the duels besides that i didnt do anything special since for now im focusing on that because it dosnt work very well also i made a favicon but havnt yet implemented it will do that later. Dont think i will be posting much devlogs since i want to lock in to finish it before the stardance end. Thats all Bye for now👋"}, {"post_id": 69278, "ts": "2026-09-16T18:36:54Z", "hours": 8.5617, "text": "Devlog 6 Nothing pretty much outside of debugging the duels and the ai generating questions but i also added the history of your ai generated questions in the profile and added a share profile link (i dont like the position of it placed it there just for now later it will be next to the profile info card). Thats all Bye for now!👋"}, {"post_id": 65620, "ts": "2026-09-10T21:19:39Z", "hours": 4.0503, "text": "Devlog 5 Today I worked on the profile (on the bio and on the badges, the badges need icons still) and on the forgot password page and the email sending service (if you want to know im using resend for it and the page needs some ui fixing) and i need to fix the duel/quickplay and the ai generating questions stilll because im a lazy ahh person Bye for now! 👋"}, {"post_id": 64701, "ts": "2026-09-09T10:02:22Z", "hours": 3.5931, "text": "Devlog 4 Hey guys! In this devlog i made the archive of the questions and the profile both of them needs fixing the profile for the badges (since you cant get any for now) and the archive because you cant play them for now. Fixing it in the next devlog hopefully 🤞 Thats all! Bye for now! 👋"}, {"post_id": 63460, "ts": "2026-09-07T10:14:10Z", "hours": 5.1714, "text": "Devlog 3 I added a dark theme and also a switch for it and i made the landing page and finished it so i can now show it to you guys also i cleaned up the code a little bit. Bye for now 👋"}, {"post_id": 61570, "ts": "2026-09-04T15:30:41Z", "hours": 2.105, "text": "Devlog 2 After a lot of brainstorming and researching about the design i think i will go with this but a dark version of the background (didn’t do it now because i’m on a time crunch). Also i added the buttons on the top bar but they don’t do anything for now. That’s all Bye for now! 👋"}, {"post_id": 61123, "ts": "2026-09-03T21:26:36Z", "hours": 0.8294, "text": "New Project!! (Devlog #1) Hi everyone i just started a new game about guessing random things. This is just the start so nothing much there is more in there but i dont want to bore you guys. More devlogs coming soon! Bye for now 👋"}]...
|
Title: Guess It! by @akisarke | Stardance
Devlogs Title: Guess It! by @akisarke | Stardance
Devlogs:
New Project!! (Devlog #1) Hi everyone i just started a new game about guessing random things. This is just the start so nothing much there is more in there but i dont want to bore you guys. More devlogs coming soon! Bye for now 👋
Devlog 2 After a lot of brainstorming and researching about the design i think i will go with this but a dark version of the background (didn’t do it now because i’m on a time crunch). Also i added the buttons on the top bar but they don’t do anything for now. That’s all Bye for now! 👋
Devlog 3 I added a dark theme and also a switch for it and i made the landing page and finished it so i can now show it to you guys also i cleaned up the code a little bit. Bye for now 👋
Devlog 4 Hey guys! In this devlog i made the archive of the questions and the profile both of them needs fixing the profile for the badges (since you cant get any for now) and the archive because you cant play them for now. Fixing it in the next devlog hopefully 🤞 Thats all! Bye for now! 👋
Devlog 5 Today I worked on the profile (on the bio and on the badges, the badges need icons still) and on the forgot password page and the email sending service (if you want to know im using resend for it and the page needs some ui fixing) and i need to fix the duel/quickplay and the ai generating questions stilll because im a lazy ahh person Bye for now! 👋
Devlog 6 Nothing pretty much outside of debugging the duels and the ai generating questions but i also added the history of your ai generated questions in the profile and added a share profile link (i dont like the position of it placed it there just for now later it will be next to the profile info card). Thats all Bye for now!👋
Devlog 7 Fixing the duels besides that i didnt do anything special since for now im focusing on that because it dosnt work very well also i made a favicon but havnt yet implemented it will do that later. Dont think i will be posting much devlogs since i want to lock in to finish it before the stardance end. Thats all Bye for now👋
Devlog 8 Hi guys I was locking in for the stardance end but then it turns out it got extended by one month so thats cool. Anyways getting close for shipping i just need more questions so i have enough for the daily ones, if you want leave some ideas in the comments down below. Also I need to fix the email verification for the accounts and thats pretty much it. Bye for now! 👋
Devlog 9 Hey guys! This will probably be the last devlog before shipping. I just fixed some bugs and added more animations and redid the spacing of elements. It isnt still perfect but it gets the job done. Anyway since i dont have anything to show you heres a picture of my cat. His name is Leo if anyone is curious. Thats all. Bye for now! 👋
#Devlog 10 - THE FINAL DEVLOG! As you see the site is fully deployed and on my domain! I’m very exited for you guys to try it but dont expect anything special there will be bugs (since this is my first time working with a backend). Shipping soon! Bye for now! 👋
Devlog 11 After the first ship it got declined because the UI was too AI, and i see it now. So thats why i tried my best to make it less look like it was AI-made. And I think i was pretty successful. I hope you like it!
Ships:
Guess It! is finally live! A daily estimation game. Three questions a day, you lock in a number, and get scored on how close you got. The lower the better. I added: a daily puzzle with three questions, a full reveal, and where your guess landed in the distribution AI-generated questions so it never runs dry. They’re checked before they go in the catalog and burned once they’ve been used anonymous play, so you can try it before you make an account email sign up and Hack Club OAuth, with verification and password reset streaks, badges, pinned badges, avatars, bios leaderboards for today, this week, and friends only duels - challenge someone to a live 1v1, three rounds, one shared reveal matchmaking, if you’d rather get paired with a stranger generated sets, for when you want more than the daily puzzle notifications and friend requests React and Fastify on PostgreSQL. No questions are on the backend. The honest part: some of this only broke once it was already live. The question catalog ran all the way down so the questions can repeat. And for a while the AI generation was down because I’m using the free tier of gemini models. You can try it at https://guessit.akisarke.xyz or click the try project button below. See ya later! 👋...
|
1792615733.9340649
|
1792702133.9340649
|
|
70465
|
The Blog Bench by @jaisondavidm_cs25 | Stardance
|
jaisondavidm_cs25
|
1
|
64.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-19T10:09:15Z", "hours": 64.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made a site name The Blog Bench here user can post their blogs and read other blogs and tag some user which get notified. and report the blog if it is not good and view post based on tag categories and can get the trending blogs . you can i write a blog in a good rich text editor the challenging part is the deployement part because it is a fullstack project . i new to use docker docker compose so i learned it and deployed after struggling and connecting the client,server,database everything felt difficult i have admin sperate pages so for admin credentials use admin(username) Admin007@(password)", "repo": "https://github.com/jaisondavid-m/blog-site", "demo": "https://json.hackclub.app"}]...
|
[{"post_id": 80942, "ts": "202 [{"post_id": 80942, "ts": "2026-10-19T10:03:19Z", "hours": 64.3667, "text": "i do this project for maconda but they now say to move to other events so i shipping here i already posted all develogs and commit the history properly you can refer all my develogs using this link https://macondo.hackclub.com/projects/6875"}]...
|
Title: The Blog Bench by @jaisondavidm_cs25 | Star Title: The Blog Bench by @jaisondavidm_cs25 | Stardance
Devlogs:
i do this project for maconda but they now say to move to other events so i shipping here i already posted all develogs and commit the history properly you can refer all my develogs using this link https://macondo.hackclub.com/projects/6875
Ships:
i made a site name The Blog Bench here user can post their blogs and read other blogs and tag some user which get notified. and report the blog if it is not good and view post based on tag categories and can get the trending blogs . you can i write a blog in a good rich text editor the challenging part is the deployement part because it is a fullstack project . i new to use docker docker compose so i learned it and deployed after struggling and connecting the client,server,database everything felt difficult i have admin sperate pages so for admin credentials use admin(username) Admin007@(password)...
|
1792857041.7982945
|
1793721041.7982945
|
|
41532
|
H3M3 - THE multi purpose 6 key macro pad by @hien H3M3 - THE multi purpose 6 key macro pad by @hien | Stardance...
|
hien
|
0
|
7.93
|
0
|
[]
|
[{"post_id": 80943, "ts": "202 [{"post_id": 80943, "ts": "2026-10-19T10:07:43Z", "hours": 0.4242, "text": "CAD Update Made the base of the 3d printed case angled for a better experience and also made some 3d printable keycaps with a parametric keycaps model maker. Here’s what it should look like all together, printed in beige!"}, {"post_id": 71761, "ts": "2026-09-21T13:49:50Z", "hours": 1.0647, "text": "README fully updated with the reworked code and config.json and added calibration guide, 3d printable case uploaded and new macro-pad look updated, as well as an embedded youtube demonstration video!!!!!"}, {"post_id": 70599, "ts": "2026-09-19T12:50:23Z", "hours": 0.5806, "text": "The great rework Reworked code.py for a more user friendly config.json and much more snappier magnetic switches, as well as more adjustable settings, guide in README will be updated soon!"}, {"post_id": 59553, "ts": "2026-09-01T13:15:57Z", "hours": 0.8636, "text": "Made it so that all keybinds and settings can be modified through a config.json file, new code posted on github"}, {"post_id": 58997, "ts": "2026-08-31T15:56:30Z", "hours": 0.2989, "text": "3D printable case UPLOADED and README file modified to fit PCB and 3d printed case"}, {"post_id": 57760, "ts": "2026-08-30T01:20:01Z", "hours": 0.7831, "text": "PCB first version done! Writing this after getting plenty of sleep. After six grueling hours yesterday figuring out kicad, fumbling around and going through about six iterations(which hackatime didnt track idk why), I present to you the first version of the PCB for the project. This takes out ALL the wiring and reduces the case height/thickness by 4x. If you have any questions or see any errors that my 1am self made yesterday, please feel free to drop it down in the comments section."}, {"post_id": 41205, "ts": "2026-08-05T09:04:04Z", "hours": 3.125, "text": "Code and instructions and more OFFICIALLY posted on github! Hall sensor calibration files, 3d printed case and pcb will be on there soon. Here’s the link: https://github.com/hien-cmd/h3m3-multipurpose-6key-macropad . Feel free to leave suggestions and ask any questions:)"}, {"post_id": 40088, "ts": "2026-08-03T14:03:08Z", "hours": 0.7897, "text": "First devlog Ok I admit this project was started about a week ago, I managed to make a prototype of it purely out of soldering and 3d printing, since I lacked the fund and skills to create pcbs. Although it worked fine, it isn’t as great, compact and accurate compared to a pcb. But without further ado, I present to you my 6 button macro pad: -Features 6 programmable keyboard keys: -3 of them being mechanical for casual work -3 special adjustable hall effect keys for gaming(i personally use it to play osu!) -Uses: -rp2040-zero board by waveshare -a few jumper wires, hotswap sockets -hotswap pcbs -3 hall effect sensors -3d printed case and design (although can condensed to only the rp2040-zero and hall effect sensors, hotswap sockets when the pcb is designed) If you have any suggestions or questions feel free to type it in the comments. Keep in mind that this is just a prototype, and a lot of changes will be made in the future."}]...
|
Title: H3M3 - THE multi purpose 6 key macro pad by Title: H3M3 - THE multi purpose 6 key macro pad by @hien | Stardance
Devlogs:
First devlog Ok I admit this project was started about a week ago, I managed to make a prototype of it purely out of soldering and 3d printing, since I lacked the fund and skills to create pcbs. Although it worked fine, it isn’t as great, compact and accurate compared to a pcb. But without further ado, I present to you my 6 button macro pad: -Features 6 programmable keyboard keys: -3 of them being mechanical for casual work -3 special adjustable hall effect keys for gaming(i personally use it to play osu!) -Uses: -rp2040-zero board by waveshare -a few jumper wires, hotswap sockets -hotswap pcbs -3 hall effect sensors -3d printed case and design (although can condensed to only the rp2040-zero and hall effect sensors, hotswap sockets when the pcb is designed) If you have any suggestions or questions feel free to type it in the comments. Keep in mind that this is just a prototype, and a lot of changes will be made in the future.
Code and instructions and more OFFICIALLY posted on github! Hall sensor calibration files, 3d printed case and pcb will be on there soon. Here’s the link: https://github.com/hien-cmd/h3m3-multipurpose-6key-macropad . Feel free to leave suggestions and ask any questions:)
PCB first version done! Writing this after getting plenty of sleep. After six grueling hours yesterday figuring out kicad, fumbling around and going through about six iterations(which hackatime didnt track idk why), I present to you the first version of the PCB for the project. This takes out ALL the wiring and reduces the case height/thickness by 4x. If you have any questions or see any errors that my 1am self made yesterday, please feel free to drop it down in the comments section.
3D printable case UPLOADED and README file modified to fit PCB and 3d printed case
Made it so that all keybinds and settings can be modified through a config.json file, new code posted on github
The great rework Reworked code.py for a more user friendly config.json and much more snappier magnetic switches, as well as more adjustable settings, guide in README will be updated soon!
README fully updated with the reworked code and config.json and added calibration guide, 3d printable case uploaded and new macro-pad look updated, as well as an embedded youtube demonstration video!!!!!
CAD Update Made the base of the 3d printed case angled for a better experience and also made some 3d printable keycaps with a parametric keycaps model maker. Here’s what it should look like all together, printed in beige!...
|
1792806862.1409636
|
1793411662.1409636
|
|
41750
|
D E S C E N T by @subzeroditto | Stardance
|
subzeroditto
|
2
|
49.59
|
667
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-30T11:58:09Z", "hours": 6.0, "multiplier": 19.45, "payout": 110, "blessing": "neutral", "text": "hello D E S C E N D A N T S (for anyone new that’s what i call ppl who play D E S C E N T), this was quite a small set of updates i put out to improve the datapack i added : an improved guidebook with back buttons balancing changes a new magic system 3 unique magic weapons i would highly recommend checking out the Magician’s Deck, it took the longest by far", "repo": "https://github.com/banana-piecake/DESCENT/tree/master", "demo": "https://modrinth.com/datapack/d-e-s-c-e-n-t"}, {"ship_num": 2, "ts": "2026-08-25T04:12:01Z", "hours": 28.0, "multiplier": 19.93, "payout": 557, "blessing": "neutral", "text": "D E S C E N T was a datapack I made that originally stemmed from a small idea 9 months ago, and I had no clue when i was developing it that it would grow to be this big. Honestly it’s become a project I dreamed about making when i was young and i’m super proud of where it’s come. Installation : If modrinth has reviewed it, download it from there, otherwise you can download it here : https://github.com/banana-piecake/DESCENT/releases/tag/pre-modrinth Datapack install : install it in your world’s datapack folder, AND also install it in your resource pack folder, enable both Mod install : download the jar, install it as a mod in any of the 4 major modloaders (fabric, forge, quilt or neoforge), it’ll work in any world you create. Only for minecraft java version 26.2", "repo": "https://github.com/banana-piecake/DESCENT/tree/master", "demo": "https://modrinth.com/datapack/d-e-s-c-e-n-t"}]...
|
[{"post_id": 80946, "ts": "202 [{"post_id": 80946, "ts": "2026-10-19T10:24:59Z", "hours": 0.8419, "text": "hello d e s c e n d a n t s, spear go boom yes very creative also the new animations now work with the moves, stagger, proper movement and constellations working with moves will come next"}, {"post_id": 80633, "ts": "2026-10-18T11:02:11Z", "hours": 1.4103, "text": "hello d e s c e n d a n t s, made a new weapon, sunder, which does a teleport slash, as well as made abilities for astronomer (tele slash and laser) it took longer than it shouldve ngl"}, {"post_id": 80298, "ts": "2026-10-17T05:37:49Z", "hours": 2.6522, "text": "yes d e s c e n d a n t s, i spent 2 and a half hours animating, modelling, texturing and creating a basic constellation system this is going to take a while"}, {"post_id": 79478, "ts": "2026-10-14T06:39:48Z", "hours": 0.4067, "text": "hello d e s c e n d a n t s, look at my bunny hat also stargazer got completely rebalanced but that’s not important"}, {"post_id": 79446, "ts": "2026-10-14T00:56:56Z", "hours": 0.7469, "text": "made some new textures, d e s c e n d a n t s code wise i havent really done much, im trying to get most textures etc done so i can get the trailer done btw if you wanna see what im doing more frequently, join #mc-datapacking in slack"}, {"post_id": 78668, "ts": "2026-10-11T07:27:55Z", "hours": 1.2456, "text": "another day, another sprite, D E S C E N D A N T S added some new sprite and a new item that shoots a laser"}, {"post_id": 78065, "ts": "2026-10-09T13:00:52Z", "hours": 1.2967, "text": "hello D E S C E N D A N T S, lets quickly go through everything i’ve added stargazer is mostly done, they can now atomise projectiles the new bottled echo item triggers your parry effects again half a second later, which can lead to some crazy builds frozen blade is now a dagger class weapon and added the pact which gives invincibility on half health to allow escapes and last stands here’s a representation of all the content so far"}, {"post_id": 77274, "ts": "2026-10-06T12:02:38Z", "hours": 0.4847, "text": "hello D E S C E N D A N T S, implemented some textures and added a couple new accessories 4 of these are the new marks, which grant passive stat ups and downs as well a regeneration accessory…"}, {"post_id": 77017, "ts": "2026-10-05T11:45:15Z", "hours": 2.6486, "text": "hello D E S C E N D A N T S, done a lot textures for rapiers are done, added 3 or so new accessories, finished the attack and movement code for stargazer, concepeted more, etc…"}, {"post_id": 76040, "ts": "2026-10-02T04:50:17Z", "hours": 0.395, "text": "hello D E S C E N D A N T S, finally finished some animations for the upcoming miniboss, take a look!"}, {"post_id": 75120, "ts": "2026-09-29T05:41:18Z", "hours": 1.3864, "text": "hello d e s c e n d a n t s, basic systems are difficult i finally got around to implementing parrying and accessories added 6 accessories and one parrying weapon kk going back to work now"}, {"post_id": 74266, "ts": "2026-09-27T03:13:30Z", "hours": 1.6011, "text": "backkkk from hiatus D E S C E N D A N T S done a lot of bugfixing and updating to 26.3"}, {"post_id": 59331, "ts": "2026-09-01T01:54:38Z", "hours": 0.4717, "text": "so someone asked me to make better bossbars, which is of course difficult because i make datapacks, but i found out how because im just like that ig"}, {"post_id": 57928, "ts": "2026-08-30T08:17:13Z", "hours": 0.8656, "text": "helllooooo D E S C E N D A N T S, finished off rituals and items for update, should be released on modrinth now"}, {"post_id": 57815, "ts": "2026-08-30T03:33:04Z", "hours": 2.3647, "text": "hello D E S C E N D A N T S, this weapon took so long but was so worth it First up, all bloom weapons now take durability accordingly second of all, this is the magician’s deck, the most complex weapon i’ve made so far on non flourishing use, it throws out a card that travels, spins for a short period of time, then returns to you, it travels through walls on flourishing use it shoots 4 cards that ignore i-frames but deal less damage it’s super fun and very cool"}, {"post_id": 57006, "ts": "2026-08-29T02:24:06Z", "hours": 0.4542, "text": "heya D E S C E N D A N T S, small stuff tbh magic weapons now take durability as well as bloom and longswords now require full charge to swing"}, {"post_id": 56517, "ts": "2026-08-28T09:55:04Z", "hours": 0.4983, "text": "to magic or to weapon, that is the question D E S C E N D A N T S… this is the kindling, which shoots flames, when flourishing it has a longer range, higher damage, and the flame are blue"}, {"post_id": 55499, "ts": "2026-08-27T12:00:38Z", "hours": 0.6433, "text": "well DESCENDANTS, that didnt take long this is bloom, its the representation of your mana, as you use a weapon, the flower grows, with it lowering when you dont use it, using it too long will wilt the flower, putting you on cooldown for a while when the flower is at it’s peak, you gain a flourishing boon, which changes how the weapon works for example, the wooden wand does 3 magic bursts instead of 1, greatly increasing the range, and has a damage increase bloom is about keeping track of what you’re doing and making sure to maintain a balance"}, {"post_id": 55479, "ts": "2026-08-27T11:00:00Z", "hours": 0.8431, "text": "i am back in action DESCENDANTS! i added some advanced vfx and hugely improved the guidebook so it’s actually usable now this is now out on modrinth! working on bloom right now, my take on mana"}, {"post_id": 52223, "ts": "2026-08-22T10:09:06Z", "hours": 0.3236, "text": "so uh, i lied DESCENDANTS, yeah i added a new ritual to dupe runes it was annoying me"}, {"post_id": 51604, "ts": "2026-08-21T11:35:23Z", "hours": 1.985, "text": "hello DESCENDANTS, this is the last devlog, as D E S C E N T is now ready to ship i finished all the dialogs every last one thank you all, truly, it has been wonderful to work on this, and i hope to release many updates Ship coming soon"}, {"post_id": 50913, "ts": "2026-08-20T11:44:32Z", "hours": 0.8972, "text": "hello DESCENDANTS. this is gonna be one of the last times i do this b4 shipping i finished all the boss drop rituals, they all require knowledge to perform, with that, every single ritual is complete only thing left is to write up the guidebook"}, {"post_id": 50833, "ts": "2026-08-20T08:38:41Z", "hours": 0.9872, "text": "helloooooooo DESCENDANTS, we are really close to done bosses now properly die, summon a rift to the overworld upon death, give music discs with a low chance, and give random knowledge super close to done"}, {"post_id": 50219, "ts": "2026-08-19T11:14:52Z", "hours": 0.6925, "text": "helllloooooo DESCENDANTS so uh another devlog i had a lot of free time okay i added more rituals voidtouched blade voidtouched shovel ice dagger fracture sculk bomb might go make more lowk"}, {"post_id": 50179, "ts": "2026-08-19T09:24:08Z", "hours": 0.6417, "text": "hellooooo DESCENDANTS! finishing off the project now :P: added knowledge, made bosses load chunks, more general improvements very close to finishing, just gotta finish off rituals, boss deaths and guidebook"}, {"post_id": 50026, "ts": "2026-08-19T01:42:29Z", "hours": 2.3022, "text": "hello DESCENDANTS, it’s been a while i have made a LOT of small polish and balance changes, but i’ll just go through the two major changes bloodfell items all have a new passive that buffs you on hit with a small chance, and bloodfell rituals are cheaper and easier rifts are finished, they send you to the void, where you get items to summon the bosses, the void itself is finally finished, meaning most of the content is done"}, {"post_id": 47870, "ts": "2026-08-16T03:52:46Z", "hours": 0.5964, "text": "LET’S GO GAMBLING!!! runes are a new system of item modifiers, separated into several tiers, which are rolled with a ritual, they can be applied to any item, they’re super fun and offer a lot of build variety (there are 30 of them) to obtain them you need 4 copper ingots, and 4 rune stones obtained from killing mobs. might add a way to dupe rune stones later in order to make them less grindy here you can see me rolling an epic rune on a tropical fish"}, {"post_id": 47839, "ts": "2026-08-16T01:51:36Z", "hours": 0.7267, "text": "Hello DESCENDENTS (that’s what you’re called now) Bloodfell weapons have felt disconnected for a while. they haven’t had any shared passive. i considered giving them all bleed, but the double damage is insane. The way to get bloodfell ingots is obtained through sacrifice, so they now have a new passive, Animosity! Animosity is the name of the datapack bloodfell weapons were originally planned for, before that was scrapped and moved to D E S C E N T, when you get hit, you have a chance to buff up."}, {"post_id": 47278, "ts": "2026-08-15T03:26:28Z", "hours": 0.6139, "text": "gun. the starlight is the final weapon of act one, obtained by beating the void guardians, an incredibly difficult duo boss fight, in exchange it’s incredibly powerful, summoning a powerful meteor on hit that explodes on landing."}, {"post_id": 46711, "ts": "2026-08-14T04:52:42Z", "hours": 0.2983, "text": "wow im doing stuff ig. finished rituals for soulbound and voidtouched harvester."}, {"post_id": 46647, "ts": "2026-08-14T01:47:39Z", "hours": 0.9144, "text": "three for one special today! so today i made : ice dagger : shoots a beam that slows enemies hit with an aoe explosion (no damage) voidtouched blade : random tp on rc with a short cooldown voidtouched steel (+the ritual for voidtouched steel) : the material used to create voidtouched weapons (basically enderite)"}, {"post_id": 46242, "ts": "2026-08-13T10:48:41Z", "hours": 0.6719, "text": "recreating old weapons is fun! today i remade the cursed cleaver, from this mod https://modrinth.com/mod/a.b.e.-forgery fun fact! this is the mod where void ripper originated from (or at least the entire concept of the boss, void, movement system, design etc…) anyways its pretty fun to use and i made it a lil stronger (its still kinda meh in terms of power but thats fine)"}, {"post_id": 45687, "ts": "2026-08-12T10:39:28Z", "hours": 0.6825, "text": "Guess it’s a two for one special today! sculk grenades are a new item that spread sculk when they hit blocks"}, {"post_id": 45655, "ts": "2026-08-12T09:10:23Z", "hours": 0.6406, "text": "Sculk is pretty cool was lowkey gonna make a splatoon mechanic but it’s lowkey impossible so i made wall climbing, sticking etc."}, {"post_id": 44549, "ts": "2026-08-10T11:50:47Z", "hours": 0.3733, "text": "finished the fracture lol, didnt expect to get it done"}, {"post_id": 44489, "ts": "2026-08-10T08:58:57Z", "hours": 0.4172, "text": "began working my first crossover! it’s the fracture from terramity 1.0"}, {"post_id": 43771, "ts": "2026-08-09T06:12:01Z", "hours": 0.8342, "text": "Weapon design is so fun :p today i finished the void fracture, a sword that applies 3 hits post attack, creating wild knockback and unpredictable combos"}, {"post_id": 43188, "ts": "2026-08-08T09:52:00Z", "hours": 0.2894, "text": "pretty small day updated void cull to require you to build 5 or more void stacks, which are applied by voidtouched weapons on hit, and get removed after 5 seconds, the timer resets on hit (same image as last time i have no clue how to display this in an image)"}, {"post_id": 42584, "ts": "2026-08-07T12:27:43Z", "hours": 1.0564, "text": "Keep inventory, a problem as old as time many mods and datapacks have tried to fix keep inventory, but none fit my situation so today i fixed that with the new soulbound enchantment, items dropped on death will return to you after 12 seconds, only if they are still on the floor https://youtu.be/zDh4c3vDw1o"}, {"post_id": 41876, "ts": "2026-08-06T11:07:15Z", "hours": 0.7853, "text": "making “enderite” actually cool, pt 2 (it’s called voidtouched steel) first things first, i added a new ritual to turn amethyst shards into echo shards, i want items to be assessable, and echo shards are a necessary crafting ingredient, but ancient cities often get looted early, and i keep multiplayer in mind second i added a new item, the voidtouched shovel, which has a chance to levitate your enemies on hit i then made voidtouched steel’s passive ability, void cull, which deals 999 damage when an enemy is under 25% max hp, (this will be rebalanced soon)"}, {"post_id": 41210, "ts": "2026-08-05T09:08:46Z", "hours": 0.5067, "text": "Enderite always feels like a boring concept to me everyone does the same thing, a straight upgrade, maybe a teleport ability, but i wanted to be different, to make an upgrade to netherite that gives you a reason to go back to the end without being boring introducing voidtouched steel, which will be crafted with shulker shells and purpur, making it accessible to all and renewable starting off we have the Voidtouched Harvester, an upgrade to the Bloodfell Scythe that now has one incredibly powerful dash that removees your gravity for the duration up next i need to work on the void execution mechanic"}, {"post_id": 40494, "ts": "2026-08-04T01:58:08Z", "hours": 0.5733, "text": "this is gonna take a while Patch notes : added 3 new sprites, updated creative menu to match finished D E S C E N T guidebook updated creative menu added one new function for an upcoming weapon updated the dialog menu"}, {"post_id": 39176, "ts": "2026-08-01T23:28:18Z", "hours": 0.2739, "text": "rebalanced the absurdly overpowered bloodfell cleaver it used to do 10 flat damage every 4th hit (magic, so pierces armour) which was busted, now it only does double damage i have no clue how this was logged as 16m i swear it took 3"}, {"post_id": 38640, "ts": "2026-08-01T04:25:23Z", "hours": 1.4375, "text": "Huge day today, lots of content today and yesterday’s progress: added THIRTY new enchantments as part of my custom rune system, you can have one per item, some apply effects such as burn or wither, and others are just stat buffs added the items to the creative menu via a neat trick, however it’s not fully implemented yet and finally, finished the duo void guardians boss fight, which required me to rework the entire system for every other boss good stuff, only took about 2 hours, so pretty solid lock in"}, {"post_id": 37357, "ts": "2026-07-30T00:42:06Z", "hours": 8.4064, "text": "this has been a long time in the works i began working on this during stardance, however i forgot to link hackatime so i have spent around 10-12 hours on it (just on coding, that’s ignoring modelling, animating, texturing, playtesting) if you want to see all the devlogs (to prove my progress ig) see here : https://www.youtube.com/playlist?list=PLPvXzO2e-wn0"}]...
|
Title: D E S C E N T by @subzeroditto | Stardance
Title: D E S C E N T by @subzeroditto | Stardance
Devlogs:
this has been a long time in the works i began working on this during stardance, however i forgot to link hackatime so i have spent around 10-12 hours on it (just on coding, that’s ignoring modelling, animating, texturing, playtesting) if you want to see all the devlogs (to prove my progress ig) see here : https://www.youtube.com/playlist?list=PLPvXzO2e-wn0
Huge day today, lots of content today and yesterday’s progress: added THIRTY new enchantments as part of my custom rune system, you can have one per item, some apply effects such as burn or wither, and others are just stat buffs added the items to the creative menu via a neat trick, however it’s not fully implemented yet and finally, finished the duo void guardians boss fight, which required me to rework the entire system for every other boss good stuff, only took about 2 hours, so pretty solid lock in
rebalanced the absurdly overpowered bloodfell cleaver it used to do 10 flat damage every 4th hit (magic, so pierces armour) which was busted, now it only does double damage i have no clue how this was logged as 16m i swear it took 3
this is gonna take a while Patch notes : added 3 new sprites, updated creative menu to match finished D E S C E N T guidebook updated creative menu added one new function for an upcoming weapon updated the dialog menu
Enderite always feels like a boring concept to me everyone does the same thing, a straight upgrade, maybe a teleport ability, but i wanted to be different, to make an upgrade to netherite that gives you a reason to go back to the end without being boring introducing voidtouched steel, which will be crafted with shulker shells and purpur, making it accessible to all and renewable starting off we have the Voidtouched Harvester, an upgrade to the Bloodfell Scythe that now has one incredibly powerful dash that removees your gravity for the duration up next i need to work on the void execution mechanic
making “enderite” actually cool, pt 2 (it’s called voidtouched steel) first things first, i added a new ritual to turn amethyst shards into echo shards, i want items to be assessable, and echo shards are a necessary crafting ingredient, but ancient cities often get looted early, and i keep multiplayer in mind second i added a new item, the voidtouched shovel, which has a chance to levitate your enemies on hit i then made voidtouched steel’s passive ability, void cull, which deals 999 damage when an enemy is under 25% max hp, (this will be rebalanced soon)
Keep inventory, a problem as old as time many mods and datapacks have tried to fix keep inventory, but none fit my situation so today i fixed that with the new soulbound enchantment, items dropped on death will return to you after 12 seconds, only if they are still on the floor https://youtu.be/zDh4c3vDw1o
pretty small day updated void cull to require you to build 5 or more void stacks, which are applied by voidtouched weapons on hit, and get removed after 5 seconds, the timer resets on hit (same image as last time i have no clue how to display this in an image)
Weapon design is so fun :p today i finished the void fracture, a sword that applies 3 hits post attack, creating wild knockback and unpredictable combos
began working my first crossover! it’s the fracture from terramity 1.0
finished the fracture lol, didnt expect to get it done
Sculk is pretty cool was lowkey gonna make a splatoon mechanic but it’s lowkey impossible so i made wall climbing, sticking etc.
Guess it’s a two for one special today! sculk grenades are a new item that spread sculk when they hit blocks
recreating old weapons is fun! today i remade the cursed cleaver, from this mod https://modrinth.com/mod/a.b.e.-forgery fun fact! this is the mod where void ripper originated from (or at least the entire concept of the boss, void, movement system, design etc…) anyways its pretty fun to use and i made it a lil stronger (its still kinda meh in terms of power but thats fine)
three for one special today! so today i made : ice dagger : shoots a beam that slows enemies hit with an aoe explosion (no damage) voidtouched blade : random tp on rc with a short cooldown voidtouched steel (+the ritual for voidtouched steel) : the material used to create voidtouched weapons (basically enderite)
wow im doing stuff ig. finished rituals for soulbound and voidtouched harvester.
gun. the starlight is the final weapon of act one, obtained by beating the void guardians, an incredibly difficult duo boss fight, in exchange it’s incredibly powerful, summoning a powerful meteor on hit that explodes on landing.
Hello DESCENDENTS (that’s what you’re called now) Bloodfell weapons have felt disconnected for a while. they haven’t had any shared passive. i considered giving them all bleed, but the double damage is insane. The way to get bloodfell ingots is obtained through sacrifice, so they now have a new passive, Animosity! Animosity is the name of the datapack bloodfell weapons were originally planned for, before that was scrapped and moved to D E S C E N T, when you get hit, you have a chance to buff up.
LET’S GO GAMBLING!!! runes are a new system of item modifiers, separated into several tiers, which are rolled with a ritual, they can be applied to any item, they’re super fun and offer a lot of build variety (there are 30 of them) to obtain them you need 4 copper ingots, and 4 rune stones obtained from killing mobs. might add a way to dupe rune stones later in order to make them less grindy here you can see me rolling an epic rune on a tropical fish
hello DESCENDANTS, it’s been a while i have made a LOT of small polish and balance changes, but i’ll just go through the two major changes bloodfell items all have a new passive that buffs you on hit with a small chance, and bloodfell rituals are cheaper and easier rifts are finished, they send you to the void, where you get items to summon the bosses, the void itself is finally finished, meaning most of the content is done
hellooooo DESCENDANTS! finishing off the project now :P: added knowledge, made bosses load chunks, more general improvements very close to finishing, just gotta finish off rituals, boss deaths and guidebook
helllloooooo DESCENDANTS so uh another devlog i had a lot of free time okay i added more rituals voidtouched blade voidtouched shovel ice dagger fracture sculk bomb might go make more lowk
helloooooooo DESCENDANTS, we are really close to done bosses now properly die, summon a rift to the overworld upon death, give music discs with a low chance, and give random knowledge super close to done
hello DESCENDANTS. this is gonna be one of the last times i do this b4 shipping i finished all the boss drop rituals, they all require knowledge to perform, with that, every single ritual is complete only thing left is to write up the guidebook
hello DESCENDANTS, this is the last devlog, as D E S C E N T is now ready to ship i finished all the dialogs every last one thank you all, truly, it has been wonderful to work on this, and i hope to release many updates Ship coming soon
so uh, i lied DESCENDANTS, yeah i added a new ritual to dupe runes it was annoying me
i am back in action DESCENDANTS! i added some advanced vfx and hugely improved the guidebook so it’s actually usable now this is now out on modrinth! working on bloom right now, my take on mana
well DESCENDANTS, that didnt take long this is bloom, its the representation of your mana, as you use a weapon, the flower grows, with it lowering when you dont use it, using it too long will wilt the flower, putting you on cooldown for a while when the flower is at it’s peak, you gain a flourishing boon, which changes how the weapon works for example, the wooden wand does 3 magic bursts instead of 1, greatly increasing the range, and has a damage increase bloom is about keeping track of what you’re doing and making sure to maintain a balance
to magic or to weapon, that is the question D E S C E N D A N T S… this is the kindling, which shoots flames, when flourishing it has a longer range, higher damage, and the flame are blue
heya D E S C E N D A N T S, small stuff tbh magic weapons now take durability as well as bloom and longswords now require full charge to swing
hello D E S C E N D A N T S, this weapon took so long but was so worth it First up, all bloom weapons now take durability accordingly second of all, this is the magician’s deck, the most complex weapon i’ve made so far on non flourishing use, it throws out a card that travels, spins for a short period of time, then returns to you, it travels through walls on flourishing use it shoots 4 cards that ignore i-frames but deal less damage it’s super fun and very cool
helllooooo D E S C E N D A N T S, finished off rituals and items for update, should be released on modrinth now
so someone asked me to make better bossbars, which is of course difficult because i make datapacks, but i found out how because im just like that ig
backkkk from hiatus D E S C E N D A N T S done a lot of bugfixing and updating to 26.3
hello d e s c e n d a n t s, basic systems are difficult i finally got around to implementing parrying and accessories added 6 accessories and one parrying weapon kk going back to work now
hello D E S C E N D A N T S, finally finished some animations for the upcoming miniboss, take a look!
hello D E S C E N D A N T S, done a lot textures for rapiers are done, added 3 or so new accessories, finished the attack and movement code for stargazer, concepeted more, etc…
hello D E S C E N D A N T S, implemented some textures and added a couple new accessories 4 of these are the new marks, which grant passive stat ups and downs as well a regeneration accessory…
hello D E S C E N D A N T S, lets quickly go through everything i’ve added stargazer is mostly done, they can now atomise projectiles the new bottled echo item triggers your parry effects again half a second later, which can lead to some crazy builds frozen blade is now a dagger class weapon and added the pact which gives invincibility on half health to allow escapes and last stands here’s a representation of all the content so far
another day, another sprite, D E S C E N D A N T S added some new sprite and a new item that shoots a laser
made some new textures, d e s c e n d a n t s code wise i havent really done much, im trying to get most textures etc done so i can get the trailer done btw if you wanna see what im doing more frequently, join #mc-datapacking in slack
hello d e s c e n d a n t s, look at my bunny hat also stargazer got completely rebalanced but that’s not important
yes d e s c e n d a n t s, i spent 2 and a half hours animating, modelling, texturing and creating a basic constellation system this is going to take a while
hello d e s c e n d a n t s, made a new weapon, sunder, which does a teleport slash, as well as made abilities for astronomer (tele slash and laser) it took longer than it shouldve ngl
hello d e s c e n d a n t s, spear go boom yes very creative also the new animations now work with the moves, stagger, proper movement and constellations working with moves will come next
Ships:
D E S C E N T was a datapack I made that originally stemmed from a small idea 9 months ago, and I had no clue when i was developing it that it would grow to be this big. Honestly it’s become a project I dreamed about making when i was young and i’m super proud of where it’s come. Installation : If modrinth has reviewed it, download it from there, otherwise you can download it here : https://github.com/banana-piecake/DESCENT/releases/tag/pre-modrinth Datapack install : install it in your world’s datapack folder, AND also install it in your resource pack folder, enable both Mod install : download the jar, install it as a mod in any of the 4 major modloaders (fabric, forge, quilt or neoforge), it’ll work in any world you create. Only for minecraft java version 26.2
hello D E S C E N D A N T S (for anyone new that’s what i call ppl who play D E S C E N T), this was quite a small set of updates i put out to improve the datapack i added : an improved guidebook with back buttons balancing changes a new magic system 3 unique magic weapons i would highly recommend checking out the Magician’s Deck, it took the longest by far...
|
1792828478.8098948
|
1792914878.8098948
|
|
68827
|
FortWare Game by @tanay_savarna | Stardance
|
tanay_savarna
|
0
|
1.03
|
0
|
[]
|
[{"post_id": 80948, "ts": "202 [{"post_id": 80948, "ts": "2026-10-19T10:43:59Z", "hours": 1.0325, "text": "Devlog 1: Title-screen for the game. I started by doing what the guide actually told me to but I soon realised it looked kinda boring and I needed to add a cool video-game aspect that made it unique like the other cool ones i checked for inspiration. So then I landed on the idea of Fortnite and this is the first draft of the title screen, hope you guys like it!"}]...
|
Title: FortWare Game by @tanay_savarna | Stardance Title: FortWare Game by @tanay_savarna | Stardance
Devlogs:
Devlog 1: Title-screen for the game. I started by doing what the guide actually told me to but I soon realised it looked kinda boring and I needed to add a cool video-game aspect that made it unique like the other cool ones i checked for inspiration. So then I landed on the idea of Fortnite and this is the first draft of the title screen, hope you guys like it!...
|
1792475326.1011393
|
1793080126.1011393
|
|
68293
|
Casadastraphobia by @QKing | Stardance
|
QKing
|
0
|
14.81
|
0
|
[]
|
[{"post_id": 80949, "ts": "202 [{"post_id": 80949, "ts": "2026-10-19T11:01:53Z", "hours": 2.8344, "text": "Finally started working on the main levels! I have added a ladder since the story starts in a bunker and you were just stuck there previously. The bunker tiles are freshly made by me. I polished some mechanics and components that had bugs, that’s basically it. I had many exams so couldnt do much sadly."}, {"post_id": 79376, "ts": "2026-10-13T18:32:20Z", "hours": 8.6008, "text": "Hi, I know it’s been a while ago since my last devlog. This week I’ve worked on getting all of the core mechanics done. I’ve coded several fun elements like fans, conveyors and lasers. Before that I will confess something. Last devlog I reported that due an issue on my windows system most of my my progress on the game was wiped. I have used AI to restore most from cache and regenerate the rest based on old artifacts. I am ashamed that I had to use it, but I will honestly confess it. Now I have properly initialized git, so I hope this does not happen again anymore, since I hate using AI for this and I dont want to lose my progress again. More about the game. I have developed some lore. Okay, so according to the mechanics and the fear casadastraphobia (the fear of falling up), you will fall up when exposed to the sky. Scientist from STILLNEEDANAME (not the real name :) ) have attemped to create clean energy from gravity under the lead of Dr. Singularity. During that process gravitrons escaped, exploded the facility partially and mutated a bit, flipping the gravity when exposed to the sky. Most people died sadly, some people moved into a bunker, adapted their lifestyle in the cities that still stand and on floating masses in the sky. You wake up, no memories, you were dragged into a bunker by Dr. Ballast. He saw you on the land floating up and dragged you inside his bunker. Dr. Ballast was a scientist of the energy project. He somehow survived the incident. More lore coming soon! Okay, also the mechanics that are in place (full list) Gravity zone (inverts gravity) Lasers (kills you, duh) Bubblecannon (shoots bubble to prevent you from flying upwards) Boostzone (Fasttttttt) Conveyor (moves you) Fan (pulls or sucks, also against other forces) Gel (slows you down) Blocks from celeste that turn on or off (explains itself) One way wall (same thing) Spike (pointy!) Switch, turns things on and off, duh. In the screenshots: Screenshot one is my test layout, where I test all mechanics Screenshot two is the bubble cannon In screenshot three I’m supposed to fall up, but due the fan I don’t In screenhosts four you see me on a conveyor, a laser just shot me and is warning me for another shot, you see a switch that turns on the gravity zone so I can progress. The big blue thing is the gel, it reduces velocity. Yeah its a lot! If you are here! You deserve a fun fact 🎉 The character is based on how I look in real life! (I’m not 16-bit though 😂. For now! Im out! I will continue this game and hopefully ship it!"}, {"post_id": 77625, "ts": "2026-10-07T17:53:44Z", "hours": 3.3717, "text": "I made assets for the game! I also coded the mechanic of floating up if nothing is above you! Due a saving error I lost the menu I’ve made and the demo level. Should have commited to a repo…. I know….. Sadly this it is for now. I think I have it remade next devlog"}]...
|
Title: Casadastraphobia by @QKing | Stardance
Dev Title: Casadastraphobia by @QKing | Stardance
Devlogs:
I made assets for the game! I also coded the mechanic of floating up if nothing is above you! Due a saving error I lost the menu I’ve made and the demo level. Should have commited to a repo…. I know….. Sadly this it is for now. I think I have it remade next devlog
Hi, I know it’s been a while ago since my last devlog. This week I’ve worked on getting all of the core mechanics done. I’ve coded several fun elements like fans, conveyors and lasers. Before that I will confess something. Last devlog I reported that due an issue on my windows system most of my my progress on the game was wiped. I have used AI to restore most from cache and regenerate the rest based on old artifacts. I am ashamed that I had to use it, but I will honestly confess it. Now I have properly initialized git, so I hope this does not happen again anymore, since I hate using AI for this and I dont want to lose my progress again. More about the game. I have developed some lore. Okay, so according to the mechanics and the fear casadastraphobia (the fear of falling up), you will fall up when exposed to the sky. Scientist from STILLNEEDANAME (not the real name :) ) have attemped to create clean energy from gravity under the lead of Dr. Singularity. During that process gravitrons escaped, exploded the facility partially and mutated a bit, flipping the gravity when exposed to the sky. Most people died sadly, some people moved into a bunker, adapted their lifestyle in the cities that still stand and on floating masses in the sky. You wake up, no memories, you were dragged into a bunker by Dr. Ballast. He saw you on the land floating up and dragged you inside his bunker. Dr. Ballast was a scientist of the energy project. He somehow survived the incident. More lore coming soon! Okay, also the mechanics that are in place (full list) Gravity zone (inverts gravity) Lasers (kills you, duh) Bubblecannon (shoots bubble to prevent you from flying upwards) Boostzone (Fasttttttt) Conveyor (moves you) Fan (pulls or sucks, also against other forces) Gel (slows you down) Blocks from celeste that turn on or off (explains itself) One way wall (same thing) Spike (pointy!) Switch, turns things on and off, duh. In the screenshots: Screenshot one is my test layout, where I test all mechanics Screenshot two is the bubble cannon In screenshot three I’m supposed to fall up, but due the fan I don’t In screenhosts four you see me on a conveyor, a laser just shot me and is warning me for another shot, you see a switch that turns on the gravity zone so I can progress. The big blue thing is the gel, it reduces velocity. Yeah its a lot! If you are here! You deserve a fun fact 🎉 The character is based on how I look in real life! (I’m not 16-bit though 😂. For now! Im out! I will continue this game and hopefully ship it!
Finally started working on the main levels! I have added a ladder since the story starts in a bunker and you were just stuck there previously. The bunker tiles are freshly made by me. I polished some mechanics and components that had bugs, that’s basically it. I had many exams so couldnt do much sadly....
|
1792471776.1997504
|
1793076576.1997504
|
|
63447
|
hek-pad by @krisander | Stardance
|
krisander
|
0
|
19.19
|
0
|
[]
|
[{"post_id": 80950, "ts": "202 [{"post_id": 80950, "ts": "2026-10-19T11:06:21Z", "hours": 1.6344, "text": "I’m creating the 3d print now. I its sooo hard cos my laptop does not have a gpu. :-("}, {"post_id": 80583, "ts": "2026-10-18T06:30:55Z", "hours": 4.1603, "text": "I think I’m finally done with the PCB, I know I said it before but the board exceeded the max board size. i had to rearrange it and also added some random silkscreen art. I have a few parts that StarDance does not provide. :-)"}, {"post_id": 80310, "ts": "2026-10-17T07:18:41Z", "hours": 4.1194, "text": "This is the last of the PCB editor. I ran DRC and it came back without errors and warnings."}, {"post_id": 78811, "ts": "2026-10-11T17:50:46Z", "hours": 4.9436, "text": "I did a lot of work, I printed out the schem sheet and matched it with the actual dimensions and all, but the prb is I didn’t realize that the keyboard switches were too far apart… I have to delete all the wiring before shifting the keyboard switches back and then rewiring….. HELP"}, {"post_id": 78362, "ts": "2026-10-10T15:40:47Z", "hours": 0.9336, "text": "i fixed up the neo-pixel problem, i miss took the tiny leds for the ws2812b kind, so i fixed that and the project passed the E.R.C."}, {"post_id": 78274, "ts": "2026-10-10T07:44:33Z", "hours": 2.7681, "text": "i fixed the matrix. im trying to fix the slider pin value problems. i will start the 3d modleing or coding next."}, {"post_id": 73651, "ts": "2026-09-25T16:13:05Z", "hours": 0.6336, "text": "started schematics I’m thinking of adding a diode in the key matrix layout so that there is no ghosting in the hek-pad. I wont be able to do much because of my exams. I will get back on as soon as the exams are over."}]...
|
Title: hek-pad by @krisander | Stardance
Devlogs: Title: hek-pad by @krisander | Stardance
Devlogs:
started schematics I’m thinking of adding a diode in the key matrix layout so that there is no ghosting in the hek-pad. I wont be able to do much because of my exams. I will get back on as soon as the exams are over.
i fixed the matrix. im trying to fix the slider pin value problems. i will start the 3d modleing or coding next.
i fixed up the neo-pixel problem, i miss took the tiny leds for the ws2812b kind, so i fixed that and the project passed the E.R.C.
I did a lot of work, I printed out the schem sheet and matched it with the actual dimensions and all, but the prb is I didn’t realize that the keyboard switches were too far apart… I have to delete all the wiring before shifting the keyboard switches back and then rewiring….. HELP
This is the last of the PCB editor. I ran DRC and it came back without errors and warnings.
I think I’m finally done with the PCB, I know I said it before but the board exceeded the max board size. i had to rearrange it and also added some random silkscreen art. I have a few parts that StarDance does not provide. :-)
I’m creating the 3d print now. I its sooo hard cos my laptop does not have a gpu. :-(...
|
1792442917.7435734
|
1793047717.7435734
|
|
69138
|
Doodle ! by @Yousuff | Stardance
|
Yousuff
|
1
|
8.36
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-12T19:02:28Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Doodle! Doodle(doodle.) is a lightweight drawing website built with HTML, CSS, vanilla JavaScript, and the Canvas API. It provides a browser-based drawing experience, extended with a dedicated Pixel Art editor that preserves the original drawing experience while introducing specialized pixel-art tools. Features Drawing Editor: Create drawings directly in the browser. Pixel Art Editor: Dedicated pixel canvas with adjustable resolutions. Drawing Tools: Pencil, eraser, fill, and eyedropper. Color Palette: Choose and apply colors while creating artwork. Grid Controls: Toggle the pixel grid for precise editing. Transparency: Create artwork with transparent backgrounds. PNG Export:*Export pixel art as an image. Undo/Redo: Reverse and restore editing actions. Continuous Drawing: Interpolate strokes to prevent skipped pixels during fast movements. Development Process Doodle started as a lightweight browser-based drawing project. I expanded it with Pixel Art as a separate feature, then tested and refined its drawing behavior, fill rendering, transparent-pixel handling, and editing history. The latest improvements include smoother strokes and Undo/Redo support.", "repo": "https://github.com/YousufProjs-exe/Doodle", "demo": "https://yousufprojs-exe.github.io/Doodle/"}]...
|
[{"post_id": 80955, "ts": "202 [{"post_id": 80955, "ts": "2026-10-19T11:31:42Z", "hours": 2.5967, "text": "Pixel canvas dimensions bug fixed, and rewrote whole js as suggested by the shipwright."}, {"post_id": 79149, "ts": "2026-10-12T20:25:30Z", "hours": 0.7628, "text": "Rebuilt Pixel Art as it was built using alot AI because it was hard to implement, but still I now rebuilt it."}, {"post_id": 79117, "ts": "2026-10-12T18:49:12Z", "hours": 1.0211, "text": "Started Pixel Art as a new feature for Doodle, built with HTML, CSS, and vanilla JavaScript. Added a pixel canvas, adjustable resolutions, color palette, pencil, eraser, fill, and eyedropper tools, grid toggle, transparent backgrounds, and PNG export. Improved fast-stroke drawing with pixel interpolation, fixed immediate Fill rendering, handled transparent pixels in the eyedropper, prevented unnecessary undo history entries, and added Redo alongside Undo."}, {"post_id": 78874, "ts": "2026-10-11T20:47:36Z", "hours": 1.0533, "text": "Spent alot of time fixing the Text button in Doodle. Turns out, it was just a small CSS selector mistake — text instead of #text 😭Everything else was already working, so I kept the fix simple instead of messing with code that didn’t need changing. One tiny bug out of the way. Back to building! - Next is You can rotate !"}, {"post_id": 78817, "ts": "2026-10-11T17:57:41Z", "hours": 1.0339, "text": "Doodle !! - Text Box the color you wan t the size you want it to be ! - TEXT in Doodel!!"}, {"post_id": 78733, "ts": "2026-10-11T12:55:54Z", "hours": 1.0128, "text": "Doodle — ShortcutsExpanded Doodle with six drawing tools: Brush, Eraser, Line, Rectangle, Circle, and Arrow. Implemented Undo and Redo with drawing history, Clear Canvas, and Export PNG functionality. Added customizable drawing colors and brush sizes, along with keyboard shortcuts for faster workflow: Ctrl + Z to undo, Ctrl + Y to redo, Ctrl + Shift + Z to redo, Ctrl + L to clear the canvas, and Ctrl + P to export artwork as a PNG. The interface features a clean, minimal design inspired by the original reference, with responsive canvas resizing. All implemented features have been tested and are working."}, {"post_id": 78710, "ts": "2026-10-11T11:45:29Z", "hours": 0.9756, "text": "doodle. - till now only free hand canvas with adjustable brush size, selectable Colors , Undo and Clear buttons."}]...
|
Title: Doodle ! by @Yousuff | Stardance
Devlogs:
Title: Doodle ! by @Yousuff | Stardance
Devlogs:
doodle. - till now only free hand canvas with adjustable brush size, selectable Colors , Undo and Clear buttons.
Doodle — ShortcutsExpanded Doodle with six drawing tools: Brush, Eraser, Line, Rectangle, Circle, and Arrow. Implemented Undo and Redo with drawing history, Clear Canvas, and Export PNG functionality. Added customizable drawing colors and brush sizes, along with keyboard shortcuts for faster workflow: Ctrl + Z to undo, Ctrl + Y to redo, Ctrl + Shift + Z to redo, Ctrl + L to clear the canvas, and Ctrl + P to export artwork as a PNG. The interface features a clean, minimal design inspired by the original reference, with responsive canvas resizing. All implemented features have been tested and are working.
Doodle !! - Text Box the color you wan t the size you want it to be ! - TEXT in Doodel!!
Spent alot of time fixing the Text button in Doodle. Turns out, it was just a small CSS selector mistake — text instead of #text 😭Everything else was already working, so I kept the fix simple instead of messing with code that didn’t need changing. One tiny bug out of the way. Back to building! - Next is You can rotate !
Started Pixel Art as a new feature for Doodle, built with HTML, CSS, and vanilla JavaScript. Added a pixel canvas, adjustable resolutions, color palette, pencil, eraser, fill, and eyedropper tools, grid toggle, transparent backgrounds, and PNG export. Improved fast-stroke drawing with pixel interpolation, fixed immediate Fill rendering, handled transparent pixels in the eyedropper, prevented unnecessary undo history entries, and added Redo alongside Undo.
Rebuilt Pixel Art as it was built using alot AI because it was hard to implement, but still I now rebuilt it.
Pixel canvas dimensions bug fixed, and rewrote whole js as suggested by the shipwright.
Ships:
Doodle! Doodle(doodle.) is a lightweight drawing website built with HTML, CSS, vanilla JavaScript, and the Canvas API. It provides a browser-based drawing experience, extended with a dedicated Pixel Art editor that preserves the original drawing experience while introducing specialized pixel-art tools. Features Drawing Editor: Create drawings directly in the browser. Pixel Art Editor: Dedicated pixel canvas with adjustable resolutions. Drawing Tools: Pencil, eraser, fill, and eyedropper. Color Palette: Choose and apply colors while creating artwork. Grid Controls: Toggle the pixel grid for precise editing. Transparency: Create artwork with transparent backgrounds. PNG Export:*Export pixel art as an image. Undo/Redo: Reverse and restore editing actions. Continuous Drawing: Interpolate strokes to prevent skipped pixels during fast movements. Development Process Doodle started as a lightweight browser-based drawing project. I expanded it with Pixel Art as a separate feature, then tested and refined its drawing behavior, fill rendering, transparent-pixel handling, and editing history. The latest improvements include smoother strokes and Undo/Redo support....
|
1792857220.9989977
|
1792943620.9989977
|
|
63764
|
Vacuum cleaning roblox simulator game by @Unholy | Vacuum cleaning roblox simulator game by @Unholy | Stardance...
|
Unholy
|
0
|
9.4
|
0
|
[]
|
[{"post_id": 80956, "ts": "202 [{"post_id": 80956, "ts": "2026-10-19T11:39:08Z", "hours": 2.5697, "text": "Devlog #idk Balanced the full vacuum and backpack economy Built out cost, CoinsMultiplier, TrashMultiplier, WalkSpeedMultiplier, and Storage values for all 15 vacuums and 15 backpacks, scaling up to a 50,000,000 coin top vacuum and 500,000 trash capacity on the max backpack — designed for a long-term progression curve. Finalized vacuum CleaningSize values Locked in whole-number cleaning sizes for all 15 vacuums, starting at 6, 2, 3 on the first vacuum and scaling up to 55, 2, 55 on the last, with Y (height) kept flat. Reworked how the cleaning hitbox is positioned The hitbox used to be placed relative to each vacuum model’s own PrimaryPart, which caused inconsistent rotation and placement across different vacuum models (notably the 15th vacuum’s hitbox was flipped vertically). Switched it to be positioned relative to the player’s HumanoidRootPart instead, using one simple offset (left/right, up/down, forward/back) with no rotation math needed. Fixed the old hitbox not clearing on vacuum switch After the rework, switching vacuums left the previous hitbox behind since it was no longer a child of the vacuum model being destroyed. Added explicit cleanup to destroy the old hitbox by name whenever a new vacuum is equipped. Fixed the hitbox falsely triggering Shop/Sell zones Parenting the hitbox directly to the character (from step 3’s rework) caused Shop and Sell triggers to treat hitbox collisions as the player themselves touching them. Fixed by parenting the hitbox back inside the vacuum clone while keeping it welded to the player for positioning, so it no longer gets mistaken for the player’s body."}, {"post_id": 75371, "ts": "2026-09-29T21:29:25Z", "hours": 1.7794, "text": "Trash spawning system for the new areas - Done"}, {"post_id": 75007, "ts": "2026-09-28T20:47:34Z", "hours": 1.6456, "text": "Made Egypt themed area"}, {"post_id": 74587, "ts": "2026-09-27T18:04:43Z", "hours": 1.2142, "text": "Made bathroom styled area for my game"}, {"post_id": 74171, "ts": "2026-09-26T20:34:15Z", "hours": 1.7094, "text": "Made 15 backpacks and made the entire backpack shop menu"}, {"post_id": 71361, "ts": "2026-09-20T18:05:53Z", "hours": 0.4833, "text": "Made some ui for my game"}]...
|
Title: Vacuum cleaning roblox simulator game by @U Title: Vacuum cleaning roblox simulator game by @Unholy | Stardance
Devlogs:
Made some ui for my game
Made 15 backpacks and made the entire backpack shop menu
Made bathroom styled area for my game
Made Egypt themed area
Trash spawning system for the new areas - Done
Devlog #idk Balanced the full vacuum and backpack economy Built out cost, CoinsMultiplier, TrashMultiplier, WalkSpeedMultiplier, and Storage values for all 15 vacuums and 15 backpacks, scaling up to a 50,000,000 coin top vacuum and 500,000 trash capacity on the max backpack — designed for a long-term progression curve. Finalized vacuum CleaningSize values Locked in whole-number cleaning sizes for all 15 vacuums, starting at 6, 2, 3 on the first vacuum and scaling up to 55, 2, 55 on the last, with Y (height) kept flat. Reworked how the cleaning hitbox is positioned The hitbox used to be placed relative to each vacuum model’s own PrimaryPart, which caused inconsistent rotation and placement across different vacuum models (notably the 15th vacuum’s hitbox was flipped vertically). Switched it to be positioned relative to the player’s HumanoidRootPart instead, using one simple offset (left/right, up/down, forward/back) with no rotation math needed. Fixed the old hitbox not clearing on vacuum switch After the rework, switching vacuums left the previous hitbox behind since it was no longer a child of the vacuum model being destroyed. Added explicit cleanup to destroy the old hitbox by name whenever a new vacuum is equipped. Fixed the hitbox falsely triggering Shop/Sell zones Parenting the hitbox directly to the character (from step 3’s rework) caused Shop and Sell triggers to treat hitbox collisions as the player themselves touching them. Fixed by parenting the hitbox back inside the vacuum clone while keeping it welded to the player for positioning, so it no longer gets mistaken for the player’s body....
|
1792443146.0004745
|
1793047946.0004745
|
|
69631
|
Apple site replica by @ejr | Stardance
|
ejr
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-19T12:20:43Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "-I made an apple website replica. It started as a troll site but then I saw this as a potential project during my midterm break so I took it up. -I definitely had a challenge with CSS (I knew close to nothing) But with help from our favourite AI (Claude) I was able to start figuring out what I could do to make it look as close to the real deal as I could. -I’m overall really happy with the outcome. -I would definitely do this again.", "repo": "https://github.com/realejr/applesite", "demo": "https://realejr.github.io/applesite/"}]...
|
[{"post_id": 80961, "ts": "202 [{"post_id": 80961, "ts": "2026-10-19T12:17:23Z", "hours": 1.75, "text": "Did a massive revamp.😱It looks so different from what it used to look like, but I’m very happy with how it turned out. It took me a little over 4 days to get it to what it looks like right now. I think I should have dev logged a bit more."}, {"post_id": 80216, "ts": "2026-10-16T19:29:19Z", "hours": 0.2781, "text": "Sticky streak site!!"}, {"post_id": 79797, "ts": "2026-10-15T13:49:51Z", "hours": 0.8022, "text": "Just a troll site for the sticky streak"}]...
|
Title: Apple site replica by @ejr | Stardance
Dev Title: Apple site replica by @ejr | Stardance
Devlogs:
Just a troll site for the sticky streak
Sticky streak site!!
Did a massive revamp.😱It looks so different from what it used to look like, but I’m very happy with how it turned out. It took me a little over 4 days to get it to what it looks like right now. I think I should have dev logged a bit more.
Ships:
-I made an apple website replica. It started as a troll site but then I saw this as a potential project during my midterm break so I took it up. -I definitely had a challenge with CSS (I knew close to nothing) But with help from our favourite AI (Claude) I was able to start figuring out what I could do to make it look as close to the real deal as I could. -I’m overall really happy with the outcome. -I would definitely do this again....
|
1792857263.9296563
|
1792943663.9296563
|
|
28952
|
TRI-DevLab's Portfolio Website by @Tri | Stard TRI-DevLab's Portfolio Website by @Tri | Stardance...
|
Tri
|
1
|
35.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-19T12:55:50Z", "hours": 35.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What I built & key features Custom Styling & Layout: Implemented custom CSS grid/flexbox layouts, smooth section transitions, and responsive typography without relying on UI component libraries. Interactive Elements: Added dynamic theme toggling (dark/light mode), functional mobile navigation, and client-side contact form validation. Project Showcase: Integrated dedicated project cards and direct links to live demos and repositories", "repo": "https://github.com/TRI-DevLab/personal-portfolio", "demo": "https://tri-devlab.github.io/personal-portfolio/"}]...
|
[{"post_id": 80966, "ts": "202 [{"post_id": 80966, "ts": "2026-10-19T12:32:15Z", "hours": 10.4131, "text": "Last log with opening page and plenty of functionality added, like toggle navgaition position and even theme colour"}, {"post_id": 78354, "ts": "2026-10-10T15:21:24Z", "hours": 11.2778, "text": "It’s been a while, but I have finally completed the portfolio and the blog sections, moving on to do the contact and the footer next and probably some other features to finish it up"}, {"post_id": 41570, "ts": "2026-08-05T21:13:03Z", "hours": 3.69, "text": "This section was quite the journey, though I did learn a lot. Looking forward to finishing the next section."}, {"post_id": 40557, "ts": "2026-08-04T06:00:57Z", "hours": 3.2228, "text": "Just worked on the About Page; it was quite troublesome trying to get the layout of this just right, but it doesn’t look too bad. I’ll be focusing on the education section and hope to post the log pretty soon. Oh and I did edit the Home page a little bit"}, {"post_id": 40450, "ts": "2026-08-03T23:35:19Z", "hours": 5.9464, "text": "Just Started - the Home page is mostly done; more on the planning & the actual site will be coming soon"}]...
|
Title: TRI-DevLab's Portfolio Website by @Tri Title: TRI-DevLab's Portfolio Website by @Tri | Stardance
Devlogs:
Just Started - the Home page is mostly done; more on the planning & the actual site will be coming soon
Just worked on the About Page; it was quite troublesome trying to get the layout of this just right, but it doesn’t look too bad. I’ll be focusing on the education section and hope to post the log pretty soon. Oh and I did edit the Home page a little bit
This section was quite the journey, though I did learn a lot. Looking forward to finishing the next section.
It’s been a while, but I have finally completed the portfolio and the blog sections, moving on to do the contact and the footer next and probably some other features to finish it up
Last log with opening page and plenty of functionality added, like toggle navgaition position and even theme colour
Ships:
What I built & key features Custom Styling & Layout: Implemented custom CSS grid/flexbox layouts, smooth section transitions, and responsive typography without relying on UI component libraries. Interactive Elements: Added dynamic theme toggling (dark/light mode), functional mobile navigation, and client-side contact form validation. Project Showcase: Integrated dedicated project cards and direct links to live demos and repositories...
|
1792857367.3085766
|
1792943767.3085766
|
|
70485
|
SketchBoard by @jaisondavidm_cs25 | Stardance
|
jaisondavidm_cs25
|
0
|
57.33
|
0
|
[]
|
[{"post_id": 80968, "ts": "202 [{"post_id": 80968, "ts": "2026-10-19T12:44:02Z", "hours": 57.3319, "text": "i do this project for maconda but they now say to move to other events so i shipping here i already posted all develogs and commit the history properly you can refer all my develogs using this link https://macondo.hackclub.com/projects/6319"}]...
|
Title: SketchBoard by @jaisondavidm_cs25 | Stardan Title: SketchBoard by @jaisondavidm_cs25 | Stardance
Devlogs:
i do this project for maconda but they now say to move to other events so i shipping here i already posted all develogs and commit the history properly you can refer all my develogs using this link https://macondo.hackclub.com/projects/6319...
|
1792414031.0223138
|
1793018831.0223138
|
|
67427
|
Coldline-inspired Alarm by @nastavial | Stardance
|
nastavial
|
0
|
55.8
|
0
|
[]
|
[{"post_id": 80971, "ts": "202 [{"post_id": 80971, "ts": "2026-10-19T13:04:42Z", "hours": 2.9981, "text": "Working on the user interface! The first ~20 minutes is me trying to pick between Figma or Photopea (I decided to use Figma), how to import font, and how to get started with Figma. So I did learn some fundamentals of Figma I changed the planned font from FreeMono to TomThumb. It’s simpler, small, scalable, and stylized."}, {"post_id": 80677, "ts": "2026-10-18T13:44:32Z", "hours": 6.2453, "text": "OKAY… That’s a LOT. Okay… First of all, the clock’s system (aside from the visuals) are now be fully operable as the final architectural pieces has been completed. Second, completely eradicated delays in #1 minigame. Third. KILOTONS of bugfixes (mostly the fatal ones) (I’ve just realized I accidentally have two different commits named “FIX #3” lol) Fourth. OHH FINALLY MY BACK CAN REST!"}, {"post_id": 80449, "ts": "2026-10-17T17:25:13Z", "hours": 0.5314, "text": "Found few genuinely dumb issues (mb): FORGOT TO ACTUALLY RANDOMIZE THE TOKEN. This is the most fatal one. Forgot to reset the menu data. So the user’s probably will stuck inside a single minigame Just learned that C++ tends to have weird quirks if you define a variable inside unscoped switch/case statement. Forgot to update set any_sw_clicked nor the rotary encoder button click. I’m so sorry if I can only develop this project for about few minutes tonight because there are a lot of going on today. Sorry :"}, {"post_id": 80167, "ts": "2026-10-16T14:50:16Z", "hours": 2.4, "text": "Ehem… A quick recap. It turns out, inputs handling are not-so-basic after all. At the first glance, everything seems easy. I thought the concept was simple: analogRead -> register into a struct -> return. But it turns out everything is… a bit messier. I ended up learning what are interrupts. Another couple of things that I finished were the lockscreen (aside the UI elements ofc) and the alarm buzzer. The lockscreen are somewhat trivial, meanwhile the buzzer made me relearn about PWM."}, {"post_id": 79825, "ts": "2026-10-15T15:24:20Z", "hours": 3.2628, "text": "Completed two more minigames (#3 and #4). That means every minigames I planned so far are coded, yeay! (more minigames may be added soon) The current available minigames are: Simon Slider match (like Fisch reel mechanism, but three of it all at once) Slider hit (sorta like) Where’s waldo."}, {"post_id": 79547, "ts": "2026-10-14T15:30:23Z", "hours": 2.0958, "text": "Second minigame is completed! (aside the renderer… so yeah, no demo can be showed yet) Aside from the minigame, there’s also a slight rework to ensure ‘consistency’ and ‘developer’s QOL’. Furthermore, the code are now microscopically more optimized!"}, {"post_id": 79315, "ts": "2026-10-13T14:24:57Z", "hours": 4.7808, "text": "The overall loop flow is completed. BUT THE MOST IMPORTANTLY, THE FIRST MINIGAME IS COMPLETED (aside the UI draw aspect) Okay… this thing took longer than I thought… I’m kinda overwhelmed, but overall still fun WAIT, YOU CAN UPLOAD MORE THAN ONE IMAGE ON A SINGLE DEVLOG? I just found out about it…"}, {"post_id": 79061, "ts": "2026-10-12T15:16:28Z", "hours": 3.9986, "text": "Okay… I’ve worked on the basic datastructure of the firmware. Yeay! So the most unique thing about this alarm I made is that you need to complete three minigames to get three ‘verification code’ that you must memorize in order to shut down the alarm. BUT… I want the alarm to be extra pesky, so some of the minigames in a session (1-2 of them) would require ‘unlock key’ from other minigame in the same session."}, {"post_id": 78701, "ts": "2026-10-11T10:59:29Z", "hours": 0.715, "text": "Because I know there will be a lot of trials and errors, I’ve recreate the schematic inside Wokwi and set up Wokwi simulator inside VS Code (I mean it’s free and why not?) I don’t use Wakatime this time because I’m not yet started coding. This is just me or the TFT display pinout is a bit… weird"}, {"post_id": 78687, "ts": "2026-10-11T09:24:49Z", "hours": 2.38, "text": "The last piece (i think) is done! The phone box lid is done, yeay OHH GOSH, I’M SO EXCITED TO DO THE CODING. WooOoOooo"}, {"post_id": 78357, "ts": "2026-10-10T15:29:02Z", "hours": 0.4944, "text": "Today, I finished the all-new phone box body. Yeay! Not exactly “smooth”, and I’m not yet added the handset holder + mold. But hey, at least some progress can be made (I’m to sleepy to continue, sorry!). WOooO, I’m so excited to finish this project."}, {"post_id": 78096, "ts": "2026-10-09T15:35:47Z", "hours": 3.4803, "text": "Ehem… I think I had some… uhm ‘development’. Remember when I first starting the project? That time, I hate CAD SO MUCH. Now…, I’ve found myself enjoying the CAD process. It is fun indeed. Here’s a list for what I’ve done and learned: REVAMPING the OLD UGLY phone box design. (I’m currently working on the internal walls. I learned to trust the process I learned that I can use formulas inside dimension tool. So I did! I learned to apply the Pythagorean theorem to my design! (I know it’s pretty basic, but hey, everyone has to start somewhere)"}, {"post_id": 77851, "ts": "2026-10-08T15:13:20Z", "hours": 5.5969, "text": "What happened today? ALOT. Here’s a summary: Cooked by my arc nemesis: “Rail not smooth error”. Trying to “fix” projection and alignment issues (they’re now worse btw) Banged my head several times. Still stuck fixing the handset bell for 4 and a half hours Lobotomized myself Had a massive thinking moment Decided that “the handset aren’t necessary” Sacrificed the telephone handset to actually make some progress. Moved-on to polish the phone box. “Sometimes, a sacrifice must be made. Especially when you’re stuck for 6 devlogs in a row” - Sun Tzu I’m not lazy, okay? I’m just having a replan for effectivity . Note: Maybe , I will try to complete the handset once everything else finished."}, {"post_id": 77580, "ts": "2026-10-07T15:05:13Z", "hours": 4.0506, "text": "Made the top, side, and a bunch of garbage sketches. This time, I’m exploring surface modeling. Huft… How newbie am I? I don’t even know if I can make it on time. Seems there’s no progress on the CAD phase ;( How can making a telephone handset be this hard?"}, {"post_id": 77318, "ts": "2026-10-06T15:09:51Z", "hours": 0.6919, "text": "Based on some Slack feedbacks, I migrated to Autodesk Fusion. The progress is minimal today. This is due to tomorrow’s science exam. Maybe I’ll start a dead-grind tomorrow to make up for the wasted time. My target is to finish the project’s design by the eight of October. Ohhhhh, time is running out so quickly, isn’t it?"}, {"post_id": 77040, "ts": "2026-10-05T13:41:37Z", "hours": 3.275, "text": "Yo… why is my phone tweaking? DAY 3 STUCK IN CAD PHASE BTW. GRRRRR. Maybe I should migrate to fusion instead? Sure… Lot of the community advice me to do so."}, {"post_id": 76637, "ts": "2026-10-04T07:25:53Z", "hours": 1.5069, "text": "Made the phone box and outline of the… ummm… phone? phone handle? I learned the best way to shape the phone box is to design the lid first, and then the walls. Last time, I did the reverse, so that’s why I’m stuck. The amount of effort required to create a simple shape made me respect hobbyist and engineers more. I literally spent most of the time trying to figure out how to make symmetrical phone, lol. I tried to make the phone 3D, but again… It’s harder than I thought. I ended up to restart the 3D-fication process of the phone."}, {"post_id": 76608, "ts": "2026-10-04T04:54:40Z", "hours": 3.2828, "text": "uhm. long story short, I revamped everything twice. why? it turns out, the display is much longer than I anticipated. so the pcb layout must be tweaked. the cad model is… suboptimal if i say. but i think i’m getting hang of it. now i know how to use sketch, dimension, and extrude properly. still, i have a long way to go."}, {"post_id": 76338, "ts": "2026-10-03T07:45:46Z", "hours": 4.0131, "text": "Coldline-inspired alarm I’m sooooo clueless. This is my first ever attempt to design a schematic, PCB, and CAD (CAD-ing, I guess?). Schematic? All good, a piece of cake. PCB? A lot of retries, but still manageable. CAD? OH NO NO NO. A PHASE OF ABSOLUTE DOOM AND DESPAIR"}]...
|
Title: Coldline-inspired Alarm by @nastavial | Sta Title: Coldline-inspired Alarm by @nastavial | Stardance
Devlogs:
Coldline-inspired alarm I’m sooooo clueless. This is my first ever attempt to design a schematic, PCB, and CAD (CAD-ing, I guess?). Schematic? All good, a piece of cake. PCB? A lot of retries, but still manageable. CAD? OH NO NO NO. A PHASE OF ABSOLUTE DOOM AND DESPAIR
uhm. long story short, I revamped everything twice. why? it turns out, the display is much longer than I anticipated. so the pcb layout must be tweaked. the cad model is… suboptimal if i say. but i think i’m getting hang of it. now i know how to use sketch, dimension, and extrude properly. still, i have a long way to go.
Made the phone box and outline of the… ummm… phone? phone handle? I learned the best way to shape the phone box is to design the lid first, and then the walls. Last time, I did the reverse, so that’s why I’m stuck. The amount of effort required to create a simple shape made me respect hobbyist and engineers more. I literally spent most of the time trying to figure out how to make symmetrical phone, lol. I tried to make the phone 3D, but again… It’s harder than I thought. I ended up to restart the 3D-fication process of the phone.
Yo… why is my phone tweaking? DAY 3 STUCK IN CAD PHASE BTW. GRRRRR. Maybe I should migrate to fusion instead? Sure… Lot of the community advice me to do so.
Based on some Slack feedbacks, I migrated to Autodesk Fusion. The progress is minimal today. This is due to tomorrow’s science exam. Maybe I’ll start a dead-grind tomorrow to make up for the wasted time. My target is to finish the project’s design by the eight of October. Ohhhhh, time is running out so quickly, isn’t it?
Made the top, side, and a bunch of garbage sketches. This time, I’m exploring surface modeling. Huft… How newbie am I? I don’t even know if I can make it on time. Seems there’s no progress on the CAD phase ;( How can making a telephone handset be this hard?
What happened today? ALOT. Here’s a summary: Cooked by my arc nemesis: “Rail not smooth error”. Trying to “fix” projection and alignment issues (they’re now worse btw) Banged my head several times. Still stuck fixing the handset bell for 4 and a half hours Lobotomized myself Had a massive thinking moment Decided that “the handset aren’t necessary” Sacrificed the telephone handset to actually make some progress. Moved-on to polish the phone box. “Sometimes, a sacrifice must be made. Especially when you’re stuck for 6 devlogs in a row” - Sun Tzu I’m not lazy, okay? I’m just having a replan for effectivity . Note: Maybe , I will try to complete the handset once everything else finished.
Ehem… I think I had some… uhm ‘development’. Remember when I first starting the project? That time, I hate CAD SO MUCH. Now…, I’ve found myself enjoying the CAD process. It is fun indeed. Here’s a list for what I’ve done and learned: REVAMPING the OLD UGLY phone box design. (I’m currently working on the internal walls. I learned to trust the process I learned that I can use formulas inside dimension tool. So I did! I learned to apply the Pythagorean theorem to my design! (I know it’s pretty basic, but hey, everyone has to start somewhere)
Today, I finished the all-new phone box body. Yeay! Not exactly “smooth”, and I’m not yet added the handset holder + mold. But hey, at least some progress can be made (I’m to sleepy to continue, sorry!). WOooO, I’m so excited to finish this project.
The last piece (i think) is done! The phone box lid is done, yeay OHH GOSH, I’M SO EXCITED TO DO THE CODING. WooOoOooo
Because I know there will be a lot of trials and errors, I’ve recreate the schematic inside Wokwi and set up Wokwi simulator inside VS Code (I mean it’s free and why not?) I don’t use Wakatime this time because I’m not yet started coding. This is just me or the TFT display pinout is a bit… weird
Okay… I’ve worked on the basic datastructure of the firmware. Yeay! So the most unique thing about this alarm I made is that you need to complete three minigames to get three ‘verification code’ that you must memorize in order to shut down the alarm. BUT… I want the alarm to be extra pesky, so some of the minigames in a session (1-2 of them) would require ‘unlock key’ from other minigame in the same session.
The overall loop flow is completed. BUT THE MOST IMPORTANTLY, THE FIRST MINIGAME IS COMPLETED (aside the UI draw aspect) Okay… this thing took longer than I thought… I’m kinda overwhelmed, but overall still fun WAIT, YOU CAN UPLOAD MORE THAN ONE IMAGE ON A SINGLE DEVLOG? I just found out about it…
Second minigame is completed! (aside the renderer… so yeah, no demo can be showed yet) Aside from the minigame, there’s also a slight rework to ensure ‘consistency’ and ‘developer’s QOL’. Furthermore, the code are now microscopically more optimized!
Completed two more minigames (#3 and #4). That means every minigames I planned so far are coded, yeay! (more minigames may be added soon) The current available minigames are: Simon Slider match (like Fisch reel mechanism, but three of it all at once) Slider hit (sorta like) Where’s waldo.
Ehem… A quick recap. It turns out, inputs handling are not-so-basic after all. At the first glance, everything seems easy. I thought the concept was simple: analogRead -> register into a struct -> return. But it turns out everything is… a bit messier. I ended up learning what are interrupts. Another couple of things that I finished were the lockscreen (aside the UI elements ofc) and the alarm buzzer. The lockscreen are somewhat trivial, meanwhile the buzzer made me relearn about PWM.
Found few genuinely dumb issues (mb): FORGOT TO ACTUALLY RANDOMIZE THE TOKEN. This is the most fatal one. Forgot to reset the menu data. So the user’s probably will stuck inside a single minigame Just learned that C++ tends to have weird quirks if you define a variable inside unscoped switch/case statement. Forgot to update set any_sw_clicked nor the rotary encoder button click. I’m so sorry if I can only develop this project for about few minutes tonight because there are a lot of going on today. Sorry :
OKAY… That’s a LOT. Okay… First of all, the clock’s system (aside from the visuals) are now be fully operable as the final architectural pieces has been completed. Second, completely eradicated delays in #1 minigame. Third. KILOTONS of bugfixes (mostly the fatal ones) (I’ve just realized I accidentally have two different commits named “FIX #3” lol) Fourth. OHH FINALLY MY BACK CAN REST!
Working on the user interface! The first ~20 minutes is me trying to pick between Figma or Photopea (I decided to use Figma), how to import font, and how to get started with Figma. So I did learn some fundamentals of Figma I changed the planned font from FreeMono to TomThumb. It’s simpler, small, scalable, and stylized....
|
1792464875.8421
|
1793069675.8421
|
|
67895
|
Hsoj-Tab by @Hsoj | Stardance
|
Hsoj
|
0
|
1.41
|
0
|
[]
|
[{"post_id": 80972, "ts": "202 [{"post_id": 80972, "ts": "2026-10-19T13:07:41Z", "hours": 1.4144, "text": "Hsoj-Tab Devlog What I built I wanted a new-tab page that looks like the rest of my site instead of a generic dashboard, so I built Hsoj-Tab: a clock, a search bar, news, shortcuts, and a todo list. What was challenging The news card gave me the most trouble. CORS: calling the news API from the browser fails, and the key would be exposed anyway. I moved the call into a SvelteKit +server.ts endpoint that reads the key from a private env var. No images: the list endpoint only returns titles, publishers, and timestamps. To get a thumbnail and some text, the server fetches the details of each story. Try it! Visit Hsoj-Tab That’s all. Cheers!"}]...
|
Title: Hsoj-Tab by @Hsoj | Stardance
Devlogs:
Hso Title: Hsoj-Tab by @Hsoj | Stardance
Devlogs:
Hsoj-Tab Devlog What I built I wanted a new-tab page that looks like the rest of my site instead of a generic dashboard, so I built Hsoj-Tab: a clock, a search bar, news, shortcuts, and a todo list. What was challenging The news card gave me the most trouble. CORS: calling the news API from the browser fails, and the key would be exposed anyway. I moved the call into a SvelteKit +server.ts endpoint that reads the key from a private env var. No images: the list endpoint only returns titles, publishers, and timestamps. To get a thumbnail and some text, the server fetches the details of each story. Try it! Visit Hsoj-Tab That’s all. Cheers!...
|
1792468354.3474357
|
1793073154.3474357
|
|
68393
|
Blog thing by @CharlieCatMeow | Stardance
|
CharlieCatMeow
|
0
|
5.45
|
0
|
[]
|
[{"post_id": 80974, "ts": "202 [{"post_id": 80974, "ts": "2026-10-19T13:40:03Z", "hours": 2.2911, "text": "MeowBlog Devlog #3 Even more stuff Still using the same styling, I have now styled most pages. The website now also checks if the account is the admin account. If it is, you can edit or delete a post. BetterAuth isn’t that complicated for me anymore and I’m starting to piece together how everything works. I still haven’t done the Homepage and the About Page so we’ll see how that goes. Everything else is basically finished though."}, {"post_id": 79771, "ts": "2026-10-15T10:36:54Z", "hours": 1.9542, "text": "MeowBlog Devlog #3 Stuff has been done!!! I have now finished the guide and everything should be working. I definitely understand it better now and things are starting to make sense. I’m still a bit confused with betterAuth and how it works but at least we got a website! I added a background image and some styling. Turns out tailwind CSS isn’t as scary as when I first found out about it. Idk what else to say. I used the usual design I like with the transparency thing, made the buttons do stuff when clicked and yeah ;-;"}, {"post_id": 79281, "ts": "2026-10-13T09:46:41Z", "hours": 1.2022, "text": "MeowBlog Devlog #1 I am so confused. There’s so much complicated stuff, I did my best to follow the guide up until halfway and I think it works now. I have never done anything like this before so it is all a bit weird and confusing."}]...
|
Title: Blog thing by @CharlieCatMeow | Stardance
Title: Blog thing by @CharlieCatMeow | Stardance
Devlogs:
MeowBlog Devlog #1 I am so confused. There’s so much complicated stuff, I did my best to follow the guide up until halfway and I think it works now. I have never done anything like this before so it is all a bit weird and confusing.
MeowBlog Devlog #3 Stuff has been done!!! I have now finished the guide and everything should be working. I definitely understand it better now and things are starting to make sense. I’m still a bit confused with betterAuth and how it works but at least we got a website! I added a background image and some styling. Turns out tailwind CSS isn’t as scary as when I first found out about it. Idk what else to say. I used the usual design I like with the transparency thing, made the buttons do stuff when clicked and yeah ;-;
MeowBlog Devlog #3 Even more stuff Still using the same styling, I have now styled most pages. The website now also checks if the account is the admin account. If it is, you can edit or delete a post. BetterAuth isn’t that complicated for me anymore and I’m starting to piece together how everything works. I still haven’t done the Homepage and the About Page so we’ll see how that goes. Everything else is basically finished though....
|
1792471854.5957637
|
1793076654.5957637
|
|
70509
|
IkuOS by @iku_dev | Stardance
|
iku_dev
|
0
|
3.25
|
0
|
[]
|
[{"post_id": 80980, "ts": "202 [{"post_id": 80980, "ts": "2026-10-19T14:27:42Z", "hours": 3.2475, "text": "ToDaY :| i picked up another project “create your own WebOS!!!!”, so i started with the background, board and task bar with its icons (i drew it m self :D) !!!!The best part!!!!! I made everything adaptive using “percentage” and “vw”, and I hopeful it will work on all devices!!!!"}]...
|
Title: IkuOS by @iku_dev | Stardance
Devlogs:
ToD Title: IkuOS by @iku_dev | Stardance
Devlogs:
ToDaY :| i picked up another project “create your own WebOS!!!!”, so i started with the background, board and task bar with its icons (i drew it m self :D) !!!!The best part!!!!! I made everything adaptive using “percentage” and “vw”, and I hopeful it will work on all devices!!!!...
|
1792421222.8351033
|
1793026022.8351033
|
|
68288
|
My first slack bot! by @lim_jing_yew | Stardance
|
lim_jing_yew
|
0
|
1.4
|
0
|
[]
|
[{"post_id": 80985, "ts": "202 [{"post_id": 80985, "ts": "2026-10-19T14:47:01Z", "hours": 0.4033, "text": "added some new quote thing (im just trying to make the bot do more things, i might have some plans to integrate the bot into other platforms, hopefully more advanced stuff)"}, {"post_id": 80407, "ts": "2026-10-17T15:35:38Z", "hours": 0.5083, "text": "i had a wonderful idea inspired by claude ai, to create a command such that the bot would display and elaborate on NASA’s daily astronomy picture of the day (apod). having some minor issues right now, like the picture not loading and only displaying the nasa icon. gonna continue tommorrow"}, {"post_id": 80308, "ts": "2026-10-17T07:06:05Z", "hours": 0.4928, "text": "added some new, simple commands 8ball, random advice and dice roll"}]...
|
Title: My first slack bot! by @lim_jing_yew | Star Title: My first slack bot! by @lim_jing_yew | Stardance
Devlogs:
added some new, simple commands 8ball, random advice and dice roll
i had a wonderful idea inspired by claude ai, to create a command such that the bot would display and elaborate on NASA’s daily astronomy picture of the day (apod). having some minor issues right now, like the picture not loading and only displaying the nasa icon. gonna continue tommorrow
added some new quote thing (im just trying to make the bot do more things, i might have some plans to integrate the bot into other platforms, hopefully more advanced stuff)...
|
1792471772.0223796
|
1793076572.0223796
|
|
69893
|
Bite Size Law by @Yummi | Stardance
|
Yummi
|
1
|
11.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-19T15:06:03Z", "hours": 11.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "5 tabs for cases, case database, saved files(folders), congressional bills, and bills database. Bills and cases have a similar format for the research tabs and database tabs. Both can be added to folders.", "repo": "https://github.com/michaelyummi/Bite-Size-Law", "demo": "https://dolphin-algebra-ruse.ngrok-free.dev/"}]...
|
[{"post_id": 80986, "ts": "202 [{"post_id": 80986, "ts": "2026-10-19T14:55:39Z", "hours": 11.3142, "text": "Legal database, folder system works both cases and bills. Also run the website on a local laptop via ngrok to access anywhere on the web."}]...
|
Title: Bite Size Law by @Yummi | Stardance
Devlog Title: Bite Size Law by @Yummi | Stardance
Devlogs:
Legal database, folder system works both cases and bills. Also run the website on a local laptop via ngrok to access anywhere on the web.
Ships:
5 tabs for cases, case database, saved files(folders), congressional bills, and bills database. Bills and cases have a similar format for the research tabs and database tabs. Both can be added to folders....
|
1792918148.456356
|
1793004548.456356
|
|
34756
|
Anixweb by @imnottimaq | Stardance
|
imnottimaq
|
1
|
108.14
|
1395
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-14T23:49:54Z", "hours": 83.0, "multiplier": 16.81, "payout": 1395, "blessing": "neutral", "text": "Hi! I want to present my project called Anixweb. Anixweb is an open-source web client for Anixart, a mobile app popular in the Russian-speaking community. I created it because I have been using Anixart on my phone for about five years, and I have always wanted to use it on my PC. I also wanted to learn JavaScript, TypeScript, and React by building a real project. It has many of the features you would expect: watchlists, favorites, and watch history; a huge selection of anime with Russian dubs or subtitles; search and advanced filters; user profiles, friends, comments, and ratings; notifications about new releases and episodes; and much more! In addition to recreating the core functionality of the official app, I also developed two features of my own: Watch Together and Upscale. Watch Together allows you to synchronize video playback with other people. It supports both public and private rooms. You can discover and join public rooms through the room browser, while private rooms can be joined using a room code or an invitation link. Episode selection, pauses, seeking, playback position, and playback speed are synchronized through a WebSocket server. Room owners can also allow other participants to control playback and select episodes. Upscale is an optional feature that uses WebGPU and Anime4K shaders to improve the viewing experience by sharpening the image and reducing blur in real time. All processing happens locally on your device, without manually re-encoding or uploading the video. I used: React and React Router; TypeScript; Vite; HLS.js for video playback; WebSockets for room synchronization; Anime4K-WebGPU for real-time image enhancement; CSS Modules for styling. One of the hardest parts was managing the video player lifecycle: switching streams, recovering from HLS errors, preserving playback progress, and keeping multiple users synchronized without creating feedback loops. I spent more than 90 hours working on this project. Along the way, I learned a lot about accessibility, video streaming, WebGPU pipelines, API integration, localization, and managing and structuring a medium-sized React application. This is an independent project and is not affiliated with the SwiftSoft Team in any way.", "repo": "https://github.com/imnottimaq/anixweb", "demo": "https://imnottimaq.github.io/anixweb/"}]...
|
[{"post_id": 80987, "ts": "202 [{"post_id": 80987, "ts": "2026-10-19T14:56:50Z", "hours": 7.1439, "text": "i havent looked into original app for a while, a month ago there was a huge update which added a lot of things first one is feed, implemented it initially but it requires reputation level 3 just to be able to post, which is kinda lame but it serves as antibot i guess improve watch together (better layout, controls and permissions) now you can move around categories in home and favorites to change order, on right click you can select default one and also there is new category in api called donghua, also implemented fixed bug that prevented you from login if you already had invalid token in cookie now you can properly download episodes as mp4 instead on hls fragments, but the speeds are kinda bad (0.5 - 1.5 mbps), will look into it bunch of minor changes: broader test coverage improved import/export of lists fullscreen photo viewer fixed recommendations if no description provided, it now says “no description provided” instead of blank space"}, {"post_id": 79651, "ts": "2026-10-14T22:11:57Z", "hours": 11.3022, "text": "forgot about devlogs, hour lost basically new settings auto fullscreen on episode start custom menu on right click cloud settings which are linked to anixart account and are saved on worker import/export of mal or shikimori lists new theme settings compact mode auto pause on focus loss download episodes(hls fragments for now only, proper mp4 planned for next devlog) chat in watch together (text, voice messages, reactions) prolly there is something else i have done but i cant remember, but this is the most important changes i kinda lied about maintenance only state xd"}, {"post_id": 77952, "ts": "2026-10-08T22:55:52Z", "hours": 6.6942, "text": "revamped watch together feature (for now only initial v2 release, needs more testing) also as a part of v2 server i unified proxies and room server into one worker, dont think this will affect something, but i just didnt like the idea of keeping proxy separately as it is like 200-300 lines fixed a lot of player bugs, in particular: if you switch to another episode, resume prompt is now not skipped when you change quality, player sometimes could lose progress upscaler implementation is now much stable and reliable initial test coverage, aiming for atleast 70% coverage for the next devlog, for now 90% for core logic and 15-20% across all codebase from now on, i probably wont add new features to the project, focusing on bugfixes and layout changes etc"}, {"post_id": 45968, "ts": "2026-08-12T19:50:30Z", "hours": 3.4922, "text": "friends management screen ability to change notifications per release fixed notifications setting, apparently they were broken now you can rate release editable player keybinds updated dependencies because react router had 2 vulnerabilities small changes here and there project is almost ready to ship, will ship today or tomorrow idk"}, {"post_id": 44777, "ts": "2026-08-10T19:39:13Z", "hours": 7.7881, "text": "collections screen, ability to save/create/comment collection asked claude to unify design, looks really better now and very well rounded fixed some linter error but not all(i dont know how to fix syncronous setState) some internal stuff that allowed me to reduce code size a bit removed swiper dependency(gallery i used in release screen) new buttons in overview but they are not fully functional yet reworked comments section a bit and also there is +1 hour for room server for watch together (fully vibecoded btw)"}, {"post_id": 40331, "ts": "2026-08-03T19:29:42Z", "hours": 1.9294, "text": "did a overview screen, looks cool im getting close to ship (80-85% i would say), mostly some polishing is left and the most major feature i havent implemented yet is collections, but for now ill focus more on polishing things instead"}, {"post_id": 40053, "ts": "2026-08-03T12:34:55Z", "hours": 0.5283, "text": "franchise screen"}, {"post_id": 39783, "ts": "2026-08-02T23:41:32Z", "hours": 2.2006, "text": "changed all names to anixweb to avoid having issues with the devs of original app in the future made account edit screen where you can change for now nickname, avatar, socials and some settings related to who can send you friend requests etc. friend requests is also a thing i implemented, but honestly i dont know why it even exists. it doesnt have any functionallity like chat or something, it just exists maybe ill implement like inviting your friend to the watch together room but idk about that one, my current worker will not be enough probably if site will be used by more than 100 people at the time also added proxy for images as an option cuz for me their images storage is not reachable via standard link, and with proxy it works good and also added like roles(which is not super important, did it just for the parity with the api), but like only 0.5% users of this app have any role roles is essentially like groups for example some dubbers team"}, {"post_id": 39178, "ts": "2026-08-01T23:31:26Z", "hours": 4.9144, "text": "god it took me like whole day to do it notifications screen itself wasnt hard to do, but settings was. it wasnt documented at all so i had to pull up mitmproxy + android emulator and find out and that alone took me 2 hours (not counted in the total time) also wanted to make notifications via web push api, but it isnt possible unfortunately overhaul of api client, now its a bit more unified lazy loading of components so it takes less time to load if you open website first time upgraded node on actions small improvements here and there"}, {"post_id": 38374, "ts": "2026-07-31T18:34:22Z", "hours": 2.495, "text": "after 3 and a half hours im finally done fixed account screen implemented “watch together feature” which is beta for now as it is a buggy mess as of writing this devlog and i actually found one more bug as i am writing this, ill fix it later i promise next time will implement ability to search on english as a toggle in settings through shikimori api (kinda like myanimelist but russian) this will probably make search slower but it will work"}, {"post_id": 38180, "ts": "2026-07-31T13:26:35Z", "hours": 2.0006, "text": "added this section that api sometimes returns fixed a few bugs with player: player doesnt show controls while fullscreen if webgpu is not available in your browser quality upgrade option will now gray out controls now disappear after sometime if server returns broken hls stream, it will try to gracefully recover now also changed things around in login/register/forgot password: token is now moved to cookies instead of localstorage as its more secure(but its still not very secure because api requires to send token as a query parameter and token doesnt change between devices until password reset) cleaned up some logging to console as its not really necessary now favorites page now shows popup for user to login to access this page oh and also settings button and also asked ai to implement translation, this will be removed probably after i ship project, as this site is not meant to be used by non-russian speakers"}, {"post_id": 37921, "ts": "2026-07-30T22:32:47Z", "hours": 2.9978, "text": "anime4k upscale works, but on chromium-based browsers only(firefox has bug that doesnt let it work) settings screen fully functional started working on translation to english, honestly at first i tried to look at browser translation feature, but it was horrible, so i decided to make it will be hard to implement to properly but i think 3-4 hours and i’ll be done"}, {"post_id": 37555, "ts": "2026-07-30T11:24:59Z", "hours": 3.7247, "text": "search is now a thing and it works fine redesigned cards on home screen and you can select between horizontal and vertical card (for now only through changing localstorage xd) some improvements here and there like a little bit better design of release screen next up i will probably finally do player settings and implement anime4k maybe"}, {"post_id": 36603, "ts": "2026-07-28T20:24:18Z", "hours": 0.9431, "text": "i finally understood that i suck at design and asked ai to design it. now it looks amazing. next i will ask it to look at release screen cause i like the layout of it but design is half good half sucks"}, {"post_id": 36109, "ts": "2026-07-28T00:06:39Z", "hours": 2.8711, "text": "draft for account page, for now copied design from mobile app, tomorrow will propery design, and now im going to sleep good night"}, {"post_id": 36004, "ts": "2026-07-27T20:24:53Z", "hours": 2.6617, "text": "okay found a way to make it work edited cors proxy to also include route with anixart user agent this could be bannable, but at most they will ban proxy ip on the api and that is not crucial, cors proxy will work just fine voting, posting a comment/reply, editing comment, deleting it was implemented"}, {"post_id": 35515, "ts": "2026-07-27T00:16:28Z", "hours": 1.9069, "text": "from now on i’ll try to make devlogs more often tried to make replies to comments but hit the wall: api does not allow adding comments/replies without anixart user agent. same goes with voting on comments (like/dislike kinda like reddit system) so i spend 2 hours just to discover that it will not work"}, {"post_id": 35200, "ts": "2026-07-26T13:56:38Z", "hours": 5.2744, "text": "ok i finally deployed it to github pages and also pushed source code to github also added favorites screen where you can see your history, favorites and each list (watched, planned, watching etc) added popup when you open site first time that its not official and im not responsible for your account oh and also tabs on home screen to see latest, ongoing, announced etc probably will add settings screen next time and also finish player"}, {"post_id": 34109, "ts": "2026-07-24T16:22:08Z", "hours": 6.7553, "text": "player 80 percent ready(settings is the only thing that does not work) refactored code a bit, mostly tried to reduce eslint errors/warnings started rewriting modal logic(repeating same logic on every new modal => separate model template component from which other modals will inherit from) and also rewriting modals to use that also, the project is nowhere near mvp, so probably no github pages deploy until that (30 percent rn i would say i spent too much time perfecting release page im dumb)"}, {"post_id": 32658, "ts": "2026-07-21T23:06:39Z", "hours": 7.9831, "text": "okay, its time to make a devlog proper dub/source select modal (eyeball shows that you already watched that episode and in the future i plan to implement time where you stopped but first i need to make proper player) began defining settings proper login screen and ability to create account/recover password (to be honest i thought it was impossible to make but after some reverse engineering via mitmproxy and android 7 emulator i found out that api reference that i was using is either outdated or not properly documented) ability to view comment replies and started working full comment section tried to implement voting on comments but its impossible unfortunately, api checks for allowed user agent and i cant change that moved things around internally, now project structure is more refined i think by the time i have to do next devlog i’ll deploy this site via github actions/github pages so i dont have to pay for hosting(application is fully client-side anyway)"}, {"post_id": 31486, "ts": "2026-07-19T21:56:15Z", "hours": 8.7089, "text": "release page almost ready, final touches left also spent too much time on dealing with cors error (kodik, one of the main players, was throwing cors error, so i asked codex to create simple cors proxy and deployed it to vercel, but kodik still sent broken data, turns out it was because of us ip adress, i moved proxy to cloudflare workers and now it parses fine) used linkparser from thedesconnet/anixartjs (this stuff is too wacky for me to deal with it myself) random anime button on header proper player is still wip (1% ready xd) will ask codex to do it cuz i dont even know where to start from also spent too much time to design this page but now it looks amazing hope to make proper player by the next devlog but this whole thing is new to me so im not sure"}, {"post_id": 29843, "ts": "2026-07-17T00:02:39Z", "hours": 8.4994, "text": "god that took a while, but you can finally watch something using this site, also login works now but no new account registration"}, {"post_id": 28527, "ts": "2026-07-14T20:47:13Z", "hours": 3.0678, "text": "As of now, webpage looks like this: Now you can open release and as of now it will show poster, play button, favorite button and dropdown where you are supposed to select whether you watch it right now, plan to watch it, or dropped it(there is more im too lazy to describe them all) Next up i will implement ability to watch episodes and log into your account (maybe sign in too im not sure)"}, {"post_id": 28016, "ts": "2026-07-14T00:26:24Z", "hours": 2.2583, "text": "Today i finally started working on it, threw together something basic as im new to react/js"}]...
|
Title: Anixweb by @imnottimaq | Stardance
Devlogs Title: Anixweb by @imnottimaq | Stardance
Devlogs:
Today i finally started working on it, threw together something basic as im new to react/js
As of now, webpage looks like this: Now you can open release and as of now it will show poster, play button, favorite button and dropdown where you are supposed to select whether you watch it right now, plan to watch it, or dropped it(there is more im too lazy to describe them all) Next up i will implement ability to watch episodes and log into your account (maybe sign in too im not sure)
god that took a while, but you can finally watch something using this site, also login works now but no new account registration
release page almost ready, final touches left also spent too much time on dealing with cors error (kodik, one of the main players, was throwing cors error, so i asked codex to create simple cors proxy and deployed it to vercel, but kodik still sent broken data, turns out it was because of us ip adress, i moved proxy to cloudflare workers and now it parses fine) used linkparser from thedesconnet/anixartjs (this stuff is too wacky for me to deal with it myself) random anime button on header proper player is still wip (1% ready xd) will ask codex to do it cuz i dont even know where to start from also spent too much time to design this page but now it looks amazing hope to make proper player by the next devlog but this whole thing is new to me so im not sure
okay, its time to make a devlog proper dub/source select modal (eyeball shows that you already watched that episode and in the future i plan to implement time where you stopped but first i need to make proper player) began defining settings proper login screen and ability to create account/recover password (to be honest i thought it was impossible to make but after some reverse engineering via mitmproxy and android 7 emulator i found out that api reference that i was using is either outdated or not properly documented) ability to view comment replies and started working full comment section tried to implement voting on comments but its impossible unfortunately, api checks for allowed user agent and i cant change that moved things around internally, now project structure is more refined i think by the time i have to do next devlog i’ll deploy this site via github actions/github pages so i dont have to pay for hosting(application is fully client-side anyway)
player 80 percent ready(settings is the only thing that does not work) refactored code a bit, mostly tried to reduce eslint errors/warnings started rewriting modal logic(repeating same logic on every new modal => separate model template component from which other modals will inherit from) and also rewriting modals to use that also, the project is nowhere near mvp, so probably no github pages deploy until that (30 percent rn i would say i spent too much time perfecting release page im dumb)
ok i finally deployed it to github pages and also pushed source code to github also added favorites screen where you can see your history, favorites and each list (watched, planned, watching etc) added popup when you open site first time that its not official and im not responsible for your account oh and also tabs on home screen to see latest, ongoing, announced etc probably will add settings screen next time and also finish player
from now on i’ll try to make devlogs more often tried to make replies to comments but hit the wall: api does not allow adding comments/replies without anixart user agent. same goes with voting on comments (like/dislike kinda like reddit system) so i spend 2 hours just to discover that it will not work
okay found a way to make it work edited cors proxy to also include route with anixart user agent this could be bannable, but at most they will ban proxy ip on the api and that is not crucial, cors proxy will work just fine voting, posting a comment/reply, editing comment, deleting it was implemented
draft for account page, for now copied design from mobile app, tomorrow will propery design, and now im going to sleep good night
i finally understood that i suck at design and asked ai to design it. now it looks amazing. next i will ask it to look at release screen cause i like the layout of it but design is half good half sucks
search is now a thing and it works fine redesigned cards on home screen and you can select between horizontal and vertical card (for now only through changing localstorage xd) some improvements here and there like a little bit better design of release screen next up i will probably finally do player settings and implement anime4k maybe
anime4k upscale works, but on chromium-based browsers only(firefox has bug that doesnt let it work) settings screen fully functional started working on translation to english, honestly at first i tried to look at browser translation feature, but it was horrible, so i decided to make it will be hard to implement to properly but i think 3-4 hours and i’ll be done
added this section that api sometimes returns fixed a few bugs with player: player doesnt show controls while fullscreen if webgpu is not available in your browser quality upgrade option will now gray out controls now disappear after sometime if server returns broken hls stream, it will try to gracefully recover now also changed things around in login/register/forgot password: token is now moved to cookies instead of localstorage as its more secure(but its still not very secure because api requires to send token as a query parameter and token doesnt change between devices until password reset) cleaned up some logging to console as its not really necessary now favorites page now shows popup for user to login to access this page oh and also settings button and also asked ai to implement translation, this will be removed probably after i ship project, as this site is not meant to be used by non-russian speakers
after 3 and a half hours im finally done fixed account screen implemented “watch together feature” which is beta for now as it is a buggy mess as of writing this devlog and i actually found one more bug as i am writing this, ill fix it later i promise next time will implement ability to search on english as a toggle in settings through shikimori api (kinda like myanimelist but russian) this will probably make search slower but it will work
god it took me like whole day to do it notifications screen itself wasnt hard to do, but settings was. it wasnt documented at all so i had to pull up mitmproxy + android emulator and find out and that alone took me 2 hours (not counted in the total time) also wanted to make notifications via web push api, but it isnt possible unfortunately overhaul of api client, now its a bit more unified lazy loading of components so it takes less time to load if you open website first time upgraded node on actions small improvements here and there
changed all names to anixweb to avoid having issues with the devs of original app in the future made account edit screen where you can change for now nickname, avatar, socials and some settings related to who can send you friend requests etc. friend requests is also a thing i implemented, but honestly i dont know why it even exists. it doesnt have any functionallity like chat or something, it just exists maybe ill implement like inviting your friend to the watch together room but idk about that one, my current worker will not be enough probably if site will be used by more than 100 people at the time also added proxy for images as an option cuz for me their images storage is not reachable via standard link, and with proxy it works good and also added like roles(which is not super important, did it just for the parity with the api), but like only 0.5% users of this app have any role roles is essentially like groups for example some dubbers team
franchise screen
did a overview screen, looks cool im getting close to ship (80-85% i would say), mostly some polishing is left and the most major feature i havent implemented yet is collections, but for now ill focus more on polishing things instead
collections screen, ability to save/create/comment collection asked claude to unify design, looks really better now and very well rounded fixed some linter error but not all(i dont know how to fix syncronous setState) some internal stuff that allowed me to reduce code size a bit removed swiper dependency(gallery i used in release screen) new buttons in overview but they are not fully functional yet reworked comments section a bit and also there is +1 hour for room server for watch together (fully vibecoded btw)
friends management screen ability to change notifications per release fixed notifications setting, apparently they were broken now you can rate release editable player keybinds updated dependencies because react router had 2 vulnerabilities small changes here and there project is almost ready to ship, will ship today or tomorrow idk
revamped watch together feature (for now only initial v2 release, needs more testing) also as a part of v2 server i unified proxies and room server into one worker, dont think this will affect something, but i just didnt like the idea of keeping proxy separately as it is like 200-300 lines fixed a lot of player bugs, in particular: if you switch to another episode, resume prompt is now not skipped when you change quality, player sometimes could lose progress upscaler implementation is now much stable and reliable initial test coverage, aiming for atleast 70% coverage for the next devlog, for now 90% for core logic and 15-20% across all codebase from now on, i probably wont add new features to the project, focusing on bugfixes and layout changes etc
forgot about devlogs, hour lost basically new settings auto fullscreen on episode start custom menu on right click cloud settings which are linked to anixart account and are saved on worker import/export of mal or shikimori lists new theme settings compact mode auto pause on focus loss download episodes(hls fragments for now only, proper mp4 planned for next devlog) chat in watch together (text, voice messages, reactions) prolly there is something else i have done but i cant remember, but this is the most important changes i kinda lied about maintenance only state xd
i havent looked into original app for a while, a month ago there was a huge update which added a lot of things first one is feed, implemented it initially but it requires reputation level 3 just to be able to post, which is kinda lame but it serves as antibot i guess improve watch together (better layout, controls and permissions) now you can move around categories in home and favorites to change order, on right click you can select default one and also there is new category in api called donghua, also implemented fixed bug that prevented you from login if you already had invalid token in cookie now you can properly download episodes as mp4 instead on hls fragments, but the speeds are kinda bad (0.5 - 1.5 mbps), will look into it bunch of minor changes: broader test coverage improved import/export of lists fullscreen photo viewer fixed recommendations if no description provided, it now says “no description provided” instead of blank space
Ships:
Hi! I want to present my project called Anixweb. Anixweb is an open-source web client for Anixart, a mobile app popular in the Russian-speaking community. I created it because I have been using Anixart on my phone for about five years, and I have always wanted to use it on my PC. I also wanted to learn JavaScript, TypeScript, and React by building a real project. It has many of the features you would expect: watchlists, favorites, and watch history; a huge selection of anime with Russian dubs or subtitles; search and advanced filters; user profiles, friends, comments, and ratings; notifications about new releases and episodes; and much more! In addition to recreating the core functionality of the official app, I also developed two features of my own: Watch Together and Upscale. Watch Together allows you to synchronize video playback with other people. It supports both public and private rooms. You can discover and join public rooms through the room browser, while private rooms can be joined using a room code or an invitation link. Episode selection, pauses, seeking, playback position, and playback speed are synchronized through a WebSocket server. Room owners can also allow other participants to control playback and select episodes. Upscale is an optional feature that uses WebGPU and Anime4K shaders to improve the viewing experience by sharpening the image and reducing blur in real time. All processing happens locally on your device, without manually re-encoding or uploading the video. I used: React and React Router; TypeScript; Vite; HLS.js for video playback; WebSockets for room synchronization; Anime4K-WebGPU for real-time image enhancement; CSS Modules for styling. One of the hardest parts was managing the video player lifecycle: switching streams, recovering from HLS errors, preserving playback progress, and keeping multiple users synchronized without creating feedback loops. I spent more than 90 hours working on this project. Along the way, I learned a lot about accessibility, video streaming, WebGPU pipelines, API integration, localization, and managing and structuring a medium-sized React application. This is an independent project and is not affiliated with the SwiftSoft Team in any way....
|
1792842812.3772938
|
1792929212.3772938
|
|
26760
|
Orb package manager by @Hamuz | Stardance
|
Hamuz
|
0
|
0.96
|
0
|
[]
|
[{"post_id": 80993, "ts": "202 [{"post_id": 80993, "ts": "2026-10-19T15:17:18Z", "hours": 0.9625, "text": "Devlog 1 — Today I had DeepSeek write the first part of the code so I can understand how the script works, but I’m going to write the rest of the code by hand. So far the only command that works is orb -S/install"}]...
|
Title: Orb package manager by @Hamuz | Stardance
Title: Orb package manager by @Hamuz | Stardance
Devlogs:
Devlog 1 — Today I had DeepSeek write the first part of the code so I can understand how the script works, but I’m going to write the rest of the code by hand. So far the only command that works is orb -S/install...
|
1792522189.0143077
|
1793126989.0143077
|
|
69666
|
Asteroid Game by @Sadiya | Stardance
|
Sadiya
|
0
|
1.16
|
0
|
[]
|
[{"post_id": 81001, "ts": "202 [{"post_id": 81001, "ts": "2026-10-19T15:37:04Z", "hours": 1.1606, "text": "This is how my project looks so far. I am currently doing the JS but I have changed somethings in CSS like the background color is an image and I have resized the gameCanvas and moved the gameContainer to make it align with everything."}]...
|
Title: Asteroid Game by @Sadiya | Stardance
Devlo Title: Asteroid Game by @Sadiya | Stardance
Devlogs:
This is how my project looks so far. I am currently doing the JS but I have changed somethings in CSS like the background color is an image and I have resized the gameCanvas and moved the gameContainer to make it align with everything....
|
1792857296.713508
|
1793462096.713508
|
|
51213
|
AquariumOS by @defenestrantor | Stardance
|
defenestrantor
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-19T16:20:03Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made Aquarium OS. Im proud of how I got it able to work online and got it to run well. I also like the ripples that I added, however GitHub pages is down right now so the latest update isn’t visible.", "repo": "https://github.com/ethaenall/aquariumos", "demo": "https://ethaenall.github.io/aquariumos/"}]...
|
[{"post_id": 81003, "ts": "202 [{"post_id": 81003, "ts": "2026-10-19T15:50:07Z", "hours": 3.2186, "text": "I gave the water moving light patterns and ripples Fish now grow and change forms when you feed them + tank has memory now. A goldfish can become a koi, then a dragon koi. I also replaced the dock with little objects sitting in the sand. Notes opens from a treehouse, Calculator from a treasure chest, and Music from a shell. Minimized apps go to sleep until you click them again."}, {"post_id": 50115, "ts": "2026-08-19T05:47:34Z", "hours": 0.5861, "text": "I wanted the cursor to feel like something in the water. When it gets close, fish peel away instead of swimming through it, and the water keeps a little ripple. Notes now say when they’re saved, windows remember where you left them, and Esc closes the focused one."}, {"post_id": 50092, "ts": "2026-08-19T04:49:12Z", "hours": 0.3969, "text": "Cursor ripples in the water, and nearby fish peel away Notes show “Saved in this tank” Windows remember where you dragged them Esc closes the focused window A first run hint: “Move around — the fish notice you.”"}, {"post_id": 50079, "ts": "2026-08-19T04:12:15Z", "hours": 0.5472, "text": "Draggable, stackable windows with click-to-focus and close Notes: autosaves to locally Calculator — + − × ÷, decimals, clear, equals Music:play/pause, progress, volume, royalty free loop Tide Lights About: short Stardance / WebOS 1 writeup Fish cursor interaction: nearby fish peel away slightly (the extra feature)"}]...
|
Title: AquariumOS by @defenestrantor | Stardance
Title: AquariumOS by @defenestrantor | Stardance
Devlogs:
Draggable, stackable windows with click-to-focus and close Notes: autosaves to locally Calculator — + − × ÷, decimals, clear, equals Music:play/pause, progress, volume, royalty free loop Tide Lights About: short Stardance / WebOS 1 writeup Fish cursor interaction: nearby fish peel away slightly (the extra feature)
Cursor ripples in the water, and nearby fish peel away Notes show “Saved in this tank” Windows remember where you dragged them Esc closes the focused window A first run hint: “Move around — the fish notice you.”
I wanted the cursor to feel like something in the water. When it gets close, fish peel away instead of swimming through it, and the water keeps a little ripple. Notes now say when they’re saved, windows remember where you left them, and Esc closes the focused one.
I gave the water moving light patterns and ripples Fish now grow and change forms when you feed them + tank has memory now. A goldfish can become a koi, then a dragon koi. I also replaced the dock with little objects sitting in the sand. Notes opens from a treehouse, Calculator from a treasure chest, and Music from a shell. Minimized apps go to sleep until you click them again.
Ships:
I made Aquarium OS. Im proud of how I got it able to work online and got it to run well. I also like the ripples that I added, however GitHub pages is down right now so the latest update isn’t visible....
|
1792662600.7202578
|
1792749000.7202578
|