|
2335
|
Akosua by @theycantseemeyall | Stardance
|
theycantseemeyall
|
2
|
17.0
|
41
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-08T17:57:48Z", "hours": 4.0, "multiplier": 12.86, "payout": 41, "blessing": "neutral", "text": "I made a personal portfolio for myself with different sections a hero section in which my name surrounded by lava lamps are, a files section to show all the projects I am currently working on, an experiences section which shows the apps I know how to use and work with the most with my minecraft avatar, a timeline section with important events I have been in, a corkboard section with all my links which are available to the public such as my spotify, what I’m listening to, my youtube videos and my substack and finally a rotary phone with my socials which people can follow or contact me with. Hope you all enjoy this project as much as I enjoyed making it", "repo": "https://github.com/theycantseemeyall/Akosua-s-portfolio", "demo": "http://theycantseemeyall.github.io/Akosua-s-portfolio/"}, {"ship_num": 2, "ts": "2026-07-04T22:03:39Z", "hours": 13.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a personal portfolio to showcase my research, interests and passions to others who may be interested. This was a very fun project that I am very proud of I think it is very close to my original idea which I started with visually although this had many more issues that I was wanting escpecially with the js as it is one of my first times working with html css and js properly without just vibe coding the full thing I really enjoyed working on it and I hope anyone who sees this will enjoy my presentation.", "repo": "https://github.com/theycantseemeyall/Akosua-s-portfolio", "demo": "http://theycantseemeyall.github.io/Akosua-s-portfolio/"}]...
|
[{"post_id": 24742, "ts": "202 [{"post_id": 24742, "ts": "2026-07-08T14:54:30Z", "hours": 0.9894, "text": "Added the proper links to the projects tab inside the files section so that all my projects can be displayed properly. Once all my projects are properlly done ill add a full blog or just make a video to go through everything nicely"}, {"post_id": 24441, "ts": "2026-07-08T00:16:03Z", "hours": 1.2606, "text": "Today marks the end of this project I think. All of the proper code has been completed and I think if I have to add anythign else it would js be updating stickers on the corkboard and links for the thumbnails in the corkboard section. Today was mainly designing the actual thumbnails which took way longer than I had wanted to match the aestehtics and everything but we all done now. The portfolio should now be live if anyones interested and I might make a proper video on my youtube showcasing every part in proper detail and stuff if anyones interested"}, {"post_id": 23180, "ts": "2026-07-06T00:20:15Z", "hours": 1.3983, "text": "Added more pictures on the corkboard and tried to fix the orientation and layout so everything looked more seamless. Added links to the rotary phone today and I will see if I maybe add the sound of a phone ringing after the last scroll is taken."}, {"post_id": 22416, "ts": "2026-07-04T21:31:27Z", "hours": 4.6286, "text": "As the proper coding of my personal portfolio is done I thoguht I would just spend the day decorating it today and making it match my aesthetic etc to keep the mixed media vibe going. I started with adding the appropriate files to the projects sections and blog posts which links to the projects tab of my website to show all of them in more depth. A couple days ago I found a 3d model box that I was going to use for a whats in my bag type situation for my experience and software i’m comfortable with but then whilst playing minecraft I htoguth about the idea of loot dropping and decided to use my minecraft avatar instead. Then i finished the timeline with the past 3years of events which I think had a big turning point and then created a full page version of the timeline just incase anyone else wanted to see a bigger version I guess. After that was the links section I really wanted it to give a corkboard type feel its not there yet as I still need to make some graphics for it but its coming along. The final section the rotary phone is also completed code wise just like the hero section but I really want to add links for each number like my github, pinterest email etc just a contacts page but once the last scroll is taken I would really like a proper ring sound. Once the portfolio is fully complete I might create a youtube video or something to show the process and thoroughly explain what went into the creation of this my thoguht process etc if anyones interested 🐰🐰"}, {"post_id": 21829, "ts": "2026-07-03T23:22:45Z", "hours": 1.3139, "text": "Today I found a free 3d model of this cardboard box to put all the apps I am comfortable with using kinda like and experience box when the box is double clicked all the app logos will pop out for some reason my github isnt working today too so ill have to try again tommorrow godwilling to see if the repos work if not then ill just delete all my files and then re-add them"}, {"post_id": 21190, "ts": "2026-07-03T00:19:26Z", "hours": 2.49, "text": "Today after some delays I have finally finished the outer shell of my personal portfolio including how I want the js to operate / work so now all I have to do is properly add the graphics fonts I want just little things to fully give my portfolio a smooth mixed media feel."}, {"post_id": 13361, "ts": "2026-06-21T21:50:16Z", "hours": 2.2761, "text": "Today was an extremely tasking day as I tried to fix the telephone final section of my portfolio and create blog post pages and a gallary for my projects. The telephone are is still a work in progress as for some reason as the user scrolls down (prolly cause of the section dividers I made inistially) but the telephone only spins a little without spinning around all the way which I want it to. Once the fundamental code revolving the telephone I done I can actually start the customisation - Since the vibe for the portfolio that I am going for is mixed media I realised that I have to create said media and I can’t js leave stuff to ai cause no to AI art. So now I must create a miniture avatar minecraft looking pixelated character for section 3 which when double clicked will drop loot of some sorts kinda like a whats in my bad. And for the timeline section section 3 I have to add proper points and edit the kinda lines on the ladder to be less equal to give it a more realistic look and add pictures. Over all I’m really exicted for this project to be over so far I think its my favourite"}, {"post_id": 2410, "ts": "2026-06-04T21:29:02Z", "hours": 1.3989, "text": "Sorry for the slightly long ramble today but I figured it might be best to do so that way I can js go back and recap and continue in future devlogs. So today I tried to get majority of the “outershell” of my portfolio done so at a later time I can focus more on the proper graphics. The very first part of my portfolio as previosuly mentioned is inspired by a lava lamp because I think they are very cool. For slight context my passion is science, tech, medicine etc but I have always found art and aesthetically pleasing things in general to be very enjoyable too, so with that in mind I wnated my website to have a mixed media look so that it was futuristic in some sorts but also represented me as a whole. It might be very hard to tell what each segment of the website looks like currently its js fragments of a whole so i’ll try to explain the vision. In the hero section of my website its a lava lamp I might add mouse compatability so it moves with the cursor not sure yet waiting on feedback ig. 2nd section is a projects section with the projects I’m working on or have already worked on. 3rd section is the polaroid section so more about me its going to hopefully display a picture of self and a little avatar which I might make using blender or js a pixel and when double tapped I kinda fall and then drop loot js like minecraft but its styled as a what’s in my bag for things I’m interested in 4th section is a timeline of events that have lead up to this in some sorts 5th will be a corkboard vibe with all my videos and articles if I post them 6th section - The final one will hopefully be a telephone with the circle spiny thing which when spun will show a link to contact me eg. pinterest , youtube email js social medias I have. SO that was all for log 002"}, {"post_id": 1691, "ts": "2026-06-03T20:53:12Z", "hours": 0.6472, "text": "Today I attempted to try and actual do more work on the portfolio. Its been neglected for some time as finding out how to make a lava lamp took so much research not even AI was helping but throught my countless minutes of googling I found an open source one that worked. Using that since it was just the mechanics of a lava lamp that I wanted I worked to extract the actual fluid for within the container and just have that within the hero of my portfolio cause I thought it looked cool. After that I decided to move onto section 2 which is called the files and is where I shall be storing / displaying the projects I have / am working on. Im currently trying to go for a mixed media looking website but it looks very plain right now so don’t mind that. I added some buttons which turn burgundy upon hover and made it a parallax scroll effect instead of buttons to move between files. In the future I might make them look a little more like files in file explorer so its cooler. I’m not sure whether to keep the colour of the background white or black time shall tell"}]...
|
Title: Akosua by @theycantseemeyall | Stardance
D Title: Akosua by @theycantseemeyall | Stardance
Devlogs:
Today I attempted to try and actual do more work on the portfolio. Its been neglected for some time as finding out how to make a lava lamp took so much research not even AI was helping but throught my countless minutes of googling I found an open source one that worked. Using that since it was just the mechanics of a lava lamp that I wanted I worked to extract the actual fluid for within the container and just have that within the hero of my portfolio cause I thought it looked cool. After that I decided to move onto section 2 which is called the files and is where I shall be storing / displaying the projects I have / am working on. Im currently trying to go for a mixed media looking website but it looks very plain right now so don’t mind that. I added some buttons which turn burgundy upon hover and made it a parallax scroll effect instead of buttons to move between files. In the future I might make them look a little more like files in file explorer so its cooler. I’m not sure whether to keep the colour of the background white or black time shall tell
Sorry for the slightly long ramble today but I figured it might be best to do so that way I can js go back and recap and continue in future devlogs. So today I tried to get majority of the “outershell” of my portfolio done so at a later time I can focus more on the proper graphics. The very first part of my portfolio as previosuly mentioned is inspired by a lava lamp because I think they are very cool. For slight context my passion is science, tech, medicine etc but I have always found art and aesthetically pleasing things in general to be very enjoyable too, so with that in mind I wnated my website to have a mixed media look so that it was futuristic in some sorts but also represented me as a whole. It might be very hard to tell what each segment of the website looks like currently its js fragments of a whole so i’ll try to explain the vision. In the hero section of my website its a lava lamp I might add mouse compatability so it moves with the cursor not sure yet waiting on feedback ig. 2nd section is a projects section with the projects I’m working on or have already worked on. 3rd section is the polaroid section so more about me its going to hopefully display a picture of self and a little avatar which I might make using blender or js a pixel and when double tapped I kinda fall and then drop loot js like minecraft but its styled as a what’s in my bag for things I’m interested in 4th section is a timeline of events that have lead up to this in some sorts 5th will be a corkboard vibe with all my videos and articles if I post them 6th section - The final one will hopefully be a telephone with the circle spiny thing which when spun will show a link to contact me eg. pinterest , youtube email js social medias I have. SO that was all for log 002
Today was an extremely tasking day as I tried to fix the telephone final section of my portfolio and create blog post pages and a gallary for my projects. The telephone are is still a work in progress as for some reason as the user scrolls down (prolly cause of the section dividers I made inistially) but the telephone only spins a little without spinning around all the way which I want it to. Once the fundamental code revolving the telephone I done I can actually start the customisation - Since the vibe for the portfolio that I am going for is mixed media I realised that I have to create said media and I can’t js leave stuff to ai cause no to AI art. So now I must create a miniture avatar minecraft looking pixelated character for section 3 which when double clicked will drop loot of some sorts kinda like a whats in my bad. And for the timeline section section 3 I have to add proper points and edit the kinda lines on the ladder to be less equal to give it a more realistic look and add pictures. Over all I’m really exicted for this project to be over so far I think its my favourite
Today after some delays I have finally finished the outer shell of my personal portfolio including how I want the js to operate / work so now all I have to do is properly add the graphics fonts I want just little things to fully give my portfolio a smooth mixed media feel.
Today I found a free 3d model of this cardboard box to put all the apps I am comfortable with using kinda like and experience box when the box is double clicked all the app logos will pop out for some reason my github isnt working today too so ill have to try again tommorrow godwilling to see if the repos work if not then ill just delete all my files and then re-add them
As the proper coding of my personal portfolio is done I thoguht I would just spend the day decorating it today and making it match my aesthetic etc to keep the mixed media vibe going. I started with adding the appropriate files to the projects sections and blog posts which links to the projects tab of my website to show all of them in more depth. A couple days ago I found a 3d model box that I was going to use for a whats in my bag type situation for my experience and software i’m comfortable with but then whilst playing minecraft I htoguth about the idea of loot dropping and decided to use my minecraft avatar instead. Then i finished the timeline with the past 3years of events which I think had a big turning point and then created a full page version of the timeline just incase anyone else wanted to see a bigger version I guess. After that was the links section I really wanted it to give a corkboard type feel its not there yet as I still need to make some graphics for it but its coming along. The final section the rotary phone is also completed code wise just like the hero section but I really want to add links for each number like my github, pinterest email etc just a contacts page but once the last scroll is taken I would really like a proper ring sound. Once the portfolio is fully complete I might create a youtube video or something to show the process and thoroughly explain what went into the creation of this my thoguht process etc if anyones interested 🐰🐰
Added more pictures on the corkboard and tried to fix the orientation and layout so everything looked more seamless. Added links to the rotary phone today and I will see if I maybe add the sound of a phone ringing after the last scroll is taken.
Today marks the end of this project I think. All of the proper code has been completed and I think if I have to add anythign else it would js be updating stickers on the corkboard and links for the thumbnails in the corkboard section. Today was mainly designing the actual thumbnails which took way longer than I had wanted to match the aestehtics and everything but we all done now. The portfolio should now be live if anyones interested and I might make a proper video on my youtube showcasing every part in proper detail and stuff if anyones interested
Added the proper links to the projects tab inside the files section so that all my projects can be displayed properly. Once all my projects are properlly done ill add a full blog or just make a video to go through everything nicely
Ships:
I made a personal portfolio to showcase my research, interests and passions to others who may be interested. This was a very fun project that I am very proud of I think it is very close to my original idea which I started with visually although this had many more issues that I was wanting escpecially with the js as it is one of my first times working with html css and js properly without just vibe coding the full thing I really enjoyed working on it and I hope anyone who sees this will enjoy my presentation.
I made a personal portfolio for myself with different sections a hero section in which my name surrounded by lava lamps are, a files section to show all the projects I am currently working on, an experiences section which shows the apps I know how to use and work with the most with my minecraft avatar, a timeline section with important events I have been in, a corkboard section with all my links which are available to the public such as my spotify, what I’m listening to, my youtube videos and my substack and finally a rotary phone with my socials which people can follow or contact me with. Hope you all enjoy this project as much as I enjoyed making it...
|
1792839173.8909345
|
1792925573.8909345
|
|
2704
|
Motivator by @yeshwanth_purusothaman | Stardance
|
yeshwanth_purusothaman
|
2
|
5.0
|
10
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-05T16:19:11Z", "hours": 3.0, "multiplier": 1.46, "payout": 4, "blessing": "neutral", "text": "I improved my project to include many more features like a breathing exercise.", "repo": "https://github.com/Adax1216/Motivator", "demo": "https://github.com/Adax1216/Motivator/releases/download/v2.0.0/Project.exe"}, {"ship_num": 2, "ts": "2026-06-04T21:20:07Z", "hours": 2.0, "multiplier": 4.1, "payout": 6, "blessing": "neutral", "text": "Motivator is an interactive, command-line Python application designed to act as a digital sounding board and a mood booster. Built with a focus on user well-being and simple interactivity, the project serves a dual purpose: providing a safe, private space to express negative emotions and delivering instant, lighthearted entertainment to brighten the user’s day. Core Architecture & Workflow The application operates on a responsive decision-tree logic based on user input: The Greeting & Assessment: The program initiates a check-in, asking the user to evaluate their current emotional state. The “Good Day” Path (Positive Reinforcement): If the user is feeling well, the script triggers an endless amusement loop. It utilizes Python’s built-in random module to pull dynamic content from a curated array of classic riddles, logic puzzles, and lighthearted jokes—ensuring the user’s good mood is sustained. The “Bad Day” Path (Empathy & Venting): If the user indicates they are having a tough time, the application shifts to an empathetic tone. It opens an interactive text prompt, acting as a private journal where the user can freely type out and vent their frustrations. The Motivation Loop: Once the user finishes venting, the script transitions into a comforting support system, pulling timeless, inspiring quotes from historical figures and philosophers to offer perspective and encouragement.", "repo": "https://github.com/Adax1216/Motivator", "demo": "https://github.com/Adax1216/Motivator/releases/download/v2.0.0/Project.exe"}]...
|
[{"post_id": 10084, "ts": "202 [{"post_id": 10084, "ts": "2026-06-16T17:44:16Z", "hours": 0.3983, "text": "Today i fixed a few issues like fixing my github and making a better executable. the Code is now kinda like an app."}, {"post_id": 3899, "ts": "2026-06-07T00:22:26Z", "hours": 1.1864, "text": "Today I worked on building a breathing exercise to be part of my code. I made it so the code makes you do breathing exercises if you chose not to vent out your feelings. I also worked on changing my Github repo and pushing an executable . I didn’t know how to do this so it took me a while, But I figured it out and now it is perfect. I am planning on adding more joke/riddles and quotes to Motivator."}, {"post_id": 3217, "ts": "2026-06-06T01:27:02Z", "hours": 0.5231, "text": "Right Now I am trying to make it so the code waits a few seconds before it says the answer of the joke/riddle. I still haven’t figured out how to do this, I might have to watch some videos on youtube."}, {"post_id": 2970, "ts": "2026-06-05T21:46:57Z", "hours": 0.2836, "text": "I updated my read me. AT first I didn’t know what a read me was as I am new to this so I used AI to make my read me, but now I updated it, I made it completely from scratch."}, {"post_id": 2727, "ts": "2026-06-05T14:06:53Z", "hours": 0.5892, "text": "Today I made the entire project a loop to improve user experience. after user is done with their jokes/riddles/quotes I made it so they can choose to restart the code so they can do it from the beginning."}, {"post_id": 2369, "ts": "2026-06-04T20:29:51Z", "hours": 0.5747, "text": "What I Did Today: Spent some time setting up the core interaction loop for the project. The goal was to make a text-based companion that listens to user input and reacts dynamically. How it Works: The program uses a continuous loop to prompt the user. It converts whatever they type into lowercase so it doesn’t get tripped up by typos or caps, then scans the text for specific triggers like “miserable” or “hungry” to send back a helpful, relevant reply. Next Steps: Looking into expanding the keyword vocabulary and handling unexpected inputs more smoothly! Also if anybody has ideas on what words should leave a customized message pls leave in comments, Thank You!! *"}, {"post_id": 1852, "ts": "2026-06-04T02:02:44Z", "hours": 0.9786, "text": "I didn’t get any ideas but than I was inspired by reading a quote somewhere, I decided to make some code thar randomly says jokes/riddles/quotes , than i realized why not market it as a motivator. I have finished a little code, I am still improving it though."}]...
|
Title: Motivator by @yeshwanth_purusothaman | Star Title: Motivator by @yeshwanth_purusothaman | Stardance
Devlogs:
I didn’t get any ideas but than I was inspired by reading a quote somewhere, I decided to make some code thar randomly says jokes/riddles/quotes , than i realized why not market it as a motivator. I have finished a little code, I am still improving it though.
What I Did Today: Spent some time setting up the core interaction loop for the project. The goal was to make a text-based companion that listens to user input and reacts dynamically. How it Works: The program uses a continuous loop to prompt the user. It converts whatever they type into lowercase so it doesn’t get tripped up by typos or caps, then scans the text for specific triggers like “miserable” or “hungry” to send back a helpful, relevant reply. Next Steps: Looking into expanding the keyword vocabulary and handling unexpected inputs more smoothly! Also if anybody has ideas on what words should leave a customized message pls leave in comments, Thank You!! *
Today I made the entire project a loop to improve user experience. after user is done with their jokes/riddles/quotes I made it so they can choose to restart the code so they can do it from the beginning.
I updated my read me. AT first I didn’t know what a read me was as I am new to this so I used AI to make my read me, but now I updated it, I made it completely from scratch.
Right Now I am trying to make it so the code waits a few seconds before it says the answer of the joke/riddle. I still haven’t figured out how to do this, I might have to watch some videos on youtube.
Today I worked on building a breathing exercise to be part of my code. I made it so the code makes you do breathing exercises if you chose not to vent out your feelings. I also worked on changing my Github repo and pushing an executable . I didn’t know how to do this so it took me a while, But I figured it out and now it is perfect. I am planning on adding more joke/riddles and quotes to Motivator.
Today i fixed a few issues like fixing my github and making a better executable. the Code is now kinda like an app.
Ships:
Motivator is an interactive, command-line Python application designed to act as a digital sounding board and a mood booster. Built with a focus on user well-being and simple interactivity, the project serves a dual purpose: providing a safe, private space to express negative emotions and delivering instant, lighthearted entertainment to brighten the user’s day. Core Architecture & Workflow The application operates on a responsive decision-tree logic based on user input: The Greeting & Assessment: The program initiates a check-in, asking the user to evaluate their current emotional state. The “Good Day” Path (Positive Reinforcement): If the user is feeling well, the script triggers an endless amusement loop. It utilizes Python’s built-in random module to pull dynamic content from a curated array of classic riddles, logic puzzles, and lighthearted jokes—ensuring the user’s good mood is sustained. The “Bad Day” Path (Empathy & Venting): If the user indicates they are having a tough time, the application shifts to an empathetic tone. It opens an interactive text prompt, acting as a private journal where the user can freely type out and vent their frustrations. The Motivation Loop: Once the user finishes venting, the script transitions into a comforting support system, pulling timeless, inspiring quotes from historical figures and philosophers to offer perspective and encouragement.
I improved my project to include many more features like a breathing exercise....
|
1792828474.6598177
|
1792914874.6598177
|
|
2805
|
FPEeee by @Duck | Stardance
|
Duck
|
2
|
191.0
|
1850
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-24T04:30:31Z", "hours": 58.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is an updated version of my physics engine, using a new simulation method called XPBD! It was a bit challenging learning the basics of vector calculus, but it was worth it for the added flexibility of XPBD constraints and integration. I’m also really proud of getting OpenGL rendering working for some of the demos, because making an 3D renderer could be a project in and of itself! (Not this renderer though, it’s pretty barebones.) I’m especially happy with the cloth demo, with the best 3D rendering and (in my opinion) the best showcase of the engine’s features! (Also the least laggy of them all? I know why but it’s still kinda weird, being the most complex demo.) Writing it in C was a probably a bit harder than using a higher level language like C++, but being able to compile the entire project from source in less than two seconds on my machine was a big plus! I hope you enjoy playing with the physics demos! I worked really hard on this project!!", "repo": "https://github.com/duckdood/fpeeee", "demo": "https://duckdood.github.io/physics_demo"}, {"ship_num": 2, "ts": "2026-09-06T04:53:48Z", "hours": 133.0, "multiplier": 16.74, "payout": 1850, "blessing": "neutral", "text": "This is a position-based physics engine made all in C for portability and versatility. It had many challenging moments when making it, such as triangle collisions, spatial partitioning, performance optimization, and more, but I had a lot of fun building it, showing it off to my friends and family, and learning more about physics.", "repo": "https://github.com/duckdood/fpeeee", "demo": "https://duckdood.github.io/physics_demo"}]...
|
[{"post_id": 80800, "ts": "202 [{"post_id": 80800, "ts": "2026-10-18T20:26:33Z", "hours": 1.6025, "text": "Devlog #22 (I just realized that I accidentally did two devlog #15s but it’s too late now) Getting ready for another ship I edited some constraints to be more stable, edited the website to be a bit more clear of where the controls are if your screen is too small to fit them, and had a NIGHTMARE fiddling with ffmpeg to try and replace the video on the README to not be too laggy or low quality but also not too big. I also tried to do some performance optimizations for phones, but I couldn’t figure it out. This is the mp4 version animated WebP that I eventually got ffmpeg to spit out. For some reason animated WebPs don’t work in devlogs."}, {"post_id": 79264, "ts": "2026-10-13T08:10:35Z", "hours": 2.3019, "text": "Devlog #21 MERGING I’ve been rewriting a lot of the physics engine for XPBD (eXtended Position Based Dynamics) since the last ship, but on a separate branch so that if I broke anything too bad it wouldn’t show up on the website, but today I finally merged the xpbd branch into main. Sadly, it is a fair bit slower than the previous verlet integration (at least for my simple demos), but it’s a far more flexible integration and constraint scheme and I think the tradeoff is worth it. (I am a bit disappointed with the performance on the website though, I swear it was faster before I merged it! It’s a lot faster natively!)"}, {"post_id": 78023, "ts": "2026-10-09T07:13:56Z", "hours": 4.0489, "text": "Devlog #20 Another constraint, and another failed side project. Boundary constraint I added a constraint that I named a “boundary constraint”, that confines a particle to being on the specific side of a line e.g. making four lines around the edges of the screen and making sure the particle is on the side which is visible on screen. This is different from a wall because walls have two sides (and also zero thickness) which can cause a particle that’s going super fast to completely pass through to the other side of the wall in a single physics step, whereas with a boundary it will always snap it back to the correct side of the line. (If this was a bad explanation, I’m sorry). Failed lua integration I suppose the word ‘failed’ is a bit harsh in this scenario, I was just dipping my toes into integrating a little lua shell into the demos that would let you spawn particles and stuff programatically, but I decided it wasn’t worth it for small demos that aren’t meant to be super duper flexible anyway because they’re just meant to show off cool features the engine can do. throwing balls very quickly at the wall, which don’t clip through VVV"}, {"post_id": 75992, "ts": "2026-10-01T22:09:53Z", "hours": 10.0394, "text": "Devlog #19 Optimization and Interaction I’ve optimized the triangle collision code to use the spatial partitioning I implemented before for collisions. It goes through each triangle and checks what balls are in its bounding box with the collision grid, and completely skips any balls that aren’t close. This allows for about a thousand balls in a scene (at least on my computer), which is a lot better than the hundred or so you’d get with just bounding box checks and the tens or so you would get with a naive approach. Sadly, this change is only on the XPBD branch for now, meaning it won’t reflect on the website, but you’d still probably have to be spawning balls for a while for that to slow down, depending on the computer. I’ve also added far better interaction to the cloth, using some matrix multiplication and some raycast tests, you can now drag the cloth around with your mouse! This change was on the main branch too, so this is right on the website , right now! I did try to implement a system for having the cloth tear when it was under stress, but it would have required me to rework a lot of stuff and it didn’t quite work out. :("}, {"post_id": 74317, "ts": "2026-09-27T05:22:56Z", "hours": 11.4481, "text": "Devlog #18 Fluid simulation For a couple days I’ve been researching and trying to implement a PBF (position based fluid) fluid simulation, but there are barely any resources on the topic that I’ve been able to find, and the ones I have found are very math oriented with evil cryptic symbols that take a while to wrap my head around. The fluid simulation does work, but it’s much laggier, a lot finickier, and not a lot better (if at all better) than just chucking a couple thousand balls together and having them collide normally."}, {"post_id": 72994, "ts": "2026-09-24T05:51:47Z", "hours": 9.7506, "text": "Devlog #17 OpenGL integration I spend the last couple days integrating OpenGL rendering into a couple of the projects, meaning the graphics will be a lot better and rendered on the GPU instead of being rendered on the CPU, as well as speeding up the demos because even with the added visual complexity, the GPU is just so much faster at rendering! I made these changes of the main branch so that they would reflect on the website sooner, but git’s merge system is actually super good and it took no more than 15 minutes to merge the OpenGL rendering to the XPBD branch. I’ve only migrated over the cloth and fluid demos, but they’re the ones that needed it the most, and it’s not too hard to add it to more demos after I’ve had most of the OpenGL boilerplate implemented."}, {"post_id": 70439, "ts": "2026-09-19T06:17:10Z", "hours": 8.4, "text": "Devlog #16 I migrated the XPBD stuff to 3D and moved all the demos to work with it as well, not much interesting to talk about though. Here’s a demo of it working though"}, {"post_id": 66409, "ts": "2026-09-12T07:11:52Z", "hours": 10.2822, "text": "Devlog #15: Rebuilding because why not A bit before shipping, I heard about another physics method called XPBD (extended position based dynamics) that’s a lot more powerful and flexible, and I decided, after I would ship, I would try to convert my engine to that. I kinda have to remake almost all of the physics stuff I already made, but I can recycle a lot of the older code, just making it fit the new framework, and being a lot more educated about physics simulation stuff than when I started this project, it wasn’t too hard to rewrite some new stuff. Right now I have ported over my ball pit thingy, not a lot to show that’s different from old devlogs, but hey, it’s the inside that counts, right?"}, {"post_id": 62664, "ts": "2026-09-06T04:32:53Z", "hours": 6.1839, "text": "Devlog #15: shipping! Super small devlog, just editing the website and the README and stuff like that, really want to ship now! It just took a while to add messages to all the different demos and I may have tried a little bit of engine stuff but it just didn’t work out."}, {"post_id": 59457, "ts": "2026-09-01T10:01:32Z", "hours": 10.425, "text": "Devlog #14 I added edge detection for 3D triangles and other miscellaneous stuff, like improving the website, adding VSync to the demos, but that stuff’s boring so I’m just going to show off the new demo! It might be the coolest one so far, but it was one of the easiest to make. I’m planning on shipping real soon though, just wanna add a few things to the website and readme!"}, {"post_id": 56613, "ts": "2026-08-28T13:09:26Z", "hours": 10.6511, "text": "Devlog #13 I added triangle-walls which vertices are 3 dynamic spheres, which can collide with other particles and have all 4 particles update with their own velocities! This makes the engine a lot more flexible, so you don’t have to make big grids of spheres if you want to be able to have walls that can move, instead of being static. And it makes rigidbodies (probably) possible! (Press enter to spawn balls) Demo! This devlog is a bit long, sorry! I didn’t want to go too far over 10 hours like a did a couple devlogs ago. 2D 2D is, of course, simpler than 3D, and the length of the function for these walls definitely show that (~40 lines). I used the same algorithm to find the closest position on a line to another position as I used for detecting collisions on the edges of the static 3D walls a while ago. It gives you a lerpable value from from the first point to the second point of the line, and you can use that to find the point you are looking for. Comparing it to the circle you’re checking against, will give the distance and the normal of the collision. You can use that information to move the circle out of the wall, and push the wall away, using the value to lerp between as the ratio to push each of the points that the wall is made of away. 3D This function is a bit more complicated, being about 80 lines long, but a lot of the information in the 2D version is applicable here too. Here, instead of trying to find the closest point, we are trying to find the barycentric coordinates of the point, which is similar to the value to lerp between the two points in 2D, but for 3D (It’s basically just 3 numbers which tell you how close you are to each vertex of a triangle, and can describe any point on the triangle). This involves find the triangle’s area that you are checking against using the cross product, getting the distance of the point inward to the triangle for each edge, and calculating some inverse areas, which magically (not really) give you the barycentric coordinates. We then use these coordinates, as long as the distance to the triangle face using the dot product, to figure out whether the ball is colliding with the face, and if so, moving the ball outside of the triangle and moving the 3 vertices away as well, of course using each barycentric coordinate as a weight for how much to move each individual vertex. I haven’t implemented detections with the edges of the triangles exactly yet though, only the faces, but I will try to implement it soon!"}, {"post_id": 50030, "ts": "2026-08-19T01:48:43Z", "hours": 11.2506, "text": "Devlog #12 I improved the website to include multiple demos, and I made a couple improvements to the performance of the spatial partitioning detection, but I’ve mostly just been doing tinkering and testing with the engine some more."}, {"post_id": 31654, "ts": "2026-07-20T07:22:53Z", "hours": 7.2706, "text": "Devlog #11: Not a huge devlog, I’ve mostly been having fun with this little parachute demo I made! I definitely spent too much time just playing with it. I’ve also been experimenting a bit with multithreading, but it’s not in a stable or performant enough state right now to showcase. mp4 compression will hate this"}, {"post_id": 27421, "ts": "2026-07-12T23:48:38Z", "hours": 6.1297, "text": "Devlog #10: I ported the spatial partitioning to 3D! It’s definitely a lot laggier in the 3D environment, because it needs to check 3x the partitions per ball, but it’s still a lot better than having no spatial partitioning at all. One of the problems I encountered when transitioning to 3D was lag, but not in the expected “It’s going to be laggy when you have a lot of balls” way. For some strange reason, the framerate was still below 60 even when there were no balls in the world! It turned out to be an issue with needing to calloc a big region of memory everytime it would sort the balls into their partitions, but I was able to fix it by keeping the allocation throughout the lifetime of the partition grid. I also fixed it in the 2D version, even though it wasn’t really a problem there, it also wasn’t really a problem to fix either. (In the video you will notice the balls disappearing, the sample I whipped up for the devlog just automatically despawns balls when they leave the partitioning grid. Also some balls fly off when spawning, because sometimes the balls spawn inside one another) I’m getting a bit burnt out from this project though, I might ship after maybe adding multithreading, creating the README, and maybe making some more demos. I’ve been watching some videos on real rigidbody physics, and I want to try that out too!"}, {"post_id": 24090, "ts": "2026-07-07T13:02:59Z", "hours": 25.6289, "text": "Devlog #9: Intro I added spatial partitioning to the engine to speed up collisions when you have a lot of balls in a scene. Partitioning explanation Spatial partitioning is an optimization that divides the world into a grid, so balls only check other balls that are in close cells, instead of every ball checking all others, which is O(n^2). It seems pretty simple, but I tried 4 different ways before getting a good result. Judging by the time logged, I struggled. First Attempt (Dense grid) I first tried a naive implementation, which was making a big grid, with each cell having a list of pointers to balls that are in it. The problem is, each cell needs to have the total amount of balls that could be in it allocated. For the best performance, each grid cell should be the same size as a ball, and for the size I use here, you need the grid dimensions to be in the 100s. with 1000 balls, and with 64 bit pointers, you could have 1000 * 8 * 300 * 300 bytes allocated total, ~720 MB. You can get away with a lot less pointers, but that still wasn’t satisfying, or flexible. Second Attempt (Sparse grid) My second try was a grid, but you only store cells which have balls in them. This doesn’t solve the high number of pointers per cell, but it uses less cells overall. It should’ve been easier, but C doesn’t have any built in hashmaps. The physics code doesn’t use many libraries, and I didn’t want to rely on more, so I had the bright idea to make my own hashmap. It didn’t work and I gave up, and that was the end of the sparse grid. Third Attempt (Resizable arrays) The third attempt was like the first, but I decided to try allocating the memory on the fly, when balls moved around, but it didn’t work out. Working Attempt!! (Sorting) The most successful attempt was a grid, every cell is allocated, and yet, uses the least memory. Instead of storing pointers, each cell only stores two things: An offset and a length. Just indices into the ball array, which sounds easy, but then you realize - the balls are in a random order. To fix this, when updating the grid, you sort the balls into the cell they’re in. You may think that going into the dark cave of sorting is a bad idea, but here, it’s just a counting sort. Then it sets each cell’s fields, and you have your partitions. Detecting Collisions Collisions are easier than constructing the grid, you just check every ball, find its cell, check balls in close cells, then you’re done. Struggles There was a lot of friction with memory errors. To fix them, I learned GDB, and learnt about sanitizers, which detect lots of hard to catch memory errors. One time the program would randomly crash, and it was really hard to fix, but a sanitizer detected an easy out of bounds error when rendering. Not even a physics thing. :( Sorry!! Sorry for the long post, and the time it took me to post it, The devlog guide says to keep it short and post often, but I fell down a rabbit hole with optimizing, and was putting off writing as I knew it would be unwieldy in length. I haven’t implemented partitioning in 3d yet, but it should be easy to transfer over. It’s hard to see the balls in the video, but I want to keep the video smaller. It gets laggy in the video as well, but there are 7000 balls in the scene at the end, and I check collisions 15 times per frame, I am also recording too. Try it out If you read all the way down here, you might want to try the engine. I have a build on my pages , but it’s kinda slow on web. Click to attract P to set where the balls shoot to when spawned Enter to spawn balls Scroll to change spawn speed (at least until I change the demo). On some screens the simulation doesn’t show up until you click fullscreen. Sorry for weird wording, max devlog size is 4k characters."}, {"post_id": 13602, "ts": "2026-06-22T09:10:49Z", "hours": 9.5267, "text": "Devlog #8: I added a function that generates wheels (kinda lame), but I also added a GitHub action that automatically compiles and pushes my commits to my GitHub pages so now theres a web demo also i did just like a ton of testing and playing and stuff which is what pushed it to 9 hours"}, {"post_id": 11197, "ts": "2026-06-18T10:07:28Z", "hours": 12.275, "text": "Devlog 7: Finally added mass to the engine! Before now all the particles had the same mass (just implicitly, so basically all of them had a mass of 1), making the small ones super dense. Took so long because I had to migrate back to 2d in order to make sure the mass was working in 2d (everything was in 3d already so I actually added mass to 3d first), and had to update the 2d rendering for it to be able to render in 3d, but now everything (especially springs), is a lot cooler!"}, {"post_id": 7804, "ts": "2026-06-13T00:51:39Z", "hours": 3.5253, "text": "I added the shape generators back for 3d, now we have ✨ 3D cloth ✨!"}, {"post_id": 7351, "ts": "2026-06-12T08:09:41Z", "hours": 12.0594, "text": "Trying to move to 3D, finally got triangle-sphere collisions working the edges were by far the hardest part, the sphere-face collision actually wasn’t too hard the engine wasn’t built for walls to be able to move, but it can handle it semi fine (I’m just having rotating walls for the cool 3d showcase)"}, {"post_id": 3300, "ts": "2026-06-06T04:57:51Z", "hours": 5.0347, "text": "Added some functions that generate shapes for you, for example, cloth!"}, {"post_id": 2633, "ts": "2026-06-05T08:26:08Z", "hours": 1.5244, "text": "not that big but i migrated to the sdl callback system, so it works on emscripten now (can run in browser) ignore my screen recorder quality"}, {"post_id": 2039, "ts": "2026-06-04T10:12:11Z", "hours": 5.5597, "text": "got circle-circle collision working and with a lot of balls its a bit like a fluid cleaned up main.c as well too"}, {"post_id": 721, "ts": "2026-06-02T09:46:29Z", "hours": 5.7058, "text": "includes double pendulum for clout not actually accurate but looks fine it uses verlet integration and supports springs as well"}]...
|
Title: FPEeee by @Duck | Stardance
Devlogs:
inclu Title: FPEeee by @Duck | Stardance
Devlogs:
includes double pendulum for clout not actually accurate but looks fine it uses verlet integration and supports springs as well
got circle-circle collision working and with a lot of balls its a bit like a fluid cleaned up main.c as well too
not that big but i migrated to the sdl callback system, so it works on emscripten now (can run in browser) ignore my screen recorder quality
Added some functions that generate shapes for you, for example, cloth!
Trying to move to 3D, finally got triangle-sphere collisions working the edges were by far the hardest part, the sphere-face collision actually wasn’t too hard the engine wasn’t built for walls to be able to move, but it can handle it semi fine (I’m just having rotating walls for the cool 3d showcase)
I added the shape generators back for 3d, now we have ✨ 3D cloth ✨!
Devlog 7: Finally added mass to the engine! Before now all the particles had the same mass (just implicitly, so basically all of them had a mass of 1), making the small ones super dense. Took so long because I had to migrate back to 2d in order to make sure the mass was working in 2d (everything was in 3d already so I actually added mass to 3d first), and had to update the 2d rendering for it to be able to render in 3d, but now everything (especially springs), is a lot cooler!
Devlog #8: I added a function that generates wheels (kinda lame), but I also added a GitHub action that automatically compiles and pushes my commits to my GitHub pages so now theres a web demo also i did just like a ton of testing and playing and stuff which is what pushed it to 9 hours
Devlog #9: Intro I added spatial partitioning to the engine to speed up collisions when you have a lot of balls in a scene. Partitioning explanation Spatial partitioning is an optimization that divides the world into a grid, so balls only check other balls that are in close cells, instead of every ball checking all others, which is O(n^2). It seems pretty simple, but I tried 4 different ways before getting a good result. Judging by the time logged, I struggled. First Attempt (Dense grid) I first tried a naive implementation, which was making a big grid, with each cell having a list of pointers to balls that are in it. The problem is, each cell needs to have the total amount of balls that could be in it allocated. For the best performance, each grid cell should be the same size as a ball, and for the size I use here, you need the grid dimensions to be in the 100s. with 1000 balls, and with 64 bit pointers, you could have 1000 * 8 * 300 * 300 bytes allocated total, ~720 MB. You can get away with a lot less pointers, but that still wasn’t satisfying, or flexible. Second Attempt (Sparse grid) My second try was a grid, but you only store cells which have balls in them. This doesn’t solve the high number of pointers per cell, but it uses less cells overall. It should’ve been easier, but C doesn’t have any built in hashmaps. The physics code doesn’t use many libraries, and I didn’t want to rely on more, so I had the bright idea to make my own hashmap. It didn’t work and I gave up, and that was the end of the sparse grid. Third Attempt (Resizable arrays) The third attempt was like the first, but I decided to try allocating the memory on the fly, when balls moved around, but it didn’t work out. Working Attempt!! (Sorting) The most successful attempt was a grid, every cell is allocated, and yet, uses the least memory. Instead of storing pointers, each cell only stores two things: An offset and a length. Just indices into the ball array, which sounds easy, but then you realize - the balls are in a random order. To fix this, when updating the grid, you sort the balls into the cell they’re in. You may think that going into the dark cave of sorting is a bad idea, but here, it’s just a counting sort. Then it sets each cell’s fields, and you have your partitions. Detecting Collisions Collisions are easier than constructing the grid, you just check every ball, find its cell, check balls in close cells, then you’re done. Struggles There was a lot of friction with memory errors. To fix them, I learned GDB, and learnt about sanitizers, which detect lots of hard to catch memory errors. One time the program would randomly crash, and it was really hard to fix, but a sanitizer detected an easy out of bounds error when rendering. Not even a physics thing. :( Sorry!! Sorry for the long post, and the time it took me to post it, The devlog guide says to keep it short and post often, but I fell down a rabbit hole with optimizing, and was putting off writing as I knew it would be unwieldy in length. I haven’t implemented partitioning in 3d yet, but it should be easy to transfer over. It’s hard to see the balls in the video, but I want to keep the video smaller. It gets laggy in the video as well, but there are 7000 balls in the scene at the end, and I check collisions 15 times per frame, I am also recording too. Try it out If you read all the way down here, you might want to try the engine. I have a build on my pages , but it’s kinda slow on web. Click to attract P to set where the balls shoot to when spawned Enter to spawn balls Scroll to change spawn speed (at least until I change the demo). On some screens the simulation doesn’t show up until you click fullscreen. Sorry for weird wording, max devlog size is 4k characters.
Devlog #10: I ported the spatial partitioning to 3D! It’s definitely a lot laggier in the 3D environment, because it needs to check 3x the partitions per ball, but it’s still a lot better than having no spatial partitioning at all. One of the problems I encountered when transitioning to 3D was lag, but not in the expected “It’s going to be laggy when you have a lot of balls” way. For some strange reason, the framerate was still below 60 even when there were no balls in the world! It turned out to be an issue with needing to calloc a big region of memory everytime it would sort the balls into their partitions, but I was able to fix it by keeping the allocation throughout the lifetime of the partition grid. I also fixed it in the 2D version, even though it wasn’t really a problem there, it also wasn’t really a problem to fix either. (In the video you will notice the balls disappearing, the sample I whipped up for the devlog just automatically despawns balls when they leave the partitioning grid. Also some balls fly off when spawning, because sometimes the balls spawn inside one another) I’m getting a bit burnt out from this project though, I might ship after maybe adding multithreading, creating the README, and maybe making some more demos. I’ve been watching some videos on real rigidbody physics, and I want to try that out too!
Devlog #11: Not a huge devlog, I’ve mostly been having fun with this little parachute demo I made! I definitely spent too much time just playing with it. I’ve also been experimenting a bit with multithreading, but it’s not in a stable or performant enough state right now to showcase. mp4 compression will hate this
Devlog #12 I improved the website to include multiple demos, and I made a couple improvements to the performance of the spatial partitioning detection, but I’ve mostly just been doing tinkering and testing with the engine some more.
Devlog #13 I added triangle-walls which vertices are 3 dynamic spheres, which can collide with other particles and have all 4 particles update with their own velocities! This makes the engine a lot more flexible, so you don’t have to make big grids of spheres if you want to be able to have walls that can move, instead of being static. And it makes rigidbodies (probably) possible! (Press enter to spawn balls) Demo! This devlog is a bit long, sorry! I didn’t want to go too far over 10 hours like a did a couple devlogs ago. 2D 2D is, of course, simpler than 3D, and the length of the function for these walls definitely show that (~40 lines). I used the same algorithm to find the closest position on a line to another position as I used for detecting collisions on the edges of the static 3D walls a while ago. It gives you a lerpable value from from the first point to the second point of the line, and you can use that to find the point you are looking for. Comparing it to the circle you’re checking against, will give the distance and the normal of the collision. You can use that information to move the circle out of the wall, and push the wall away, using the value to lerp between as the ratio to push each of the points that the wall is made of away. 3D This function is a bit more complicated, being about 80 lines long, but a lot of the information in the 2D version is applicable here too. Here, instead of trying to find the closest point, we are trying to find the barycentric coordinates of the point, which is similar to the value to lerp between the two points in 2D, but for 3D (It’s basically just 3 numbers which tell you how close you are to each vertex of a triangle, and can describe any point on the triangle). This involves find the triangle’s area that you are checking against using the cross product, getting the distance of the point inward to the triangle for each edge, and calculating some inverse areas, which magically (not really) give you the barycentric coordinates. We then use these coordinates, as long as the distance to the triangle face using the dot product, to figure out whether the ball is colliding with the face, and if so, moving the ball outside of the triangle and moving the 3 vertices away as well, of course using each barycentric coordinate as a weight for how much to move each individual vertex. I haven’t implemented detections with the edges of the triangles exactly yet though, only the faces, but I will try to implement it soon!
Devlog #14 I added edge detection for 3D triangles and other miscellaneous stuff, like improving the website, adding VSync to the demos, but that stuff’s boring so I’m just going to show off the new demo! It might be the coolest one so far, but it was one of the easiest to make. I’m planning on shipping real soon though, just wanna add a few things to the website and readme!
Devlog #15: shipping! Super small devlog, just editing the website and the README and stuff like that, really want to ship now! It just took a while to add messages to all the different demos and I may have tried a little bit of engine stuff but it just didn’t work out.
Devlog #15: Rebuilding because why not A bit before shipping, I heard about another physics method called XPBD (extended position based dynamics) that’s a lot more powerful and flexible, and I decided, after I would ship, I would try to convert my engine to that. I kinda have to remake almost all of the physics stuff I already made, but I can recycle a lot of the older code, just making it fit the new framework, and being a lot more educated about physics simulation stuff than when I started this project, it wasn’t too hard to rewrite some new stuff. Right now I have ported over my ball pit thingy, not a lot to show that’s different from old devlogs, but hey, it’s the inside that counts, right?
Devlog #16 I migrated the XPBD stuff to 3D and moved all the demos to work with it as well, not much interesting to talk about though. Here’s a demo of it working though
Devlog #17 OpenGL integration I spend the last couple days integrating OpenGL rendering into a couple of the projects, meaning the graphics will be a lot better and rendered on the GPU instead of being rendered on the CPU, as well as speeding up the demos because even with the added visual complexity, the GPU is just so much faster at rendering! I made these changes of the main branch so that they would reflect on the website sooner, but git’s merge system is actually super good and it took no more than 15 minutes to merge the OpenGL rendering to the XPBD branch. I’ve only migrated over the cloth and fluid demos, but they’re the ones that needed it the most, and it’s not too hard to add it to more demos after I’ve had most of the OpenGL boilerplate implemented.
Devlog #18 Fluid simulation For a couple days I’ve been researching and trying to implement a PBF (position based fluid) fluid simulation, but there are barely any resources on the topic that I’ve been able to find, and the ones I have found are very math oriented with evil cryptic symbols that take a while to wrap my head around. The fluid simulation does work, but it’s much laggier, a lot finickier, and not a lot better (if at all better) than just chucking a couple thousand balls together and having them collide normally.
Devlog #19 Optimization and Interaction I’ve optimized the triangle collision code to use the spatial partitioning I implemented before for collisions. It goes through each triangle and checks what balls are in its bounding box with the collision grid, and completely skips any balls that aren’t close. This allows for about a thousand balls in a scene (at least on my computer), which is a lot better than the hundred or so you’d get with just bounding box checks and the tens or so you would get with a naive approach. Sadly, this change is only on the XPBD branch for now, meaning it won’t reflect on the website, but you’d still probably have to be spawning balls for a while for that to slow down, depending on the computer. I’ve also added far better interaction to the cloth, using some matrix multiplication and some raycast tests, you can now drag the cloth around with your mouse! This change was on the main branch too, so this is right on the website , right now! I did try to implement a system for having the cloth tear when it was under stress, but it would have required me to rework a lot of stuff and it didn’t quite work out. :(
Devlog #20 Another constraint, and another failed side project. Boundary constraint I added a constraint that I named a “boundary constraint”, that confines a particle to being on the specific side of a line e.g. making four lines around the edges of the screen and making sure the particle is on the side which is visible on screen. This is different from a wall because walls have two sides (and also zero thickness) which can cause a particle that’s going super fast to completely pass through to the other side of the wall in a single physics step, whereas with a boundary it will always snap it back to the correct side of the line. (If this was a bad explanation, I’m sorry). Failed lua integration I suppose the word ‘failed’ is a bit harsh in this scenario, I was just dipping my toes into integrating a little lua shell into the demos that would let you spawn particles and stuff programatically, but I decided it wasn’t worth it for small demos that aren’t meant to be super duper flexible anyway because they’re just meant to show off cool features the engine can do. throwing balls very quickly at the wall, which don’t clip through VVV
Devlog #21 MERGING I’ve been rewriting a lot of the physics engine for XPBD (eXtended Position Based Dynamics) since the last ship, but on a separate branch so that if I broke anything too bad it wouldn’t show up on the website, but today I finally merged the xpbd branch into main. Sadly, it is a fair bit slower than the previous verlet integration (at least for my simple demos), but it’s a far more flexible integration and constraint scheme and I think the tradeoff is worth it. (I am a bit disappointed with the performance on the website though, I swear it was faster before I merged it! It’s a lot faster natively!)
Devlog #22 (I just realized that I accidentally did two devlog #15s but it’s too late now) Getting ready for another ship I edited some constraints to be more stable, edited the website to be a bit more clear of where the controls are if your screen is too small to fit them, and had a NIGHTMARE fiddling with ffmpeg to try and replace the video on the README to not be too laggy or low quality but also not too big. I also tried to do some performance optimizations for phones, but I couldn’t figure it out. This is the mp4 version animated WebP that I eventually got ffmpeg to spit out. For some reason animated WebPs don’t work in devlogs.
Ships:
This is a position-based physics engine made all in C for portability and versatility. It had many challenging moments when making it, such as triangle collisions, spatial partitioning, performance optimization, and more, but I had a lot of fun building it, showing it off to my friends and family, and learning more about physics.
This is an updated version of my physics engine, using a new simulation method called XPBD! It was a bit challenging learning the basics of vector calculus, but it was worth it for the added flexibility of XPBD constraints and integration. I’m also really proud of getting OpenGL rendering working for some of the demos, because making an 3D renderer could be a project in and of itself! (Not this renderer though, it’s pretty barebones.) I’m especially happy with the cloth demo, with the best 3D rendering and (in my opinion) the best showcase of the engine’s features! (Also the least laggy of them all? I know why but it’s still kinda weird, being the most complex demo.) Writing it in C was a probably a bit harder than using a higher level language like C++, but being able to compile the entire project from source in less than two seconds on my machine was a big plus! I hope you enjoy playing with the physics demos! I worked really hard on this project!!...
|
1792846081.7022202
|
1792932481.7022202
|
|
2894
|
TariqGPT Website by @yumorange | Stardance
|
yumorange
|
2
|
16.0
|
77
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-07T21:17:40Z", "hours": 14.0, "multiplier": 4.59, "payout": 65, "blessing": "neutral", "text": "Tariq’s progress has come another step further! We’re trying new ways of developing the model to make him faster, which has been challenging due to model keys being stupidly hard with pytorch. If you want to get the full out of testing tariq, you should know these things: Tokens - They control how many characters/words tariq is able to use, in a sense, a token equals 1 of anything in his vocabulary Temp - controls tariq’s probabilities, how often he will decide against his training data, a good number for this is 0.8. saving - Although there is sessions, saving is not automatic, you must locally save your tariq conversations- and hey if you get a funny conversation, maybe share it with others!", "repo": "https://github.com/orangeTasteYummers/TariqGPTWebsite", "demo": "https://tariqgpt.duckdns.org"}, {"ship_num": 2, "ts": "2026-06-03T19:47:51Z", "hours": 2.0, "multiplier": 4.97, "payout": 12, "blessing": "neutral", "text": "Tariq Website that contains info on Tariq and allows you to talk to his models! (Models made by me and @poopypants on github). AI was used ONLY for help during debugging, helping to set up model_interpreter, and for info on different way to implement something I didn’t already know how to do.", "repo": "https://github.com/orangeTasteYummers/TariqGPTWebsite", "demo": "https://tariqgpt.duckdns.org"}]...
|
[{"post_id": 24348, "ts": "202 [{"post_id": 24348, "ts": "2026-07-07T21:11:21Z", "hours": 2.1144, "text": "More fixing again we tried to fix the next tt model, but yet again model keys screw me over and now I have to figure that out, regardless it’s really close to coming together and I’m just going to ship the project for now since so much has been done since the first ship anyway."}, {"post_id": 13905, "ts": "2026-06-22T20:03:16Z", "hours": 1.68, "text": "UI Update I moved the bot settings into a menu, which you can open by pressing the “settings” button above the input box. (volume temp tokens etc.) Fixed some major bugs that happen during first time set up, and fixed that weird bug for creating new sessions where the exp time was undefined/null. Overall not a whole lot but I really like how this looks on mobile now!"}, {"post_id": 9470, "ts": "2026-06-15T20:30:05Z", "hours": 6.5061, "text": "This update was really not that much for what I did. I decided to add session keys with cookies on the website, just incase for features later when this gets pushed as a mobile app or other format, it also tracks data like device type. I used SQLite for my db, and it was very fun to setup and make work with my server! sessions last 3 days and I plan to do SOMETHING with this in the future, especially when I start working in xcode on my macbook. Quick list of what I did: even MORE ui fixes Sessions that last 3 days (also tracks device type) Sqlite sessions.db so i can add data on users. Added a single fact to tariq Quick list of what I wanna do: Add a settings button instead of the cluttered menu above the text bar Update the readme to be a little more detailed and maybe have better instructions. New page? MAYBE add limited chat saving online for the published site? Below is an example session row: (ip will be changed to local location most likely or local location will be added ex: united states or canada)"}, {"post_id": 5210, "ts": "2026-06-08T22:22:01Z", "hours": 1.1786, "text": "Tariq GPT update I’m proud to say I was able to really quickly make the ui accessible to all devices with access to a network and browser without weird visual bugs! This should have been done sooner but I procrastinated it and I finally did it today and it was really easy, here are the changes: changed sizing for elements to fix overflow on mobile made side bar a collapsible overlay instead of part of the container flex fixed button icons to do: Fix Tsundere Tariq"}, {"post_id": 2452, "ts": "2026-06-04T23:03:47Z", "hours": 2.7497, "text": "Tariq GPT changes Updated Info page with a fun facts section (with a refresh button), and a “how it started” section (to be written still) Changed volume bar not to go crazy for no reason Changed volume bar’s appearance Tariq will no long speak automatically Added more css animations Changed some text to tabler icons Things to fix/add: Tsundere tariq 1.1 is bugged as hell so he isn’t up there right now. Make the website work well on mobile Make the side bar collapsable"}, {"post_id": 1653, "ts": "2026-06-03T19:43:19Z", "hours": 1.3117, "text": "Finished styling about page and added back button. I also added new entries."}, {"post_id": 1166, "ts": "2026-06-03T00:39:49Z", "hours": 1.1025, "text": "added tusndere tariq, started on info page (some info was added but no css) and fixed a lot of stuff wrong with github"}]...
|
Title: TariqGPT Website by @yumorange | Stardance
Title: TariqGPT Website by @yumorange | Stardance
Devlogs:
added tusndere tariq, started on info page (some info was added but no css) and fixed a lot of stuff wrong with github
Finished styling about page and added back button. I also added new entries.
Tariq GPT changes Updated Info page with a fun facts section (with a refresh button), and a “how it started” section (to be written still) Changed volume bar not to go crazy for no reason Changed volume bar’s appearance Tariq will no long speak automatically Added more css animations Changed some text to tabler icons Things to fix/add: Tsundere tariq 1.1 is bugged as hell so he isn’t up there right now. Make the website work well on mobile Make the side bar collapsable
Tariq GPT update I’m proud to say I was able to really quickly make the ui accessible to all devices with access to a network and browser without weird visual bugs! This should have been done sooner but I procrastinated it and I finally did it today and it was really easy, here are the changes: changed sizing for elements to fix overflow on mobile made side bar a collapsible overlay instead of part of the container flex fixed button icons to do: Fix Tsundere Tariq
This update was really not that much for what I did. I decided to add session keys with cookies on the website, just incase for features later when this gets pushed as a mobile app or other format, it also tracks data like device type. I used SQLite for my db, and it was very fun to setup and make work with my server! sessions last 3 days and I plan to do SOMETHING with this in the future, especially when I start working in xcode on my macbook. Quick list of what I did: even MORE ui fixes Sessions that last 3 days (also tracks device type) Sqlite sessions.db so i can add data on users. Added a single fact to tariq Quick list of what I wanna do: Add a settings button instead of the cluttered menu above the text bar Update the readme to be a little more detailed and maybe have better instructions. New page? MAYBE add limited chat saving online for the published site? Below is an example session row: (ip will be changed to local location most likely or local location will be added ex: united states or canada)
UI Update I moved the bot settings into a menu, which you can open by pressing the “settings” button above the input box. (volume temp tokens etc.) Fixed some major bugs that happen during first time set up, and fixed that weird bug for creating new sessions where the exp time was undefined/null. Overall not a whole lot but I really like how this looks on mobile now!
More fixing again we tried to fix the next tt model, but yet again model keys screw me over and now I have to figure that out, regardless it’s really close to coming together and I’m just going to ship the project for now since so much has been done since the first ship anyway.
Ships:
Tariq Website that contains info on Tariq and allows you to talk to his models! (Models made by me and @poopypants on github). AI was used ONLY for help during debugging, helping to set up model_interpreter, and for info on different way to implement something I didn’t already know how to do.
Tariq’s progress has come another step further! We’re trying new ways of developing the model to make him faster, which has been challenging due to model keys being stupidly hard with pytorch. If you want to get the full out of testing tariq, you should know these things: Tokens - They control how many characters/words tariq is able to use, in a sense, a token equals 1 of anything in his vocabulary Temp - controls tariq’s probabilities, how often he will decide against his training data, a good number for this is 0.8. saving - Although there is sessions, saving is not automatic, you must locally save your tariq conversations- and hey if you get a funny conversation, maybe share it with others!...
|
1792849941.2180912
|
1792936341.2180912
|
|
3252
|
Movieslay Emerald by @Gavin | Stardance
|
Gavin
|
2
|
42.0
|
598
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-12T19:51:34Z", "hours": 14.0, "multiplier": 16.53, "payout": 226, "blessing": "neutral", "text": "Watch all your favorite media free today with Movieslay. Unlike many other shady platforms, Movieslay guarantees zero ads or popups, hundreds of stream sources aggregated across a network of providers, and raw direct downloads.", "repo": "https://gitlab.com/gavingogaming/movieslay-emerald-temp", "demo": "https://movieslay.com/"}, {"ship_num": 2, "ts": "2026-07-21T01:58:32Z", "hours": 28.0, "multiplier": 13.86, "payout": 372, "blessing": "neutral", "text": "Movieslay is an all-in-one content streaming platform - bundled with integrations for 30+ providers & partners, and completely ad-free & open source.", "repo": "https://gitlab.com/gavingogaming/movieslay-emerald-temp", "demo": "https://movieslay.com/"}]...
|
[{"post_id": 66855, "ts": "202 [{"post_id": 66855, "ts": "2026-09-12T19:48:05Z", "hours": 3.5042, "text": "Completely re-did stream checker. Sources for a particular TV or Movie are now ran through a robust content validator that ensures each link is playable & has the correct content, or filters it to Backup (playable but bad content) or Invalid (non playable, hidden by default). Each source now shows much more info as well, as the checker returns the media type (HLS or MP4), quality (4k to 240p), resolution, and duration. Picking exactly which source you want is much easier now. With these changes, each piece of media is nearly guaranteed to load on the first try."}, {"post_id": 50017, "ts": "2026-08-19T01:23:22Z", "hours": 1.9758, "text": "Made content streams in HLS (.m3u8) format only run through HLS.js if on a non-Apple system as Apple devices (and AirPlay) support .m3u8 playlists directly. Also added a dedicated cast button for content casting with Google Cast SDK, AirPlay/WebKit, and native device casting. Finally, added an exclusive page at /exclusives/btsv for the ‘leaked’ unfinished Beyond the Spider Verse trailer."}, {"post_id": 43512, "ts": "2026-08-08T20:34:42Z", "hours": 0.2586, "text": "Minor UI fixes - expanded the video player to take up all available height (this works now that the footer/warning banner is moved to the external players menu), and fixed padding on page content."}, {"post_id": 42428, "ts": "2026-08-07T03:47:58Z", "hours": 0.7892, "text": "TMDB collections support! This feature allows movies in a series (ex. Spider-Verse trilogy) to have a next/previous button similar to TV shows. If you’re trying to bingewatch a series of movies this feature can help you out :) Currently just shows the top TMDB collection (based on a movie’s ‘belongs_to_collection’ tag)"}, {"post_id": 40440, "ts": "2026-08-03T23:13:46Z", "hours": 1.7847, "text": "Updated UI for info displays on content pages as well as overall padding and rounding"}, {"post_id": 37939, "ts": "2026-07-30T23:34:40Z", "hours": 3.15, "text": "Worked on tons of brand new sources (including VylaSDK), moved 3rd-party players to a separate menu, fixed tons of player bugs"}, {"post_id": 32829, "ts": "2026-07-22T07:06:42Z", "hours": 2.2064, "text": "added live cable TV networks"}, {"post_id": 32119, "ts": "2026-07-21T01:53:46Z", "hours": 1.2044, "text": "Started work on Movieslay Pley for watchOS (project Odys). Pley is an app suite to let you access direct content in native ways without the regular Movieslay player & ui. Attached screenshots are directly from watchOS on a Watch SE (1st gen)."}, {"post_id": 31702, "ts": "2026-07-20T09:58:15Z", "hours": 3.2036, "text": "With the addition of stremIO addon support (HDHub, Nebula, and Pengu), fixing vyla/flicky/videasy/xpass/lordflix, and adding FEB file host support into exclusives, we’re back up to an insane amount of source grabs on popular titles like Backrooms."}, {"post_id": 23705, "ts": "2026-07-06T20:16:44Z", "hours": 3.2283, "text": "Research for new sources, better mobile navigation, organize source wrappers, and improve the Vyla first-come-first-serve route"}, {"post_id": 21743, "ts": "2026-07-03T20:38:17Z", "hours": 2.8972, "text": "New backup player (Vyla), Backrooms iNTERNAL rip, overrideSource option in player for non-tmdb, fix vidlink & remove nomorflix"}, {"post_id": 16749, "ts": "2026-06-27T06:29:30Z", "hours": 1.7714, "text": "Introduced new Movieslay Exclusive for The Oldest View ( @project .rolling.giant on instagram), fixed Passthru proxy to work on production via fly.io. Oh also we now have Backrooms in great quality from Vidlink primary :)"}, {"post_id": 14939, "ts": "2026-06-24T08:35:03Z", "hours": 0.5364, "text": "Introduced a new server-side proxy that adds headers over m3u8s to make tons of urls that were previously thrown away due to 403s work."}, {"post_id": 14910, "ts": "2026-06-24T06:42:33Z", "hours": 7.7275, "text": "6 new sources, fixed AE & 123anime using an anime database, airplay cast-to-TV support on iOS, full support android app, settings menu with volume, playback speed, keybinds, and sorted streams into guarenteed working ones (GET & HEAD request checks, proxied) and unreliable backups (direct urls, did not pass checks)"}, {"post_id": 7353, "ts": "2026-06-12T08:12:35Z", "hours": 3.3936, "text": "Two new sources, anime mappings between TMDB ids and 10 other anime API’s ids, as well as a WIP extractor of movieslay content built in to yt-dlp."}, {"post_id": 3280, "ts": "2026-06-06T04:16:32Z", "hours": 3.5922, "text": "Added volume slider from 0%-200% as well as magnet downloads (direct files openable in qBitTorrent or any bittorrent client) & mkv/mp4 file downloads from non-HLS provider results."}]...
|
Title: Movieslay Emerald by @Gavin | Stardance
De Title: Movieslay Emerald by @Gavin | Stardance
Devlogs:
Added volume slider from 0%-200% as well as magnet downloads (direct files openable in qBitTorrent or any bittorrent client) & mkv/mp4 file downloads from non-HLS provider results.
Two new sources, anime mappings between TMDB ids and 10 other anime API’s ids, as well as a WIP extractor of movieslay content built in to yt-dlp.
6 new sources, fixed AE & 123anime using an anime database, airplay cast-to-TV support on iOS, full support android app, settings menu with volume, playback speed, keybinds, and sorted streams into guarenteed working ones (GET & HEAD request checks, proxied) and unreliable backups (direct urls, did not pass checks)
Introduced a new server-side proxy that adds headers over m3u8s to make tons of urls that were previously thrown away due to 403s work.
Introduced new Movieslay Exclusive for The Oldest View ( @project .rolling.giant on instagram), fixed Passthru proxy to work on production via fly.io. Oh also we now have Backrooms in great quality from Vidlink primary :)
New backup player (Vyla), Backrooms iNTERNAL rip, overrideSource option in player for non-tmdb, fix vidlink & remove nomorflix
Research for new sources, better mobile navigation, organize source wrappers, and improve the Vyla first-come-first-serve route
With the addition of stremIO addon support (HDHub, Nebula, and Pengu), fixing vyla/flicky/videasy/xpass/lordflix, and adding FEB file host support into exclusives, we’re back up to an insane amount of source grabs on popular titles like Backrooms.
Started work on Movieslay Pley for watchOS (project Odys). Pley is an app suite to let you access direct content in native ways without the regular Movieslay player & ui. Attached screenshots are directly from watchOS on a Watch SE (1st gen).
added live cable TV networks
Worked on tons of brand new sources (including VylaSDK), moved 3rd-party players to a separate menu, fixed tons of player bugs
Updated UI for info displays on content pages as well as overall padding and rounding
TMDB collections support! This feature allows movies in a series (ex. Spider-Verse trilogy) to have a next/previous button similar to TV shows. If you’re trying to bingewatch a series of movies this feature can help you out :) Currently just shows the top TMDB collection (based on a movie’s ‘belongs_to_collection’ tag)
Minor UI fixes - expanded the video player to take up all available height (this works now that the footer/warning banner is moved to the external players menu), and fixed padding on page content.
Made content streams in HLS (.m3u8) format only run through HLS.js if on a non-Apple system as Apple devices (and AirPlay) support .m3u8 playlists directly. Also added a dedicated cast button for content casting with Google Cast SDK, AirPlay/WebKit, and native device casting. Finally, added an exclusive page at /exclusives/btsv for the ‘leaked’ unfinished Beyond the Spider Verse trailer.
Completely re-did stream checker. Sources for a particular TV or Movie are now ran through a robust content validator that ensures each link is playable & has the correct content, or filters it to Backup (playable but bad content) or Invalid (non playable, hidden by default). Each source now shows much more info as well, as the checker returns the media type (HLS or MP4), quality (4k to 240p), resolution, and duration. Picking exactly which source you want is much easier now. With these changes, each piece of media is nearly guaranteed to load on the first try.
Ships:
Movieslay is an all-in-one content streaming platform - bundled with integrations for 30+ providers & partners, and completely ad-free & open source.
Watch all your favorite media free today with Movieslay. Unlike many other shady platforms, Movieslay guarantees zero ads or popups, hundreds of stream sources aggregated across a network of providers, and raw direct downloads....
|
1792831808.3375144
|
1792918208.3375144
|
|
3268
|
Orbit crash by @benMakesStuff | Stardance
|
benMakesStuff
|
2
|
10.0
|
46
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-23T23:50:12Z", "hours": 2.0, "multiplier": 2.32, "payout": 4, "blessing": "neutral", "text": "I added better physics and updated the project and added a title too, and physics for the obstacles too, and gravity waves (*5 gravity every 30-100 secs)", "repo": "https://github.com/benvelzul/Orbit-Crash", "demo": "https://benvelzul.itch.io/orbit-crash"}, {"ship_num": 2, "ts": "2026-07-17T21:23:58Z", "hours": 8.0, "multiplier": 5.34, "payout": 42, "blessing": "neutral", "text": "I made a game that only uses one key to be played. It was really challenging having to learn Godot in one week because i wantd to get my game in OneKey. The game is a space game that you are being pulled by a black hole’s gravity while some asteroids and space debris are foating around. BTW you use your mouse to have a direction. Also, im really sorry for not posting any other devlogs or having better screenshots, i kinda forgot and was only thinking in finishing.", "repo": "https://github.com/benvelzul/Orbit-Crash", "demo": "https://benvelzul.itch.io/orbit-crash"}]...
|
[{"post_id": 31557, "ts": "202 [{"post_id": 31557, "ts": "2026-07-20T01:50:15Z", "hours": 1.7436, "text": "I added better gravity physics, shooting (so you can destroy space debris), and gravity for obstacles too, a better title, and gravity waves (x5 gravity for 10 seconds every so and so)"}, {"post_id": 30383, "ts": "2026-07-17T21:17:40Z", "hours": 8.1242, "text": "I made the game and it works now and yes it looks as one of the best games i have ever made. Sorry i didnt post many devlogs but i just put all my effort to finish it before OneKey ended."}]...
|
Title: Orbit crash by @benMakesStuff | Stardance
Title: Orbit crash by @benMakesStuff | Stardance
Devlogs:
I made the game and it works now and yes it looks as one of the best games i have ever made. Sorry i didnt post many devlogs but i just put all my effort to finish it before OneKey ended.
I added better gravity physics, shooting (so you can destroy space debris), and gravity for obstacles too, a better title, and gravity waves (x5 gravity for 10 seconds every so and so)
Ships:
I made a game that only uses one key to be played. It was really challenging having to learn Godot in one week because i wantd to get my game in OneKey. The game is a space game that you are being pulled by a black hole’s gravity while some asteroids and space debris are foating around. BTW you use your mouse to have a direction. Also, im really sorry for not posting any other devlogs or having better screenshots, i kinda forgot and was only thinking in finishing.
I added better physics and updated the project and added a title too, and physics for the obstacles too, and gravity waves (*5 gravity every 30-100 secs)...
|
1792846181.310201
|
1792932581.310201
|
|
3519
|
Name That Nation by @brlin888 | Stardance
|
brlin888
|
2
|
19.87
|
262
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-17T21:15:15Z", "hours": 1.0, "multiplier": 7.33, "payout": 6, "blessing": "neutral", "text": "Hi everyone or whoever is reviewing this ship! This is my #2 ship for NameThatNation. To recap, NameThatNation is a game that allows the user to learn more about different countries through answering questions. Overall, for these couple of hours I continued to work on this project. Based on the comments from the people that reviewed on my last ship, I mainly worked on organizing the images in my panels better and adjusting the panels to be more visually appealing. If you want a better experience while playing the game, make sure to check out the settings panel where you can customize your gaming experience. For this ship, I recreated the images in my panels so that they fit the game better, so I am proud so say there was NO AI used in creating any of the images! Just a note that if you want to check out this game, make sure to go to releases or click on the “try project” button which will direct you towards the github releases. Ensure that you have download Java JDK because this entire project is coded entirely in JAVA which is an extremely technical language, so organization wise and how this game works is limited to some extent (harder to organize because need to manually run and check program each time to ensure object is placed where you want it to be and components are have a limited size by Java). Hope you have fun reviewing my ship!", "repo": "https://github.com/brlin888-create/Name-That-Nation", "demo": "https://github.com/brlin888-create/Name-That-Nation/releases/tag/v1.0.0"}, {"ship_num": 2, "ts": "2026-09-27T23:51:25Z", "hours": 18.0, "multiplier": 14.44, "payout": 256, "blessing": "neutral", "text": "Hi all, this is my ship for Name That Nation! Name That Nation is a game I thought of that tests and trains a person’s ability of naming countries based on the shape of the country (all 198 countries). The game is made completely using Java, all coded line by line, with some images being AI generated. The most challenging part of this project was actually making sure the project worked, because Java is a really technical language. One missing semicolon, and you have to go back and manually fix it. Additionally, since there are a lot of JButtons and components I had to add, the formatting depended on individually testing and organizing in order for the project to look visually aesthetic. Lastly, one of the biggest challenges was reading/writing from multiple files, since there was hundreds of country image files I had to organize, as well as ensuring that each country was actually accounted for. Overall, the testing through each individual panel allowed me to slowly build up this project as a whole. One interesting thing I added was incorporating powerups and achievements, that would incentive players to continuously play to achieve a higher score. Players can customize their gaming experience on background color, font size, difficulty, etc. in the settings panel. There are hints present, a timer present, and three lives, but by utilizing the powerups, this will boost the scores an individual can set. After gameplay, players can see what they scored wrong on, save their score to the txt file which includes (and sorts) all names, as well as see what achievements they have accomplished. This pretty much sums up my project as a whole, over 20+ hours (from image downloads to testing which was not accounted for in the Hackatime hours) as well as over 2400 lines of code. Hope whoever is reading this enjoys this project!!!", "repo": "https://github.com/brlin888-create/Name-That-Nation", "demo": "https://github.com/brlin888-create/Name-That-Nation/releases/tag/v1.0.0"}]...
|
[{"post_id": 81153, "ts": "202 [{"post_id": 81153, "ts": "2026-10-20T03:59:17Z", "hours": 0.8692, "text": "Hi everyone, i am continuing to build on my project for NameThatNation! Mainly this time focusing on organization for website as well as implementing more features and polishing my readme! also if any of you guys know when a manuel review submission for a ship will get approved, please let me know!"}, {"post_id": 78454, "ts": "2026-10-10T20:37:00Z", "hours": 0.2667, "text": "Hi all, My project got rejected again… for using AI assets. After changing the images on canva and ensuring the game still works, hopefully this time my ship will go through. If you guys want to see the new changes made to my project, feel free to check out the github for Name That Nation. Hopefully @Amu or other shipwrights will consider these new changes made as it took me over 2 hrs+ to find images and individually change the assets that were AI generated. So now I am happy to say my project does not use a single AI generated image!"}, {"post_id": 77989, "ts": "2026-10-09T03:57:33Z", "hours": 0.3039, "text": "Hi all, I have made a few changes for my project in order to fulfill the shipping request so hopefully whoever reviews my ship takes this into consideration @Jack_ . Just some further instructions on how to run my code: since I am using java in my project especially libraries that call for java JFrame and JPanel, java must be INSTALLED on the device for whoever is playing the game. In my github releases, I have updated with more clear instructions on how to download java JDK based on your device, then compiling my code. This is the only way, as converting into an executable still won’t run the code as whoever has the code doesn’t have the java libraries specific for my game pre-loaded. Thank you for reading this and hopefully my ship goes through successfully (I haven’t gotten an update in like 5 days…)!"}, {"post_id": 75771, "ts": "2026-10-01T01:34:52Z", "hours": 0.255, "text": "Hi all, I thought my project would be finished but apparently there were some issues with shipping the project. To whoever is reading this or people that judge ships, I have edited my github to have a releases zip file which can be downloaded to test out my game. You may still see the youtube video still attached for my game demo, but you can now try out the game yourself in github by retrieving the required assets. Additionally, I added more clear instructions and descriptions on NameThatNation and its properties. Hopefully you guys go check it out and take into consideration when evaluating my ship!"}, {"post_id": 74676, "ts": "2026-09-27T23:41:08Z", "hours": 0.3425, "text": "Hi all, This will be the last devlog for Name That Nation. I am so excited for you guys to see what I have been able to accomplish throughout the summer. Since NameThatNation is coded in Java completely, it CANNOT be converted into a website. I have attached a video (took 2 hours to edit) to demonstrate how the game can be played, as well as attached the source code in github. The reason that it cannot be made into a website is that it reads and writes through specific files that is not possible on a website. Additionally, Java JPanel and JFrame is not compatible with websites, meaning that I would have to code the entire game again in another programming language in order for the game to function. Today I placed my finishing touches such as incorporating the achievements panel and added final touches/testings for the entire game. This game took over 20+ hours (not shown through Hackatime) because there was more time spent on individually downloading all 198 country images and organizing files to include all countries but maintain functionality. I hope this project finds you well and thanks for those that have been following along the journey!!! Hope you guys like my project!!!"}, {"post_id": 74328, "ts": "2026-09-27T05:36:03Z", "hours": 2.78, "text": "NameThatNation!!! Hi all, for those that have been following along, there has been significant progress throughout the game. I have finally been able to get the gamepanel to work. I added powerups and different features such as lives count, hints, and changing colors on JButtons which utilizes a button listener to detect if the button clicked is correct. Although this may look simple, this project has taken me over several hours to what you see today. Java is an easy language to learn, but to implement it to this level is extremely hard, as image reading, file reading, JButtons, JCheckboxes, etc. are extremely technical and one wrong step will cause the entire program to not function. Tomorrow, I will finish the last panels which are the Achievements panel, and leaderboard panels. After that I will, post a demo of the project (as java is not compatible with online user websites and I am using read/write from files), and do my final commit before I ship my project!!! Thank you for those that have been following along!"}, {"post_id": 68387, "ts": "2026-09-15T01:24:48Z", "hours": 0.5231, "text": "What is up everyone! If you haven’t checked my last devlog, my main issue is still converting my code to a website or mainly a way for you guys to play the game without downloading the source code. I add some improvements to the game, fixing a JButton error because all of the buttons kept on lighting up when I didn’t click any of them. I also added more countries to the country info panel, so I’m pretty sure I have all 198 countries for now in the game. Next up is still fixing the website issue and adding to the game! Stay tuned for more!!!!!!!!!!!!!!"}, {"post_id": 66733, "ts": "2026-09-12T16:56:45Z", "hours": 6.6714, "text": "I know I haven’t posted a dev log for a long time… but here is it after 2 months and what I have been working on!!! After completely the country info and instructions panel, I started to work on the game panel which was definitely one of the hardest panels to complete. This is because working in Java JFrame/JPanel requires a lot of technical code to allow buttons to be clicked and change color when an answer choice is correct. Other than this, I had to download EVERY SINGLE COUNTRY’s image and add it to a folder which took over 2 hours to do (not included in the 6 hours) because I couldn’t find a website that had all of them. Other than that, the project is going extremely smoothly and I am currently working on adding different powerups that can aid the person playing the game. My only concern is converting this JFrame/JPanel game onto a demo website because the game is currently reading files from on my computer such as the images and files for instructions etc. If you guys have any suggestions, please feel free to leave it in the chat!"}, {"post_id": 25118, "ts": "2026-07-09T03:48:31Z", "hours": 0.6564, "text": "Continued to work on the project! Short Dev Log Today! finished settings and still working on instructions panel started working on game panel game hard to implement need to locate specific coordinates follow for more!"}, {"post_id": 23809, "ts": "2026-07-06T23:37:24Z", "hours": 2.2889, "text": "Hey everyone! It’s been a massive day of coding on NameThatNation. If you’ve been following along, you know the goal: a game where you look at maps/images and guess the country before the timer runs out. Today, I wired up the core skeleton for the Settings Panel, Country Info Panel, and initialized the beast that is the Game Panel. Here is exactly what went down today: The Settings Panel: I wanted players to be able to customize their UI, but things got a little chaotic in the grid layouts. The RGB Sliders: Added JSlider controls for Red, Green, and Blue. Players can dynamically alter the theme color (info.setColor). The Continents Customization: Implemented checkboxes for all 7 continents. But I had to add a hard rule in the ButtonListener: You must choose at least 3 continents before you can leave. Why? Because guessing between just the USA and Canada is too easy everyone is going to get it right… Image Size Scrollbar: Added a JScrollBar allowing players to scale the image sizes. Scroll down or up. Difficulty JMenu: A nice dropdown menu (Font.BOLD, 30) to swap between Easy, Medium, and Hard. Current Visual Bug: The continent checkboxes currently text-render in a terrifying new Color(183, 9, 9) (deep blood red) alongside a red warning label. The Country Info Panel: Players need a place to study up, so I built the CountryInfoPanel. It utilizes a try-catch block inside a custom fileIn() method to read a massive text file: countriesContinentHard.txt. It dumps all that text into a non-editable, word-wrapping JTextArea wrapped in a JScrollPane so you can scroll through hundreds of countries. The Aesthetic: On the left side, it renders a nice big sprite of planet Earth (Earth.png), while the data scrolls smoothly on the right. The Game Panel (The Brain of the Operation) Finally, I started prototyping the actual gameplay panel. It’s not fully rendered yet, but the logic infrastructure is going to be a lot! I will continue to work on this panel this week and make sure to follow along the game making!!!"}, {"post_id": 21667, "ts": "2026-07-03T19:03:46Z", "hours": 1.4492, "text": "Dev Log: Name That Nation Implementation of Core UI Panels (Start, Instructions, & Settings) Overview: Successfully built and structured the primary navigational and configuration panels for NameThatNation. Implemented Java Swing components across three core areas: the StartPanel (handling user onboarding and core navigation), the InstructionsPanel (displaying gameplay mechanics in a scrollable format), and the SettingsPanel (giving users control over gameplay parameters like difficulty, map sizes, background colors, and continent selection). Key Implementations: StartPanelUser Onboarding: Added a JTextField for name entry along with strict data validation. If the field is empty or left as default, a warning message (noName JLabel) triggers in red text, blocking gameplay progression. Animated Background: Integrated a javax.swing.Timer alongside a modified paintComponent method to alternate every 0.5 seconds between three unique world images (World1.png to World3.png), creating a smooth looping animation of a rotating Earth.CardLayout Navigation: Configured centralized action listeners (buttons and exitListener) to pass state data to the parent container, cleanly swapping panels or closing the application altogether. InstructionsPanelLayout & Scrolling: Used a BorderLayout to organize an informative overview of rules, score tallies, powerups, and level details. Scroll Mechanics: Embedded a heavy block of instruction text into a non-editable JTextArea wrapped in a JScrollPane, forcing explicit vertical navigation while keeping horizontal scrolling locked. Visual Assets: Overlaid a game preview snapshot (Game.png) on top of a custom backdrop image to give players context before starting. SettingsPanelRGB Customization: Implemented three distinct JSlider inputs (Red, Green, Blue) bound to a ColorHandler listener. This updates the player’s canvas background dynamically via the shared Information state object. Game Parameters: Combined a JScrollBar to control image scale thresholds, a JMenuBar with JMenuItem nodes for changing the match difficulty (Easy, Medium, Hard), and an array of JCheckBox fields representing all seven continents. Challenges: Absolute Layout Positioning: Managing explicit component bounds (setBounds) in the null-layout StartPanel requires highly specific coordinates that can scale poorly if window sizes are dramatically altered later. Validation Multi-threading: Syncing state requirements—such as throwing warnings when fewer than 3 continents are selected or managing name checks—requires seamless communication between panel instances and the core Information holder class. Next Steps: Enforce Continent Validation: Active counters ensuring the validation warning dynamically locks or unlocks the “Back” button if the 3-continent minimum isn’t met. Integrate Game Logic: Establish properties inside the GamePanel constructor that ingest the finalized values set by the sliders, checkboxes, and scrollbars from the configuration stage."}, {"post_id": 20985, "ts": "2026-07-02T18:41:17Z", "hours": 3.0508, "text": "Working on a game to allow people to get better at identifying countries based on the shape (will have powerups, customized settings, etc.). This project will be done in java through vscode! Feel free to give any feedback or advice on what I should add to the game. I currently only have the JPanels working for the settings panel as well as the start panel with buttons. Stay tuned for more updates!!! Issues encountered and fixed: panel switching setting JButtons in settings panel layouts -> placing components in the right location"}]...
|
Title: Name That Nation by @brlin888 | Stardance
Title: Name That Nation by @brlin888 | Stardance
Devlogs:
Working on a game to allow people to get better at identifying countries based on the shape (will have powerups, customized settings, etc.). This project will be done in java through vscode! Feel free to give any feedback or advice on what I should add to the game. I currently only have the JPanels working for the settings panel as well as the start panel with buttons. Stay tuned for more updates!!! Issues encountered and fixed: panel switching setting JButtons in settings panel layouts -> placing components in the right location
Dev Log: Name That Nation Implementation of Core UI Panels (Start, Instructions, & Settings) Overview: Successfully built and structured the primary navigational and configuration panels for NameThatNation. Implemented Java Swing components across three core areas: the StartPanel (handling user onboarding and core navigation), the InstructionsPanel (displaying gameplay mechanics in a scrollable format), and the SettingsPanel (giving users control over gameplay parameters like difficulty, map sizes, background colors, and continent selection). Key Implementations: StartPanelUser Onboarding: Added a JTextField for name entry along with strict data validation. If the field is empty or left as default, a warning message (noName JLabel) triggers in red text, blocking gameplay progression. Animated Background: Integrated a javax.swing.Timer alongside a modified paintComponent method to alternate every 0.5 seconds between three unique world images (World1.png to World3.png), creating a smooth looping animation of a rotating Earth.CardLayout Navigation: Configured centralized action listeners (buttons and exitListener) to pass state data to the parent container, cleanly swapping panels or closing the application altogether. InstructionsPanelLayout & Scrolling: Used a BorderLayout to organize an informative overview of rules, score tallies, powerups, and level details. Scroll Mechanics: Embedded a heavy block of instruction text into a non-editable JTextArea wrapped in a JScrollPane, forcing explicit vertical navigation while keeping horizontal scrolling locked. Visual Assets: Overlaid a game preview snapshot (Game.png) on top of a custom backdrop image to give players context before starting. SettingsPanelRGB Customization: Implemented three distinct JSlider inputs (Red, Green, Blue) bound to a ColorHandler listener. This updates the player’s canvas background dynamically via the shared Information state object. Game Parameters: Combined a JScrollBar to control image scale thresholds, a JMenuBar with JMenuItem nodes for changing the match difficulty (Easy, Medium, Hard), and an array of JCheckBox fields representing all seven continents. Challenges: Absolute Layout Positioning: Managing explicit component bounds (setBounds) in the null-layout StartPanel requires highly specific coordinates that can scale poorly if window sizes are dramatically altered later. Validation Multi-threading: Syncing state requirements—such as throwing warnings when fewer than 3 continents are selected or managing name checks—requires seamless communication between panel instances and the core Information holder class. Next Steps: Enforce Continent Validation: Active counters ensuring the validation warning dynamically locks or unlocks the “Back” button if the 3-continent minimum isn’t met. Integrate Game Logic: Establish properties inside the GamePanel constructor that ingest the finalized values set by the sliders, checkboxes, and scrollbars from the configuration stage.
Hey everyone! It’s been a massive day of coding on NameThatNation. If you’ve been following along, you know the goal: a game where you look at maps/images and guess the country before the timer runs out. Today, I wired up the core skeleton for the Settings Panel, Country Info Panel, and initialized the beast that is the Game Panel. Here is exactly what went down today: The Settings Panel: I wanted players to be able to customize their UI, but things got a little chaotic in the grid layouts. The RGB Sliders: Added JSlider controls for Red, Green, and Blue. Players can dynamically alter the theme color (info.setColor). The Continents Customization: Implemented checkboxes for all 7 continents. But I had to add a hard rule in the ButtonListener: You must choose at least 3 continents before you can leave. Why? Because guessing between just the USA and Canada is too easy everyone is going to get it right… Image Size Scrollbar: Added a JScrollBar allowing players to scale the image sizes. Scroll down or up. Difficulty JMenu: A nice dropdown menu (Font.BOLD, 30) to swap between Easy, Medium, and Hard. Current Visual Bug: The continent checkboxes currently text-render in a terrifying new Color(183, 9, 9) (deep blood red) alongside a red warning label. The Country Info Panel: Players need a place to study up, so I built the CountryInfoPanel. It utilizes a try-catch block inside a custom fileIn() method to read a massive text file: countriesContinentHard.txt. It dumps all that text into a non-editable, word-wrapping JTextArea wrapped in a JScrollPane so you can scroll through hundreds of countries. The Aesthetic: On the left side, it renders a nice big sprite of planet Earth (Earth.png), while the data scrolls smoothly on the right. The Game Panel (The Brain of the Operation) Finally, I started prototyping the actual gameplay panel. It’s not fully rendered yet, but the logic infrastructure is going to be a lot! I will continue to work on this panel this week and make sure to follow along the game making!!!
Continued to work on the project! Short Dev Log Today! finished settings and still working on instructions panel started working on game panel game hard to implement need to locate specific coordinates follow for more!
I know I haven’t posted a dev log for a long time… but here is it after 2 months and what I have been working on!!! After completely the country info and instructions panel, I started to work on the game panel which was definitely one of the hardest panels to complete. This is because working in Java JFrame/JPanel requires a lot of technical code to allow buttons to be clicked and change color when an answer choice is correct. Other than this, I had to download EVERY SINGLE COUNTRY’s image and add it to a folder which took over 2 hours to do (not included in the 6 hours) because I couldn’t find a website that had all of them. Other than that, the project is going extremely smoothly and I am currently working on adding different powerups that can aid the person playing the game. My only concern is converting this JFrame/JPanel game onto a demo website because the game is currently reading files from on my computer such as the images and files for instructions etc. If you guys have any suggestions, please feel free to leave it in the chat!
What is up everyone! If you haven’t checked my last devlog, my main issue is still converting my code to a website or mainly a way for you guys to play the game without downloading the source code. I add some improvements to the game, fixing a JButton error because all of the buttons kept on lighting up when I didn’t click any of them. I also added more countries to the country info panel, so I’m pretty sure I have all 198 countries for now in the game. Next up is still fixing the website issue and adding to the game! Stay tuned for more!!!!!!!!!!!!!!
NameThatNation!!! Hi all, for those that have been following along, there has been significant progress throughout the game. I have finally been able to get the gamepanel to work. I added powerups and different features such as lives count, hints, and changing colors on JButtons which utilizes a button listener to detect if the button clicked is correct. Although this may look simple, this project has taken me over several hours to what you see today. Java is an easy language to learn, but to implement it to this level is extremely hard, as image reading, file reading, JButtons, JCheckboxes, etc. are extremely technical and one wrong step will cause the entire program to not function. Tomorrow, I will finish the last panels which are the Achievements panel, and leaderboard panels. After that I will, post a demo of the project (as java is not compatible with online user websites and I am using read/write from files), and do my final commit before I ship my project!!! Thank you for those that have been following along!
Hi all, This will be the last devlog for Name That Nation. I am so excited for you guys to see what I have been able to accomplish throughout the summer. Since NameThatNation is coded in Java completely, it CANNOT be converted into a website. I have attached a video (took 2 hours to edit) to demonstrate how the game can be played, as well as attached the source code in github. The reason that it cannot be made into a website is that it reads and writes through specific files that is not possible on a website. Additionally, Java JPanel and JFrame is not compatible with websites, meaning that I would have to code the entire game again in another programming language in order for the game to function. Today I placed my finishing touches such as incorporating the achievements panel and added final touches/testings for the entire game. This game took over 20+ hours (not shown through Hackatime) because there was more time spent on individually downloading all 198 country images and organizing files to include all countries but maintain functionality. I hope this project finds you well and thanks for those that have been following along the journey!!! Hope you guys like my project!!!
Hi all, I thought my project would be finished but apparently there were some issues with shipping the project. To whoever is reading this or people that judge ships, I have edited my github to have a releases zip file which can be downloaded to test out my game. You may still see the youtube video still attached for my game demo, but you can now try out the game yourself in github by retrieving the required assets. Additionally, I added more clear instructions and descriptions on NameThatNation and its properties. Hopefully you guys go check it out and take into consideration when evaluating my ship!
Hi all, I have made a few changes for my project in order to fulfill the shipping request so hopefully whoever reviews my ship takes this into consideration @Jack_ . Just some further instructions on how to run my code: since I am using java in my project especially libraries that call for java JFrame and JPanel, java must be INSTALLED on the device for whoever is playing the game. In my github releases, I have updated with more clear instructions on how to download java JDK based on your device, then compiling my code. This is the only way, as converting into an executable still won’t run the code as whoever has the code doesn’t have the java libraries specific for my game pre-loaded. Thank you for reading this and hopefully my ship goes through successfully (I haven’t gotten an update in like 5 days…)!
Hi all, My project got rejected again… for using AI assets. After changing the images on canva and ensuring the game still works, hopefully this time my ship will go through. If you guys want to see the new changes made to my project, feel free to check out the github for Name That Nation. Hopefully @Amu or other shipwrights will consider these new changes made as it took me over 2 hrs+ to find images and individually change the assets that were AI generated. So now I am happy to say my project does not use a single AI generated image!
Hi everyone, i am continuing to build on my project for NameThatNation! Mainly this time focusing on organization for website as well as implementing more features and polishing my readme! also if any of you guys know when a manuel review submission for a ship will get approved, please let me know!
Ships:
Hi all, this is my ship for Name That Nation! Name That Nation is a game I thought of that tests and trains a person’s ability of naming countries based on the shape of the country (all 198 countries). The game is made completely using Java, all coded line by line, with some images being AI generated. The most challenging part of this project was actually making sure the project worked, because Java is a really technical language. One missing semicolon, and you have to go back and manually fix it. Additionally, since there are a lot of JButtons and components I had to add, the formatting depended on individually testing and organizing in order for the project to look visually aesthetic. Lastly, one of the biggest challenges was reading/writing from multiple files, since there was hundreds of country image files I had to organize, as well as ensuring that each country was actually accounted for. Overall, the testing through each individual panel allowed me to slowly build up this project as a whole. One interesting thing I added was incorporating powerups and achievements, that would incentive players to continuously play to achieve a higher score. Players can customize their gaming experience on background color, font size, difficulty, etc. in the settings panel. There are hints present, a timer present, and three lives, but by utilizing the powerups, this will boost the scores an individual can set. After gameplay, players can see what they scored wrong on, save their score to the txt file which includes (and sorts) all names, as well as see what achievements they have accomplished. This pretty much sums up my project as a whole, over 20+ hours (from image downloads to testing which was not accounted for in the Hackatime hours) as well as over 2400 lines of code. Hope whoever is reading this enjoys this project!!!
Hi everyone or whoever is reviewing this ship! This is my #2 ship for NameThatNation. To recap, NameThatNation is a game that allows the user to learn more about different countries through answering questions. Overall, for these couple of hours I continued to work on this project. Based on the comments from the people that reviewed on my last ship, I mainly worked on organizing the images in my panels better and adjusting the panels to be more visually appealing. If you want a better experience while playing the game, make sure to check out the settings panel where you can customize your gaming experience. For this ship, I recreated the images in my panels so that they fit the game better, so I am proud so say there was NO AI used in creating any of the images! Just a note that if you want to check out this game, make sure to go to releases or click on the “try project” button which will direct you towards the github releases. Ensure that you have download Java JDK because this entire project is coded entirely in JAVA which is an extremely technical language, so organization wise and how this game works is limited to some extent (harder to organize because need to manually run and check program each time to ensure object is placed where you want it to be and components are have a limited size by Java). Hope you have fun reviewing my ship!...
|
1792853475.5860295
|
1792939875.5860295
|
|
3602
|
3d gdot fps game by @jonathanwillner | Stardance
|
jonathanwillner
|
2
|
175.0
|
676
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-16T19:46:46Z", "hours": 36.0, "multiplier": 4.42, "payout": 81, "blessing": "cursed", "text": "Its a 3d fps made in Godot with a level that has interactable ncps because i lost the plot . It was fairly challenging since i have never used Godot but I’m proud of it. Even if there were times where this project made me want to yeet my computer out the second story window of my house and then follow after it but it was \"fun\" and \"rewording\" to get it work I hope you enjoy", "repo": "https://github.com/jonwill12/3d-hackclub-game", "demo": "https://jonwill12.itch.io/hackclub3dgame"}, {"ship_num": 2, "ts": "2026-06-17T15:18:07Z", "hours": 139.0, "multiplier": 7.24, "payout": 595, "blessing": "neutral", "text": "Its a 3d fps in godot it was fairly challenging since iv never used godot but I’m somewhat proud of it", "repo": "https://github.com/jonwill12/3d-hackclub-game", "demo": "https://jonwill12.itch.io/hackclub3dgame"}]...
|
[{"post_id": 29693, "ts": "202 [{"post_id": 29693, "ts": "2026-07-16T19:35:42Z", "hours": 6.0, "text": "i worked on getting the death and health system working cus thay broke agian than i adden the new level to the level select and fixed some bugs"}, {"post_id": 27389, "ts": "2026-07-12T22:22:55Z", "hours": 7.0, "text": "Dev Log: Fixing NPC Door Navigation IssueProblemWhile testing the new NPC AI system, I noticed that enemies were able to find the correct path using the NavigationAgent3D, but they would get stuck when trying to walk through doors.The NPC was not failing to find a path. The navigation debug showed:Navigation map was readyPath count was validThe NPC had a target positionThis meant the problem was not with the NavigationAgent3D or the navigation mesh.InvestigationI tested multiple possible causes:Rebuilt the navigation meshChecked NavigationAgent3D settingsChecked the NPC movement codeChecked collision sizesChecked the NPC pathingAfter debugging, I found that the issue was caused by collision layers.The NPC and the door were using the same collision layer, causing the NPC’s collision body to interfere with the door collision. The navigation system could see a valid path through the door, but the physics engine was stopping the NPC from moving through it.SolutionI separated the collision layers so the NPC and the door no longer incorrectly blocked each other.After changing the collision settings:NPCs could correctly enter and leave housesNavigation paths continued workingDoors no longer trapped enemiesMultiple NPCs could navigate the level correctlyNew Level ProgressI the Current AI Features The NPC system now includes: NavigationAgent3D pathfinding Enemy chasing and a behavior Anger system based on player messages that NPC can respond to in the chat UIMultiple NPC support with name targeting i agian cant uplode a video"}, {"post_id": 26292, "ts": "2026-07-11T00:27:50Z", "hours": 8.0, "text": "devlog Building the Next Level Today I made more progresson the game by adding a new AI npc and started working on a brand-new level. First,I fixed several bugs with command handling and NPC responses, Then I startedbuilding the new level for the game and began creating and placing some simplehouses around the map to make the environment feel more realistic. Then I plannedout where the NPCs and points of interest will be located inside and around thehouses. The Next Step is to Finish building the houses and add moreenvironmental details, create interiors so players can explore inside thebuildings, and add the NPCs so they can interact with the player as well as continuingto improve the AI so the npcs react naturally to what the player says and does,and keep testing and fixing bugs as development continues. and AI Improvements & New Dialogue System witch was focused on improving the AI and laying the groundwork for more immersive NPC interactions. AI Improvements Continued working on the enemy AI that reacts to what the player says. Improved the NPC anger system and fixed navmesh i can only add one video tho"}, {"post_id": 24290, "ts": "2026-07-07T19:16:19Z", "hours": 0.0, "text": "i have given up on getting the stt to work cause the auido godot outputs is to hard for stt models to understand so im just going to do a text box"}, {"post_id": 23581, "ts": "2026-07-06T16:53:27Z", "hours": 2.0, "text": "i cant do a video because it will casue a feedback loop Today I finally got a working voice-controlled AI system inside my Godot project. The goal was to let the player speak naturally to NPCs and have the game react in real time. First I set up a full voice pipeline: with a Microphone input capture inside Godot Real-time voice detection using audio thresholds Automatic recording when the player starts speaking Silence detection to stop recording Exporting audio chunks as .wav files Sending audio to Whisper (whisper.cpp) locally Receiving transcribed text for game logic This allows players to literally talk to the game than i added the audio improvements At first, the audio was messy and hard for Whisper to understand. The main issues were Muddy frequencies, Missing clarity in speech , and Some words being cut off at the start To fix this, I added audio processing directly in Godot: using a Compressor to balanced loud/quiet parts of speech and a band-Pass Filter to removed low rumble + high noise and Improve microphone sensitivity tuning. After these changes, the speech became much cleaner and Whisper started producing more accurate transcriptions."}, {"post_id": 23033, "ts": "2026-07-05T19:25:46Z", "hours": 2.0, "text": "made jumping work smother and am starting on ai thingy that when you say something reacts to what you said so if you say something mean it attacts and you can give it camands like go over thare or get me that item ect"}, {"post_id": 22404, "ts": "2026-07-04T21:24:43Z", "hours": 3.0, "text": "the game isnt as laggy as it lookes in the video my wifi is just buns Today I revamped my enemy’s navigation system and got the NavAgent working properly again after a lot of debugging. Before this update, the enemies would either get stuck on walls or fail to properly detect paths, which made the AI feel broken and inconsistent during gameplay. The main issue came from how the that i wasn’t using a NavigationAgent3D and instead just making the enemy go to the player one issue i ran into was how velocity was handled in the enemy movement code. Once I corrected the movement logic to properly use get_next_path_position () and only apply navigation to the X/Z axis while keeping gravity separate and added the floor walls and barrel nodes to the nav region the enemies started moving smoothly again and actually path around obstacles instead of bumping into them. After fixing the movement system, I also cleaned up the enemy AI script to make it more stable. The enemy now: Finds the player using groups Uses NavigationAgent3D to calculate paths Chases the player correctly around walls Maintains gravity properly while moving Attacks when close to the player This made the enemy feel way more alive and less “robotic,” since it can now properly navigate the level instead of just walking into geometry. Overall, this was a big improvement to the AI system and a solid step toward making the enemies feel more intelligent and fun to fight. I also fixed an issue where if you were touching the enemy and shot it you would get damaged and not the enemy."}, {"post_id": 21878, "ts": "2026-07-04T01:40:33Z", "hours": 5.0, "text": "also it was 2 hours and 50 minets idk why it says 5 hours and 55 minutes it may have been something else as well. This update was all about adding the fps arms and getting them to work in my game Aswell as redoing the player health and death systems. I had to redo the health system, so I made it into a more proper system that tracks the player’s health and detects when it reaches zero. Once the player’s healthreaches zero, they die, and the game displays the dedicated death screen instead of just leaving the player in the world. Getting this working was notas simple as I expected. I ran into several issues while connecting the player script to the death screen. At first, Godot could not find the custom health class because I had the wrong type name. After fixing that, I ran into errors where the death screen function expected different arguments than I was providing. Later, I hit another problem where the game tried to call the deathscreen on a null instance because the node reference was not set correctly. Each error pointed me toward another part of the system that needed attention. Once I fixed the node references and cleaned up the function calls, the deathscreen finally appeared correctly when the player’s health reached zero. Although it took several debugging sessions with chat gpt I know I used ai sue me I had no idea what I was doing and now I kind of know what I am doing, I nowhave a much more reliable player death system. my recodeing software dosnt recod the game aprently i cant add video"}, {"post_id": 10658, "ts": "2026-06-17T14:53:44Z", "hours": 1.0, "text": "finished fixing it made it ready to ship"}, {"post_id": 10389, "ts": "2026-06-17T02:16:51Z", "hours": 5.0, "text": "i added the tutorial, made the level select work as well as added the finishing touches to the game, because I’m taking a break because this game is bad for my mental and physical health. I haven’t slept in 5 days and I haven’t had a good sleep in 2 weeks, not because of the game, but it’s not helping"}, {"post_id": 9293, "ts": "2026-06-15T16:42:06Z", "hours": 15.0, "text": "At first, I created a UI using standard Button nodes and tried to assign images using level data. However, I ran into multiple issues where: • Images were not appearing at all • Buttons were scaling too large inside the GridContainer • Size settings like custom_minimum_size were being ignored • Some invalid properties (like icon_max_width) caused errors After debugging, I found that I could overrides manual sizing along size flags are properly configured. Now the level select system successfully generates buttons dynamically from an array of level data, including: • Level name • Level image icon • Locked/unlocked state • Scene loading when clicked and made a new level"}, {"post_id": 8992, "ts": "2026-06-15T00:00:02Z", "hours": 5.0, "text": "working on finishing touches and my hack time broke yaaaaaaaa"}, {"post_id": 8504, "ts": "2026-06-14T04:16:19Z", "hours": 37.0, "text": "i loki forgot to make a devlog yesterday i fixed the guns had a midlife crisis about whare i want to go with the game next added objectives and recoded the enimy and player and now im going to take a nap"}, {"post_id": 6953, "ts": "2026-06-11T17:42:07Z", "hours": 13.0, "text": "made new light system added FPS multiplayer template multIplayer and they’re back no oh god noooooooooooooooooooooooooooooooooooo not again"}, {"post_id": 5906, "ts": "2026-06-09T21:39:21Z", "hours": 16.0, "text": "made animation for enemy and rewrote entire code because gdot decided it wanted me to"}, {"post_id": 4961, "ts": "2026-06-08T16:30:38Z", "hours": 17.0, "text": "i fixed the guns and the enemy cus he stoped working"}, {"post_id": 4453, "ts": "2026-06-07T19:35:09Z", "hours": 1.0, "text": "trying to fix what ever the fuck this shit is no luck so far"}, {"post_id": 3911, "ts": "2026-06-07T00:51:38Z", "hours": 1.0, "text": "lo key i give up"}, {"post_id": 3871, "ts": "2026-06-06T23:12:55Z", "hours": 2.0, "text": "added guns and death"}, {"post_id": 3667, "ts": "2026-06-06T18:26:28Z", "hours": 17.0, "text": "game got corrupted had to start over :("}, {"post_id": 1778, "ts": "2026-06-03T23:43:28Z", "hours": 2.0, "text": "adding enemy"}, {"post_id": 1113, "ts": "2026-06-02T22:51:41Z", "hours": 1.0, "text": "learning gdot"}]...
|
Title: 3d gdot fps game by @jonathanwillner | Star Title: 3d gdot fps game by @jonathanwillner | Stardance
Devlogs:
learning gdot
adding enemy
game got corrupted had to start over :(
added guns and death
lo key i give up
trying to fix what ever the fuck this shit is no luck so far
i fixed the guns and the enemy cus he stoped working
made animation for enemy and rewrote entire code because gdot decided it wanted me to
made new light system added FPS multiplayer template multIplayer and they’re back no oh god noooooooooooooooooooooooooooooooooooo not again
i loki forgot to make a devlog yesterday i fixed the guns had a midlife crisis about whare i want to go with the game next added objectives and recoded the enimy and player and now im going to take a nap
working on finishing touches and my hack time broke yaaaaaaaa
At first, I created a UI using standard Button nodes and tried to assign images using level data. However, I ran into multiple issues where: • Images were not appearing at all • Buttons were scaling too large inside the GridContainer • Size settings like custom_minimum_size were being ignored • Some invalid properties (like icon_max_width) caused errors After debugging, I found that I could overrides manual sizing along size flags are properly configured. Now the level select system successfully generates buttons dynamically from an array of level data, including: • Level name • Level image icon • Locked/unlocked state • Scene loading when clicked and made a new level
i added the tutorial, made the level select work as well as added the finishing touches to the game, because I’m taking a break because this game is bad for my mental and physical health. I haven’t slept in 5 days and I haven’t had a good sleep in 2 weeks, not because of the game, but it’s not helping
finished fixing it made it ready to ship
also it was 2 hours and 50 minets idk why it says 5 hours and 55 minutes it may have been something else as well. This update was all about adding the fps arms and getting them to work in my game Aswell as redoing the player health and death systems. I had to redo the health system, so I made it into a more proper system that tracks the player’s health and detects when it reaches zero. Once the player’s healthreaches zero, they die, and the game displays the dedicated death screen instead of just leaving the player in the world. Getting this working was notas simple as I expected. I ran into several issues while connecting the player script to the death screen. At first, Godot could not find the custom health class because I had the wrong type name. After fixing that, I ran into errors where the death screen function expected different arguments than I was providing. Later, I hit another problem where the game tried to call the deathscreen on a null instance because the node reference was not set correctly. Each error pointed me toward another part of the system that needed attention. Once I fixed the node references and cleaned up the function calls, the deathscreen finally appeared correctly when the player’s health reached zero. Although it took several debugging sessions with chat gpt I know I used ai sue me I had no idea what I was doing and now I kind of know what I am doing, I nowhave a much more reliable player death system. my recodeing software dosnt recod the game aprently i cant add video
the game isnt as laggy as it lookes in the video my wifi is just buns Today I revamped my enemy’s navigation system and got the NavAgent working properly again after a lot of debugging. Before this update, the enemies would either get stuck on walls or fail to properly detect paths, which made the AI feel broken and inconsistent during gameplay. The main issue came from how the that i wasn’t using a NavigationAgent3D and instead just making the enemy go to the player one issue i ran into was how velocity was handled in the enemy movement code. Once I corrected the movement logic to properly use get_next_path_position () and only apply navigation to the X/Z axis while keeping gravity separate and added the floor walls and barrel nodes to the nav region the enemies started moving smoothly again and actually path around obstacles instead of bumping into them. After fixing the movement system, I also cleaned up the enemy AI script to make it more stable. The enemy now: Finds the player using groups Uses NavigationAgent3D to calculate paths Chases the player correctly around walls Maintains gravity properly while moving Attacks when close to the player This made the enemy feel way more alive and less “robotic,” since it can now properly navigate the level instead of just walking into geometry. Overall, this was a big improvement to the AI system and a solid step toward making the enemies feel more intelligent and fun to fight. I also fixed an issue where if you were touching the enemy and shot it you would get damaged and not the enemy.
made jumping work smother and am starting on ai thingy that when you say something reacts to what you said so if you say something mean it attacts and you can give it camands like go over thare or get me that item ect
i cant do a video because it will casue a feedback loop Today I finally got a working voice-controlled AI system inside my Godot project. The goal was to let the player speak naturally to NPCs and have the game react in real time. First I set up a full voice pipeline: with a Microphone input capture inside Godot Real-time voice detection using audio thresholds Automatic recording when the player starts speaking Silence detection to stop recording Exporting audio chunks as .wav files Sending audio to Whisper (whisper.cpp) locally Receiving transcribed text for game logic This allows players to literally talk to the game than i added the audio improvements At first, the audio was messy and hard for Whisper to understand. The main issues were Muddy frequencies, Missing clarity in speech , and Some words being cut off at the start To fix this, I added audio processing directly in Godot: using a Compressor to balanced loud/quiet parts of speech and a band-Pass Filter to removed low rumble + high noise and Improve microphone sensitivity tuning. After these changes, the speech became much cleaner and Whisper started producing more accurate transcriptions.
i have given up on getting the stt to work cause the auido godot outputs is to hard for stt models to understand so im just going to do a text box
devlog Building the Next Level Today I made more progresson the game by adding a new AI npc and started working on a brand-new level. First,I fixed several bugs with command handling and NPC responses, Then I startedbuilding the new level for the game and began creating and placing some simplehouses around the map to make the environment feel more realistic. Then I plannedout where the NPCs and points of interest will be located inside and around thehouses. The Next Step is to Finish building the houses and add moreenvironmental details, create interiors so players can explore inside thebuildings, and add the NPCs so they can interact with the player as well as continuingto improve the AI so the npcs react naturally to what the player says and does,and keep testing and fixing bugs as development continues. and AI Improvements & New Dialogue System witch was focused on improving the AI and laying the groundwork for more immersive NPC interactions. AI Improvements Continued working on the enemy AI that reacts to what the player says. Improved the NPC anger system and fixed navmesh i can only add one video tho
Dev Log: Fixing NPC Door Navigation IssueProblemWhile testing the new NPC AI system, I noticed that enemies were able to find the correct path using the NavigationAgent3D, but they would get stuck when trying to walk through doors.The NPC was not failing to find a path. The navigation debug showed:Navigation map was readyPath count was validThe NPC had a target positionThis meant the problem was not with the NavigationAgent3D or the navigation mesh.InvestigationI tested multiple possible causes:Rebuilt the navigation meshChecked NavigationAgent3D settingsChecked the NPC movement codeChecked collision sizesChecked the NPC pathingAfter debugging, I found that the issue was caused by collision layers.The NPC and the door were using the same collision layer, causing the NPC’s collision body to interfere with the door collision. The navigation system could see a valid path through the door, but the physics engine was stopping the NPC from moving through it.SolutionI separated the collision layers so the NPC and the door no longer incorrectly blocked each other.After changing the collision settings:NPCs could correctly enter and leave housesNavigation paths continued workingDoors no longer trapped enemiesMultiple NPCs could navigate the level correctlyNew Level ProgressI the Current AI Features The NPC system now includes: NavigationAgent3D pathfinding Enemy chasing and a behavior Anger system based on player messages that NPC can respond to in the chat UIMultiple NPC support with name targeting i agian cant uplode a video
i worked on getting the death and health system working cus thay broke agian than i adden the new level to the level select and fixed some bugs
Ships:
Its a 3d fps in godot it was fairly challenging since iv never used godot but I’m somewhat proud of it
Its a 3d fps made in Godot with a level that has interactable ncps because i lost the plot . It was fairly challenging since i have never used Godot but I’m proud of it. Even if there were times where this project made me want to yeet my computer out the second story window of my house and then follow after it but it was "fun" and "rewording" to get it work I hope you enjoy...
|
1792878850.189505
|
1793742850.189505
|
|
4028
|
Debugr.fun by @jamallyemin | Stardance
|
jamallyemin
|
2
|
20.36
|
270
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-06T21:22:25Z", "hours": 10.0, "multiplier": 17.57, "payout": 171, "blessing": "neutral", "text": "helo!! shipping this one — it’s the variable game, ranked edition. you write python-like code to satisfy a growing set of rules before a timer starts deleting it from the bottom, one line a second, unless you sync in time. play solo, or host/join a private room and race friends live for the leaderboard. the biggest thing I’m proud of is taskEngine.js — instead of hand-writing 25 fixed rules like the old version, it builds a hidden random solution first and derives every rule from a real fact about it (its actual sum, its actual length, etc), so no matter how many rules stack together they can never contradict each other. infinite non-repeating tasks out of that one trick. hardest part honestly wasn’t the game logic, it was wiring firebase up for real — nicknames, live rooms, race winners decided by firestore transactions so two people submitting at the same millisecond still only lets one through. spent lots of time chasing dumb stuff too. to test it: pick a difficulty and start typing variable assignments, or open two tabs and try hosting + joining a room to see the live race work. note : this project is obviously not perfect but I will try to improve this project and make it an actual kind of web browser game, so feedbacks , bug reports, and suggestions would be really helpful and appreciated", "repo": "https://github.com/jamallyemin/Debugr.fun", "demo": "https://debugr.fun/"}, {"ship_num": 2, "ts": "2026-06-03T23:50:06Z", "hours": 6.0, "multiplier": 15.96, "payout": 99, "blessing": "neutral", "text": "made a browser puzzle where you write Python-like variable assignments to satisfy 25 rules simultaneously - think neal.fun’s password game but for code. rules unlock one by one and start contradicting each other the deeper you go. most proud of the destruction mode. when the 45s timer hits zero the editor gets a red caret and starts deleting your code line by line from the bottom until you hit sync. it creates this genuine panic that felt fun to build. hardest part was making all 25 rules mathematically solvable at the same time. some rules override earlier ones so you keep rewriting the same lines - getting that supersession logic right without breaking the win condition took a while. to test it: just start typing variables. x = 5 will get you past rule 1. it gets weird around rule 7.", "repo": "https://github.com/jamallyemin/Debugr.fun", "demo": "https://debugr.fun/"}]...
|
[{"post_id": 80164, "ts": "202 [{"post_id": 80164, "ts": "2026-10-16T14:16:17Z", "hours": 4.3622, "text": "helo again!! it’s been a while, but I finally came back to this and added a bunch of stuff ^_^ the biggest one is puzzles. it’s a roadmap like chess.com’s, with 3 tracks: syntax (fix the broken code), complete (fill in the blanks) and typefix (fix the type errors). levels never run out, just like taskEngine.js. I wrote a tiny python interpreter (pyeval.js) to check the answers instead of loading pyodide, so there’s nothing heavy to download. there’s also a puzzle streak and a top 3 solvers for today / this week. added: themes: light mode, plus a custom theme maker where you pick your own colors (the old amber and cold signal presets are gone) settings: sfx on/off + volume, CRT scanlines on/off, theme, cloud save with an optional google link, and a feedback form will add: daily challenge: one task a day, same for everyone, ranked by time. it sits on the main menu with a countdown, press D to play it profile pictures: you unlock them by clearing puzzles and winning on different difficulties, and other players can see yours next to your name (the pixel art is still placeholder, I’m drawing the real ones later) keyboard control: esc goes back on every screen, and ? shows all the shortcuts sound effects: all made with the web audio api, no audio files most of these are half done, I just have to finish coding some of the javascript files and make sure everything runs perfectly! it’s still not perfect but it feels way more like an actual game now. if you find bugs or have ideas, there’s a feedback button in settings, I will read all of them!! :3 i forgot to add I changed the game’s name from The Variable Game to Debugr.fun cuz kewler.. and I got domain ^-^"}, {"post_id": 63184, "ts": "2026-09-06T21:05:08Z", "hours": 0.81, "text": "helo!! continuing from last time — taskEngine.js is done, and lobby/live-race is actually talking to firebase properly now too. this is it, the project’s finished!! taskEngine.js works backwards instead of using hardcoded rules like the old 25-rule version did: it builds a random hidden “reference solution” first (variable names, numbers, strings, a list), then derives every rule from a real fact about that solution — its actual sum, its actual length, whether one number happens to be prime, etc. since every rule comes from the same solution, they can never contradict each other no matter how many stack together. difficulty just controls how many rules get pulled from the pool (1 easy / 3 medium / 5 hard), and it keeps a history per difficulty so the same combo won’t repeat until the pool’s exhausted. wiring it all together turned up a bunch of small but annoying bugs, mostly not taskEngine’s fault directly: two separate filename casing mismatches (taskEngine.js and firebaseClient.js) — the script tags in index.html didn’t match the actual filenames on disk exactly, fine on windows locally but the dev server (and github pages) treat urls as case-sensitive, so both files were silently 404ing and breaking everything downstream config.js had the firebase config saved under the wrong variable name, so firebase never actually initialized and threw a reference error instead the join-a-room screen was stacking the code input + join button on top of the waiting room instead of hiding them after a successful join, looked broken even when it technically wasn’t rooms never got cleaned up in firestore after cancelling out of one, so an old room code could still say “already started” if you landed on it again later — fixed leaveRoom so the host actually deletes the room on the way out now singleplayer, hosting/joining rooms, live races, the leaderboard, streaks, and the tutorial all work end to end now. and it’s ready to be shipped!!"}, {"post_id": 61742, "ts": "2026-09-04T20:00:37Z", "hours": 3.1894, "text": "helo again!! so after the menu frontend was done last time, spent this session wiring up js to actually make it functional instead of just sitting there as styled html. added: script.js: screen switching between menu/difficulty/lobby/game, the nickname + tutorial onboarding flow, and the actual game loop (timer, save/sync, destruction mode) parser.js : reads whatever gets typed into the editor and pulls out the variables firebaseClient.js: nicknames, scores, streaks, and the room/live-race logic for multiplayer tutorial.js: the spotlight walkthrough for first-time visitors config.js: firebase config + local player state caching taskEngine.js is still on the list, saved it for last since everything else needed to be working first before it made sense to build. tested what’s done so far end to end and caught a handful of small bugs along the way (some css that wasn’t applying, a couple html typos) which I fixed too. next up: taskEngine.js, then getting the lobby/live-race stuff talking to firebase properly ^_^"}, {"post_id": 58238, "ts": "2026-08-30T16:28:08Z", "hours": 3.4475, "text": "helo again!! so quick update on the main menu I mentioned last time: the frontend for it is completely done now!! :Di finished styling the whole thing, here is what’s ready on the screen right now:main buttons for singleplayer, host/join private rooms, and leaderboard ([1] to [4])top bar with day streak tracker and runtime status boxclean footer for how to play & source links now that the main menu frontend is out of the way and not looking like raw HTML anymore, I’m finally moving on to the backend logic for lobbies and real-time multiplayer!! :>"}, {"post_id": 52335, "ts": "2026-08-22T13:20:15Z", "hours": 2.2828, "text": "helo!! so I kinda decided to start all over and improve this game because I like torturing myself, I wanted to make the game multiplayer, less boring, so I removed the old simple looking single editor page and now replacing it with a main menu screen!! here players will be able to: host and join private lobbies and play with their friends; play by themselves or play online!! :D so with these new features I decided to add a leaderboard too in order to make it more competitive, leaderboard will consist win streak , best times!! and wins !! also added diff levels so easy, medium, hard are a thing now :>"}, {"post_id": 1777, "ts": "2026-06-03T23:41:41Z", "hours": 2.6764, "text": "script.js is done. parser reads whatever you type and pulls out strings, numbers, and lists - inline and multiline. 25 rules with a supersession system so later rules can step on earlier ones without creating impossible states. progressive unlock, 45s countdown, sync button, destruction mode that eats your code line by line from the bottom when the timer runs out."}, {"post_id": 929, "ts": "2026-06-02T17:59:06Z", "hours": 3.0431, "text": "the layout skeleton is officially complete now that style.css is implemented. i went for a dark, high-contrast, brutalist terminal look to match the puzzle theme. here are the key UI updates: custom scrollbar: added a minimal 4px scrollbar to the rules list so it blends perfectly into the sidebar unlock animations: handled the transitions for .rule-item. when a rule becomes visible, it smoothly fades in and slides up into place using transform: translateY(6px) to 0. editor grid algnment: synced the code canvas layout, line numbers, and preview panels so the split-view remains perfectly aligned across different workspace sizes. the interface looks clean now, so next up i’m wiring the actual parser and the rule engine in script.js to make it work. :3"}, {"post_id": 615, "ts": "2026-06-02T03:36:14Z", "hours": 0.4664, "text": "just finished the index.html skeleton. as you can see on the right panel, the embedded preview is currently completely raw and unstyled because style.css is literally a blank file right now. looks like a broken 90s blog. now I’ll move on to style.css so my eyes don’t bleed from this ugly white screen… but I think the structure of .html is fine"}]...
|
Title: Debugr.fun by @jamallyemin | Stardance
Dev Title: Debugr.fun by @jamallyemin | Stardance
Devlogs:
just finished the index.html skeleton. as you can see on the right panel, the embedded preview is currently completely raw and unstyled because style.css is literally a blank file right now. looks like a broken 90s blog. now I’ll move on to style.css so my eyes don’t bleed from this ugly white screen… but I think the structure of .html is fine
the layout skeleton is officially complete now that style.css is implemented. i went for a dark, high-contrast, brutalist terminal look to match the puzzle theme. here are the key UI updates: custom scrollbar: added a minimal 4px scrollbar to the rules list so it blends perfectly into the sidebar unlock animations: handled the transitions for .rule-item. when a rule becomes visible, it smoothly fades in and slides up into place using transform: translateY(6px) to 0. editor grid algnment: synced the code canvas layout, line numbers, and preview panels so the split-view remains perfectly aligned across different workspace sizes. the interface looks clean now, so next up i’m wiring the actual parser and the rule engine in script.js to make it work. :3
script.js is done. parser reads whatever you type and pulls out strings, numbers, and lists - inline and multiline. 25 rules with a supersession system so later rules can step on earlier ones without creating impossible states. progressive unlock, 45s countdown, sync button, destruction mode that eats your code line by line from the bottom when the timer runs out.
helo!! so I kinda decided to start all over and improve this game because I like torturing myself, I wanted to make the game multiplayer, less boring, so I removed the old simple looking single editor page and now replacing it with a main menu screen!! here players will be able to: host and join private lobbies and play with their friends; play by themselves or play online!! :D so with these new features I decided to add a leaderboard too in order to make it more competitive, leaderboard will consist win streak , best times!! and wins !! also added diff levels so easy, medium, hard are a thing now :>
helo again!! so quick update on the main menu I mentioned last time: the frontend for it is completely done now!! :Di finished styling the whole thing, here is what’s ready on the screen right now:main buttons for singleplayer, host/join private rooms, and leaderboard ([1] to [4])top bar with day streak tracker and runtime status boxclean footer for how to play & source links now that the main menu frontend is out of the way and not looking like raw HTML anymore, I’m finally moving on to the backend logic for lobbies and real-time multiplayer!! :>
helo again!! so after the menu frontend was done last time, spent this session wiring up js to actually make it functional instead of just sitting there as styled html. added: script.js: screen switching between menu/difficulty/lobby/game, the nickname + tutorial onboarding flow, and the actual game loop (timer, save/sync, destruction mode) parser.js : reads whatever gets typed into the editor and pulls out the variables firebaseClient.js: nicknames, scores, streaks, and the room/live-race logic for multiplayer tutorial.js: the spotlight walkthrough for first-time visitors config.js: firebase config + local player state caching taskEngine.js is still on the list, saved it for last since everything else needed to be working first before it made sense to build. tested what’s done so far end to end and caught a handful of small bugs along the way (some css that wasn’t applying, a couple html typos) which I fixed too. next up: taskEngine.js, then getting the lobby/live-race stuff talking to firebase properly ^_^
helo!! continuing from last time — taskEngine.js is done, and lobby/live-race is actually talking to firebase properly now too. this is it, the project’s finished!! taskEngine.js works backwards instead of using hardcoded rules like the old 25-rule version did: it builds a random hidden “reference solution” first (variable names, numbers, strings, a list), then derives every rule from a real fact about that solution — its actual sum, its actual length, whether one number happens to be prime, etc. since every rule comes from the same solution, they can never contradict each other no matter how many stack together. difficulty just controls how many rules get pulled from the pool (1 easy / 3 medium / 5 hard), and it keeps a history per difficulty so the same combo won’t repeat until the pool’s exhausted. wiring it all together turned up a bunch of small but annoying bugs, mostly not taskEngine’s fault directly: two separate filename casing mismatches (taskEngine.js and firebaseClient.js) — the script tags in index.html didn’t match the actual filenames on disk exactly, fine on windows locally but the dev server (and github pages) treat urls as case-sensitive, so both files were silently 404ing and breaking everything downstream config.js had the firebase config saved under the wrong variable name, so firebase never actually initialized and threw a reference error instead the join-a-room screen was stacking the code input + join button on top of the waiting room instead of hiding them after a successful join, looked broken even when it technically wasn’t rooms never got cleaned up in firestore after cancelling out of one, so an old room code could still say “already started” if you landed on it again later — fixed leaveRoom so the host actually deletes the room on the way out now singleplayer, hosting/joining rooms, live races, the leaderboard, streaks, and the tutorial all work end to end now. and it’s ready to be shipped!!
helo again!! it’s been a while, but I finally came back to this and added a bunch of stuff ^_^ the biggest one is puzzles. it’s a roadmap like chess.com’s, with 3 tracks: syntax (fix the broken code), complete (fill in the blanks) and typefix (fix the type errors). levels never run out, just like taskEngine.js. I wrote a tiny python interpreter (pyeval.js) to check the answers instead of loading pyodide, so there’s nothing heavy to download. there’s also a puzzle streak and a top 3 solvers for today / this week. added: themes: light mode, plus a custom theme maker where you pick your own colors (the old amber and cold signal presets are gone) settings: sfx on/off + volume, CRT scanlines on/off, theme, cloud save with an optional google link, and a feedback form will add: daily challenge: one task a day, same for everyone, ranked by time. it sits on the main menu with a countdown, press D to play it profile pictures: you unlock them by clearing puzzles and winning on different difficulties, and other players can see yours next to your name (the pixel art is still placeholder, I’m drawing the real ones later) keyboard control: esc goes back on every screen, and ? shows all the shortcuts sound effects: all made with the web audio api, no audio files most of these are half done, I just have to finish coding some of the javascript files and make sure everything runs perfectly! it’s still not perfect but it feels way more like an actual game now. if you find bugs or have ideas, there’s a feedback button in settings, I will read all of them!! :3 i forgot to add I changed the game’s name from The Variable Game to Debugr.fun cuz kewler.. and I got domain ^-^
Ships:
made a browser puzzle where you write Python-like variable assignments to satisfy 25 rules simultaneously - think neal.fun’s password game but for code. rules unlock one by one and start contradicting each other the deeper you go. most proud of the destruction mode. when the 45s timer hits zero the editor gets a red caret and starts deleting your code line by line from the bottom until you hit sync. it creates this genuine panic that felt fun to build. hardest part was making all 25 rules mathematically solvable at the same time. some rules override earlier ones so you keep rewriting the same lines - getting that supersession logic right without breaking the win condition took a while. to test it: just start typing variables. x = 5 will get you past rule 1. it gets weird around rule 7.
helo!! shipping this one — it’s the variable game, ranked edition. you write python-like code to satisfy a growing set of rules before a timer starts deleting it from the bottom, one line a second, unless you sync in time. play solo, or host/join a private room and race friends live for the leaderboard. the biggest thing I’m proud of is taskEngine.js — instead of hand-writing 25 fixed rules like the old version, it builds a hidden random solution first and derives every rule from a real fact about it (its actual sum, its actual length, etc), so no matter how many rules stack together they can never contradict each other. infinite non-repeating tasks out of that one trick. hardest part honestly wasn’t the game logic, it was wiring firebase up for real — nicknames, live rooms, race winners decided by firestore transactions so two people submitting at the same millisecond still only lets one through. spent lots of time chasing dumb stuff too. to test it: pick a difficulty and start typing variable assignments, or open two tabs and try hosting + joining a room to see the live race work. note : this project is obviously not perfect but I will try to improve this project and make it an actual kind of web browser game, so feedbacks , bug reports, and suggestions would be really helpful and appreciated...
|
1792831887.9439528
|
1792918287.9439528
|
|
4053
|
Star-Catcher by @OrangeJuice | Stardance
|
OrangeJuice
|
2
|
18.0
|
121
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-23T01:14:02Z", "hours": 7.0, "multiplier": 14.59, "payout": 121, "blessing": "neutral", "text": "Star-Catcher This is a WarioWare styled game that includes: 4 minigames: A platformer A clicker A reaction test And, catching the falling stars from the sky! Sound effects and background music Custom made pixel assets! Information on how to play each minigame is on the Itch.io and github pages. Hope you enjoy!", "repo": "https://github.com/Orangejuiceonntop/StarCatcher", "demo": "https://orangejuiceontop.itch.io/star-catcher"}, {"ship_num": 2, "ts": "2026-07-24T09:20:48Z", "hours": 11.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Star-Catcher “Catch the stars!” - A WarioWare styled game This game includes 3 minigames: A platformer, use arrow keys and space A clicker, use mouse/trackpad A reaction test, use mouse/trackpad I hope you enjoy this game as much as I did making it!!", "repo": "https://github.com/Orangejuiceonntop/StarCatcher", "demo": "https://orangejuiceontop.itch.io/star-catcher"}]...
|
[{"post_id": 71573, "ts": "202 [{"post_id": 71573, "ts": "2026-09-21T02:30:03Z", "hours": 1.0211, "text": "Star-Catcher - Last Devlog “Catch the Stars!” - Game made for the WarioWare Mission Background info It’s been a looong time since the last devlog. Honestly, I’ve been thinking about this project for awhile now, but I’ve decided to ship this project. What’s new Made the meteor icon for 4th minigame Animations!!!! Meteor animation New sprite walking animation! Minor bug fixes Extra info Thanks for everyone who enjoyed my devlogs and this project, It was really nice seeing you guys enjoy it! I wish I could’ve added more to this game, but I’m happy with how it ended up. Maybe one day I’ll return to this game. Thank you for reading. Until next time!"}, {"post_id": 56957, "ts": "2026-08-29T00:18:04Z", "hours": 3.6289, "text": "Star-Catcher “Catch the Stars!” - Game made for the WarioWare Mission Background info Sooooo yea it’s been a while lmao. Genuinely I’ve been working on the 4th mini game for the longest cause I could figure out how to connect signals properly😭. But, we’re past that now! (thankfully) What’s new SO most of my effort has been put into making the 4th level so not much has been added Created and finished the 4th minigame Collect 8 stars in under 20 seconds, dodge the meteors (meteor icon hasn’t been drawn yet 💔) Minor bug fixes Appreciation section As I was making this minigame I saw that @lantyrn created a minigame similar to this! Their project really helped me fix my signal connecting issues cause I genuinely had no idea what I was doing. So, thank you latyrn for your amazing project (Starry Scramble) – Go check it out it’s really cool and well made! To-do Draw icons for meteor and new star icons Also finish making sprite animation while I’m at it Figure out how to fade out music using tweens Draw some more backgrounds Make the game more enjoyable to play! If you have any suggestions, let me know. That’s it for now. Until next time!"}, {"post_id": 49320, "ts": "2026-08-18T02:19:34Z", "hours": 2.2697, "text": "Star-Catcher “Catch the Stars!” - Game made for the WarioWare Mission Background info It’s back!!! When I saw the continuation to the WarioWare mission, I decided to do it! I haven’t been able to add a lot cause I’ve been busy these days. What’s new Sound effects! I added a lot of sound effects to make the gameplay feel more interactive/immersive Button clicks, star shines, etc. Added music So far only the settings and level scene have music I’ve been trying to find music for the levels and start screen but have been unsuccessful so far😞 I might create some custom music for it Updated settings added volume sliders Created a base for the 4th minigames The idea is that you catch the stars that fall from the sky while avoiding meteors. You lose the minigame if you touch the meteor To-do Finish 4th minigame Update character sprite Add music to minigames That’s it for now. Until next time!"}, {"post_id": 33950, "ts": "2026-07-24T09:13:46Z", "hours": 0.3611, "text": "Star-Catcher — It’s finally here!! “Catch the Stars!” - Game made for the WarioWare Mission Last Devlog Star-Catcher is done! It feels a bit bittersweet, but I’m glad that I’m finished with this project. Thank you for everyone who supported thus far!! What’s new Finally drew the win screen background Updated the readme Set up the itch.io page Extra info Once again, I just want to thank everyone who liked or commented on my posts! If you see this, go ahead and check it out on my ship post. Until next time!"}, {"post_id": 33785, "ts": "2026-07-23T23:54:40Z", "hours": 3.2381, "text": "Star-Catcher “Catch the Stars!” - Game made for the WarioWare Mission Background info It’s almost done!!! My motivation has been wavering a bit which prevented me from working on this project for a while, but we pushed through😎. New minigame! The third and last minigame. It was originally going to be a whack-a-mole type game but I realized that was above my skill level and I decided to make a clicking/reaction game instead. You have to click on the star 15 times to progress A black hole will appear. If you click on it, you lose a life Text indicating when to click or stop with custom animation! (Inspired by @Gabl ’s Goose Games - Go check it out!) What else is new Created lose screen with retry button Lives and minigames done resets when button is clicked Created win screen with play again+menu buttons Background hasn’t been drawn yet The sprite now changes directions when you move left/right Bug fixes Extra info I decided to keep the title screen image, but I might change the title design. I did have some ideas because I was way too overambitious, but I’m happy with how the game turned out! I hope you do too. I’ll make one last devlog before shipping after I write my Readme and draw the winner’s screen Thank you for all the support so far. Until next time!"}, {"post_id": 28591, "ts": "2026-07-14T22:42:01Z", "hours": 1.7711, "text": "Star-Catcher “Catch the Stars!” - Game made for the WarioWare Mission Background info I haven’t been working on this game as much as I should lately, but I swear imma lock in 😭. I made some drawings for the background and made a new banner! I was going to use the banner image for the title screen of the game, but the dimensions didn’t match up so when I resized it, the image looked off. What’s New Mainly focused on visual aspects of the game Added floating animations to the stars Changed the background of the level/time scene and settings page Replaced the old font with a new pixel font To do Draw title screen background Create win/lose screens Add character walking animations Make 3rd minigame Until next time!"}, {"post_id": 23219, "ts": "2026-07-06T01:21:50Z", "hours": 3.2775, "text": "Star-Catcher “Collect the Stars!” - Game made for the WarioWare Mission Background info I said I’d finish making the first minigame yesterday, but I severely underestimated how hard it would be. Building the game was easy but coding it was horrible. The timer wouldn’t work and would automatically close the player. I ended up moving on to the second minigame (image on the right). Making it went smoothly which gave me enough motivation to finish making the first minigame. I still don’t know what was wrong with my code, I just ended up deleting the whole script and rewriting it. What’s New 2 mini games created!! A platformer where you collect 3 stars in under 10 seconds A clicked where you click on 5 stars in under 7 seconds To do Next time I work on this, I want to focus on how the game looks visually cause doing the coding this session was exhausting. Make/draw new background Make a custom title on the home page Change how the platforms look on the platformer minigame Add character walking animation That’s all for now. Until next time!!"}, {"post_id": 22399, "ts": "2026-07-04T21:22:44Z", "hours": 1.0506, "text": "Star-Catcher “Collect the Stars!” - Game made for the WarioWare Mission Background Info This session, I mostly worked on the coding. When I saw the code I needed to write I lowkey got scared but it all worked out in the end 😎 What’s new Nothing has been added visually besides the “lives left” image being replaced. It’s a net now! (To catch the stars ofc) Timer on level scene now works Added level count Created in game timer To do Create first level (platformer minigame) Create settings page Draw a background and banner Extra I drew the character sprite! She’s a little girl who carries an oversized net and LOVES stars. I drew a front-facing version that I’m probably not going to use but I wanted to show it off still. It’s not perfect cause I still don’t know how to make pixel art, but I hope yall like it!! The next devlog will be later today after I make the first minigame. Until then!"}, {"post_id": 19638, "ts": "2026-07-01T00:46:16Z", "hours": 1.1044, "text": "Star-Catcher “Collect the Stars!” - Game made for the WarioWare Mission Background info New project!!!! When I saw this mission I was so excited because I finally have a reason to learn how to make a game. I wanted this to be a space-themed game with a pixel art style. The idea is you play as a little girl with a net who runs around catching stars. What I have so far So far, I only have the menu screen and the “loading” screen. It’s very much a work in progress, and I plan to change the background and the “lives” later on. Whats next I plan to make an the first actual level scene next (I can finally use my star drawings I made the other day :D). This is my first time using Godot/making a game in general, so I hope I can make a good game! To do Make first level scene Change background Make/draw character sprite Make “lives” drawing (I’ll probably make it a net)"}]...
|
Title: Star-Catcher by @OrangeJuice | Stardance
D Title: Star-Catcher by @OrangeJuice | Stardance
Devlogs:
Star-Catcher “Collect the Stars!” - Game made for the WarioWare Mission Background info New project!!!! When I saw this mission I was so excited because I finally have a reason to learn how to make a game. I wanted this to be a space-themed game with a pixel art style. The idea is you play as a little girl with a net who runs around catching stars. What I have so far So far, I only have the menu screen and the “loading” screen. It’s very much a work in progress, and I plan to change the background and the “lives” later on. Whats next I plan to make an the first actual level scene next (I can finally use my star drawings I made the other day :D). This is my first time using Godot/making a game in general, so I hope I can make a good game! To do Make first level scene Change background Make/draw character sprite Make “lives” drawing (I’ll probably make it a net)
Star-Catcher “Collect the Stars!” - Game made for the WarioWare Mission Background Info This session, I mostly worked on the coding. When I saw the code I needed to write I lowkey got scared but it all worked out in the end 😎 What’s new Nothing has been added visually besides the “lives left” image being replaced. It’s a net now! (To catch the stars ofc) Timer on level scene now works Added level count Created in game timer To do Create first level (platformer minigame) Create settings page Draw a background and banner Extra I drew the character sprite! She’s a little girl who carries an oversized net and LOVES stars. I drew a front-facing version that I’m probably not going to use but I wanted to show it off still. It’s not perfect cause I still don’t know how to make pixel art, but I hope yall like it!! The next devlog will be later today after I make the first minigame. Until then!
Star-Catcher “Collect the Stars!” - Game made for the WarioWare Mission Background info I said I’d finish making the first minigame yesterday, but I severely underestimated how hard it would be. Building the game was easy but coding it was horrible. The timer wouldn’t work and would automatically close the player. I ended up moving on to the second minigame (image on the right). Making it went smoothly which gave me enough motivation to finish making the first minigame. I still don’t know what was wrong with my code, I just ended up deleting the whole script and rewriting it. What’s New 2 mini games created!! A platformer where you collect 3 stars in under 10 seconds A clicked where you click on 5 stars in under 7 seconds To do Next time I work on this, I want to focus on how the game looks visually cause doing the coding this session was exhausting. Make/draw new background Make a custom title on the home page Change how the platforms look on the platformer minigame Add character walking animation That’s all for now. Until next time!!
Star-Catcher “Catch the Stars!” - Game made for the WarioWare Mission Background info I haven’t been working on this game as much as I should lately, but I swear imma lock in 😭. I made some drawings for the background and made a new banner! I was going to use the banner image for the title screen of the game, but the dimensions didn’t match up so when I resized it, the image looked off. What’s New Mainly focused on visual aspects of the game Added floating animations to the stars Changed the background of the level/time scene and settings page Replaced the old font with a new pixel font To do Draw title screen background Create win/lose screens Add character walking animations Make 3rd minigame Until next time!
Star-Catcher “Catch the Stars!” - Game made for the WarioWare Mission Background info It’s almost done!!! My motivation has been wavering a bit which prevented me from working on this project for a while, but we pushed through😎. New minigame! The third and last minigame. It was originally going to be a whack-a-mole type game but I realized that was above my skill level and I decided to make a clicking/reaction game instead. You have to click on the star 15 times to progress A black hole will appear. If you click on it, you lose a life Text indicating when to click or stop with custom animation! (Inspired by @Gabl ’s Goose Games - Go check it out!) What else is new Created lose screen with retry button Lives and minigames done resets when button is clicked Created win screen with play again+menu buttons Background hasn’t been drawn yet The sprite now changes directions when you move left/right Bug fixes Extra info I decided to keep the title screen image, but I might change the title design. I did have some ideas because I was way too overambitious, but I’m happy with how the game turned out! I hope you do too. I’ll make one last devlog before shipping after I write my Readme and draw the winner’s screen Thank you for all the support so far. Until next time!
Star-Catcher — It’s finally here!! “Catch the Stars!” - Game made for the WarioWare Mission Last Devlog Star-Catcher is done! It feels a bit bittersweet, but I’m glad that I’m finished with this project. Thank you for everyone who supported thus far!! What’s new Finally drew the win screen background Updated the readme Set up the itch.io page Extra info Once again, I just want to thank everyone who liked or commented on my posts! If you see this, go ahead and check it out on my ship post. Until next time!
Star-Catcher “Catch the Stars!” - Game made for the WarioWare Mission Background info It’s back!!! When I saw the continuation to the WarioWare mission, I decided to do it! I haven’t been able to add a lot cause I’ve been busy these days. What’s new Sound effects! I added a lot of sound effects to make the gameplay feel more interactive/immersive Button clicks, star shines, etc. Added music So far only the settings and level scene have music I’ve been trying to find music for the levels and start screen but have been unsuccessful so far😞 I might create some custom music for it Updated settings added volume sliders Created a base for the 4th minigames The idea is that you catch the stars that fall from the sky while avoiding meteors. You lose the minigame if you touch the meteor To-do Finish 4th minigame Update character sprite Add music to minigames That’s it for now. Until next time!
Star-Catcher “Catch the Stars!” - Game made for the WarioWare Mission Background info Sooooo yea it’s been a while lmao. Genuinely I’ve been working on the 4th mini game for the longest cause I could figure out how to connect signals properly😭. But, we’re past that now! (thankfully) What’s new SO most of my effort has been put into making the 4th level so not much has been added Created and finished the 4th minigame Collect 8 stars in under 20 seconds, dodge the meteors (meteor icon hasn’t been drawn yet 💔) Minor bug fixes Appreciation section As I was making this minigame I saw that @lantyrn created a minigame similar to this! Their project really helped me fix my signal connecting issues cause I genuinely had no idea what I was doing. So, thank you latyrn for your amazing project (Starry Scramble) – Go check it out it’s really cool and well made! To-do Draw icons for meteor and new star icons Also finish making sprite animation while I’m at it Figure out how to fade out music using tweens Draw some more backgrounds Make the game more enjoyable to play! If you have any suggestions, let me know. That’s it for now. Until next time!
Star-Catcher - Last Devlog “Catch the Stars!” - Game made for the WarioWare Mission Background info It’s been a looong time since the last devlog. Honestly, I’ve been thinking about this project for awhile now, but I’ve decided to ship this project. What’s new Made the meteor icon for 4th minigame Animations!!!! Meteor animation New sprite walking animation! Minor bug fixes Extra info Thanks for everyone who enjoyed my devlogs and this project, It was really nice seeing you guys enjoy it! I wish I could’ve added more to this game, but I’m happy with how it ended up. Maybe one day I’ll return to this game. Thank you for reading. Until next time!
Ships:
Star-Catcher “Catch the stars!” - A WarioWare styled game This game includes 3 minigames: A platformer, use arrow keys and space A clicker, use mouse/trackpad A reaction test, use mouse/trackpad I hope you enjoy this game as much as I did making it!!
Star-Catcher This is a WarioWare styled game that includes: 4 minigames: A platformer A clicker A reaction test And, catching the falling stars from the sky! Sound effects and background music Custom made pixel assets! Information on how to play each minigame is on the Itch.io and github pages. Hope you enjoy!...
|
1792846579.2150095
|
1792932979.2150095
|
|
4192
|
Artemis Hub by @PolarisSpace | Stardance
|
PolarisSpace
|
2
|
26.71
|
220
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T05:49:39Z", "hours": 7.0, "multiplier": 11.2, "payout": 78, "blessing": "neutral", "text": "This is my final ship for this project, I would encourage you to read my last shipment as I go in more detail of what the project is about. Basically, I built a central website hub that provides information on the Artemis Program. You can find certain information on my website within a few clicks what takes 4-8 clicks on the NASA website. Between the first ship to this one, I’ve mainly just been implementing some feedback I got from the first ship such as adding more text information in case someone doesn’t want to watch the videos, and adding random facts about the astronauts. I added dropdowns which display text which you can click to show, I made them drop down just to save space in the screen if it’s not being used. What took me a bit of time though was adding a script that would provide random information about each Artemis mission every time the page is loaded. That part took a little bit because I was running into an issue where facts for Artemis II would show but not Artemis III, it all had to do with text above overriding the text below. I just resolved this issue by adding the Arrays to the individual HTML files as they just shared the main.js file before.", "repo": "https://github.com/PolarisSpaceDev/ArtemisHub.github.io", "demo": "https://ursa-minor-studios.github.io/ArtemisHub.github.io/"}, {"ship_num": 2, "ts": "2026-07-12T02:00:28Z", "hours": 18.0, "multiplier": 7.99, "payout": 142, "blessing": "neutral", "text": "My project is called Artemis Hub, a static website that provides centralized information about the Artemis Program while showing our progress in building a moon base. It prevents people from navigating to multiple YouTube videos or the entire NASA site (I Frequently have to make multiple clicks to navigate that massive site), and just provides all that information on one page. Even to read information about Artemis II on the NASA site, you still have to view more than one page. So that’s the problem this project solves. To me the most challenging part of it was UI design, that’s what I spent most of my time on. I’m not very good at UI design, so this project allowed me to experiment with UI and I’m getting an idea of what works, doesn’t or what could be done better which will help me in future projects. I’ve also learned how to create a JavaScript countdown timer. For those testing the project, I am still working on responsive design, the site is navigable on mobile devices, but it’s a work in progress. This isn’t the final site, I still have more to do, but I’m doing a in-progress shipment. One thing I am proud of is getting the JavaScript countdown working, and the horizontal carousels made. I was too lazy to figure out how to make a carousel in JavaScript so I just used CSS to position each card and style the trackbar. I wasn’t sure if it was going to work, but it did.", "repo": "https://github.com/PolarisSpaceDev/ArtemisHub.github.io", "demo": "https://ursa-minor-studios.github.io/ArtemisHub.github.io/"}]...
|
[{"post_id": 78906, "ts": "202 [{"post_id": 78906, "ts": "2026-10-12T00:16:04Z", "hours": 1.7078, "text": "Made some progress on my Artemis website! Below is the changelog, but the highlight I have to share is the addition of a “Blogs” page that organizes blogs into rows. These blogs will be more detailed Artemis Updates. It’s the first blog structure I’ve done, so wanted to try it out. I also moved the left navigation bubble content to a bottom navigation bar. Removed Removed the bubble navbar on left side (Got moved to newely added bottom navbar) Added Bottom navigation bar Blog Page First Artemis Blog I would encourage you to look around the repository because I made some additions to it. I added badges at the top of the README file to neatly display some information about the website such as its version, programming languages, etc. Also added a CHANGELOG.md file so you can read every single change I’ve made to this website and read any future updates that are released. Created a Discussions tab at Top menu bar > Discussions so I can make announcements and updates about this project."}, {"post_id": 51420, "ts": "2026-08-21T03:36:32Z", "hours": 1.2047, "text": "Completed Artemis II page Completed the Artemis II page where I explained the flight profile, preparations, and its full flight timeline."}, {"post_id": 50781, "ts": "2026-08-20T04:49:37Z", "hours": 0.71, "text": "Artemis II Page Update! Devlog Formatting This is the first devlog that’s formatted nicely, I’ve been writing them on my phone and for some reason it doesn’t format there at all just displays as a large paragraph. But I’m writing this one on a computer allowing me to format paragraphs and headings. Artemis II page I’ve been working on the Artemis II page, I’m not quite finished but got the history of it and the preperations which explains the stacking timeline and the heatshield issue. Artemis I Timeline I added a timeline to the Artemis I page which you can see in the demo link. It shows major events that happened from stacking to reentry. Another thing I did was update the status of Artemis III below that countdown banner."}, {"post_id": 50607, "ts": "2026-08-19T20:21:50Z", "hours": 5.0447, "text": "Hello It’s been a little while since my last devlog but I plan to make them more frequently. This is my first log sincemy first shipment and Ive been spending thelasst 5 hours trying to implement the feedback I got. 1. Someone said it would be nice to see some facts about the astronauts, so I did something like that. I made an array that displays a random fact about the missions every time the page loads. This one took me a while to do because I was running into an issue where the Artemis I facts would display but not the subsequent ones. I went onto Stack Overflow and problem is resolved. 2. Someone said it would be nice to read texts about the missions rather thaan rely on videos because some people have different preferences for how they learn information. So what I did is created a series of dropdowns on the very bottom that tells you information aout the mission. I chose a dropdown format so they dont take up as much space on the page if its not being read."}, {"post_id": 26960, "ts": "2026-07-12T01:48:18Z", "hours": 1.1619, "text": "During this time, I have embedded two NASA simulations into the website for visualization. You can fine them by going to the Artemis II page and going to the moon base page under “Explore”. I also embedded some YouTube videos to #1 let people understand the idea of the Artemis Program and CLPS who aren’t familiar, and #2 you don’t have to search for multiple YouTube videos potentially on different channels. They all are here. And honestly, when you’re navigating a website, it’s more convenient to watch an embedded video than navigate to YouTube. The last thing I worked on a little bit was making the moon base section more mobile responsive. Still looks a little off, but better than it was before."}, {"post_id": 26647, "ts": "2026-07-11T16:13:29Z", "hours": 4.8525, "text": "Quite afew things have been added since my first devlog. So far I’ve worked a little bit on responsive design to make it more viewable on mobile. I also created a little bubble menu which allows you to transition between Hubs. I created a moon basepage which will provide centralized infirmation on our moon base plans specifically. I’m currently inn the process of implementing some of the simulations NASA created within my website through embedding."}, {"post_id": 17701, "ts": "2026-06-28T16:49:08Z", "hours": 6.7403, "text": "I did quite a few things during this 6 hours. First off, I moved the countdown to the top, andit sticks to the top. Secondly, I added a timeline to visually see each launch. The timeline I used is called JSTimrline which ises a spreadsheet you can embed to add a timeline. They also leave the option for you to create a JSON file ehich gives you more styling options. But I didn’t opt into that. Last thing, I’m leaarning how to use api’s. What you can see in the console is the bio for Cristina Koch provided by Launch Library II. I plan to create a bio for eaach of these astronauts only using the api, if the contents of the api change the web page should change automatically. Although I’m limited to 15 requests per hour which is annoying."}, {"post_id": 6291, "ts": "2026-06-10T16:00:06Z", "hours": 2.4675, "text": "I figured out how to make a countdown timer with JavaScript. This will count down the time left until the next Artemis launch. I also included a little tour of the website in the video. In the video I wait fir about 20 seconds to see that number hit 0. You can skip about 20 seconds if you don’t want to wait for that. Then the bottom of the countdown I will input the status of the Artemis mission. I don’t spend a whole lot of time with JavaScript which is why it took me 2 hours to do. Most of my time was figuring out the milliseconds to years, months, days, etc. I wanted it to show 2 days and 4 hours instead of something like 4000 hours. Another thing included in the video is a tour of some of my code. Let me know if you have any feedback."}, {"post_id": 4664, "ts": "2026-06-08T02:08:01Z", "hours": 2.5367, "text": "I’m creating a website that will provide centralized information about the Artemis Program. Demo is linked in the project for you to try out. I still need to make the website more responsive. What I did today was make the landing page for this website. This so far will include Artemis livestreams, videos, and information on specific missions. Deploying this on Github was a big pain because I needed to restructure the entire website directory, so GitHub could find my index.html file, stylesheet, and images. Let me know if you have any feedback, I’m probably going to make the carousels smaller."}]...
|
Title: Artemis Hub by @PolarisSpace | Stardance
D Title: Artemis Hub by @PolarisSpace | Stardance
Devlogs:
I’m creating a website that will provide centralized information about the Artemis Program. Demo is linked in the project for you to try out. I still need to make the website more responsive. What I did today was make the landing page for this website. This so far will include Artemis livestreams, videos, and information on specific missions. Deploying this on Github was a big pain because I needed to restructure the entire website directory, so GitHub could find my index.html file, stylesheet, and images. Let me know if you have any feedback, I’m probably going to make the carousels smaller.
I figured out how to make a countdown timer with JavaScript. This will count down the time left until the next Artemis launch. I also included a little tour of the website in the video. In the video I wait fir about 20 seconds to see that number hit 0. You can skip about 20 seconds if you don’t want to wait for that. Then the bottom of the countdown I will input the status of the Artemis mission. I don’t spend a whole lot of time with JavaScript which is why it took me 2 hours to do. Most of my time was figuring out the milliseconds to years, months, days, etc. I wanted it to show 2 days and 4 hours instead of something like 4000 hours. Another thing included in the video is a tour of some of my code. Let me know if you have any feedback.
I did quite a few things during this 6 hours. First off, I moved the countdown to the top, andit sticks to the top. Secondly, I added a timeline to visually see each launch. The timeline I used is called JSTimrline which ises a spreadsheet you can embed to add a timeline. They also leave the option for you to create a JSON file ehich gives you more styling options. But I didn’t opt into that. Last thing, I’m leaarning how to use api’s. What you can see in the console is the bio for Cristina Koch provided by Launch Library II. I plan to create a bio for eaach of these astronauts only using the api, if the contents of the api change the web page should change automatically. Although I’m limited to 15 requests per hour which is annoying.
Quite afew things have been added since my first devlog. So far I’ve worked a little bit on responsive design to make it more viewable on mobile. I also created a little bubble menu which allows you to transition between Hubs. I created a moon basepage which will provide centralized infirmation on our moon base plans specifically. I’m currently inn the process of implementing some of the simulations NASA created within my website through embedding.
During this time, I have embedded two NASA simulations into the website for visualization. You can fine them by going to the Artemis II page and going to the moon base page under “Explore”. I also embedded some YouTube videos to #1 let people understand the idea of the Artemis Program and CLPS who aren’t familiar, and #2 you don’t have to search for multiple YouTube videos potentially on different channels. They all are here. And honestly, when you’re navigating a website, it’s more convenient to watch an embedded video than navigate to YouTube. The last thing I worked on a little bit was making the moon base section more mobile responsive. Still looks a little off, but better than it was before.
Hello It’s been a little while since my last devlog but I plan to make them more frequently. This is my first log sincemy first shipment and Ive been spending thelasst 5 hours trying to implement the feedback I got. 1. Someone said it would be nice to see some facts about the astronauts, so I did something like that. I made an array that displays a random fact about the missions every time the page loads. This one took me a while to do because I was running into an issue where the Artemis I facts would display but not the subsequent ones. I went onto Stack Overflow and problem is resolved. 2. Someone said it would be nice to read texts about the missions rather thaan rely on videos because some people have different preferences for how they learn information. So what I did is created a series of dropdowns on the very bottom that tells you information aout the mission. I chose a dropdown format so they dont take up as much space on the page if its not being read.
Artemis II Page Update! Devlog Formatting This is the first devlog that’s formatted nicely, I’ve been writing them on my phone and for some reason it doesn’t format there at all just displays as a large paragraph. But I’m writing this one on a computer allowing me to format paragraphs and headings. Artemis II page I’ve been working on the Artemis II page, I’m not quite finished but got the history of it and the preperations which explains the stacking timeline and the heatshield issue. Artemis I Timeline I added a timeline to the Artemis I page which you can see in the demo link. It shows major events that happened from stacking to reentry. Another thing I did was update the status of Artemis III below that countdown banner.
Completed Artemis II page Completed the Artemis II page where I explained the flight profile, preparations, and its full flight timeline.
Made some progress on my Artemis website! Below is the changelog, but the highlight I have to share is the addition of a “Blogs” page that organizes blogs into rows. These blogs will be more detailed Artemis Updates. It’s the first blog structure I’ve done, so wanted to try it out. I also moved the left navigation bubble content to a bottom navigation bar. Removed Removed the bubble navbar on left side (Got moved to newely added bottom navbar) Added Bottom navigation bar Blog Page First Artemis Blog I would encourage you to look around the repository because I made some additions to it. I added badges at the top of the README file to neatly display some information about the website such as its version, programming languages, etc. Also added a CHANGELOG.md file so you can read every single change I’ve made to this website and read any future updates that are released. Created a Discussions tab at Top menu bar > Discussions so I can make announcements and updates about this project.
Ships:
My project is called Artemis Hub, a static website that provides centralized information about the Artemis Program while showing our progress in building a moon base. It prevents people from navigating to multiple YouTube videos or the entire NASA site (I Frequently have to make multiple clicks to navigate that massive site), and just provides all that information on one page. Even to read information about Artemis II on the NASA site, you still have to view more than one page. So that’s the problem this project solves. To me the most challenging part of it was UI design, that’s what I spent most of my time on. I’m not very good at UI design, so this project allowed me to experiment with UI and I’m getting an idea of what works, doesn’t or what could be done better which will help me in future projects. I’ve also learned how to create a JavaScript countdown timer. For those testing the project, I am still working on responsive design, the site is navigable on mobile devices, but it’s a work in progress. This isn’t the final site, I still have more to do, but I’m doing a in-progress shipment. One thing I am proud of is getting the JavaScript countdown working, and the horizontal carousels made. I was too lazy to figure out how to make a carousel in JavaScript so I just used CSS to position each card and style the trackbar. I wasn’t sure if it was going to work, but it did.
This is my final ship for this project, I would encourage you to read my last shipment as I go in more detail of what the project is about. Basically, I built a central website hub that provides information on the Artemis Program. You can find certain information on my website within a few clicks what takes 4-8 clicks on the NASA website. Between the first ship to this one, I’ve mainly just been implementing some feedback I got from the first ship such as adding more text information in case someone doesn’t want to watch the videos, and adding random facts about the astronauts. I added dropdowns which display text which you can click to show, I made them drop down just to save space in the screen if it’s not being used. What took me a bit of time though was adding a script that would provide random information about each Artemis mission every time the page is loaded. That part took a little bit because I was running into an issue where facts for Artemis II would show but not Artemis III, it all had to do with text above overriding the text below. I just resolved this issue by adding the Arrays to the individual HTML files as they just shared the main.js file before....
|
1792835621.575404
|
1792922021.575404
|
|
4279
|
Minimalist OS by @DimensionLess | Stardance
|
DimensionLess
|
2
|
16.0
|
80
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-15T13:42:21Z", "hours": 11.0, "multiplier": 14.42, "payout": 80, "blessing": "neutral", "text": "I finished my WEB OS . It took way longer then expected , i spent way to mush time reading articles and watching countless YouTube tutorials. I could have completed this project with my existing skills too but i wanted to use this opportunity to learn and improve. I did use AI wherever i got stuck, or have to solve some bug and for structuring my files and code . New Features: Added some basic games (snake, Tetris) Added a boot animation Wallpaper app Resizable windows A fully customisable clock in centre Gallery App Overall structure was improved like putting apps in dock to save space in bottom bar", "repo": "https://github.com/6255127/Web-OS", "demo": "https://6255127.github.io/Web-OS/"}, {"ship_num": 2, "ts": "2026-06-19T07:26:00Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a very minimalist OS called Void OS", "repo": "https://github.com/6255127/Web-OS", "demo": "https://6255127.github.io/Web-OS/"}]...
|
[{"post_id": 28875, "ts": "202 [{"post_id": 28875, "ts": "2026-07-15T13:23:53Z", "hours": 4.5156, "text": "- Core Stabilizations and UI Additions Technical Changes Window Manager (Gallery Bug): Fixed a critical rendering issue where the Gallery window dropped. The window had no default dimension in the openWin() switch statement, and so did not match up with the CSS min-width constraint, leading to positional calc() errors. The explicit dimensions ( 600x500 ) solved the layout thrashing. Desktop Clock Widget: New clock widget that shows the current time, and is customizable and placed on top of the window manager’s stacking context but under the wallpaper layer. Asset Pipeline Refactor: Got rid of all redundant and large local media files from the wallpaperList . Optimized to a single remote CDN image to avoid 404’s and limit local storage costs. Boot Sequence UI: Changed linear opacity fades to a CSS3D transform that is accelerated by hardware. /* Boot sequence 3D transform snippet */ .boot-logo { animation : bootLogoAnim 2s cubic-bezier ( 0.22 , 1 , 0.36 , 1 ) infinite ; transform-style : preserve-3d ; }"}, {"post_id": 27587, "ts": "2026-07-13T09:28:27Z", "hours": 4.4514, "text": "What Changed This Session Spent a few hours cleaning up the project and adding some stuff that was missing. Main things were reorganizing the files, adding proper app folders to the dock, wiring up Tetris and Snake, and making the terminal actually worth using. Project Structure The original had everything dumped in the root folder — HTML, JS, CSS, MP4s, all mixed together. Moved media files into their own folder so at least it looks intentional. webos/ ├── index.html ├── css/ ├── js/ └── media/ Not revolutionary, but it was bothering me. Dock Folders The dock had too many individual icons and was getting messy. Grouped everything into three folders instead: Tools — Notes, Terminal, Calculator, Settings Games — Tetris, Snake, Pixel Art Media — Music Player Clicking a folder opens a small window, then clicking an app inside launches it. The dock went from 8+ icons to 6 . Also moved Settings into Tools because it was sitting in Media for some reason, which made no sense. Games Added Tetris and Snake . Both run on canvas, each in their own JS file so they don’t pollute apps.js . Tetris Ghost piece Wall kicks Hard drop with the Space bar Speeds up every 10 lines Snake WASD or Arrow Keys Apple won’t spawn on the snake body Also fixed the icons for both. They were using random SVGs that had nothing to do with the games. Tetris now shows an actual T-tetromino shape. Snake shows a little body of blocks with a pink apple dot. Terminal Commands The original terminal had about one command and it was useless ( help ). Rewrote the whole thing with stuff that I’d actually use: wp fuji/stars/matrix — Swap wallpaper without touching Settings theme dark/light — Quick theme switch from the keyboard calc 12*8+4 — Math without opening the Calculator app neofetch — Uptime, browser, current wallpaper, theme close <app> — Close any app by name cowsay fortune flip roll 20 color #hex — Inline colour swatch history — Last 20 commands rm -rf / and sudo — Try them help — Actually shows all of the commands"}, {"post_id": 15606, "ts": "2026-06-25T11:43:00Z", "hours": 0.6731, "text": "i added an option to add ur own live wallpapers and songs in the music’s player and i also added a calculator app"}, {"post_id": 15578, "ts": "2026-06-25T10:36:56Z", "hours": 1.4828, "text": "i added live wallpapers and i previously created a pallet forge app as another project so i just integrating that into my my WEB OS too"}, {"post_id": 6870, "ts": "2026-06-11T14:58:15Z", "hours": 5.4431, "text": "I made a minimalist OS . It contains basics apps like notes , wallpaper and a focus timer timer ."}]...
|
Title: Minimalist OS by @DimensionLess | Stardance Title: Minimalist OS by @DimensionLess | Stardance
Devlogs:
I made a minimalist OS . It contains basics apps like notes , wallpaper and a focus timer timer .
i added live wallpapers and i previously created a pallet forge app as another project so i just integrating that into my my WEB OS too
i added an option to add ur own live wallpapers and songs in the music’s player and i also added a calculator app
What Changed This Session Spent a few hours cleaning up the project and adding some stuff that was missing. Main things were reorganizing the files, adding proper app folders to the dock, wiring up Tetris and Snake, and making the terminal actually worth using. Project Structure The original had everything dumped in the root folder — HTML, JS, CSS, MP4s, all mixed together. Moved media files into their own folder so at least it looks intentional. webos/ ├── index.html ├── css/ ├── js/ └── media/ Not revolutionary, but it was bothering me. Dock Folders The dock had too many individual icons and was getting messy. Grouped everything into three folders instead: Tools — Notes, Terminal, Calculator, Settings Games — Tetris, Snake, Pixel Art Media — Music Player Clicking a folder opens a small window, then clicking an app inside launches it. The dock went from 8+ icons to 6 . Also moved Settings into Tools because it was sitting in Media for some reason, which made no sense. Games Added Tetris and Snake . Both run on canvas, each in their own JS file so they don’t pollute apps.js . Tetris Ghost piece Wall kicks Hard drop with the Space bar Speeds up every 10 lines Snake WASD or Arrow Keys Apple won’t spawn on the snake body Also fixed the icons for both. They were using random SVGs that had nothing to do with the games. Tetris now shows an actual T-tetromino shape. Snake shows a little body of blocks with a pink apple dot. Terminal Commands The original terminal had about one command and it was useless ( help ). Rewrote the whole thing with stuff that I’d actually use: wp fuji/stars/matrix — Swap wallpaper without touching Settings theme dark/light — Quick theme switch from the keyboard calc 12*8+4 — Math without opening the Calculator app neofetch — Uptime, browser, current wallpaper, theme close <app> — Close any app by name cowsay fortune flip roll 20 color #hex — Inline colour swatch history — Last 20 commands rm -rf / and sudo — Try them help — Actually shows all of the commands
- Core Stabilizations and UI Additions Technical Changes Window Manager (Gallery Bug): Fixed a critical rendering issue where the Gallery window dropped. The window had no default dimension in the openWin() switch statement, and so did not match up with the CSS min-width constraint, leading to positional calc() errors. The explicit dimensions ( 600x500 ) solved the layout thrashing. Desktop Clock Widget: New clock widget that shows the current time, and is customizable and placed on top of the window manager’s stacking context but under the wallpaper layer. Asset Pipeline Refactor: Got rid of all redundant and large local media files from the wallpaperList . Optimized to a single remote CDN image to avoid 404’s and limit local storage costs. Boot Sequence UI: Changed linear opacity fades to a CSS3D transform that is accelerated by hardware. /* Boot sequence 3D transform snippet */ .boot-logo { animation : bootLogoAnim 2s cubic-bezier ( 0.22 , 1 , 0.36 , 1 ) infinite ; transform-style : preserve-3d ; }
Ships:
I made a very minimalist OS called Void OS
I finished my WEB OS . It took way longer then expected , i spent way to mush time reading articles and watching countless YouTube tutorials. I could have completed this project with my existing skills too but i wanted to use this opportunity to learn and improve. I did use AI wherever i got stuck, or have to solve some bug and for structuring my files and code . New Features: Added some basic games (snake, Tetris) Added a boot animation Wallpaper app Resizable windows A fully customisable clock in centre Gallery App Overall structure was improved like putting apps in dock to save space in bottom bar...
|
1792831849.0386996
|
1792918249.0386996
|
|
4353
|
InviteHub by @Mrithul_E | Stardance
|
Mrithul_E
|
2
|
85.0
|
1614
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-13T15:04:05Z", "hours": 4.0, "multiplier": 12.49, "payout": 49, "blessing": "neutral", "text": "I made a website for creating digital invitation webpages by simply selecting a template and filling out a form. This can help reduce paper usage by decreasing printed inviation lol .. I faced many challenges during the development: Building the logic for creating different different forms for each and every templates Limiting the total file size in http request Building a UI for creating forms by Drag-and-Droping Couldn’t host in vercel because vercel blocks requests more that ~4 MB Admin centralized working (only admin can create templates, this ensures security) I am proud of dedecating 3 months to complete this project, without doing any other project. To run my project my project you will need firebase api key, and hackclub cdn api. But you can’t get the already created templates because those are stored in firebase. what’s new in this ship 2 fixed some security vulnerability as per github code scan Added assets completely handmade with canva replaced many fonts in home page with cursive fonts added our mission section in the home page", "repo": "https://github.com/Mrithul-E/InviteHub", "demo": "https://invitehub.mrithul.in/"}, {"ship_num": 2, "ts": "2026-09-06T13:06:11Z", "hours": 81.0, "multiplier": 19.23, "payout": 1565, "blessing": "neutral", "text": "I made a website for creating digital invitation webpages by simply selecting a template and filling out a form. This can help reduce paper usage by decreasing printed inviation lol .. I faced many challenges during the development: Building the logic for creating different different forms for each and every templates Limiting the total file size in http request Building a UI for creating forms by Drag-and-Droping Couldn’t host in vercel because vercel blocks requests more that ~4 MB Admin centralized working (only admin can create templates, this ensures security) I am proud of dedecating 3 months to complete this project, without doing any other project. To run my project my project you will need firebase api key, and hackclub cdn api. But you can’t get the already created templates because those are stored in firebase.", "repo": "https://github.com/Mrithul-E/InviteHub", "demo": "https://invitehub.mrithul.in/"}]...
|
[{"post_id": 66105, "ts": "202 [{"post_id": 66105, "ts": "2026-09-11T18:10:15Z", "hours": 0.3892, "text": "Minor security fixes as per GitHub security scan Inclusion of functionality from an untrusted source Client-side URL redirect using query in URL"}, {"post_id": 66022, "ts": "2026-09-11T15:47:24Z", "hours": 1.2178, "text": "Some reworks readme updated added more gap in between the template card added the github link to the navbar changed some fonts in homepage and added some paragraph sections there"}, {"post_id": 64908, "ts": "2026-09-09T16:58:28Z", "hours": 1.6047, "text": "full css and ui rework: Changed the background image Made the design and animation minimalistic updated the navbar and footer removed unwanted styling in css removed unwanted gradient from text made minimal footer"}, {"post_id": 63600, "ts": "2026-09-07T14:55:46Z", "hours": 0.7089, "text": "Minor css fix removed many useless css code. Made it more good. not that the gradients are not generated by AI, instead it is generated by online CSS gradient maker. Don’t this that this is a AI generated/AI styled project. This site doesn’t have that much huge css to use AI. The Login with Google button is copied by some article in Medium. The gradient used in the home page Get Started button is custom made using CSS gradient generator The background image and the animated phone image is generated by Chatgpt. I don’t know whether this is contributing to the AI feel 🥲🥲😭😭 UPDATE: : By asking to shipwrights, they say that it was flagged and AI because it used AI generated images, which is not allowed. So i made it my self using canva, here it is:"}, {"post_id": 62873, "ts": "2026-09-06T12:22:58Z", "hours": 0.3833, "text": "Fix: Chrome media hub staying active even when video stops fixed this by removing the src and loading the video again into chrome’s memory, this solves the problem ."}, {"post_id": 62835, "ts": "2026-09-06T11:22:25Z", "hours": 1.3864, "text": "Added demo video to the home page Updated README.md and also fixed many minor css and html issues"}, {"post_id": 62397, "ts": "2026-09-05T18:51:00Z", "hours": 1.4019, "text": "Added README.md !! *Not comleted yet, no images and videos are added yet"}, {"post_id": 62092, "ts": "2026-09-05T10:41:55Z", "hours": 1.1986, "text": "Added the pages such as About, privacy-policies etc… Added About, Privacy policies , Terms of service page in hbs and added the corresponding routers for it"}, {"post_id": 62018, "ts": "2026-09-05T07:10:46Z", "hours": 0.5586, "text": "Added confirmation for logout and Added redirect to the last visited URL in login Added redirect to the last visited URL in login Added confirmation for logout, and made the logout route a long random string"}, {"post_id": 61684, "ts": "2026-09-04T18:32:50Z", "hours": 3.3572, "text": "Added ‘My invitations’ section in website Added My invitations section that shows the invitations created by that user. From here user can see the invitation, creation date, and user can also delete the invitation. Delete option will delete all files that are part of that invitation from the cdn, then delete the complete invitation from the db. And also added some minor fixes such as: webpage title issues added favicon etc…"}, {"post_id": 61049, "ts": "2026-09-03T19:19:07Z", "hours": 1.6256, "text": "User experience improvement implemented: made the created invitation url return fron server to frontend removed unwanted console.log used for debugging made the “Get started” button in frontend functional Added: invitation link and copy button in invitation creation form submission page"}, {"post_id": 60427, "ts": "2026-09-02T18:50:07Z", "hours": 1.5317, "text": "Added search option in templates Implemented using Fuse.js *images are placeholders"}, {"post_id": 60264, "ts": "2026-09-02T15:01:57Z", "hours": 1.1522, "text": "Reached initial working stage First working template added Added: render of hbs from cdn rendering of custom form from database"}, {"post_id": 59313, "ts": "2026-09-01T01:12:28Z", "hours": 2.1864, "text": "added template and form rendering from Database"}, {"post_id": 58317, "ts": "2026-08-30T18:12:36Z", "hours": 4.9681, "text": "Added a option to write the template(HBS) and the form from frontend implemented: option to write the template(HBS) and the form from frontend hbs to CDN script 10 MB fields limit in template creation router (multer) Invitation total file size limit 50 MB (formidable) Invitation data processing and cleanup"}, {"post_id": 56814, "ts": "2026-08-28T18:55:14Z", "hours": 1.57, "text": "Connected the form created using jquery forms to HackClub CDN My website is basically a site that have many templates for different kind of event. A user can select a template , this will redirect to a form. Each template have entirely different forms , each form is created by the Admin using a jquery form builder ui. Because these form structures are unknow to the server, the server dont know how much file input fields are there. so we cant set a limit on number of file input fields and per input size. So I set a 50 MB total upload limit using formidable before sending files to hackclub cdn. This makes the usage fair."}, {"post_id": 56609, "ts": "2026-08-28T13:05:06Z", "hours": 1.4072, "text": "Handle multipart uploads with file size limits using busboy formidable ✓ In the last devlog I shared a very large code to limit max total requiest size using busboy. Yesterday , In a simple google search , the Google AI mode suggested me of Formidable previously idk formidable … So I learned about that , it made my code so tiny frontend logic was already there"}, {"post_id": 54984, "ts": "2026-08-26T12:38:33Z", "hours": 2.4072, "text": "Handle multipart uploads with file size limits using busboy i want to limit the max total file upload to 50 MB, multer cant have this feature so I use busboy and wrote long long code to solve this problem code :"}, {"post_id": 54621, "ts": "2026-08-25T17:23:09Z", "hours": 0.6072, "text": "Research: How to limit the total file size in a multipart/formData (Express.js) After many searches I found out that multer don’t support this I am planning to use Busboy directly"}, {"post_id": 54387, "ts": "2026-08-25T11:35:57Z", "hours": 2.1842, "text": "Added error messages in data submissions in rendered template form Added a 50 MB file size limit in file upload (for now only frontend checks are implemented, backend check is TODO)."}, {"post_id": 51711, "ts": "2026-08-21T15:19:40Z", "hours": 2.8461, "text": "Added delete template option for admin The delete option will delete the template from the database and also delete the thumbnail image stored in hackclub CDN"}, {"post_id": 34488, "ts": "2026-07-25T07:52:12Z", "hours": 4.4856, "text": "Switched from formeo to jquery form builder formeo doesn’t support many input types"}, {"post_id": 30066, "ts": "2026-07-17T10:51:07Z", "hours": 1.1742, "text": "Researching on custom form builder On deep research on making a custom form builder form my each templates , I found : formeo, jquery form builder and survayJS"}, {"post_id": 28398, "ts": "2026-07-14T17:08:38Z", "hours": 4.6656, "text": "connected the admin only template creation form to the firestore AND also made the template cards load dynamically currently provided image is a placeholder This is admin page , only admin page have create template button"}, {"post_id": 25450, "ts": "2026-07-09T18:43:35Z", "hours": 1.7492, "text": "Added hackclub cdn to the project !!! At first it didn’t worked because of compatibly issue of new nodejs’s fetch and npm form-data module fixed using new build-in formData()"}, {"post_id": 23622, "ts": "2026-07-06T18:04:21Z", "hours": 2.0433, "text": "new knoledge unlocked: I can use : app . use ( ' /admin ' , requireAdmin , adminRouter ) instead of : app . use ( requireAdmin ) app . use ( ' /admin ' , adminRouter ) I know everybody knows this, but this is a knowledge to me"}, {"post_id": 21534, "ts": "2026-07-03T15:40:01Z", "hours": 1.2683, "text": "added a very very cool text area for entering description for each field completely build on bootstrap accordion check it out !!!"}, {"post_id": 20136, "ts": "2026-07-01T17:55:02Z", "hours": 1.2319, "text": "First template design completed !!! fully using Bootstrap , and some css"}, {"post_id": 19898, "ts": "2026-07-01T10:16:49Z", "hours": 1.5828, "text": "Continuing the writting of the first template for the site !!! basically my project is a invitation page builder, it needs a lot of custom template. | ▽ not complete yet"}, {"post_id": 18554, "ts": "2026-06-29T18:58:19Z", "hours": 6.7694, "text": "Devlog 6 - Template creation form In this 6h 44m, I made a lot of features but the main highlight was the work on the template creation form ( continuation of previous devlog) Story Time: Basically my project is a wedding invitation page generator. My website will have a lot of prebuild invitation template(HBS) for different different events So the point is different templates require different forms should be filled by the user. Therefore when the admin create different template, the admin should list the require fields for the form of the specific template. Problems faced: My thoughts was to make a prebuild list of fields, from that the admin should list them in specific order. Problem - 1 The first problem was there is no form element to do these. So i used a select element with a ‘Add’ btn. For the sorting, at first i used up/down button, but that wasn’t smooth. After researching I found sortable js. At first sortable js also was not smooth, I fixed that by removing some bootstrap classes from the tag. Problem - 2 The next problem I faced was I cant use required in the custom fields list maker, So I can’t make that field mandatory. Solution (simple) The solution was simple, I made a invisible <textarea required .....> , and add the list of fields to that in json string when the admin edited the list. Thank you for reading ❤️, Mrithul."}, {"post_id": 15040, "ts": "2026-06-24T12:54:36Z", "hours": 4.9608, "text": "Devlog 5 - Templates Page Spent 4 hours and 52 minutes working on the templates page today. This page is going to be the main place where all invitation templates are managed, so I wanted to get the basic structure done before moving on to creating more templates. Templates Grid The first thing I worked on was the layout. I switched the page to a responsive grid system and started building the actual templates page. I also added a Create Template card that is only visible to admins. Clicking the card opens a modal for creating new templates. Template Creation Modal The modal is still incomplete, but the basic flow is now working. Currently it has fields for: Template name HTML file name Preview image Template category Template fields There’s still quite a bit of work left to do here, but at least the structure is finally in place. Template Categories & Fields One thing I didn’t want to do was create a completely separate form for every invitation type. Instead, I’m building a system where templates can be configured using categories and predefined fields. const templateCategories = [ { id : \" wedding \" , name : \" Wedding \" }, { id : \" engagement \" , name : \" Engagement \" }, { id : \" birthday \" , name : \" Birthday \" } .... ] const templateFields = [ { id : \" eventTitle \" , label : \" Event Title \" , type : \" text \" , category : \" common \" }, { id : \" groomName \" , label : \" Groom Name \" , type : \" text \" , category : \" wedding \" } .... ] Right now I’ve added categories for weddings, birthdays, engagements, housewarmings, baby showers and several other event types. The field system should make adding future templates a lot easier. Small UI Improvements I also spent some time cleaning up the page and added a footer. The site is slowly starting to look more like an actual product instead of a collection of pages. Next The next step is finishing the template creation page and making the field selection system fully functional. Once that’s done, adding new templates should be much faster than it is right now."}, {"post_id": 8246, "ts": "2026-06-13T18:26:46Z", "hours": 1.1044, "text": "Devlog - 4 Today I connected my website to firestore for database I have implemented the saving of login information of user to user collection of firestore database This is the implementation code: service\\userService.js : async function saveUserLogin ( userRecord ) { return db . collection ( \" users \" ) . doc ( userRecord . uid ) . set ( { displayName : userRecord . displayName || null , email : userRecord . email , photoURL : userRecord . photoURL || null , lastLoginAt : new Date ( userRecord . metadata . lastSignInTime ) }, { merge : true } ) } service\\userService.js : router . post ( \" /sessionLogin \" , async ( req , res ) => { const idToken = req . body . idToken ; const expiresIn = 60 * 60 * 24 * 13 * 1000 ; try { const sessionCookie = await admin . auth (). createSessionCookie ( idToken , { expiresIn : expiresIn }); const options = { maxAge : expiresIn , httpOnly : true , secure : false }; const decodedClaims = await admin . auth (). verifySessionCookie ( sessionCookie , true ); const userRecord = await admin . auth (). getUser ( decodedClaims . uid ); await saveUserLogin ( userRecord ) res . cookie ( ' session ' , sessionCookie , options ) res . status ( 200 ). send ({ status : \" success \" }) } catch ( err ) { console . error ( err ) res . status ( 401 ). send ( ' Unauthorized request! ' ); } }) I also created the redirect from login page if login successful / refresh in login fail (these things where previously missing) Also there are many UI improvements made, that’s not written in this Devlog (●’◡’●)"}, {"post_id": 7934, "ts": "2026-06-13T07:31:13Z", "hours": 8.3672, "text": "Devlog Time spent: 8 hours 15 minutes across ~6 days This week I mostly worked on security-related improvements and continued work on the invitation template system. Security Fixes When I opened GitHub, I got a security notification. After checking it, I found that a Firebase client-side API key was present in the repository. I know Firebase client API keys are not secret credentials by themselves, but leaving them exposed can still make abuse easier, especially if other protections are missing. Since the project is still in development, I decided to clean it up now rather than later. What I did: Revoked the old API key Generated a new one Moved the configuration into environment variables Made sure sensitive files are not pushed to GitHub res . locals . firebaseClientCred = Buffer . from ( process . env . firebaseClientCred , \" base64 \" ) . toString ( \" utf-8 \" ); The long-term plan is to separate development and production configurations. Right now localhost access is required for development, so strict domain restrictions are not practical yet. Once the project is deployed, I plan to have: A development API configuration that allows localhost A production API configuration that only allows requests from the final website domain The developer configuration will stay out of production deployments. Even if development code is accidentally pushed, it should fail instead of exposing access that was never intended for production. The backend Firebase SDK setup was already safe, so most of this work was focused on the client-side configuration. Navbar Improvements I also implemented automatic navbar link highlighting. Instead of manually setting the active page for every route, the navbar now checks the current URL and highlights the correct link automatically. function highlightCurrentPageLink () { const currentPageUrl = window . location . pathname ; const links = document . querySelectorAll ( \" #navbar-ul li a \" ); links . forEach (( link ) => { const href = link . getAttribute ( \" href \" ); if ( href . split ( \" / \" )[ 1 ] === currentPageUrl . split ( \" / \" )[ 1 ]) { link . classList . add ( \" active \" ); } else { link . classList . remove ( \" active \" ); } }); } Small change, but it makes maintaining the navigation much easier. User Menu Worked on the user menu and logout functionality. Nothing huge here, but it is another piece of the authentication flow that is now coming together. Template System I created the HBS file structure for the template page and spent a lot of time thinking about how templates should actually be implemented. This is currently the biggest blocker. There are several ways to handle template rendering and customization, and I don’t want to lock myself into a design that becomes difficult to maintain later. A lot of the development time this week went into planning, experimenting, and changing approaches rather than writing large amounts of code. Next Create separate Firebase development and production configurations Add domain restrictions after deployment Continue work on the invitation template system Finish the template rendering workflow Improve user account features There is still a lot to do, but the project is becoming more stable and secure before moving further into feature development."}, {"post_id": 3693, "ts": "2026-06-06T18:57:54Z", "hours": 2.5967, "text": "Devlog-2: Today , I added a beautiful animation to the home page made the home page overall beautiful Also fixed a authentication error : the fix was simple - I accidently wrote (res, req) instead of (req, res) in express router Also completed the login page design What’s next : Surely build a footer tomorrow 😁 Also planning to create a template creation tool for Admin Note: the PHONE image have a cool animation effect. completely done by hands , no AI only used AI for clearing doubt"}, {"post_id": 2855, "ts": "2026-06-05T18:18:17Z", "hours": 8.5736, "text": "Login Page within 8h 33m , I made the home page, firebase auth, designed logo etc.. currently I am working on designing the ‘Login with google’ page I thought I should only submit and link the project after completing the full project … 😟 but I didn’t forget to connect hackatime 😁🥳"}]...
|
Title: InviteHub by @Mrithul_E | Stardance
Devlog Title: InviteHub by @Mrithul_E | Stardance
Devlogs:
Login Page within 8h 33m , I made the home page, firebase auth, designed logo etc.. currently I am working on designing the ‘Login with google’ page I thought I should only submit and link the project after completing the full project … 😟 but I didn’t forget to connect hackatime 😁🥳
Devlog-2: Today , I added a beautiful animation to the home page made the home page overall beautiful Also fixed a authentication error : the fix was simple - I accidently wrote (res, req) instead of (req, res) in express router Also completed the login page design What’s next : Surely build a footer tomorrow 😁 Also planning to create a template creation tool for Admin Note: the PHONE image have a cool animation effect. completely done by hands , no AI only used AI for clearing doubt
Devlog Time spent: 8 hours 15 minutes across ~6 days This week I mostly worked on security-related improvements and continued work on the invitation template system. Security Fixes When I opened GitHub, I got a security notification. After checking it, I found that a Firebase client-side API key was present in the repository. I know Firebase client API keys are not secret credentials by themselves, but leaving them exposed can still make abuse easier, especially if other protections are missing. Since the project is still in development, I decided to clean it up now rather than later. What I did: Revoked the old API key Generated a new one Moved the configuration into environment variables Made sure sensitive files are not pushed to GitHub res . locals . firebaseClientCred = Buffer . from ( process . env . firebaseClientCred , " base64 " ) . toString ( " utf-8 " ); The long-term plan is to separate development and production configurations. Right now localhost access is required for development, so strict domain restrictions are not practical yet. Once the project is deployed, I plan to have: A development API configuration that allows localhost A production API configuration that only allows requests from the final website domain The developer configuration will stay out of production deployments. Even if development code is accidentally pushed, it should fail instead of exposing access that was never intended for production. The backend Firebase SDK setup was already safe, so most of this work was focused on the client-side configuration. Navbar Improvements I also implemented automatic navbar link highlighting. Instead of manually setting the active page for every route, the navbar now checks the current URL and highlights the correct link automatically. function highlightCurrentPageLink () { const currentPageUrl = window . location . pathname ; const links = document . querySelectorAll ( " #navbar-ul li a " ); links . forEach (( link ) => { const href = link . getAttribute ( " href " ); if ( href . split ( " / " )[ 1 ] === currentPageUrl . split ( " / " )[ 1 ]) { link . classList . add ( " active " ); } else { link . classList . remove ( " active " ); } }); } Small change, but it makes maintaining the navigation much easier. User Menu Worked on the user menu and logout functionality. Nothing huge here, but it is another piece of the authentication flow that is now coming together. Template System I created the HBS file structure for the template page and spent a lot of time thinking about how templates should actually be implemented. This is currently the biggest blocker. There are several ways to handle template rendering and customization, and I don’t want to lock myself into a design that becomes difficult to maintain later. A lot of the development time this week went into planning, experimenting, and changing approaches rather than writing large amounts of code. Next Create separate Firebase development and production configurations Add domain restrictions after deployment Continue work on the invitation template system Finish the template rendering workflow Improve user account features There is still a lot to do, but the project is becoming more stable and secure before moving further into feature development.
Devlog - 4 Today I connected my website to firestore for database I have implemented the saving of login information of user to user collection of firestore database This is the implementation code: service\userService.js : async function saveUserLogin ( userRecord ) { return db . collection ( " users " ) . doc ( userRecord . uid ) . set ( { displayName : userRecord . displayName || null , email : userRecord . email , photoURL : userRecord . photoURL || null , lastLoginAt : new Date ( userRecord . metadata . lastSignInTime ) }, { merge : true } ) } service\userService.js : router . post ( " /sessionLogin " , async ( req , res ) => { const idToken = req . body . idToken ; const expiresIn = 60 * 60 * 24 * 13 * 1000 ; try { const sessionCookie = await admin . auth (). createSessionCookie ( idToken , { expiresIn : expiresIn }); const options = { maxAge : expiresIn , httpOnly : true , secure : false }; const decodedClaims = await admin . auth (). verifySessionCookie ( sessionCookie , true ); const userRecord = await admin . auth (). getUser ( decodedClaims . uid ); await saveUserLogin ( userRecord ) res . cookie ( ' session ' , sessionCookie , options ) res . status ( 200 ). send ({ status : " success " }) } catch ( err ) { console . error ( err ) res . status ( 401 ). send ( ' Unauthorized request! ' ); } }) I also created the redirect from login page if login successful / refresh in login fail (these things where previously missing) Also there are many UI improvements made, that’s not written in this Devlog (●’◡’●)
Devlog 5 - Templates Page Spent 4 hours and 52 minutes working on the templates page today. This page is going to be the main place where all invitation templates are managed, so I wanted to get the basic structure done before moving on to creating more templates. Templates Grid The first thing I worked on was the layout. I switched the page to a responsive grid system and started building the actual templates page. I also added a Create Template card that is only visible to admins. Clicking the card opens a modal for creating new templates. Template Creation Modal The modal is still incomplete, but the basic flow is now working. Currently it has fields for: Template name HTML file name Preview image Template category Template fields There’s still quite a bit of work left to do here, but at least the structure is finally in place. Template Categories & Fields One thing I didn’t want to do was create a completely separate form for every invitation type. Instead, I’m building a system where templates can be configured using categories and predefined fields. const templateCategories = [ { id : " wedding " , name : " Wedding " }, { id : " engagement " , name : " Engagement " }, { id : " birthday " , name : " Birthday " } .... ] const templateFields = [ { id : " eventTitle " , label : " Event Title " , type : " text " , category : " common " }, { id : " groomName " , label : " Groom Name " , type : " text " , category : " wedding " } .... ] Right now I’ve added categories for weddings, birthdays, engagements, housewarmings, baby showers and several other event types. The field system should make adding future templates a lot easier. Small UI Improvements I also spent some time cleaning up the page and added a footer. The site is slowly starting to look more like an actual product instead of a collection of pages. Next The next step is finishing the template creation page and making the field selection system fully functional. Once that’s done, adding new templates should be much faster than it is right now.
Devlog 6 - Template creation form In this 6h 44m, I made a lot of features but the main highlight was the work on the template creation form ( continuation of previous devlog) Story Time: Basically my project is a wedding invitation page generator. My website will have a lot of prebuild invitation template(HBS) for different different events So the point is different templates require different forms should be filled by the user. Therefore when the admin create different template, the admin should list the require fields for the form of the specific template. Problems faced: My thoughts was to make a prebuild list of fields, from that the admin should list them in specific order. Problem - 1 The first problem was there is no form element to do these. So i used a select element with a ‘Add’ btn. For the sorting, at first i used up/down button, but that wasn’t smooth. After researching I found sortable js. At first sortable js also was not smooth, I fixed that by removing some bootstrap classes from the tag. Problem - 2 The next problem I faced was I cant use required in the custom fields list maker, So I can’t make that field mandatory. Solution (simple) The solution was simple, I made a invisible <textarea required .....> , and add the list of fields to that in json string when the admin edited the list. Thank you for reading ❤️, Mrithul.
Continuing the writting of the first template for the site !!! basically my project is a invitation page builder, it needs a lot of custom template. | ▽ not complete yet
First template design completed !!! fully using Bootstrap , and some css
added a very very cool text area for entering description for each field completely build on bootstrap accordion check it out !!!
new knoledge unlocked: I can use : app . use ( ' /admin ' , requireAdmin , adminRouter ) instead of : app . use ( requireAdmin ) app . use ( ' /admin ' , adminRouter ) I know everybody knows this, but this is a knowledge to me
Added hackclub cdn to the project !!! At first it didn’t worked because of compatibly issue of new nodejs’s fetch and npm form-data module fixed using new build-in formData()
connected the admin only template creation form to the firestore AND also made the template cards load dynamically currently provided image is a placeholder This is admin page , only admin page have create template button
Researching on custom form builder On deep research on making a custom form builder form my each templates , I found : formeo, jquery form builder and survayJS
Switched from formeo to jquery form builder formeo doesn’t support many input types
Added delete template option for admin The delete option will delete the template from the database and also delete the thumbnail image stored in hackclub CDN
Added error messages in data submissions in rendered template form Added a 50 MB file size limit in file upload (for now only frontend checks are implemented, backend check is TODO).
Research: How to limit the total file size in a multipart/formData (Express.js) After many searches I found out that multer don’t support this I am planning to use Busboy directly
Handle multipart uploads with file size limits using busboy i want to limit the max total file upload to 50 MB, multer cant have this feature so I use busboy and wrote long long code to solve this problem code :
Handle multipart uploads with file size limits using busboy formidable ✓ In the last devlog I shared a very large code to limit max total requiest size using busboy. Yesterday , In a simple google search , the Google AI mode suggested me of Formidable previously idk formidable … So I learned about that , it made my code so tiny frontend logic was already there
Connected the form created using jquery forms to HackClub CDN My website is basically a site that have many templates for different kind of event. A user can select a template , this will redirect to a form. Each template have entirely different forms , each form is created by the Admin using a jquery form builder ui. Because these form structures are unknow to the server, the server dont know how much file input fields are there. so we cant set a limit on number of file input fields and per input size. So I set a 50 MB total upload limit using formidable before sending files to hackclub cdn. This makes the usage fair.
Added a option to write the template(HBS) and the form from frontend implemented: option to write the template(HBS) and the form from frontend hbs to CDN script 10 MB fields limit in template creation router (multer) Invitation total file size limit 50 MB (formidable) Invitation data processing and cleanup
added template and form rendering from Database
Reached initial working stage First working template added Added: render of hbs from cdn rendering of custom form from database
Added search option in templates Implemented using Fuse.js *images are placeholders
User experience improvement implemented: made the created invitation url return fron server to frontend removed unwanted console.log used for debugging made the “Get started” button in frontend functional Added: invitation link and copy button in invitation creation form submission page
Added ‘My invitations’ section in website Added My invitations section that shows the invitations created by that user. From here user can see the invitation, creation date, and user can also delete the invitation. Delete option will delete all files that are part of that invitation from the cdn, then delete the complete invitation from the db. And also added some minor fixes such as: webpage title issues added favicon etc…
Added confirmation for logout and Added redirect to the last visited URL in login Added redirect to the last visited URL in login Added confirmation for logout, and made the logout route a long random string
Added the pages such as About, privacy-policies etc… Added About, Privacy policies , Terms of service page in hbs and added the corresponding routers for it
Added README.md !! *Not comleted yet, no images and videos are added yet
Added demo video to the home page Updated README.md and also fixed many minor css and html issues
Fix: Chrome media hub staying active even when video stops fixed this by removing the src and loading the video again into chrome’s memory, this solves the problem .
Minor css fix removed many useless css code. Made it more good. not that the gradients are not generated by AI, instead it is generated by online CSS gradient maker. Don’t this that this is a AI generated/AI styled project. This site doesn’t have that much huge css to use AI. The Login with Google button is copied by some article in Medium. The gradient used in the home page Get Started button is custom made using CSS gradient generator The background image and the animated phone image is generated by Chatgpt. I don’t know whether this is contributing to the AI feel 🥲🥲😭😭 UPDATE: : By asking to shipwrights, they say that it was flagged and AI because it used AI generated images, which is not allowed. So i made it my self using canva, here it is:
full css and ui rework: Changed the background image Made the design and animation minimalistic updated the navbar and footer removed unwanted styling in css removed unwanted gradient from text made minimal footer
Some reworks readme updated added more gap in between the template card added the github link to the navbar changed some fonts in homepage and added some paragraph sections there
Minor security fixes as per GitHub security scan Inclusion of functionality from an untrusted source Client-side URL redirect using query in URL
Ships:
I made a website for creating digital invitation webpages by simply selecting a template and filling out a form. This can help reduce paper usage by decreasing printed inviation lol .. I faced many challenges during the development: Building the logic for creating different different forms for each and every templates Limiting the total file size in http request Building a UI for creating forms by Drag-and-Droping Couldn’t host in vercel because vercel blocks requests more that ~4 MB Admin centralized working (only admin can create templates, this ensures security) I am proud of dedecating 3 months to complete this project, without doing any other project. To run my project my project you will need firebase api key, and hackclub cdn api. But you can’t get the already created templates because those are stored in firebase.
I made a website for creating digital invitation webpages by simply selecting a template and filling out a form. This can help reduce paper usage by decreasing printed inviation lol .. I faced many challenges during the development: Building the logic for creating different different forms for each and every templates Limiting the total file size in http request Building a UI for creating forms by Drag-and-Droping Couldn’t host in vercel because vercel blocks requests more that ~4 MB Admin centralized working (only admin can create templates, this ensures security) I am proud of dedecating 3 months to complete this project, without doing any other project. To run my project my project you will need firebase api key, and hackclub cdn api. But you can’t get the already created templates because those are stored in firebase. what’s new in this ship 2 fixed some security vulnerability as per github code scan Added assets completely handmade with canva replaced many fonts in home page with cursive fonts added our mission section in the home page...
|
1792817615.3508716
|
1792904015.3508716
|
|
4426
|
Space In Your Place! by @SpaceEvee | Stardance
|
SpaceEvee
|
2
|
9.0
|
117
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-03T15:04:51Z", "hours": 4.0, "multiplier": 15.6, "payout": 70, "blessing": "neutral", "text": "A real-time N-body gravitational simulation built using Python and Pygame. This project models planetary motion, multi-body systems, and orbital mechanics using Verlet integration for improved stability and energy behavior. SHIP 2: Added a Main Menu GUI (Final Ship)", "repo": "https://github.com/Evyvaan-Space-Lover/Planetary-Body-Simulation", "demo": "https://github.com/Evyvaan-Space-Lover/Planetary-Body-Simulation/releases/tag/v1.2"}, {"ship_num": 2, "ts": "2026-06-09T15:14:41Z", "hours": 5.0, "multiplier": 10.35, "payout": 47, "blessing": "neutral", "text": "I have made an N-body simulation that simulates and plots the behavior of a plethora of bodies in different configurations. I am very proud of the Verlet integration configured in the program. It was very hard for me to figure that out but I had a lot of fun doing that. The collisions and rendering were especially hard for me to integrate as it was my first time using Pygame. I had started the project some time ago (before I even knew about Stardance).", "repo": "https://github.com/Evyvaan-Space-Lover/Planetary-Body-Simulation", "demo": "https://github.com/Evyvaan-Space-Lover/Planetary-Body-Simulation/releases/tag/v1.2"}]...
|
[{"post_id": 21517, "ts": "202 [{"post_id": 21517, "ts": "2026-07-03T15:02:17Z", "hours": 3.6906, "text": "DEVLOG - 4 (or 5? idk man) - Space In YOUR Place YOOOO, So I had recently shipped this project, and I got a lot of helpful feedback! One of the most common feedback was that the program needed a better UI/UX, so I added a main menu (it looks so bad) . One more feedback was that MacOS users can not use it: I can’t do anything ’bout that. Get windows lol print ( \" you have skill issue \" ) Main Menu GUI I basically made my CLI into a GUI (The CLI is still usable, if anyone wants to use it. I like the CLI more ’cuz it gives more flexibility) I also stars in the background. They look pretty decent (They are ANIMATED!). Also, for some reason the plots BROKE, idk why so I had to fix that too. I am gonna ship again, and finally let this project rest in peace. I am happy with how this turned out and I have wasted enough time on it (Even before stardance started FYI). I am gonna fully focus on other projects now (CHECK OUT an EPIC Light Sail simulation NOW, its simulation I am working on for my paper) Well, that’s it for me today, hope YOU have a wonderful time, all the time! (Markdown so weird gng)"}, {"post_id": 5634, "ts": "2026-06-09T14:40:47Z", "hours": 1.4072, "text": "DEVLOG 3 final devlog for this project. so i added a help command and a way to screen shot whilst running a simulation."}, {"post_id": 5571, "ts": "2026-06-09T12:18:49Z", "hours": 0.7903, "text": "DEVLOG 2 so last time, i configured the 3d plots wrong so they didnt plot anything have fixed it now"}, {"post_id": 5027, "ts": "2026-06-08T18:00:11Z", "hours": 2.3028, "text": "SPACE IN YOUR PLACE! After several months of development, I’ve finally published my first major physics project: A Planetary Body Simulation. This is a real-time N-body gravitational simulator written in Python using Pygame. The goal of the project was to explore orbital mechanics, chaotic systems, and numerical simulation while building an interactive application that visualizes how celestial bodies move under gravity. Features Current systems included in the simulator: -Solar System simulation -Binary star system -Three-body chaotic system -Gravitational slingshot demonstration -Lagrange point (L4 & L5) system -Horseshoe orbit system -(I want to add more) Other features: -Verlet integration (had to spen an AMOUNT of time to ad Verlet) -Energy analysis (KE, PE, Total Energy) -Velocity plotting -Camera controls and zoom -Trail rendering -Configurable timestep Physics Concepts The simulator uses: Newtonian gravity N-body interactions Orbital mechanics Energy conservation Chaotic dynamics One of the most interesting things I discovered while building this project was how sensitive some systems are to numerical accuracy. Small changes in timestep can dramatically affect long-term stability, especially in chaotic systems. New Feature Added Today! Today I added 3D trajectory visualization. Instead of only plotting motion in X-Y space, the simulator can now generate a 3D graph where: X-axis = X Position Y-axis = Y Position Z-axis = Time This allows orbital motion to be visualized as a path through time rather than just a flat orbit. Stable systems produce smooth helical structures, while chaotic systems create much more complex patterns. This was my first time working with Matplotlib’s 3D plotting tools, and integrating the graphing system with the existing simulation data took some experimentation. 🔧 Challenges During Development Some problems I had to solve while building the simulator: -Numerical instability -Energy conservation issues -Chaotic three-body behavior -Restart system bugs -Data collection for plotting A lot of development time was spent debugging rather than adding features, but that ended up teaching me much more about simulation and computational physics. What’s Next? Potential future improvements: -True 3D simulation (maybe) -Adaptive timestep system -Better visualization tools -Collision handling -More orbital systems"}]...
|
Title: Space In Your Place! by @SpaceEvee | Starda Title: Space In Your Place! by @SpaceEvee | Stardance
Devlogs:
SPACE IN YOUR PLACE! After several months of development, I’ve finally published my first major physics project: A Planetary Body Simulation. This is a real-time N-body gravitational simulator written in Python using Pygame. The goal of the project was to explore orbital mechanics, chaotic systems, and numerical simulation while building an interactive application that visualizes how celestial bodies move under gravity. Features Current systems included in the simulator: -Solar System simulation -Binary star system -Three-body chaotic system -Gravitational slingshot demonstration -Lagrange point (L4 & L5) system -Horseshoe orbit system -(I want to add more) Other features: -Verlet integration (had to spen an AMOUNT of time to ad Verlet) -Energy analysis (KE, PE, Total Energy) -Velocity plotting -Camera controls and zoom -Trail rendering -Configurable timestep Physics Concepts The simulator uses: Newtonian gravity N-body interactions Orbital mechanics Energy conservation Chaotic dynamics One of the most interesting things I discovered while building this project was how sensitive some systems are to numerical accuracy. Small changes in timestep can dramatically affect long-term stability, especially in chaotic systems. New Feature Added Today! Today I added 3D trajectory visualization. Instead of only plotting motion in X-Y space, the simulator can now generate a 3D graph where: X-axis = X Position Y-axis = Y Position Z-axis = Time This allows orbital motion to be visualized as a path through time rather than just a flat orbit. Stable systems produce smooth helical structures, while chaotic systems create much more complex patterns. This was my first time working with Matplotlib’s 3D plotting tools, and integrating the graphing system with the existing simulation data took some experimentation. 🔧 Challenges During Development Some problems I had to solve while building the simulator: -Numerical instability -Energy conservation issues -Chaotic three-body behavior -Restart system bugs -Data collection for plotting A lot of development time was spent debugging rather than adding features, but that ended up teaching me much more about simulation and computational physics. What’s Next? Potential future improvements: -True 3D simulation (maybe) -Adaptive timestep system -Better visualization tools -Collision handling -More orbital systems
DEVLOG 2 so last time, i configured the 3d plots wrong so they didnt plot anything have fixed it now
DEVLOG 3 final devlog for this project. so i added a help command and a way to screen shot whilst running a simulation.
DEVLOG - 4 (or 5? idk man) - Space In YOUR Place YOOOO, So I had recently shipped this project, and I got a lot of helpful feedback! One of the most common feedback was that the program needed a better UI/UX, so I added a main menu (it looks so bad) . One more feedback was that MacOS users can not use it: I can’t do anything ’bout that. Get windows lol print ( " you have skill issue " ) Main Menu GUI I basically made my CLI into a GUI (The CLI is still usable, if anyone wants to use it. I like the CLI more ’cuz it gives more flexibility) I also stars in the background. They look pretty decent (They are ANIMATED!). Also, for some reason the plots BROKE, idk why so I had to fix that too. I am gonna ship again, and finally let this project rest in peace. I am happy with how this turned out and I have wasted enough time on it (Even before stardance started FYI). I am gonna fully focus on other projects now (CHECK OUT an EPIC Light Sail simulation NOW, its simulation I am working on for my paper) Well, that’s it for me today, hope YOU have a wonderful time, all the time! (Markdown so weird gng)
Ships:
I have made an N-body simulation that simulates and plots the behavior of a plethora of bodies in different configurations. I am very proud of the Verlet integration configured in the program. It was very hard for me to figure that out but I had a lot of fun doing that. The collisions and rendering were especially hard for me to integrate as it was my first time using Pygame. I had started the project some time ago (before I even knew about Stardance).
A real-time N-body gravitational simulation built using Python and Pygame. This project models planetary motion, multi-body systems, and orbital mechanics using Verlet integration for improved stability and energy behavior. SHIP 2: Added a Main Menu GUI (Final Ship)...
|
1792810424.3443863
|
1792896824.3443863
|
|
4754
|
creating my personal website by @alyah | Stardance
|
alyah
|
2
|
16.0
|
54
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-02T05:39:12Z", "hours": 8.0, "multiplier": 6.73, "payout": 54, "blessing": "neutral", "text": "I made “alyah’s cafe”, my own website/digital portfolio with a cafe-themed aspect and creatives that I thought embodied who I was. this was my first ever website, and I used building it as a learning opportunity to use human made open source documentation and strive away from AI and vibecoding. I came across numerous bugs and issues throughout the 16 hours I’ve spent so far, but each has also taught me more and more about the basics of web design (learn from ur mistakes!). for something I started when I barely knew anything, i’ve come so far. I hope to continue developing more sections, adding more interactive details (aquarium coming soon!) and using more advanced javascript.", "repo": "https://github.com/lyri3aly/alyahs-cafe", "demo": "https://alyahli.ca"}, {"ship_num": 2, "ts": "2026-07-31T18:01:25Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i’m really proud of how this first draft came out. really excited for people to actually be able to use and view my website from an actual link! i have many more ideas for the future, outside of just finishing the design and adding more content. i’ve learned a lot about html and css from coding this current version, so i’m hoping to expand on that using my creative skills but also use more javascript. follow along :)", "repo": "https://github.com/lyri3aly/alyahs-cafe", "demo": "https://alyahli.ca"}]...
|
[{"post_id": 60059, "ts": "202 [{"post_id": 60059, "ts": "2026-09-02T05:18:29Z", "hours": 2.845, "text": "final devlog of v2 before my first official ship :) i added a few new features and “easter eggs”! the stars around the page are draggable and you can place them anywhere like stickers. the “welcome to alyah’s cafe” text shows a typing animating when you first enter the website. i’ve also customized the scrollbar and cursors. also a few major bugfixes: navbar section detection was not working at all and taking you to random places mobile display! everything has been formated @media so those on phones can see all content properly formatted as well theres more trust i forgot tho superr proud of how this is coming along as I started this with zero webdev experience and wow we’ve come a long way. no vibecoding as well so everything is HUMAN. everything is accessible at https://alyahli.ca (yay got a domain!) :D"}, {"post_id": 58583, "ts": "2026-08-31T01:39:17Z", "hours": 2.6986, "text": "woah it’s been a while! i’ve been working on the formatting of my projects section, as I wanted the cards to be flexible in positioning and be able to stack on top of each other or fit in a row depending on the screen size. nearly everything is now exactly the same as I envisioned in figma, except for three images of stars and mobile viewing. after completing this in my next devlog, alyah’s cafe v2 will be completed! stay tuned for updates in the very near future, as I will be working on a public aquarium feature where everyone can draw and add a fish :) and as always, please add a comment if you encounter any bugs!"}, {"post_id": 40504, "ts": "2026-08-04T02:30:17Z", "hours": 2.5092, "text": "added more figma elements! my somewhat outdated receiptify and some stars are now on the website. aaanddd live section detection highlighted on the navbar. as usual, the page is accesible at: https://lyri3aly.github.io/alyahs-cafe/ if you want to check it out! however, I did order the 11$ domain grant so after that finishes pending I will change the link if there are any bugs or incompatibilities on screen sizes- many, at the moment, please let me know! (p.s. new vsc update looks great)"}, {"post_id": 38341, "ts": "2026-07-31T17:53:57Z", "hours": 2.1753, "text": "phase and draft 1 of my website complete! instead of copying everything I designed on figma all at once, I’ve decided to take it step by step. after a long vacation, i’m finally back and i’ve written all the content using html. i’m hoping to ship this version first so that I actually have a usable website. designs and other content will come soon! access my v1 website here: https://lyri3aly.github.io/alyahs-cafe/"}, {"post_id": 21027, "ts": "2026-07-02T19:57:00Z", "hours": 0.85, "text": "just spent an hour or two (lapse glitched and isn’t showing the other 1h 30min) on Figma for my new official design of version 1 of my own personal website! and things are looking good! I like this design more than my previous one and i’m so excited to recreate this with code soon :)"}, {"post_id": 20980, "ts": "2026-07-02T18:36:16Z", "hours": 4.0867, "text": "i’ve been experimenting more with images, banners, and navigation bars before deciding that I do not like the theme I had going on. i’ve switched to a different colour palette and stripped down my website! not happy about restarting everything but I’m hoping new design will resonate and look much better."}, {"post_id": 770, "ts": "2026-06-02T13:08:59Z", "hours": 0.6725, "text": "just set up the html, css, and js elements creating the outline for my website! anyone have any design ideas?"}]...
|
Title: creating my personal website by @alyah | St Title: creating my personal website by @alyah | Stardance
Devlogs:
just set up the html, css, and js elements creating the outline for my website! anyone have any design ideas?
i’ve been experimenting more with images, banners, and navigation bars before deciding that I do not like the theme I had going on. i’ve switched to a different colour palette and stripped down my website! not happy about restarting everything but I’m hoping new design will resonate and look much better.
just spent an hour or two (lapse glitched and isn’t showing the other 1h 30min) on Figma for my new official design of version 1 of my own personal website! and things are looking good! I like this design more than my previous one and i’m so excited to recreate this with code soon :)
phase and draft 1 of my website complete! instead of copying everything I designed on figma all at once, I’ve decided to take it step by step. after a long vacation, i’m finally back and i’ve written all the content using html. i’m hoping to ship this version first so that I actually have a usable website. designs and other content will come soon! access my v1 website here: https://lyri3aly.github.io/alyahs-cafe/
added more figma elements! my somewhat outdated receiptify and some stars are now on the website. aaanddd live section detection highlighted on the navbar. as usual, the page is accesible at: https://lyri3aly.github.io/alyahs-cafe/ if you want to check it out! however, I did order the 11$ domain grant so after that finishes pending I will change the link if there are any bugs or incompatibilities on screen sizes- many, at the moment, please let me know! (p.s. new vsc update looks great)
woah it’s been a while! i’ve been working on the formatting of my projects section, as I wanted the cards to be flexible in positioning and be able to stack on top of each other or fit in a row depending on the screen size. nearly everything is now exactly the same as I envisioned in figma, except for three images of stars and mobile viewing. after completing this in my next devlog, alyah’s cafe v2 will be completed! stay tuned for updates in the very near future, as I will be working on a public aquarium feature where everyone can draw and add a fish :) and as always, please add a comment if you encounter any bugs!
final devlog of v2 before my first official ship :) i added a few new features and “easter eggs”! the stars around the page are draggable and you can place them anywhere like stickers. the “welcome to alyah’s cafe” text shows a typing animating when you first enter the website. i’ve also customized the scrollbar and cursors. also a few major bugfixes: navbar section detection was not working at all and taking you to random places mobile display! everything has been formated @media so those on phones can see all content properly formatted as well theres more trust i forgot tho superr proud of how this is coming along as I started this with zero webdev experience and wow we’ve come a long way. no vibecoding as well so everything is HUMAN. everything is accessible at https://alyahli.ca (yay got a domain!) :D
Ships:
i’m really proud of how this first draft came out. really excited for people to actually be able to use and view my website from an actual link! i have many more ideas for the future, outside of just finishing the design and adding more content. i’ve learned a lot about html and css from coding this current version, so i’m hoping to expand on that using my creative skills but also use more javascript. follow along :)
I made “alyah’s cafe”, my own website/digital portfolio with a cafe-themed aspect and creatives that I thought embodied who I was. this was my first ever website, and I used building it as a learning opportunity to use human made open source documentation and strive away from AI and vibecoding. I came across numerous bugs and issues throughout the 16 hours I’ve spent so far, but each has also taught me more and more about the basics of web design (learn from ur mistakes!). for something I started when I barely knew anything, i’ve come so far. I hope to continue developing more sections, adding more interactive details (aquarium coming soon!) and using more advanced javascript....
|
1792838998.1207864
|
1792925398.1207864
|
|
5365
|
Pokemon WebOS by @Sahild | Stardance
|
Sahild
|
2
|
14.0
|
60
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-09T20:13:30Z", "hours": 4.0, "multiplier": 6.6, "payout": 14, "blessing": "neutral", "text": "shipped pokéOS v2, a pokémon themed web desktop OS with a real macos style dock now. there are new apps like a coin flip that has a chance to yeet a random desktop icon if you land heads, a video player for the theme video, and an image carousel for pokémon art. pokeRecords also got a plus button so you’re not stuck with just the 3 records i hardcoded in, and the top bar has a proper play pause button for the theme song now instead of just play. the challenging part was the play pause button. it was rebuilding the whole button element every time the state changed which quietly killed the click listener after the first press, so pause just stopped working. took a minute to realize the button node itself was getting replaced instead of just its text, fixed it by keeping one button and only swapping the label. to test it just open it and click through the dock icons at the bottom, flip the coin a few times and see if you lose an icon, and hit the yellow button up top for a surprise. cdn.hackclub.com/019f4883-10a2-7c73-87e0-1aa0e5dafc79/Video%20Project%201.mp4", "repo": "https://github.com/sahilchess/Pokemon-Web-OS", "demo": "https://sahilchess.github.io/Pokemon-Web-OS/"}, {"ship_num": 2, "ts": "2026-06-19T01:13:48Z", "hours": 10.0, "multiplier": 4.87, "payout": 46, "blessing": "neutral", "text": "shipped pokéOS v0.1.0, a pokémon themed web desktop OS. there are draggable windows, a top bar with a live clock, a button that plays the pokémon theme song, and pokéRecords as the first app where you can keep notes on your team and moves with a sidebar that swaps content dynamically. the challenging part was getting the window z index stuff working and figuring out why drag was broken (one missing dash in an id lol). pretty proud of how the whole thing looks and feels, the glassmorphism windows over the pokémon background art goes hard. to test it just open it and drag the windows around, click the pokédex icon to open pokéRecords and click the sidebar entries to switch between records. *hit the button at the top for a surprise *", "repo": "https://github.com/sahilchess/Pokemon-Web-OS", "demo": "https://sahilchess.github.io/Pokemon-Web-OS/"}]...
|
[{"post_id": 25479, "ts": "202 [{"post_id": 25479, "ts": "2026-07-09T19:37:19Z", "hours": 1.8644, "text": "v2.1 added a plus for the pokerecords so youcan add mroe records added a feature so that you can play pause athe song, but the thign is all in one button instaead of 2 added a dock like macos added better styling"}, {"post_id": 16420, "ts": "2026-06-26T18:28:56Z", "hours": 2.4406, "text": "version 2 i added some stuff imma just list it im too lazy to give any paragraph a coin flip that removess a random desktop app if the coin is heads a video player an image carousel added a favicon the file was too large https://cdn.hackclub.com/019f052f-c148-7c51-916c-bdd13bb43783/Screen%20Recording%202026-06-26%20142254.mp4"}, {"post_id": 11682, "ts": "2026-06-19T01:11:31Z", "hours": 2.1872, "text": "shipped pokéOS v0.1.0-beta!! its a pokémon themed web desktop OS. draggable windows, a top bar with a live clock and a button that plays the pokémon theme, and pokéRecords as the first app which lets you keep notes on your pokémon team and moves. sidebar with dynamic entries, content panel on the right, fully editable text. built with just html css and js, no frameworks. had to debug a ton of stuff to get here like windows not rising to the top when clicked and the drag being broken because of one missing dash in an id. live: here foreseeable future: ship on stardance webOS 2 sometime more apps (maybe a pokedex lookup?)"}, {"post_id": 11022, "ts": "2026-06-18T01:29:04Z", "hours": 0.9222, "text": "Update 3 ig im starting to now put devlog numbers….. here is the rendown of what happened. i restarted the pokerecords app and have an idea for what to do. i drew it out and attached the image. next is to how my mistakes. i was tryig to figure out how to make the window rise when it was tapped, but couldnt figure out why. i realized i need this code: addWindowTapHandling ( welcomeScreen ) addWindowTapHandling ( prScreen ) tasks to get done for next devlog: finish poke records app ship on stardance next in the forseeable future: start webOS 2 make more apps"}, {"post_id": 10166, "ts": "2026-06-16T19:40:20Z", "hours": 4.4494, "text": "I made somthign!!!! i made a first welcome screen and also a records app that will be my first app. It is still in progress i also removed the changing bg because i want less AI made onmy site"}, {"post_id": 6407, "ts": "2026-06-10T19:35:58Z", "hours": 2.0156, "text": "The Start of stmg So i kinda realized that a pokemonOS is already sorta a thing…. BUT THAT WONT STOP ME! Imma make it better that that website! (idk if that is possible bc that is really well made so who knows. i followed the tutorial and added some of my own stuff like custom fonts and a button that plays the theme song of pokemon. I also ai-genned the pokemon-font, where there is padding on the font that is a different color making it look like a pokemon font."}]...
|
Title: Pokemon WebOS by @Sahild | Stardance
Devlo Title: Pokemon WebOS by @Sahild | Stardance
Devlogs:
The Start of stmg So i kinda realized that a pokemonOS is already sorta a thing…. BUT THAT WONT STOP ME! Imma make it better that that website! (idk if that is possible bc that is really well made so who knows. i followed the tutorial and added some of my own stuff like custom fonts and a button that plays the theme song of pokemon. I also ai-genned the pokemon-font, where there is padding on the font that is a different color making it look like a pokemon font.
I made somthign!!!! i made a first welcome screen and also a records app that will be my first app. It is still in progress i also removed the changing bg because i want less AI made onmy site
Update 3 ig im starting to now put devlog numbers….. here is the rendown of what happened. i restarted the pokerecords app and have an idea for what to do. i drew it out and attached the image. next is to how my mistakes. i was tryig to figure out how to make the window rise when it was tapped, but couldnt figure out why. i realized i need this code: addWindowTapHandling ( welcomeScreen ) addWindowTapHandling ( prScreen ) tasks to get done for next devlog: finish poke records app ship on stardance next in the forseeable future: start webOS 2 make more apps
shipped pokéOS v0.1.0-beta!! its a pokémon themed web desktop OS. draggable windows, a top bar with a live clock and a button that plays the pokémon theme, and pokéRecords as the first app which lets you keep notes on your pokémon team and moves. sidebar with dynamic entries, content panel on the right, fully editable text. built with just html css and js, no frameworks. had to debug a ton of stuff to get here like windows not rising to the top when clicked and the drag being broken because of one missing dash in an id. live: here foreseeable future: ship on stardance webOS 2 sometime more apps (maybe a pokedex lookup?)
version 2 i added some stuff imma just list it im too lazy to give any paragraph a coin flip that removess a random desktop app if the coin is heads a video player an image carousel added a favicon the file was too large https://cdn.hackclub.com/019f052f-c148-7c51-916c-bdd13bb43783/Screen%20Recording%202026-06-26%20142254.mp4
v2.1 added a plus for the pokerecords so youcan add mroe records added a feature so that you can play pause athe song, but the thign is all in one button instaead of 2 added a dock like macos added better styling
Ships:
shipped pokéOS v0.1.0, a pokémon themed web desktop OS. there are draggable windows, a top bar with a live clock, a button that plays the pokémon theme song, and pokéRecords as the first app where you can keep notes on your team and moves with a sidebar that swaps content dynamically. the challenging part was getting the window z index stuff working and figuring out why drag was broken (one missing dash in an id lol). pretty proud of how the whole thing looks and feels, the glassmorphism windows over the pokémon background art goes hard. to test it just open it and drag the windows around, click the pokédex icon to open pokéRecords and click the sidebar entries to switch between records. *hit the button at the top for a surprise *
shipped pokéOS v2, a pokémon themed web desktop OS with a real macos style dock now. there are new apps like a coin flip that has a chance to yeet a random desktop icon if you land heads, a video player for the theme video, and an image carousel for pokémon art. pokeRecords also got a plus button so you’re not stuck with just the 3 records i hardcoded in, and the top bar has a proper play pause button for the theme song now instead of just play. the challenging part was the play pause button. it was rebuilding the whole button element every time the state changed which quietly killed the click listener after the first press, so pause just stopped working. took a minute to realize the button node itself was getting replaced instead of just its text, fixed it by keeping one button and only swapping the label. to test it just open it and click through the dock icons at the bottom, flip the coin a few times and see if you lose an icon, and hit the yellow button up top for a surprise. cdn.hackclub.com/019f4883-10a2-7c73-87e0-1aa0e5dafc79/Video%20Project%201.mp4...
|
1792850062.5302455
|
1792936462.5302455
|
|
5447
|
gos by @Lxsh-S | Stardance
|
Lxsh-S
|
2
|
19.0
|
249
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-02T10:01:49Z", "hours": 13.0, "multiplier": 16.41, "payout": 207, "blessing": "neutral", "text": "SHIP 2 This maybe long but read it please :) I’ve improved gos by reading the reviews on the first ship and some little things that I’ve added my self New features I have made gos to make a .gos folder in the home directory of the user where he/she/they can store their custom templates using gosadd in the folder usr_Templates I have added the gosadd command that uses -a flag with the folder name that you want to turn as a template. It simply stores the whole content of the folder and saves them under .gos/usr_Templates is the home directory I have a added the gosget command that uses two flags: -p as the project name and the -e , where you give the template name that was stored in usr_Templates . It fetches the template from that folder and pastes it in the current directory with the name that you have entered i n -p I have added a --list flag that shows all premade project structures I have added gosdir that is a mkdir like command for making new directories. it user -m flag and the folder name of the new folder READ THE README.md under “After Installation” section to find a way to make this commands shorter and more easy and faster to type , you’ll have to change things in .bashrc Support Gos works just fine on mac and linux and also wsl on windows but on windows you may lack the alias feature to make the commands shorter Things you need to know!! A lil knowledge about Linux and configuration script for shells like .bashrc will help you if you dont know about it. It’ll be fine for other users(– ppl who say ‘i use arch btw’) If your not able to figure out things or it dosen’t workout for you because it feels a little complicated then you can skip the project or use AI to help you with initialization Things I found challenging I’ve always felt challenging to make this simple project also simple to use for other users thats the reason we are using alias for now as it helps shorten the command( Very helpful is you downloaded the package form the AUR) What im proud of I’m proud of the thing that i didn’t quit while making this project or burnout because the largest part of my day goes to my intermidiate clg ( 11hrs and 30 mins , also adding the traveling time) because my parents thing a school that works for more time will teach me more things lol I wanna work on big projects that are complex and fun but im not able to most of the times How I wanna improve I wanna improve my understanding about code and problem solving skills so that I’ll be able to work on those big and complex projects THANKS FOR READING, LOVE Y”ALL = )", "repo": "https://github.com/lxsh-S/gos", "demo": "https://github.com/lxsh-S/gos/releases/"}, {"ship_num": 2, "ts": "2026-07-12T21:04:20Z", "hours": 6.0, "multiplier": 7.56, "payout": 42, "blessing": "neutral", "text": "Intro This is “gos” a CLi tool that helps you strucutre your projects. This is still in it’s bare bones phase but feels a lil complete for a small hobby project Challenging part The parts I have found challenging are to understand where and how to handle errors. I’ve still not fixed some of them. Not sure To use and try this project you must have installed go on your system And as i work with linux i dont think this will be able to be used in windows pc’s. Dont know about wsl tho. Installation Note :- Need go to be installed go install github.com/lxsh-S/gos@latest", "repo": "https://github.com/lxsh-S/gos", "demo": "https://github.com/lxsh-S/gos/releases/"}]...
|
[{"post_id": 38329, "ts": "202 [{"post_id": 38329, "ts": "2026-07-31T17:34:00Z", "hours": 2.1214, "text": "GOS DEVLOG 13 On the last devlog I had gos making .gos folder in the homedirectory of the user where it stores custom templates made by the user What I have got new I have added two new features: gosadd gosget -[ gosadd ] We use the this command to add any folder as a template that we can later use with a different command We have got a -a flag to add to folder. Although we wont be using this flags because I have got a way to make it easier and faster to type in the terminal and have given the solution in README.md in [After installation] -[ goget ] We use this command to fetch the copied folder from .gos/usr_Templates to the current directory we are on “gosget” uses two flags: – -p –> We use this to give in the new name of the template folder that will be saved in the current directory – -e –> We use this to get the correct template that we have stored Both -p and -e default values are an empty string so passing a value in necessary for it to work"}, {"post_id": 36142, "ts": "2026-07-28T01:27:23Z", "hours": 0.7653, "text": "GOS DEVLOG 12 I’ve made it so that when you run the newest version 0.9.1 which I havent released yet. It automatically creates a .gos folder in the user’s home directory and it’ll be the place where is store custom templates made by the user I still dont know I’ve to figure out how do we walk through the current directory and store in the usr_Templates and somehow copy paste it when the user requests that specific template Other I still haven’t worked on the project properly due to my school. I currently have 9 hrs to figure out how we are going to move forward = )"}, {"post_id": 35787, "ts": "2026-07-27T13:15:45Z", "hours": 0.5697, "text": "GOS DEVLOG 11 I’ve read the reviews by you guys and have found out that: Gos needs to have a way so that the user is able add their own templates Few ppl also said that initializing a git repo when making a project will be very helpful One review was about some bugs that he face in the tool I dont know what he had faced because the version that I had shipped was 0.6.5 and I’m currently working on 0.9.0 . If anyone did face them too can you please tell me? One guy asked me why did I name Gos as gos so for you: The name Gos can be broken down like this : D Gos \"Go\" --> The language 'Golang' \"s\" --> from 'Structure' The first name that I had thought for was Gostruc . But it felt too big to type in the terminal when compared to mkdir and tree I’m also thinking about adding a tree like command in this project. Can you guys tell if I should do that ? I really appretiate your reviews guys and I’ll be working on improving this project. Hoping that it stays a little relevant :( – Bye"}, {"post_id": 33962, "ts": "2026-07-24T10:09:42Z", "hours": 1.3428, "text": "GOS DEVLOG 10 I’ve added mkdir thingy to the project but it feels so useless lol = ) Idk where Im gonna take this project now lets see – byeee"}, {"post_id": 31758, "ts": "2026-07-20T12:22:46Z", "hours": 1.0733, "text": "GOS DEVLOG 9 Updates I’ve added files support for Typescript Now all three languages have proper boiler plates for their different Project types In the latest version of Gos 0.8.5 What I want to change As I’m not a pro 10x developer or something most of my code is repeated and I don’t know why but it doesn’t feel that right to me. So I’ll be thinking of a different approach for sometime Things I wanna add I’m thinking about gos should also initialize a Git repository when a user creates a project I’m also thinking about adding JavaScript and C support to Gos I wanna make adding new languages to the project a little easier if i don’t get too lazy to do that I also wanna integrate default unix command like mkdir , tree to Gos. So that it feels more functional and less useless – byee :)"}, {"post_id": 31637, "ts": "2026-07-20T06:15:41Z", "hours": 3.2819, "text": "GOS DEVLOG 8 Updates I’ve added files to the project structure in Golang and Cpp I’ve done it using Templates in templates/ dir I’ve embeded the files into the binary using embed in Go I’ve fixed the AUR problems and now it works perfectly Now there is a proper boilerplate for each project type in both the languages now Next Plan I’ll be adding files to Typescript project strucutres next How to Update Gos To update gos: - yay -S gos-bin Then when it asks Packages to Clean Build select All by typing A and Install it It’ll be updated to the latest version ###Other things Lol, when i used embed now it decreased the binary size from 2.24 mb to 1.09 mb I’ve also added v0.6.5.md for the voters of Ship#1 although I have asked a reviewer if I can scrap that Ship and just make a new ship from the new versions of Gos. Les see what happens –Bye"}, {"post_id": 30884, "ts": "2026-07-18T21:05:51Z", "hours": 1.2344, "text": "GOS DEVLOG 7 Features I have finnay got the CD workflow working with the help of some research the old google way but as it was taking too much time I again tried using claude and it helped me do the work very quick! I also added a --list flag to see the project structure types for all the languages supported buy gofie. Issues I faced One of the dumbest issues were that I was not updating .SRCINFO with the new PKGBUILD . Got that running easily And other issue also happened with the url of my project as I had changed the name from [Gostruc] to [Gos] before linking it here the remote was set to the old url till now which was causing some error 128 with github actions What I have learnt I have learnt to work with github actions and goreleaser to automate the deployment of my little project Gos . Although I still get confused seeing the automation process becuase im not very well into it : Note Although Gos is available on the AUR (Arch User Repository) but I’ll never most likely recommend people using that way to install in on their systems cuz it will most of the times download the old version of gos ( Ofc it dosent happen all the time but ig there is a delay in my CD workflow) I recommend using Go to download it (Atleast for now, i’m working for AUR :)) – byee"}, {"post_id": 30192, "ts": "2026-07-17T15:49:56Z", "hours": 1.315, "text": "GOS DEVLOG #6 (Lol im sorry im not good at devlogs :)) Yesterday I finnaly uploaded my package to the AUR (Arch User Repository) You can download it by running:- yay -S gos-bin I’m now going to work on a CD for the project because man this deployment is very tiring (Im new and a noob) :)"}, {"post_id": 29026, "ts": "2026-07-15T17:53:32Z", "hours": 1.145, "text": "GOS DEVLOG-5 I’ve added CI with a lil help from google and Claude CD will be pretty useful when I push to a package manager I’ve also wrote a proper quickstart and file and also added file strucutre to README.md"}, {"post_id": 27354, "ts": "2026-07-12T20:56:28Z", "hours": 0.3706, "text": "Gos I have worked on fixing some bugs but had managed to make it even worse so had to scrap that idea and jsut post a demo TL;DR of [gos] as of today A simple CLI project that can be used for project structuring It supports project strucutres for 3 languages as of now: Typescript Golang C++ byee :)"}, {"post_id": 25871, "ts": "2026-07-10T11:01:44Z", "hours": 0.7628, "text": "Finnaly!! Fixed that annoying issue of projects with wrong types but still having standard strucutre Nothing much –byee :) Ohh wait How I fixed it The issue was because i used switch cases butt never returned any error from the project blueprint After returningg an error and normally handling it in create folder As this type of errors can also occur in language flag too I have fixed it by making the default switch as an error"}, {"post_id": 24605, "ts": "2026-07-08T10:05:03Z", "hours": 2.5669, "text": "Gos I have been working on this project for 4 days today But because this is a simple project I have not experienced much new things (I don’t have enough time to build large projects because of my school and exams; If I do I think I’m gonna burnout :)) Updates I have added support for different languages (cpp, go, typescript) Also, added project structure types in each language: Go -> API, Web and Standard project types TypeScript -> API, NextJS, Library and Standard project types Cpp -> App/Game, Library and Standard project types This project till now has helped me: Learn how ‘go install’ works as I faced problems with how it’s cache works Learn the use of tags in github Signing out…. – lxsh-S"}, {"post_id": 22795, "ts": "2026-07-05T11:39:38Z", "hours": 1.9053, "text": "Mann I lovee building CLI’s!! Maybe because i’m too lazy to go into web dev or smtg Anyways, This is gos whose function is build a project structure with one command. Currently it only builds a proper folder structure for Go projects. I’m looking forward to add other type too There’s not much to say because it’s a simple and easy project but i’m building this because i’ll be using it too Man..it’s getting harder for me to manage my 11th, gym and coding. Hope I don’t have another burnout"}]...
|
Title: gos by @Lxsh-S | Stardance
Devlogs:
Mann I Title: gos by @Lxsh-S | Stardance
Devlogs:
Mann I lovee building CLI’s!! Maybe because i’m too lazy to go into web dev or smtg Anyways, This is gos whose function is build a project structure with one command. Currently it only builds a proper folder structure for Go projects. I’m looking forward to add other type too There’s not much to say because it’s a simple and easy project but i’m building this because i’ll be using it too Man..it’s getting harder for me to manage my 11th, gym and coding. Hope I don’t have another burnout
Gos I have been working on this project for 4 days today But because this is a simple project I have not experienced much new things (I don’t have enough time to build large projects because of my school and exams; If I do I think I’m gonna burnout :)) Updates I have added support for different languages (cpp, go, typescript) Also, added project structure types in each language: Go -> API, Web and Standard project types TypeScript -> API, NextJS, Library and Standard project types Cpp -> App/Game, Library and Standard project types This project till now has helped me: Learn how ‘go install’ works as I faced problems with how it’s cache works Learn the use of tags in github Signing out…. – lxsh-S
Finnaly!! Fixed that annoying issue of projects with wrong types but still having standard strucutre Nothing much –byee :) Ohh wait How I fixed it The issue was because i used switch cases butt never returned any error from the project blueprint After returningg an error and normally handling it in create folder As this type of errors can also occur in language flag too I have fixed it by making the default switch as an error
Gos I have worked on fixing some bugs but had managed to make it even worse so had to scrap that idea and jsut post a demo TL;DR of [gos] as of today A simple CLI project that can be used for project structuring It supports project strucutres for 3 languages as of now: Typescript Golang C++ byee :)
GOS DEVLOG-5 I’ve added CI with a lil help from google and Claude CD will be pretty useful when I push to a package manager I’ve also wrote a proper quickstart and file and also added file strucutre to README.md
GOS DEVLOG #6 (Lol im sorry im not good at devlogs :)) Yesterday I finnaly uploaded my package to the AUR (Arch User Repository) You can download it by running:- yay -S gos-bin I’m now going to work on a CD for the project because man this deployment is very tiring (Im new and a noob) :)
GOS DEVLOG 7 Features I have finnay got the CD workflow working with the help of some research the old google way but as it was taking too much time I again tried using claude and it helped me do the work very quick! I also added a --list flag to see the project structure types for all the languages supported buy gofie. Issues I faced One of the dumbest issues were that I was not updating .SRCINFO with the new PKGBUILD . Got that running easily And other issue also happened with the url of my project as I had changed the name from [Gostruc] to [Gos] before linking it here the remote was set to the old url till now which was causing some error 128 with github actions What I have learnt I have learnt to work with github actions and goreleaser to automate the deployment of my little project Gos . Although I still get confused seeing the automation process becuase im not very well into it : Note Although Gos is available on the AUR (Arch User Repository) but I’ll never most likely recommend people using that way to install in on their systems cuz it will most of the times download the old version of gos ( Ofc it dosent happen all the time but ig there is a delay in my CD workflow) I recommend using Go to download it (Atleast for now, i’m working for AUR :)) – byee
GOS DEVLOG 8 Updates I’ve added files to the project structure in Golang and Cpp I’ve done it using Templates in templates/ dir I’ve embeded the files into the binary using embed in Go I’ve fixed the AUR problems and now it works perfectly Now there is a proper boilerplate for each project type in both the languages now Next Plan I’ll be adding files to Typescript project strucutres next How to Update Gos To update gos: - yay -S gos-bin Then when it asks Packages to Clean Build select All by typing A and Install it It’ll be updated to the latest version ###Other things Lol, when i used embed now it decreased the binary size from 2.24 mb to 1.09 mb I’ve also added v0.6.5.md for the voters of Ship#1 although I have asked a reviewer if I can scrap that Ship and just make a new ship from the new versions of Gos. Les see what happens –Bye
GOS DEVLOG 9 Updates I’ve added files support for Typescript Now all three languages have proper boiler plates for their different Project types In the latest version of Gos 0.8.5 What I want to change As I’m not a pro 10x developer or something most of my code is repeated and I don’t know why but it doesn’t feel that right to me. So I’ll be thinking of a different approach for sometime Things I wanna add I’m thinking about gos should also initialize a Git repository when a user creates a project I’m also thinking about adding JavaScript and C support to Gos I wanna make adding new languages to the project a little easier if i don’t get too lazy to do that I also wanna integrate default unix command like mkdir , tree to Gos. So that it feels more functional and less useless – byee :)
GOS DEVLOG 10 I’ve added mkdir thingy to the project but it feels so useless lol = ) Idk where Im gonna take this project now lets see – byeee
GOS DEVLOG 11 I’ve read the reviews by you guys and have found out that: Gos needs to have a way so that the user is able add their own templates Few ppl also said that initializing a git repo when making a project will be very helpful One review was about some bugs that he face in the tool I dont know what he had faced because the version that I had shipped was 0.6.5 and I’m currently working on 0.9.0 . If anyone did face them too can you please tell me? One guy asked me why did I name Gos as gos so for you: The name Gos can be broken down like this : D Gos "Go" --> The language 'Golang' "s" --> from 'Structure' The first name that I had thought for was Gostruc . But it felt too big to type in the terminal when compared to mkdir and tree I’m also thinking about adding a tree like command in this project. Can you guys tell if I should do that ? I really appretiate your reviews guys and I’ll be working on improving this project. Hoping that it stays a little relevant :( – Bye
GOS DEVLOG 12 I’ve made it so that when you run the newest version 0.9.1 which I havent released yet. It automatically creates a .gos folder in the user’s home directory and it’ll be the place where is store custom templates made by the user I still dont know I’ve to figure out how do we walk through the current directory and store in the usr_Templates and somehow copy paste it when the user requests that specific template Other I still haven’t worked on the project properly due to my school. I currently have 9 hrs to figure out how we are going to move forward = )
GOS DEVLOG 13 On the last devlog I had gos making .gos folder in the homedirectory of the user where it stores custom templates made by the user What I have got new I have added two new features: gosadd gosget -[ gosadd ] We use the this command to add any folder as a template that we can later use with a different command We have got a -a flag to add to folder. Although we wont be using this flags because I have got a way to make it easier and faster to type in the terminal and have given the solution in README.md in [After installation] -[ goget ] We use this command to fetch the copied folder from .gos/usr_Templates to the current directory we are on “gosget” uses two flags: – -p –> We use this to give in the new name of the template folder that will be saved in the current directory – -e –> We use this to get the correct template that we have stored Both -p and -e default values are an empty string so passing a value in necessary for it to work
Ships:
Intro This is “gos” a CLi tool that helps you strucutre your projects. This is still in it’s bare bones phase but feels a lil complete for a small hobby project Challenging part The parts I have found challenging are to understand where and how to handle errors. I’ve still not fixed some of them. Not sure To use and try this project you must have installed go on your system And as i work with linux i dont think this will be able to be used in windows pc’s. Dont know about wsl tho. Installation Note :- Need go to be installed go install github.com/lxsh-S/gos@latest
SHIP 2 This maybe long but read it please :) I’ve improved gos by reading the reviews on the first ship and some little things that I’ve added my self New features I have made gos to make a .gos folder in the home directory of the user where he/she/they can store their custom templates using gosadd in the folder usr_Templates I have added the gosadd command that uses -a flag with the folder name that you want to turn as a template. It simply stores the whole content of the folder and saves them under .gos/usr_Templates is the home directory I have a added the gosget command that uses two flags: -p as the project name and the -e , where you give the template name that was stored in usr_Templates . It fetches the template from that folder and pastes it in the current directory with the name that you have entered i n -p I have added a --list flag that shows all premade project structures I have added gosdir that is a mkdir like command for making new directories. it user -m flag and the folder name of the new folder READ THE README.md under “After Installation” section to find a way to make this commands shorter and more easy and faster to type , you’ll have to change things in .bashrc Support Gos works just fine on mac and linux and also wsl on windows but on windows you may lack the alias feature to make the commands shorter Things you need to know!! A lil knowledge about Linux and configuration script for shells like .bashrc will help you if you dont know about it. It’ll be fine for other users(– ppl who say ‘i use arch btw’) If your not able to figure out things or it dosen’t workout for you because it feels a little complicated then you can skip the project or use AI to help you with initialization Things I found challenging I’ve always felt challenging to make this simple project also simple to use for other users thats the reason we are using alias for now as it helps shorten the command( Very helpful is you downloaded the package form the AUR) What im proud of I’m proud of the thing that i didn’t quit while making this project or burnout because the largest part of my day goes to my intermidiate clg ( 11hrs and 30 mins , also adding the traveling time) because my parents thing a school that works for more time will teach me more things lol I wanna work on big projects that are complex and fun but im not able to most of the times How I wanna improve I wanna improve my understanding about code and problem solving skills so that I’ll be able to work on those big and complex projects THANKS FOR READING, LOVE Y”ALL = )...
|
1792820849.6654382
|
1792907249.6654382
|
|
5568
|
Mi propio Dashboard :) by @borja_guerrillo | Stard Mi propio Dashboard :) by @borja_guerrillo | Stardance...
|
borja_guerrillo
|
2
|
21.72
|
143
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-10T02:20:06Z", "hours": 4.0, "multiplier": 3.35, "payout": 14, "blessing": "neutral", "text": "SECOND SHIP!!! This is the second ship in this project, mainly to make it prettier. AI NOTICE: I used AI to code most of the background system, which will be explained further on News feed Colors In the past, all the news feeds had the default white background, now each one is recognizable by a translucent background that still lets you see the website background. More complicated than I expected, the divs crossed each other in ways I didn’t know. Fonts Now all the fonts (except those of the iframe which of course I cant change) are different than the default ones. The fonts used are the following: Faster One for the news feeds titles Alfa Slab One for each individual article title (except those of Hacker News) Geist Pixel for the article descriptions (except those of Hacker News) although I think I will change it, I expected a more pixelated look. Poppins for the Hacker News links, although that’s just a default one All fonts are available for free on Google Fonts Links Now each article title leads to that article link when you click it. Hacker News As you’ll see, the Hacker News feeds looks different, that’s because generally its descriptions makes no sense, so I just placed the title alongside the link. Thanks to tomaskriegelstein from Uiverse.io for that code. Background The background works by fetching a random painting from Wikimedia Commons. The fetching uses a filter with keywords so that it displays the classical paintings I am looking for the background, although sometimes it gets it really wrong, like, really wrong. But still, now the website looks more alive. I made the Trading View widget transparent exactly for that purpose, so that the background wouldn’t be covered. The same applies for the translucent background in the news feeds. Other The notification button is now pretty. The stock picker button is now pretty too. I created a server side RSS proxy for faster loading. And I would like to highlight once more the background code wasn’t generated by me, but from AI, I don’t wanna take credit from it. The one who should take credit is the creator of this website which is amazing and gave me the idea for the background.", "repo": "https://github.com/BorjaGuerrill/My-own-Dashboard", "demo": "https://aristoteles.cl"}, {"ship_num": 2, "ts": "2026-06-30T21:29:23Z", "hours": 16.0, "multiplier": 8.06, "payout": 129, "blessing": "neutral", "text": "I made a dashboard displaying news and stock information relevant to me. Theres still work to be done, as always, but the website is fully functional in the features it shows.", "repo": "https://github.com/BorjaGuerrill/My-own-Dashboard", "demo": "https://aristoteles.cl"}]...
|
[{"post_id": 40079, "ts": "202 [{"post_id": 40079, "ts": "2026-08-03T13:43:14Z", "hours": 1.7181, "text": "I spent a time investigating how could I implement my own ICS calendar using Node.js, but still didnt build anything using it. Instead, I used my time on creating a login page to put all the content and APIs of my page behind, that way when I add a custom ICS calendar, nobody exept me can add events to it. For now, one can only create a new account using a script I got on my server, one cannot create an account using the website."}, {"post_id": 25648, "ts": "2026-07-10T01:56:20Z", "hours": 1.8331, "text": "Making it even more pretty Background I already had built a tool* that fetched Wikimedia paintings from the front-end to display a random one in the background, I improved it. Now I added more keywords so that it fetches classical paintings mostly, it still fails and gives some really bizarre stuff sometimes, but it definetly is better. Maybe in the future I will create a collection of hand picked ones, although it will take the surprise out of it. News Now each article title has a link linking to that article, just now I realize in NYT and Wired I need a subscription to read (which i dont have) but it can still inform me. Hacker News is notoriously different, thats because the articles are community shared, and the descriptions almost always make no sense, so theres no need in showing them. Instead i designed a prettier linker and programmed it to display 20 of the most recent entries instead of the usual 10. Other and sources The calendar has a bit more opacity so I can see it better. I removed the scrolling from the news section, it bothered me. Now theres a favicon for the tab and notification, the Chilean emblem. All the “special” fonts are from Google Fonts, I didn’t download them, just linked them. *: The tool was built almost exclusively by AI."}, {"post_id": 23224, "ts": "2026-07-06T01:33:57Z", "hours": 2.2581, "text": "Making it prettier I added a background that fetches a random image from wikimedia paintings (i used a lot of AI for that) and made the news sections more recognizable from each other. Theres still work to be done, but i dont have much time now."}, {"post_id": 19548, "ts": "2026-06-30T21:28:26Z", "hours": 4.3797, "text": "Finished the RSS feed display in the HTML, and made the notification button a bit prettier. Also, now the sites security is much better (which of course i cant show!) but trust me, it is (at least from a cybersecurity idiot perspective). Next up, i really need to make this site more pretty, and I should beggin to use the notification server for something other than testing."}, {"post_id": 17285, "ts": "2026-06-28T00:28:32Z", "hours": 7.1992, "text": "So, i havent been making varied and good devblogs. But in these days ive made the trading symbols work, and have added the news feed which i need to connect to the (already parsed) RSS feed. I have the parser running in the front-end code, but i need to display it on the website. The database now works, I am using MariaDB."}, {"post_id": 10233, "ts": "2026-06-16T21:15:58Z", "hours": 4.4542, "text": "Progress is looking good! It still doesnt look like anything interesting, but at least i got the notifications going"}]...
|
Title: Mi propio Dashboard :) by @borja_guerrillo Title: Mi propio Dashboard :) by @borja_guerrillo | Stardance
Devlogs:
Progress is looking good! It still doesnt look like anything interesting, but at least i got the notifications going
So, i havent been making varied and good devblogs. But in these days ive made the trading symbols work, and have added the news feed which i need to connect to the (already parsed) RSS feed. I have the parser running in the front-end code, but i need to display it on the website. The database now works, I am using MariaDB.
Finished the RSS feed display in the HTML, and made the notification button a bit prettier. Also, now the sites security is much better (which of course i cant show!) but trust me, it is (at least from a cybersecurity idiot perspective). Next up, i really need to make this site more pretty, and I should beggin to use the notification server for something other than testing.
Making it prettier I added a background that fetches a random image from wikimedia paintings (i used a lot of AI for that) and made the news sections more recognizable from each other. Theres still work to be done, but i dont have much time now.
Making it even more pretty Background I already had built a tool* that fetched Wikimedia paintings from the front-end to display a random one in the background, I improved it. Now I added more keywords so that it fetches classical paintings mostly, it still fails and gives some really bizarre stuff sometimes, but it definetly is better. Maybe in the future I will create a collection of hand picked ones, although it will take the surprise out of it. News Now each article title has a link linking to that article, just now I realize in NYT and Wired I need a subscription to read (which i dont have) but it can still inform me. Hacker News is notoriously different, thats because the articles are community shared, and the descriptions almost always make no sense, so theres no need in showing them. Instead i designed a prettier linker and programmed it to display 20 of the most recent entries instead of the usual 10. Other and sources The calendar has a bit more opacity so I can see it better. I removed the scrolling from the news section, it bothered me. Now theres a favicon for the tab and notification, the Chilean emblem. All the “special” fonts are from Google Fonts, I didn’t download them, just linked them. *: The tool was built almost exclusively by AI.
I spent a time investigating how could I implement my own ICS calendar using Node.js, but still didnt build anything using it. Instead, I used my time on creating a login page to put all the content and APIs of my page behind, that way when I add a custom ICS calendar, nobody exept me can add events to it. For now, one can only create a new account using a script I got on my server, one cannot create an account using the website.
Ships:
I made a dashboard displaying news and stock information relevant to me. Theres still work to be done, as always, but the website is fully functional in the features it shows.
SECOND SHIP!!! This is the second ship in this project, mainly to make it prettier. AI NOTICE: I used AI to code most of the background system, which will be explained further on News feed Colors In the past, all the news feeds had the default white background, now each one is recognizable by a translucent background that still lets you see the website background. More complicated than I expected, the divs crossed each other in ways I didn’t know. Fonts Now all the fonts (except those of the iframe which of course I cant change) are different than the default ones. The fonts used are the following: Faster One for the news feeds titles Alfa Slab One for each individual article title (except those of Hacker News) Geist Pixel for the article descriptions (except those of Hacker News) although I think I will change it, I expected a more pixelated look. Poppins for the Hacker News links, although that’s just a default one All fonts are available for free on Google Fonts Links Now each article title leads to that article link when you click it. Hacker News As you’ll see, the Hacker News feeds looks different, that’s because generally its descriptions makes no sense, so I just placed the title alongside the link. Thanks to tomaskriegelstein from Uiverse.io for that code. Background The background works by fetching a random painting from Wikimedia Commons. The fetching uses a filter with keywords so that it displays the classical paintings I am looking for the background, although sometimes it gets it really wrong, like, really wrong. But still, now the website looks more alive. I made the Trading View widget transparent exactly for that purpose, so that the background wouldn’t be covered. The same applies for the translucent background in the news feeds. Other The notification button is now pretty. The stock picker button is now pretty too. I created a server side RSS proxy for faster loading. And I would like to highlight once more the background code wasn’t generated by me, but from AI, I don’t wanna take credit from it. The one who should take credit is the creator of this website which is amazing and gave me the idea for the background....
|
1792820873.3589222
|
1792907273.3589222
|
|
5651
|
d0dg3! by @JonButNotReally | Stardance
|
JonButNotReally
|
2
|
11.0
|
12
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-03T03:21:34Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made d0dg3, an HTML space themed Dodge game. This is my first time making games in HTML but after a bunch of YouTube videos and lessons from ChatGPT lol i got it done <3. (ALSO, i didnt mean to click ship the first time i wasnt completely finished with the project but this is the completed project.)", "repo": "https://github.com/jonbutnotreally/d0dg3/", "demo": "https://jonbutnotreally.github.io/d0dg3/"}, {"ship_num": 2, "ts": "2026-06-03T15:48:01Z", "hours": 2.0, "multiplier": 6.86, "payout": 12, "blessing": "neutral", "text": "I made d0dg3, an HTML space themed Dodge game. This is my first time making games in HTML but after a bunch of YouTube videos and lessons from ChatGPT lol i got it done <3.", "repo": "https://github.com/jonbutnotreally/d0dg3/", "demo": "https://jonbutnotreally.github.io/d0dg3/"}]...
|
[{"post_id": 21272, "ts": "202 [{"post_id": 21272, "ts": "2026-07-03T03:19:05Z", "hours": 3.9192, "text": "Im pretty sure im mostly done with this game. I’m a little busy with star CRASH so i havent really done much for this one but i think its ‘perfect’ the way it is (nothings perfect but its close i think)"}, {"post_id": 2169, "ts": "2026-06-04T14:50:04Z", "hours": 1.1403, "text": "Im adding a boss fight at the very end of the game. im also gonna add a main menu for progress mode and infinite mode :)"}, {"post_id": 1734, "ts": "2026-06-03T22:17:16Z", "hours": 0.8561, "text": "I have finished my translation to play this on my calculator hooray. Although it got a whole new design because i didn’t know how to make the images go into my calculator but whatever. I’ll post the files on my Github and I’ll soon ship the final project."}, {"post_id": 1700, "ts": "2026-06-03T21:11:46Z", "hours": 3.0933, "text": "Im making a version that will go on my Ti-84 Plus CE. If you can tell… its not going very smoothly :<."}, {"post_id": 1450, "ts": "2026-06-03T14:26:41Z", "hours": 0.6022, "text": "I made some music last night. i used a harpsichord sound and it gave it a kinda 8 bit aesthetic idk. im going to work on animation and adding levels next."}, {"post_id": 1153, "ts": "2026-06-03T00:16:11Z", "hours": 1.1419, "text": "I made my first ever game using HTML. Although im not really good at said game TvT. I got a hyper fixation on music like the past month so tommorow im gonna make some music 🎶."}]...
|
Title: d0dg3! by @JonButNotReally | Stardance
Dev Title: d0dg3! by @JonButNotReally | Stardance
Devlogs:
I made my first ever game using HTML. Although im not really good at said game TvT. I got a hyper fixation on music like the past month so tommorow im gonna make some music 🎶.
I made some music last night. i used a harpsichord sound and it gave it a kinda 8 bit aesthetic idk. im going to work on animation and adding levels next.
Im making a version that will go on my Ti-84 Plus CE. If you can tell… its not going very smoothly :<.
I have finished my translation to play this on my calculator hooray. Although it got a whole new design because i didn’t know how to make the images go into my calculator but whatever. I’ll post the files on my Github and I’ll soon ship the final project.
Im adding a boss fight at the very end of the game. im also gonna add a main menu for progress mode and infinite mode :)
Im pretty sure im mostly done with this game. I’m a little busy with star CRASH so i havent really done much for this one but i think its ‘perfect’ the way it is (nothings perfect but its close i think)
Ships:
I made d0dg3, an HTML space themed Dodge game. This is my first time making games in HTML but after a bunch of YouTube videos and lessons from ChatGPT lol i got it done <3.
I made d0dg3, an HTML space themed Dodge game. This is my first time making games in HTML but after a bunch of YouTube videos and lessons from ChatGPT lol i got it done <3. (ALSO, i didnt mean to click ship the first time i wasnt completely finished with the project but this is the completed project.)...
|
1792849788.1428287
|
1792936188.1428287
|
|
5885
|
"FTC" Concept Robot by @akhilatyam | Stard "FTC" Concept Robot by @akhilatyam | Stardance...
|
akhilatyam
|
2
|
27.0
|
377
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T02:00:19Z", "hours": 16.0, "multiplier": 13.83, "payout": 218, "blessing": "neutral", "text": "Presenting IRISv3, ship number 2!!! I would like to thank all those who have been a part of my journey, but lets get into it! To preface, most stuff I cover here is covered far more in depth in my readme, I suggest you read that as well. This project is NOT a part of First, or any other program, and is simply a learning experience for me. My last FTC season ended with a loss at state, mainly due to poor robot design, while I am no longer on my team, I decided to learn how to properly cad. Through this, I have created IRISv3!! What is it? It is a bot with a 3 artifact wide intake, 3 artifact hopper, a 360* turret, and a flip out parking mechanism! The onshape link will show you the robot, and the readme will provide an in depth view of its creation and thought process. Thank you for taking your time to review, hope you like it!", "repo": "https://github.com/Akhil-Atyam/IRISv3/", "demo": "https://cad.onshape.com/documents/06fbe5ed49f948d063feffdc/w/066c47fa9ac4b7611539e011/e/148f884616f1735568a81366?renderMode=0&uiState=6a3341bfd2cc085c33aab87a"}, {"ship_num": 2, "ts": "2026-06-19T00:16:11Z", "hours": 11.0, "multiplier": 14.03, "payout": 159, "blessing": "neutral", "text": "Presenting IRISv3!!! IRISv3 is a vast improvement of my teams original robot design and is designed to be a competitive robot in this years First Tech Challenge game, Decode. It has a 16 inch wide intake which can intake 3 artifacts at once, a 3 artifact large magazine, and a 360 degree turret to score. This robot taught me a lot about cad, as I am relatively new to it. Most parts can be CNC, 3d printed, or bought online at Rev Robotics, or GoBilda. If you are on any FIRST team, whether it be FLL FTC or FRC I do hope that you see this and end up liking the design off of it. Have a great day everyone!", "repo": "https://github.com/Akhil-Atyam/IRISv3/", "demo": "https://cad.onshape.com/documents/06fbe5ed49f948d063feffdc/w/066c47fa9ac4b7611539e011/e/148f884616f1735568a81366?renderMode=0&uiState=6a3341bfd2cc085c33aab87a"}]...
|
[{"post_id": 63895, "ts": "202 [{"post_id": 63895, "ts": "2026-09-07T22:22:18Z", "hours": 4.0853, "text": "#Devlog 7: The end for now, adjustable hood, thicker plates, and blender renders. Hello guys, and welcome, to one of the final devlogs of this series!!!! Next time you see me, hopefully it will be my ship, but lets go over my progress shall we? Adjustable hood Much awaited, as mentioned in my last devlog, my only way of controlling shots was through adjusting rpm, which is very power expensive and takes time, which isn’t ideal. This is why we now have a servo powered hood! You can try this for yourself by rotating the white part of the hood.We can now quickly adjust our shooting curve, meaning faster Shoot On the Move!!! (Credits to Rafin from 14469 for some help on the hood) ##Thicker plates Now this is something I’ll admit my friends have told me FOREVER about and I was too busy to figure out why my pocketing tool didn’t work, turns out my tool radius was too high. Now that its turned down, we can actually have thicker bars! This should hopefully drastically increase durability. (0.1 -> 0.22-0.3) ##Blender renders In preperation for my ship, I have begun the process of rendering. By the time this devlog is posted, my renders should be done, and atleast my banner is a render photo now. I have never really used blender much, so this is a decent learning curve for me. I would like to thank EVERYONE who supported me during this journey, and I hope you appreciate what this project taught me and hopefully you like it too!"}, {"post_id": 62579, "ts": "2026-09-06T01:22:14Z", "hours": 5.4958, "text": "Devlog 6: Parking Mech Pt2, Rubber bands, and more! Hey guys, this is a decently lengthy devlog, so lets get into it! Parking Mech My parking mech is done! My main problem, as you saw in the last devlog is that I only had around 20 degrees of room to deploy my bellypan cause I was hitting a bar, what was my solution? Getting rid of the bar. In all seriousness, I put out a small hole in the bar that way, the arm that connects my motor and bellypan can move through. Now, we can lay all the way flat, but there is still a large footprint, as anything that touches the ground adds to my footprint. So I added a small bar that should hopefully work to reduce my footprint (anything that touches the ground) Rubber bands Following advice from my last ship, I realized it was important for people to actually know where rubber bands were. Or atleast some what to understand. For now, I have added rubber bands, but I might end up making them a bit less opaque as its hard to see inside right now. Random other changes Removed that random spur gear on the back of Shooter, thats useless Added a light bar to the back of bot and an LED to the shooter. Future plans Odometry pods, this would be amazing Adjustable hood shooter, right now I can only adjust RPM, which takes time and is expensive on power, which I know all to well can kill matches. An adjustable hood would save so much power. Quite a long post, but hopefully ship #2 soon! Thanks! PS: On image one, top is old, bottom is new."}, {"post_id": 60553, "ts": "2026-09-02T23:37:55Z", "hours": 4.1261, "text": "Devlog 5: Parking Mechanism, Part 1 Hey guys! My first main content devlog after my last ship. One of the things I left out on my first ship is a parking mechanism. One of the unique things about this challenge is the parking bonus, where if 2 bots are fully within a 18x18 zone, we get 30 points (compared to 10 for just one) I decided to build a parking mechanism for this! This is partially inspired by 10255’s design, but only for the bellypan. Motor mount and ratchet is all uniquely mine. The motor First things first, how am I going to power it? Luckily, I have one motor left out of my 8 motor limit, so its simple as that, just adding a motor! But what RPM exactly? GoBilda, where I really like to get motors from has a multitude of options. I decided to go with 30 rpm, because i feel that would be more than strong enough to lift my robot. The ratchet But whats stopping it from falling back down after i climb??? Thats why I decided to make a small inline ratchet! Hopefully, it isnt meant to hold things for long of course, but it should be long enough to last atleast 3 seconds, which is the minimum for parks. The bellypan Now this part is a wip, this will be covered in part two. But for now, its just a polycarb sheet. (thank you pic collage for the collage tool im lowk abusing it) First image is part of my inspo btw, the other 2 are my CAD."}, {"post_id": 52651, "ts": "2026-08-22T21:55:34Z", "hours": 2.4314, "text": "Reship!! Hey guys, unfortunately my project did not pass my first ship. So I’m here to fix it. (according to shipwrights due to the specifics of my design it is ok to simply show a small 3dprinter version that unfortunately broke and a previous iteration that actually was built.) This is just a devlog for my images and stuff to be here. Video of it below https://youtu.be/BBkzpUcLwDI CLARIFICATION: This robot has never competed, is meant to be competed with, or any other relation with first. While the previous iterations shown are competition bots, this bot is not. This is simply a proof of concept of a competitive bot that I used in order to learn CAD. This project was created solely for my practice and to be presented under Stardance."}, {"post_id": 11651, "ts": "2026-06-19T00:02:33Z", "hours": 0.5117, "text": "Devlog 3 : Magazine and shooter Hello guys! This time we have most of the robot done, time for an overview! Magazine The Magazine is based off a rubber band design, this way we have compliance so that we do not have to spam wheels. If you look in the photos, you can see a set of blue and black wheels, those two are connected by rubber bands. Addressing one of the concerns in my ship: The balls should not fall out. since the ramp has a hole in the center ideally the artifacts should self center and the rubber bands should hold it in place (Something I have personally seen on a real robot). I also faced another major problem, how do I get my artifacts from my mag to my shooter? Due to the form factor of my build needing a turntable, I can’t just directly send it straight into the turret, as it wouldn’t reach without adding like 50 rollers. (large rollers would collide into my turntable housing) So i devised a counter roller, which is mounted in the rear and can speedily feed things into my shooter! (this is shown in the 2nd slide image on the bottom right, look for the 2 sets of black rollers near the green ball) Shooter I decided to go for a turret, although several teams have had major success in a straight shooter (shoutout to my goats 30564). This was because I felt that shooting on the move and shooting no matter where we are is what makes something competitive, and it also is a test of my cad skills. I took inspiration of the Andymark turntable, but the form factor wouldn’t work here, so I took the bearing and put it on a custom plate. For the turret itself, its a single 6K rpm motor, which from my previous experiences was more than enough, we also have a Limelight (vision camera) on the shooter for accurate localization."}, {"post_id": 8413, "ts": "2026-06-13T23:47:37Z", "hours": 9.3075, "text": "Devlog 2: The intake Hello again guys! Welcome back to more CAD Chronicles Today, I have our intake created. There are many different types of intakes I’ve seen this year, rubber band, vector wheel, and surgical tubing. All of these have pros and cons, so lets go over them. Rubber band: Rubber band intakes is what my team used back when I was on it. It is simple, effective, and once you touch an artifact, you keep it, there is very little wrong with it. But, it is harder with those to have the intake extend the entire width of the bot, so you might not be able to intake 3 artifacts at once. Vector wheels Now theres 2 kinds, fixed, and pivoting (where the wheels can move up and down to comply with the artifacts). I decided, that for auto strategy since we might be contacting multiple artifacts at once, to go with a fixed design for this. Vector wheels can easily span the entire width of a bot, and also funnel into the center. Surgical tubing This one is a nice one, basically for those who have not seen them, it is a form of intake where there is a central hub, and tubes stick out of the hub, almost like a fan. These are supposed to catch on to artifacts and pull them in. While these are pretty good, they do not have centering and also are quite large, so they do tend to stick out the bot. Now what did I pick? You might be able to tell from my image, but I ended up picking a vector wheel intake! I decided this was the best course of action, because I can easily intake 3 artifact wide, which is good for far zone cycling and also auto pattern cycling, and also it has centering. You will see in my next devlog why centering is important!"}, {"post_id": 1503, "ts": "2026-06-03T15:58:34Z", "hours": 1.5769, "text": "Devlog #1 : The beginnings Hello guys! Welcome to my project! I would like to thank you guys for checking my project out and here I’m gonna outline a bit of what I am going to do. What is my goal? I want to create a competitive FTC style bot! My last season on my team was last year, we got to state but we placed around 20th. This year, me and my friends will hopefully start a new team, but I need to learn CAD so that I am actually well equipped to do work. I decided that cadding a robot is the best way to do this! I decided on a couple goals. I want a vector intake (to maximize possible intaking area) As much custom cnc parts as possible (both a challenge for me and also conserves space) A turret (IMO most competitive bots use a turret so time to join that league) Those 3 goals will shape the rest of this project. Drivetrain My first thing was beginning my drivetrain, as you can see below I got around half of it done so far. Sketching is a bit awkward but I’m getting the hang of it. Hopefully this works out well!"}]...
|
Title: "FTC" Concept Robot by @akhilatyam Title: "FTC" Concept Robot by @akhilatyam | Stardance
Devlogs:
Devlog #1 : The beginnings Hello guys! Welcome to my project! I would like to thank you guys for checking my project out and here I’m gonna outline a bit of what I am going to do. What is my goal? I want to create a competitive FTC style bot! My last season on my team was last year, we got to state but we placed around 20th. This year, me and my friends will hopefully start a new team, but I need to learn CAD so that I am actually well equipped to do work. I decided that cadding a robot is the best way to do this! I decided on a couple goals. I want a vector intake (to maximize possible intaking area) As much custom cnc parts as possible (both a challenge for me and also conserves space) A turret (IMO most competitive bots use a turret so time to join that league) Those 3 goals will shape the rest of this project. Drivetrain My first thing was beginning my drivetrain, as you can see below I got around half of it done so far. Sketching is a bit awkward but I’m getting the hang of it. Hopefully this works out well!
Devlog 2: The intake Hello again guys! Welcome back to more CAD Chronicles Today, I have our intake created. There are many different types of intakes I’ve seen this year, rubber band, vector wheel, and surgical tubing. All of these have pros and cons, so lets go over them. Rubber band: Rubber band intakes is what my team used back when I was on it. It is simple, effective, and once you touch an artifact, you keep it, there is very little wrong with it. But, it is harder with those to have the intake extend the entire width of the bot, so you might not be able to intake 3 artifacts at once. Vector wheels Now theres 2 kinds, fixed, and pivoting (where the wheels can move up and down to comply with the artifacts). I decided, that for auto strategy since we might be contacting multiple artifacts at once, to go with a fixed design for this. Vector wheels can easily span the entire width of a bot, and also funnel into the center. Surgical tubing This one is a nice one, basically for those who have not seen them, it is a form of intake where there is a central hub, and tubes stick out of the hub, almost like a fan. These are supposed to catch on to artifacts and pull them in. While these are pretty good, they do not have centering and also are quite large, so they do tend to stick out the bot. Now what did I pick? You might be able to tell from my image, but I ended up picking a vector wheel intake! I decided this was the best course of action, because I can easily intake 3 artifact wide, which is good for far zone cycling and also auto pattern cycling, and also it has centering. You will see in my next devlog why centering is important!
Devlog 3 : Magazine and shooter Hello guys! This time we have most of the robot done, time for an overview! Magazine The Magazine is based off a rubber band design, this way we have compliance so that we do not have to spam wheels. If you look in the photos, you can see a set of blue and black wheels, those two are connected by rubber bands. Addressing one of the concerns in my ship: The balls should not fall out. since the ramp has a hole in the center ideally the artifacts should self center and the rubber bands should hold it in place (Something I have personally seen on a real robot). I also faced another major problem, how do I get my artifacts from my mag to my shooter? Due to the form factor of my build needing a turntable, I can’t just directly send it straight into the turret, as it wouldn’t reach without adding like 50 rollers. (large rollers would collide into my turntable housing) So i devised a counter roller, which is mounted in the rear and can speedily feed things into my shooter! (this is shown in the 2nd slide image on the bottom right, look for the 2 sets of black rollers near the green ball) Shooter I decided to go for a turret, although several teams have had major success in a straight shooter (shoutout to my goats 30564). This was because I felt that shooting on the move and shooting no matter where we are is what makes something competitive, and it also is a test of my cad skills. I took inspiration of the Andymark turntable, but the form factor wouldn’t work here, so I took the bearing and put it on a custom plate. For the turret itself, its a single 6K rpm motor, which from my previous experiences was more than enough, we also have a Limelight (vision camera) on the shooter for accurate localization.
Reship!! Hey guys, unfortunately my project did not pass my first ship. So I’m here to fix it. (according to shipwrights due to the specifics of my design it is ok to simply show a small 3dprinter version that unfortunately broke and a previous iteration that actually was built.) This is just a devlog for my images and stuff to be here. Video of it below https://youtu.be/BBkzpUcLwDI CLARIFICATION: This robot has never competed, is meant to be competed with, or any other relation with first. While the previous iterations shown are competition bots, this bot is not. This is simply a proof of concept of a competitive bot that I used in order to learn CAD. This project was created solely for my practice and to be presented under Stardance.
Devlog 5: Parking Mechanism, Part 1 Hey guys! My first main content devlog after my last ship. One of the things I left out on my first ship is a parking mechanism. One of the unique things about this challenge is the parking bonus, where if 2 bots are fully within a 18x18 zone, we get 30 points (compared to 10 for just one) I decided to build a parking mechanism for this! This is partially inspired by 10255’s design, but only for the bellypan. Motor mount and ratchet is all uniquely mine. The motor First things first, how am I going to power it? Luckily, I have one motor left out of my 8 motor limit, so its simple as that, just adding a motor! But what RPM exactly? GoBilda, where I really like to get motors from has a multitude of options. I decided to go with 30 rpm, because i feel that would be more than strong enough to lift my robot. The ratchet But whats stopping it from falling back down after i climb??? Thats why I decided to make a small inline ratchet! Hopefully, it isnt meant to hold things for long of course, but it should be long enough to last atleast 3 seconds, which is the minimum for parks. The bellypan Now this part is a wip, this will be covered in part two. But for now, its just a polycarb sheet. (thank you pic collage for the collage tool im lowk abusing it) First image is part of my inspo btw, the other 2 are my CAD.
Devlog 6: Parking Mech Pt2, Rubber bands, and more! Hey guys, this is a decently lengthy devlog, so lets get into it! Parking Mech My parking mech is done! My main problem, as you saw in the last devlog is that I only had around 20 degrees of room to deploy my bellypan cause I was hitting a bar, what was my solution? Getting rid of the bar. In all seriousness, I put out a small hole in the bar that way, the arm that connects my motor and bellypan can move through. Now, we can lay all the way flat, but there is still a large footprint, as anything that touches the ground adds to my footprint. So I added a small bar that should hopefully work to reduce my footprint (anything that touches the ground) Rubber bands Following advice from my last ship, I realized it was important for people to actually know where rubber bands were. Or atleast some what to understand. For now, I have added rubber bands, but I might end up making them a bit less opaque as its hard to see inside right now. Random other changes Removed that random spur gear on the back of Shooter, thats useless Added a light bar to the back of bot and an LED to the shooter. Future plans Odometry pods, this would be amazing Adjustable hood shooter, right now I can only adjust RPM, which takes time and is expensive on power, which I know all to well can kill matches. An adjustable hood would save so much power. Quite a long post, but hopefully ship #2 soon! Thanks! PS: On image one, top is old, bottom is new.
#Devlog 7: The end for now, adjustable hood, thicker plates, and blender renders. Hello guys, and welcome, to one of the final devlogs of this series!!!! Next time you see me, hopefully it will be my ship, but lets go over my progress shall we? Adjustable hood Much awaited, as mentioned in my last devlog, my only way of controlling shots was through adjusting rpm, which is very power expensive and takes time, which isn’t ideal. This is why we now have a servo powered hood! You can try this for yourself by rotating the white part of the hood.We can now quickly adjust our shooting curve, meaning faster Shoot On the Move!!! (Credits to Rafin from 14469 for some help on the hood) ##Thicker plates Now this is something I’ll admit my friends have told me FOREVER about and I was too busy to figure out why my pocketing tool didn’t work, turns out my tool radius was too high. Now that its turned down, we can actually have thicker bars! This should hopefully drastically increase durability. (0.1 -> 0.22-0.3) ##Blender renders In preperation for my ship, I have begun the process of rendering. By the time this devlog is posted, my renders should be done, and atleast my banner is a render photo now. I have never really used blender much, so this is a decent learning curve for me. I would like to thank EVERYONE who supported me during this journey, and I hope you appreciate what this project taught me and hopefully you like it too!
Ships:
Presenting IRISv3!!! IRISv3 is a vast improvement of my teams original robot design and is designed to be a competitive robot in this years First Tech Challenge game, Decode. It has a 16 inch wide intake which can intake 3 artifacts at once, a 3 artifact large magazine, and a 360 degree turret to score. This robot taught me a lot about cad, as I am relatively new to it. Most parts can be CNC, 3d printed, or bought online at Rev Robotics, or GoBilda. If you are on any FIRST team, whether it be FLL FTC or FRC I do hope that you see this and end up liking the design off of it. Have a great day everyone!
Presenting IRISv3, ship number 2!!! I would like to thank all those who have been a part of my journey, but lets get into it! To preface, most stuff I cover here is covered far more in depth in my readme, I suggest you read that as well. This project is NOT a part of First, or any other program, and is simply a learning experience for me. My last FTC season ended with a loss at state, mainly due to poor robot design, while I am no longer on my team, I decided to learn how to properly cad. Through this, I have created IRISv3!! What is it? It is a bot with a 3 artifact wide intake, 3 artifact hopper, a 360* turret, and a flip out parking mechanism! The onshape link will show you the robot, and the readme will provide an in depth view of its creation and thought process. Thank you for taking your time to review, hope you like it!...
|
1792839100.3290255
|
1792925500.3290255
|
|
5887
|
Recipes to Groceries by @Kat | Stardance
|
Kat
|
2
|
27.7
|
92
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-10T02:58:11Z", "hours": 16.0, "multiplier": 3.83, "payout": 73, "blessing": "neutral", "text": "Welcome to Recipes to Groceries!! This is a website where you can create and share recipes, then add them to a grocery list that automatically combines ingredients! This makes meal planning as easy as pressing a couple buttons. You can use the grocery list creator anonymously or sign up to create and publish recipes. ⋆。‧˚ʚ♡ɞ˚‧。⋆ This project is not completely done, and more features such as ratings, unit conversions, and better ingredient combining will come soon!", "repo": "https://github.com/katherinef2023/RecipesToGroceries", "demo": "https://katherinef2023.github.io/RecipesToGroceries/"}, {"ship_num": 2, "ts": "2026-06-15T16:40:37Z", "hours": 9.0, "multiplier": 2.15, "payout": 19, "blessing": "neutral", "text": "Welcome to Recipes to Groceries, a website where you create recipes then add them to a grocery list that automatically combines ingredients! Some starter recipes have been added for ease of trying it out. Eventually, there will be accounts and a place for sharing recipes as well as a better ingredient combination system. ⋆。‧˚ʚ♡ɞ˚‧。⋆ This project is not completely done, but the main idea functions! Go check it out and let me know what I should add (that wasn’t already mentioned haha). Thanks!", "repo": "https://github.com/katherinef2023/RecipesToGroceries", "demo": "https://katherinef2023.github.io/RecipesToGroceries/"}]...
|
[{"post_id": 36203, "ts": "202 [{"post_id": 36203, "ts": "2026-07-28T04:14:50Z", "hours": 2.6953, "text": "Added more starter recipes to my website and make it more friendly for mobile. Also added a cook mode and better button UI."}, {"post_id": 25673, "ts": "2026-07-10T02:47:54Z", "hours": 5.0883, "text": "I finally added public recipes!!! You can now create, edit, delete, AND publish recipes on my free website Recipes To Groceries! All recipe ingredients can be turned into a grocery list with smart combining and eventually unit conversions and everything ;) Feel free to test it out anonymously with the dummy email. I also improved the UI and color-coded the recipes cards. Also, I created a web scraper to get recipes from URLs but firebase functions requires me to upgrade from the free plan to use that so I can’t publish it until I find a way to do it otherwise. Next update will hopefully have either a better grocery sorting system or more social features (ratings, proper usernames, comments??)."}, {"post_id": 21905, "ts": "2026-07-04T02:33:07Z", "hours": 3.4831, "text": "Tried adding a system to import recipes from url but failed due to CORS blocking me from accessing other websites :( Also added 2 new starter recipes and fixed some mobile bugs."}, {"post_id": 21274, "ts": "2026-07-03T03:28:43Z", "hours": 5.1653, "text": "Fixed the UI a bit and added better search mechanisms! Recipes to Groceries is now ready for personal use, and sharing recipes will come soon ;)"}, {"post_id": 18962, "ts": "2026-06-30T04:18:01Z", "hours": 0.5347, "text": "Finally figured out firebase! Now you can create and use your account to add/delete/edit recipes. The UI is still bad but I’ll fix it later."}, {"post_id": 9411, "ts": "2026-06-15T19:22:37Z", "hours": 1.6703, "text": "Trying to connect a firebase account/database system to the RtG website is hard! I’ve spent like 2 hours on it and even with AI help I’m still confused 😭"}, {"post_id": 4617, "ts": "2026-06-08T00:07:22Z", "hours": 5.0108, "text": "You can now add instructions to your recipes as well as get a grocery list based on what items you have added to your shopping list! More coming soon!"}, {"post_id": 1962, "ts": "2026-06-04T06:39:59Z", "hours": 2.6511, "text": "I made it so you can add, edit, and delete recipes! It looks bad but I’ll fix it later :)"}, {"post_id": 1716, "ts": "2026-06-03T21:39:32Z", "hours": 1.1872, "text": "I made my first website from scratch! More coming soon :)"}]...
|
Title: Recipes to Groceries by @Kat | Stardance
D Title: Recipes to Groceries by @Kat | Stardance
Devlogs:
I made my first website from scratch! More coming soon :)
I made it so you can add, edit, and delete recipes! It looks bad but I’ll fix it later :)
You can now add instructions to your recipes as well as get a grocery list based on what items you have added to your shopping list! More coming soon!
Trying to connect a firebase account/database system to the RtG website is hard! I’ve spent like 2 hours on it and even with AI help I’m still confused 😭
Finally figured out firebase! Now you can create and use your account to add/delete/edit recipes. The UI is still bad but I’ll fix it later.
Fixed the UI a bit and added better search mechanisms! Recipes to Groceries is now ready for personal use, and sharing recipes will come soon ;)
Tried adding a system to import recipes from url but failed due to CORS blocking me from accessing other websites :( Also added 2 new starter recipes and fixed some mobile bugs.
I finally added public recipes!!! You can now create, edit, delete, AND publish recipes on my free website Recipes To Groceries! All recipe ingredients can be turned into a grocery list with smart combining and eventually unit conversions and everything ;) Feel free to test it out anonymously with the dummy email. I also improved the UI and color-coded the recipes cards. Also, I created a web scraper to get recipes from URLs but firebase functions requires me to upgrade from the free plan to use that so I can’t publish it until I find a way to do it otherwise. Next update will hopefully have either a better grocery sorting system or more social features (ratings, proper usernames, comments??).
Added more starter recipes to my website and make it more friendly for mobile. Also added a cook mode and better button UI.
Ships:
Welcome to Recipes to Groceries, a website where you create recipes then add them to a grocery list that automatically combines ingredients! Some starter recipes have been added for ease of trying it out. Eventually, there will be accounts and a place for sharing recipes as well as a better ingredient combination system. ⋆。‧˚ʚ♡ɞ˚‧。⋆ This project is not completely done, but the main idea functions! Go check it out and let me know what I should add (that wasn’t already mentioned haha). Thanks!
Welcome to Recipes to Groceries!! This is a website where you can create and share recipes, then add them to a grocery list that automatically combines ingredients! This makes meal planning as easy as pressing a couple buttons. You can use the grocery list creator anonymously or sign up to create and publish recipes. ⋆。‧˚ʚ♡ɞ˚‧。⋆ This project is not completely done, and more features such as ratings, unit conversions, and better ingredient combining will come soon!...
|
1792835336.8573115
|
1792921736.8573115
|
|
6027
|
GPA/Grade Checker by @cognitayohan | Stardance
|
cognitayohan
|
2
|
2.0
|
7
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-16T22:56:18Z", "hours": 1.0, "multiplier": 2.12, "payout": 1, "blessing": "neutral", "text": "Ship #2: From community requests, I have coded the UI to include a dark mode as well as the original light mode for user preference. Also, I added a few more helpful features including integration between tabs (input class scores –> automatic GPA integration)", "repo": "https://github.com/robot3-track/GPAChecker", "demo": "https://gpacheck.vercel.app"}, {"ship_num": 2, "ts": "2026-07-11T23:11:18Z", "hours": 1.0, "multiplier": 5.54, "payout": 6, "blessing": "neutral", "text": "Ship #1: GPA/Grade Checker is a free Open-Source Grade and GPA Checker for students to use. This ship is the first ship of many to come- the first version of a workable app that can be helpful for students. Feel free to let me know what to improve or add on for future ships! :)", "repo": "https://github.com/robot3-track/GPAChecker", "demo": "https://gpacheck.vercel.app"}]...
|
[{"post_id": 29799, "ts": "202 [{"post_id": 29799, "ts": "2026-07-16T22:37:22Z", "hours": 0.2867, "text": "Devlog 4: Added ability to add classes as well as better UI layout. Here is a snippet of the edited portion! const [courses, setCourses] = useState<Course[]>(() => { if (typeof window !== \"undefined\") { const stored = localStorage.getItem(\"gc_courses\"); if (stored) return JSON.parse(stored); } // Default fallback starter course return [{ id: \"default-course\", title: \"Introduction to Calculus\", gradingMode: \"weighted\", desiredGrade: 90, weightedCategories: [ { id: \"1\", name: \"Exams\", weight: 50, currentScore: 85, isExpanded: false, items: [] }, { id: \"2\", name: \"Homework\", weight: 30, currentScore: 95, isExpanded: false, items: [] }, { id: \"3\", name: \"Final Exam\", weight: 20, currentScore: null, isExpanded: false, items: [] } ], pointsAssignments: [], credits: 4, courseLevel: \"Regular\" }]; });```"}, {"post_id": 29644, "ts": "2026-07-16T18:28:12Z", "hours": 0.2683, "text": "Devlog 3: Added dark mode UI upon community requests! I added dark mode features for the app and fix the layout of the app to meet DESIGN.MD standards."}, {"post_id": 26898, "ts": "2026-07-11T23:01:24Z", "hours": 0.3461, "text": "Devlog 2: Updated UI formatting, added project notes along with grading system, and updated Readme to match project’s core values. Here is a snippet of the code for grading logic: const DEFAULT_GPA_SCALE: GPAScaleRule[] = [ { grade: \"A+\", points: 4.0, minPercent: 98}, { grade: \"A\", points: 4.0, minPercent: 93 }, { grade: \"A-\", points: 3.7, minPercent: 90 }, { grade: \"B+\", points: 3.3, minPercent: 87 }, { grade: \"B\", points: 3.0, minPercent: 83 }, { grade: \"B-\", points: 2.7, minPercent: 80 }, { grade: \"C+\", points: 2.3, minPercent: 77 }, { grade: \"C\", points: 2.0, minPercent: 73 }, { grade: \"C-\", points: 1.7, minPercent: 70 }, { grade: \"D+\", points: 1.3, minPercent: 67 }, { grade: \"D\", points: 1.0, minPercent: 60 }, { grade: \"F\", points: 0.0, minPercent: 0 }, ];"}, {"post_id": 26885, "ts": "2026-07-11T22:39:44Z", "hours": 0.8303, "text": "Devlog 1: Initial build of Grade Calculator Project. Built proper UI for the app, connected Gemini API key within environmental variables for Vercel build of the webapp."}]...
|
Title: GPA/Grade Checker by @cognitayohan | Starda Title: GPA/Grade Checker by @cognitayohan | Stardance
Devlogs:
Devlog 1: Initial build of Grade Calculator Project. Built proper UI for the app, connected Gemini API key within environmental variables for Vercel build of the webapp.
Devlog 2: Updated UI formatting, added project notes along with grading system, and updated Readme to match project’s core values. Here is a snippet of the code for grading logic: const DEFAULT_GPA_SCALE: GPAScaleRule[] = [ { grade: "A+", points: 4.0, minPercent: 98}, { grade: "A", points: 4.0, minPercent: 93 }, { grade: "A-", points: 3.7, minPercent: 90 }, { grade: "B+", points: 3.3, minPercent: 87 }, { grade: "B", points: 3.0, minPercent: 83 }, { grade: "B-", points: 2.7, minPercent: 80 }, { grade: "C+", points: 2.3, minPercent: 77 }, { grade: "C", points: 2.0, minPercent: 73 }, { grade: "C-", points: 1.7, minPercent: 70 }, { grade: "D+", points: 1.3, minPercent: 67 }, { grade: "D", points: 1.0, minPercent: 60 }, { grade: "F", points: 0.0, minPercent: 0 }, ];
Devlog 3: Added dark mode UI upon community requests! I added dark mode features for the app and fix the layout of the app to meet DESIGN.MD standards.
Devlog 4: Added ability to add classes as well as better UI layout. Here is a snippet of the edited portion! const [courses, setCourses] = useState<Course[]>(() => { if (typeof window !== "undefined") { const stored = localStorage.getItem("gc_courses"); if (stored) return JSON.parse(stored); } // Default fallback starter course return [{ id: "default-course", title: "Introduction to Calculus", gradingMode: "weighted", desiredGrade: 90, weightedCategories: [ { id: "1", name: "Exams", weight: 50, currentScore: 85, isExpanded: false, items: [] }, { id: "2", name: "Homework", weight: 30, currentScore: 95, isExpanded: false, items: [] }, { id: "3", name: "Final Exam", weight: 20, currentScore: null, isExpanded: false, items: [] } ], pointsAssignments: [], credits: 4, courseLevel: "Regular" }]; });```
Ships:
Ship #1: GPA/Grade Checker is a free Open-Source Grade and GPA Checker for students to use. This ship is the first ship of many to come- the first version of a workable app that can be helpful for students. Feel free to let me know what to improve or add on for future ships! :)
Ship #2: From community requests, I have coded the UI to include a dark mode as well as the original light mode for user preference. Also, I added a few more helpful features including integration between tabs (input class scores –> automatic GPA integration)...
|
1792846516.9105403
|
1792932916.9105403
|
|
6172
|
ThePangel's Dev Blog! by @ThePangel | Stardanc ThePangel's Dev Blog! by @ThePangel | Stardance...
|
ThePangel
|
2
|
9.0
|
14
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-12T11:51:53Z", "hours": 2.0, "multiplier": 6.18, "payout": 14, "blessing": "neutral", "text": "I made my own blog site, which I wanted to make for a long time, simple project, used Hugo to write .md files that become articles. Now I just need to write articles!! Also I added github comments with giscus so we can talk abt the article. Added suggested changes by HC reviewer!", "repo": "https://github.com/ThePangel/thepangel.github.io", "demo": "https://thepangel.github.io/"}, {"ship_num": 2, "ts": "2026-06-03T22:50:22Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made my own blog site, which I wanted to make for a long time, simple project, used Hugo to write .md files that become articles. Now I just need to write articles!! Also I added github comments with giscus so we can talk abt the article", "repo": "https://github.com/ThePangel/thepangel.github.io", "demo": "https://thepangel.github.io/"}]...
|
[{"post_id": 14547, "ts": "202 [{"post_id": 14547, "ts": "2026-06-23T18:16:25Z", "hours": 2.2317, "text": "I expanded the ReadMe as requested to add more info. I also decided to write a big ahh article on how I have self hosted my friends group’s 2-week minecraft phase"}, {"post_id": 1633, "ts": "2026-06-03T19:19:26Z", "hours": 0.4019, "text": "Finished! That marks my sprint for today and my new site!"}, {"post_id": 1605, "ts": "2026-06-03T18:51:44Z", "hours": 1.6969, "text": "Added giscus github comments to posts"}, {"post_id": 1540, "ts": "2026-06-03T16:54:41Z", "hours": 0.7622, "text": "Article page basically finished, now imma finish the header and some extra pages Bases on GNU NANO, kinda fun"}, {"post_id": 1505, "ts": "2026-06-03T16:00:32Z", "hours": 0.8069, "text": "Added this cool ahh effect Its the card, without fill just moving it some down to the left then some blur gonna work on the articles now"}, {"post_id": 1423, "ts": "2026-06-03T13:35:20Z", "hours": 1.0394, "text": "Improved the post selection card. A lot of trial an error to make it look right, still much to improve"}, {"post_id": 1393, "ts": "2026-06-03T12:28:47Z", "hours": 2.0875, "text": "Set up the main site; Learning to use Hugo Now I have to finish designing the whole site and articles style (they’re still the default) and that’s that."}]...
|
Title: ThePangel's Dev Blog! by @ThePangel | S Title: ThePangel's Dev Blog! by @ThePangel | Stardance
Devlogs:
Set up the main site; Learning to use Hugo Now I have to finish designing the whole site and articles style (they’re still the default) and that’s that.
Improved the post selection card. A lot of trial an error to make it look right, still much to improve
Added this cool ahh effect Its the card, without fill just moving it some down to the left then some blur gonna work on the articles now
Article page basically finished, now imma finish the header and some extra pages Bases on GNU NANO, kinda fun
Added giscus github comments to posts
Finished! That marks my sprint for today and my new site!
I expanded the ReadMe as requested to add more info. I also decided to write a big ahh article on how I have self hosted my friends group’s 2-week minecraft phase
Ships:
I made my own blog site, which I wanted to make for a long time, simple project, used Hugo to write .md files that become articles. Now I just need to write articles!! Also I added github comments with giscus so we can talk abt the article
I made my own blog site, which I wanted to make for a long time, simple project, used Hugo to write .md files that become articles. Now I just need to write articles!! Also I added github comments with giscus so we can talk abt the article. Added suggested changes by HC reviewer!...
|
1792828159.2366855
|
1792914559.2366855
|
|
6400
|
Minecraft Web by @TruthEntity | Stardance
|
TruthEntity
|
2
|
160.71
|
1901
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-06T10:33:36Z", "hours": 73.0, "multiplier": 15.82, "payout": 1127, "blessing": "neutral", "text": "NOTE: Please Skip Voting, if it failed to run on your system please… Hi Friends, so, I have been working on Minecraft for a long time, and Virtually touching grass LOL.. AKA, Making Minecraft, it is quite challenging to say the least, you can check my devlogs.. Basically, I want to make a very very optimized version of minecraft, that you can see through far and far, and highly optimized. I want to add lighting and all, but the banner is a bit misleading.. I will continue to work on the project, but obviously, not Three.js, because What I have learnt is that.. You can use engines like Unity and Unreal, and make goated projects, the feel of making optimized content, and making it run even on a potato, is just on another level.. Seeing the entire generation moving towards fast making and prototyping, it is always a safe bet to try something new and interesting. This is one of the prototypes that taught me a lot, from How to deal with chunks, and manage chunks, to making biomes, which was actually new.. Chunks I have worked with AI before, and it helped me a ton, and I know about those, but not here.. Hope you love my project", "repo": "https://github.com/SatyamRaj67/Minecraft-with-Three", "demo": "https://satyamraj67.github.io/Minecraft-with-Three/"}, {"ship_num": 2, "ts": "2026-06-15T05:58:35Z", "hours": 58.0, "multiplier": 14.37, "payout": 774, "blessing": "neutral", "text": "Basically, What I have made is Minecraft Web, well Minecraft but on the Website, running on your Browser. Through the Power of Optimizations and knowing how to code, and also using AI for my shader building and debugging bugs like IDK, What I have done to my life. But Basically, I made my own Engine just to prove that You don’t always need THREE.js to do your heavy lifting, and honestly, it was not that hard. You can see the source code, just a few days ago, I refactored it. Hope you love and enjoy my project.", "repo": "https://github.com/SatyamRaj67/Minecraft-with-Three", "demo": "https://satyamraj67.github.io/Minecraft-with-Three/"}]...
|
[{"post_id": 31749, "ts": "202 [{"post_id": 31749, "ts": "2026-07-20T12:00:53Z", "hours": 0.5433, "text": "Hi Everyone, My Devlogs have been lacking a bit, and this another quick devlog, because, I am really not feeling good these days. I am having fever and not feeling great about anything. Currently, I was just searching and asking AI about chunk generation. One of the things, where AI is now needed, because I know noise generation, but I don’t really know, how to make it into reality, and specially when people want realistic chunk generation and all.. I will get into good and start fixing first of all, this light problem, and then just hope, I get well soon, because India’s heat waves are really no joke. My Indian Friends.. Please stay safe and inside house.. IDK, Why even schools are open.."}, {"post_id": 30259, "ts": "2026-07-17T18:05:03Z", "hours": 1.0661, "text": "I literally been sick for 2 days, and now that I come back, I somehow see worse.. Like, I wanted to implement meshing and all.. GUESS WHAT I DONE.. YES, MESHED THE ENTIRE WORLD TO DISAPPEAR.. BALLS… I AM GUAVA AND I WILL EAT MYSELF.. That’s enough coding for today as well, signing off.."}, {"post_id": 30030, "ts": "2026-07-17T08:56:17Z", "hours": 3.1806, "text": "67 Structure Implemented and running, and to those who recommended me this.. GUYS YOU REALLY NEED TO SEE A THERAPY OR SOMETHING.. LMAO.."}, {"post_id": 28175, "ts": "2026-07-14T09:36:33Z", "hours": 2.6172, "text": "Procedural Generation unlocked, now, you can move as much as you want, and play. Current, block placing and all won’t work, but yah.. Frustum Culling is working as you can see with the culled meter."}, {"post_id": 27634, "ts": "2026-07-13T12:05:35Z", "hours": 4.9944, "text": "Added some simple tests for the ECS system and the topological sort Kahn’s Algorithm system and the Event Bus, so as to 100% confirm the workings of what is intended and what is not.. Also there was a problem with connection of gbuffers into swap chain, so had to make a custom pass called, composite pass, that will intercept and then gives us the necessary output. This might add very minute delay, but it is very unnoticable so don’t worry.."}, {"post_id": 27195, "ts": "2026-07-12T15:17:58Z", "hours": 0.6597, "text": "Sorry, ANOTHER QUICK UPDATE I KNOW.. But trust me, this took me ages to implement, and yes, had to work from backwards, because and again found out, There was nothing being connected to the swapchain for some reason.. It’s actually really not that hard to find bugs when you are used to it, like when something isn’t rendering you know, something must be wrong with renderer and all.. and a quick side step, and you understand yah, swapchain being uninitialized is the key."}, {"post_id": 27162, "ts": "2026-07-12T14:03:45Z", "hours": 0.7392, "text": "LMAO, You know, you are at the pinnacle when you are going through forums and forums of actually big stuff, that very very few people ever talk about.. Literally.."}, {"post_id": 27117, "ts": "2026-07-12T11:58:08Z", "hours": 4.5569, "text": "Been some time, and the amount of Logs that I am going through is just.. LMAO.. Crazy Crazy.. For my 67 fans, just give me like a few more moments.. Because, Now, I just want to render one block, and I will just add a sky, which will be a simple color gradient, and then I will work on whatever you that 67 thing.. This was really hectic to implement.. Literally had to go through and implement Archetype.. Yes, even I don’t know what they are… But after like learning about it, here is my understanding.. Archetype is basically a central place to keep all the components and all. Remember, we are optimizing the sheesh out of this project.. Archetypes allow us to apply the same gravity and same systems like Physics, collisions and so on, while still giving you customizabilty on if you want to enable it or not.. It’s really cool, but the amount of things I had to implement.. That’s some brutal stuff… Imagine, you forgot to plug the input system, and you are crashing out on, HOW TO FAH THE POSITION IS NOT CHANGING?? LOL, YAH 2 HOURS OF DEBUGGING WENT THERE, only to realise, I forgot to add that.. LOL.."}, {"post_id": 26687, "ts": "2026-07-11T16:55:52Z", "hours": 5.4511, "text": "I am crashing out a lot over some assets, because first of all, why is the grass block not green and a colormap, I mean, it does look cool.. BUT COME ON, THAT’S A MENTAL TRAUMA AND NOW WHICH COLOR OF GRASS SHOULD I PICK.. Furthermore, this is also a problem with water and all.. I am trying to find better ways, and actually learn about how Minecraft renders these and turns out, they just.. well.. OVERLAY A GREEN MAP or BLUE MAP over the grass.. I mean, that sounds HORRIBLE TO IMPLEMENT, MY GOD, THIS GAME SU…. IS FINE.. AND FUN.. Furthermore, thank you so so so much for all the reviewers out there.. The fact you guys appreciated my project, and said it is Fine to be using AI.. It just blew my heart.. This is the reason why I am currently working, else, I had already blew my mind with so much complex debugging, such that, I had to make my own engine, and debugger.. As with the latest you can see.. Things are tough but yah.. Also, I see you @skhsmrn on my devlog and another reviewer.. Your demands for 67 WILL BE FULFILLED SOON TM.."}, {"post_id": 25348, "ts": "2026-07-09T16:07:34Z", "hours": 1.0511, "text": "I have connected my GPU now, and details are also loading nicely.. I will working on GPU Frames and all as well now."}, {"post_id": 24257, "ts": "2026-07-07T18:18:55Z", "hours": 4.8525, "text": "I almost crashed out today. It was a hectic of a job today for me.. Basically, Today I wanted to work on Debugging tools in my original minecraft version. Though, this was hectic of a job, but now I am confident enough to say that, if anything goes wrong, my error codes will instantly trigger and stop those bugs to ever reach me, specially, If I messed up something. This is specifically made to guard rail myself (as I am a newbie in the GPU optimization and just breaks stuff way too often for comfort during my learning steps..) Now, you might be working what is so special that I did that I am being too optimistic (Specially if you know my history of crashouts LOL…) So, Basically, This time, I researched about an algorithm for dependencies.. Basically, what npm uses to keep track of all the dependencies.. You never know where knowledge might reach you LOL.. So, Basically, now each file, or system like Player, Physics, and to add, Chunks and More, will have to implement system, and each system would have a dependency tree, and then by using Kahn’s Algorithm, we can literally turn that tree upside down, and go through the data and make it work.. It literally tells you, which files are Missing in your code, that is just too good.. The only one critic is that, each time you need to be assing a new attribute, which might be tedious, but the profits are way too big to ignore at all.."}, {"post_id": 23398, "ts": "2026-07-06T10:26:26Z", "hours": 2.1028, "text": "Final few fixes before shipping, added biome support, and now I will be ready to be trying to make a project, without following tutorial, trying to optimize it, because obviously, three.js, though sounds cool and all.. Uses WebGL, which is widely supported.. but I want to use your entire GPU.. because obviously.. I PAID FOR THE ENTIRE GPU.. (BTW, I don’t even have a GPU, I have what is called Shared GPU Memory with storage but anyways.. THAT IS NOT THE POINT..)"}, {"post_id": 23315, "ts": "2026-07-06T05:58:40Z", "hours": 2.9458, "text": "Added Water, Trees, Sand and polish to my project… Like the toolbar, you can see in the bottom. Clean and Elegant.. COMMENT 67 IF YOU WANT TO SEE A 67 STRUCTURE ADDED TO MY GAME… ;)"}, {"post_id": 22734, "ts": "2026-07-05T09:50:57Z", "hours": 4.8264, "text": "I want to ask, How do you literally add shadows, and fog, and everything and that so, all in just one line of code? That is just stupid to even think about.. But anyways, now I have made it so, you can break and place blocks and also, if you render out from the world, and come back in, the blocks will still be there.. BE READY FOR ANOTHER ROUND OF 67 … OH WAIT.. NEXT DEVLOG WILL BE 67.. OR WAIT, LET ME JUST.. LOL, 100% NOT A STRUCTURE IN GAME.. (ATLEAST FOR NOW.. HEHEHEHE)"}, {"post_id": 22082, "ts": "2026-07-04T10:32:13Z", "hours": 0.3108, "text": "Guys Just imagine a world, where the whole life is actually a simulation, and God is literally using his laptop like this, to see what you are doing.. (AND YES, YOU WERE BANGING YOUR HEAD, JUST NOT ON GRASS.. DON’T LIE TO ME.. I AM SEEING YOU..)"}, {"post_id": 22052, "ts": "2026-07-04T09:31:51Z", "hours": 1.9986, "text": "Collisions are now working, with this beautiful looking icosphere as an helper. I JUST WISH WEBGPU OFFERED SUCH CUSTOMIZABILITY.. BUT TRUST ME, I AM GOING TO ADD THESE INTO THE MAIN PROJECT AS WELL.. Three.JS is just so cool.. But again, my goal is to make it the most optimized stuff and see the Entire Earth, and not be happy with just collisions.. SO Let me just complete this tutorial, but I am having a blast."}, {"post_id": 21954, "ts": "2026-07-04T04:53:29Z", "hours": 0.4147, "text": "I hate to admit it, but did I just add, literal shadows, that would have taken me, so so much hours to be working on.. And THREE.JS SOMEHOW, LITERALLY HAS A FREAKING FUNCTION.. THAT DOES THAT AUTOMATICALLY?? EXCUSE ME??? THAT’S JUST CHEATING.."}, {"post_id": 21906, "ts": "2026-07-04T02:37:42Z", "hours": 0.9956, "text": "This really feels surreal.. I am editing parameters to a game, in which people will land their beautiful foot on, ad mine ores, and do stuff, and this is like a dev mode, where I and I choose how much coal and Iron I want in my life.. Damn.."}, {"post_id": 21629, "ts": "2026-07-03T17:47:52Z", "hours": 0.6967, "text": "Umm, Why is Three.js so easy?? HELLO?? JUST MADE A SIMPLE SLIDER THINGY, AND THIS IS SO DOPE GUYS.."}, {"post_id": 21428, "ts": "2026-07-03T11:35:56Z", "hours": 1.0111, "text": "I have started following a tutorial, and I have done so much research, but it a shame that I cannot log that time. I went through some of the best documents written about WebGPU and explaining stuff.. But anyways, I have started following a tutorial on Three.js for making minecraft. It has literally made me in ease, because now I can log some actual time now.. By writing code rather than researching and for now here is my plan Continue to do this project Phase: 1 Draw a Cube with Controls, Draw 2 Cubes with Controls DRAW 64000 CUBES WITH CONTROLS.. By controls they are Orbital Controls, and then we will move on to the second part which is Working on a Naive Mesher, which will just give all the blocks its own 12 triangles on 8 edges each, and then blow up my laptop because if you realise 64000 * 12 is some sheesh work.. SO MANY TRIANGLES, AND I COULD SEE HARDLY 100.. But atleast, it will be the start, then I will work on Instancing and get me fps back up Also utilize the FrameStats which I will make for myself, like the same which well.. THREE.JS USES BUT WITH MY AKA TRUTHENTITY STYLE.. YOOOOO Then perhaps start erasing triangles that are connected through a second mesher Yes I will have multiple types of Meshers and Multiple type of Camera.. And all should follow a common Camera and everything else should be an Implementation like last time, I gave Geometry Pass the implementation of the simpler Renderer Pass, because it effectively make me plug and play with multiple different ways. This is going to be my stuff for next few days of my life."}, {"post_id": 21275, "ts": "2026-07-03T03:33:09Z", "hours": 0.5992, "text": "Guys, My very first shader, completely written by me, and it looks so sick. All it does is feed into the fragment an attribute of space, and break that space with a checker.. And this is just fascinating.. I want to hug myself.."}, {"post_id": 20908, "ts": "2026-07-02T17:05:27Z", "hours": 1.1739, "text": "Guys I can see progress.."}, {"post_id": 20214, "ts": "2026-07-01T19:23:17Z", "hours": 2.3717, "text": "It was quite easy, I mean, I am finally writing shaders, and yes, you guys have seen me make a triangle before, but that was genuinely speaking, was just a normal little trinagle.. But this triangle.. NO NO.. I have structured it so nicely that dare you break this, and my FATAL ERROR systems start to panic and trigger alarms all around.. It was a chaotic mess, and yes I did rejuvanate some parts of my old project, but yah, It’s not like I don’t know what I am doing now.. Furthermore, Sorry for my mental issues, I GOT MY FIRST SHIP’S PAYOUT, and though I was not expecting it, I am more than happy, even if it was a 13x mult and yah, I got a lot of comments regarding Z-Fighting.. I don’t really know the source of this issue, so I will be making the stuff again anyways, in my ways this time.. And hopefully, it will be better than last time.. I am so happy that I literally broke a tear when I saw I got a payout.. Thanks to everyone for so so much support… I will not be working harder than ever towards this project."}, {"post_id": 19340, "ts": "2026-06-30T16:55:33Z", "hours": 1.5981, "text": "Sorry for all my mental breakdowns.. Here is some actual progress that I did by myself.. I learnt about Assert from my last code.. And why do we need assert.. And I made my own Logger.. What are these so let me explain.. A Logger is atmost just a console.log message, but why to make it a separate class? This offers a lot of usability, as first, you can just say, this is a warning type of stuff, or this is just verbose.. Or MAYBE STOP SOMETHING IF IT IS SOMETHING VERY FATAL, AND SHOULD BE FIXED ASAP.. Not only that, often you will encounter like specially if you link something like a canvas, it might always be that well, Either you will force it using “!” in the end, or you will just do a command that eliminated undefined.. Like if (canvas !== undefined), but assert says.. OK, LET ME HAVE A CONDITION, and not only that, my asserts are special, as I have rigged it, so it will never ever return or what Typescript called a never return.. So you don’t need to write those.. Loggers also have a special use, as if the messages are verbose, instead of removing and readding all the console logs in like a stupid way.. You can declare a class and say, if the level is below fatal, like for verbose or info type of stuff, just cancel those stuff.. Just don’t show it.. It is very nice tool tbh.. Oh yah, I forgot.. Well, as these are custom, so You can literally add another parameter like context, as to what might be the reason for the breaking of the code, so if you check that code later on in life.. You will still know, what broke and where.. It’s a really handy tool in my opinion and everyone should give it a shot."}, {"post_id": 18410, "ts": "2026-06-29T15:32:03Z", "hours": 4.3344, "text": "Yesterday, I was doing research, so I don’t disappoint any of you guys. I watched some matrices manipulation videos and all, and I made this small little copy for myself to store all the findings I have. I don’t really have a lot, but these are certainly my findings, and I don’t prefer making notes on laptop, because personal preference in that. Anyways Give this a read, it is not very hard, and you will learn something new about how the GPU works and specially if you always wondered, what is the actual use of “Matrices” because I am in high school, and I always thought Matrices were silly and all. For people, who have been since the start of this project. First of all, I wanted to talk to you guys.. I don’t really know, what to do to this project. And I feel like, I am going to get banned, because even after all those iterations, remember, the whole project is widely AI made.. Though I am currently research, and have been open. But I don’t really know, how to feel about it. My stupid little Autistic Brain is really panicing that all my 100 hours of work would be gone. Honestly, I won’t be sad or anything if I get banned, because, indeed I used AI, but I just wanted to write my best shot, that atleast, I had a point to say, and then whatever the friends at StarDance decide, I will be completely fine with it. My main goal for developing this project, came from watching a tutorial, and I wanted to try to make something like Minecraft but for the web, because I was fascinated by optimizations.. This optimization, that optimization.. And I was like, Wait, these youtubers are literally rendering trillions of vertexes, why not make it in the browser, and even if I am able to render in 100s.. I still would always find it fascinating.. I never really thought before I started, and I just wanted to talk to AI, about how everything worked, and all.. I did mostly the research about optimization, and I specifically chose Gemini Pro over Claude, because Claude really does the heavy lifting for everyone, whereas I was here to learn. That’s the reason, I had so many hours invested.. (and so many reiterations on my code LOL…). I wanted to learn, but not like the code, but like how to optimize, like, I used to think.. Wait, BITWISE MAPPING.. We can map this much bytes to this, and that, and let the AI write the code for that.. I was just so invested on this project, I forgot we had a rule of “NO MORE THAN 30% AI..” Ahh, I am stupid.. That’s why, I am trying to gain myself back a lot now.. Doing stuff without hours like writing on copy, because obviously I could have written through VSC or something.. but now, I have really given hope on this project as a Retired / Banned Project…. I literally am currently working on a different repo with the name Minecraft rather than this.. I am watching youtube videos and lectures about how WebGPU works and all.. And I want to gain myself back.. As in a good person, and not like an AI slop, who breaks rules.."}, {"post_id": 17378, "ts": "2026-06-28T04:25:03Z", "hours": 0.5958, "text": "If anyone wants to understand more about what a Graphics API is, and how is it meant to work, I would highly suggest watching “Making my own 3D engine” by Inkbox https://www.youtube.com/watch?v=OJoZSRnU0is"}, {"post_id": 16728, "ts": "2026-06-27T05:24:19Z", "hours": 9.9878, "text": "IDK, How should I actually show my research in here but this is like, I have been working on, I have made 5 different notes, and as you can see by the time.. Yah, I have worked some hours on this bad boy.."}, {"post_id": 15580, "ts": "2026-06-25T10:41:26Z", "hours": 6.1003, "text": "Never in my life, I thought I would be so happy seeing a Red Triangle Render on my screen.. YAH, I WASTED LIKE 6 HOURS READING ARTICLES WRITING SHEESH, THEN ASKING AI, Obviously not to generate code, but about where to understand it better, and how to understand the concepts. And more. GUYS, STOP FOLLOWING ME.. It breaks my heart so much, that I am gonna disappoint you all, if I didn’t make this project, fully work.. Till I was trying to make stuff, and learn and sleep, and learn, I didn’t have so many followers, it was like, fine, if it broke for me, it’s completely fine with me, but now.. IT FEELS LIKE, IT IS NOT GOING TO BE FINE.. Thankfully, I am using a different repo, and that is accurately named as “Minecraft” rather than Puzzles to avoid confusion. As where did the Puzzle come from? Well, long story short, see my first ever devlog in here."}, {"post_id": 14225, "ts": "2026-06-23T07:27:20Z", "hours": 2.3678, "text": "Guys, I will be completely open, and I have said before as well, but seeing so many people keep following me. Thank you so much for following a project, that is though made by me, but it like I am owning a shop that is run by someone else. AKA, AI has helped me a ton, and so much that, I don’t know, anything afterwards, specially with Shaders, WebGPU and other creative stuff and optimizations, which let’s be honest, the optimizations like, GREEDY MESHING!!, OCCLUSION CULLING, BACK CULLING (Though it was just like a line as it was native to WebGPU), and while reading through other low level youtubers about optimizations such as, EXTREMITY BOUND CHECKING, BITWISE MANIPULATION,CACHE LOCALITY, NOISE UPSAMPLING, NOISE CASHING, RUN LENGTH ENCODING, RLE BASED RUNTIME. VOXEL DATALOOKUP TABLES, AoSoA and so on, like these just become buzz words that I ask my AI to help with, and that’s the recipe to make everything fall apart when you want to add something new. AI’s context windows are just not big enough to have a full fedged Minecraft. Seeing all you guys support, I have decided to ask AI to now teach me, and help me with the flow, and never the code, I will be coding every single word by myself. Read Papers, and try to implement it myself and so on.. This might be a big turning point for the project because, YAH, I AM WRITING THIS ENTIRE CODE ONCE AGAIN, But this time, I promise, I will be learning everything, and I will keep this as running, and make a second repo like minecraft or something, to enjoy. Sorry to everyone who thought, this is entirely made by me, because that is just not possible for such small 7 second attention span kids like us."}, {"post_id": 12912, "ts": "2026-06-21T04:32:28Z", "hours": 1.0956, "text": "Added leaves and foliage, this was arguable much easy, but I sure know, I again broke my optimizations or atleast something must be broken, because things cannot go this smooth.. AND FOR ONCE, I WROTE SOMETHING I CAN ALSO UNDERSTAND, and then AI was like Nuh Uh, SALTED TREE SIMULATOR!! USE SEED, AND FEED IT WITH SOME SALT, PUSH THAT UP A TREE, AND YOU HAVE BETTER TREES.. I am sometimes stunned that how much AI can really help you develop something, that can look this promising. I thought only top tier people, or people with tons and tons of money to burn on Claude can build this, but this is not that bad, if I am being honest. Obviously, I won’t reach the same level of achievements as that of something like Claude, but I think, I learnt so so much about Shaders, its types, like Vertex, Fragment and My fav, COMPUTE shaders.. And everything is just so cool. Still fixing some bugs here and there, because umm.. Yah, it still needs a lot, and A LOT OF OPTIMIZATIONS and polish, because my chunk generation worked better in my last attempt. Will be figuring everything out so stay tuned my dear friends.. NOTABLE MENTIONS:- YOUTUBERS Low Level Game Dev (He has some clever tricks up as well, which Vericidium didn’t) Vercidium (TRUE INSPIRATION AND GOATED, FOR MAKING MY PROJECT WORK) Frieends Rupnil (My cutiepie, NO QUESTIONS) Adamd (He helped me get funds for one of my hardware projects without asking anything in return. THANK YOU)"}, {"post_id": 12571, "ts": "2026-06-20T15:06:04Z", "hours": 3.2694, "text": "I have just added the option to save, so basically, if you make something funny like 67 on your world with water blocks, first of all, EWW… And second of all, yes it will persist and now I will hate you even more."}, {"post_id": 12374, "ts": "2026-06-20T06:15:52Z", "hours": 1.0867, "text": "Guys, I think, I broke something, but I really cannot point out, what is wrong in my minecraft? I mean.. There is something missing, but what can it be?"}, {"post_id": 12091, "ts": "2026-06-19T18:52:09Z", "hours": 2.1861, "text": "Current Lighting Rendering Engine, currently using the AO metrics that I used last time, but I never understood properly, but this time, this looks so so so cool.. This will be coming soon for you guys as well to enjoy. Stay tuned. This was a lot of trouble and back and forth. Because lighting engine, doesn’t one have to update one chunk, but four neighboring chunk as well, and idk why it took me so long to realise.."}, {"post_id": 11915, "ts": "2026-06-19T12:59:27Z", "hours": 1.8122, "text": "I am sorry, did I just get 60FPS?? I HAD TO PAUSE MY FRAME TO CAPTURE THIS MUCH OPTIMIZATION. I am not even at the peak of it. Furthermore, I was currently working on Sky Box, and I am tired to figuring out what’s wrong, so this is an early devlog of just about 2 hours. I want to rant about skyBox and what did I do to well, Make my game break.. So, what happened is that, the shaders that I am using, I was using vec3, which means sun’s direction is a vector of 3 floats, but somehow, vec3 must always start on a multiple of 16.. WHO DECIDED THAT WAS A GOOD IDEA.. WHO IS THAT MORON??? I WANT TO TAKE MY SHOTGUN OUT (TO FLEX) AND PUNCH HIM (BECAUSE WHO WASTES AMMO.. TOO EXPENSIVE LAH.) I GOT TIRED DEBUGGING THIS… Only for AI to tell me, you did everything right except everything.. I just uploaded everything. You guys might think this is a negative as no trees and grass, but TRUST THE PROCESS.. I KNOW YOU CAN, ELSE I WILL SHOW YOU MY SHOTGUN AND PUNCH YOU AS WELL!!"}, {"post_id": 11811, "ts": "2026-06-19T07:03:19Z", "hours": 1.8922, "text": "Quick Update on the progress.. I mean, FAH.. The render distance so high, and yet the FPS IS PLAYABLE, without even much optimizations. I know, the terrain has nothing for now. But don’t worry.. SOON TM.. Let me handle the optimizations first. AND DON’T YOU DARE CROSS QUESTION ME, ELSE I WILL CROSS YOUR QUESTION BACK TO YOU"}, {"post_id": 11216, "ts": "2026-06-18T11:10:03Z", "hours": 3.03, "text": "Playing Minecraft it was never meant to be LMAO.. On this, an important announcement to make here. I will not be able to add multiplayer into this build, because it adds extra complexity into the build, which I am not able to work it for now. It requires you to first have an server in the first place, and then work with streaming and all those. Latency can be a nightmare to tackle with. I am waiting for my last ship’s payout so I can push on github, all my updates. Till then, I am working on small things, like adding structures like trees, water and so on, because this is a new, and much more optimized build than the last one. You will also find it relatively pleasing to read my code, if you are nerdy enough, but isn’t that hard tbh."}, {"post_id": 11112, "ts": "2026-06-18T05:41:13Z", "hours": 4.0106, "text": "Better support for AO Voxels and lighting coming soon to this build. Stay Tunes or you might miss out. Here is a small working prototype of it. What is AO you may ask? AO means Ambient Occlusion, what it does is check in the four corners, and predict the shading based off of those corners. I mean, AO has much more, but this is like a basic and optimized version of it, that looks good, but also not performance heavy. Obviously, I am not using GAMING RTX 5090 for this.. Hell, My Laptop doesn’t even have a GPU, SO SHUT UP.. IT’S MY GAME AND I WILL DESIGN IT HOWEVER I WANT."}, {"post_id": 10666, "ts": "2026-06-17T15:05:23Z", "hours": 6.2597, "text": "Hate me as much as you want, because, I am rewriting my code once again for the idk, like 5th time, just to learn more, and finally I am able to structure my code properly. Go this was a bad plan. And I would not like to go to this hell ever again. Please god, forgive me for my sins.. But anyways, as you can see, I am currently, literally rewriting parts of the code, and organishing it, into much better folder structure, so I and you, and she who told you not to worry about his boy, can all understand this code and you don’t have to be a nerd to be changing parameters to buff yourself, to become the boy the girls needs.. IDK, I have been working too much on this project. I need therapy LMAO.."}, {"post_id": 9758, "ts": "2026-06-16T06:01:00Z", "hours": 3.4519, "text": "Currently working on WebRTC and understanding, why do I exist, but also why do computers exist, and how do computers know that my computer is not your computer and your computer is well, how is it your computer. And can they secretly interact and do goofy things with ultrasonic, and I mean, it’s technically the speed of light so.. YAH.."}, {"post_id": 9084, "ts": "2026-06-15T05:46:24Z", "hours": 5.6536, "text": "Final Finishing Touches, And I wanted to add much more, like better lighting support and all, but Now I am getting too much out of my comfort zone, and will have to work completely with AI, I have polished the UI, made an Inventory system and a bit more, but now, I am really tired, and cannot explain, how tedious it has become maintaining my own code. So I will have to halt my project now and ship it. Thanks to Stardance for giving me such a wonderful place to code at and work, and show my works and learn so so much cool stuff into the world of GPUs and Shaders."}, {"post_id": 8023, "ts": "2026-06-13T11:57:01Z", "hours": 3.1878, "text": "Umm.. Do cows have lawyers? Anyways, Today, i just worked on refactoring my code into different files, so it is easier to navigate and understand the code. Because it was getting a mess."}, {"post_id": 7405, "ts": "2026-06-12T10:32:33Z", "hours": 1.5669, "text": "Water Update with bouyancy and all.. And made everything look like Avatar.. BLUE TONED.. Because you know, Water is blue, and blue is blue, I have no clue, so make everything blue. Now, you are blue, and me is blue"}, {"post_id": 6967, "ts": "2026-06-11T18:00:49Z", "hours": 0.31, "text": "IDK, How do I show you but basically, As I have moved to a typescript focused base. So, I had to change my monorepo and all. So Now, the game is playable for anyone to enjoy."}, {"post_id": 6940, "ts": "2026-06-11T17:14:07Z", "hours": 11.7611, "text": "Guys it’s been about 12 hours and let me tell you. First of all. I am just too tired after all this. I wanted to use better optimized code like SSBOs but basically, I cannot use it due to the fact that it is not available in OpenGL ES 30 so I had to go all around and make the entire game in another GPU.. Making shaders was already hard. THIS MADE IT WORSE!! So, Currenly, my app supports two formats and if you are stupid enough that you don’t have WebGPU, so it will run normally like WebGL will get on and help. Further optimized my code and also, I will be optimizing it even further. I have added grass by then SO I CAN TOUCH IT, ATLEAST WHEN I AM SITTING AND LEARNING AND DOING THESE STUPID STUFF. Uff.. Also the I have also added moving Cows so you can see, but the texture is just stone so please don’t mind."}, {"post_id": 5711, "ts": "2026-06-09T16:39:15Z", "hours": 0.6553, "text": "Guys, I think, I found a friend.. Its not cute and all.. BUT IT’S LOVELY.. I LOVE HER SO MUCH.. YOU NAME IS WELL.. PET ROCK.. AWWWW.. YOU ARE SO LOVELY MS. PET ROCK.. Hope you don’t die the moment you fall.. 100% NOT FORESHADOWING.."}, {"post_id": 5685, "ts": "2026-06-09T15:47:02Z", "hours": 1.0764, "text": "Water is finally working and it is moving.. It is animated so you can enjoy the ambience. Furthermore, I have dialed up the variables for my night. So, the night isn’t like a horror movie. Took me a little too long then I would anticipate."}, {"post_id": 5566, "ts": "2026-06-09T12:09:32Z", "hours": 1.4347, "text": "Currently I am working on Implementing Water, and let’s just say, it’s not working out well for me."}, {"post_id": 5514, "ts": "2026-06-09T10:09:46Z", "hours": 2.4567, "text": "Guys, I think, When I meant Water, I meant to add Water not BEANS IN MINECRAFT.. LMAOO… BEANS!!!!!! BEANS MOD COMING SOON TM"}, {"post_id": 5058, "ts": "2026-06-08T18:38:13Z", "hours": 1.1131, "text": "ONLY 1% OF PEOPLE CAN FIND THE DIFFERENCE BETWEEN MY LODs LMAO XD… CAN YOU FIND THE 4 LEVELS OF LODS BECAUSE I CANNOT - DORA THE DRUG DEALER"}, {"post_id": 4955, "ts": "2026-06-08T16:20:44Z", "hours": 0.7411, "text": "Inventory Icon Update"}, {"post_id": 4933, "ts": "2026-06-08T15:19:58Z", "hours": 1.7539, "text": "Not to brag about anything, but I just rendered like over 4000 chunks with I know I know, 20 FPS, but you don’t realise, just see the CPU and GPU. It’s not even a proper GPU, Is uses VRAM from my storage no less.. For anyone wondering, Check Intel UHD Graphics, and my CPU is i3-1005G1, so it’s some antique peice, but yet, my algorithms held strong even in rendering 4000 fizzing chunks. Entities like cows coming soon."}, {"post_id": 4779, "ts": "2026-06-08T08:31:49Z", "hours": 4.2933, "text": "Rendering Pipeline Updated, to make it work with even more chunks Procedural Generation, and make it not suck. The main problem I was facing and is still facing is the fact that I am dumb, and also Lighting. Somehow, the Lighting Engine is not working out with so many parameters that I have tested with. I will probably just"}, {"post_id": 4357, "ts": "2026-06-07T17:26:03Z", "hours": 4.3622, "text": "Lighting Engine Update, And tons of optimizations added to make it work. I hope, it doesn’t crash on anyone, because, when I check the memory usage of this bad boy, it was just 56MB, I was like, FAH??? I MADE ALL OF THIS, IN 56 MB???? That’s some crazy shit. I will be working on the Menu and all next. Stay tuned."}, {"post_id": 4077, "ts": "2026-06-07T08:32:19Z", "hours": 6.5333, "text": "First of all, thanks to rufus.gordonheywood for his following, because, I forgot, I was doing star dance, I literally, went so deep into making Minecraft work. If you want, you can check, this minecraft literally has no external dependencies.. THAT IS SOME CRAZY SHIT. I recently made procedral generation, multithreading, and so much more. And I want to be brutally honest with everyone, yes I am using AI, because I just couldn’t make it work without it, the WEBGPU Shaders, the compiling languages, and so much more. I am sorry for anyone who is disappointed. BTW, Currently, I am seeing a bug, that if you fork my project and run it through live server, it is working fine, but not through github. IDK, What’s wrong, but I will get into it ASAP, and make everyone enjoy my shit."}, {"post_id": 3551, "ts": "2026-06-06T15:21:27Z", "hours": 6.1564, "text": "Don’t even ask, why I made a 32x32x32 Minecraft world, and hyperoptimized it to run on GPU and write compute shaders, and eat myself multiple times in the process.. Yah Yah, I used AI, but I wrote everything by hand and understand most of the code, apart from Shaders, just don’t ask me please.. LOL.. But, I made this run with only 40 vertices, like WHAT THE FLUFFFF???? YOOOOO"}, {"post_id": 2775, "ts": "2026-06-05T16:03:25Z", "hours": 5.2967, "text": "Worked on Procedral Glass Breaking… Please don’t ask how long it took, because IT TOOK ME THROUGH THE CORNERS OF INTERNET TO FIND SOMETHING, and then refined it with AI.. Yah AI, I want to be open, But I am not smart enough dealing with such intricate part and design"}]...
|
Title: Minecraft Web by @TruthEntity | Stardance
Title: Minecraft Web by @TruthEntity | Stardance
Devlogs:
Worked on Procedral Glass Breaking… Please don’t ask how long it took, because IT TOOK ME THROUGH THE CORNERS OF INTERNET TO FIND SOMETHING, and then refined it with AI.. Yah AI, I want to be open, But I am not smart enough dealing with such intricate part and design
Don’t even ask, why I made a 32x32x32 Minecraft world, and hyperoptimized it to run on GPU and write compute shaders, and eat myself multiple times in the process.. Yah Yah, I used AI, but I wrote everything by hand and understand most of the code, apart from Shaders, just don’t ask me please.. LOL.. But, I made this run with only 40 vertices, like WHAT THE FLUFFFF???? YOOOOO
First of all, thanks to rufus.gordonheywood for his following, because, I forgot, I was doing star dance, I literally, went so deep into making Minecraft work. If you want, you can check, this minecraft literally has no external dependencies.. THAT IS SOME CRAZY SHIT. I recently made procedral generation, multithreading, and so much more. And I want to be brutally honest with everyone, yes I am using AI, because I just couldn’t make it work without it, the WEBGPU Shaders, the compiling languages, and so much more. I am sorry for anyone who is disappointed. BTW, Currently, I am seeing a bug, that if you fork my project and run it through live server, it is working fine, but not through github. IDK, What’s wrong, but I will get into it ASAP, and make everyone enjoy my shit.
Lighting Engine Update, And tons of optimizations added to make it work. I hope, it doesn’t crash on anyone, because, when I check the memory usage of this bad boy, it was just 56MB, I was like, FAH??? I MADE ALL OF THIS, IN 56 MB???? That’s some crazy shit. I will be working on the Menu and all next. Stay tuned.
Rendering Pipeline Updated, to make it work with even more chunks Procedural Generation, and make it not suck. The main problem I was facing and is still facing is the fact that I am dumb, and also Lighting. Somehow, the Lighting Engine is not working out with so many parameters that I have tested with. I will probably just
Not to brag about anything, but I just rendered like over 4000 chunks with I know I know, 20 FPS, but you don’t realise, just see the CPU and GPU. It’s not even a proper GPU, Is uses VRAM from my storage no less.. For anyone wondering, Check Intel UHD Graphics, and my CPU is i3-1005G1, so it’s some antique peice, but yet, my algorithms held strong even in rendering 4000 fizzing chunks. Entities like cows coming soon.
Inventory Icon Update
ONLY 1% OF PEOPLE CAN FIND THE DIFFERENCE BETWEEN MY LODs LMAO XD… CAN YOU FIND THE 4 LEVELS OF LODS BECAUSE I CANNOT - DORA THE DRUG DEALER
Guys, I think, When I meant Water, I meant to add Water not BEANS IN MINECRAFT.. LMAOO… BEANS!!!!!! BEANS MOD COMING SOON TM
Currently I am working on Implementing Water, and let’s just say, it’s not working out well for me.
Water is finally working and it is moving.. It is animated so you can enjoy the ambience. Furthermore, I have dialed up the variables for my night. So, the night isn’t like a horror movie. Took me a little too long then I would anticipate.
Guys, I think, I found a friend.. Its not cute and all.. BUT IT’S LOVELY.. I LOVE HER SO MUCH.. YOU NAME IS WELL.. PET ROCK.. AWWWW.. YOU ARE SO LOVELY MS. PET ROCK.. Hope you don’t die the moment you fall.. 100% NOT FORESHADOWING..
Guys it’s been about 12 hours and let me tell you. First of all. I am just too tired after all this. I wanted to use better optimized code like SSBOs but basically, I cannot use it due to the fact that it is not available in OpenGL ES 30 so I had to go all around and make the entire game in another GPU.. Making shaders was already hard. THIS MADE IT WORSE!! So, Currenly, my app supports two formats and if you are stupid enough that you don’t have WebGPU, so it will run normally like WebGL will get on and help. Further optimized my code and also, I will be optimizing it even further. I have added grass by then SO I CAN TOUCH IT, ATLEAST WHEN I AM SITTING AND LEARNING AND DOING THESE STUPID STUFF. Uff.. Also the I have also added moving Cows so you can see, but the texture is just stone so please don’t mind.
IDK, How do I show you but basically, As I have moved to a typescript focused base. So, I had to change my monorepo and all. So Now, the game is playable for anyone to enjoy.
Water Update with bouyancy and all.. And made everything look like Avatar.. BLUE TONED.. Because you know, Water is blue, and blue is blue, I have no clue, so make everything blue. Now, you are blue, and me is blue
Umm.. Do cows have lawyers? Anyways, Today, i just worked on refactoring my code into different files, so it is easier to navigate and understand the code. Because it was getting a mess.
Final Finishing Touches, And I wanted to add much more, like better lighting support and all, but Now I am getting too much out of my comfort zone, and will have to work completely with AI, I have polished the UI, made an Inventory system and a bit more, but now, I am really tired, and cannot explain, how tedious it has become maintaining my own code. So I will have to halt my project now and ship it. Thanks to Stardance for giving me such a wonderful place to code at and work, and show my works and learn so so much cool stuff into the world of GPUs and Shaders.
Currently working on WebRTC and understanding, why do I exist, but also why do computers exist, and how do computers know that my computer is not your computer and your computer is well, how is it your computer. And can they secretly interact and do goofy things with ultrasonic, and I mean, it’s technically the speed of light so.. YAH..
Hate me as much as you want, because, I am rewriting my code once again for the idk, like 5th time, just to learn more, and finally I am able to structure my code properly. Go this was a bad plan. And I would not like to go to this hell ever again. Please god, forgive me for my sins.. But anyways, as you can see, I am currently, literally rewriting parts of the code, and organishing it, into much better folder structure, so I and you, and she who told you not to worry about his boy, can all understand this code and you don’t have to be a nerd to be changing parameters to buff yourself, to become the boy the girls needs.. IDK, I have been working too much on this project. I need therapy LMAO..
Better support for AO Voxels and lighting coming soon to this build. Stay Tunes or you might miss out. Here is a small working prototype of it. What is AO you may ask? AO means Ambient Occlusion, what it does is check in the four corners, and predict the shading based off of those corners. I mean, AO has much more, but this is like a basic and optimized version of it, that looks good, but also not performance heavy. Obviously, I am not using GAMING RTX 5090 for this.. Hell, My Laptop doesn’t even have a GPU, SO SHUT UP.. IT’S MY GAME AND I WILL DESIGN IT HOWEVER I WANT.
Playing Minecraft it was never meant to be LMAO.. On this, an important announcement to make here. I will not be able to add multiplayer into this build, because it adds extra complexity into the build, which I am not able to work it for now. It requires you to first have an server in the first place, and then work with streaming and all those. Latency can be a nightmare to tackle with. I am waiting for my last ship’s payout so I can push on github, all my updates. Till then, I am working on small things, like adding structures like trees, water and so on, because this is a new, and much more optimized build than the last one. You will also find it relatively pleasing to read my code, if you are nerdy enough, but isn’t that hard tbh.
Quick Update on the progress.. I mean, FAH.. The render distance so high, and yet the FPS IS PLAYABLE, without even much optimizations. I know, the terrain has nothing for now. But don’t worry.. SOON TM.. Let me handle the optimizations first. AND DON’T YOU DARE CROSS QUESTION ME, ELSE I WILL CROSS YOUR QUESTION BACK TO YOU
I am sorry, did I just get 60FPS?? I HAD TO PAUSE MY FRAME TO CAPTURE THIS MUCH OPTIMIZATION. I am not even at the peak of it. Furthermore, I was currently working on Sky Box, and I am tired to figuring out what’s wrong, so this is an early devlog of just about 2 hours. I want to rant about skyBox and what did I do to well, Make my game break.. So, what happened is that, the shaders that I am using, I was using vec3, which means sun’s direction is a vector of 3 floats, but somehow, vec3 must always start on a multiple of 16.. WHO DECIDED THAT WAS A GOOD IDEA.. WHO IS THAT MORON??? I WANT TO TAKE MY SHOTGUN OUT (TO FLEX) AND PUNCH HIM (BECAUSE WHO WASTES AMMO.. TOO EXPENSIVE LAH.) I GOT TIRED DEBUGGING THIS… Only for AI to tell me, you did everything right except everything.. I just uploaded everything. You guys might think this is a negative as no trees and grass, but TRUST THE PROCESS.. I KNOW YOU CAN, ELSE I WILL SHOW YOU MY SHOTGUN AND PUNCH YOU AS WELL!!
Current Lighting Rendering Engine, currently using the AO metrics that I used last time, but I never understood properly, but this time, this looks so so so cool.. This will be coming soon for you guys as well to enjoy. Stay tuned. This was a lot of trouble and back and forth. Because lighting engine, doesn’t one have to update one chunk, but four neighboring chunk as well, and idk why it took me so long to realise..
Guys, I think, I broke something, but I really cannot point out, what is wrong in my minecraft? I mean.. There is something missing, but what can it be?
I have just added the option to save, so basically, if you make something funny like 67 on your world with water blocks, first of all, EWW… And second of all, yes it will persist and now I will hate you even more.
Added leaves and foliage, this was arguable much easy, but I sure know, I again broke my optimizations or atleast something must be broken, because things cannot go this smooth.. AND FOR ONCE, I WROTE SOMETHING I CAN ALSO UNDERSTAND, and then AI was like Nuh Uh, SALTED TREE SIMULATOR!! USE SEED, AND FEED IT WITH SOME SALT, PUSH THAT UP A TREE, AND YOU HAVE BETTER TREES.. I am sometimes stunned that how much AI can really help you develop something, that can look this promising. I thought only top tier people, or people with tons and tons of money to burn on Claude can build this, but this is not that bad, if I am being honest. Obviously, I won’t reach the same level of achievements as that of something like Claude, but I think, I learnt so so much about Shaders, its types, like Vertex, Fragment and My fav, COMPUTE shaders.. And everything is just so cool. Still fixing some bugs here and there, because umm.. Yah, it still needs a lot, and A LOT OF OPTIMIZATIONS and polish, because my chunk generation worked better in my last attempt. Will be figuring everything out so stay tuned my dear friends.. NOTABLE MENTIONS:- YOUTUBERS Low Level Game Dev (He has some clever tricks up as well, which Vericidium didn’t) Vercidium (TRUE INSPIRATION AND GOATED, FOR MAKING MY PROJECT WORK) Frieends Rupnil (My cutiepie, NO QUESTIONS) Adamd (He helped me get funds for one of my hardware projects without asking anything in return. THANK YOU)
Guys, I will be completely open, and I have said before as well, but seeing so many people keep following me. Thank you so much for following a project, that is though made by me, but it like I am owning a shop that is run by someone else. AKA, AI has helped me a ton, and so much that, I don’t know, anything afterwards, specially with Shaders, WebGPU and other creative stuff and optimizations, which let’s be honest, the optimizations like, GREEDY MESHING!!, OCCLUSION CULLING, BACK CULLING (Though it was just like a line as it was native to WebGPU), and while reading through other low level youtubers about optimizations such as, EXTREMITY BOUND CHECKING, BITWISE MANIPULATION,CACHE LOCALITY, NOISE UPSAMPLING, NOISE CASHING, RUN LENGTH ENCODING, RLE BASED RUNTIME. VOXEL DATALOOKUP TABLES, AoSoA and so on, like these just become buzz words that I ask my AI to help with, and that’s the recipe to make everything fall apart when you want to add something new. AI’s context windows are just not big enough to have a full fedged Minecraft. Seeing all you guys support, I have decided to ask AI to now teach me, and help me with the flow, and never the code, I will be coding every single word by myself. Read Papers, and try to implement it myself and so on.. This might be a big turning point for the project because, YAH, I AM WRITING THIS ENTIRE CODE ONCE AGAIN, But this time, I promise, I will be learning everything, and I will keep this as running, and make a second repo like minecraft or something, to enjoy. Sorry to everyone who thought, this is entirely made by me, because that is just not possible for such small 7 second attention span kids like us.
Never in my life, I thought I would be so happy seeing a Red Triangle Render on my screen.. YAH, I WASTED LIKE 6 HOURS READING ARTICLES WRITING SHEESH, THEN ASKING AI, Obviously not to generate code, but about where to understand it better, and how to understand the concepts. And more. GUYS, STOP FOLLOWING ME.. It breaks my heart so much, that I am gonna disappoint you all, if I didn’t make this project, fully work.. Till I was trying to make stuff, and learn and sleep, and learn, I didn’t have so many followers, it was like, fine, if it broke for me, it’s completely fine with me, but now.. IT FEELS LIKE, IT IS NOT GOING TO BE FINE.. Thankfully, I am using a different repo, and that is accurately named as “Minecraft” rather than Puzzles to avoid confusion. As where did the Puzzle come from? Well, long story short, see my first ever devlog in here.
IDK, How should I actually show my research in here but this is like, I have been working on, I have made 5 different notes, and as you can see by the time.. Yah, I have worked some hours on this bad boy..
If anyone wants to understand more about what a Graphics API is, and how is it meant to work, I would highly suggest watching “Making my own 3D engine” by Inkbox https://www.youtube.com/watch?v=OJoZSRnU0is
Yesterday, I was doing research, so I don’t disappoint any of you guys. I watched some matrices manipulation videos and all, and I made this small little copy for myself to store all the findings I have. I don’t really have a lot, but these are certainly my findings, and I don’t prefer making notes on laptop, because personal preference in that. Anyways Give this a read, it is not very hard, and you will learn something new about how the GPU works and specially if you always wondered, what is the actual use of “Matrices” because I am in high school, and I always thought Matrices were silly and all. For people, who have been since the start of this project. First of all, I wanted to talk to you guys.. I don’t really know, what to do to this project. And I feel like, I am going to get banned, because even after all those iterations, remember, the whole project is widely AI made.. Though I am currently research, and have been open. But I don’t really know, how to feel about it. My stupid little Autistic Brain is really panicing that all my 100 hours of work would be gone. Honestly, I won’t be sad or anything if I get banned, because, indeed I used AI, but I just wanted to write my best shot, that atleast, I had a point to say, and then whatever the friends at StarDance decide, I will be completely fine with it. My main goal for developing this project, came from watching a tutorial, and I wanted to try to make something like Minecraft but for the web, because I was fascinated by optimizations.. This optimization, that optimization.. And I was like, Wait, these youtubers are literally rendering trillions of vertexes, why not make it in the browser, and even if I am able to render in 100s.. I still would always find it fascinating.. I never really thought before I started, and I just wanted to talk to AI, about how everything worked, and all.. I did mostly the research about optimization, and I specifically chose Gemini Pro over Claude, because Claude really does the heavy lifting for everyone, whereas I was here to learn. That’s the reason, I had so many hours invested.. (and so many reiterations on my code LOL…). I wanted to learn, but not like the code, but like how to optimize, like, I used to think.. Wait, BITWISE MAPPING.. We can map this much bytes to this, and that, and let the AI write the code for that.. I was just so invested on this project, I forgot we had a rule of “NO MORE THAN 30% AI..” Ahh, I am stupid.. That’s why, I am trying to gain myself back a lot now.. Doing stuff without hours like writing on copy, because obviously I could have written through VSC or something.. but now, I have really given hope on this project as a Retired / Banned Project…. I literally am currently working on a different repo with the name Minecraft rather than this.. I am watching youtube videos and lectures about how WebGPU works and all.. And I want to gain myself back.. As in a good person, and not like an AI slop, who breaks rules..
Sorry for all my mental breakdowns.. Here is some actual progress that I did by myself.. I learnt about Assert from my last code.. And why do we need assert.. And I made my own Logger.. What are these so let me explain.. A Logger is atmost just a console.log message, but why to make it a separate class? This offers a lot of usability, as first, you can just say, this is a warning type of stuff, or this is just verbose.. Or MAYBE STOP SOMETHING IF IT IS SOMETHING VERY FATAL, AND SHOULD BE FIXED ASAP.. Not only that, often you will encounter like specially if you link something like a canvas, it might always be that well, Either you will force it using “!” in the end, or you will just do a command that eliminated undefined.. Like if (canvas !== undefined), but assert says.. OK, LET ME HAVE A CONDITION, and not only that, my asserts are special, as I have rigged it, so it will never ever return or what Typescript called a never return.. So you don’t need to write those.. Loggers also have a special use, as if the messages are verbose, instead of removing and readding all the console logs in like a stupid way.. You can declare a class and say, if the level is below fatal, like for verbose or info type of stuff, just cancel those stuff.. Just don’t show it.. It is very nice tool tbh.. Oh yah, I forgot.. Well, as these are custom, so You can literally add another parameter like context, as to what might be the reason for the breaking of the code, so if you check that code later on in life.. You will still know, what broke and where.. It’s a really handy tool in my opinion and everyone should give it a shot.
It was quite easy, I mean, I am finally writing shaders, and yes, you guys have seen me make a triangle before, but that was genuinely speaking, was just a normal little trinagle.. But this triangle.. NO NO.. I have structured it so nicely that dare you break this, and my FATAL ERROR systems start to panic and trigger alarms all around.. It was a chaotic mess, and yes I did rejuvanate some parts of my old project, but yah, It’s not like I don’t know what I am doing now.. Furthermore, Sorry for my mental issues, I GOT MY FIRST SHIP’S PAYOUT, and though I was not expecting it, I am more than happy, even if it was a 13x mult and yah, I got a lot of comments regarding Z-Fighting.. I don’t really know the source of this issue, so I will be making the stuff again anyways, in my ways this time.. And hopefully, it will be better than last time.. I am so happy that I literally broke a tear when I saw I got a payout.. Thanks to everyone for so so much support… I will not be working harder than ever towards this project.
Guys I can see progress..
Guys, My very first shader, completely written by me, and it looks so sick. All it does is feed into the fragment an attribute of space, and break that space with a checker.. And this is just fascinating.. I want to hug myself..
I have started following a tutorial, and I have done so much research, but it a shame that I cannot log that time. I went through some of the best documents written about WebGPU and explaining stuff.. But anyways, I have started following a tutorial on Three.js for making minecraft. It has literally made me in ease, because now I can log some actual time now.. By writing code rather than researching and for now here is my plan Continue to do this project Phase: 1 Draw a Cube with Controls, Draw 2 Cubes with Controls DRAW 64000 CUBES WITH CONTROLS.. By controls they are Orbital Controls, and then we will move on to the second part which is Working on a Naive Mesher, which will just give all the blocks its own 12 triangles on 8 edges each, and then blow up my laptop because if you realise 64000 * 12 is some sheesh work.. SO MANY TRIANGLES, AND I COULD SEE HARDLY 100.. But atleast, it will be the start, then I will work on Instancing and get me fps back up Also utilize the FrameStats which I will make for myself, like the same which well.. THREE.JS USES BUT WITH MY AKA TRUTHENTITY STYLE.. YOOOOO Then perhaps start erasing triangles that are connected through a second mesher Yes I will have multiple types of Meshers and Multiple type of Camera.. And all should follow a common Camera and everything else should be an Implementation like last time, I gave Geometry Pass the implementation of the simpler Renderer Pass, because it effectively make me plug and play with multiple different ways. This is going to be my stuff for next few days of my life.
Umm, Why is Three.js so easy?? HELLO?? JUST MADE A SIMPLE SLIDER THINGY, AND THIS IS SO DOPE GUYS..
This really feels surreal.. I am editing parameters to a game, in which people will land their beautiful foot on, ad mine ores, and do stuff, and this is like a dev mode, where I and I choose how much coal and Iron I want in my life.. Damn..
I hate to admit it, but did I just add, literal shadows, that would have taken me, so so much hours to be working on.. And THREE.JS SOMEHOW, LITERALLY HAS A FREAKING FUNCTION.. THAT DOES THAT AUTOMATICALLY?? EXCUSE ME??? THAT’S JUST CHEATING..
Collisions are now working, with this beautiful looking icosphere as an helper. I JUST WISH WEBGPU OFFERED SUCH CUSTOMIZABILITY.. BUT TRUST ME, I AM GOING TO ADD THESE INTO THE MAIN PROJECT AS WELL.. Three.JS is just so cool.. But again, my goal is to make it the most optimized stuff and see the Entire Earth, and not be happy with just collisions.. SO Let me just complete this tutorial, but I am having a blast.
Guys Just imagine a world, where the whole life is actually a simulation, and God is literally using his laptop like this, to see what you are doing.. (AND YES, YOU WERE BANGING YOUR HEAD, JUST NOT ON GRASS.. DON’T LIE TO ME.. I AM SEEING YOU..)
I want to ask, How do you literally add shadows, and fog, and everything and that so, all in just one line of code? That is just stupid to even think about.. But anyways, now I have made it so, you can break and place blocks and also, if you render out from the world, and come back in, the blocks will still be there.. BE READY FOR ANOTHER ROUND OF 67 … OH WAIT.. NEXT DEVLOG WILL BE 67.. OR WAIT, LET ME JUST.. LOL, 100% NOT A STRUCTURE IN GAME.. (ATLEAST FOR NOW.. HEHEHEHE)
Added Water, Trees, Sand and polish to my project… Like the toolbar, you can see in the bottom. Clean and Elegant.. COMMENT 67 IF YOU WANT TO SEE A 67 STRUCTURE ADDED TO MY GAME… ;)
Final few fixes before shipping, added biome support, and now I will be ready to be trying to make a project, without following tutorial, trying to optimize it, because obviously, three.js, though sounds cool and all.. Uses WebGL, which is widely supported.. but I want to use your entire GPU.. because obviously.. I PAID FOR THE ENTIRE GPU.. (BTW, I don’t even have a GPU, I have what is called Shared GPU Memory with storage but anyways.. THAT IS NOT THE POINT..)
I almost crashed out today. It was a hectic of a job today for me.. Basically, Today I wanted to work on Debugging tools in my original minecraft version. Though, this was hectic of a job, but now I am confident enough to say that, if anything goes wrong, my error codes will instantly trigger and stop those bugs to ever reach me, specially, If I messed up something. This is specifically made to guard rail myself (as I am a newbie in the GPU optimization and just breaks stuff way too often for comfort during my learning steps..) Now, you might be working what is so special that I did that I am being too optimistic (Specially if you know my history of crashouts LOL…) So, Basically, This time, I researched about an algorithm for dependencies.. Basically, what npm uses to keep track of all the dependencies.. You never know where knowledge might reach you LOL.. So, Basically, now each file, or system like Player, Physics, and to add, Chunks and More, will have to implement system, and each system would have a dependency tree, and then by using Kahn’s Algorithm, we can literally turn that tree upside down, and go through the data and make it work.. It literally tells you, which files are Missing in your code, that is just too good.. The only one critic is that, each time you need to be assing a new attribute, which might be tedious, but the profits are way too big to ignore at all..
I have connected my GPU now, and details are also loading nicely.. I will working on GPU Frames and all as well now.
I am crashing out a lot over some assets, because first of all, why is the grass block not green and a colormap, I mean, it does look cool.. BUT COME ON, THAT’S A MENTAL TRAUMA AND NOW WHICH COLOR OF GRASS SHOULD I PICK.. Furthermore, this is also a problem with water and all.. I am trying to find better ways, and actually learn about how Minecraft renders these and turns out, they just.. well.. OVERLAY A GREEN MAP or BLUE MAP over the grass.. I mean, that sounds HORRIBLE TO IMPLEMENT, MY GOD, THIS GAME SU…. IS FINE.. AND FUN.. Furthermore, thank you so so so much for all the reviewers out there.. The fact you guys appreciated my project, and said it is Fine to be using AI.. It just blew my heart.. This is the reason why I am currently working, else, I had already blew my mind with so much complex debugging, such that, I had to make my own engine, and debugger.. As with the latest you can see.. Things are tough but yah.. Also, I see you @skhsmrn on my devlog and another reviewer.. Your demands for 67 WILL BE FULFILLED SOON TM..
Been some time, and the amount of Logs that I am going through is just.. LMAO.. Crazy Crazy.. For my 67 fans, just give me like a few more moments.. Because, Now, I just want to render one block, and I will just add a sky, which will be a simple color gradient, and then I will work on whatever you that 67 thing.. This was really hectic to implement.. Literally had to go through and implement Archetype.. Yes, even I don’t know what they are… But after like learning about it, here is my understanding.. Archetype is basically a central place to keep all the components and all. Remember, we are optimizing the sheesh out of this project.. Archetypes allow us to apply the same gravity and same systems like Physics, collisions and so on, while still giving you customizabilty on if you want to enable it or not.. It’s really cool, but the amount of things I had to implement.. That’s some brutal stuff… Imagine, you forgot to plug the input system, and you are crashing out on, HOW TO FAH THE POSITION IS NOT CHANGING?? LOL, YAH 2 HOURS OF DEBUGGING WENT THERE, only to realise, I forgot to add that.. LOL..
LMAO, You know, you are at the pinnacle when you are going through forums and forums of actually big stuff, that very very few people ever talk about.. Literally..
Sorry, ANOTHER QUICK UPDATE I KNOW.. But trust me, this took me ages to implement, and yes, had to work from backwards, because and again found out, There was nothing being connected to the swapchain for some reason.. It’s actually really not that hard to find bugs when you are used to it, like when something isn’t rendering you know, something must be wrong with renderer and all.. and a quick side step, and you understand yah, swapchain being uninitialized is the key.
Added some simple tests for the ECS system and the topological sort Kahn’s Algorithm system and the Event Bus, so as to 100% confirm the workings of what is intended and what is not.. Also there was a problem with connection of gbuffers into swap chain, so had to make a custom pass called, composite pass, that will intercept and then gives us the necessary output. This might add very minute delay, but it is very unnoticable so don’t worry..
Procedural Generation unlocked, now, you can move as much as you want, and play. Current, block placing and all won’t work, but yah.. Frustum Culling is working as you can see with the culled meter.
67 Structure Implemented and running, and to those who recommended me this.. GUYS YOU REALLY NEED TO SEE A THERAPY OR SOMETHING.. LMAO..
I literally been sick for 2 days, and now that I come back, I somehow see worse.. Like, I wanted to implement meshing and all.. GUESS WHAT I DONE.. YES, MESHED THE ENTIRE WORLD TO DISAPPEAR.. BALLS… I AM GUAVA AND I WILL EAT MYSELF.. That’s enough coding for today as well, signing off..
Hi Everyone, My Devlogs have been lacking a bit, and this another quick devlog, because, I am really not feeling good these days. I am having fever and not feeling great about anything. Currently, I was just searching and asking AI about chunk generation. One of the things, where AI is now needed, because I know noise generation, but I don’t really know, how to make it into reality, and specially when people want realistic chunk generation and all.. I will get into good and start fixing first of all, this light problem, and then just hope, I get well soon, because India’s heat waves are really no joke. My Indian Friends.. Please stay safe and inside house.. IDK, Why even schools are open..
Ships:
Basically, What I have made is Minecraft Web, well Minecraft but on the Website, running on your Browser. Through the Power of Optimizations and knowing how to code, and also using AI for my shader building and debugging bugs like IDK, What I have done to my life. But Basically, I made my own Engine just to prove that You don’t always need THREE.js to do your heavy lifting, and honestly, it was not that hard. You can see the source code, just a few days ago, I refactored it. Hope you love and enjoy my project.
NOTE: Please Skip Voting, if it failed to run on your system please… Hi Friends, so, I have been working on Minecraft for a long time, and Virtually touching grass LOL.. AKA, Making Minecraft, it is quite challenging to say the least, you can check my devlogs.. Basically, I want to make a very very optimized version of minecraft, that you can see through far and far, and highly optimized. I want to add lighting and all, but the banner is a bit misleading.. I will continue to work on the project, but obviously, not Three.js, because What I have learnt is that.. You can use engines like Unity and Unreal, and make goated projects, the feel of making optimized content, and making it run even on a potato, is just on another level.. Seeing the entire generation moving towards fast making and prototyping, it is always a safe bet to try something new and interesting. This is one of the prototypes that taught me a lot, from How to deal with chunks, and manage chunks, to making biomes, which was actually new.. Chunks I have worked with AI before, and it helped me a ton, and I know about those, but not here.. Hope you love my project...
|
1792835375.0242522
|
1792921775.0242522
|
|
6480
|
RAMSpeed by @thenasaplusit | Stardance
|
thenasaplusit
|
2
|
16.0
|
189
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-02T21:56:27Z", "hours": 13.0, "multiplier": 13.15, "payout": 173, "blessing": "neutral", "text": "Funny thing that happened while shipping this: I want it to be v1.4.2 when shipping, because, of course, 42 is the answer to everything. However, I missed theming the selector for the initial 1.4.2, so I ended up just incrementing the build number for the patch. Aside from that, I think this is it for this project (what else could I possibly add?) Stay tuned for more!", "repo": "https://github.com/Hacker-Anirudh/ramspeed", "demo": "https://ramspeed.sudothelinuxwizard.com/"}, {"ship_num": 2, "ts": "2026-06-04T16:57:34Z", "hours": 3.0, "multiplier": 4.9, "payout": 16, "blessing": "neutral", "text": "Since I have exams now, I decided to start with something I’ve wanted to make for a while - a RAM speed calculator. It’s pretty simple, but it works reliably!", "repo": "https://github.com/Hacker-Anirudh/ramspeed", "demo": "https://ramspeed.sudothelinuxwizard.com/"}]...
|
[{"post_id": 21097, "ts": "202 [{"post_id": 21097, "ts": "2026-07-02T21:52:50Z", "hours": 0.2731, "text": "To round it off, I made the selector responsive to your theme so you don’t suddenly get blinded in the night."}, {"post_id": 21088, "ts": "2026-07-02T21:31:45Z", "hours": 2.9589, "text": "It’s been a long day, but I have some stuff to show for it! Firstly, I added persistence for all the settings. I also added both the Material and Cupertino designs, and you can choose which one you want to use!"}, {"post_id": 15878, "ts": "2026-06-25T20:09:21Z", "hours": 1.9878, "text": "I added a mode to switch between decimal and binary prefixes, as well as getting rid of spaghetti logic."}, {"post_id": 15313, "ts": "2026-06-24T21:29:22Z", "hours": 2.4161, "text": "I finally got around to adding another screen that calculates PCIe bandwidth. Was actually pretty straightforward."}, {"post_id": 10699, "ts": "2026-06-17T15:48:25Z", "hours": 2.5086, "text": "Cupertino version is here guys!"}, {"post_id": 4235, "ts": "2026-06-07T14:03:26Z", "hours": 1.0706, "text": "I found a linter called very_good_analysis as well, so the code is even cleaner now. Took forever to do though. The commits are piling up more than I’d like given I should be studying, but oh well."}, {"post_id": 2992, "ts": "2026-06-05T22:21:54Z", "hours": 1.2869, "text": "After a bit of work, I have cleaned up the spaghetti code I had produced yesterday. For now it’s pretty useless, but if I ever decide to add any other functions (PCIe??) it will come in handy."}, {"post_id": 2702, "ts": "2026-06-05T12:24:49Z", "hours": 0.3817, "text": "I decided to go ahead and upload it now. With an improved dialog and all the other improvement I’ve added."}, {"post_id": 2691, "ts": "2026-06-05T11:53:38Z", "hours": 0.5828, "text": "I don’t know why I didn’t do this earlier, but now I added an “About” dialog and a license! (not live yet though, I need to add some other changes). While I’m at it, should I make downloadable binaries?"}, {"post_id": 2234, "ts": "2026-06-04T16:53:14Z", "hours": 2.9869, "text": "Finally got it working (example shows data of my future PC). Check it out at https://hacker-anirudh.github.io/ramspeed-web/ !"}, {"post_id": 1543, "ts": "2026-06-03T16:57:01Z", "hours": 0.2978, "text": "I’m building an app to calculate RAM speed in GB/s from the MT/s value that is commonly given. I haven’t gotten very far yet though."}]...
|
Title: RAMSpeed by @thenasaplusit | Stardance
Dev Title: RAMSpeed by @thenasaplusit | Stardance
Devlogs:
I’m building an app to calculate RAM speed in GB/s from the MT/s value that is commonly given. I haven’t gotten very far yet though.
Finally got it working (example shows data of my future PC). Check it out at https://hacker-anirudh.github.io/ramspeed-web/ !
I don’t know why I didn’t do this earlier, but now I added an “About” dialog and a license! (not live yet though, I need to add some other changes). While I’m at it, should I make downloadable binaries?
I decided to go ahead and upload it now. With an improved dialog and all the other improvement I’ve added.
After a bit of work, I have cleaned up the spaghetti code I had produced yesterday. For now it’s pretty useless, but if I ever decide to add any other functions (PCIe??) it will come in handy.
I found a linter called very_good_analysis as well, so the code is even cleaner now. Took forever to do though. The commits are piling up more than I’d like given I should be studying, but oh well.
Cupertino version is here guys!
I finally got around to adding another screen that calculates PCIe bandwidth. Was actually pretty straightforward.
I added a mode to switch between decimal and binary prefixes, as well as getting rid of spaghetti logic.
It’s been a long day, but I have some stuff to show for it! Firstly, I added persistence for all the settings. I also added both the Material and Cupertino designs, and you can choose which one you want to use!
To round it off, I made the selector responsive to your theme so you don’t suddenly get blinded in the night.
Ships:
Since I have exams now, I decided to start with something I’ve wanted to make for a while - a RAM speed calculator. It’s pretty simple, but it works reliably!
Funny thing that happened while shipping this: I want it to be v1.4.2 when shipping, because, of course, 42 is the answer to everything. However, I missed theming the selector for the initial 1.4.2, so I ended up just incrementing the build number for the patch. Aside from that, I think this is it for this project (what else could I possibly add?) Stay tuned for more!...
|
1792824483.08654
|
1792910883.08654
|
|
6549
|
Hunter Games by @LoginlikeLogan | Stardance
|
LoginlikeLogan
|
2
|
18.0
|
22
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-07T14:24:03Z", "hours": 11.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "So I made a Games website to play some fun games. I went through many challenges of going through bugs and site issues. Hope you guys enjoy this site and support me!", "repo": "https://github.com/Logdegret/HunterGames", "demo": "https://logdegret.github.io/HunterGames/"}, {"ship_num": 2, "ts": "2026-06-04T00:12:29Z", "hours": 7.0, "multiplier": 15.05, "payout": 22, "blessing": "neutral", "text": "I made a game site called Hunter games that is on a github website. It is open sourced, fun, and highly addicting. I am currently still working out a few bugs but most of the games are fully playable. I did not create the games except bossbound which I used AI to make (sadly). Bossbound is still a work in progress but other than that enjoy!", "repo": "https://github.com/Logdegret/HunterGames", "demo": "https://logdegret.github.io/HunterGames/"}]...
|
[{"post_id": 21745, "ts": "202 [{"post_id": 21745, "ts": "2026-07-03T20:40:35Z", "hours": 0.7319, "text": "Site Back Up! 😁 Ive got the site back up! I think this was a github Issue but feel free to go and play some games now bc Ive added a few more new games that are pretty addicting! Btw these are NOT all of the games"}, {"post_id": 20928, "ts": "2026-07-02T17:31:09Z", "hours": 1.115, "text": "SOOOO many bugs! this is horrible! there is so many deployment bugs that need to be fixed which might be githubs fault since it might be down rn, so I might try agian tomorrow"}, {"post_id": 20262, "ts": "2026-07-01T20:11:48Z", "hours": 0.5294, "text": "Added two more games and will be done pretty soon! Check it out I added two more games, Google doodle baseball and 3 slices to the website!"}, {"post_id": 16037, "ts": "2026-06-26T01:35:52Z", "hours": 1.0981, "text": "Missing games fixed!"}, {"post_id": 14383, "ts": "2026-06-23T14:27:39Z", "hours": 0.6692, "text": "Fixing spacing issues and added OvO"}, {"post_id": 11954, "ts": "2026-06-19T14:47:19Z", "hours": 1.5383, "text": "I added a new logo and created a dev mode to add games, bugs though need to be fixed…"}, {"post_id": 5562, "ts": "2026-06-09T12:02:29Z", "hours": 5.205, "text": "Complete rework! Added friends list, and stats!😙"}, {"post_id": 1789, "ts": "2026-06-04T00:08:43Z", "hours": 0.4333, "text": "Added an opensourced golf game that was found on github. Kinda doesn’t work right now but it is a work in progress"}, {"post_id": 1770, "ts": "2026-06-03T23:21:50Z", "hours": 0.5283, "text": "Added Xp bar to home ui, There are still bugs though"}, {"post_id": 1751, "ts": "2026-06-03T22:49:43Z", "hours": 5.895, "text": "Fixing Hunter Games Bugs"}]...
|
Title: Hunter Games by @LoginlikeLogan | Stardance Title: Hunter Games by @LoginlikeLogan | Stardance
Devlogs:
Fixing Hunter Games Bugs
Added Xp bar to home ui, There are still bugs though
Added an opensourced golf game that was found on github. Kinda doesn’t work right now but it is a work in progress
Complete rework! Added friends list, and stats!😙
I added a new logo and created a dev mode to add games, bugs though need to be fixed…
Fixing spacing issues and added OvO
Missing games fixed!
Added two more games and will be done pretty soon! Check it out I added two more games, Google doodle baseball and 3 slices to the website!
SOOOO many bugs! this is horrible! there is so many deployment bugs that need to be fixed which might be githubs fault since it might be down rn, so I might try agian tomorrow
Site Back Up! 😁 Ive got the site back up! I think this was a github Issue but feel free to go and play some games now bc Ive added a few more new games that are pretty addicting! Btw these are NOT all of the games
Ships:
I made a game site called Hunter games that is on a github website. It is open sourced, fun, and highly addicting. I am currently still working out a few bugs but most of the games are fully playable. I did not create the games except bossbound which I used AI to make (sadly). Bossbound is still a work in progress but other than that enjoy!
So I made a Games website to play some fun games. I went through many challenges of going through bugs and site issues. Hope you guys enjoy this site and support me!...
|
1792875200.2760565
|
1793739200.2760565
|
|
6550
|
Leading Zeros Utility by @infinite_silly | Stardan Leading Zeros Utility by @infinite_silly | Stardance...
|
infinite_silly
|
2
|
23.0
|
304
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-07T21:43:33Z", "hours": 17.0, "multiplier": 17.27, "payout": 289, "blessing": "neutral", "text": "Hello everyone! I was working on some Project Euler problems, and I realised that my solutions weren’t sorting correctly because they didn’t have any leading zeros in the numeric portion of their filenames. The same issue happened for my Advent of Code solutions once I hit day 10. I realised I could automate this, and the leading-zero-util was born. It slowly grew from a little, mediocre script to a decently-ish written CLI tool with proper unit tests, a Homebrew tap, a man page, and completions. If you want a better look at the development process than just the devlogs, please check out my commits on GitHub. If you are going to install the LZU, I also recommend that you use the Homebrew tap rather than the crates.io release, the instructions for which are in the README.", "repo": "https://github.com/KaonQuantum/leading-zero-util", "demo": "https://crates.io/crates/leading-zero-util"}, {"ship_num": 2, "ts": "2026-06-10T15:04:30Z", "hours": 6.0, "multiplier": 2.57, "payout": 15, "blessing": "neutral", "text": "I made a utility to change the number of leading zeros in filenames! I was working on Project Euler and had to add a leading zero to all my filenames, which was tedious, so I made this!", "repo": "https://github.com/KaonQuantum/leading-zero-util", "demo": "https://crates.io/crates/leading-zero-util"}]...
|
[{"post_id": 42843, "ts": "202 [{"post_id": 42843, "ts": "2026-08-07T19:41:19Z", "hours": 0.9986, "text": "Drop it Like it’s Hot THIS IS THE FINAL DEVLOG!!!! We got a working release! After my last devlog, I added some unit tests for skip_rename(), and I added the Github default Rust workflow with some modifications to the repo to automatically test any new commits against the test suit, which is most of my codebase. Also added a test workflow to the homebrew tap so it’s easier to see that all is working."}, {"post_id": 42489, "ts": "2026-08-07T08:00:31Z", "hours": 1.3761, "text": "Refactor I’m going to keep this one quick because it just got deleted for being too long. The previously mentioned behaviour of overwriting filenames has been fixed and has it’s own unit test now. It was given an exception before the actual rename. All the rename logic was duplicated between dec and !dec, so I flattened that. I pulled out the pre-rename exception logic into a new helper: skip_rename(). It needs unit tests of its own. Byyyeeeeee!!!"}, {"post_id": 42432, "ts": "2026-08-07T04:14:30Z", "hours": 1.0014, "text": "I’m Smart but I’m Bad at Taking Tests Hello again! You know what they say, new commit, new devlog! “[Test] Torsion” We got MORE UNIT TESTS!!! The get_filenames() fn was formerly the only function in helpers.rs that had no unit tests, so I added 6 unit tests for it. They have about the same general structure as the unit tests for change_leading_zeros(). Beautification I was trying to make my code prettier, and I accidentally screwed up an ownership issue. My unit tests made use of tempdirs with the tempfile crate to test change_leading_zeros() and get_filenames. This is the original pattern for getting the temp dir’s path: let binding = tempdir () .unwrap (); let dir = binding .path (); // stuff can be done with dir now This is what I changed it to: let dir = tempdir () .unwrap () .path () .to_owned (); When the tempdir gets dropped, it also deletes the directory, which makes dir a path to a dir that doesn’t exist. Everything compiles fine, but the code panics because the tempdir doesn’t exist. Override Something I forgot to mention in my last devlog is that if there was the files file1.txt and file01.txt, it (c/w)ould rename over one of the files and silently delete the file written over. I still have to fix this issue. I’ve wanted to learn Zig, so I looked up Zig crash courses on Youtube, and this is from the one I was watching."}, {"post_id": 42339, "ts": "2026-08-07T00:40:04Z", "hours": 2.7222, "text": "Testing Tests Hello again! I can’t believe we’re on devlog #8, considering I have been doing pretty sparse devlogs! if true { allTestsPass } IT’S UNIT TEST TIIIIIME!!! I added 13 unit tests to my big change_leading_zeros() function. They cover most, if not all, possible edge cases. Rename file11 -> file11 I discovered that in change_leading_zeros(), if the resulting new filename was the same as the old, would still do the rename, and it would count as a renamed file, so that the actual number of renamed files would be too large. Hating on for loops as much as the functional bros. I realised that my get_filenames() fn, which still has no unit tests, could be swapped to an iterator structure. old: pub fn get_filenames ( path : & Path ) -> Vec < String > { let mut names = Vec :: new (); if let Ok ( read_dir ) = fs :: read_dir ( path ) { for file in read_dir .flatten () { names .push ( file .file_name () .into_string () .unwrap_or ( \"unknown name\" .into ()), ); } } names } pub fn get_filenames ( path : & Path ) -> Vec < String > { fs :: read_dir ( path ) .into_iter () .flatten () .flatten () .map (| f | f .file_name () .into_string () .unwrap_or ( \"unknown name\" .into ())) .collect () } The two functions behave in exactly the same way, no unnecesary unwrap()s that may cause panics See y’all next devlog!"}, {"post_id": 41806, "ts": "2026-08-06T07:38:58Z", "hours": 2.0653, "text": "Testing, Testing, 1 2 3 Here’s what I’ve been working on to try to get a good, stable release. I Need an Extension I discovered that when doing the normalising add, the one that’s like problem-1.txt, problem-11.rs (-n 1) -> problem-01.txt, problem-11.rs (keeps the same total length of the numeric portion), it actually counts the extension characters, so the result would actually be problem-01.txt, problem-011.rs because the extensions are different lengths. Previously, the find_target() function was like this: pub fn find_target ( filenames : & Vec < String > , count : usize ) -> usize { let mut minimum = usize :: MAX ; for file in filenames { let ( dot_index , cond ) = check_file ( file ); if cond { continue ; } let split_index = find_split_index ( file , dot_index ); minimum = minimum .min ( file [ split_index .. ] .len ()); } minimum + count } Now, it’s pub fn find_target ( filenames : & Vec < String > , count : usize ) -> usize { let mut minimum = usize :: MAX ; let mut is_numeric : bool = false ; for file in filenames { let ( dot_index , cond ) = check_file ( file ); if cond { continue ; } let split_index = find_split_index ( file , dot_index ); minimum = minimum .min ( file [ split_index .. dot_index ] .len ()); is_numeric = true ; } if is_numeric { minimum + count } else { 0 } } Now the target isn’t the shortest number of characters in the numeric portion plus the extension, it’s just the extension. The is_numeric variable is just there so that it doesn’t try to add count to usize::MAX, getting an overflow if there are no files with numeric suffixes. sleep(); sleep(); sleep(); allTestsPass(); The last step before 1.0.0 is UNIT TESTS!!!!!! The easiest unit tests to write are ones for my functions in helpers.rs, including find_target(), check_file(), find_split_index(), and get_filenames(). I wrote 15 unit tests for the first three, and I might write some for get_filenames after I write some for change_leading_zeros(). While writing the unit tests, I stumbled upon the edge case for find_target if there are no applicable files, which is why I added the is_numeric above. The next step is writing the aforementioned unit tests for change_leading_zeros()."}, {"post_id": 41550, "ts": "2026-08-05T20:43:11Z", "hours": 1.3689, "text": "Crack a Brewski with the Boys Much Abrew about Nothing, pt. 2 Got the homebrew tap working! Not much to say, except that it is a tad annoying to have to have a separate repo just for the tap. Compleated Because of the Homebrew tap, I decided to swap the non-nushell completions to a hidden flag, so you can run them with –generate-completions zsh/bash/fish/elvish/powershell to create the completions file, which the tap can do at install time for zsh, bash, and fish. Unfortunately, it can’t do it for elvish, powershell, or nushell, so you have to manually install completions for those three. Man(chester United) Because I now have a homebrew tap, installing man files is much easier. I brought back my old clap_mangen code for build.rs, and added a line to the formula, so now man generation works!"}, {"post_id": 41176, "ts": "2026-08-05T06:57:49Z", "hours": 0.9675, "text": "Much Abrew About Nothing Since the failure that was clap_mangen, I have been considering a homebrew release, because then I can more easily have the man files and completions be installed, and I would do homebrew specifically since it is the main package manager I use, and it kind of works on everything. I was using Claude Code to teach me how to create the tap, but I unfortunately ran through my limit and $100 of usage credits I got for free when Fable 5 dropped off my plan on a separate data entry task running with Claude Chrome, so I need to do some testing of the tap. See y’all next devlog!"}, {"post_id": 40506, "ts": "2026-08-04T02:47:49Z", "hours": 1.2161, "text": "Completionism A few days ago, I looked up clap on crates.io , and realised there were many crates built to add functionality to CLAP, like clap_mangen, clap-version-flag, and more. The two this devlog is about are clap_complete and clap_complete_nushell. These two allow for the generation of shell completions; clap_complete supports Bash, Zsh, Fish, Elvish, and PowerShell; clap_complete_nushell adds nushell support. The standard package has a new (in-development) feature that allows for the binary itself to be the completion script, allowing for more minimal user setup if downloading from crates.io†. The nushell version does not have this feature, so you have to run it with a special flag and save the output to a completions file in ~/.config/nushell/completions/leading-zero-util.nu. † crates.io doesn’t have an install step so it doesn’t look in the OUT_DIR at build time, so it doesn’t pick up files like the completion files. This same issue is why I chose not to use clap_mangen, since I only currently distribute through crates.io. If I later make a Homebrew tap, I’ll probably change the way the completions are done and re-add clap_mangen."}, {"post_id": 40305, "ts": "2026-08-03T18:53:22Z", "hours": 1.7167, "text": "Breaking it up Divide and Conquer When I was setting up my build.rs to use clap_mangen, I had to separate my CLI arg parser construct from the rest of my code and put it in a new file. I also realised that some of my code in my (basically) main function (change_leading_zeros()) was repetitive and could be extracted into functions. My change_leading_zeros() was extremely long and deserved its own file. Even after moving a ton of code into helpers.rs, it’s still 78 lines long, thoroughly violating Uncle Bob’s standards. (Granted, his standards are bad, and Uncle Bob could go trip on a log for all I care) I have never worked in a multi-file project before, not even for my Pong game, which is just 747 lines of code all in one file, and it could have easily been broken up into more files. I have a really fast scrolling speed on my laptop, to the point of it being almost unusable, so scrolling all the code in that project was annoying. Because I have never made a multi-file Rust project before, I had no idea what I was doing. I ran into a ton of errors, including my LSP stopping working, so I didn’t have autocomplete or clippy linting for one of my files for a bit, so I got even more confused. Now, fortunately, everything works now, and I even found some issues in my code (an if condition with an OR in which the first part of the OR was redundant; a for loop that instead could have been an iterator chain; a variable that stayed mutable after mutability was unnecessary), so it was an overall great success! Illiteracymaxxing Previously, I mentioned that the LZU operates off of a target length for file names, so having a schema like file01.txt project02.rs problem03.py wouldn’t work, but I was dead wrong. I haven’t worked on the project in a month and a half, and when reading over my code to see what it does, I mistook target as the target filename length, not the target length of the numeric portion. I thus removed the warnings associated with what I believed to be a behaviour of the LZU from the short help, long help, and README. The lesson is maybe to double-check with a friend or smth when you get confused by your own code."}, {"post_id": 39787, "ts": "2026-08-02T23:58:27Z", "hours": 1.5247, "text": "Google: “How to use leading-zero-util?” A couple things have happened since the last devlog, so let’s go through them! Flatten Until today, and we will get to why, all the code was in src/main.rs, which made it harder to deal with and harder to work with. I moved the Cli struct (the clap parser struct) to a new file, src/cli.rs, so it’s a little more readable now. Man Down! As I mentioned in my last devlog, I was going to use the clap_mangen crate to generate a man file for the leading-zero-util. I set it up and created a build.rs, but realised that crates.io wouldn’t do anything with the man files, so you can’t run man leading-zero-util. This was v0.4.0 (We are now on v0.5.0). The benefit of a man file is minuscule, and I can always add it back to my build.rs. It wasn’t worth the extra dependencies, so I dropped it. Reading the version message explains the version message. I was previously considering the clap-version-flag crate for a better version message, but realised it would add basically nothing, and it isn’t well maintained. I decided instead to use shadow-rs for a better long version. I had deleted my build.rs, so I made a new one and added shadow-rs to the code."}, {"post_id": 39347, "ts": "2026-08-02T08:21:29Z", "hours": 1.7653, "text": "Leading with Zeros, ending with .txt Hello everyone! Dusting off my leading zero utility after finishing up Pong, and there were some issues! The F in BSMRCDF I realised that my utility didn’t work for filenames with extensions (no problem-01.rs or mediocre-01.py), so that needed to be fixed. Look for the helpers The CLI uses a target length for non-basic additions, so it only works on filenames with nonnumeric sections of the same length (target-01.rs, project-11.rs), but not problem-11 & target-01. Consequently, the help sections need to warn about this. I also added some more examples at the bottom of the long help. Man the stall This isn’t as much of an issue as something I just found out about. There is a crate, clap_mangen , THAT LETS YOU GENERATE MAN DOCS, which I feel I feel way more excitement than it warrants. This is the next step for this project. See y’all next devlog!"}, {"post_id": 6262, "ts": "2026-06-10T14:57:57Z", "hours": 5.8289, "text": "Leading Zero Util 0.2.0 is complete!"}]...
|
Title: Leading Zeros Utility by @infinite_silly | Title: Leading Zeros Utility by @infinite_silly | Stardance
Devlogs:
Leading Zero Util 0.2.0 is complete!
Leading with Zeros, ending with .txt Hello everyone! Dusting off my leading zero utility after finishing up Pong, and there were some issues! The F in BSMRCDF I realised that my utility didn’t work for filenames with extensions (no problem-01.rs or mediocre-01.py), so that needed to be fixed. Look for the helpers The CLI uses a target length for non-basic additions, so it only works on filenames with nonnumeric sections of the same length (target-01.rs, project-11.rs), but not problem-11 & target-01. Consequently, the help sections need to warn about this. I also added some more examples at the bottom of the long help. Man the stall This isn’t as much of an issue as something I just found out about. There is a crate, clap_mangen , THAT LETS YOU GENERATE MAN DOCS, which I feel I feel way more excitement than it warrants. This is the next step for this project. See y’all next devlog!
Google: “How to use leading-zero-util?” A couple things have happened since the last devlog, so let’s go through them! Flatten Until today, and we will get to why, all the code was in src/main.rs, which made it harder to deal with and harder to work with. I moved the Cli struct (the clap parser struct) to a new file, src/cli.rs, so it’s a little more readable now. Man Down! As I mentioned in my last devlog, I was going to use the clap_mangen crate to generate a man file for the leading-zero-util. I set it up and created a build.rs, but realised that crates.io wouldn’t do anything with the man files, so you can’t run man leading-zero-util. This was v0.4.0 (We are now on v0.5.0). The benefit of a man file is minuscule, and I can always add it back to my build.rs. It wasn’t worth the extra dependencies, so I dropped it. Reading the version message explains the version message. I was previously considering the clap-version-flag crate for a better version message, but realised it would add basically nothing, and it isn’t well maintained. I decided instead to use shadow-rs for a better long version. I had deleted my build.rs, so I made a new one and added shadow-rs to the code.
Breaking it up Divide and Conquer When I was setting up my build.rs to use clap_mangen, I had to separate my CLI arg parser construct from the rest of my code and put it in a new file. I also realised that some of my code in my (basically) main function (change_leading_zeros()) was repetitive and could be extracted into functions. My change_leading_zeros() was extremely long and deserved its own file. Even after moving a ton of code into helpers.rs, it’s still 78 lines long, thoroughly violating Uncle Bob’s standards. (Granted, his standards are bad, and Uncle Bob could go trip on a log for all I care) I have never worked in a multi-file project before, not even for my Pong game, which is just 747 lines of code all in one file, and it could have easily been broken up into more files. I have a really fast scrolling speed on my laptop, to the point of it being almost unusable, so scrolling all the code in that project was annoying. Because I have never made a multi-file Rust project before, I had no idea what I was doing. I ran into a ton of errors, including my LSP stopping working, so I didn’t have autocomplete or clippy linting for one of my files for a bit, so I got even more confused. Now, fortunately, everything works now, and I even found some issues in my code (an if condition with an OR in which the first part of the OR was redundant; a for loop that instead could have been an iterator chain; a variable that stayed mutable after mutability was unnecessary), so it was an overall great success! Illiteracymaxxing Previously, I mentioned that the LZU operates off of a target length for file names, so having a schema like file01.txt project02.rs problem03.py wouldn’t work, but I was dead wrong. I haven’t worked on the project in a month and a half, and when reading over my code to see what it does, I mistook target as the target filename length, not the target length of the numeric portion. I thus removed the warnings associated with what I believed to be a behaviour of the LZU from the short help, long help, and README. The lesson is maybe to double-check with a friend or smth when you get confused by your own code.
Completionism A few days ago, I looked up clap on crates.io , and realised there were many crates built to add functionality to CLAP, like clap_mangen, clap-version-flag, and more. The two this devlog is about are clap_complete and clap_complete_nushell. These two allow for the generation of shell completions; clap_complete supports Bash, Zsh, Fish, Elvish, and PowerShell; clap_complete_nushell adds nushell support. The standard package has a new (in-development) feature that allows for the binary itself to be the completion script, allowing for more minimal user setup if downloading from crates.io†. The nushell version does not have this feature, so you have to run it with a special flag and save the output to a completions file in ~/.config/nushell/completions/leading-zero-util.nu. † crates.io doesn’t have an install step so it doesn’t look in the OUT_DIR at build time, so it doesn’t pick up files like the completion files. This same issue is why I chose not to use clap_mangen, since I only currently distribute through crates.io. If I later make a Homebrew tap, I’ll probably change the way the completions are done and re-add clap_mangen.
Much Abrew About Nothing Since the failure that was clap_mangen, I have been considering a homebrew release, because then I can more easily have the man files and completions be installed, and I would do homebrew specifically since it is the main package manager I use, and it kind of works on everything. I was using Claude Code to teach me how to create the tap, but I unfortunately ran through my limit and $100 of usage credits I got for free when Fable 5 dropped off my plan on a separate data entry task running with Claude Chrome, so I need to do some testing of the tap. See y’all next devlog!
Crack a Brewski with the Boys Much Abrew about Nothing, pt. 2 Got the homebrew tap working! Not much to say, except that it is a tad annoying to have to have a separate repo just for the tap. Compleated Because of the Homebrew tap, I decided to swap the non-nushell completions to a hidden flag, so you can run them with –generate-completions zsh/bash/fish/elvish/powershell to create the completions file, which the tap can do at install time for zsh, bash, and fish. Unfortunately, it can’t do it for elvish, powershell, or nushell, so you have to manually install completions for those three. Man(chester United) Because I now have a homebrew tap, installing man files is much easier. I brought back my old clap_mangen code for build.rs, and added a line to the formula, so now man generation works!
Testing, Testing, 1 2 3 Here’s what I’ve been working on to try to get a good, stable release. I Need an Extension I discovered that when doing the normalising add, the one that’s like problem-1.txt, problem-11.rs (-n 1) -> problem-01.txt, problem-11.rs (keeps the same total length of the numeric portion), it actually counts the extension characters, so the result would actually be problem-01.txt, problem-011.rs because the extensions are different lengths. Previously, the find_target() function was like this: pub fn find_target ( filenames : & Vec < String > , count : usize ) -> usize { let mut minimum = usize :: MAX ; for file in filenames { let ( dot_index , cond ) = check_file ( file ); if cond { continue ; } let split_index = find_split_index ( file , dot_index ); minimum = minimum .min ( file [ split_index .. ] .len ()); } minimum + count } Now, it’s pub fn find_target ( filenames : & Vec < String > , count : usize ) -> usize { let mut minimum = usize :: MAX ; let mut is_numeric : bool = false ; for file in filenames { let ( dot_index , cond ) = check_file ( file ); if cond { continue ; } let split_index = find_split_index ( file , dot_index ); minimum = minimum .min ( file [ split_index .. dot_index ] .len ()); is_numeric = true ; } if is_numeric { minimum + count } else { 0 } } Now the target isn’t the shortest number of characters in the numeric portion plus the extension, it’s just the extension. The is_numeric variable is just there so that it doesn’t try to add count to usize::MAX, getting an overflow if there are no files with numeric suffixes. sleep(); sleep(); sleep(); allTestsPass(); The last step before 1.0.0 is UNIT TESTS!!!!!! The easiest unit tests to write are ones for my functions in helpers.rs, including find_target(), check_file(), find_split_index(), and get_filenames(). I wrote 15 unit tests for the first three, and I might write some for get_filenames after I write some for change_leading_zeros(). While writing the unit tests, I stumbled upon the edge case for find_target if there are no applicable files, which is why I added the is_numeric above. The next step is writing the aforementioned unit tests for change_leading_zeros().
Testing Tests Hello again! I can’t believe we’re on devlog #8, considering I have been doing pretty sparse devlogs! if true { allTestsPass } IT’S UNIT TEST TIIIIIME!!! I added 13 unit tests to my big change_leading_zeros() function. They cover most, if not all, possible edge cases. Rename file11 -> file11 I discovered that in change_leading_zeros(), if the resulting new filename was the same as the old, would still do the rename, and it would count as a renamed file, so that the actual number of renamed files would be too large. Hating on for loops as much as the functional bros. I realised that my get_filenames() fn, which still has no unit tests, could be swapped to an iterator structure. old: pub fn get_filenames ( path : & Path ) -> Vec < String > { let mut names = Vec :: new (); if let Ok ( read_dir ) = fs :: read_dir ( path ) { for file in read_dir .flatten () { names .push ( file .file_name () .into_string () .unwrap_or ( "unknown name" .into ()), ); } } names } pub fn get_filenames ( path : & Path ) -> Vec < String > { fs :: read_dir ( path ) .into_iter () .flatten () .flatten () .map (| f | f .file_name () .into_string () .unwrap_or ( "unknown name" .into ())) .collect () } The two functions behave in exactly the same way, no unnecesary unwrap()s that may cause panics See y’all next devlog!
I’m Smart but I’m Bad at Taking Tests Hello again! You know what they say, new commit, new devlog! “[Test] Torsion” We got MORE UNIT TESTS!!! The get_filenames() fn was formerly the only function in helpers.rs that had no unit tests, so I added 6 unit tests for it. They have about the same general structure as the unit tests for change_leading_zeros(). Beautification I was trying to make my code prettier, and I accidentally screwed up an ownership issue. My unit tests made use of tempdirs with the tempfile crate to test change_leading_zeros() and get_filenames. This is the original pattern for getting the temp dir’s path: let binding = tempdir () .unwrap (); let dir = binding .path (); // stuff can be done with dir now This is what I changed it to: let dir = tempdir () .unwrap () .path () .to_owned (); When the tempdir gets dropped, it also deletes the directory, which makes dir a path to a dir that doesn’t exist. Everything compiles fine, but the code panics because the tempdir doesn’t exist. Override Something I forgot to mention in my last devlog is that if there was the files file1.txt and file01.txt, it (c/w)ould rename over one of the files and silently delete the file written over. I still have to fix this issue. I’ve wanted to learn Zig, so I looked up Zig crash courses on Youtube, and this is from the one I was watching.
Refactor I’m going to keep this one quick because it just got deleted for being too long. The previously mentioned behaviour of overwriting filenames has been fixed and has it’s own unit test now. It was given an exception before the actual rename. All the rename logic was duplicated between dec and !dec, so I flattened that. I pulled out the pre-rename exception logic into a new helper: skip_rename(). It needs unit tests of its own. Byyyeeeeee!!!
Drop it Like it’s Hot THIS IS THE FINAL DEVLOG!!!! We got a working release! After my last devlog, I added some unit tests for skip_rename(), and I added the Github default Rust workflow with some modifications to the repo to automatically test any new commits against the test suit, which is most of my codebase. Also added a test workflow to the homebrew tap so it’s easier to see that all is working.
Ships:
I made a utility to change the number of leading zeros in filenames! I was working on Project Euler and had to add a leading zero to all my filenames, which was tedious, so I made this!
Hello everyone! I was working on some Project Euler problems, and I realised that my solutions weren’t sorting correctly because they didn’t have any leading zeros in the numeric portion of their filenames. The same issue happened for my Advent of Code solutions once I hit day 10. I realised I could automate this, and the leading-zero-util was born. It slowly grew from a little, mediocre script to a decently-ish written CLI tool with proper unit tests, a Homebrew tap, a man page, and completions. If you want a better look at the development process than just the devlogs, please check out my commits on GitHub. If you are going to install the LZU, I also recommend that you use the Homebrew tap rather than the crates.io release, the instructions for which are in the README....
|
1792846375.6284168
|
1792932775.6284168
|
|
6590
|
Flower by @IvyMycelia | Stardance
|
IvyMycelia
|
2
|
104.2
|
1193
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-07T02:27:02Z", "hours": 27.0, "multiplier": 19.07, "payout": 503, "blessing": "neutral", "text": "The compiler is written in Flower itself and currently targets C, so this release was mostly geared towards making the type system have actual Flower semantics instead of a thin little blanket over whatever the backend happened to be doing. The big additions in v1.4 were: transparent type aliases real null nullable types as ?T == T | null semantic unions like int | string explicit narrowing with is explicit extraction with as That support now works across locals, parameters, return types, struct fields, and stable field-expression chains. The work had to touch parser logic, typecheck, narrowing, lowering, codegen, bootstrap, and then all the weird regressions those changes politely dragged into the room. It was.. a process for sure What I’m most proud of is that v1.4 pushed Flower toward a clearer identity that wasn’t defined by C as much anymore. This release also brought the docs back in line with the compiler, which was LONGGGGG overdue. If you want to test it, the main things to look at are the Better Types examples and the self-hosting flow. The compiler should bootstrap cleanly, the test suite should pass, and the examples now cover aliases, nullable values, semantic unions, inference, and struct/field narrowing behavior. For those who will be testing it, DO NOTE that I develop exclusively on my MacBook which is a UNIX system! I do not have the ability to properly develop and provide releases for Linux-specificalities or non-POSIX systems. I’m extremely sorry for this, but alternatively watch the provided video to see Flower in action :) If you’re not able to test it, watch this short (crappy) video instead: https://youtube.com/shorts/DyPtIru6cjY?feature=share", "repo": "https://github.com/IvyMycelia/flower", "demo": "https://github.com/IvyMycelia/flower/releases"}, {"ship_num": 2, "ts": "2026-06-18T16:00:30Z", "hours": 38.0, "multiplier": 18.19, "payout": 690, "blessing": "neutral", "text": "Flower is a self-hosted programming language for writing simple, explicit systems code without the abstraction bloat and OOP-heavy direction a lot of modern languages have. The compiler is written in Flower itself, currently targets C, and follows a straightforward pipeline: lexing, parsing, module loading, typechecking, and code generation. Over the past few months, Flower grew from a small lexer/parser/codegen experiment in C into a way bigger language project than I couldv’e imagined. This wasn’t my first attempt at a language, but it has been my favorite! I implemented compiler-enforced module semantics, stronger type-aware codegen, real boolean support, real string support, and a small standard library foundation. Strings now have equality, .length, indexing, and explicit casts to and from @char , while modules support exported prop declarations, aliases as namespaces, and private-by-default top-level declarations. The hardest part was bootstrap stability. I ran into idempotency failures, parser edge cases, compiler corruption scares, and plenty of my own bad logic. A lot of the challenge was getting new features to work not just once, but consistently enough for the compiler to rebuild itself cleanly. One bootstrap it succeeds, and then the next I’m scrambling to figure out why the new binary executable has a corrupted parser despite just working (Still haven’t fixed that yet! It.. was really confusing and I’ve got no clue why it happened lol). I’m proud that I kept pushing through that and ended up with something much more fun to use than where I started — I mean, I don’t even have to write that much C anymore!! If people want to test Flower, the important thing to know is that it is self-hosted and still experimental, but it does work. The repo includes a bootstrap path, a test suite, and example programs covering types, control flow, memory, imports, strings, and bools. The current release is focused on making the core language feel real and usable before moving on to a larger standard library and a future non-C backend, so don’t be surprised if a C file is shoved in your face!", "repo": "https://github.com/IvyMycelia/flower", "demo": "https://github.com/IvyMycelia/flower/releases"}]...
|
[{"post_id": 79537, "ts": "202 [{"post_id": 79537, "ts": "2026-10-14T14:44:10Z", "hours": 10.3042, "text": "Integers, Integers, Integers Hello!! Been a while :) Lately I have been working on v1.6. I call it the “Usefullness” update — rhymes with Grug — because it adds a ton of long awaited features and various convenience implementations Flower DESPERATELY needs. For example, currently the progress has to do with v1.6.1, or Fixed-Width Integers . When it comes to systems programming and in-general efficiency, having various integer sizes is important as it provides an additional layer of manual control over memory and sizes. I know I would have to add them eventualy, so why not put them at the start of the Usefulness update?? I’m sure they’ll come in handy later on. What Actually Changed? Well, for starters, there’s now fixed-width integers (yay)! They’re built in types, so you declare them as you would with any other atom / primitive: type Byte = u8 type Choice = Byte | u16 type OptionalByte = ?Byte struct Packet { pair: Byte[2], size: Choice, owner: OptionalByte } A whole bunch of commits and integer-specific changes regarding indices, arity, unions, nullables, etc etc etc have been made, and they all won’t fit here so instead, take a look at the current branch ! What’s In Store? Plenty more features, you can assure yourself! There’s maybe 6 or 7 — I swear — or so commits left for this specific addition, and after that a lot more features laid out in the roadmap for 1.6! As always, thanks for sticking around and watching the fiasco that is this project become more and more estranged with every hour. Love y’all!! Ivy <3"}, {"post_id": 75225, "ts": "2026-09-29T15:04:00Z", "hours": 9.9331, "text": "Integer Types, Parser Fixes, and Segfaults! Phew — this one was biiiiiggg. Flower is pretty much just a glorified C transpiler, which is NOT what I want for it! In order to move on, the data has to be handled explicitly by the FloC. So essentially, I implemented i8 , u8 , i16 , u16 , i32 , u32 , i64 , and u64 . For now, int canonically refers to an i32 value. A New Era? With these new literals, the old hoist-sized representation had to go. The decimal source text is preserved, meaning values such as 18446744073709551615 remain after parsing without causing any overflow. Types are picked up from declarations, assignments, function arguments, return values, field writes, array-element writes, * breath in * and binary expressions! Oof, that was a mouthful. That, of course, resulted in proper errors for things like: 256 assigned to u8 −1 assigned to an unsigned type values beyond u64 unconstrained literals outside the default i32 range I Hate Memory During printing, every width is handled. Integer conditions retain existing zero / nonzero behavior, and literal types print their values rather than a character. Halfway through, I ran into sudden segfaults and memory leaks. I was taken aback, because I didn’t even change anything parser related yet. Turns out, I forgot an assignment in a declaration, which apparently the parser wasn’t able to handle (whoops!). Anyways, I fixed it by propagating errors through the compilation process, so the compiler doesn’t try to typecheck or code gen if the parser reports back errors, and instead will print them out. And that’s it! Not that’s it, but that’s all I’m going to explain for now. More specifics available on the GitHub, of course. Speaking of GitHub thank you so much to S1monr3dst0ne07 on GitHub for fixing some memory leaks in the previous version of Flower — I forgot to prune allocations before returning from a function :p Love y’all!! <3 P.S.: So glad I gave up on documentation, I was genuinely dreading workong on the project and that’s why I’ve been ianctive for a long time :c"}, {"post_id": 53525, "ts": "2026-08-24T03:18:35Z", "hours": 9.7706, "text": "Hey, it’s been a while! I’ve been finding it difficult to stay motivated for this project, especially with how the new payout system works and just my in-general inability to keep commitment despite having a lot of passion. That said, I am going back to working on this diligently, and I think to start I’m going to cut down on the documentation by making perhaps one or two changes, and then going right back to the compiler work. Documentation writing has not been the most fun for me, especially with how long it takes and how it’s so difficult to not only write language reference that works, but also keeping the same whimsy Flower should have. Thank you to everyone who’s been following this journey, and I can’t wait to see y’all later!!! With Love, - Ivy <3"}, {"post_id": 26743, "ts": "2026-07-11T18:25:46Z", "hours": 9.1964, "text": "Devlog: v1.5.1 – v1.5.5 Following all of the changes Flower has undergone, I felt it was time for some much-needed documentation. On paper this was supposed to be fairly quick, simple, and not require much brain power. Unfortunately for me I got a bit too over-zealous, and included things I thought should work, but in reality hadn’t. For example, in a lot of the code snippets I’d have something like: for i in range 0..10: print(i) end Printing non-string values was not yet supported in Flower. To fix this, I took a small detour back to v1.4 and implemented support for it — mostly in a single codegen case: if ast.data._print.value_type.base == TOKEN_FLOAT or ast.data._print.value_type.base == TOKEN_DOUBLE: fprintf(out, \"printf(\\\"%%f\\\", \") gen_expr(ast.data._print.value, out, src) fprintf(out, \");\\n\") end Afterwards I added more smoke-tests in examples/io/print.flo . Every few runs, however, I’d get a segfault. This was especially odd because it wasn’t simply an error but rather a silent memory bug. Eventually I found out where it was originating — thanks, ASan! Turns out after the new type system changes, I had forgotten to initialize some values to null / 0 in for loop handlers and a few other places. I just added typeInfo.data = null / 0 where applicable and it fixed the issue! What is v1.5, and why is this devlog so long? To answer the latter first.. I lowkey just forgot to post a devlog for the first two docs I made. That’s it. For the former question, v1.5 is supposed to be explicitly a documentation pass. First thing I worked on was structure. I cleaned up the docs layout, moved things toward a more consistent lowercase docs/ tree — I had been trying for so long to do that and I just finally got it to work — and wrote down the documentation process itself so new pages aren’t just floating about. The point was to try and make the docs feel like a book instead of a folder full of unrelated notes. I wrote and checked the language pages for types, functions, and control flow by reading the compiler itself, not by trusting my (poor) memory. That meant checking parser rules, typecheck behavior, codegen boundaries, and example files before writing anything solid. Types especially needed this, given how Flower now has enough real type machinery that the docs can quickly go from being coherent to completely incorrect: nullable sugar, semantic unions, explicit casts after narrowing, alias behavior, current member limits, and the difference between what the language wants to become and what the compiler supports currently. Functions and control flow had a similar issue. I had to document prop , return rules, direct call forms, logical conditions, range-based for , and the rough edges like break and continue not yet being enforced cleanly as loop-only. That kind of thing is small until someone learns the language from the docs and hits the edge head-first (been there, done that). What Now? I’m just going to keep writing docs. Maybe do one devlog for every new doc, or a batch of docs, who knows! I certainly don’t :p"}, {"post_id": 23761, "ts": "2026-07-06T21:49:25Z", "hours": 0.6008, "text": "Devlog: Syncing Flower’s Docs Back to Reality Just a doc cleanup lol. No code change or compiler updates. Probably did more than needed for now but oh well! The mismatch was REALLY bad. The old docs preserve old assumptions, and someone reading them could walk away with a version of Flower that no longer really exists (or, in some cases, doesn’t exist yet or never ever existed)! What changed I updated the docs that had drifted the most from reality (relatable): README.md now reflects the current type-system shape ROADMAP.md treats v1.4 as accomplished the v1.4.0 milestone doc now includes more of the outcome, not just the original plan contributor docs no longer have stale semantics structure.md is more accurate to what Flower currently is, and what still needs a fuller rewrite later Yea, that’s it."}, {"post_id": 23618, "ts": "2026-07-06T18:01:45Z", "hours": 1.6556, "text": "Devlog: Finishing Nullable Field Narrowing At this point, Flower could already narrow semantic unions through field access in the is / as case, and nullable field checks were supposed to be the obvious follow-through: if maybe_box.value != null: label: string = maybe_box.value as string end Instead, I had forgotten to remove a LOT of stale code, and thus part of it was still behaving like only plain local variables could ever be narrowed. There was also a second, smaller mismatch hiding, where null in type position was not lining up with the compiler’s actual internal null representation. ?string and string | null weren’t leading to a congruent output and at times were wobblier than they should be. So the fix was mostly cleanup, but the meaningful kind: make null in type syntax lower the same way the compiler expects remove the stale var-only branches in nullable narrowing let stable field paths like maybe_box.value and holder.box.value narrow properly The funny part is that this felt bigger initially than it actually was once fixed. Nothing fundamentally new had to be invented, I just had to stop the old code from interfering with the newer code, which once I figured out how to do so it was quite quick. I spent an embarrassingly long time figuring it out…"}, {"post_id": 22284, "ts": "2026-07-04T17:48:44Z", "hours": 1.8161, "text": "Devlog: Letting Union Narrowing Follow Field Access Before v1.4.13 , union narrowing only really worked when the thing being narrowed had a variable name due to almost every similarity check relying on name_start and name_length . This was dumb, because semantic unions already knew how to test tags and extract members. Codegen was not the issue, but rather the annoying part was that the typechecker could remember this: if value is int: n: int = value as int end but not this: if box.value is int: n: int = box.value as int end So I still had to do a little temp-variable ritual: tmp: Value = box.value if tmp is int: n: int = tmp as int end Which was gross. Not necessarily catastrophic, just gross and annoying. I wanted needed convenience What changed The compiler was remembering narrowings by variable name, not by expression shape, so box.value looked obvious in source (to me, at least), but to the typechecker it was basically some random expression and not something it could reliably recognize again later. A variable name already had a stable identity, whereas field access chain did not. So the change was to let narrowable expressions represent more than just AST_VAR_REF . For now, that only means stable dot-access chains. The typechecker can record a narrowing for an expression like: box.value and then recognize the same expression later when a cast shows up. So this works directly now: if box.value is int: n: int = box.value as int end Same for the other union members, like string . The detour My first example accidentally wandered into a different feature: if maybe_box.value != null: That exposed a real nullable-field-guard gap, but that is not what this was supposed to be about. Very rude of the test case to have ambition hmph >:( Where this leaves it Semantic union narrowing now persists past field access — at least for stable dot-access chains — and the temp-local is no longer needed. Butttt now I gotta work on nullable-field-guards, ugh (hehe)"}, {"post_id": 21926, "ts": "2026-07-04T03:34:19Z", "hours": 0.4592, "text": "Devlog: Direct Semantic Union Parameters Now instead of having to do this workaround: type Value = int | string func accept(value: Value): bool You can just pass semantic unions directly: func accept(value: int | string): bool That was it. All I had to do was remove a stale type_error clause in register_params and allow binding variables. Then I updated the two relevant accept functions in /examples."}, {"post_id": 21751, "ts": "2026-07-03T20:51:30Z", "hours": 4.9086, "text": "Devlog: Making ?T Actually Mean T | null Before v1.4.10 , ?T was treated as its own nullable system and not really integrated with the rest of the semantic unions. This was unideal, because it created a separation of logic which was cumbersome to maintain. The idea was to make the following be the default: ?int == int | null ?string == string | null ?@int == @int | null Prior to the refactor, nullable types were still mostly pointer-oriented. That worked when ?T basically meant “maybe this pointer is null,” but it did not really fit anymore once semantic unions became actual runtime values. If Flower has T | null , then ?T should use that instead of being its own special thing. This is a more pragmatic choice, as it keeps the compiler easier to manage and update later on. What changed Typecheck now lowers ?T into the same semantic-union machinery used by normal unions. That means nullable values now go through the same general path as union values: null checks use union-aware narrowing narrowed nullable values can be extracted with as codegen emits tagged union storage assignments pack into the right union member So this now works as an actual nullable flow: maybe: ?@int = raw if maybe == null: return false end real: @int = maybe as @int The annoying part is that Flower has to track two things at once: the type the programmer is allowed to see after narrowing, and the actual union shape that remains underneath it. After the guard, maybe behaves like an @int . But codegen still has to remember it came from @int | null , because apparently the compiler cannot simply “vibe” its way through storage layout. Tragic! The bugs that annoyed the heck out of me Most of the work was not surface syntax. The syntax was just standing nearby looking innocent. The actual bugs were in the places where Flower knew “this is non-null now,” but then forgot how to lower, such as: narrowed nullable values falling back to raw C casts like (int*)(maybe) false branches of == null / != null narrowing to the wrong side (this was my fault lol) null getting packed into the wrong union member That last one was the rude one. For ?@int , generated C could end up doing something like: . tag = 1 , . m0 = NULL instead of packing into the actual null member. So the value looked almost right, but the tag/member pairing was wrong. Then later null checks would fail, because the compiler had technically put null somewhere. Just not the correct somewhere. Very helpful. The fix was separating two questions I had accidentally merged: is this type compatible with this union? which exact union member should this value occupy? Those look related, but they are not the same question. Flower was using the first answer for the second problem, and then acting surprised when everything became soup. Where this leaves Better Types ?T now lowers through the same path as T | null , which means null checks, narrowing, extraction, and storage all line up with the semantic union model. This should make later work cleaner, such as nullable inference, nicer union ergonomics, maybe pattern-like narrowing eventually. Not easy. I am not saying easy near a compiler. That is how they hear you. You do not want them to hear you .."}, {"post_id": 19626, "ts": "2026-07-01T00:18:08Z", "hours": 0.4472, "text": "Devlog: Teaching Flower to Understand Guard Clauses gave Flower branch-local inference. Last update, I added support for branch-local inference, so the compiler could understand things like: if maybe == null: return false else: real: @int = maybe end and: if value is int: return false else: s: string = value as string end That was an improvement, but it still meant narrowing stopped at the end of the branch. That meant stuff like returninging in some conditions still did not really work as naturally as it should: if maybe == null: return false end real: @int = maybe or: if value is string: return false end n: int = value as int In v1.4.9 I fixed that. What changed Now narrowing propagates past very obvious guard clauses. If one branch definitely returns and the other falls through, the compiler now carries the interpretation forward after the if . This means that the compiler can now understand: after if x == null: return ... , x is non-null after if x is string: return ... , a two-member semantic union can narrow to its remaining member I kept this intentionally conservative for now. The compiler is not doing full control-flow analysis yet. It is only recognizing the simplest and most explicit early-exit shape. How it works The main addition was a small semantic check for “does this branch definitely return?” Right now that means: direct return if where both branches definitely return Once the compiler knows one side exits and the other survives, it applies the branch’s narrowing to the following statements. Yea.. that’s it lol."}, {"post_id": 19014, "ts": "2026-06-30T05:39:45Z", "hours": 1.2028, "text": "Devlog: Adding Obvious Branch-Local Inference to Flower Before this, narrowing mostly worked in the obvious “true branch” cases: if maybe != null: real: @int = maybe end and: if value is string: s: string = value as string end But the else branch was still kind of standing there empty-headed, even when the meaning was extremely obvious. Like, if this happens: if maybe == null: return false else: real: @int = maybe end then inside the else , maybe is clearly not null. So now it doesn’t!! What changed Flower now does branch-local narrowing in else for small, explicit cases. That means these now work: if maybe == null: return false else: real: @int = maybe end and: if value is int: return false else: s: string = value as string end It is only applying inference when the condition says something directly and the opposite branch has one obvious meaning. Nullable narrowing For nullable pointer-like values, Flower now understands both sides of simple null checks: if x != null narrows x to non-null in the if body if x == null narrows x to non-null in the else body the opposite side can narrow to null when that is the only meaning left Semantic union narrowing The same idea applies to semantic unions, but a bit more ‘held back.’ Essentially, if Flower sees: if value is int: then the if branch narrows to int , like before. Now, if the union only has one other possible member, the else branch can narrow too. So for: int | string the else after if value is int can be treated as string . This is not full control-flow wizardry, since it doesn’t reason across deep boolean chains, early-returns, or giant branches yet. It is deliberately small and local, because I do not want Flower “helping” so much that I need a detective board to figure out what type something is."}, {"post_id": 18478, "ts": "2026-06-29T17:18:49Z", "hours": 0.8039, "text": "Devlog: Letting Semantic Unions Work In Functions After getting semantic unions working in local declarations, the next problem was fairly obvious (and in my roadmap hehe). This did not work before: func make_value(): int | string return 7 end func accept_value(value: int | string): bool return value is int end Which was annoying, because int | string was already a real union type at this point. Flower could use it in locals, it could pack assigned values, it could check variants. But if I returned 7 from a function declared as int | string , or passed 7 into a parameter expecting int | string , the compiler did not know how to carry that union-lowering information across the boundary. This has been one of the easier changes I’ve made in a long while. It compiled properly first try (if you ignore a tiny misspell I made which I fixed really quickly), and there were no prior hidden bugs that surfaced. This.. is too suspicious. What changed The compiler now carries semantic union info through: function parameters function returns imported alias calls If a function expects: int | string and I call: accept_value(7) typecheck records that 7 needs to be packed as the int member of that union. Same for returns: func make_value(): int | string return 7 end That matters because codegen cannot guess later due to the separation of responsibilities I’ve laid out. By the time Flower is emitting C, it needs to know which tag to set and which member to write. Lowering it properly Codegen already knew how to pack union values for declarations and assignments. The missing part was doing the same thing for call arguments and return statements. So now a value can be packed into a tagged union when it is: stored locally passed into a function returned from a function Alias calls got handled too, so things like: remote.accept(11) remote.make_string() do not become their own weird little cursed island. Why this mattered Without this, semantic unions only worked as long as I never organized my code. They worked in local tests, but not in helper functions, imported providers, or normal inputs and outputs. Now union values can actually move around the program instead of being trapped in the one scope where they were declared — and for me, forgotten! Very exciting, the union can leave the house. They grow up so fast ⁎⁍̴̛ ₃ ⁍̴̛⁎"}, {"post_id": 18151, "ts": "2026-06-29T05:17:03Z", "hours": 3.3186, "text": "Devlog: Semantic Unions Become Actual Values (Part I) In v1.4.6 , I made semantic unions actual runtime values instead of just parsed/typechecked shapes. Before this, Flower could understand: type Value = int | string as a type. It could point at it and say, “yes, that is a union,” but that was mostly theoretical. The goal was to make this work-work for realsies: type Value = int | string value: Value = 7 if value is int: n: int = value as int end value = \"Ivy\" if value is string: s: string = value as string end That meant Flower needed more than TypeInfo.is_union = true . It needed a full path from syntax, to type proof, to lowered storage, to runtime extraction. Otherwise unions would just be fancy typechecker thingy-ma-bobbies, which is not very useful when the backend still emits C. What changed Instead of treating a union as a vague “one of these types, probably,” Flower now lowers it into a tagged structure. Conceptually, this: type Value = int | string becomes something like: struct Value { int tag ; union { int as_int ; flower_string as_string ; } data ; }; Not the final sacred form forever, but that is the shape of it: a tag saying which variant is active, plus storage for the possible members. Since Flower emits C right now, the lowering is C-shaped. I am not fully sure how I want this to look in ASM yet, but I do know it would be way more technical, and uglier. This required a few things to play nicely with one another: if value is int creates a union proof the guarded branch stores narrowing information value as int is only allowed after proof assignments pack values into the right tagged member explicit casts extract the right member from storage Otherwise the compiler is just writing checks its own backend cannot cash. The part that makes it ACTUALLY semantic For pointer narrowing, if value is T mostly refines how the compiler treats an existing value. For semantic unions, the check also becomes a runtime tag test. So this: if value is int: means: check the active tag of value , then inside this branch, treat it as the int variant. Then this becomes valid: n: int = value as int because the branch already proved the active variant. Without that proof, value as int should not be casually allowed. Flower is supposed to be explicit, not psychic, and I am not confident enough yet to implement a proper intuitive implicit checker without summoning something cursed. Assignment and extraction This: value: Value = 7 now packs 7 into the int member and sets the tag to the int variant. Then this: value = \"Ivy\" does the same thing, but for the string member. So a semantic union is not just some bytes, but rather a tagged runtime object where Flower knows which member is active. Then explicit casts like: value as string can lower into extracting the string member, but only when the typechecker has accepted that the operation is safe in that control-flow path. Why this checkpoint matters Flower can now store variant values, prove which variant is active, and require explicit extraction instead of relying on random magic I threw together. The flower has grown another concerning little organ."}, {"post_id": 16395, "ts": "2026-06-26T17:55:41Z", "hours": 2.0825, "text": "Devlog: is Checks v1.4.5 added is checks, mostly so code like this can work: if maybe_ptr is @int: real_ptr: @int = maybe_ptr end The idea is (fairly) simple: if the condition proves maybe_ptr is an @int , the inside of the branch should be allowed to treat it like one. Flower did not know how to do that before. It knew what a variable was declared as, but it did not really learn anything from control flow yet. Now it can, at least for the pointer/nullable-ish cases I care about first. This touched the parser, AST, typechecker, narrowing logic, and codegen. So, naturally, the “small feature” went everywhere. I’d actually consider this one of the bigger refactors so far, mostly because it added a new TypeAtom structure. Before this, types were still a bit too attached to the places they appeared, and all fell under the TypeInfo . That worked for simpler declarations, but is checks needed type syntax to have something the compiler could pass around to use for comparisons, validations, and narrowing. The parser had to recognize the new expression shape. The AST had to store the left side and the tested type. The typechecker had to make sure the test was allowed and not totally garbage. Then the narrowing logic had to say, “inside this branch, this variable has the proven type of x and therefore we won’t flag you for being an idiot.” That last part was where the bug goblin lived. I’m calling them a goblin because they were sneaky (and I also think it’s quite a funny and cute name). For a while, Flower had applied narrowing from the if body instead of the if condition, which meant the compiler saw this: if maybe_ptr is @int: real_ptr: @int = maybe_ptr end and somehow still failed on the assignment inside the branch. Very helpful. Thank you, compiler. EVen though it’s obviously 100% my fault, I made the compiler, but oh well!! Once I changed the narrowing step to inspect the actual condition expression, it started behaving like it should. The typechecker could see maybe_ptr is @int , attach that narrowed type to the branch scope, and allow maybe_ptr to be used as @int inside the guarded block. For now this explicitness is how I want it. There may come a time in the near future where I decide some implicity is ok, but we’ll see ;) is checks are the first real step towards control-flow-aware typing in Flower. Not full union support yet, but definitely the beginning of that road soon to come. Right now it mostly helps with nullable and pointer-like cases. Later, the same idea can support richer unions, better narrowing, and more type-driven control flow without making the programmer manually restate everything the compiler should already know. Also, it bootstrapped cleanly twice — which.. is obviously the bare minimum, but still!!"}, {"post_id": 15458, "ts": "2026-06-25T04:05:50Z", "hours": 2.4619, "text": "v1.4.4 Devlog: Giving Flower Real Semantic Union Types I made it so that semantic unions are now in Flower’s parser and type system — but not yet its codegen. The goal was to support types like: value: int | string next: @Node | null type Result = int | string What’s new The parser now understands | inside type positions and builds semantic union type information instead of relying on those old plain aliases or backend-shaped hacks. On the typecheck side, unions are now carried through normal type copying and alias resolution. That means named aliases like: type MaybeName = string | null make sense after resolution, instead of collapsing into nonsense. The typechecker also now accepts union-compatible usage in the places that matter for a foundation: variable initialization assignment parameter passing return checking alias resolution So if a value matches one union member, it is accepted. This is sorta implicit behavior, but I think it gets a pass due to its somewhat explicit nature? What it does not do yet This version was intentionally strict about using unions as values. You cannot yet directly: index a semantic union access a field on a semantic union use arithmetic / comparison operators on one print one directly Instead, Flower now requires an explicit cast before using a union value that way. That may sound harsh, but it is the right restriction.. for now. There is not any narrowing yet, so pretending unions were fully usable would just make the language lie and spit out 2,000 errors. Where this leaves v1.4 Flower now has: transparent type aliases null as a real type-system concept pointer-first nullable types semantic union type representation The next step is the part that will make unions actually usable rather than merely legal: narrowing with is better explicit extraction with as eventually making ?T truly become T | null instead of remaining pointer-first for now No fun screenshot this time :p just frontend work for now… Ivy, signing off <3"}, {"post_id": 14511, "ts": "2026-06-23T17:31:39Z", "hours": 1.8206, "text": "Devlog: Adding Pointer-First Nullable Types to Flower I worked on giving Flower its first real nullable type surface without being overambitious and pretending the compiler is ready for full optional-everything semantics yet. The new syntax now works like this: ptr: ?@int = null text: ?@char = null That means there is now an explicit way to say “this pointer-like value may be absent,” instead of relying entirely on raw pointer habits from C (If you couldn’t tell by now, I despise C). What changed The main work was split across lexer, parser, and typecheck. I added: ? as a type marker in type positions is_nullable tracking in TypeInfo type rules for nullable pointer/reference values explicit compatibility for: assigning null into nullable pointer-like types comparing nullable values against null casting between @T and ?@T I also kept the scope intentionally narrow: this implementation is pointer-first nullable support , not full nullable scalars. So ?@int makes sense right now, but ?int is still deferred until I make a better semantic union / optional representation for plain values. Why this matters It would have been easy to overreach here and claim “nullable types are done,” but that would have been a big phat lie. Pointer-like nullability lowers naturally enough with the current backend and current compiler model. Scalar nullability, however, does not. Once you let int or bool become nullable, you need a more real representation for “has value / no value,” and that belongs in the later union work, not here. Result explicit absence compiler-owned semantics better future unions stronger type meaning without hidden magic The next real step after this is not more patching around null — I consider that done for now — but instead giving Flower the deeper machinery needed for nullable non-pointer values and semantic unions later in v1.4 so it doesn’t come back to bite me in my butt."}, {"post_id": 13935, "ts": "2026-06-22T21:20:58Z", "hours": 0.355, "text": "Devlog: Formalizing Flower’s Null Foundation Flower already had some of the pieces for null , but they were a bit scattered. The goal here was to make it explicit, consistent, and safe before moving on to nullable syntax like ?T or full union-based nullability later in v1.4 . Another shorter devlog, but still important and distinct enough for me to think “Hmm devlog time? Yes, devlog time!” What changed The main work was in typechecking. I added to the compiler’s idea of what null is, how it is represented internally, and what kinds of values are actually allowed to accept it. Rather than letting null-related behavior stay implicit across a few checks, null now follows a clearer rule set: null has one centralized internal type representation pointer-like values can explicitly accept null null comparisons and assignments now go through the same semantic path Why this matters This isn’t all that important on its own, but it matters a lot for where Flower is going next. If null is not defined well, then later features like: ?T better unions smarter narrowing more expressive type flow all become more error-prone (or so I assume given my track record) than I want need them to be. Validation I also expanded the example coverage so null : it now has dedicated behavior checks around assignment, passing values around, and comparison behavior."}, {"post_id": 13918, "ts": "2026-06-22T20:30:15Z", "hours": 1.0089, "text": "Devlog: Fixing Flower’s Compiler Process So It Stops Fighting the Host This wasn’t really about language design at all buttttt it is much more embarrassing , AND more important: Flower’s compiler process itself was too fragile. The immediate issue showed up on Linux, specifically NixOS (thanks shipwrights <3). The build flow was assuming too much: a previously existing bin/Flower could be reused safely bash would exist at the expected path clang would always be available the checked-in compiler binary would be runnable on whatever machine the repo landed on That worked well enough on my machine until it didn’t. On NixOS — and by extension probably any other machine without the prexisting binaries I had — it broke: make targets were inconsistent, the shell script failed on interpreter assumptions, and the compiler binary itself could be the wrong format for the host. What changed The fix was to separate “the compiler source exists” from “the current compiler binary is usable on this machine.” The build process now starts by compiling a fresh host-native bootstrap compiler from bin/Flower.c , instead of trusting whatever happens to already exist in bin/Flower . That means the flow is now: bin/Flower.c -> host-native bootstrap compiler -> new Flower compiler -> self-check instead of: maybe existing bin/Flower -> hopefully works -> maybe bootstrap Ok well that’s kinda a lie; it still relies on hopes and dreams to bootstrap sometimes. BUT it’s MUCH safer! And now everyone gets to experience crippling bootstrap anxiety, instead of being met with a failure before the actual compiler gets to.. well, do its thign! I also cleaned up the surrounding tooling: switched the bootstrap script to portable sh restored a clearer build / bootstrap / rebuild / test / clean structure made the compiler use CC and CFLAGS from the environment instead of hardcoding clang What this actually improves Flower is still not universally cross-platform yet. The compiler driver still has POSIX-shaped assumptions in places, and the emitted C can still depend on host APIs depending on what the program uses. I’m not yet at the point of wanting to make it completely universal, especially given how I’m only one person and with v2.0 coming up soon it’d — in my humblest of opinions — be a waste of time. I am honestly grateful for people reviewing my code and otherwise viewing it catching onto details I have overlooked. My goal is to not make a ‘just-barely working on my machine’ project; I enjoy sharing development with others, and it hurts knowing people can’t appreciate code, whether it be mine or others’, due to something as simple as hard-coded sh flags."}, {"post_id": 13822, "ts": "2026-06-22T17:23:16Z", "hours": 3.7814, "text": "Devlog: Making Flower’s Type Aliases Transparent This version was simple to develop on paper (and even in practice it wasn’t too bad, only around 4 or so hours!): type Count = int type Total = Count type Name = string and then have those aliases behave like the real type everywhere: n: Count = 12 total: Total = identity(n) name: Name = \"Ivy\" if name != \"Ivy\": return false end if name.length != 3: return false end That meant aliases could not just be parsed and stored, but rather had to be transparent to the compiler’s semantic checks. What changed I added type alias declarations to the AST, parser, and type environment, then added the ability to resolve aliases in typechecking before comparing types. That included: return type checks variable initializers function call arguments binary comparisons string-specific comparison logic struct field access The important rule here is that aliases are semantic, not codegen-facing. Count should behave as int , Name should behave as string , and chained aliases like Total -> Count -> int should collapse correctly. In the future, especially post v2.0 , this could change and custom types might become real — but for now, they’re just aliases. The bug that exploded bootstrap The first real failure was not in aliases themselves, but in function argument checking. Inside check_call_args(...) , the compiler was resolving the argument expression into expected_type instead of arg_type . That overwrote the parameter type, left the actual argument type uninitialized, and caused the second bootstrap stage to explode into over a thousand misleading errors. This was not a pre-existing issue, it was instead from human error (my error) during the initial implementation where I accidentally put the wrong variable. Once that was fixed, the remaining failures were much more helpful than the bright flash of red and “Typecheck failed with 1224 error(s)” message! Where this leaves v1.4 With the first step toward “better types” done, aliases are no longer just syntax. That gives v1.4 a solid base for whatever comes next in the type system without having to fake around raw names. During this whole dev session, I did discover that a whole lot more of the source code was left using legacy work-arounds: int instead of bool , name_start; name_length and @char instead of string . In all fairness, some of these aren’t exactly the easiest to refactor. However, I will probably hold off on refactoring the codebase until either right before v2.0 , or right after. Just know it’s on my radar ;)"}, {"post_id": 11351, "ts": "2026-06-18T15:46:42Z", "hours": 1.4231, "text": "Devlog: Cleaning Up v1.3 For Release After many hours of work, bool and `string finally became real, and it was time to cleanup the mess I left behind from the version’s development. Mainly the only thing worked on was some cleanup: roadmap now reflects actual v1.3 features and implementations updated README and contribution documents to match the current compiler pipeline cleaned up string examples so they have the full intended v1.3 style instead of some leftover testing usage pushed the compiler’s version to 1.3.0 updated help / usage text so it matches the new output-path and auto-run behavior Prior to this, if I had just merged and shipped, the release wouldv’e been messy: README, Contributing, example files, and guidance commands were all mixing older details which made it confusing — even for me — when trying to explore the language and what it has to offer. For a bootstrapped compiler especially, making sure everything is cleaned up and polished is something that should not be ignored. I’m definitely guilty of overlooking this, but I’ve outlayed a whole plan for v1.3 unlike past versions, and part of it was setting up a proper versioning system and polishing its release as it goes. This format will be adopted in future versions, since it’s just way cleaner and nicer to look at. Future work At this point, v1.3 is done and has implemented, at minimum, a concrete foundation for post-v2 bools and strings. Next will likely be more subtle improvements, and features that are currently reliant explicitly on C rather than Flower-hosted code. In order for v2.0 , Flower will have to be effectively independent from C if it wants to emit machine code. Currently I am planning on adding features such as Type Aliases and maybe a stdlib prior to that, but anything can change!! Thanks for being here for all of v1.3 <3"}, {"post_id": 11116, "ts": "2026-06-18T05:51:28Z", "hours": 1.7269, "text": "Devlog: Giving Flower an Internal cstr Foundation Even after Flower got a real string type, the compiler itself was still leaning directly on C-style string helpers for its own internal work. That meant a lot of Flower source was still semantically depending on libc behavior: !strncmp(...) strcmp(...) strlen(...) strcpy(...) strncpy(...) strdup(...) strrchr(...) That is not where I want the language to stay. What changed I added a new internal module: import \"src/stdlib/cstr.flo\" as cstr and gave it compiler-facing helpers like: prop func len(s: @char): int prop func eq(a: @char, b: @char): bool prop func eq_n(a: @char, b: @char, n: int): bool prop func copy(dst: @char, src: @char): @char prop func copy_n(dst: @char, src: @char, n: int): @char prop func dup(src: @char): @char prop func find_last(src: @char, ch: char): @char This helper module is essentially the precursor to a future strings.flo library that can be distributed. But for now, it uses a basic API layer purely meant for in-house usage. Then I migrated compiler internals over to that module across: src/parser.flo src/module.flo src/lexer.flo src/typecheck.flo src/codegen.flo src/globals.flo src/main.flo So instead of using C-string behavior directly everywhere, the compiler now goes through Flower-owned helpers first. The Compiler Strikes Back This was one of those changes that sounds mechanical until it absolutely is not. A big trap was that old code often relied on C comparison functions returning 0 on equality, so patterns looked like this: not strncmp(...) But cstr.eq_n(...) returns an actual bool , which means blindly rewriting those calls gives inverted logic. So this: if ps.alias_lengths[i] == tok.length and not cstr.eq_n(...): was completely wrong. It had to become: if ps.alias_lengths[i] == tok.length and cstr.eq_n(...): That bug showed up in alias parsing first, which made it especially cursed, because it caused normal namespace-style calls like cstr.eq(...) to stop parsing correctly and crash the bootstrap path in confusing ways. I spent way longer than I wish to admit on trying to figure out why it wasn’t playing nice. But, once I figured it out, it was a really quick fix (I literally just cmd + f ’d not cstr and replaced it with cstr lol). Are we done yet..? This does not mean Flower is free from the C backend yet. It does mean something important, though: compiler logic is starting to depend on Flower-defined helper semantics instead of scattered raw libc calls. That is a much better stage for the future backend story, because when C eventually stops being the primary lowering target, the compiler will already have more of its own vocabulary. In other words, this was less about “remove C” and more about “stop letting C define the language’s internal habits.” Nah just kidding, I really wanted that bloated “builtin_c_call” stuff gone. Unfortunately I only managed to skim it, but that’s closer than before! Result After fixing the migration mistakes and the alias/parser fallout, the compiler bootstrapped successfully again. Flower now has an internal cstr layer, and compiler string handling is a little more its own."}, {"post_id": 11068, "ts": "2026-06-18T03:16:30Z", "hours": 1.2611, "text": "Devlog: Fixing Flower’s Output Driver and Starting the String Stdlib This checkpoint was really two different kinds of progress that ended up helping each other a lot. The first part was not glamorous, but it was necessary: Flower’s compile driver was tripping over its own default output naming. This was a known issue that I had been putting off, but for some reason it really annoyed me this time so I decided enough and to fix it. If no explicit output path was provided, the compiler would generate output.c , then strip the .c and try to emit a binary named output . That worked fine right up until the repo itself already had an output/ directory. At that point, linking failed because the compiler was trying to create a file where a directory already existed. Worse — because it annoyed me more — the driver logic was also mixing up “the generated program exited non-zero” with “compilation failed.” That became especially annoying during bootstrap, because the generated compiler binary would run without CLI arguments, print its own usage error, and then cause bootstrap to report failure even though codegen and C compilation had both succeeded. So I finally got off my butt and cleaned that up. Driver Cleanup The default output path now goes to: output/out.c which naturally produces: output/out as the binary. That avoids the old output filename collision. I also separated compile success from auto-run behavior: explicit output path: compile only default output path: compile, then auto-run if appropriate That means bootstrap no longer “fails” just because the compiled compiler exits non-zero with missing arguments, and demo/test files can still run automatically when that is actually useful. This sounds like a small driver fix, but honestly it removed a lot of noise from string work — and more — immediately. String Stdlib Beginnings Once that output weirdness was under control, I could finish doing what I just started and actually wanted: making string behavior live in Flower instead of endlessly leaning on ad hoc C calls (Call back to last devlog, absolute ball knowledge!!). So I added the first real reusable helpers in src/stdlib/string.flo : is_empty(s) starts_with(s, prefix) ends_with(s, suffix) find_char(s, ch) These are intentionally simple. They mostly exist to prove that the current string support is now strong enough for normal library code to be written on top of it. Not incredibly useful, at least at the level the compiler needs, but at least I could translate some AP Comp Sci A into Flower hehe A string feature does not really feel “real” until I can build helpers with the language itself instead of only teaching the compiler more special cases. The day I remove the builtin C handlers is the day I’m at peace… Validation To exercise that new library surface, I changed string_pass.flo to now act as a small pass file for the experimental library. Its job is not to be impressive. Its job is to answer a more important question: can I import string helpers, call them from normal Flower code, and get expected results through the full compile pipeline? At this point, yes. Where this leaves things This checkpoint did not remove all C string dependencies from the compiler. In fact, it removed essentially none! That is still a separate step, one that may even be in v1.3.7 ;) But it did establish two important things: Flower’s output/driver behavior is now much less annoying. We can start growing a real string library in Flower itself. That is a good place to be, because the next string work can build outward from a stable driver and an actual library surface instead of piling more special behavior into the compiler."}, {"post_id": 11013, "ts": "2026-06-18T01:18:51Z", "hours": 1.0825, "text": "Devlog: Adding String Indexing to Flower This one was fairly quick, and was about making one very normal-looking thing actually work: name: string = \"Ivy\" as string first: char = name[0] That sounds small, but once string became a real Flower type, indexing could no longer piggyback on the old “arrays and pointers only” behavior. The compiler needed to understand that string[index] is its own case. What changed I taught the typechecker to treat string subscripts as char . That means: string[index] now resolves to char the index expression must be an integer string indexing is readonly for now So this is valid: first: char = name[0] but this is not: name[0] = 'X' I wanted reads first, writes later. That keeps the rules simple while the string representation is still compiler-owned. I’m not sure how writes would work with a C backend, due to how ‘strings’ are allocated. Perhaps a feature for post-v2.0? Lowering it to C Since Flower strings currently lower to a struct with .data and .length , codegen needed a special path for string subscripts. Normal arrays and pointers still lower like: arr [ index ] but strings now lower like: name . data [ index ] That keeps the generated C valid without changing how regular subscripts work elsewhere in the language. So something conceptually like: This checkpoint also forced one strict-but-correct rule that required me to update a WHOLE SINGLE LINE (hehe): arg[i] = tolower(arg[i] as char) to arg[i] = tolower(arg[i] as char) as char Because tolower(...) is effectively treated as returning int , assigning it back into a char subscript needs an explicit cast. I kept that strictness on purpose. I do not want Flower silently narrowing values just because C would let it. Validation I expanded the string example coverage to check: string indexing returns the expected chars string[index] works alongside string <-> @char casts bootstrap still succeeds repeated bootstrap succeeds tests still pass Which, after all the recent bootstrap chaos, was very nice to see. Where this leaves v1.3 Now we can: store strings compare strings print strings inspect length index into them as char This should make it much easier to replace the builtin C functions with a Flower library in the near-near future."}, {"post_id": 10953, "ts": "2026-06-17T23:26:21Z", "hours": 3.3353, "text": "Devlog: Finishing Flower’s String Interop Bridge The last round got string into Flower as a real type. This round was about making that foundation actually work lol. The big problem was that once string became real, plain string literals started living in an in-between state: Flower wanted them to mean “Flower string,” but the compiler’s own source still has plenty of places that really mean “raw C string,” like: RED: @char = \"\\033[0;31m\" if not strcmp(arg, \"help\") or not strcmp(arg, \"h\"): ... end Those cases worked before only because everything was basically pretending string literals were already @char . Once that stopped being true, bootstrap started throwing a fit (my spoiled child). What changed The main fix was to make string literal lowering contextual instead of all-or-nothing. If a literal is being used as a real Flower string , it stays a string . If a literal is being used in a C interop position, it gets lowered as a C string instead. That meant tightening a few compiler rules so this kind of thing works cleanly again: name: string = \"Ivy\" as string raw: @char = name as @char if strcmp(raw, \"Ivy\") == 0: print(name) end I also fixed top-level declarations so globals like: RED: @char = \"\\033[0;31m\" no longer generate nonsense like: char * RED = (( flower_string ){ ... }); which, unsurprisingly, C does not appreciate. The subtle compiler bug The nastiest issue wasn’t even the globals. It was that builtin C calls like strcmp , strncmp , printf , snprintf , and friends are not real Flower functions. That meant the typechecker could hit one of them inside a larger expression, fail early, and stop walking the rest of the tree. So something like: if not strcmp(arg, \"help\") or not strcmp(arg, \"h\"): could partially resolve one side, then leave the other side unprocessed. Very cool. Very stable. Definitely what I wanted. The fix was to add a temporary builtin C-call bridge so the compiler can recognize these calls well enough to keep type resolution and literal lowering consistent during bootstrap. I’m not happy with this fix by any means, but due to the limitations of emitting C, it was the only solution I found that made sense at the time. Tests and examples Once that stopped exploding, I finally wired string testing into the normal types suite instead of leaving it commented out and pretending I’d “get back to it later.” The string tests now cover: string <-> @char casts string equality / inequality .length empty strings printing strings literal use in current interop cases And the full test suite passed with string included as a first-class part of Types on its first try . Now that’s what I like to see :D What this means This does not mean Flower’s long-term answer is “hardcode libc into the compiler forever.” It means Flower now has a temporary interop bridge that keeps self-hosting stable while string is worked on. The actual language semantics stay in Flower; the backend-specific weirdness is just being tolerated for now so progress does not stall. In the near, I’ll probably replace all of the necessary C libs with minimal Flower-equivalents. Where this leaves v1.3 At this point, the string foundation feels much sturdier. Not “done forever,” not backend-agnostic, and definitely not free of cursed bootstrap energy — but it works. The next work is no longer rescue work. It is actual forward work: string operations, stdlib basics, and eventually replacing this temporary C bridge with something cleaner when Flower grows past the C backend."}, {"post_id": 9012, "ts": "2026-06-15T01:03:21Z", "hours": 2.7858, "text": "Devlog: Building Flower’s String Type Foundation The core goal was to make this work in a meaningful, compiler-owned way: name: string = \"Ivy\" as string raw: @char = name as @char other: string = raw as string if name == other: print(\"same\\n\") end print(name.length) That meant Flower needed more than a typedef in generated C. It needed actual type rules, actual lowering rules, and I needed enough hairs on my head to not be bald after the amount of scares that occurred. What changed The first step was giving string real compiler support without going too far too fast. I added support for: explicit casts between string and @char string equality / inequality string.length runtime helpers in generated C for: flower_string_from_cstr(...) flower_string_eq(...) flower_print_string(...) That gave Flower a usable string foundation while still keeping literals conservative for self-hosting. Right now, string literals are not fully “native string values everywhere” yet; the compiler still uses explicit casts like \"Ivy\" as string as the safe bridge. The reason for this “safe bridge” is because when I got too ambitious, the compiler would break since everywhere @char was used with a string literal it’d break due to no implicity being allowed. I had to comment out the following new changes and keep the legacy support so it’d compile: else if ast.kind == AST_STRING_LIT: // fprintf(out, \"flowe_string_from_cst(\") // fprintf(out, \"%.*s\", ast.data._string.str_length, src + ast.data._string.str_start) // fprintf(out, \")\") // LEGACY CODE HERE and else if expr.kind == AST_STRING_LIT: // set_plain_type(out, TOKEN_STRING) // LEGACY CODE HERE return 1 The part that broke The most annoying issue was not string equality or .length . It was print . Originally, non-string print(...) was basically lowered like this: printf ( expr ); That only works when expr is already a C format string. So something like: print(name.length) generated invalid C: printf ( name . length ); The fix was to make print(...) type-aware. Typecheck now records the operand type, and codegen lowers print differently for string , @char , char , floats/doubles, and integer-like values. That sounds small, but it matters a lot: once string became real, print could no longer get away with pretending every printable value was already a C string. An Unsolved Bootstrap Mystery Somehow Flower’s bootstrap process was breaking, and it will probably break again. Despite the bootstrap requiring it to compile itself, somehow afterwords the binary could become corrupted. l-2: ~/Documents/GitHub/FloC % make bootstrap === Building new version === Compiled ./bin/Flower_new.c → ./bin/Flower_new === Testing new compiler === Compiled ./bin/Flower_test.c → ./bin/Flower_test Verified bootstrap build complete l-2: ~/Documents/GitHub/FloC % make bootstrap === Building new version === Luckily, I always make sure to keep a backup Flower bin stored under /bin/Flower_backup so I used that to compile the new binary and then it worked. Where this leaves v1.3 What still remains is the bigger ergonomic question: how fully native string literals should behave, and how to migrate the compiler’s own source to that world without setting bootstrap on fire again. I’m not sure yet how I want to approach this question, or what the goals for it should even be, but I guess I’ll have to find out soon enough! That is the next fight. But at least now, it is a fight on solid ground."}, {"post_id": 8529, "ts": "2026-06-14T05:55:45Z", "hours": 3.8414, "text": "Devlog: Making Bool Real Without Breaking Bootstrap The original goal, asper usual, was straightforward: before moving on to string , Flower needed bool to actually mean something semantically. Up to this point, boolean-ish behavior mostly worked by accident. Comparisons, conditions, returns, and general expression checking were still loose enough that the compiler could get away with treating a lot of things as “close enough,” especially since the C backend ultimately lowers bool to int anyway. That was not going to hold once v1.3 started leaning on richer typing. So this was about drawing a clean line between Flower semantics and C lowering. The Goal In Flower: bool should be its own real type comparisons and logical operators should produce bool arithmetic should not quietly accept bool implicit conversion should stay narrow and predictable explicit casting should remain available through as In C: bool can still lower to int That distinction ended up being the easy part. What Changed The typechecker now treats bool as a proper language type instead of an int-shaped placeholder. Condition checks were tightened so if , while , and not use condition-compatible rules. Arithmetic paths now reject boolean operands, and return / initializer / argument checking now runs through more explicit conversion rules. I also kept implicit widening one-directional: int -> float -> double while leaving narrowing conversions as explicit casts. The actual implementation of booleans and their typing, enforcement, and semantics was a breeze. It’s what came after that got me. What Actually Broke As usual, bootstrap had opinions. The stricter type work exposed older weaknesses that were easy to miss before (This is my coping): function argument checks needed array-to-pointer decay alias and module call lookup paths were too narrow unresolved calls could prevent nested expressions from being fully type-resolved that, in turn, broke some dot-access lowering and caused bad . vs -> emission in generated C So part of this checkpoint turned into compiler stabilization work rather than just bool semantics due to my crappy ‘temporary’ logic, error handling — or lack thereof, and impeccable ability to miss very important details. I’m an amazing programmer, if you couldn’t tell :p Result Flower now has a much firmer semantic base for bool, and the compiler is back to bootstrapping cleanly with those rules in place. That matters because this was really the floor for the next part of v1.3: string . And.. maybe I’ll fix the bootstrap process so it doesn’t blow up in my face again. Oh yea, forgot to mention that. The bootstrapper bootstrapped itself into this very broken parser state that refused to go away so I had to stash my changes, checkout the prior merge (detached), and then recompile manually and fix the parser. Toodles!"}, {"post_id": 6924, "ts": "2026-06-11T16:28:33Z", "hours": 1.3047, "text": "Devlog: Fixing the Typechecker After Bool Enforcement Getting bool into Flower exposed a reallyyyy annoying problem: the typechecker had a couple of tiny logic mistakes (I’m so good at this) which caused the bootstrap to blow up in my face and I ahd no idea why. At first the errors looked unrelated. The compiler started reporting huge numbers of mismatches across main.flo , lexer.flo , module.flo , typecheck.flo , and codegen.flo . I was so confused as to why out of nowhere 903 lines were reporting various typechecking errors when they shouldn’t be. As it turns out, types_match() was the culprit. The function had been inverted in a few places: Mismatched base types and pointer depths were returning success, while normal matching primitive types were falling through to failure. That made the new compiler think ordinary initializers, assignments, comparisons, and returns were all invalid. Once that was fixed, the remaining failures turned out to be a second real compiler bug: pointer arithmetic over arrays was decaying in the wrong direction. Expressions like: mods.modules + j env.structs + env.struct_count arr + 1 should produce pointer types. Instead, the typechecker was reducing pointer depth when arrays decayed, which made perfectly normal indexed access and table walking look type-invalid. So this dev session ended up doing three important things: fixed types_match(...) so actual matches succeed and actual mismatches fail preserved decimal compatibility for float / double matching fixed array-to-pointer decay in pointer arithmetic so compiler internals and examples resolve correctly again What made this especially annoying is that the symptoms looked much larger than the cause. A couple of bad returns in the typechecker created hundreds of downstream errors, and because Flower is self-hosting, that meant the compiler started rejecting its own source. After correcting those core issues, both bootstrap and the example test suite started working again. That is the real value of issues like this: not just “fewer errors,” but restoring (MY) trust in the compiler and its ability to enforce Flower’s rules and report issues. With that stable again, the path forward is much clearer: continue bool work from a solid base, then move on to the remaining numeric and string improvements without the whole compiler collapsing under one bad predicate."}, {"post_id": 6207, "ts": "2026-06-10T12:52:51Z", "hours": 4.0928, "text": "Devlog: Making Flower’s Bool Support Real Enough to Survive Bootstrap The goal sounded small at first: add proper boolean support, while still lowering booleans to integers in C. In practice, this turned into an overarching type-system problem (typical!). Flower had reached a point where bool could not just be a naming trick over 1 and 0 . The compiler itself needed to understand when an expression was semantically boolean, when it was integer, and when older bootstrap-era shortcuts were no longer valid. A lot of those shortcuts had survived because the backend lowers bool to int anyway. But self-hosting exposed a major issue: source-level typing and C lowering are not the same thing. Things like these started breaking: val: int = parser_peek(ps).kind == TOKEN_TRUE and helper predicates that returned comparison expressions from int -typed functions. So the checkpoint became: keep C lowering simple, but make Flower’s typechecker treat booleans as a real source-level type. The main changes were: parser -> typecheck -> codegen true / false now parse into AST_BOOL_LIT bool literals are still emitted as 0 / 1 in C logical and comparison expressions now resolve to bool arithmetic rejects bool operands if , while , and not now validate condition-compatible expressions variable initializers, assignments, and returns now check types more strictly One of the more annoying bugs turned out not to be “about bools” at all. When code like this failed inside the compiler: defined_structs[i].length emitted_imports[i].path the real problem was that for i in 0..count was never registering i in the type environment, so indexed access looked broken when really the loop variable itself had no known type. Once loop indices were typed as int , those field-access failures disappeared (yay!!). The result is a much better place to build from: bool is now semantically distinct in Flower it still lowers cleanly to integer values in generated C bootstrap works again the compiler is stricter without collapsing under its own source That makes the next step much easier: real string support, instead of trying to build strings on top of a type system that still half-thinks everything is an int ."}, {"post_id": 5369, "ts": "2026-06-09T03:37:15Z", "hours": 5.4503, "text": "Devlog: Giving Flower Real Module Support v1.2.x was the point where Flower’s impors had to stop being “you can import stuff.. and there’s a fake layer of security” to a prop er (get it?) module system. Before this work, imports and aliases mostly behaved like naming conveniences. You could write: import \"math.flo\" as math math.add(1, 2) but the compiler was still too loose about what that really meant . Alias names were in emitted C symbol names, top-level declarations were not private, and prop existed more as syntax than as a real feature. That was fine for early bootstrap work, but it was not strong enough for the next stage of the language. So the main goal of v1.2.x became: make imported aliases act like real namespaces make prop define the public interface of a module make top-level declarations private by default lay groundwork for field visibility rules like hidden and readonly Module Semantics Instead of Alias Tricks One of the biggest changes was separating Flower semantics from C lowering. Previously, imported aliases were drifting toward becoming part of emitted symbol identity. A local alias should just be a source-level name bound to a module, not the backend symbol. So now each module has its own lowered symbol prefix, and alias lookup happens semantically during compilation. That means: import \"math.flo\" as math math.add(1, 2) is resolved as “look up exported add in module math.flo ,” not “invent a C symbol from the local alias text as math_add() .” That change also forced a cleanup of emitted names so they stopped leaking absolute filesystem paths. Generated symbols now use project-relative module prefixes instead of machine-specific paths. prop Became Real Another major part of this was making prop actually do something. Instead of treating it as a thin wrapper around only functions, the compiler now recognizes prop as a real top-level export marker. That means the module’s public interface is defined by what it explicitly exports, while non- prop declarations remain internal. This moved Flower closer to the model I wanted all along: explicit modules, explicit public APIs, no heavy object system (OOP), no fake privacy delegated to the C backend. Dot Access, Pointers, and the Annoying Middle Part This work also exposed a weakness in the compiler’s dot-access resolution. Flower source always uses . , while the C backend must decide whether a given access becomes . or -> . That mostly worked already, but nested pointer-heavy field chains exposed cases where the type tracker was not propagating enough information, which caused bad fallback behavior during self-hosting. So before field visibility could be trusted, I had to harden nested dot-access resolution. Not fun, but necessary. As it turns out, I was missing several AST kinds which caused the logic to fall through. Very tedious work, but it was well-worth it in the end! Field Flags Groundwork With module ownership and access resolution in better shape, I added the first field visibility modifiers: hidden readonly frozen Originally I debated having these as bitwise operations, but I decided it’d be best to stay within the current update’s scope, so sometime in the future I’ll refactor. Right now, hidden and readonly are the meaningful additions: hidden blocks external field access readonly blocks external assignment frozen is groundwork for later. It is parsed, stored, and carried through the compiler, but full assignment-once enforcement is still deferred. Unsure how I’ll go about it, but that’s an issue for future me :p"}, {"post_id": 4525, "ts": "2026-06-07T21:22:43Z", "hours": 3.6428, "text": "Devlog: Replacing Flower’s Old Function Syntax with func name(...): type This feature started out as what I thought would be a straightforward syntax cleanup. Flower’s old function syntax looked like this: int add(a: int, b: int): return a + b end and exported functions looked like this: prop int test(): return 1 end It worked, technically, but it had started to annoy me more. The biggest issue was that function declarations did not visually match the direction Flower was already heading in, and instead felt much more C-like than I wanted. prop func create(...): Person func main(): int This style says “this is a function” up front, gives a clean place for modifiers like prop , and keeps the return type attached to the signature rather than awkwardly leading it. The goal was simple: func name(...): type instead of: type name(...): Simple in theory. not so much when the compiler is written in the language being refactored. The Problem Flower’s parser assumes top-level function definitions start with a type. Old parser logic was built around that: int main(): means: parse a type, an identifier, params, and a body That assumption was scattered through a few different places: normal function definitions prop function declarations forward declarations examples and docs the compiler’s own source Now, in retrospect, this was actually one of the easier changes. It didn’t take a whole lot of planning nor brain power, and I was able to change it pretty quickly. Luckily for me, I’ve built codegen to rely purely on ast values rather than shaping. The New Shape The new syntax is: func add(a: int, b: int): int return a + b end and exported functions now look like: prop func test(): int return 1 end This is nicer because: func makes declarations immediately recognizable prop composes more cleanly with func return types now live where people expect them to future syntax has more room to grow without feeling backwards It also feels more in line with Flower’s broader goals: explicit, readable, and not complex. The Refactor Previously, parse_func_def looked for a return type first: type name(...): Now it expects: func name(...): type So the order changed to: expect func parse function name parse parameter list expect : parse return type parse body until end That part was conceptually easy. The more annoying part was updating all the places that assumed if it isn’t a var decl and it looks like a func, it’s a func. That fallback had to go (Good riddance!). Instead, top-level parsing needed to become more explicit: prop func → exported function func → normal function forward func → forward declaration The old one worked, but it relied on vague “anything else is probably a function” rules. The Bootstrap Mistake At one point, I made a bootstrap build so I could use a Flower_new binary to compile the refactored compiler. Unfortunately, I had made a mistake in parse_forward : advancing before peek checks. Feel free to check out the bootstrapper to see why this was an issue ;) This meant my “new compiler to compile the new compiler” was built from a broken parser. The workaround was cursed, but it worked : check out the commit before the refactor fix the bug compile a new binary switch to the refactor branch use the binary to compile the new version Since the compiled binary was ignored by Git, this was actually fairly simple. Not the most elegant bootstrap story, but it got the compiler to, well, compile."}, {"post_id": 3962, "ts": "2026-06-07T03:08:31Z", "hours": 8.2967, "text": "Devlog: Making Flower’s Type Tracking “Enough” for Stdlib / String Work The original motivation was simple and — supposedly — quick; I wanted to move on to v1.1.1 , “stdlib basics,” especially string utilities. But Flower’s current compiler did not really know what types expressions had. It mostly had pointer_depth on declarations, which was enough to generate * in C types and sometimes guess whether field access should become . or -> . That worked for very simple cases: p: @Vector2 = new Vector2 p.x = 5 But it broke down for nested access: outer.inner.value outer.inner_ptr.value The compiler could see the syntax chain, but it did not know whether inner was a value field or pointer field. Since Flower source only uses . , the C backend needs to decide whether each hop becomes . or -> . That meant stdlib work was blocked. If I want something like: if strings.equal(string_a, string_b): print(\"same\\n\") end then Flower needs to understand that string_a.length , string_a.data , etc. are real typed fields, not just random syntax to dump into C. Originally I thought I could just simply create a Symbol Table to get that to work. Unfortunately, that plan soon failed as it introduced a mariad of issues relating to the import system. At the time, this frustrated me because I knew the import system sucked, but I didn’t want to fix it until a later version. Eventually, I settled on a specific plan which did actually end up changing how imports are handled.. kinda. The Plan The design I landed on was to add a typecheck/type-tracking stage between parsing and codegen: lexer -> parser -> typecheck -> codegen The parser should stay mostly syntax-only. It builds AST nodes like “dot access,” so I didn’t really change it. The typecheck pass now collects declarations into a TypeEnv : struct TypeEnv { structs: StructInfo[1024], struct_count: int, vars: VarInfo[8192], var_count: int, funcs: FuncInfo[8192], func_count: int, error_count: int } Then it walks expressions and annotates dot access nodes with an access kind: ACCESS_UNKNOWN: int = 0 ACCESS_DOT: int = 1 ACCESS_ARROW: int = 2 So codegen no longer has to fully guess. It can do: if ast.data._dot_access.access_kind == ACCESS_ARROW: fprintf(out, \"->%.*s\", ...) else if ast.data._dot_access.access_kind == ACCESS_DOT: fprintf(out, \".%.*s\", ...) else: // fallback end That fallback is important because Flower is self-hosted-ish right now. The compiler is written in Flower, and the compiler’s own source code is full of field access. If the new typechecker is too strict too early, it breaks the compiler while trying to compile the compiler. Very elegant. Very cursed. Just how I like it ;) Import-Aware Type Tracking At first, typechecking only saw the main file, so I added a module loading pass. Instead of codegen discovering and parsing imports late, the compiler now loads modules earlier: load main module load imports recursively collect declarations from all modules typecheck all modules codegen all modules That required a new module structure: struct Module { path: @char, src: @char, tokens: @TokenStream, ast: @AST } struct ModuleSet { modules: Module[128], count: int } Unfortunately, it didn’t go as smoothly as I wanted. Near the end when I was sure everything would work, I ran into an Idempotency failure due to the new handling of system imports. I.. just manually passed it :p"}]...
|
Title: Flower by @IvyMycelia | Stardance
Devlogs: Title: Flower by @IvyMycelia | Stardance
Devlogs:
Devlog: Making Flower’s Type Tracking “Enough” for Stdlib / String Work The original motivation was simple and — supposedly — quick; I wanted to move on to v1.1.1 , “stdlib basics,” especially string utilities. But Flower’s current compiler did not really know what types expressions had. It mostly had pointer_depth on declarations, which was enough to generate * in C types and sometimes guess whether field access should become . or -> . That worked for very simple cases: p: @Vector2 = new Vector2 p.x = 5 But it broke down for nested access: outer.inner.value outer.inner_ptr.value The compiler could see the syntax chain, but it did not know whether inner was a value field or pointer field. Since Flower source only uses . , the C backend needs to decide whether each hop becomes . or -> . That meant stdlib work was blocked. If I want something like: if strings.equal(string_a, string_b): print("same\n") end then Flower needs to understand that string_a.length , string_a.data , etc. are real typed fields, not just random syntax to dump into C. Originally I thought I could just simply create a Symbol Table to get that to work. Unfortunately, that plan soon failed as it introduced a mariad of issues relating to the import system. At the time, this frustrated me because I knew the import system sucked, but I didn’t want to fix it until a later version. Eventually, I settled on a specific plan which did actually end up changing how imports are handled.. kinda. The Plan The design I landed on was to add a typecheck/type-tracking stage between parsing and codegen: lexer -> parser -> typecheck -> codegen The parser should stay mostly syntax-only. It builds AST nodes like “dot access,” so I didn’t really change it. The typecheck pass now collects declarations into a TypeEnv : struct TypeEnv { structs: StructInfo[1024], struct_count: int, vars: VarInfo[8192], var_count: int, funcs: FuncInfo[8192], func_count: int, error_count: int } Then it walks expressions and annotates dot access nodes with an access kind: ACCESS_UNKNOWN: int = 0 ACCESS_DOT: int = 1 ACCESS_ARROW: int = 2 So codegen no longer has to fully guess. It can do: if ast.data._dot_access.access_kind == ACCESS_ARROW: fprintf(out, "->%.*s", ...) else if ast.data._dot_access.access_kind == ACCESS_DOT: fprintf(out, ".%.*s", ...) else: // fallback end That fallback is important because Flower is self-hosted-ish right now. The compiler is written in Flower, and the compiler’s own source code is full of field access. If the new typechecker is too strict too early, it breaks the compiler while trying to compile the compiler. Very elegant. Very cursed. Just how I like it ;) Import-Aware Type Tracking At first, typechecking only saw the main file, so I added a module loading pass. Instead of codegen discovering and parsing imports late, the compiler now loads modules earlier: load main module load imports recursively collect declarations from all modules typecheck all modules codegen all modules That required a new module structure: struct Module { path: @char, src: @char, tokens: @TokenStream, ast: @AST } struct ModuleSet { modules: Module[128], count: int } Unfortunately, it didn’t go as smoothly as I wanted. Near the end when I was sure everything would work, I ran into an Idempotency failure due to the new handling of system imports. I.. just manually passed it :p
Devlog: Replacing Flower’s Old Function Syntax with func name(...): type This feature started out as what I thought would be a straightforward syntax cleanup. Flower’s old function syntax looked like this: int add(a: int, b: int): return a + b end and exported functions looked like this: prop int test(): return 1 end It worked, technically, but it had started to annoy me more. The biggest issue was that function declarations did not visually match the direction Flower was already heading in, and instead felt much more C-like than I wanted. prop func create(...): Person func main(): int This style says “this is a function” up front, gives a clean place for modifiers like prop , and keeps the return type attached to the signature rather than awkwardly leading it. The goal was simple: func name(...): type instead of: type name(...): Simple in theory. not so much when the compiler is written in the language being refactored. The Problem Flower’s parser assumes top-level function definitions start with a type. Old parser logic was built around that: int main(): means: parse a type, an identifier, params, and a body That assumption was scattered through a few different places: normal function definitions prop function declarations forward declarations examples and docs the compiler’s own source Now, in retrospect, this was actually one of the easier changes. It didn’t take a whole lot of planning nor brain power, and I was able to change it pretty quickly. Luckily for me, I’ve built codegen to rely purely on ast values rather than shaping. The New Shape The new syntax is: func add(a: int, b: int): int return a + b end and exported functions now look like: prop func test(): int return 1 end This is nicer because: func makes declarations immediately recognizable prop composes more cleanly with func return types now live where people expect them to future syntax has more room to grow without feeling backwards It also feels more in line with Flower’s broader goals: explicit, readable, and not complex. The Refactor Previously, parse_func_def looked for a return type first: type name(...): Now it expects: func name(...): type So the order changed to: expect func parse function name parse parameter list expect : parse return type parse body until end That part was conceptually easy. The more annoying part was updating all the places that assumed if it isn’t a var decl and it looks like a func, it’s a func. That fallback had to go (Good riddance!). Instead, top-level parsing needed to become more explicit: prop func → exported function func → normal function forward func → forward declaration The old one worked, but it relied on vague “anything else is probably a function” rules. The Bootstrap Mistake At one point, I made a bootstrap build so I could use a Flower_new binary to compile the refactored compiler. Unfortunately, I had made a mistake in parse_forward : advancing before peek checks. Feel free to check out the bootstrapper to see why this was an issue ;) This meant my “new compiler to compile the new compiler” was built from a broken parser. The workaround was cursed, but it worked : check out the commit before the refactor fix the bug compile a new binary switch to the refactor branch use the binary to compile the new version Since the compiled binary was ignored by Git, this was actually fairly simple. Not the most elegant bootstrap story, but it got the compiler to, well, compile.
Devlog: Giving Flower Real Module Support v1.2.x was the point where Flower’s impors had to stop being “you can import stuff.. and there’s a fake layer of security” to a prop er (get it?) module system. Before this work, imports and aliases mostly behaved like naming conveniences. You could write: import "math.flo" as math math.add(1, 2) but the compiler was still too loose about what that really meant . Alias names were in emitted C symbol names, top-level declarations were not private, and prop existed more as syntax than as a real feature. That was fine for early bootstrap work, but it was not strong enough for the next stage of the language. So the main goal of v1.2.x became: make imported aliases act like real namespaces make prop define the public interface of a module make top-level declarations private by default lay groundwork for field visibility rules like hidden and readonly Module Semantics Instead of Alias Tricks One of the biggest changes was separating Flower semantics from C lowering. Previously, imported aliases were drifting toward becoming part of emitted symbol identity. A local alias should just be a source-level name bound to a module, not the backend symbol. So now each module has its own lowered symbol prefix, and alias lookup happens semantically during compilation. That means: import "math.flo" as math math.add(1, 2) is resolved as “look up exported add in module math.flo ,” not “invent a C symbol from the local alias text as math_add() .” That change also forced a cleanup of emitted names so they stopped leaking absolute filesystem paths. Generated symbols now use project-relative module prefixes instead of machine-specific paths. prop Became Real Another major part of this was making prop actually do something. Instead of treating it as a thin wrapper around only functions, the compiler now recognizes prop as a real top-level export marker. That means the module’s public interface is defined by what it explicitly exports, while non- prop declarations remain internal. This moved Flower closer to the model I wanted all along: explicit modules, explicit public APIs, no heavy object system (OOP), no fake privacy delegated to the C backend. Dot Access, Pointers, and the Annoying Middle Part This work also exposed a weakness in the compiler’s dot-access resolution. Flower source always uses . , while the C backend must decide whether a given access becomes . or -> . That mostly worked already, but nested pointer-heavy field chains exposed cases where the type tracker was not propagating enough information, which caused bad fallback behavior during self-hosting. So before field visibility could be trusted, I had to harden nested dot-access resolution. Not fun, but necessary. As it turns out, I was missing several AST kinds which caused the logic to fall through. Very tedious work, but it was well-worth it in the end! Field Flags Groundwork With module ownership and access resolution in better shape, I added the first field visibility modifiers: hidden readonly frozen Originally I debated having these as bitwise operations, but I decided it’d be best to stay within the current update’s scope, so sometime in the future I’ll refactor. Right now, hidden and readonly are the meaningful additions: hidden blocks external field access readonly blocks external assignment frozen is groundwork for later. It is parsed, stored, and carried through the compiler, but full assignment-once enforcement is still deferred. Unsure how I’ll go about it, but that’s an issue for future me :p
Devlog: Making Flower’s Bool Support Real Enough to Survive Bootstrap The goal sounded small at first: add proper boolean support, while still lowering booleans to integers in C. In practice, this turned into an overarching type-system problem (typical!). Flower had reached a point where bool could not just be a naming trick over 1 and 0 . The compiler itself needed to understand when an expression was semantically boolean, when it was integer, and when older bootstrap-era shortcuts were no longer valid. A lot of those shortcuts had survived because the backend lowers bool to int anyway. But self-hosting exposed a major issue: source-level typing and C lowering are not the same thing. Things like these started breaking: val: int = parser_peek(ps).kind == TOKEN_TRUE and helper predicates that returned comparison expressions from int -typed functions. So the checkpoint became: keep C lowering simple, but make Flower’s typechecker treat booleans as a real source-level type. The main changes were: parser -> typecheck -> codegen true / false now parse into AST_BOOL_LIT bool literals are still emitted as 0 / 1 in C logical and comparison expressions now resolve to bool arithmetic rejects bool operands if , while , and not now validate condition-compatible expressions variable initializers, assignments, and returns now check types more strictly One of the more annoying bugs turned out not to be “about bools” at all. When code like this failed inside the compiler: defined_structs[i].length emitted_imports[i].path the real problem was that for i in 0..count was never registering i in the type environment, so indexed access looked broken when really the loop variable itself had no known type. Once loop indices were typed as int , those field-access failures disappeared (yay!!). The result is a much better place to build from: bool is now semantically distinct in Flower it still lowers cleanly to integer values in generated C bootstrap works again the compiler is stricter without collapsing under its own source That makes the next step much easier: real string support, instead of trying to build strings on top of a type system that still half-thinks everything is an int .
Devlog: Fixing the Typechecker After Bool Enforcement Getting bool into Flower exposed a reallyyyy annoying problem: the typechecker had a couple of tiny logic mistakes (I’m so good at this) which caused the bootstrap to blow up in my face and I ahd no idea why. At first the errors looked unrelated. The compiler started reporting huge numbers of mismatches across main.flo , lexer.flo , module.flo , typecheck.flo , and codegen.flo . I was so confused as to why out of nowhere 903 lines were reporting various typechecking errors when they shouldn’t be. As it turns out, types_match() was the culprit. The function had been inverted in a few places: Mismatched base types and pointer depths were returning success, while normal matching primitive types were falling through to failure. That made the new compiler think ordinary initializers, assignments, comparisons, and returns were all invalid. Once that was fixed, the remaining failures turned out to be a second real compiler bug: pointer arithmetic over arrays was decaying in the wrong direction. Expressions like: mods.modules + j env.structs + env.struct_count arr + 1 should produce pointer types. Instead, the typechecker was reducing pointer depth when arrays decayed, which made perfectly normal indexed access and table walking look type-invalid. So this dev session ended up doing three important things: fixed types_match(...) so actual matches succeed and actual mismatches fail preserved decimal compatibility for float / double matching fixed array-to-pointer decay in pointer arithmetic so compiler internals and examples resolve correctly again What made this especially annoying is that the symptoms looked much larger than the cause. A couple of bad returns in the typechecker created hundreds of downstream errors, and because Flower is self-hosting, that meant the compiler started rejecting its own source. After correcting those core issues, both bootstrap and the example test suite started working again. That is the real value of issues like this: not just “fewer errors,” but restoring (MY) trust in the compiler and its ability to enforce Flower’s rules and report issues. With that stable again, the path forward is much clearer: continue bool work from a solid base, then move on to the remaining numeric and string improvements without the whole compiler collapsing under one bad predicate.
Devlog: Making Bool Real Without Breaking Bootstrap The original goal, asper usual, was straightforward: before moving on to string , Flower needed bool to actually mean something semantically. Up to this point, boolean-ish behavior mostly worked by accident. Comparisons, conditions, returns, and general expression checking were still loose enough that the compiler could get away with treating a lot of things as “close enough,” especially since the C backend ultimately lowers bool to int anyway. That was not going to hold once v1.3 started leaning on richer typing. So this was about drawing a clean line between Flower semantics and C lowering. The Goal In Flower: bool should be its own real type comparisons and logical operators should produce bool arithmetic should not quietly accept bool implicit conversion should stay narrow and predictable explicit casting should remain available through as In C: bool can still lower to int That distinction ended up being the easy part. What Changed The typechecker now treats bool as a proper language type instead of an int-shaped placeholder. Condition checks were tightened so if , while , and not use condition-compatible rules. Arithmetic paths now reject boolean operands, and return / initializer / argument checking now runs through more explicit conversion rules. I also kept implicit widening one-directional: int -> float -> double while leaving narrowing conversions as explicit casts. The actual implementation of booleans and their typing, enforcement, and semantics was a breeze. It’s what came after that got me. What Actually Broke As usual, bootstrap had opinions. The stricter type work exposed older weaknesses that were easy to miss before (This is my coping): function argument checks needed array-to-pointer decay alias and module call lookup paths were too narrow unresolved calls could prevent nested expressions from being fully type-resolved that, in turn, broke some dot-access lowering and caused bad . vs -> emission in generated C So part of this checkpoint turned into compiler stabilization work rather than just bool semantics due to my crappy ‘temporary’ logic, error handling — or lack thereof, and impeccable ability to miss very important details. I’m an amazing programmer, if you couldn’t tell :p Result Flower now has a much firmer semantic base for bool, and the compiler is back to bootstrapping cleanly with those rules in place. That matters because this was really the floor for the next part of v1.3: string . And.. maybe I’ll fix the bootstrap process so it doesn’t blow up in my face again. Oh yea, forgot to mention that. The bootstrapper bootstrapped itself into this very broken parser state that refused to go away so I had to stash my changes, checkout the prior merge (detached), and then recompile manually and fix the parser. Toodles!
Devlog: Building Flower’s String Type Foundation The core goal was to make this work in a meaningful, compiler-owned way: name: string = "Ivy" as string raw: @char = name as @char other: string = raw as string if name == other: print("same\n") end print(name.length) That meant Flower needed more than a typedef in generated C. It needed actual type rules, actual lowering rules, and I needed enough hairs on my head to not be bald after the amount of scares that occurred. What changed The first step was giving string real compiler support without going too far too fast. I added support for: explicit casts between string and @char string equality / inequality string.length runtime helpers in generated C for: flower_string_from_cstr(...) flower_string_eq(...) flower_print_string(...) That gave Flower a usable string foundation while still keeping literals conservative for self-hosting. Right now, string literals are not fully “native string values everywhere” yet; the compiler still uses explicit casts like "Ivy" as string as the safe bridge. The reason for this “safe bridge” is because when I got too ambitious, the compiler would break since everywhere @char was used with a string literal it’d break due to no implicity being allowed. I had to comment out the following new changes and keep the legacy support so it’d compile: else if ast.kind == AST_STRING_LIT: // fprintf(out, "flowe_string_from_cst(") // fprintf(out, "%.*s", ast.data._string.str_length, src + ast.data._string.str_start) // fprintf(out, ")") // LEGACY CODE HERE and else if expr.kind == AST_STRING_LIT: // set_plain_type(out, TOKEN_STRING) // LEGACY CODE HERE return 1 The part that broke The most annoying issue was not string equality or .length . It was print . Originally, non-string print(...) was basically lowered like this: printf ( expr ); That only works when expr is already a C format string. So something like: print(name.length) generated invalid C: printf ( name . length ); The fix was to make print(...) type-aware. Typecheck now records the operand type, and codegen lowers print differently for string , @char , char , floats/doubles, and integer-like values. That sounds small, but it matters a lot: once string became real, print could no longer get away with pretending every printable value was already a C string. An Unsolved Bootstrap Mystery Somehow Flower’s bootstrap process was breaking, and it will probably break again. Despite the bootstrap requiring it to compile itself, somehow afterwords the binary could become corrupted. l-2: ~/Documents/GitHub/FloC % make bootstrap === Building new version === Compiled ./bin/Flower_new.c → ./bin/Flower_new === Testing new compiler === Compiled ./bin/Flower_test.c → ./bin/Flower_test Verified bootstrap build complete l-2: ~/Documents/GitHub/FloC % make bootstrap === Building new version === Luckily, I always make sure to keep a backup Flower bin stored under /bin/Flower_backup so I used that to compile the new binary and then it worked. Where this leaves v1.3 What still remains is the bigger ergonomic question: how fully native string literals should behave, and how to migrate the compiler’s own source to that world without setting bootstrap on fire again. I’m not sure yet how I want to approach this question, or what the goals for it should even be, but I guess I’ll have to find out soon enough! That is the next fight. But at least now, it is a fight on solid ground.
Devlog: Finishing Flower’s String Interop Bridge The last round got string into Flower as a real type. This round was about making that foundation actually work lol. The big problem was that once string became real, plain string literals started living in an in-between state: Flower wanted them to mean “Flower string,” but the compiler’s own source still has plenty of places that really mean “raw C string,” like: RED: @char = "\033[0;31m" if not strcmp(arg, "help") or not strcmp(arg, "h"): ... end Those cases worked before only because everything was basically pretending string literals were already @char . Once that stopped being true, bootstrap started throwing a fit (my spoiled child). What changed The main fix was to make string literal lowering contextual instead of all-or-nothing. If a literal is being used as a real Flower string , it stays a string . If a literal is being used in a C interop position, it gets lowered as a C string instead. That meant tightening a few compiler rules so this kind of thing works cleanly again: name: string = "Ivy" as string raw: @char = name as @char if strcmp(raw, "Ivy") == 0: print(name) end I also fixed top-level declarations so globals like: RED: @char = "\033[0;31m" no longer generate nonsense like: char * RED = (( flower_string ){ ... }); which, unsurprisingly, C does not appreciate. The subtle compiler bug The nastiest issue wasn’t even the globals. It was that builtin C calls like strcmp , strncmp , printf , snprintf , and friends are not real Flower functions. That meant the typechecker could hit one of them inside a larger expression, fail early, and stop walking the rest of the tree. So something like: if not strcmp(arg, "help") or not strcmp(arg, "h"): could partially resolve one side, then leave the other side unprocessed. Very cool. Very stable. Definitely what I wanted. The fix was to add a temporary builtin C-call bridge so the compiler can recognize these calls well enough to keep type resolution and literal lowering consistent during bootstrap. I’m not happy with this fix by any means, but due to the limitations of emitting C, it was the only solution I found that made sense at the time. Tests and examples Once that stopped exploding, I finally wired string testing into the normal types suite instead of leaving it commented out and pretending I’d “get back to it later.” The string tests now cover: string <-> @char casts string equality / inequality .length empty strings printing strings literal use in current interop cases And the full test suite passed with string included as a first-class part of Types on its first try . Now that’s what I like to see :D What this means This does not mean Flower’s long-term answer is “hardcode libc into the compiler forever.” It means Flower now has a temporary interop bridge that keeps self-hosting stable while string is worked on. The actual language semantics stay in Flower; the backend-specific weirdness is just being tolerated for now so progress does not stall. In the near, I’ll probably replace all of the necessary C libs with minimal Flower-equivalents. Where this leaves v1.3 At this point, the string foundation feels much sturdier. Not “done forever,” not backend-agnostic, and definitely not free of cursed bootstrap energy — but it works. The next work is no longer rescue work. It is actual forward work: string operations, stdlib basics, and eventually replacing this temporary C bridge with something cleaner when Flower grows past the C backend.
Devlog: Adding String Indexing to Flower This one was fairly quick, and was about making one very normal-looking thing actually work: name: string = "Ivy" as string first: char = name[0] That sounds small, but once string became a real Flower type, indexing could no longer piggyback on the old “arrays and pointers only” behavior. The compiler needed to understand that string[index] is its own case. What changed I taught the typechecker to treat string subscripts as char . That means: string[index] now resolves to char the index expression must be an integer string indexing is readonly for now So this is valid: first: char = name[0] but this is not: name[0] = 'X' I wanted reads first, writes later. That keeps the rules simple while the string representation is still compiler-owned. I’m not sure how writes would work with a C backend, due to how ‘strings’ are allocated. Perhaps a feature for post-v2.0? Lowering it to C Since Flower strings currently lower to a struct with .data and .length , codegen needed a special path for string subscripts. Normal arrays and pointers still lower like: arr [ index ] but strings now lower like: name . data [ index ] That keeps the generated C valid without changing how regular subscripts work elsewhere in the language. So something conceptually like: This checkpoint also forced one strict-but-correct rule that required me to update a WHOLE SINGLE LINE (hehe): arg[i] = tolower(arg[i] as char) to arg[i] = tolower(arg[i] as char) as char Because tolower(...) is effectively treated as returning int , assigning it back into a char subscript needs an explicit cast. I kept that strictness on purpose. I do not want Flower silently narrowing values just because C would let it. Validation I expanded the string example coverage to check: string indexing returns the expected chars string[index] works alongside string <-> @char casts bootstrap still succeeds repeated bootstrap succeeds tests still pass Which, after all the recent bootstrap chaos, was very nice to see. Where this leaves v1.3 Now we can: store strings compare strings print strings inspect length index into them as char This should make it much easier to replace the builtin C functions with a Flower library in the near-near future.
Devlog: Fixing Flower’s Output Driver and Starting the String Stdlib This checkpoint was really two different kinds of progress that ended up helping each other a lot. The first part was not glamorous, but it was necessary: Flower’s compile driver was tripping over its own default output naming. This was a known issue that I had been putting off, but for some reason it really annoyed me this time so I decided enough and to fix it. If no explicit output path was provided, the compiler would generate output.c , then strip the .c and try to emit a binary named output . That worked fine right up until the repo itself already had an output/ directory. At that point, linking failed because the compiler was trying to create a file where a directory already existed. Worse — because it annoyed me more — the driver logic was also mixing up “the generated program exited non-zero” with “compilation failed.” That became especially annoying during bootstrap, because the generated compiler binary would run without CLI arguments, print its own usage error, and then cause bootstrap to report failure even though codegen and C compilation had both succeeded. So I finally got off my butt and cleaned that up. Driver Cleanup The default output path now goes to: output/out.c which naturally produces: output/out as the binary. That avoids the old output filename collision. I also separated compile success from auto-run behavior: explicit output path: compile only default output path: compile, then auto-run if appropriate That means bootstrap no longer “fails” just because the compiled compiler exits non-zero with missing arguments, and demo/test files can still run automatically when that is actually useful. This sounds like a small driver fix, but honestly it removed a lot of noise from string work — and more — immediately. String Stdlib Beginnings Once that output weirdness was under control, I could finish doing what I just started and actually wanted: making string behavior live in Flower instead of endlessly leaning on ad hoc C calls (Call back to last devlog, absolute ball knowledge!!). So I added the first real reusable helpers in src/stdlib/string.flo : is_empty(s) starts_with(s, prefix) ends_with(s, suffix) find_char(s, ch) These are intentionally simple. They mostly exist to prove that the current string support is now strong enough for normal library code to be written on top of it. Not incredibly useful, at least at the level the compiler needs, but at least I could translate some AP Comp Sci A into Flower hehe A string feature does not really feel “real” until I can build helpers with the language itself instead of only teaching the compiler more special cases. The day I remove the builtin C handlers is the day I’m at peace… Validation To exercise that new library surface, I changed string_pass.flo to now act as a small pass file for the experimental library. Its job is not to be impressive. Its job is to answer a more important question: can I import string helpers, call them from normal Flower code, and get expected results through the full compile pipeline? At this point, yes. Where this leaves things This checkpoint did not remove all C string dependencies from the compiler. In fact, it removed essentially none! That is still a separate step, one that may even be in v1.3.7 ;) But it did establish two important things: Flower’s output/driver behavior is now much less annoying. We can start growing a real string library in Flower itself. That is a good place to be, because the next string work can build outward from a stable driver and an actual library surface instead of piling more special behavior into the compiler.
Devlog: Giving Flower an Internal cstr Foundation Even after Flower got a real string type, the compiler itself was still leaning directly on C-style string helpers for its own internal work. That meant a lot of Flower source was still semantically depending on libc behavior: !strncmp(...) strcmp(...) strlen(...) strcpy(...) strncpy(...) strdup(...) strrchr(...) That is not where I want the language to stay. What changed I added a new internal module: import "src/stdlib/cstr.flo" as cstr and gave it compiler-facing helpers like: prop func len(s: @char): int prop func eq(a: @char, b: @char): bool prop func eq_n(a: @char, b: @char, n: int): bool prop func copy(dst: @char, src: @char): @char prop func copy_n(dst: @char, src: @char, n: int): @char prop func dup(src: @char): @char prop func find_last(src: @char, ch: char): @char This helper module is essentially the precursor to a future strings.flo library that can be distributed. But for now, it uses a basic API layer purely meant for in-house usage. Then I migrated compiler internals over to that module across: src/parser.flo src/module.flo src/lexer.flo src/typecheck.flo src/codegen.flo src/globals.flo src/main.flo So instead of using C-string behavior directly everywhere, the compiler now goes through Flower-owned helpers first. The Compiler Strikes Back This was one of those changes that sounds mechanical until it absolutely is not. A big trap was that old code often relied on C comparison functions returning 0 on equality, so patterns looked like this: not strncmp(...) But cstr.eq_n(...) returns an actual bool , which means blindly rewriting those calls gives inverted logic. So this: if ps.alias_lengths[i] == tok.length and not cstr.eq_n(...): was completely wrong. It had to become: if ps.alias_lengths[i] == tok.length and cstr.eq_n(...): That bug showed up in alias parsing first, which made it especially cursed, because it caused normal namespace-style calls like cstr.eq(...) to stop parsing correctly and crash the bootstrap path in confusing ways. I spent way longer than I wish to admit on trying to figure out why it wasn’t playing nice. But, once I figured it out, it was a really quick fix (I literally just cmd + f ’d not cstr and replaced it with cstr lol). Are we done yet..? This does not mean Flower is free from the C backend yet. It does mean something important, though: compiler logic is starting to depend on Flower-defined helper semantics instead of scattered raw libc calls. That is a much better stage for the future backend story, because when C eventually stops being the primary lowering target, the compiler will already have more of its own vocabulary. In other words, this was less about “remove C” and more about “stop letting C define the language’s internal habits.” Nah just kidding, I really wanted that bloated “builtin_c_call” stuff gone. Unfortunately I only managed to skim it, but that’s closer than before! Result After fixing the migration mistakes and the alias/parser fallout, the compiler bootstrapped successfully again. Flower now has an internal cstr layer, and compiler string handling is a little more its own.
Devlog: Cleaning Up v1.3 For Release After many hours of work, bool and `string finally became real, and it was time to cleanup the mess I left behind from the version’s development. Mainly the only thing worked on was some cleanup: roadmap now reflects actual v1.3 features and implementations updated README and contribution documents to match the current compiler pipeline cleaned up string examples so they have the full intended v1.3 style instead of some leftover testing usage pushed the compiler’s version to 1.3.0 updated help / usage text so it matches the new output-path and auto-run behavior Prior to this, if I had just merged and shipped, the release wouldv’e been messy: README, Contributing, example files, and guidance commands were all mixing older details which made it confusing — even for me — when trying to explore the language and what it has to offer. For a bootstrapped compiler especially, making sure everything is cleaned up and polished is something that should not be ignored. I’m definitely guilty of overlooking this, but I’ve outlayed a whole plan for v1.3 unlike past versions, and part of it was setting up a proper versioning system and polishing its release as it goes. This format will be adopted in future versions, since it’s just way cleaner and nicer to look at. Future work At this point, v1.3 is done and has implemented, at minimum, a concrete foundation for post-v2 bools and strings. Next will likely be more subtle improvements, and features that are currently reliant explicitly on C rather than Flower-hosted code. In order for v2.0 , Flower will have to be effectively independent from C if it wants to emit machine code. Currently I am planning on adding features such as Type Aliases and maybe a stdlib prior to that, but anything can change!! Thanks for being here for all of v1.3 <3
Devlog: Making Flower’s Type Aliases Transparent This version was simple to develop on paper (and even in practice it wasn’t too bad, only around 4 or so hours!): type Count = int type Total = Count type Name = string and then have those aliases behave like the real type everywhere: n: Count = 12 total: Total = identity(n) name: Name = "Ivy" if name != "Ivy": return false end if name.length != 3: return false end That meant aliases could not just be parsed and stored, but rather had to be transparent to the compiler’s semantic checks. What changed I added type alias declarations to the AST, parser, and type environment, then added the ability to resolve aliases in typechecking before comparing types. That included: return type checks variable initializers function call arguments binary comparisons string-specific comparison logic struct field access The important rule here is that aliases are semantic, not codegen-facing. Count should behave as int , Name should behave as string , and chained aliases like Total -> Count -> int should collapse correctly. In the future, especially post v2.0 , this could change and custom types might become real — but for now, they’re just aliases. The bug that exploded bootstrap The first real failure was not in aliases themselves, but in function argument checking. Inside check_call_args(...) , the compiler was resolving the argument expression into expected_type instead of arg_type . That overwrote the parameter type, left the actual argument type uninitialized, and caused the second bootstrap stage to explode into over a thousand misleading errors. This was not a pre-existing issue, it was instead from human error (my error) during the initial implementation where I accidentally put the wrong variable. Once that was fixed, the remaining failures were much more helpful than the bright flash of red and “Typecheck failed with 1224 error(s)” message! Where this leaves v1.4 With the first step toward “better types” done, aliases are no longer just syntax. That gives v1.4 a solid base for whatever comes next in the type system without having to fake around raw names. During this whole dev session, I did discover that a whole lot more of the source code was left using legacy work-arounds: int instead of bool , name_start; name_length and @char instead of string . In all fairness, some of these aren’t exactly the easiest to refactor. However, I will probably hold off on refactoring the codebase until either right before v2.0 , or right after. Just know it’s on my radar ;)
Devlog: Fixing Flower’s Compiler Process So It Stops Fighting the Host This wasn’t really about language design at all buttttt it is much more embarrassing , AND more important: Flower’s compiler process itself was too fragile. The immediate issue showed up on Linux, specifically NixOS (thanks shipwrights <3). The build flow was assuming too much: a previously existing bin/Flower could be reused safely bash would exist at the expected path clang would always be available the checked-in compiler binary would be runnable on whatever machine the repo landed on That worked well enough on my machine until it didn’t. On NixOS — and by extension probably any other machine without the prexisting binaries I had — it broke: make targets were inconsistent, the shell script failed on interpreter assumptions, and the compiler binary itself could be the wrong format for the host. What changed The fix was to separate “the compiler source exists” from “the current compiler binary is usable on this machine.” The build process now starts by compiling a fresh host-native bootstrap compiler from bin/Flower.c , instead of trusting whatever happens to already exist in bin/Flower . That means the flow is now: bin/Flower.c -> host-native bootstrap compiler -> new Flower compiler -> self-check instead of: maybe existing bin/Flower -> hopefully works -> maybe bootstrap Ok well that’s kinda a lie; it still relies on hopes and dreams to bootstrap sometimes. BUT it’s MUCH safer! And now everyone gets to experience crippling bootstrap anxiety, instead of being met with a failure before the actual compiler gets to.. well, do its thign! I also cleaned up the surrounding tooling: switched the bootstrap script to portable sh restored a clearer build / bootstrap / rebuild / test / clean structure made the compiler use CC and CFLAGS from the environment instead of hardcoding clang What this actually improves Flower is still not universally cross-platform yet. The compiler driver still has POSIX-shaped assumptions in places, and the emitted C can still depend on host APIs depending on what the program uses. I’m not yet at the point of wanting to make it completely universal, especially given how I’m only one person and with v2.0 coming up soon it’d — in my humblest of opinions — be a waste of time. I am honestly grateful for people reviewing my code and otherwise viewing it catching onto details I have overlooked. My goal is to not make a ‘just-barely working on my machine’ project; I enjoy sharing development with others, and it hurts knowing people can’t appreciate code, whether it be mine or others’, due to something as simple as hard-coded sh flags.
Devlog: Formalizing Flower’s Null Foundation Flower already had some of the pieces for null , but they were a bit scattered. The goal here was to make it explicit, consistent, and safe before moving on to nullable syntax like ?T or full union-based nullability later in v1.4 . Another shorter devlog, but still important and distinct enough for me to think “Hmm devlog time? Yes, devlog time!” What changed The main work was in typechecking. I added to the compiler’s idea of what null is, how it is represented internally, and what kinds of values are actually allowed to accept it. Rather than letting null-related behavior stay implicit across a few checks, null now follows a clearer rule set: null has one centralized internal type representation pointer-like values can explicitly accept null null comparisons and assignments now go through the same semantic path Why this matters This isn’t all that important on its own, but it matters a lot for where Flower is going next. If null is not defined well, then later features like: ?T better unions smarter narrowing more expressive type flow all become more error-prone (or so I assume given my track record) than I want need them to be. Validation I also expanded the example coverage so null : it now has dedicated behavior checks around assignment, passing values around, and comparison behavior.
Devlog: Adding Pointer-First Nullable Types to Flower I worked on giving Flower its first real nullable type surface without being overambitious and pretending the compiler is ready for full optional-everything semantics yet. The new syntax now works like this: ptr: ?@int = null text: ?@char = null That means there is now an explicit way to say “this pointer-like value may be absent,” instead of relying entirely on raw pointer habits from C (If you couldn’t tell by now, I despise C). What changed The main work was split across lexer, parser, and typecheck. I added: ? as a type marker in type positions is_nullable tracking in TypeInfo type rules for nullable pointer/reference values explicit compatibility for: assigning null into nullable pointer-like types comparing nullable values against null casting between @T and ?@T I also kept the scope intentionally narrow: this implementation is pointer-first nullable support , not full nullable scalars. So ?@int makes sense right now, but ?int is still deferred until I make a better semantic union / optional representation for plain values. Why this matters It would have been easy to overreach here and claim “nullable types are done,” but that would have been a big phat lie. Pointer-like nullability lowers naturally enough with the current backend and current compiler model. Scalar nullability, however, does not. Once you let int or bool become nullable, you need a more real representation for “has value / no value,” and that belongs in the later union work, not here. Result explicit absence compiler-owned semantics better future unions stronger type meaning without hidden magic The next real step after this is not more patching around null — I consider that done for now — but instead giving Flower the deeper machinery needed for nullable non-pointer values and semantic unions later in v1.4 so it doesn’t come back to bite me in my butt.
v1.4.4 Devlog: Giving Flower Real Semantic Union Types I made it so that semantic unions are now in Flower’s parser and type system — but not yet its codegen. The goal was to support types like: value: int | string next: @Node | null type Result = int | string What’s new The parser now understands | inside type positions and builds semantic union type information instead of relying on those old plain aliases or backend-shaped hacks. On the typecheck side, unions are now carried through normal type copying and alias resolution. That means named aliases like: type MaybeName = string | null make sense after resolution, instead of collapsing into nonsense. The typechecker also now accepts union-compatible usage in the places that matter for a foundation: variable initialization assignment parameter passing return checking alias resolution So if a value matches one union member, it is accepted. This is sorta implicit behavior, but I think it gets a pass due to its somewhat explicit nature? What it does not do yet This version was intentionally strict about using unions as values. You cannot yet directly: index a semantic union access a field on a semantic union use arithmetic / comparison operators on one print one directly Instead, Flower now requires an explicit cast before using a union value that way. That may sound harsh, but it is the right restriction.. for now. There is not any narrowing yet, so pretending unions were fully usable would just make the language lie and spit out 2,000 errors. Where this leaves v1.4 Flower now has: transparent type aliases null as a real type-system concept pointer-first nullable types semantic union type representation The next step is the part that will make unions actually usable rather than merely legal: narrowing with is better explicit extraction with as eventually making ?T truly become T | null instead of remaining pointer-first for now No fun screenshot this time :p just frontend work for now… Ivy, signing off <3
Devlog: is Checks v1.4.5 added is checks, mostly so code like this can work: if maybe_ptr is @int: real_ptr: @int = maybe_ptr end The idea is (fairly) simple: if the condition proves maybe_ptr is an @int , the inside of the branch should be allowed to treat it like one. Flower did not know how to do that before. It knew what a variable was declared as, but it did not really learn anything from control flow yet. Now it can, at least for the pointer/nullable-ish cases I care about first. This touched the parser, AST, typechecker, narrowing logic, and codegen. So, naturally, the “small feature” went everywhere. I’d actually consider this one of the bigger refactors so far, mostly because it added a new TypeAtom structure. Before this, types were still a bit too attached to the places they appeared, and all fell under the TypeInfo . That worked for simpler declarations, but is checks needed type syntax to have something the compiler could pass around to use for comparisons, validations, and narrowing. The parser had to recognize the new expression shape. The AST had to store the left side and the tested type. The typechecker had to make sure the test was allowed and not totally garbage. Then the narrowing logic had to say, “inside this branch, this variable has the proven type of x and therefore we won’t flag you for being an idiot.” That last part was where the bug goblin lived. I’m calling them a goblin because they were sneaky (and I also think it’s quite a funny and cute name). For a while, Flower had applied narrowing from the if body instead of the if condition, which meant the compiler saw this: if maybe_ptr is @int: real_ptr: @int = maybe_ptr end and somehow still failed on the assignment inside the branch. Very helpful. Thank you, compiler. EVen though it’s obviously 100% my fault, I made the compiler, but oh well!! Once I changed the narrowing step to inspect the actual condition expression, it started behaving like it should. The typechecker could see maybe_ptr is @int , attach that narrowed type to the branch scope, and allow maybe_ptr to be used as @int inside the guarded block. For now this explicitness is how I want it. There may come a time in the near future where I decide some implicity is ok, but we’ll see ;) is checks are the first real step towards control-flow-aware typing in Flower. Not full union support yet, but definitely the beginning of that road soon to come. Right now it mostly helps with nullable and pointer-like cases. Later, the same idea can support richer unions, better narrowing, and more type-driven control flow without making the programmer manually restate everything the compiler should already know. Also, it bootstrapped cleanly twice — which.. is obviously the bare minimum, but still!!
Devlog: Semantic Unions Become Actual Values (Part I) In v1.4.6 , I made semantic unions actual runtime values instead of just parsed/typechecked shapes. Before this, Flower could understand: type Value = int | string as a type. It could point at it and say, “yes, that is a union,” but that was mostly theoretical. The goal was to make this work-work for realsies: type Value = int | string value: Value = 7 if value is int: n: int = value as int end value = "Ivy" if value is string: s: string = value as string end That meant Flower needed more than TypeInfo.is_union = true . It needed a full path from syntax, to type proof, to lowered storage, to runtime extraction. Otherwise unions would just be fancy typechecker thingy-ma-bobbies, which is not very useful when the backend still emits C. What changed Instead of treating a union as a vague “one of these types, probably,” Flower now lowers it into a tagged structure. Conceptually, this: type Value = int | string becomes something like: struct Value { int tag ; union { int as_int ; flower_string as_string ; } data ; }; Not the final sacred form forever, but that is the shape of it: a tag saying which variant is active, plus storage for the possible members. Since Flower emits C right now, the lowering is C-shaped. I am not fully sure how I want this to look in ASM yet, but I do know it would be way more technical, and uglier. This required a few things to play nicely with one another: if value is int creates a union proof the guarded branch stores narrowing information value as int is only allowed after proof assignments pack values into the right tagged member explicit casts extract the right member from storage Otherwise the compiler is just writing checks its own backend cannot cash. The part that makes it ACTUALLY semantic For pointer narrowing, if value is T mostly refines how the compiler treats an existing value. For semantic unions, the check also becomes a runtime tag test. So this: if value is int: means: check the active tag of value , then inside this branch, treat it as the int variant. Then this becomes valid: n: int = value as int because the branch already proved the active variant. Without that proof, value as int should not be casually allowed. Flower is supposed to be explicit, not psychic, and I am not confident enough yet to implement a proper intuitive implicit checker without summoning something cursed. Assignment and extraction This: value: Value = 7 now packs 7 into the int member and sets the tag to the int variant. Then this: value = "Ivy" does the same thing, but for the string member. So a semantic union is not just some bytes, but rather a tagged runtime object where Flower knows which member is active. Then explicit casts like: value as string can lower into extracting the string member, but only when the typechecker has accepted that the operation is safe in that control-flow path. Why this checkpoint matters Flower can now store variant values, prove which variant is active, and require explicit extraction instead of relying on random magic I threw together. The flower has grown another concerning little organ.
Devlog: Letting Semantic Unions Work In Functions After getting semantic unions working in local declarations, the next problem was fairly obvious (and in my roadmap hehe). This did not work before: func make_value(): int | string return 7 end func accept_value(value: int | string): bool return value is int end Which was annoying, because int | string was already a real union type at this point. Flower could use it in locals, it could pack assigned values, it could check variants. But if I returned 7 from a function declared as int | string , or passed 7 into a parameter expecting int | string , the compiler did not know how to carry that union-lowering information across the boundary. This has been one of the easier changes I’ve made in a long while. It compiled properly first try (if you ignore a tiny misspell I made which I fixed really quickly), and there were no prior hidden bugs that surfaced. This.. is too suspicious. What changed The compiler now carries semantic union info through: function parameters function returns imported alias calls If a function expects: int | string and I call: accept_value(7) typecheck records that 7 needs to be packed as the int member of that union. Same for returns: func make_value(): int | string return 7 end That matters because codegen cannot guess later due to the separation of responsibilities I’ve laid out. By the time Flower is emitting C, it needs to know which tag to set and which member to write. Lowering it properly Codegen already knew how to pack union values for declarations and assignments. The missing part was doing the same thing for call arguments and return statements. So now a value can be packed into a tagged union when it is: stored locally passed into a function returned from a function Alias calls got handled too, so things like: remote.accept(11) remote.make_string() do not become their own weird little cursed island. Why this mattered Without this, semantic unions only worked as long as I never organized my code. They worked in local tests, but not in helper functions, imported providers, or normal inputs and outputs. Now union values can actually move around the program instead of being trapped in the one scope where they were declared — and for me, forgotten! Very exciting, the union can leave the house. They grow up so fast ⁎⁍̴̛ ₃ ⁍̴̛⁎
Devlog: Adding Obvious Branch-Local Inference to Flower Before this, narrowing mostly worked in the obvious “true branch” cases: if maybe != null: real: @int = maybe end and: if value is string: s: string = value as string end But the else branch was still kind of standing there empty-headed, even when the meaning was extremely obvious. Like, if this happens: if maybe == null: return false else: real: @int = maybe end then inside the else , maybe is clearly not null. So now it doesn’t!! What changed Flower now does branch-local narrowing in else for small, explicit cases. That means these now work: if maybe == null: return false else: real: @int = maybe end and: if value is int: return false else: s: string = value as string end It is only applying inference when the condition says something directly and the opposite branch has one obvious meaning. Nullable narrowing For nullable pointer-like values, Flower now understands both sides of simple null checks: if x != null narrows x to non-null in the if body if x == null narrows x to non-null in the else body the opposite side can narrow to null when that is the only meaning left Semantic union narrowing The same idea applies to semantic unions, but a bit more ‘held back.’ Essentially, if Flower sees: if value is int: then the if branch narrows to int , like before. Now, if the union only has one other possible member, the else branch can narrow too. So for: int | string the else after if value is int can be treated as string . This is not full control-flow wizardry, since it doesn’t reason across deep boolean chains, early-returns, or giant branches yet. It is deliberately small and local, because I do not want Flower “helping” so much that I need a detective board to figure out what type something is.
Devlog: Teaching Flower to Understand Guard Clauses gave Flower branch-local inference. Last update, I added support for branch-local inference, so the compiler could understand things like: if maybe == null: return false else: real: @int = maybe end and: if value is int: return false else: s: string = value as string end That was an improvement, but it still meant narrowing stopped at the end of the branch. That meant stuff like returninging in some conditions still did not really work as naturally as it should: if maybe == null: return false end real: @int = maybe or: if value is string: return false end n: int = value as int In v1.4.9 I fixed that. What changed Now narrowing propagates past very obvious guard clauses. If one branch definitely returns and the other falls through, the compiler now carries the interpretation forward after the if . This means that the compiler can now understand: after if x == null: return ... , x is non-null after if x is string: return ... , a two-member semantic union can narrow to its remaining member I kept this intentionally conservative for now. The compiler is not doing full control-flow analysis yet. It is only recognizing the simplest and most explicit early-exit shape. How it works The main addition was a small semantic check for “does this branch definitely return?” Right now that means: direct return if where both branches definitely return Once the compiler knows one side exits and the other survives, it applies the branch’s narrowing to the following statements. Yea.. that’s it lol.
Devlog: Making ?T Actually Mean T | null Before v1.4.10 , ?T was treated as its own nullable system and not really integrated with the rest of the semantic unions. This was unideal, because it created a separation of logic which was cumbersome to maintain. The idea was to make the following be the default: ?int == int | null ?string == string | null ?@int == @int | null Prior to the refactor, nullable types were still mostly pointer-oriented. That worked when ?T basically meant “maybe this pointer is null,” but it did not really fit anymore once semantic unions became actual runtime values. If Flower has T | null , then ?T should use that instead of being its own special thing. This is a more pragmatic choice, as it keeps the compiler easier to manage and update later on. What changed Typecheck now lowers ?T into the same semantic-union machinery used by normal unions. That means nullable values now go through the same general path as union values: null checks use union-aware narrowing narrowed nullable values can be extracted with as codegen emits tagged union storage assignments pack into the right union member So this now works as an actual nullable flow: maybe: ?@int = raw if maybe == null: return false end real: @int = maybe as @int The annoying part is that Flower has to track two things at once: the type the programmer is allowed to see after narrowing, and the actual union shape that remains underneath it. After the guard, maybe behaves like an @int . But codegen still has to remember it came from @int | null , because apparently the compiler cannot simply “vibe” its way through storage layout. Tragic! The bugs that annoyed the heck out of me Most of the work was not surface syntax. The syntax was just standing nearby looking innocent. The actual bugs were in the places where Flower knew “this is non-null now,” but then forgot how to lower, such as: narrowed nullable values falling back to raw C casts like (int*)(maybe) false branches of == null / != null narrowing to the wrong side (this was my fault lol) null getting packed into the wrong union member That last one was the rude one. For ?@int , generated C could end up doing something like: . tag = 1 , . m0 = NULL instead of packing into the actual null member. So the value looked almost right, but the tag/member pairing was wrong. Then later null checks would fail, because the compiler had technically put null somewhere. Just not the correct somewhere. Very helpful. The fix was separating two questions I had accidentally merged: is this type compatible with this union? which exact union member should this value occupy? Those look related, but they are not the same question. Flower was using the first answer for the second problem, and then acting surprised when everything became soup. Where this leaves Better Types ?T now lowers through the same path as T | null , which means null checks, narrowing, extraction, and storage all line up with the semantic union model. This should make later work cleaner, such as nullable inference, nicer union ergonomics, maybe pattern-like narrowing eventually. Not easy. I am not saying easy near a compiler. That is how they hear you. You do not want them to hear you ..
Devlog: Direct Semantic Union Parameters Now instead of having to do this workaround: type Value = int | string func accept(value: Value): bool You can just pass semantic unions directly: func accept(value: int | string): bool That was it. All I had to do was remove a stale type_error clause in register_params and allow binding variables. Then I updated the two relevant accept functions in /examples.
Devlog: Letting Union Narrowing Follow Field Access Before v1.4.13 , union narrowing only really worked when the thing being narrowed had a variable name due to almost every similarity check relying on name_start and name_length . This was dumb, because semantic unions already knew how to test tags and extract members. Codegen was not the issue, but rather the annoying part was that the typechecker could remember this: if value is int: n: int = value as int end but not this: if box.value is int: n: int = box.value as int end So I still had to do a little temp-variable ritual: tmp: Value = box.value if tmp is int: n: int = tmp as int end Which was gross. Not necessarily catastrophic, just gross and annoying. I wanted needed convenience What changed The compiler was remembering narrowings by variable name, not by expression shape, so box.value looked obvious in source (to me, at least), but to the typechecker it was basically some random expression and not something it could reliably recognize again later. A variable name already had a stable identity, whereas field access chain did not. So the change was to let narrowable expressions represent more than just AST_VAR_REF . For now, that only means stable dot-access chains. The typechecker can record a narrowing for an expression like: box.value and then recognize the same expression later when a cast shows up. So this works directly now: if box.value is int: n: int = box.value as int end Same for the other union members, like string . The detour My first example accidentally wandered into a different feature: if maybe_box.value != null: That exposed a real nullable-field-guard gap, but that is not what this was supposed to be about. Very rude of the test case to have ambition hmph >:( Where this leaves it Semantic union narrowing now persists past field access — at least for stable dot-access chains — and the temp-local is no longer needed. Butttt now I gotta work on nullable-field-guards, ugh (hehe)
Devlog: Finishing Nullable Field Narrowing At this point, Flower could already narrow semantic unions through field access in the is / as case, and nullable field checks were supposed to be the obvious follow-through: if maybe_box.value != null: label: string = maybe_box.value as string end Instead, I had forgotten to remove a LOT of stale code, and thus part of it was still behaving like only plain local variables could ever be narrowed. There was also a second, smaller mismatch hiding, where null in type position was not lining up with the compiler’s actual internal null representation. ?string and string | null weren’t leading to a congruent output and at times were wobblier than they should be. So the fix was mostly cleanup, but the meaningful kind: make null in type syntax lower the same way the compiler expects remove the stale var-only branches in nullable narrowing let stable field paths like maybe_box.value and holder.box.value narrow properly The funny part is that this felt bigger initially than it actually was once fixed. Nothing fundamentally new had to be invented, I just had to stop the old code from interfering with the newer code, which once I figured out how to do so it was quite quick. I spent an embarrassingly long time figuring it out…
Devlog: Syncing Flower’s Docs Back to Reality Just a doc cleanup lol. No code change or compiler updates. Probably did more than needed for now but oh well! The mismatch was REALLY bad. The old docs preserve old assumptions, and someone reading them could walk away with a version of Flower that no longer really exists (or, in some cases, doesn’t exist yet or never ever existed)! What changed I updated the docs that had drifted the most from reality (relatable): README.md now reflects the current type-system shape ROADMAP.md treats v1.4 as accomplished the v1.4.0 milestone doc now includes more of the outcome, not just the original plan contributor docs no longer have stale semantics structure.md is more accurate to what Flower currently is, and what still needs a fuller rewrite later Yea, that’s it.
Devlog: v1.5.1 – v1.5.5 Following all of the changes Flower has undergone, I felt it was time for some much-needed documentation. On paper this was supposed to be fairly quick, simple, and not require much brain power. Unfortunately for me I got a bit too over-zealous, and included things I thought should work, but in reality hadn’t. For example, in a lot of the code snippets I’d have something like: for i in range 0..10: print(i) end Printing non-string values was not yet supported in Flower. To fix this, I took a small detour back to v1.4 and implemented support for it — mostly in a single codegen case: if ast.data._print.value_type.base == TOKEN_FLOAT or ast.data._print.value_type.base == TOKEN_DOUBLE: fprintf(out, "printf(\"%%f\", ") gen_expr(ast.data._print.value, out, src) fprintf(out, ");\n") end Afterwards I added more smoke-tests in examples/io/print.flo . Every few runs, however, I’d get a segfault. This was especially odd because it wasn’t simply an error but rather a silent memory bug. Eventually I found out where it was originating — thanks, ASan! Turns out after the new type system changes, I had forgotten to initialize some values to null / 0 in for loop handlers and a few other places. I just added typeInfo.data = null / 0 where applicable and it fixed the issue! What is v1.5, and why is this devlog so long? To answer the latter first.. I lowkey just forgot to post a devlog for the first two docs I made. That’s it. For the former question, v1.5 is supposed to be explicitly a documentation pass. First thing I worked on was structure. I cleaned up the docs layout, moved things toward a more consistent lowercase docs/ tree — I had been trying for so long to do that and I just finally got it to work — and wrote down the documentation process itself so new pages aren’t just floating about. The point was to try and make the docs feel like a book instead of a folder full of unrelated notes. I wrote and checked the language pages for types, functions, and control flow by reading the compiler itself, not by trusting my (poor) memory. That meant checking parser rules, typecheck behavior, codegen boundaries, and example files before writing anything solid. Types especially needed this, given how Flower now has enough real type machinery that the docs can quickly go from being coherent to completely incorrect: nullable sugar, semantic unions, explicit casts after narrowing, alias behavior, current member limits, and the difference between what the language wants to become and what the compiler supports currently. Functions and control flow had a similar issue. I had to document prop , return rules, direct call forms, logical conditions, range-based for , and the rough edges like break and continue not yet being enforced cleanly as loop-only. That kind of thing is small until someone learns the language from the docs and hits the edge head-first (been there, done that). What Now? I’m just going to keep writing docs. Maybe do one devlog for every new doc, or a batch of docs, who knows! I certainly don’t :p
Hey, it’s been a while! I’ve been finding it difficult to stay motivated for this project, especially with how the new payout system works and just my in-general inability to keep commitment despite having a lot of passion. That said, I am going back to working on this diligently, and I think to start I’m going to cut down on the documentation by making perhaps one or two changes, and then going right back to the compiler work. Documentation writing has not been the most fun for me, especially with how long it takes and how it’s so difficult to not only write language reference that works, but also keeping the same whimsy Flower should have. Thank you to everyone who’s been following this journey, and I can’t wait to see y’all later!!! With Love, - Ivy <3
Integer Types, Parser Fixes, and Segfaults! Phew — this one was biiiiiggg. Flower is pretty much just a glorified C transpiler, which is NOT what I want for it! In order to move on, the data has to be handled explicitly by the FloC. So essentially, I implemented i8 , u8 , i16 , u16 , i32 , u32 , i64 , and u64 . For now, int canonically refers to an i32 value. A New Era? With these new literals, the old hoist-sized representation had to go. The decimal source text is preserved, meaning values such as 18446744073709551615 remain after parsing without causing any overflow. Types are picked up from declarations, assignments, function arguments, return values, field writes, array-element writes, * breath in * and binary expressions! Oof, that was a mouthful. That, of course, resulted in proper errors for things like: 256 assigned to u8 −1 assigned to an unsigned type values beyond u64 unconstrained literals outside the default i32 range I Hate Memory During printing, every width is handled. Integer conditions retain existing zero / nonzero behavior, and literal types print their values rather than a character. Halfway through, I ran into sudden segfaults and memory leaks. I was taken aback, because I didn’t even change anything parser related yet. Turns out, I forgot an assignment in a declaration, which apparently the parser wasn’t able to handle (whoops!). Anyways, I fixed it by propagating errors through the compilation process, so the compiler doesn’t try to typecheck or code gen if the parser reports back errors, and instead will print them out. And that’s it! Not that’s it, but that’s all I’m going to explain for now. More specifics available on the GitHub, of course. Speaking of GitHub thank you so much to S1monr3dst0ne07 on GitHub for fixing some memory leaks in the previous version of Flower — I forgot to prune allocations before returning from a function :p Love y’all!! <3 P.S.: So glad I gave up on documentation, I was genuinely dreading workong on the project and that’s why I’ve been ianctive for a long time :c
Integers, Integers, Integers Hello!! Been a while :) Lately I have been working on v1.6. I call it the “Usefullness” update — rhymes with Grug — because it adds a ton of long awaited features and various convenience implementations Flower DESPERATELY needs. For example, currently the progress has to do with v1.6.1, or Fixed-Width Integers . When it comes to systems programming and in-general efficiency, having various integer sizes is important as it provides an additional layer of manual control over memory and sizes. I know I would have to add them eventualy, so why not put them at the start of the Usefulness update?? I’m sure they’ll come in handy later on. What Actually Changed? Well, for starters, there’s now fixed-width integers (yay)! They’re built in types, so you declare them as you would with any other atom / primitive: type Byte = u8 type Choice = Byte | u16 type OptionalByte = ?Byte struct Packet { pair: Byte[2], size: Choice, owner: OptionalByte } A whole bunch of commits and integer-specific changes regarding indices, arity, unions, nullables, etc etc etc have been made, and they all won’t fit here so instead, take a look at the current branch ! What’s In Store? Plenty more features, you can assure yourself! There’s maybe 6 or 7 — I swear — or so commits left for this specific addition, and after that a lot more features laid out in the roadmap for 1.6! As always, thanks for sticking around and watching the fiasco that is this project become more and more estranged with every hour. Love y’all!! Ivy <3
Ships:
Flower is a self-hosted programming language for writing simple, explicit systems code without the abstraction bloat and OOP-heavy direction a lot of modern languages have. The compiler is written in Flower itself, currently targets C, and follows a straightforward pipeline: lexing, parsing, module loading, typechecking, and code generation. Over the past few months, Flower grew from a small lexer/parser/codegen experiment in C into a way bigger language project than I couldv’e imagined. This wasn’t my first attempt at a language, but it has been my favorite! I implemented compiler-enforced module semantics, stronger type-aware codegen, real boolean support, real string support, and a small standard library foundation. Strings now have equality, .length, indexing, and explicit casts to and from @char , while modules support exported prop declarations, aliases as namespaces, and private-by-default top-level declarations. The hardest part was bootstrap stability. I ran into idempotency failures, parser edge cases, compiler corruption scares, and plenty of my own bad logic. A lot of the challenge was getting new features to work not just once, but consistently enough for the compiler to rebuild itself cleanly. One bootstrap it succeeds, and then the next I’m scrambling to figure out why the new binary executable has a corrupted parser despite just working (Still haven’t fixed that yet! It.. was really confusing and I’ve got no clue why it happened lol). I’m proud that I kept pushing through that and ended up with something much more fun to use than where I started — I mean, I don’t even have to write that much C anymore!! If people want to test Flower, the important thing to know is that it is self-hosted and still experimental, but it does work. The repo includes a bootstrap path, a test suite, and example programs covering types, control flow, memory, imports, strings, and bools. The current release is focused on making the core language feel real and usable before moving on to a larger standard library and a future non-C backend, so don’t be surprised if a C file is shoved in your face!
The compiler is written in Flower itself and currently targets C, so this release was mostly geared towards making the type system have actual Flower semantics instead of a thin little blanket over whatever the backend happened to be doing. The big additions in v1.4 were: transparent type aliases real null nullable types as ?T == T | null semantic unions like int | string explicit narrowing with is explicit extraction with as That support now works across locals, parameters, return types, struct fields, and stable field-expression chains. The work had to touch parser logic, typecheck, narrowing, lowering, codegen, bootstrap, and then all the weird regressions those changes politely dragged into the room. It was.. a process for sure What I’m most proud of is that v1.4 pushed Flower toward a clearer identity that wasn’t defined by C as much anymore. This release also brought the docs back in line with the compiler, which was LONGGGGG overdue. If you want to test it, the main things to look at are the Better Types examples and the self-hosting flow. The compiler should bootstrap cleanly, the test suite should pass, and the examples now cover aliases, nullable values, semantic unions, inference, and struct/field narrowing behavior. For those who will be testing it, DO NOTE that I develop exclusively on my MacBook which is a UNIX system! I do not have the ability to properly develop and provide releases for Linux-specificalities or non-POSIX systems. I’m extremely sorry for this, but alternatively watch the provided video to see Flower in action :) If you’re not able to test it, watch this short (crappy) video instead: https://youtube.com/shorts/DyPtIru6cjY?feature=share...
|
1792832116.6829321
|
1792918516.6829321
|
|
6676
|
GenericOS by @Jack_ | Stardance
|
Jack_
|
2
|
27.0
|
329
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-10T22:01:54Z", "hours": 11.0, "multiplier": 14.97, "payout": 165, "blessing": "neutral", "text": "GENERIC OS This started out as me learning HTML and CSS. Looking back through older files, when I started this a month ago, I can see how much I’ve grown. Even since the first ship of this project, I can see the improvement and learning. I love coding, and I love how Hackclub has inspired and motivated me to make things like this. Thank you for taking the time to review this project. Hackclub, thank you so much for providing such an amazing program to help people like me. I hope to join you one day and look up to the way the organization is run and it’s staff. CHANGES SINCE LAST SHIP Three additional apps (browser, file explorer, about) Additional UI (Start menu, bootloader, etc.) Architectural changes to organization Much much more! BIGGEST SUCCESSES Proficiency in learning HTML/CSS and JS Working functional apps backed with a reliable infastrucutere Meeting a kind community of people who can help me Git structure of branches and learning how to use git in terminal Also the file explorer I am very proud of BIGGEST CHALLENGES Lowk stupid bugs that I shouldve been able to fix in 10 seconds but couldnt see for some reason All other challenges have been overcome thanks to an amazing community :D Thank you hackclub and thank you reviewer!", "repo": "https://github.com/Jack-Jacobson/GenericOS", "demo": "https://genericos.jackjacobson2011.com"}, {"ship_num": 2, "ts": "2026-06-10T03:27:54Z", "hours": 16.0, "multiplier": 10.72, "payout": 164, "blessing": "neutral", "text": "Meet GenericOS. This was my first web design project, it features many draggable apps, playable games, and interactive experiences. This was NOT created through the guide for the program, but still inspired by its ideas. I made all code, formulated all direct ideas,and created my OS all myself. I am very proud of it, spent a significant amount of time and effort on it, and am very excited to see what everyone things. PLEASE LEAVE CONSTRUCTIVE FEEDBACK, I want to know how I can improve. Thank you for taking the time to check out my project. Also thank you HackClub and everyone involved in it, it is an amazing company run an amazing way, it is truly inspiring and an admirable cooperation. I love the transparency, people, and services provided. Thank you for giving people like me an opportunity to make things like this. Please review the readme in the Github repository for information on how I built the project, as well as what it features and how you can modify it. If you like this and want to support me, check out my portfolio linked on the github. Thank you all again, and if you are from Hackclub reading this, y’ll are amazing people doing amazing work.", "repo": "https://github.com/Jack-Jacobson/GenericOS", "demo": "https://genericos.jackjacobson2011.com"}]...
|
[{"post_id": 26227, "ts": "202 [{"post_id": 26227, "ts": "2026-07-10T21:53:57Z", "hours": 1.1322, "text": "OVERVIEW: Sorry for another short devlog. Polished, fixed bugs, adding commands, adding saving. I have decided that I am going to do my second ship! I do plan on working more on this in the future prolly maybe. NEXT STEPS: Ship! CHALLENGES: More localstorage stuff and working with file ids for the file manager was fun and interesting to learn about More writing for the readme"}, {"post_id": 26138, "ts": "2026-07-10T19:13:10Z", "hours": 2.6919, "text": "OVERVIEW: Added a file explorer! Sorry for the three days wait, but this is a bigger app than normal. it allows you to create file structures and files. Currently the only file you can open are .txt files, however. These .txt files open in the notepad. Find the secret file and decode it for a surprise! NEXT STEPS: Add editing .txt files and saving them with file explorer prepare to ship Terminal commands update CHALLENGES: The biggest reason it took this long to make the app was that I had to redo the entire code for opening folders and files. I had it set so every click it would re-render the explorer (makes sense in my head). The rendering resets the DOM and makes the original element you click on a new identical element. However, to open a file you need to double click it. This wasn’t working, and it took my a bit of research to find out why. The way HTML decides if something is a double click is if you rapidly click the same element twice. Resetting the DOM meant the this element would change every click. So, I had to redo the system to only render when necessary, which required a significant overhaul of the javascript"}, {"post_id": 24357, "ts": "2026-07-07T21:24:09Z", "hours": 2.0156, "text": "OVERVIEW: Added about app! Has slideshow which can be easily adjusted to tell you about features of the os, this is to help reviewers understand how the site works. Also noticed an issue where it doesnt look great because asstes werent loading, hence the boot screen! It has a progress bar which says what its lodaing! Backed to being locked in the btw. NEXT STEPS: More apps Readme update More commands for terminal (things that actually do things) CHALLENGES: Dynamically reading DOM to get all images that need to be loaded Styling the about app to make it helpful but also reasonable to make Git being weird (ended up making a few custom commands to interact with the remote)"}, {"post_id": 23898, "ts": "2026-07-07T03:14:17Z", "hours": 1.1811, "text": "OVERVIEW: Hi! Sorry for the long wait between dev logs (again). Ive had to just deal with some things recently and havent had time for this. Added a start menu that allows you to search apps or search the web This is a smaller feature, but dont worry, much more is to come. NEXT STEPS: Intro app to say features Other apps CHALLENGES: Interacting with other parts of my code in this part of the code hsa been fun to prove to myself how upgraded my organization is Also enjoyed using more of css modification within JS as opposed to just writing more css which I am very tired of"}, {"post_id": 22319, "ts": "2026-07-04T18:40:56Z", "hours": 1.4758, "text": "OVERVIEW: Added a changable background, added movable desktop icons. Sorry for taking a break in development for a few days, I haven’t been locked in. Happy Fourth of July to those who celebrate. NEXT STEPS: Additional app Start menu Into that tells you what you can do CHALLENGES: I was having issues getting to the browser icons to move on the site, it was working locally but wasnt working and gave no errors when pushed to the site. Still coulden’t tell you how I got it working. Had to store the bcakground in a local storage on the computer, i havent messed arounf with that before and I found it very fun."}, {"post_id": 19596, "ts": "2026-06-30T23:03:17Z", "hours": 2.5453, "text": "OVERVIEW: Sorry for there not being a devlog in while, I took a break on this project to work on some other things (jame gam + other Stardance projects). However, I have read and greatly appreciate my feedback from my previous ship and added the most common suggestion, a browser! A simple browser with multiple tabs, access to the general web, and all in the same window system that already exists! NEXT STEPS: Movable window icons Bookmark system Another game? CHALLENGES: It turns out, most major websites do not support being embedded in other sites. For example, google. I spent a while trying to get around this with proxies, different apis, and different methods, however found all to be insufficient. Eventually I found workaround involving modifying the urls of the site, which I have hardcoded into the script. Learning how to use iframes was fun and interesting, although the parameters of them I found quite confusing."}, {"post_id": 5988, "ts": "2026-06-10T01:26:17Z", "hours": 1.75, "text": "OVERVIEW: Very sorry for the short devlog but finished readme, fixed bugs. No real new features were added, but prepared for final release, fixed bug with deployment to demo site and made sure everything works as expected on it. . NEXT STEPS: Confirm no bugs are present Ship! . CHALLENGES: I have trouble making readmes, but it was a lot of fun to research what goes into them and why they matter. I enjoyed creating it, and cant wait to share it with everyone!"}, {"post_id": 5101, "ts": "2026-06-08T19:49:42Z", "hours": 1.5072, "text": "NOTE FOR VIDEO : The lag is because my computer is terrible, without screen recording there is no lag. This will not an issue for you most likely. (also check out my mad minesweeper skills) . OVERVIEW: Finished minesweeper! There is now a fully working minesweeper game. It generates the game and works similarly to the original minesweeper game. It took less time than expected thanks to my existing framework. . NEXT STEPS: Polish Prepare for ship . CHALLENGES: Debugging is difficult as this is the most javascript I have written for the project Using JS to create and modify CSS, a lot of the styling was written in javascript as opposed to directly in the css files, I did this because the game was constantly changing and hence required constant stylistic changes, as well as to challenge myself in new ways."}, {"post_id": 4640, "ts": "2026-06-08T01:17:17Z", "hours": 3.1639, "text": "NOTE FOR VIDEO : The lag is because my computer is terrible, without screen recording there is no lag. This will not an issue for you most likely. . OVERVIEW: Added framework for a minesweeper game. Also fixed a lot of general bugs. Prepared my portfolio site at https://jackjacobson2011.com to publish the project. Please note the portfolio itself is not a part of the project but was included in this devlog for the sake of demonstrating the effort put into the easy access of my project. . NEXT STEPS: Finish game Upload to website Polish . CHALLENGES: Figuring out where the root cause of bugs were (usually from hard-to-catch typos) Utilizing global functions to simplify code"}, {"post_id": 3717, "ts": "2026-06-06T19:25:37Z", "hours": 1.5114, "text": "NOTE FOR VIDEO : The lag is because my computer is terrible, without screen recording there is no lag. This will not an issue for you most likely. . OVERVIEW: General quality of life update! Added window snapping, to both sides and the top to maximize. Added window focusing system, allow use of multiple apps at once and better general use. Also on the backend, split the index.html file into a much more organized multi-file system! This allows for much better readability, sharability, and bug fixing. Also fixed various bugs throughout OS. . NEXT STEPS: Add game General polishing . CHALLENGES: Having multiple files introduced the need for global functions. I was very confused when many different scope and definition errors. I learned how to make everything usable globally, which simplified a lot for code and fixed errors. The snapping introduced very interesting behaviors with how the window is dragged and used, fixed by using various prevState variables and dissecting behaviors to see how they happened."}, {"post_id": 2891, "ts": "2026-06-05T19:54:46Z", "hours": 0.7528, "text": "OVERVIEW: Added a functional power menu. Currently, there are two options in the menu, restart and power off. Restart reloads the tabs, power off attempts to close the tab, although most browsers wont allow it so it gives you a pop up. . NEXT STEPS: Add some sort of game (im thinking snake) Add window focusing system Split file into multiple (1000 lines in one html file might be a bit much) CHALLENGES: Learned how to use classes in HTML, making cleaner and easier code"}, {"post_id": 2578, "ts": "2026-06-05T04:55:28Z", "hours": 1.49, "text": "OVERVIEW: Finished the terminal app! It turned out to be a very interesting project. It works by having a certain input, where it checks a separate file to see if that input has a designated output, and then gives the output. Works very well, and looks great! NEXT STEPS: Add some sort of game to the OS Make terminal actually change things on the OS? Power Menu CHALLENGES: Input is a very weird tag, caused a lot of bugs that had to be squashed I very rarely use separate files, figuring out how to implement that and how it makes my code simpler and cleaner was a great experience."}, {"post_id": 2426, "ts": "2026-06-04T22:04:29Z", "hours": 1.9433, "text": "NOTE FOR VIDEO : The lag is because my computer is terrible, without screen recording there is no lag. This will not an issue for you most likely. OVERVIEW : Added the framework for a terminal app! It shouldn’t have been much work, but I encountered a lot of bugs with the general system. The taskbar behaves better, and soon there will be a terminal. NEXT STEPS: Make terminal functional, certain word input –> certain words for output. Help command to list things, info about project, joke commands, etc. Add power menu, where shut off closes tap, restart reloads it, etc. CHALLENGES: This has been a challenge throughout the whole project, though I haven’t talked about it yet but arrow functions! I’ve heard they’re much more efficient than other ways of doing it, but I didn’t know how to make them. Research and practice now makes it so all of my events are using arrow functions Design challenges, deciding what behaviors I want when certain things are pressed, and how to prioritize certain things in the OS."}, {"post_id": 1899, "ts": "2026-06-04T03:49:29Z", "hours": 1.2858, "text": "OVERVIEW: Added and refactored code to make the notepad app usable! You can open it and use it from the taskbar and the dekstop, type and save text in the editor, and maximize and move the window. NEXT STEPS: Add more apps, specifically a “terminal” where you can see certain things and kinda just mess around Start menu to search and start apps? Bootup page CHALLENGES: text input tag is new to me, so its parameters and making it stay inside the window was difficult. Taskbar had weird app performance with glitches being common when clicked"}, {"post_id": 1735, "ts": "2026-06-03T22:21:13Z", "hours": 1.5256, "text": "OVERVIEW: Added framework for apps! Created a way to add icons to the desktop, click to open them, drag around the windows, and control the windows using button, implemented 12 hour time clock, confirmed it worked with different time zones. NEXT STEPS: Add functionality to notepad Fix bugs with maximized windows (task behaving weird) Add more apps CHALLENGES: Javascript behaving weird with editing document features for the windows Dragging difficult to implement, wasn’t working when in certain places or when mouse moved in certain ways creating something that looked actually niceish (this is good enough, right"}, {"post_id": 1669, "ts": "2026-06-03T20:13:17Z", "hours": 1.4689, "text": "OVERVIEW: Worked to display an image in the background (currently windows xp, might be updated to something custom in the future). Added a clock to the bottom right. NEXT STEPS: 12hr format, test how it responds to different timezones Notepad app? CHALLENGES: spent time trouble shooting clock javascript, forgot to properly define a variable (had const now = date instead of = new date) Had issue with line that sets background because I put the wrong path to image"}]...
|
Title: GenericOS by @Jack_ | Stardance
Devlogs:
O Title: GenericOS by @Jack_ | Stardance
Devlogs:
OVERVIEW: Worked to display an image in the background (currently windows xp, might be updated to something custom in the future). Added a clock to the bottom right. NEXT STEPS: 12hr format, test how it responds to different timezones Notepad app? CHALLENGES: spent time trouble shooting clock javascript, forgot to properly define a variable (had const now = date instead of = new date) Had issue with line that sets background because I put the wrong path to image
OVERVIEW: Added framework for apps! Created a way to add icons to the desktop, click to open them, drag around the windows, and control the windows using button, implemented 12 hour time clock, confirmed it worked with different time zones. NEXT STEPS: Add functionality to notepad Fix bugs with maximized windows (task behaving weird) Add more apps CHALLENGES: Javascript behaving weird with editing document features for the windows Dragging difficult to implement, wasn’t working when in certain places or when mouse moved in certain ways creating something that looked actually niceish (this is good enough, right
OVERVIEW: Added and refactored code to make the notepad app usable! You can open it and use it from the taskbar and the dekstop, type and save text in the editor, and maximize and move the window. NEXT STEPS: Add more apps, specifically a “terminal” where you can see certain things and kinda just mess around Start menu to search and start apps? Bootup page CHALLENGES: text input tag is new to me, so its parameters and making it stay inside the window was difficult. Taskbar had weird app performance with glitches being common when clicked
NOTE FOR VIDEO : The lag is because my computer is terrible, without screen recording there is no lag. This will not an issue for you most likely. OVERVIEW : Added the framework for a terminal app! It shouldn’t have been much work, but I encountered a lot of bugs with the general system. The taskbar behaves better, and soon there will be a terminal. NEXT STEPS: Make terminal functional, certain word input –> certain words for output. Help command to list things, info about project, joke commands, etc. Add power menu, where shut off closes tap, restart reloads it, etc. CHALLENGES: This has been a challenge throughout the whole project, though I haven’t talked about it yet but arrow functions! I’ve heard they’re much more efficient than other ways of doing it, but I didn’t know how to make them. Research and practice now makes it so all of my events are using arrow functions Design challenges, deciding what behaviors I want when certain things are pressed, and how to prioritize certain things in the OS.
OVERVIEW: Finished the terminal app! It turned out to be a very interesting project. It works by having a certain input, where it checks a separate file to see if that input has a designated output, and then gives the output. Works very well, and looks great! NEXT STEPS: Add some sort of game to the OS Make terminal actually change things on the OS? Power Menu CHALLENGES: Input is a very weird tag, caused a lot of bugs that had to be squashed I very rarely use separate files, figuring out how to implement that and how it makes my code simpler and cleaner was a great experience.
OVERVIEW: Added a functional power menu. Currently, there are two options in the menu, restart and power off. Restart reloads the tabs, power off attempts to close the tab, although most browsers wont allow it so it gives you a pop up. . NEXT STEPS: Add some sort of game (im thinking snake) Add window focusing system Split file into multiple (1000 lines in one html file might be a bit much) CHALLENGES: Learned how to use classes in HTML, making cleaner and easier code
NOTE FOR VIDEO : The lag is because my computer is terrible, without screen recording there is no lag. This will not an issue for you most likely. . OVERVIEW: General quality of life update! Added window snapping, to both sides and the top to maximize. Added window focusing system, allow use of multiple apps at once and better general use. Also on the backend, split the index.html file into a much more organized multi-file system! This allows for much better readability, sharability, and bug fixing. Also fixed various bugs throughout OS. . NEXT STEPS: Add game General polishing . CHALLENGES: Having multiple files introduced the need for global functions. I was very confused when many different scope and definition errors. I learned how to make everything usable globally, which simplified a lot for code and fixed errors. The snapping introduced very interesting behaviors with how the window is dragged and used, fixed by using various prevState variables and dissecting behaviors to see how they happened.
NOTE FOR VIDEO : The lag is because my computer is terrible, without screen recording there is no lag. This will not an issue for you most likely. . OVERVIEW: Added framework for a minesweeper game. Also fixed a lot of general bugs. Prepared my portfolio site at https://jackjacobson2011.com to publish the project. Please note the portfolio itself is not a part of the project but was included in this devlog for the sake of demonstrating the effort put into the easy access of my project. . NEXT STEPS: Finish game Upload to website Polish . CHALLENGES: Figuring out where the root cause of bugs were (usually from hard-to-catch typos) Utilizing global functions to simplify code
NOTE FOR VIDEO : The lag is because my computer is terrible, without screen recording there is no lag. This will not an issue for you most likely. (also check out my mad minesweeper skills) . OVERVIEW: Finished minesweeper! There is now a fully working minesweeper game. It generates the game and works similarly to the original minesweeper game. It took less time than expected thanks to my existing framework. . NEXT STEPS: Polish Prepare for ship . CHALLENGES: Debugging is difficult as this is the most javascript I have written for the project Using JS to create and modify CSS, a lot of the styling was written in javascript as opposed to directly in the css files, I did this because the game was constantly changing and hence required constant stylistic changes, as well as to challenge myself in new ways.
OVERVIEW: Very sorry for the short devlog but finished readme, fixed bugs. No real new features were added, but prepared for final release, fixed bug with deployment to demo site and made sure everything works as expected on it. . NEXT STEPS: Confirm no bugs are present Ship! . CHALLENGES: I have trouble making readmes, but it was a lot of fun to research what goes into them and why they matter. I enjoyed creating it, and cant wait to share it with everyone!
OVERVIEW: Sorry for there not being a devlog in while, I took a break on this project to work on some other things (jame gam + other Stardance projects). However, I have read and greatly appreciate my feedback from my previous ship and added the most common suggestion, a browser! A simple browser with multiple tabs, access to the general web, and all in the same window system that already exists! NEXT STEPS: Movable window icons Bookmark system Another game? CHALLENGES: It turns out, most major websites do not support being embedded in other sites. For example, google. I spent a while trying to get around this with proxies, different apis, and different methods, however found all to be insufficient. Eventually I found workaround involving modifying the urls of the site, which I have hardcoded into the script. Learning how to use iframes was fun and interesting, although the parameters of them I found quite confusing.
OVERVIEW: Added a changable background, added movable desktop icons. Sorry for taking a break in development for a few days, I haven’t been locked in. Happy Fourth of July to those who celebrate. NEXT STEPS: Additional app Start menu Into that tells you what you can do CHALLENGES: I was having issues getting to the browser icons to move on the site, it was working locally but wasnt working and gave no errors when pushed to the site. Still coulden’t tell you how I got it working. Had to store the bcakground in a local storage on the computer, i havent messed arounf with that before and I found it very fun.
OVERVIEW: Hi! Sorry for the long wait between dev logs (again). Ive had to just deal with some things recently and havent had time for this. Added a start menu that allows you to search apps or search the web This is a smaller feature, but dont worry, much more is to come. NEXT STEPS: Intro app to say features Other apps CHALLENGES: Interacting with other parts of my code in this part of the code hsa been fun to prove to myself how upgraded my organization is Also enjoyed using more of css modification within JS as opposed to just writing more css which I am very tired of
OVERVIEW: Added about app! Has slideshow which can be easily adjusted to tell you about features of the os, this is to help reviewers understand how the site works. Also noticed an issue where it doesnt look great because asstes werent loading, hence the boot screen! It has a progress bar which says what its lodaing! Backed to being locked in the btw. NEXT STEPS: More apps Readme update More commands for terminal (things that actually do things) CHALLENGES: Dynamically reading DOM to get all images that need to be loaded Styling the about app to make it helpful but also reasonable to make Git being weird (ended up making a few custom commands to interact with the remote)
OVERVIEW: Added a file explorer! Sorry for the three days wait, but this is a bigger app than normal. it allows you to create file structures and files. Currently the only file you can open are .txt files, however. These .txt files open in the notepad. Find the secret file and decode it for a surprise! NEXT STEPS: Add editing .txt files and saving them with file explorer prepare to ship Terminal commands update CHALLENGES: The biggest reason it took this long to make the app was that I had to redo the entire code for opening folders and files. I had it set so every click it would re-render the explorer (makes sense in my head). The rendering resets the DOM and makes the original element you click on a new identical element. However, to open a file you need to double click it. This wasn’t working, and it took my a bit of research to find out why. The way HTML decides if something is a double click is if you rapidly click the same element twice. Resetting the DOM meant the this element would change every click. So, I had to redo the system to only render when necessary, which required a significant overhaul of the javascript
OVERVIEW: Sorry for another short devlog. Polished, fixed bugs, adding commands, adding saving. I have decided that I am going to do my second ship! I do plan on working more on this in the future prolly maybe. NEXT STEPS: Ship! CHALLENGES: More localstorage stuff and working with file ids for the file manager was fun and interesting to learn about More writing for the readme
Ships:
Meet GenericOS. This was my first web design project, it features many draggable apps, playable games, and interactive experiences. This was NOT created through the guide for the program, but still inspired by its ideas. I made all code, formulated all direct ideas,and created my OS all myself. I am very proud of it, spent a significant amount of time and effort on it, and am very excited to see what everyone things. PLEASE LEAVE CONSTRUCTIVE FEEDBACK, I want to know how I can improve. Thank you for taking the time to check out my project. Also thank you HackClub and everyone involved in it, it is an amazing company run an amazing way, it is truly inspiring and an admirable cooperation. I love the transparency, people, and services provided. Thank you for giving people like me an opportunity to make things like this. Please review the readme in the Github repository for information on how I built the project, as well as what it features and how you can modify it. If you like this and want to support me, check out my portfolio linked on the github. Thank you all again, and if you are from Hackclub reading this, y’ll are amazing people doing amazing work.
GENERIC OS This started out as me learning HTML and CSS. Looking back through older files, when I started this a month ago, I can see how much I’ve grown. Even since the first ship of this project, I can see the improvement and learning. I love coding, and I love how Hackclub has inspired and motivated me to make things like this. Thank you for taking the time to review this project. Hackclub, thank you so much for providing such an amazing program to help people like me. I hope to join you one day and look up to the way the organization is run and it’s staff. CHANGES SINCE LAST SHIP Three additional apps (browser, file explorer, about) Additional UI (Start menu, bootloader, etc.) Architectural changes to organization Much much more! BIGGEST SUCCESSES Proficiency in learning HTML/CSS and JS Working functional apps backed with a reliable infastrucutere Meeting a kind community of people who can help me Git structure of branches and learning how to use git in terminal Also the file explorer I am very proud of BIGGEST CHALLENGES Lowk stupid bugs that I shouldve been able to fix in 10 seconds but couldnt see for some reason All other challenges have been overcome thanks to an amazing community :D Thank you hackclub and thank you reviewer!...
|
1792828074.5913393
|
1792914474.5913393
|
|
6839
|
Swerve Drive by @joshua_r | Stardance
|
joshua_r
|
2
|
79.0
|
379
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-19T14:57:23Z", "hours": 1.0, "multiplier": 5.0, "payout": 5, "blessing": "neutral", "text": "3D printed coaxial swerve drive! This was heavily inspired by FRC swerves and it really fun to make. Designing and everything hardware related was honestly pretty easy, but wiring was a pain. Each brushless motor driver needed 3 pwm pins on the same hardware timer and on nucleos, some of the pins serve multiple uses, creating some problems for me. Also there were a lot of times that things that seemed like software issues were actually wiring issues, like when the adafruit motor shield stopped working because its i2c connection was tied to pins A4 and A5. Overall, this was the most technologically advanced project I have ever made, partly because I was using a new microcontroller (stm32 nucleo) but also because I had to understand the math involved in driving a swerve correctly. Not to mention I was also running 4 brushless motors and 4 separate PIDs. It was really fun to build and I would definitely do it again given the opportunity. Maybe even a differential swerve next time? RESHIP FOR NEW HARDWARE MUTLIPLIER: Public video link is the video of project button.", "repo": "https://github.com/Joshuar9202/Swerve-Drive-Arduino", "demo": ""}, {"ship_num": 2, "ts": "2026-07-06T16:35:33Z", "hours": 78.0, "multiplier": 5.0, "payout": 374, "blessing": "neutral", "text": "3D printed coaxial swerve drive! This was heavily inspired by FRC swerves and it really fun to make. Designing and everything hardware related was honestly pretty easy, but wiring was a pain. Each brushless motor driver needed 3 pwm pins on the same hardware timer and on nucleos, some of the pins serve multiple uses, creating some problems for me. Also there were a lot of times that things that seemed like software issues were actually wiring issues, like when the adafruit motor shield stopped working because its i2c connection was tied to pins A4 and A5. Overall, this was the most technologically advanced project I have ever made, partly because I was using a new microcontroller (stm32 nucleo) but also because I had to understand the math involved in driving a swerve correctly. Not to mention I was also running 4 brushless motors and 4 separate PIDs. It was really fun to build and I would definitely do it again given the opportunity. Maybe even a differential swerve next time?", "repo": "https://github.com/Joshuar9202/Swerve-Drive-Arduino", "demo": ""}]...
|
[{"post_id": 70649, "ts": "202 [{"post_id": 70649, "ts": "2026-09-19T14:53:46Z", "hours": 0.9042, "text": "Finally hardware projects are getting payout multipliers like software projects! Thus, I will be reshipping my project so that I can get multiplier. (Also opensauce was awesome sauce! Only real changes made to the project were encoder offsets and tuning things at opensauce because of reassembly at the venue. Also got into a rev reel!)"}, {"post_id": 22493, "ts": "2026-07-05T00:00:05Z", "hours": 11.3317, "text": "Done! 🎉 I finished making all the things for the github like the wiring diagram and demo video. Fixed all issues with field relative control, my original math was incorrect. Also one of the modules wasn’t rotating correctly but it turns out it was just the magnet came loose. Will be submitting to Outpost soon! Demo video link: https://www.youtube.com/watch?v=bPC4PA_9ZH0"}, {"post_id": 19694, "ts": "2026-07-01T02:39:11Z", "hours": 5.0708, "text": "First Movements Tested full motion for the first time woohoo! 🎉🎊 Things surprisingly worked alright, the kinematics for the rotation while strafing is still a bit off but translation by itself works great. Also the wheels have very little traction so I’ll have to increase that somehow. Additionally, field centric control on the joystick works really well, so up on the joystick means up in real life relative to the start heading and regardless of the rotation of the robot. Things Left to Do on Hardware Add traction to the wheels Things Left to Do on Software Fix swerve kinematics for rotation"}, {"post_id": 18892, "ts": "2026-06-30T02:50:31Z", "hours": 11.6183, "text": "Integration Pain I got all the subsystems working separately but the extremely fun part of integrating them all together was the first time I truly understood why engineers hate integration. There were a plethora of pin conflicts underlying the hardware since many of the pins on the nucleo serve multiple purposes. One example of this was the adafruit motor shield’s i2c bus interfering with the front left drive motor’s FOC math since PB8 and PB9 are connected to the sda and scl pins on the Arduino headers of the nucleo. As you can see from the extremely janky wiring in the photo, just connecting the shield so it gets power on the other side of headers and manually connecting the shield to a separate i2c bus using jumper wires, I was able to finally make all the subsystems work together. This was just one example of the many problems that arose, hence why there are almost 12 hours being logged in this post, but this project is finally on the last stretch. I did also make a lot of other progress like confirming the swerve kinematics work along with the flysky controller for inputs :) Things Left to Do on Hardware Cut off the sda and scl pins on the motor shield and solder a jumper wire to the new i2c bus Things Left to Do on Software Tune the pid for FR, BR, and BL turn motors Integrate offsets into the steering angle for the motors Integrate the MPU6050 readings for field oriented swerve control"}, {"post_id": 15434, "ts": "2026-06-25T02:36:01Z", "hours": 3.0789, "text": "Side Quest The adafruit motor shield v2 that I am using to control the n20 motors suddenly stopped working today. After a long struggle, I managed to trace it back to the A4 and A5 pins being attached to the nucelo alongside the dedicated SDA and SCL pins. Since SDA and SCL are tied to A4 and A5 on normal arduinos but seemingly not on nucelos, simply removing those pins fixed all issues. A very unsatisfying end to a 3 hour struggle :( I did mange to test out the front left module, and spent some time tuning the azimuth pid. Things Left to Do on Hardware Wire management Things Left to Do on Software Test the rest of the hardware (FR, BR, and BL modules, radio communication, and gyro). Program the rest of the swerveKinematics.cpp file Program mpu6050 gyro Program in controls from the inputs from the flysky controller"}, {"post_id": 14820, "ts": "2026-06-24T02:09:04Z", "hours": 3.2439, "text": "Finished Wiring As you can tell by this extremely beautiful cable management and totally not messy arrangement of wires, I should have probably made a pcb for this (Maybe I will later). Things Left to Do on Hardware Wire management Things Left to Do on Software Test all hardware individually to isolate any potential wiring issues Program the rest of the swerveKinematics.cpp file Program in controls from the inputs from the flysky controller"}, {"post_id": 14094, "ts": "2026-06-23T02:30:21Z", "hours": 6.4664, "text": "Swerve Drivebase update Cut out bellypan out of scrap board because creating large panels isn’t really suited for 3d printing and I can drill new holes into this material easily for mounting electronics. Mounted the majority of the electronics as well. On the software side I got radio communication working and created a new .h and .cpp file for implementing radio control into the main program. Things Left to Do on Hardware Attach radio receiver and battery Wire all components together Resolder the wires on one of the n20 motors (bad connection the first time lol). Things Left to Do on Software Program the rest of the swerveKinematics.cpp file Program in controls from the inputs from the flysky controller"}, {"post_id": 12296, "ts": "2026-06-20T02:02:20Z", "hours": 8.5414, "text": "Finished Drive Base Got all the modules built and attached. Some modules are a little bit stiff so if that hinders the motors I’ll need to change some clearances, but I think its minimal enough to where it won’t matter. Things Left to Do on Hardware Build and attach bellypan for electronics Mount electronics to bellypan Wire everything up Things Left to Do on Software Test radio communication from fs-ia6B receiver to nucleo Program commands in based on controller input Program swerve kinematics in using the custom angle control and drive control functions already created"}, {"post_id": 10917, "ts": "2026-06-17T21:51:43Z", "hours": 7.2928, "text": "Swerve azimuth control Got PID working for one module, though it probably still needs to be tuned. Also I need to figure out the logic for wrapping around since the encoder measures values from 0-1023 which I have mapped to 0 to 360, but after 360 it goes back to 0 which complicates the logic a bit. I also need to implement the logic for the swerve just switching the wheel rotation direction rather than rotate the entire module 180 degrees whenever it can. Realistically, the module should only ever rotate a max of 90 degrees from one input to the next"}, {"post_id": 8164, "ts": "2026-06-13T16:37:44Z", "hours": 8.9011, "text": "Tested all hardware for the swerve drive. The latest version of SimpleFOC (2.4.0) doesn’t work for some reason but the previous version (2.3.5) works perfectly fine. The as5600 encoders work great and track the rotation of the module nicely. I also made a few design changes to make assembly easier which includes changing the design of the encoder column support and the design of the standoffs."}, {"post_id": 5328, "ts": "2026-06-09T01:59:37Z", "hours": 3.0031, "text": "Swerve module v1 assembled! The gears mesh nicely and the entire system has a lot less friction than I thought it would :) Things needed to do in terms of design: Design support for the shaft that holds the central drive gear column since right now its cantilevered. Redesign standoffs because the current design breaks too easily Design encoder for brushless drive motor so FOC can be used"}, {"post_id": 4618, "ts": "2026-06-08T00:12:06Z", "hours": 3.3511, "text": "Finished soldering wires to the motors and header pins to the encoders. Got stm32 nucleo 64 f411re working with platformio ready for programming along with the motor shield to control everything!"}, {"post_id": 3587, "ts": "2026-06-06T16:15:48Z", "hours": 1.9147, "text": "finished building one module in real life!"}, {"post_id": 2479, "ts": "2026-06-05T00:05:00Z", "hours": 1.3253, "text": "Added drive column for drive gear train which is coaxial to the encoder column which has the magnet for the as5600 to track the module’s rotation. Done with the drive module for now, moving on to the motor mounts!"}, {"post_id": 2227, "ts": "2026-06-04T16:44:41Z", "hours": 2.6103, "text": "CAD for a single module done including gear relations. No motors yet"}]...
|
Title: Swerve Drive by @joshua_r | Stardance
Devl Title: Swerve Drive by @joshua_r | Stardance
Devlogs:
CAD for a single module done including gear relations. No motors yet
Added drive column for drive gear train which is coaxial to the encoder column which has the magnet for the as5600 to track the module’s rotation. Done with the drive module for now, moving on to the motor mounts!
finished building one module in real life!
Finished soldering wires to the motors and header pins to the encoders. Got stm32 nucleo 64 f411re working with platformio ready for programming along with the motor shield to control everything!
Swerve module v1 assembled! The gears mesh nicely and the entire system has a lot less friction than I thought it would :) Things needed to do in terms of design: Design support for the shaft that holds the central drive gear column since right now its cantilevered. Redesign standoffs because the current design breaks too easily Design encoder for brushless drive motor so FOC can be used
Tested all hardware for the swerve drive. The latest version of SimpleFOC (2.4.0) doesn’t work for some reason but the previous version (2.3.5) works perfectly fine. The as5600 encoders work great and track the rotation of the module nicely. I also made a few design changes to make assembly easier which includes changing the design of the encoder column support and the design of the standoffs.
Swerve azimuth control Got PID working for one module, though it probably still needs to be tuned. Also I need to figure out the logic for wrapping around since the encoder measures values from 0-1023 which I have mapped to 0 to 360, but after 360 it goes back to 0 which complicates the logic a bit. I also need to implement the logic for the swerve just switching the wheel rotation direction rather than rotate the entire module 180 degrees whenever it can. Realistically, the module should only ever rotate a max of 90 degrees from one input to the next
Finished Drive Base Got all the modules built and attached. Some modules are a little bit stiff so if that hinders the motors I’ll need to change some clearances, but I think its minimal enough to where it won’t matter. Things Left to Do on Hardware Build and attach bellypan for electronics Mount electronics to bellypan Wire everything up Things Left to Do on Software Test radio communication from fs-ia6B receiver to nucleo Program commands in based on controller input Program swerve kinematics in using the custom angle control and drive control functions already created
Swerve Drivebase update Cut out bellypan out of scrap board because creating large panels isn’t really suited for 3d printing and I can drill new holes into this material easily for mounting electronics. Mounted the majority of the electronics as well. On the software side I got radio communication working and created a new .h and .cpp file for implementing radio control into the main program. Things Left to Do on Hardware Attach radio receiver and battery Wire all components together Resolder the wires on one of the n20 motors (bad connection the first time lol). Things Left to Do on Software Program the rest of the swerveKinematics.cpp file Program in controls from the inputs from the flysky controller
Finished Wiring As you can tell by this extremely beautiful cable management and totally not messy arrangement of wires, I should have probably made a pcb for this (Maybe I will later). Things Left to Do on Hardware Wire management Things Left to Do on Software Test all hardware individually to isolate any potential wiring issues Program the rest of the swerveKinematics.cpp file Program in controls from the inputs from the flysky controller
Side Quest The adafruit motor shield v2 that I am using to control the n20 motors suddenly stopped working today. After a long struggle, I managed to trace it back to the A4 and A5 pins being attached to the nucelo alongside the dedicated SDA and SCL pins. Since SDA and SCL are tied to A4 and A5 on normal arduinos but seemingly not on nucelos, simply removing those pins fixed all issues. A very unsatisfying end to a 3 hour struggle :( I did mange to test out the front left module, and spent some time tuning the azimuth pid. Things Left to Do on Hardware Wire management Things Left to Do on Software Test the rest of the hardware (FR, BR, and BL modules, radio communication, and gyro). Program the rest of the swerveKinematics.cpp file Program mpu6050 gyro Program in controls from the inputs from the flysky controller
Integration Pain I got all the subsystems working separately but the extremely fun part of integrating them all together was the first time I truly understood why engineers hate integration. There were a plethora of pin conflicts underlying the hardware since many of the pins on the nucleo serve multiple purposes. One example of this was the adafruit motor shield’s i2c bus interfering with the front left drive motor’s FOC math since PB8 and PB9 are connected to the sda and scl pins on the Arduino headers of the nucleo. As you can see from the extremely janky wiring in the photo, just connecting the shield so it gets power on the other side of headers and manually connecting the shield to a separate i2c bus using jumper wires, I was able to finally make all the subsystems work together. This was just one example of the many problems that arose, hence why there are almost 12 hours being logged in this post, but this project is finally on the last stretch. I did also make a lot of other progress like confirming the swerve kinematics work along with the flysky controller for inputs :) Things Left to Do on Hardware Cut off the sda and scl pins on the motor shield and solder a jumper wire to the new i2c bus Things Left to Do on Software Tune the pid for FR, BR, and BL turn motors Integrate offsets into the steering angle for the motors Integrate the MPU6050 readings for field oriented swerve control
First Movements Tested full motion for the first time woohoo! 🎉🎊 Things surprisingly worked alright, the kinematics for the rotation while strafing is still a bit off but translation by itself works great. Also the wheels have very little traction so I’ll have to increase that somehow. Additionally, field centric control on the joystick works really well, so up on the joystick means up in real life relative to the start heading and regardless of the rotation of the robot. Things Left to Do on Hardware Add traction to the wheels Things Left to Do on Software Fix swerve kinematics for rotation
Done! 🎉 I finished making all the things for the github like the wiring diagram and demo video. Fixed all issues with field relative control, my original math was incorrect. Also one of the modules wasn’t rotating correctly but it turns out it was just the magnet came loose. Will be submitting to Outpost soon! Demo video link: https://www.youtube.com/watch?v=bPC4PA_9ZH0
Finally hardware projects are getting payout multipliers like software projects! Thus, I will be reshipping my project so that I can get multiplier. (Also opensauce was awesome sauce! Only real changes made to the project were encoder offsets and tuning things at opensauce because of reassembly at the venue. Also got into a rev reel!)
Ships:
3D printed coaxial swerve drive! This was heavily inspired by FRC swerves and it really fun to make. Designing and everything hardware related was honestly pretty easy, but wiring was a pain. Each brushless motor driver needed 3 pwm pins on the same hardware timer and on nucleos, some of the pins serve multiple uses, creating some problems for me. Also there were a lot of times that things that seemed like software issues were actually wiring issues, like when the adafruit motor shield stopped working because its i2c connection was tied to pins A4 and A5. Overall, this was the most technologically advanced project I have ever made, partly because I was using a new microcontroller (stm32 nucleo) but also because I had to understand the math involved in driving a swerve correctly. Not to mention I was also running 4 brushless motors and 4 separate PIDs. It was really fun to build and I would definitely do it again given the opportunity. Maybe even a differential swerve next time?
3D printed coaxial swerve drive! This was heavily inspired by FRC swerves and it really fun to make. Designing and everything hardware related was honestly pretty easy, but wiring was a pain. Each brushless motor driver needed 3 pwm pins on the same hardware timer and on nucleos, some of the pins serve multiple uses, creating some problems for me. Also there were a lot of times that things that seemed like software issues were actually wiring issues, like when the adafruit motor shield stopped working because its i2c connection was tied to pins A4 and A5. Overall, this was the most technologically advanced project I have ever made, partly because I was using a new microcontroller (stm32 nucleo) but also because I had to understand the math involved in driving a swerve correctly. Not to mention I was also running 4 brushless motors and 4 separate PIDs. It was really fun to build and I would definitely do it again given the opportunity. Maybe even a differential swerve next time? RESHIP FOR NEW HARDWARE MUTLIPLIER: Public video link is the video of project button....
|
1792839101.553243
|
1792925501.553243
|
|
6853
|
My Website by @Vedant_Daga | Stardance
|
Vedant_Daga
|
2
|
14.0
|
98
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-12T17:29:22Z", "hours": 11.0, "multiplier": 6.57, "payout": 88, "blessing": "blessed", "text": "MY PERSONAL PORTFOLIO REDESIGN WHAT I MADE: - Completely redesigned my portfolio to a much more geometric design (tons of boxes and a really cool triangle background) - made a 3d hero with three.js webgl icosahedron instead of the old word wheel - Cleaned up all the vibecoded slop into larger, consolidated files - rewrote the entire project to sound like me instead of whatever AI slop it was before - added leadership section to add my leadership roles, teaching, and mentoring experiences - rebuilt some sections to make them easier to read (the awards section is an example) - made sure all the images load properly WHAT WAS HARD: - three.js threw invalid hook errors (turned out to be vite caching old deps, deleted node_modules/.vite and it worked) - almost created a circular import that would've broke everything (thank god i caught it) WHAT IM PROUD OF: - everything looks clean and like meant to be (idk how to describe that sorry) - geometric design fits my vibe of being really boxy without making it feel wrong (again idk how to explain that) - made everything feel like i built it, instead of making it feel like a template that i filled out HOW TO SEE IT: press the linkssss and check it out please", "repo": "https://github.com/DagaVedant/My-Portfolio", "demo": "https://dagavedant.github.io/My-Portfolio/"}, {"ship_num": 2, "ts": "2026-06-04T23:03:32Z", "hours": 3.0, "multiplier": 4.1, "payout": 10, "blessing": "neutral", "text": "I made a personal portfolio for me. I've always wanted to make a website, so i finally decided to start this project. Its a full-stack React web app that shows off my skills as a developer. It covers my projects, tech stack, education, and some fun non-tech hobbies like tennis and hiking. The toughest part was making it feel unique and what I wanted from my dream website. I added things like a word wheel, a really cool typewriter animations (my favorite part of everything\" and tons of other animations and other effects. I'm really super proud of the projects section. It shows some of the projects I'm most proud of like my LSTM models for analyzing stocks to an FRC robotics chatbot powered by RAG and Ollama, to my latest Hackathon Project for healthcare. To check it out, just clone the repo and run `npm install` followed by `npm run dev`. It will load locally on your computer. Since everything is static, there's no backend to fuss over. You won't need any API keys or configurations either – it works right away out of the box.", "repo": "https://github.com/DagaVedant/My-Portfolio", "demo": "https://dagavedant.github.io/My-Portfolio/"}]...
|
[{"post_id": 25376, "ts": "202 [{"post_id": 25376, "ts": "2026-07-09T17:01:47Z", "hours": 5.0, "text": "What I built: fixed a bunch of small stuff first, like adding in-progress signs to PulseFlow-AI, GardenBuddy, and Python-Examples made sure all the project images were showing up, and make sure they werent getting cropped out like before added the Best in AI/ML award for PulseFlow-AI from HackJPS COMPLETLY REDESIGNED the entire webpage. I wanted it to be more light theme and a geometric design picked like a few different colors that acutally look good with each other instead of the old word wheel from before, i made a new 3D one with three.js wireframe icosahedron words still cycle in the center like before, just actual webgl now not css changed all the sections to be more boxy. removed all the rounded corners, random cards, buttons, badges, basically simplified everything added like little corner brackets on each section because it looks cool, made grid line running through sections, and added a small like bar or sorts on the side with the contact info added a like triangle-ish geometric background to make everything look better had like a hundred different component files from when i was vibecoding everything, and since im getting away from using AI and switching to handcoding everything, I combined everything into larger files What broke: installed the three.js packages for the 3D hero and it caused a lot of invalid hook errors almost put the tennis ball icon inside the merged sections file, would’ve broken the build with a circular import How I fixed it: turns out the hook error wasn’t even my code, vite just had old cached deps from before i installed the new packages. deleted node_modules/.vite, restarted, fixed instantly, didn’t touch a single line of actual code (thank god because it would have been terrible if i had to manually fix everything"}, {"post_id": 20524, "ts": "2026-07-02T04:23:49Z", "hours": 3.0, "text": "What I built: Fixed the resume link that was 404ing on GitHub Pages, it needed the Vite base path prefix not just a plain /resume.pdf Swapped every project’s random picsum placeholder image for a real screenshot Added a leadership link to the navbar since that section existed but nobody could actually get to it Found project cards had hover effects and a pointer cursor like the whole thing was clickable, but only a tiny “view on GitHub” pill actually worked, so now the whole card opens the repo Rewrote basically all my portfolio copy to get rid of all the AI garbage and wrote it in my voice Added my in-progress Microsoft Python course with the real course link and logo instead of just text What broke: a bunch of stuff. Resume link worked locally but died in prod because GitHub Pages serves the site under /My-Portfolio/ and the link was a flat root path, same thing hit the project images. jsconfig kept flagging import.meta.env.BASE_URL as an error in my editor. The project cards looked clickable everywhere but only a few pixels of them did anything. And during the full copy rewrite I somehow removed the accents from “Lección 7 de Español,” it just became “Leccion 7 de Espanol” and I didn’t notice till right before I was about to commit. How I fixed it: stuck import.meta.env.BASE_URL in front of the resume and image paths so they resolve right on the deployed site. Added vite/client to jsconfig’s types so the editor stops complaining. Put an onClick on the whole project card that opens GitHub, kept stopPropagation on the inner button so it doesn’t open two tabs. Caught the accent thing in the diff and fixed it before committing."}, {"post_id": 20173, "ts": "2026-07-01T18:36:59Z", "hours": 2.0, "text": "Added a leadership section + cleaned up the awards so i finally added a leadership section to my portfolio. new LeadershipSection.jsx component plus the data lives in portfolio-data.js like everything else. it covers my three 4-H roles: secretary & mentor, leading the curriculum redesign, and co-founding the summer learning program. i also redid the awards/recognitions section . it used to be a boring 2-column grid of cards, now its a vertical timeline with little icon dots running down a gradient line, and i threw in a few more awards while i was at it. hooked the new section into Portfolio.jsx (its between education and tech stack) and added an “Awards” link to the navbar with a smooth-scroll fix. heads up: the diff looks huge (like 758 added / 537 removed) but honestly most of that is just prettier reformatting my navbar and recognitions files into double-quotes and multi-line jsx. the actual new stuff is way smaller than it looks. the annoying part: somehow my package.json downgraded react-quill from ^2.0.0 all the way down to ^0.0.2 when the lockfile regenerated. definitely not on purpose, gotta revert that before it breaks something. also i split this into two commits and forgot the LICENSE file, so that got shoved into a random “pushing last few edited files” push lol."}, {"post_id": 2445, "ts": "2026-06-04T22:52:01Z", "hours": 0.0, "text": "Added a README.md and got the MY FIRST PROJECT READY TO SHIP"}, {"post_id": 1911, "ts": "2026-06-04T04:21:46Z", "hours": 2.0, "text": "updated tons of info and revised website looks"}]...
|
Title: My Website by @Vedant_Daga | Stardance
Dev Title: My Website by @Vedant_Daga | Stardance
Devlogs:
updated tons of info and revised website looks
Added a README.md and got the MY FIRST PROJECT READY TO SHIP
Added a leadership section + cleaned up the awards so i finally added a leadership section to my portfolio. new LeadershipSection.jsx component plus the data lives in portfolio-data.js like everything else. it covers my three 4-H roles: secretary & mentor, leading the curriculum redesign, and co-founding the summer learning program. i also redid the awards/recognitions section . it used to be a boring 2-column grid of cards, now its a vertical timeline with little icon dots running down a gradient line, and i threw in a few more awards while i was at it. hooked the new section into Portfolio.jsx (its between education and tech stack) and added an “Awards” link to the navbar with a smooth-scroll fix. heads up: the diff looks huge (like 758 added / 537 removed) but honestly most of that is just prettier reformatting my navbar and recognitions files into double-quotes and multi-line jsx. the actual new stuff is way smaller than it looks. the annoying part: somehow my package.json downgraded react-quill from ^2.0.0 all the way down to ^0.0.2 when the lockfile regenerated. definitely not on purpose, gotta revert that before it breaks something. also i split this into two commits and forgot the LICENSE file, so that got shoved into a random “pushing last few edited files” push lol.
What I built: Fixed the resume link that was 404ing on GitHub Pages, it needed the Vite base path prefix not just a plain /resume.pdf Swapped every project’s random picsum placeholder image for a real screenshot Added a leadership link to the navbar since that section existed but nobody could actually get to it Found project cards had hover effects and a pointer cursor like the whole thing was clickable, but only a tiny “view on GitHub” pill actually worked, so now the whole card opens the repo Rewrote basically all my portfolio copy to get rid of all the AI garbage and wrote it in my voice Added my in-progress Microsoft Python course with the real course link and logo instead of just text What broke: a bunch of stuff. Resume link worked locally but died in prod because GitHub Pages serves the site under /My-Portfolio/ and the link was a flat root path, same thing hit the project images. jsconfig kept flagging import.meta.env.BASE_URL as an error in my editor. The project cards looked clickable everywhere but only a few pixels of them did anything. And during the full copy rewrite I somehow removed the accents from “Lección 7 de Español,” it just became “Leccion 7 de Espanol” and I didn’t notice till right before I was about to commit. How I fixed it: stuck import.meta.env.BASE_URL in front of the resume and image paths so they resolve right on the deployed site. Added vite/client to jsconfig’s types so the editor stops complaining. Put an onClick on the whole project card that opens GitHub, kept stopPropagation on the inner button so it doesn’t open two tabs. Caught the accent thing in the diff and fixed it before committing.
What I built: fixed a bunch of small stuff first, like adding in-progress signs to PulseFlow-AI, GardenBuddy, and Python-Examples made sure all the project images were showing up, and make sure they werent getting cropped out like before added the Best in AI/ML award for PulseFlow-AI from HackJPS COMPLETLY REDESIGNED the entire webpage. I wanted it to be more light theme and a geometric design picked like a few different colors that acutally look good with each other instead of the old word wheel from before, i made a new 3D one with three.js wireframe icosahedron words still cycle in the center like before, just actual webgl now not css changed all the sections to be more boxy. removed all the rounded corners, random cards, buttons, badges, basically simplified everything added like little corner brackets on each section because it looks cool, made grid line running through sections, and added a small like bar or sorts on the side with the contact info added a like triangle-ish geometric background to make everything look better had like a hundred different component files from when i was vibecoding everything, and since im getting away from using AI and switching to handcoding everything, I combined everything into larger files What broke: installed the three.js packages for the 3D hero and it caused a lot of invalid hook errors almost put the tennis ball icon inside the merged sections file, would’ve broken the build with a circular import How I fixed it: turns out the hook error wasn’t even my code, vite just had old cached deps from before i installed the new packages. deleted node_modules/.vite, restarted, fixed instantly, didn’t touch a single line of actual code (thank god because it would have been terrible if i had to manually fix everything
Ships:
I made a personal portfolio for me. I've always wanted to make a website, so i finally decided to start this project. Its a full-stack React web app that shows off my skills as a developer. It covers my projects, tech stack, education, and some fun non-tech hobbies like tennis and hiking. The toughest part was making it feel unique and what I wanted from my dream website. I added things like a word wheel, a really cool typewriter animations (my favorite part of everything" and tons of other animations and other effects. I'm really super proud of the projects section. It shows some of the projects I'm most proud of like my LSTM models for analyzing stocks to an FRC robotics chatbot powered by RAG and Ollama, to my latest Hackathon Project for healthcare. To check it out, just clone the repo and run `npm install` followed by `npm run dev`. It will load locally on your computer. Since everything is static, there's no backend to fuss over. You won't need any API keys or configurations either – it works right away out of the box.
MY PERSONAL PORTFOLIO REDESIGN WHAT I MADE: - Completely redesigned my portfolio to a much more geometric design (tons of boxes and a really cool triangle background) - made a 3d hero with three.js webgl icosahedron instead of the old word wheel - Cleaned up all the vibecoded slop into larger, consolidated files - rewrote the entire project to sound like me instead of whatever AI slop it was before - added leadership section to add my leadership roles, teaching, and mentoring experiences - rebuilt some sections to make them easier to read (the awards section is an example) - made sure all the images load properly WHAT WAS HARD: - three.js threw invalid hook errors (turned out to be vite caching old deps, deleted node_modules/.vite and it worked) - almost created a circular import that would've broke everything (thank god i caught it) WHAT IM PROUD OF: - everything looks clean and like meant to be (idk how to describe that sorry) - geometric design fits my vibe of being really boxy without making it feel wrong (again idk how to explain that) - made everything feel like i built it, instead of making it feel like a template that i filled out HOW TO SEE IT: press the linkssss and check it out please...
|
1792882067.0874293
|
1793746067.0874293
|
|
6948
|
Needoh Factory by @Oscar_da_best | Stardance
|
Oscar_da_best
|
2
|
46.0
|
399
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-12T09:36:31Z", "hours": 6.0, "multiplier": 8.4, "payout": 54, "blessing": "neutral", "text": "I added a obby island to the project and made the game run a little better in general less bugs now and i am working on ading all the coming soon features", "repo": "https://github.com/Duder-coolman/needoh-tycoon", "demo": "https://www.roblox.com/games/85070662876748/Needoh-Factory"}, {"ship_num": 2, "ts": "2026-09-15T02:11:55Z", "hours": 40.0, "multiplier": 8.67, "payout": 345, "blessing": "neutral", "text": "I made a game called Needoh Factory where you buy needohs and merge them to get cooler needohs that make more money. This was a challanging project because I challenged myself to step away from AI an really test what I could do as well as basiclly learing Luau for the first time. I am proud of how far I have come on this journey and proud of the effort I put into this game. anyone who wats to test my project can test it as long as they make a roblox account!", "repo": "https://github.com/Duder-coolman/needoh-tycoon", "demo": "https://www.roblox.com/games/85070662876748/Needoh-Factory"}]...
|
[{"post_id": 78999, "ts": "202 [{"post_id": 78999, "ts": "2026-10-12T09:34:08Z", "hours": 1.1264, "text": "I made a new gem curency and fixed some more bugs that were pretty game breaking like things getting out of the droppers"}, {"post_id": 78019, "ts": "2026-10-09T07:03:58Z", "hours": 2.2419, "text": "I added a parkour island as somthing to do while you passivly make money and the parkour will reward a new currency called gems which will be very useful in the future."}, {"post_id": 77759, "ts": "2026-10-08T05:48:11Z", "hours": 3.0975, "text": "I replaced my script with a Module script allowing me to use the function in other parts of my game like when the player joins or amy other time I need to update the GUI. Mainly jut doing bug fixes right now before I add any more big features to the game and I dont really remember everything I did. :P"}, {"post_id": 68404, "ts": "2026-09-15T02:07:23Z", "hours": 2.4011, "text": "Finished up the game early, a lot is not done but there will be an update hopefully before stardance ends"}, {"post_id": 66425, "ts": "2026-09-12T07:50:55Z", "hours": 5.7147, "text": "There are three pictures I really dislike UI but I am pushing through it and had some fun making the map more decorated. made a working teleport system. Next I will make a shop for the ingame currency and I will add background music as well as making the purchases work. I’m really enjoying this project and hoping to finish in the next week!! :)"}, {"post_id": 65184, "ts": "2026-09-10T04:05:22Z", "hours": 5.5197, "text": "I finisshed the conversion sysstem that allows the player to convert thier needohs into monye finally completeing the core loop of the game. it is not playable and I will be debugging and decorating for the next 10-15 hours🥳🥳 then I can finally ship it I also completed a startup script so that all the UI can update when A player joins the game to display the correct prices and I watched a tutorial on how to make numbers with suffixes after them to make the pricees easier to read."}, {"post_id": 55382, "ts": "2026-08-27T05:38:59Z", "hours": 5.3786, "text": "i added coded the dropper models into the tower and now you can buy them and merge three to get the next level up. they also drop mini and simplified versions of themselves that the player can pick up for a currency that will then be turned into coins im super happy that this project is coming along and am looking forward to shiping it soon."}, {"post_id": 52062, "ts": "2026-08-22T03:48:39Z", "hours": 4.2428, "text": "I made the second row this time. give me some feedback please i like any critisizm just keep in mind I litteraly just started learning. the first row is in my last post. happy to begin working on the main loop of the game soon."}, {"post_id": 48697, "ts": "2026-08-17T06:30:55Z", "hours": 3.6744, "text": "Made a whole pack of runic symbols that I will sell on roblox’s marketplace for $0.99 and made 10 models for my game planning on finishing the other 10 tommorow."}, {"post_id": 47227, "ts": "2026-08-15T00:29:49Z", "hours": 2.0911, "text": "Made the buttons more appealing and rewrote the button purchasing script to make it less repetetive."}, {"post_id": 43160, "ts": "2026-08-08T08:30:52Z", "hours": 5.4481, "text": "Made a save data storage script and a script to buy droppers I cannot figure out how to add code blocks so these terrible pictures will have to do"}, {"post_id": 5630, "ts": "2026-06-09T14:38:25Z", "hours": 2.2406, "text": "I added the main element of the game and made a plot system that gives the player a plot when they load in. (lighting looks bad because it is not textured yet)"}, {"post_id": 4036, "ts": "2026-06-07T06:49:08Z", "hours": 1.775, "text": "Added pathways and portals for obstacle courses, its so hard to make pathways… planning on making a lot of progress tommorow and waiting to finishing building so I can start scripting 🙏"}, {"post_id": 3341, "ts": "2026-06-06T07:05:12Z", "hours": 0.5228, "text": "Added water around the islands and bridges connecting them. planning on locking in tomorrow"}, {"post_id": 2599, "ts": "2026-06-05T06:43:34Z", "hours": 0.3025, "text": "Currently very busy finishing up school but I was able to make a measured out map."}, {"post_id": 1982, "ts": "2026-06-04T07:40:57Z", "hours": 0.5017, "text": "Basic Hover effect for button along with other basic thing I like to set up when I start a project"}]...
|
Title: Needoh Factory by @Oscar_da_best | Stardanc Title: Needoh Factory by @Oscar_da_best | Stardance
Devlogs:
Basic Hover effect for button along with other basic thing I like to set up when I start a project
Currently very busy finishing up school but I was able to make a measured out map.
Added water around the islands and bridges connecting them. planning on locking in tomorrow
Added pathways and portals for obstacle courses, its so hard to make pathways… planning on making a lot of progress tommorow and waiting to finishing building so I can start scripting 🙏
I added the main element of the game and made a plot system that gives the player a plot when they load in. (lighting looks bad because it is not textured yet)
Made a save data storage script and a script to buy droppers I cannot figure out how to add code blocks so these terrible pictures will have to do
Made the buttons more appealing and rewrote the button purchasing script to make it less repetetive.
Made a whole pack of runic symbols that I will sell on roblox’s marketplace for $0.99 and made 10 models for my game planning on finishing the other 10 tommorow.
I made the second row this time. give me some feedback please i like any critisizm just keep in mind I litteraly just started learning. the first row is in my last post. happy to begin working on the main loop of the game soon.
i added coded the dropper models into the tower and now you can buy them and merge three to get the next level up. they also drop mini and simplified versions of themselves that the player can pick up for a currency that will then be turned into coins im super happy that this project is coming along and am looking forward to shiping it soon.
I finisshed the conversion sysstem that allows the player to convert thier needohs into monye finally completeing the core loop of the game. it is not playable and I will be debugging and decorating for the next 10-15 hours🥳🥳 then I can finally ship it I also completed a startup script so that all the UI can update when A player joins the game to display the correct prices and I watched a tutorial on how to make numbers with suffixes after them to make the pricees easier to read.
There are three pictures I really dislike UI but I am pushing through it and had some fun making the map more decorated. made a working teleport system. Next I will make a shop for the ingame currency and I will add background music as well as making the purchases work. I’m really enjoying this project and hoping to finish in the next week!! :)
Finished up the game early, a lot is not done but there will be an update hopefully before stardance ends
I replaced my script with a Module script allowing me to use the function in other parts of my game like when the player joins or amy other time I need to update the GUI. Mainly jut doing bug fixes right now before I add any more big features to the game and I dont really remember everything I did. :P
I added a parkour island as somthing to do while you passivly make money and the parkour will reward a new currency called gems which will be very useful in the future.
I made a new gem curency and fixed some more bugs that were pretty game breaking like things getting out of the droppers
Ships:
I made a game called Needoh Factory where you buy needohs and merge them to get cooler needohs that make more money. This was a challanging project because I challenged myself to step away from AI an really test what I could do as well as basiclly learing Luau for the first time. I am proud of how far I have come on this journey and proud of the effort I put into this game. anyone who wats to test my project can test it as long as they make a roblox account!
I added a obby island to the project and made the game run a little better in general less bugs now and i am working on ading all the coming soon features...
|
1792853578.1657856
|
1792939978.1657856
|
|
7194
|
Echo by @Hamna | Stardance
|
Hamna
|
2
|
16.0
|
46
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-02T12:42:56Z", "hours": 6.0, "multiplier": 15.67, "payout": 23, "blessing": "neutral", "text": "I’ve made a slack Echo bot, which let the user do the Q/A, online search, summarize the chat for the team, let the users do search about a some project in a chat if they’ve talked about that in the chat or mentioned anything, and help to understand some concept from the official documentation (cool ri8) In a nutshell, Echo bot is assistant, it’s helper with anime girl personality. This is Echo version 0.2 where I’ve added online search Feature so that AI won’t hallucinate about the question and give the latest info about the query.", "repo": "https://github.com/lilithCode/Echo", "demo": "https://hackclub.enterprise.slack.com/archives/C0BDSKADE75"}, {"ship_num": 2, "ts": "2026-06-29T12:47:33Z", "hours": 10.0, "multiplier": 2.87, "payout": 23, "blessing": "neutral", "text": "I built a Slack bot named “Echo” with Node.js and Slack Bolt API, it handles instant Q&A, web search with summaries, conversation summarization, project context retrieval, and documentation lookup. The Challenges e biggest challenge was contextual intelligence: teaching an AI to sift through messy channel histories and pinned messages to understand a project’s current state without getting distracted by unrelated chatter. I’m particularly proud of the /echo-project command; it analyzes real-time team discussions to generate structured status reports, identifying active members, key decisions, and blockers automatically. It effectively turns a chaotic Slack thread into a professional project brief in seconds. What I’m Proud Of The speed. Getting answers in 2 seconds is no joke when you’re juggling AI inference + web search + Slack’s API. I’m also proud of the conversation summarization. it actually understands context, not just pulling random snippets. How to Test It Add Echo to your Slack workspace and try these commands: /echo-ask \"your question\" , /echo-search \"topic\" , /echo-summary (in a thread), /echo-project (in a channel), /echo-docs \"what you need\" . Start with simple queries, then get creative. DM me what breaks or what you wish it could do.", "repo": "https://github.com/lilithCode/Echo", "demo": "https://hackclub.enterprise.slack.com/archives/C0BDSKADE75"}]...
|
[{"post_id": 39454, "ts": "202 [{"post_id": 39454, "ts": "2026-08-02T12:34:43Z", "hours": 6.2753, "text": "I’ve added a new feature in the bot, which is online search . It searches the question online so that it gives the latest info about the question Added online search Here’s what was happening with previous version,Echo could only answer from the model’s own knowledge before, so I thought we need to fix this.I added a proper web search feature so she can actually go look things up. Wired up the Exa API for /echo-search — it searches the web, pulls the top results, fetches the actual page content, and feeds that back into the AI so the answer is grounded instead of hallucinated. Made sure sources always get cited back with clickable links in the Slack message Split search into two steps: search (get URLs) then contents (get the actual text), since Exa’s search endpoint alone only gives snippets, not enough to actually summarize from. Deployed the project on Nest Finally deployed it on Nest like the previous version and yo Echo became 24/7 online :) I’ve also shared a tutorial video on YouTube to help you understand any command and how to use Echo on Slack: Echo Tutorial Video"}, {"post_id": 18252, "ts": "2026-06-29T10:24:46Z", "hours": 5.0558, "text": "I finished the last two most complex commands — /echo-summary and /echo-project and then finally deployed it on Nest with Hackclub 1. Finished the final commands /echo-summary The command accepts today , yesterday , last N , and unread . I had to translate each of these into Unix timestamps for Slack’s conversations.history API Filtering bot messages: The API returns bot messages too. Added .filter(m => !m.bot_id) to skip Echo’s own messages, otherwise Echo would summarize its own responses as if they were team decisions. 2. Deployed the project on Nest Finally deployed it on Nest as this Pushed all my project to Git (except my .env file) Made a container in nest and got the key Logged in my laptop using that key ssh [email protected] Made a folder for Echo and downloaded all the neccessary dependencies Clone the repo from my git and ran systemctl start echo.service and Echo became 24/7 online :) I’ve also shared a tutorial video on youtube to help you understand any command and how to use Echo on slack https://youtu.be/Wu7u665-Njo"}, {"post_id": 16169, "ts": "2026-06-26T08:44:27Z", "hours": 2.3225, "text": "I gave some real commands and functions to Echo and connect it to the Hackclub workspace. By the end of the my work today , Echo had: A working /echo-ask command — ask it anything, get an AI answer A working /echo-help command — shows all commands A working /echo-search command — live web search with cited sources A working /echo-docs command — searches technical documentation An onboarding event — sends a welcome message when added to any channel A proper utils.js service for shared helpers What I Did 1. Built the AI Brain services/ai.js The first thing I needed was a way for Echo to actually think and give responses. I built a single getAIResponse() function that every command would call: HackClub AI API as the backend, it let me use OpenAI and Google LLMs, and I could use it with my HackClub key temperature: 0.7 I’ve used temperature attribute so make model more creative in responsing. Default model gpt-4o-mini for speed and cost, but I made the model parameter swappable so different commands can use better models when needed. Cool personality , I gave Echo an anime girl personality with soft expressions. This was intentional — bots that feel like characters are more fun to use and easier to remember 2. Built services/utils.js , Helpers module Before building commands, I wrote the utilities they’d all share. I’ve used a cache logic so that commands like /echo-summary loop through 50-100 messages and need user names for each one. Without caching, that’s 100 API calls. With caching, it’s only as many unique users as exist. 3. Built command files Then I built the files for each command in ordered manner in my project so that I can manage them easily. You can see the code of each file on my git repo Problems I Hit and Fixed Slack’s 3-second ack timeout : Slack requires every slash command to be acknowledged within 3 seconds or it shows a timeout error to the user. AI calls take 3-10 seconds. Solution: await ack() immediately at the top of every handler, then do the slow work after. This was the first bug I had to fix. User IDs in messages : Slack stores messages with raw user IDs like <@U123ABC> instead of names. When I was building search, I realized the AI would receive these IDs and not know who said what. so I built resolveUserMentions() to replace them with real names before sending to the AI."}, {"post_id": 15490, "ts": "2026-06-25T05:50:16Z", "hours": 2.8906, "text": "What I Built Today I started Echo , an AI Slack bot that acts as a teammate inside your workspace. The idea hit me because our team was constantly switching tabs to look things up, ask questions, check what happened in a channel yesterday. I thought what if there was a bot that just lives in Slack and handles all of that? What I Did 1. Created the Slack App Went to api.slack.com/apps and created a new app from scratch. Chose Socket Mode instead of HTTP webhooks, this means the bot connects outbound to Slack, so I don’t need to expose a server or set up ngrok during development. Way easier for local dev. Added the required OAuth scopes : chat:write , commands , channels:history , users:read etc everything Echo would need to read messages and respond. Grabbed the three tokens I’d need: SLACK_BOT_TOKEN (xoxb-…) SLACK_SIGNING_SECRET SLACK_APP_TOKEN (xapp-… for Socket Mode) 2. Initialized the Node.js Project I’ve used Node.js for my project npm install @slack/bolt dotenv axios cheerio Dependencies I’m working with: @slack/bolt — Slack’s official framework for building bots. Handles all the event routing, slash commands, and ack() timing . dotenv — keep tokens out of the code axios — for hitting the HackClub AI API later cheerio — for parsing web content (I’ve planned for search in some cmds) Problem I Had: Socket Mode confusion , at first I wasn’t sure whether to use Socket Mode or HTTP. Read through the Bolt docs and realized Socket Mode is the right call for development because I don’t need a public URL. HTTP is for production deployments."}]...
|
Title: Echo by @Hamna | Stardance
Devlogs:
What I Title: Echo by @Hamna | Stardance
Devlogs:
What I Built Today I started Echo , an AI Slack bot that acts as a teammate inside your workspace. The idea hit me because our team was constantly switching tabs to look things up, ask questions, check what happened in a channel yesterday. I thought what if there was a bot that just lives in Slack and handles all of that? What I Did 1. Created the Slack App Went to api.slack.com/apps and created a new app from scratch. Chose Socket Mode instead of HTTP webhooks, this means the bot connects outbound to Slack, so I don’t need to expose a server or set up ngrok during development. Way easier for local dev. Added the required OAuth scopes : chat:write , commands , channels:history , users:read etc everything Echo would need to read messages and respond. Grabbed the three tokens I’d need: SLACK_BOT_TOKEN (xoxb-…) SLACK_SIGNING_SECRET SLACK_APP_TOKEN (xapp-… for Socket Mode) 2. Initialized the Node.js Project I’ve used Node.js for my project npm install @slack/bolt dotenv axios cheerio Dependencies I’m working with: @slack/bolt — Slack’s official framework for building bots. Handles all the event routing, slash commands, and ack() timing . dotenv — keep tokens out of the code axios — for hitting the HackClub AI API later cheerio — for parsing web content (I’ve planned for search in some cmds) Problem I Had: Socket Mode confusion , at first I wasn’t sure whether to use Socket Mode or HTTP. Read through the Bolt docs and realized Socket Mode is the right call for development because I don’t need a public URL. HTTP is for production deployments.
I gave some real commands and functions to Echo and connect it to the Hackclub workspace. By the end of the my work today , Echo had: A working /echo-ask command — ask it anything, get an AI answer A working /echo-help command — shows all commands A working /echo-search command — live web search with cited sources A working /echo-docs command — searches technical documentation An onboarding event — sends a welcome message when added to any channel A proper utils.js service for shared helpers What I Did 1. Built the AI Brain services/ai.js The first thing I needed was a way for Echo to actually think and give responses. I built a single getAIResponse() function that every command would call: HackClub AI API as the backend, it let me use OpenAI and Google LLMs, and I could use it with my HackClub key temperature: 0.7 I’ve used temperature attribute so make model more creative in responsing. Default model gpt-4o-mini for speed and cost, but I made the model parameter swappable so different commands can use better models when needed. Cool personality , I gave Echo an anime girl personality with soft expressions. This was intentional — bots that feel like characters are more fun to use and easier to remember 2. Built services/utils.js , Helpers module Before building commands, I wrote the utilities they’d all share. I’ve used a cache logic so that commands like /echo-summary loop through 50-100 messages and need user names for each one. Without caching, that’s 100 API calls. With caching, it’s only as many unique users as exist. 3. Built command files Then I built the files for each command in ordered manner in my project so that I can manage them easily. You can see the code of each file on my git repo Problems I Hit and Fixed Slack’s 3-second ack timeout : Slack requires every slash command to be acknowledged within 3 seconds or it shows a timeout error to the user. AI calls take 3-10 seconds. Solution: await ack() immediately at the top of every handler, then do the slow work after. This was the first bug I had to fix. User IDs in messages : Slack stores messages with raw user IDs like <@U123ABC> instead of names. When I was building search, I realized the AI would receive these IDs and not know who said what. so I built resolveUserMentions() to replace them with real names before sending to the AI.
I finished the last two most complex commands — /echo-summary and /echo-project and then finally deployed it on Nest with Hackclub 1. Finished the final commands /echo-summary The command accepts today , yesterday , last N , and unread . I had to translate each of these into Unix timestamps for Slack’s conversations.history API Filtering bot messages: The API returns bot messages too. Added .filter(m => !m.bot_id) to skip Echo’s own messages, otherwise Echo would summarize its own responses as if they were team decisions. 2. Deployed the project on Nest Finally deployed it on Nest as this Pushed all my project to Git (except my .env file) Made a container in nest and got the key Logged in my laptop using that key ssh [email protected] Made a folder for Echo and downloaded all the neccessary dependencies Clone the repo from my git and ran systemctl start echo.service and Echo became 24/7 online :) I’ve also shared a tutorial video on youtube to help you understand any command and how to use Echo on slack https://youtu.be/Wu7u665-Njo
I’ve added a new feature in the bot, which is online search . It searches the question online so that it gives the latest info about the question Added online search Here’s what was happening with previous version,Echo could only answer from the model’s own knowledge before, so I thought we need to fix this.I added a proper web search feature so she can actually go look things up. Wired up the Exa API for /echo-search — it searches the web, pulls the top results, fetches the actual page content, and feeds that back into the AI so the answer is grounded instead of hallucinated. Made sure sources always get cited back with clickable links in the Slack message Split search into two steps: search (get URLs) then contents (get the actual text), since Exa’s search endpoint alone only gives snippets, not enough to actually summarize from. Deployed the project on Nest Finally deployed it on Nest like the previous version and yo Echo became 24/7 online :) I’ve also shared a tutorial video on YouTube to help you understand any command and how to use Echo on Slack: Echo Tutorial Video
Ships:
I built a Slack bot named “Echo” with Node.js and Slack Bolt API, it handles instant Q&A, web search with summaries, conversation summarization, project context retrieval, and documentation lookup. The Challenges e biggest challenge was contextual intelligence: teaching an AI to sift through messy channel histories and pinned messages to understand a project’s current state without getting distracted by unrelated chatter. I’m particularly proud of the /echo-project command; it analyzes real-time team discussions to generate structured status reports, identifying active members, key decisions, and blockers automatically. It effectively turns a chaotic Slack thread into a professional project brief in seconds. What I’m Proud Of The speed. Getting answers in 2 seconds is no joke when you’re juggling AI inference + web search + Slack’s API. I’m also proud of the conversation summarization. it actually understands context, not just pulling random snippets. How to Test It Add Echo to your Slack workspace and try these commands: /echo-ask "your question" , /echo-search "topic" , /echo-summary (in a thread), /echo-project (in a channel), /echo-docs "what you need" . Start with simple queries, then get creative. DM me what breaks or what you wish it could do.
I’ve made a slack Echo bot, which let the user do the Q/A, online search, summarize the chat for the team, let the users do search about a some project in a chat if they’ve talked about that in the chat or mentioned anything, and help to understand some concept from the official documentation (cool ri8) In a nutshell, Echo bot is assistant, it’s helper with anime girl personality. This is Echo version 0.2 where I’ve added online search Feature so that AI won’t hallucinate about the question and give the latest info about the query....
|
1792835593.7857463
|
1792921993.7857463
|
|
7223
|
Was-OS by @S_U_Wasi | Stardance
|
S_U_Wasi
|
2
|
5.0
|
20
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-01T16:37:33Z", "hours": 2.0, "multiplier": 9.27, "payout": 20, "blessing": "neutral", "text": "Was-OS-V5.0 Was-OS is a web based operating system or WebOS. Currently WasOS is in it’s Basic form. Current Release features: Note & Notepad (Updated) Customised Settings Web-Apps (created apps not from web) (new) Terminal File manager Spreadsheet (New) To-do list (inside web-apps) (New) Calendar (Inside Web-apps) (New) Paint (Previously I added paint feature but also removed before deploy) Games (Tic Tac To is currently in service and others are under development) (New) Viewer (new) Calculator This web-os is also the inspiration of my upcoming new project. But I would be very happy if I could use was-cli (My another project) inside was-os but I can’t due to its static nature.", "repo": "https://github.com/MDSUWasi/Was-OS", "demo": "https://mdsuwasi.github.io/Was-OS/"}, {"ship_num": 2, "ts": "2026-06-12T10:31:21Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is my first ever developed web OS. Currently the basic structures are completed. My OS might not work or look as expected but development is not over yet ( all basic features/ function will work ) . In future many updates will arrive with new fix, apps, features etc. I have high hopes for this OS in future. The future version of this OS will work much better than the current one. The Web OS is published on GitHub pages at https://mdsuwasi.github.io/Was-OS/ And the source code is publicly available on GitHub at https://github.com/MDSUWasi/Was-OS", "repo": "https://github.com/MDSUWasi/Was-OS", "demo": "https://mdsuwasi.github.io/Was-OS/"}]...
|
[{"post_id": 20076, "ts": "202 [{"post_id": 20076, "ts": "2026-07-01T16:22:48Z", "hours": 2.1442, "text": "#Was-OS-V5.0 Was-OS is a web based operating system or WebOS. Currently WasOS is in it’s Basic form. Current Release features: Note & Notepad Customised Settings Web-Apps (created apps not from web) Terminal File manager Spreadsheet To-do list (inside web-apps) Calendar (Inside Web-apps) Paint Games (Tic Tac To is currently in service and others are under development) Viewer Calculator"}, {"post_id": 7397, "ts": "2026-06-12T10:10:50Z", "hours": 2.5194, "text": "Development of Was-OS V-4.0 is done. This is a structure only not completed version. Development will continue with lots of features ( I have high hopes for it in future) in future. Future updates will arrive with many features (e g. Paint, word processor, spreadsheet and many of my apps which are currently under development)"}, {"post_id": 6951, "ts": "2026-06-11T17:38:38Z", "hours": 0.4008, "text": "Initial base structure complete ✅."}, {"post_id": 6913, "ts": "2026-06-11T16:12:46Z", "hours": 0.4797, "text": "I am excited to create my first ever operating system on web."}]...
|
Title: Was-OS by @S_U_Wasi | Stardance
Devlogs:
I Title: Was-OS by @S_U_Wasi | Stardance
Devlogs:
I am excited to create my first ever operating system on web.
Initial base structure complete ✅.
Development of Was-OS V-4.0 is done. This is a structure only not completed version. Development will continue with lots of features ( I have high hopes for it in future) in future. Future updates will arrive with many features (e g. Paint, word processor, spreadsheet and many of my apps which are currently under development)
#Was-OS-V5.0 Was-OS is a web based operating system or WebOS. Currently WasOS is in it’s Basic form. Current Release features: Note & Notepad Customised Settings Web-Apps (created apps not from web) Terminal File manager Spreadsheet To-do list (inside web-apps) Calendar (Inside Web-apps) Paint Games (Tic Tac To is currently in service and others are under development) Viewer Calculator
Ships:
This is my first ever developed web OS. Currently the basic structures are completed. My OS might not work or look as expected but development is not over yet ( all basic features/ function will work ) . In future many updates will arrive with new fix, apps, features etc. I have high hopes for this OS in future. The future version of this OS will work much better than the current one. The Web OS is published on GitHub pages at https://mdsuwasi.github.io/Was-OS/ And the source code is publicly available on GitHub at https://github.com/MDSUWasi/Was-OS
Was-OS-V5.0 Was-OS is a web based operating system or WebOS. Currently WasOS is in it’s Basic form. Current Release features: Note & Notepad (Updated) Customised Settings Web-Apps (created apps not from web) (new) Terminal File manager Spreadsheet (New) To-do list (inside web-apps) (New) Calendar (Inside Web-apps) (New) Paint (Previously I added paint feature but also removed before deploy) Games (Tic Tac To is currently in service and others are under development) (New) Viewer (new) Calculator This web-os is also the inspiration of my upcoming new project. But I would be very happy if I could use was-cli (My another project) inside was-os but I can’t due to its static nature....
|
1792831833.3284552
|
1792918233.3284552
|
|
7225
|
Universe Data Booklet by @S_U_Wasi | Stardance
|
S_U_Wasi
|
2
|
26.88
|
216
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-16T19:37:05Z", "hours": 7.0, "multiplier": 9.05, "payout": 62, "blessing": "neutral", "text": "What I have built is known as Universe Data Booklet. As it’s name suggest it is a website which contains data on exoplanets and near earth asteroids. Previously it contains only data and analysis. But currently (After recent updates) there are many more features. To know about all the features please read my devlog or directly visit the website. While shipping this right now, I currently have many new ideas to add in this and I will definitely add those in future (Means coming soon). I cannot make Universe Data Booklet in one day or a week. I need time to create it. My vision regarding this project is very wide. I want that my project will help both learners and curious minds. During the development of this project I got into a problem. For latest near earth asteroids, I must have to use API. But I cannot put API on a completely open source project. That is why I have used public API. But public api has data fetch limits. Since the project is in it’s early state, not many users will visit. but I was thinking about future. That is why I came up with an idea, where I will use the Public API but it will never hit the limit (The smart caching). In my new development structure, the site will fetch data only once in 30 days (Data is fetched on the first visit after 30 days). Then that data is saved as cache and all other users get data from that one cache. By doing this data is fetched only once even if thousands of users visit at once. This solves the rate limit. but I need the latest data (at least 30 days). That is why the site fetch data once after 30 day. The program check the cache folder and if the data there is older than 30 days then the site fetches new data on the first visit and saves it. Now another storage problem arise. To solve that my site was programmed in such a way that it will store cache for 90 days and any cache data with are older than 90 days will be deleted. Thus I have solved the issue regarding the near Earth asteroids. I uses public api for near earth asteroids (Because asteroids data get change quickly). I uses csv file for exoplanets data (It is a manually saved data from authentic source) Thank You for giving Universe Data Booklet a try.", "repo": "https://github.com/MDSUWasi/Universe-Data-Booklet", "demo": "https://wasi100.pythonanywhere.com/"}, {"ship_num": 2, "ts": "2026-06-20T18:56:29Z", "hours": 11.0, "multiplier": 13.38, "payout": 154, "blessing": "neutral", "text": "Here is my Universe Data Booklet. As the mane suggest, this is a site which contains data about exoplanets and asteroids. Asteroids: Here I have used real asteroids data (Which is obtained through API ). Currently it contains data about asteroid which is near to our planet (Earth) Exoplanets: Exoplanets data is added manually inside the source code. So, exoplanets data can be viewed without any need of API. I have used API in asteroids but not in exoplanets because asteroids moves and changes around the Earth. And I want to work on current data. But exoplantes doesn’t change for a long time. So, there is no need of live API for that. There is a chart view in my site which shows the chat comparison between exoplanets/ asteroids mass. I have used public free API (I know about the limitations). I have solved that problem too. My site will only fetch data once in 30 days and saved it in cache. And through out the month the site will use that cache data. And again gives an API call after 31 days. Means, there will be only API call but many users can use my site. This also brings storage issue in my site. I have also fixed that. The cache data which are older than 90 days will be automatically removed. That’s all for now. I am also thinking for future update in this site too. Thank You.", "repo": "https://github.com/MDSUWasi/Universe-Data-Booklet", "demo": "https://wasi100.pythonanywhere.com/"}]...
|
[{"post_id": 78904, "ts": "202 [{"post_id": 78904, "ts": "2026-10-12T00:13:01Z", "hours": 1.5658, "text": "Another night-day another Problem . Yesterday I went to the source code to add a new theme and structure in Universe Data Booklet. Then I saw a bug in by server.py (backend). But I thought that I will just fix it after working on the theme. Then I worked on theme. Then during test time, I saw something scary (I will not tell what was that). Then I started fixing the theme, that caused bugs of js and css and them what! I never thought this would cause this much trouble. After some time, There was multiple tabs and tasks running into my PC (And which goes heavy on RAM). And What after My Virtual Development Environment got crashed and corrupt. And from night 11 AM to still now (6 AM) I am still fixing my environment otherwise all of my effort will be gone (I will lost my entire new source code)."}, {"post_id": 77832, "ts": "2026-10-08T13:27:04Z", "hours": 1.4394, "text": "New member I am glade to welcome Solar System as the new member on Universe Data Booklet . New Update! Now Universe Data Booklet have data on Planets, Exoplanets, Asteroids and Satellites (Including the artificial one). Now Universe Data Booklet can show image. But this feature is limited. I am thinking to thinking to increase (Just thinking for now) The above listed updates are just announcement for now. I haven’t released them yet, but going to in next few days. Since I took help from AI, I need to edit, debug and make some changes including reviewing and reviewing the code before releasing. Thank You"}, {"post_id": 77090, "ts": "2026-10-05T16:53:14Z", "hours": 0.9247, "text": "Upcoming Update Announcement In the next update there are huge changes coming. Some of them are shown below. A detailed description on exoplanets and asteroids: Now users can see a very detailed graphical data. This is because I have increased the number of data source. I have decreased the data fetch limit from 30 days to 7 days. So, starting from next release, all data provided in Universe Data Booklet will be re-new on the very first visit of each week unless there any issue pop up. Next work will be on Images for exoplanets and asteroids. This might be a tricky part because there are a lots of data and images for every data might be a problem. Let me check first. This is a new implementation idea I just thought. I will add this feature if I can successfully manage to find a way to add real images without disturbing the functionality and smoothness. All the thing I have mentioned above (except point 3) have been already implemented. I just have to review the source code twice again before release. Point 3 is on the way of implementation but not confirmed whether be released or not. If everything goes will. I will release this After my Exam is over. Thank You"}, {"post_id": 65478, "ts": "2026-09-10T17:09:51Z", "hours": 2.3808, "text": "Update Universe Data Booklet got a new update. And the updated version is currently online . On the previous version there are some typing errors and inconsistencies in the code, page and README. That is why I have revised and fix those. Now, I think user can relate the main page with the README. For new features. There 2 new features currently online. One is a game and another is a assistant. But both of those feature needs huge update soon. Currently I the game is 2D and Have no visual. The assistant currently cannot understand natural language. In the recent version the assistant can only answer if the name of asteroid or exoplanet available in the data are written as it is. And Currently I have no intention on adding LLM in it. My Future Plan for Universe Data Booklet I will design the assistant such a way that it will catch keywords on prompt and answer based on those keyword. The current Habitability Scanner is just like normal search and it doesn’t show much data on habitability (But it wasn’t made for that). I am thinking to work on this and will try to add more data. Since it is data booklet type. I think the current version have too much basic data. That is why I am thinking to add more data source and combine everything together. I am also thinking about a Wiki for Universe Data Booklet. After all those work. I think I will take some break from backend and frontend coding and work on Graphics (For game part, and icon). I also want to change it from 2D to 3D. Some new or updated idea may spark during the work on above. So, everything is changeable."}, {"post_id": 59722, "ts": "2026-09-01T17:22:43Z", "hours": 2.5711, "text": "I think I am going to ship Universe Data Booklet 3rd Time. Universe Data Booklet (UDB) is now on version 10.0.0.0.0 (It is also the second ship). From the first day of to now, UDB has improved a lot. Initially it was suppose to only display raw data in a graphical window. But as time passed new idea came to my mind and I add those in it. Currently UDB has many feature and I am going to add some more and make my 3rd ship of UDB before 30 September (Because I want to release it during ongoing Stardance). Overview on upcomming new updates: Changes on existing features. A universe explore game A Chat Bot (Used as alternative of search feature). Currently I am working on above 3. I may also add some more new feature if any new idea arrive."}, {"post_id": 44164, "ts": "2026-08-09T18:55:38Z", "hours": 0.9736, "text": "Today. I am going (I already have deployed. Go and check out if you want) to deploy the version 10.0.0.0.0 of Universe Data Booklet on Web and The first stable release. Currently Universe Data Booklet Have 3D Solar System Near Earth Asteroid View 3D Galactic exoplanet view 3D Map view Graph analysis (Difference of mass in bar diagram) Quiz Mode Flash Cards Guess Mode Research Mode I have updated the data row (Currently those are click-able) 4 different theme in 2 different structure. For more info see the README in the source code"}, {"post_id": 42726, "ts": "2026-08-07T16:20:15Z", "hours": 2.8481, "text": "Some new changes: Now, 3D vies have 2 different modes for exoplanets (A galaxy like simulation) and Asteroids (The solar system type simulation. Solar system because all data on asteroids are present for near Earth asteroids). Now, Universe Data Booklet have study (Flashcards, Quiz, Compare etc.) and research section (Specific details key point study). There are more updates. To see all of them and Try please wait until 10 August (I will deploy the site and Update it that day.). But the source is available in the repository. Those who are interested can give it a try directly from source code (But the source code is in early state and un-stable. So, I can not guarantee anything )."}, {"post_id": 41796, "ts": "2026-08-06T06:41:55Z", "hours": 1.5689, "text": "New Announcement: According to previous reviews and my own updates I have upgraded the Universe Data Booklet. New updates include: Now, users can download the data in good formate as PDF. There is new 3D view included. A new map included to get a visual map for both asteroids and exoplanets. A little bit change to chart view. Now, user can see the charts, 3D view and Map as a pop up (This was a issue in previous ship, and thanks to the reviews that I can fix them) Now the data row is click-able for selective view. There is a search bar for searching the exact asteroid and exoplanet by name The good thing is, user do not have to remember the full name for asteroids and exoplanets, only a partial correct name is enough New Features are currently written and available in the GitHub repository. I haven’t deployed those yet. Because I have some checking left (Including security and deployment issues). That is why the current site is not updated yet. I will deploy and release the update on 10 August 2026."}, {"post_id": 35261, "ts": "2026-07-26T15:46:56Z", "hours": 1.4956, "text": "I have upgraded the CSS, some of HTML (To introduce Hamburger) and some of JS. Initially I thought to give it a color matching with my portfolio, but that color doesn’t look good on it. That is why I used the current one (I have seen several other sites on this same color and I liked this)."}, {"post_id": 12689, "ts": "2026-06-20T18:44:22Z", "hours": 0.7319, "text": "I have added data about exoplanets (saved locally) and asteroids (data achieved using API). Additional to those, there is a graph view for asteroids and exoplanets, where, along x-axis there is exoplanets/ asteroids name and along y-axis there is the mass."}, {"post_id": 12400, "ts": "2026-06-20T07:20:52Z", "hours": 2.1811, "text": "Interface of my data booklet is ready."}, {"post_id": 5442, "ts": "2026-06-09T06:41:44Z", "hours": 4.4633, "text": "Previously I was thinking about making a universe data booklet with 20% universe data. But now I am thinking about increasing that limit."}, {"post_id": 3397, "ts": "2026-06-06T09:45:13Z", "hours": 4.1061, "text": "I am developing a universe Data Booklet for our Galaxy (up to a certain limit)"}]...
|
Title: Universe Data Booklet by @S_U_Wasi | Starda Title: Universe Data Booklet by @S_U_Wasi | Stardance
Devlogs:
I am developing a universe Data Booklet for our Galaxy (up to a certain limit)
Previously I was thinking about making a universe data booklet with 20% universe data. But now I am thinking about increasing that limit.
Interface of my data booklet is ready.
I have added data about exoplanets (saved locally) and asteroids (data achieved using API). Additional to those, there is a graph view for asteroids and exoplanets, where, along x-axis there is exoplanets/ asteroids name and along y-axis there is the mass.
I have upgraded the CSS, some of HTML (To introduce Hamburger) and some of JS. Initially I thought to give it a color matching with my portfolio, but that color doesn’t look good on it. That is why I used the current one (I have seen several other sites on this same color and I liked this).
New Announcement: According to previous reviews and my own updates I have upgraded the Universe Data Booklet. New updates include: Now, users can download the data in good formate as PDF. There is new 3D view included. A new map included to get a visual map for both asteroids and exoplanets. A little bit change to chart view. Now, user can see the charts, 3D view and Map as a pop up (This was a issue in previous ship, and thanks to the reviews that I can fix them) Now the data row is click-able for selective view. There is a search bar for searching the exact asteroid and exoplanet by name The good thing is, user do not have to remember the full name for asteroids and exoplanets, only a partial correct name is enough New Features are currently written and available in the GitHub repository. I haven’t deployed those yet. Because I have some checking left (Including security and deployment issues). That is why the current site is not updated yet. I will deploy and release the update on 10 August 2026.
Some new changes: Now, 3D vies have 2 different modes for exoplanets (A galaxy like simulation) and Asteroids (The solar system type simulation. Solar system because all data on asteroids are present for near Earth asteroids). Now, Universe Data Booklet have study (Flashcards, Quiz, Compare etc.) and research section (Specific details key point study). There are more updates. To see all of them and Try please wait until 10 August (I will deploy the site and Update it that day.). But the source is available in the repository. Those who are interested can give it a try directly from source code (But the source code is in early state and un-stable. So, I can not guarantee anything ).
Today. I am going (I already have deployed. Go and check out if you want) to deploy the version 10.0.0.0.0 of Universe Data Booklet on Web and The first stable release. Currently Universe Data Booklet Have 3D Solar System Near Earth Asteroid View 3D Galactic exoplanet view 3D Map view Graph analysis (Difference of mass in bar diagram) Quiz Mode Flash Cards Guess Mode Research Mode I have updated the data row (Currently those are click-able) 4 different theme in 2 different structure. For more info see the README in the source code
I think I am going to ship Universe Data Booklet 3rd Time. Universe Data Booklet (UDB) is now on version 10.0.0.0.0 (It is also the second ship). From the first day of to now, UDB has improved a lot. Initially it was suppose to only display raw data in a graphical window. But as time passed new idea came to my mind and I add those in it. Currently UDB has many feature and I am going to add some more and make my 3rd ship of UDB before 30 September (Because I want to release it during ongoing Stardance). Overview on upcomming new updates: Changes on existing features. A universe explore game A Chat Bot (Used as alternative of search feature). Currently I am working on above 3. I may also add some more new feature if any new idea arrive.
Update Universe Data Booklet got a new update. And the updated version is currently online . On the previous version there are some typing errors and inconsistencies in the code, page and README. That is why I have revised and fix those. Now, I think user can relate the main page with the README. For new features. There 2 new features currently online. One is a game and another is a assistant. But both of those feature needs huge update soon. Currently I the game is 2D and Have no visual. The assistant currently cannot understand natural language. In the recent version the assistant can only answer if the name of asteroid or exoplanet available in the data are written as it is. And Currently I have no intention on adding LLM in it. My Future Plan for Universe Data Booklet I will design the assistant such a way that it will catch keywords on prompt and answer based on those keyword. The current Habitability Scanner is just like normal search and it doesn’t show much data on habitability (But it wasn’t made for that). I am thinking to work on this and will try to add more data. Since it is data booklet type. I think the current version have too much basic data. That is why I am thinking to add more data source and combine everything together. I am also thinking about a Wiki for Universe Data Booklet. After all those work. I think I will take some break from backend and frontend coding and work on Graphics (For game part, and icon). I also want to change it from 2D to 3D. Some new or updated idea may spark during the work on above. So, everything is changeable.
Upcoming Update Announcement In the next update there are huge changes coming. Some of them are shown below. A detailed description on exoplanets and asteroids: Now users can see a very detailed graphical data. This is because I have increased the number of data source. I have decreased the data fetch limit from 30 days to 7 days. So, starting from next release, all data provided in Universe Data Booklet will be re-new on the very first visit of each week unless there any issue pop up. Next work will be on Images for exoplanets and asteroids. This might be a tricky part because there are a lots of data and images for every data might be a problem. Let me check first. This is a new implementation idea I just thought. I will add this feature if I can successfully manage to find a way to add real images without disturbing the functionality and smoothness. All the thing I have mentioned above (except point 3) have been already implemented. I just have to review the source code twice again before release. Point 3 is on the way of implementation but not confirmed whether be released or not. If everything goes will. I will release this After my Exam is over. Thank You
New member I am glade to welcome Solar System as the new member on Universe Data Booklet . New Update! Now Universe Data Booklet have data on Planets, Exoplanets, Asteroids and Satellites (Including the artificial one). Now Universe Data Booklet can show image. But this feature is limited. I am thinking to thinking to increase (Just thinking for now) The above listed updates are just announcement for now. I haven’t released them yet, but going to in next few days. Since I took help from AI, I need to edit, debug and make some changes including reviewing and reviewing the code before releasing. Thank You
Another night-day another Problem . Yesterday I went to the source code to add a new theme and structure in Universe Data Booklet. Then I saw a bug in by server.py (backend). But I thought that I will just fix it after working on the theme. Then I worked on theme. Then during test time, I saw something scary (I will not tell what was that). Then I started fixing the theme, that caused bugs of js and css and them what! I never thought this would cause this much trouble. After some time, There was multiple tabs and tasks running into my PC (And which goes heavy on RAM). And What after My Virtual Development Environment got crashed and corrupt. And from night 11 AM to still now (6 AM) I am still fixing my environment otherwise all of my effort will be gone (I will lost my entire new source code).
Ships:
Here is my Universe Data Booklet. As the mane suggest, this is a site which contains data about exoplanets and asteroids. Asteroids: Here I have used real asteroids data (Which is obtained through API ). Currently it contains data about asteroid which is near to our planet (Earth) Exoplanets: Exoplanets data is added manually inside the source code. So, exoplanets data can be viewed without any need of API. I have used API in asteroids but not in exoplanets because asteroids moves and changes around the Earth. And I want to work on current data. But exoplantes doesn’t change for a long time. So, there is no need of live API for that. There is a chart view in my site which shows the chat comparison between exoplanets/ asteroids mass. I have used public free API (I know about the limitations). I have solved that problem too. My site will only fetch data once in 30 days and saved it in cache. And through out the month the site will use that cache data. And again gives an API call after 31 days. Means, there will be only API call but many users can use my site. This also brings storage issue in my site. I have also fixed that. The cache data which are older than 90 days will be automatically removed. That’s all for now. I am also thinking for future update in this site too. Thank You.
What I have built is known as Universe Data Booklet. As it’s name suggest it is a website which contains data on exoplanets and near earth asteroids. Previously it contains only data and analysis. But currently (After recent updates) there are many more features. To know about all the features please read my devlog or directly visit the website. While shipping this right now, I currently have many new ideas to add in this and I will definitely add those in future (Means coming soon). I cannot make Universe Data Booklet in one day or a week. I need time to create it. My vision regarding this project is very wide. I want that my project will help both learners and curious minds. During the development of this project I got into a problem. For latest near earth asteroids, I must have to use API. But I cannot put API on a completely open source project. That is why I have used public API. But public api has data fetch limits. Since the project is in it’s early state, not many users will visit. but I was thinking about future. That is why I came up with an idea, where I will use the Public API but it will never hit the limit (The smart caching). In my new development structure, the site will fetch data only once in 30 days (Data is fetched on the first visit after 30 days). Then that data is saved as cache and all other users get data from that one cache. By doing this data is fetched only once even if thousands of users visit at once. This solves the rate limit. but I need the latest data (at least 30 days). That is why the site fetch data once after 30 day. The program check the cache folder and if the data there is older than 30 days then the site fetches new data on the first visit and saves it. Now another storage problem arise. To solve that my site was programmed in such a way that it will store cache for 90 days and any cache data with are older than 90 days will be deleted. Thus I have solved the issue regarding the near Earth asteroids. I uses public api for near earth asteroids (Because asteroids data get change quickly). I uses csv file for exoplanets data (It is a manually saved data from authentic source) Thank You for giving Universe Data Booklet a try....
|
1792850087.480855
|
1792936487.480855
|
|
7489
|
Weather app by @jupeme6 | Stardance
|
jupeme6
|
2
|
21.0
|
251
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-09T03:15:38Z", "hours": 7.0, "multiplier": 14.13, "payout": 93, "blessing": "neutral", "text": "What did you make? A weather app that lets you search the current weather of any city and get a 5-day forecast. Each search shows temperature, humidity, wind speed, feels-like, and a description, with a GIF background that matches the weather condition (sun, rain, snow, storm, etc.). Built in four betas: basic lookup, glassmorphism redesign with weather GIFs, 5-day forecast with a temperature chart drawn on canvas, and the final version with geolocation, favorites, PWA support, plus a settings panel with language (ES/EN) and units (Celsius/Fahrenheit) toggles added in response to reviewer feedback. The app is installable on desktop and mobile, works offline, and uses OpenWeatherMap + Giphy APIs. What was challenging? Two bugs almost broke me. My editor’s autocomplete kept rewriting value to ariaValueMax , which silently broke the search button in two projects. Later, when I tried to extend my mostrarClima function by saving the old one and redefining it, I caused infinite recursion because of JavaScript hoisting. Fix was to use a function expression instead. Also, the Giphy search API returned random GIFs that didn’t represent the weather (got a dancing water drop for London), so I picked one fixed GIF per weather type by hand and hardcoded the URLs. The internationalization had a sneaky bug too. The language toggle translated the main UI but left the forecast section in Spanish because that code was hardcoded from an earlier beta. Had to re-query the API with the correct lang parameter and re-translate the forecast cards, the canvas day labels, and the legend separately. What are you proud of? The temperature chart is drawn with vanilla canvas, no Chart.js, just moveTo/lineTo/arc. About 60 lines of code, exactly the result I wanted. Also the weather GIF backgrounds: each weather type has a fixed GIF picked by hand, so it feels like you’re actually looking at the sky of that city. And the whole thing works as an installable PWA with offline support, plus now supports English and Fahrenheit for international users. What should people know so they can test your project? Open the demo URL and type a city name (Madrid, London, Tokyo, New York). You’ll see the current weather with a matching GIF background, plus a 5-day forecast with a temperature chart below. Click the gear icon in the top right to open settings and switch between Spanish / English and Celsius / Fahrenheit. Click the star next to the city name to add it to favorites. Click “My location” to get weather for your actual coordinates. On Chrome you can install the app from the address bar icon. Live demo: https://notjuangamer10.github.io/weather-app/ Source: https://github.com/notjuangamer10/weather-app", "repo": "https://github.com/NOTJuangamer10/weather-app", "demo": "https://notjuangamer10.github.io/weather-app/"}, {"ship_num": 2, "ts": "2026-08-01T12:18:21Z", "hours": 14.0, "multiplier": 11.24, "payout": 158, "blessing": "neutral", "text": "What did you make? A weather app that lets you search the current weather of any city and get a 5-day forecast. Each search shows temperature, humidity, wind speed, feels-like, and a description, with a GIF background that matches the weather condition (sun, rain, snow, storm, etc.). Built in four betas: basic lookup, glassmorphism redesign with weather GIFs, 5-day forecast with a temperature chart drawn on canvas, and the final version with geolocation, favorites and PWA support. The app is installable on desktop and mobile, works offline, and uses OpenWeatherMap + Giphy APIs. What was challenging? Two bugs almost broke me. My editor’s autocomplete kept rewriting value to ariaValueMax , which silently broke the search button in two projects. Later, when I tried to extend my mostrarClima function by saving the old one and redefining it, I caused infinite recursion because of JavaScript hoisting - function declarations get hoisted, so I was saving the new function instead of the old one. Fix was to use a function expression instead. Also, the Giphy search API returned random GIFs that didn’t represent the weather (got a dancing water drop for London), so I picked one fixed GIF per weather type by hand and hardcoded the URLs. What are you proud of? The temperature chart is drawn with vanilla canvas - no Chart.js, just moveTo/lineTo/arc. About 60 lines of code, exactly the result I wanted. Also the weather GIF backgrounds: instead of a static gradient or random GIFs, each weather type has a fixed GIF picked by hand, so it feels like you’re actually looking at the sky of that city. And the whole thing works as an installable PWA with offline support. What should people know so they can test your project? Open the demo URL and type a city name (Madrid, London, Tokyo, New York). You’ll see the current weather with a matching GIF background, plus a 5-day forecast with a temperature chart below. Click the star next to the city name to add it to favorites — they show up as chips and persist across reloads. Click “My location” to get weather for your actual coordinates (browser will ask for permission). On Chrome you can install the app from the address bar icon, after that it opens in its own window and works offline. Live demo: https://notjuangamer10.github.io/weather-app/ Source: https://github.com/notjuangamer10/weather-app", "repo": "https://github.com/NOTJuangamer10/weather-app", "demo": "https://notjuangamer10.github.io/weather-app/"}]...
|
[{"post_id": 43697, "ts": "202 [{"post_id": 43697, "ts": "2026-08-09T03:14:25Z", "hours": 6.5617, "text": "Small patch for the Weather App based on reviewer feedback. Three fixes. First, the language toggle now actually translates the full UI. Before, switching to English left several strings in Spanish: the forecast heading, the day labels in both the cards and the canvas chart, the “highs / lows” legend, and most embarrassingly, the weather description itself (“algo de nubes” instead of “scattered clouds”). The issue was that the forecast code was hardcoded in Spanish. Now it queries the OpenWeatherMap API with the correct lang parameter, and re-translates the forecast cards, the canvas labels, and the legend when the language changes. Second, the units toggle (Celsius / Fahrenheit) was already working but now also converts wind speed from km/h to mph when Fahrenheit is selected, which makes sense for imperial users. Third, the welcome state is in place. First-time visitors now see a pulsing sun icon and a short prompt instead of a blank page with just a search bar. Thanks to everyone who tested and left feedback. Three reviewers asked for multi-language support and one asked for unit conversion, so those were the top requested features."}, {"post_id": 38538, "ts": "2026-08-01T00:07:24Z", "hours": 3.4889, "text": "Beta 4, the final version of the Weather App, is up. Three new things: Geolocation: there’s a “My location” button next to the search bar that uses the browser’s geolocation API to get your coordinates, then queries OpenWeatherMap by lat/lon instead of city name. Useful when you don’t know the exact city name or just want your local weather fast. Favorites: each result has a star icon next to the city name. Click it to add the city to your favorites, which show up as chips below the search bar. Click a chip to search that city again, click the × to remove it. Favorites are stored in localStorage so they survive reloads. PWA: added a manifest and a service worker, so the app is now installable on desktop and mobile. Once installed it opens in its own window without the browser chrome, and the service worker caches the main files so it works offline too. Also changed the font from system-ui to Space Grotesk. The default sans-serif felt a bit generic, Space Grotesk gives it more character, especially on the big temperature numbers. This is the last beta for this project. Calling Weather App done."}, {"post_id": 37533, "ts": "2026-07-30T10:47:19Z", "hours": 3.8489, "text": "Beta 3 of the Weather App is up. Now after the current weather you get a 5-day forecast with the day name, weather icon and max/min temperature for each day!!!(kinda usefull i know), plus a small chart below showing the max (red) and min (blue) temperatures across the week. The chart is drawn on a canvas with vanilla JS, no Chart.js or any library, just moveto/lineTo/arc. The tricky part was the forecast API. It returns a data point every 3 hours, so I had to filter and group them by day, taking the actual max and min of all the 3-hour readings inside each day. Otherwise the “max” was just the temperature at a random hour, not the real daily high. I also had to redefine my existing mostrarClima function to also trigger the forecast fetch - I kept the old function in a variable and called it inside the new one, so the GIF background logic I had before still runs. Took me a while to figure that pattern out. Next version will probably be the last: geolocation + favorites + installable PWA. But i don`t really know if geolocation is a good idea Update:Hit a nasty bug in this version: every search returned “city not found” even for Madrid, (which definitely works). Turns out the pattern I used to extend mostrarClima (saving the old function and redefining it) caused an infinite recursion because of JavaScript hoisting -function declarations get hoisted to the top, so when I saved “the old function” I was actually saving the new one, which then called itself forever. Changed function mostrarClima() to mostrarClima = function() (function expression instead of declaration) and it fixed it. Took me way too long to figure out."}, {"post_id": 36722, "ts": "2026-07-28T23:22:38Z", "hours": 4.1825, "text": "Beta 2 of the Weather App is up. The UI got a real redesign: the background is now a GIF that matches the weather condition based on the info that OpenWeathermap gave me: a sunny sky for clear weather, falling rain for rainy cities, snow for cold ones, lightning for storms, etc. Cards use glassmorphism (frosted glass) so the GIF shows through while the text stays readable, with a dark overlay to keep contrast. Originally I called the Giphy API on every search and got a random GIF, but the results were inconsistent, for example, once I searched London and got a dancing water drop instead of actual rain. So I picked one fixed GIF per weather type by hand and hardcoded them. Now it feels like you’re actually looking at the sky of that city, same view every time. Next version will add a 5-day forecast below the current weather."}, {"post_id": 36048, "ts": "2026-07-27T21:28:29Z", "hours": 2.5794, "text": "First version of my Weather App is up. You type a city name, hit Search, and it pulls temperature, humidity, wind, feels-like and a short description from OpenWeatherMap. UI is intentionally plain cuz I wanted to make sure the API actually works before making it pretty. Fought my editor’s autocomplete again: it kept rewriting value to ariaValueMax , which silently broke the search button. Same bug as in my last project, should really disable that suggestion. Also took me a while to get the .then / .catch / .finally chain right, especially handling 404 when the city doesn’t exist without crashing the page. Next version will be a proper redesign. Right now it works but it’s ugly."}]...
|
Title: Weather app by @jupeme6 | Stardance
Devlog Title: Weather app by @jupeme6 | Stardance
Devlogs:
First version of my Weather App is up. You type a city name, hit Search, and it pulls temperature, humidity, wind, feels-like and a short description from OpenWeatherMap. UI is intentionally plain cuz I wanted to make sure the API actually works before making it pretty. Fought my editor’s autocomplete again: it kept rewriting value to ariaValueMax , which silently broke the search button. Same bug as in my last project, should really disable that suggestion. Also took me a while to get the .then / .catch / .finally chain right, especially handling 404 when the city doesn’t exist without crashing the page. Next version will be a proper redesign. Right now it works but it’s ugly.
Beta 2 of the Weather App is up. The UI got a real redesign: the background is now a GIF that matches the weather condition based on the info that OpenWeathermap gave me: a sunny sky for clear weather, falling rain for rainy cities, snow for cold ones, lightning for storms, etc. Cards use glassmorphism (frosted glass) so the GIF shows through while the text stays readable, with a dark overlay to keep contrast. Originally I called the Giphy API on every search and got a random GIF, but the results were inconsistent, for example, once I searched London and got a dancing water drop instead of actual rain. So I picked one fixed GIF per weather type by hand and hardcoded them. Now it feels like you’re actually looking at the sky of that city, same view every time. Next version will add a 5-day forecast below the current weather.
Beta 3 of the Weather App is up. Now after the current weather you get a 5-day forecast with the day name, weather icon and max/min temperature for each day!!!(kinda usefull i know), plus a small chart below showing the max (red) and min (blue) temperatures across the week. The chart is drawn on a canvas with vanilla JS, no Chart.js or any library, just moveto/lineTo/arc. The tricky part was the forecast API. It returns a data point every 3 hours, so I had to filter and group them by day, taking the actual max and min of all the 3-hour readings inside each day. Otherwise the “max” was just the temperature at a random hour, not the real daily high. I also had to redefine my existing mostrarClima function to also trigger the forecast fetch - I kept the old function in a variable and called it inside the new one, so the GIF background logic I had before still runs. Took me a while to figure that pattern out. Next version will probably be the last: geolocation + favorites + installable PWA. But i don`t really know if geolocation is a good idea Update:Hit a nasty bug in this version: every search returned “city not found” even for Madrid, (which definitely works). Turns out the pattern I used to extend mostrarClima (saving the old function and redefining it) caused an infinite recursion because of JavaScript hoisting -function declarations get hoisted to the top, so when I saved “the old function” I was actually saving the new one, which then called itself forever. Changed function mostrarClima() to mostrarClima = function() (function expression instead of declaration) and it fixed it. Took me way too long to figure out.
Beta 4, the final version of the Weather App, is up. Three new things: Geolocation: there’s a “My location” button next to the search bar that uses the browser’s geolocation API to get your coordinates, then queries OpenWeatherMap by lat/lon instead of city name. Useful when you don’t know the exact city name or just want your local weather fast. Favorites: each result has a star icon next to the city name. Click it to add the city to your favorites, which show up as chips below the search bar. Click a chip to search that city again, click the × to remove it. Favorites are stored in localStorage so they survive reloads. PWA: added a manifest and a service worker, so the app is now installable on desktop and mobile. Once installed it opens in its own window without the browser chrome, and the service worker caches the main files so it works offline too. Also changed the font from system-ui to Space Grotesk. The default sans-serif felt a bit generic, Space Grotesk gives it more character, especially on the big temperature numbers. This is the last beta for this project. Calling Weather App done.
Small patch for the Weather App based on reviewer feedback. Three fixes. First, the language toggle now actually translates the full UI. Before, switching to English left several strings in Spanish: the forecast heading, the day labels in both the cards and the canvas chart, the “highs / lows” legend, and most embarrassingly, the weather description itself (“algo de nubes” instead of “scattered clouds”). The issue was that the forecast code was hardcoded in Spanish. Now it queries the OpenWeatherMap API with the correct lang parameter, and re-translates the forecast cards, the canvas labels, and the legend when the language changes. Second, the units toggle (Celsius / Fahrenheit) was already working but now also converts wind speed from km/h to mph when Fahrenheit is selected, which makes sense for imperial users. Third, the welcome state is in place. First-time visitors now see a pulsing sun icon and a short prompt instead of a blank page with just a search bar. Thanks to everyone who tested and left feedback. Three reviewers asked for multi-language support and one asked for unit conversion, so those were the top requested features.
Ships:
What did you make? A weather app that lets you search the current weather of any city and get a 5-day forecast. Each search shows temperature, humidity, wind speed, feels-like, and a description, with a GIF background that matches the weather condition (sun, rain, snow, storm, etc.). Built in four betas: basic lookup, glassmorphism redesign with weather GIFs, 5-day forecast with a temperature chart drawn on canvas, and the final version with geolocation, favorites and PWA support. The app is installable on desktop and mobile, works offline, and uses OpenWeatherMap + Giphy APIs. What was challenging? Two bugs almost broke me. My editor’s autocomplete kept rewriting value to ariaValueMax , which silently broke the search button in two projects. Later, when I tried to extend my mostrarClima function by saving the old one and redefining it, I caused infinite recursion because of JavaScript hoisting - function declarations get hoisted, so I was saving the new function instead of the old one. Fix was to use a function expression instead. Also, the Giphy search API returned random GIFs that didn’t represent the weather (got a dancing water drop for London), so I picked one fixed GIF per weather type by hand and hardcoded the URLs. What are you proud of? The temperature chart is drawn with vanilla canvas - no Chart.js, just moveTo/lineTo/arc. About 60 lines of code, exactly the result I wanted. Also the weather GIF backgrounds: instead of a static gradient or random GIFs, each weather type has a fixed GIF picked by hand, so it feels like you’re actually looking at the sky of that city. And the whole thing works as an installable PWA with offline support. What should people know so they can test your project? Open the demo URL and type a city name (Madrid, London, Tokyo, New York). You’ll see the current weather with a matching GIF background, plus a 5-day forecast with a temperature chart below. Click the star next to the city name to add it to favorites — they show up as chips and persist across reloads. Click “My location” to get weather for your actual coordinates (browser will ask for permission). On Chrome you can install the app from the address bar icon, after that it opens in its own window and works offline. Live demo: https://notjuangamer10.github.io/weather-app/ Source: https://github.com/notjuangamer10/weather-app
What did you make? A weather app that lets you search the current weather of any city and get a 5-day forecast. Each search shows temperature, humidity, wind speed, feels-like, and a description, with a GIF background that matches the weather condition (sun, rain, snow, storm, etc.). Built in four betas: basic lookup, glassmorphism redesign with weather GIFs, 5-day forecast with a temperature chart drawn on canvas, and the final version with geolocation, favorites, PWA support, plus a settings panel with language (ES/EN) and units (Celsius/Fahrenheit) toggles added in response to reviewer feedback. The app is installable on desktop and mobile, works offline, and uses OpenWeatherMap + Giphy APIs. What was challenging? Two bugs almost broke me. My editor’s autocomplete kept rewriting value to ariaValueMax , which silently broke the search button in two projects. Later, when I tried to extend my mostrarClima function by saving the old one and redefining it, I caused infinite recursion because of JavaScript hoisting. Fix was to use a function expression instead. Also, the Giphy search API returned random GIFs that didn’t represent the weather (got a dancing water drop for London), so I picked one fixed GIF per weather type by hand and hardcoded the URLs. The internationalization had a sneaky bug too. The language toggle translated the main UI but left the forecast section in Spanish because that code was hardcoded from an earlier beta. Had to re-query the API with the correct lang parameter and re-translate the forecast cards, the canvas day labels, and the legend separately. What are you proud of? The temperature chart is drawn with vanilla canvas, no Chart.js, just moveTo/lineTo/arc. About 60 lines of code, exactly the result I wanted. Also the weather GIF backgrounds: each weather type has a fixed GIF picked by hand, so it feels like you’re actually looking at the sky of that city. And the whole thing works as an installable PWA with offline support, plus now supports English and Fahrenheit for international users. What should people know so they can test your project? Open the demo URL and type a city name (Madrid, London, Tokyo, New York). You’ll see the current weather with a matching GIF background, plus a 5-day forecast with a temperature chart below. Click the gear icon in the top right to open settings and switch between Spanish / English and Celsius / Fahrenheit. Click the star next to the city name to add it to favorites. Click “My location” to get weather for your actual coordinates. On Chrome you can install the app from the address bar icon. Live demo: https://notjuangamer10.github.io/weather-app/ Source: https://github.com/notjuangamer10/weather-app...
|
1792878681.3015943
|
1793742681.3015943
|
|
7508
|
ASCII Slack Bot by @Mario | Stardance
|
Mario
|
2
|
11.0
|
44
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-06T21:26:07Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "ASCII Slack bot with a couple of improvements. I made some changes based on feedback I received following this project’s first ship. The bot can now create 10 pre-defined ASCII images as well as ASCII art of any subject the user chooses through the use of an API. The /ascii-text command can now handle multi-word pieces of text and use fonts that are longer than one word through the use of double quotes. Additionally, the bot should be easier to use for users thanks to the welcome message printed when they first join the Slack channel. Any additional suggestions for improvements are welcome.", "repo": "https://github.com/IdkThisIg/ASCII-Slack-Bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0BC5PD2Y57"}, {"ship_num": 2, "ts": "2026-06-21T15:38:20Z", "hours": 6.0, "multiplier": 7.23, "payout": 44, "blessing": "neutral", "text": "A silly little Slack bot that allows users to create ASCII images and text with simple commands. The bot can produce ASCII art images of Shrek, Garfield, Bluey, and Pikachu. It can also create ASCII text of any normal text with no whitespace and in any single-word font found at https://asciified.thelicato.io/ . It also has a help command to help users use the different commands. The Install link only works for the Hack Club Slack workspace.", "repo": "https://github.com/IdkThisIg/ASCII-Slack-Bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0BC5PD2Y57"}]...
|
[{"post_id": 21256, "ts": "202 [{"post_id": 21256, "ts": "2026-07-03T02:59:18Z", "hours": 0.4436, "text": "Another issue mentioned in the reviews was that some users struggled to figure out how to use the bot. Looking at the failed commands they attempted, it seemed that first-time users weren’t sure what commands were available. To address this, I added a welcome message that appears whenever someone joins a Slack channel containing the bot, directing them to the help command if they need it."}, {"post_id": 19735, "ts": "2026-07-01T03:56:13Z", "hours": 4.9911, "text": "I took a look at the feedback I got on this project’s first ship. Some of the reviews mentioned how limited the draw feature was, so I implemented Claude Sonnet 5 through an API to generate images if the user provides an unknown subject as an argument. Unfortunately, the AI isn’t all that great at ASCII art, so it is probably best if only used for very simple subjects. I also decided to expand the predefined subjects from 4 to 10."}, {"post_id": 5382, "ts": "2026-06-09T04:01:29Z", "hours": 2.6289, "text": "I’ve been working on trying to make the bot available for anyone to use in any Slack workspace. I tried to accomplish this without a domain because I didn’t want to pay for one, and I wasn’t aware of the free options available. Even though only 2 and a half hours are being logged from the occasional edits I’ve had to make in VS Code, I spent at least 4 hours on top of that working through this, mostly on the terminal. I’ve applied for the GitHub Student Developer Pack, which will hopefully allow me to obtain a domain and make this process much easier."}, {"post_id": 3886, "ts": "2026-06-06T23:52:24Z", "hours": 1.3717, "text": "I got the bot working 24/7 using nest. I had some trouble figuring out how to update the bot so that it would use the latest version 24/7, but I figured it out eventually. Also added both Bluey and Pikachu as drawable characters and implemented the asciified API to add ASCII text."}, {"post_id": 3538, "ts": "2026-06-06T15:00:22Z", "hours": 2.1136, "text": "The main functionality of my bot is finished. I will be working on getting it to be live 24/7. Also looking for suggestions as to what to add next"}]...
|
Title: ASCII Slack Bot by @Mario | Stardance
Devl Title: ASCII Slack Bot by @Mario | Stardance
Devlogs:
The main functionality of my bot is finished. I will be working on getting it to be live 24/7. Also looking for suggestions as to what to add next
I got the bot working 24/7 using nest. I had some trouble figuring out how to update the bot so that it would use the latest version 24/7, but I figured it out eventually. Also added both Bluey and Pikachu as drawable characters and implemented the asciified API to add ASCII text.
I’ve been working on trying to make the bot available for anyone to use in any Slack workspace. I tried to accomplish this without a domain because I didn’t want to pay for one, and I wasn’t aware of the free options available. Even though only 2 and a half hours are being logged from the occasional edits I’ve had to make in VS Code, I spent at least 4 hours on top of that working through this, mostly on the terminal. I’ve applied for the GitHub Student Developer Pack, which will hopefully allow me to obtain a domain and make this process much easier.
I took a look at the feedback I got on this project’s first ship. Some of the reviews mentioned how limited the draw feature was, so I implemented Claude Sonnet 5 through an API to generate images if the user provides an unknown subject as an argument. Unfortunately, the AI isn’t all that great at ASCII art, so it is probably best if only used for very simple subjects. I also decided to expand the predefined subjects from 4 to 10.
Another issue mentioned in the reviews was that some users struggled to figure out how to use the bot. Looking at the failed commands they attempted, it seemed that first-time users weren’t sure what commands were available. To address this, I added a welcome message that appears whenever someone joins a Slack channel containing the bot, directing them to the help command if they need it.
Ships:
A silly little Slack bot that allows users to create ASCII images and text with simple commands. The bot can produce ASCII art images of Shrek, Garfield, Bluey, and Pikachu. It can also create ASCII text of any normal text with no whitespace and in any single-word font found at https://asciified.thelicato.io/ . It also has a help command to help users use the different commands. The Install link only works for the Hack Club Slack workspace.
ASCII Slack bot with a couple of improvements. I made some changes based on feedback I received following this project’s first ship. The bot can now create 10 pre-defined ASCII images as well as ASCII art of any subject the user chooses through the use of an API. The /ascii-text command can now handle multi-word pieces of text and use fonts that are longer than one word through the use of double quotes. Additionally, the bot should be easier to use for users thanks to the welcome message printed when they first join the Slack channel. Any additional suggestions for improvements are welcome....
|
1792835348.8642209
|
1792921748.8642209
|
|
7632
|
Dave by @Nicormu | Stardance
|
Nicormu
|
2
|
3.0
|
12
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-12T01:08:49Z", "hours": 1.0, "multiplier": 3.97, "payout": 5, "blessing": "neutral", "text": "🚀 Dave — Part 2 I went back to Dave and actually gave him feelings. The original version was just a collection of random responses living in Slack. This update makes him feel like someone with opinions. Pre-written arrays of snark I wrote at 2 AM: /dave-debater argues against anything you say, /dave-existential questions his own purpose (he doesn’t have one), and /dave-compliment is the only wholesome thing in this entire project. Spent more time fighting Nest’s SSH passphrase out of nowhere than writing code. journalctl –user -u dave.service became my nemesis about three times that day. Toggling restart commands blindly until something stuck. But now it runs, and there’s a bot in our workspace that roasts people for no reason. That’s enough. Try /dave-debater I love coding or /dave-existential. 😄", "repo": "https://github.com/Nicormu/DaveTheSlackBot", "demo": "https://hackclub.enterprise.slack.com/archives/C0BBS8D77DW"}, {"ship_num": 2, "ts": "2026-06-16T03:08:18Z", "hours": 2.0, "multiplier": 4.97, "payout": 7, "blessing": "neutral", "text": "I made Dave, a Slack bot with a bunch of fun slash commands that can tell jokes, give questionable life advice, play small games, and generally make a workspace a little less boring. The hardest part wasn’t coding the commands—it was getting the bot deployed 24/7 on a Nest server. I got stuck on an SSH passphrase issue that I don’t even remember setting, and I spent quite a while troubleshooting it. The deployment guide was also a bit confusing for me at some points, so getting everything running reliably took more effort than expected. I’m proud that I managed to get the whole thing working end-to-end: Slack integration, command handling, and deployment. It was also fun giving the bot its own personality instead of making it feel like a generic utility. To test it, add the bot to a Slack workspace and try some of the /dave-* commands. Most of them are designed to be playful, so don’t expect serious answers from Dave. 😄", "repo": "https://github.com/Nicormu/DaveTheSlackBot", "demo": "https://hackclub.enterprise.slack.com/archives/C0BBS8D77DW"}]...
|
[{"post_id": 45496, "ts": "202 [{"post_id": 45496, "ts": "2026-08-12T01:03:47Z", "hours": 0.8764, "text": "What’s new this version: /dave-mood — Dave describes his emotional state (spoiler: it’s not good) /dave-advice — Terrible life advice for real-life problems /dave-compliment — Because some days you need to hear nice things /dave-fortune — Fortune cookie wisdom for developers /dave-debater — Feed Dave an opinion and watch him tear it apart /dave-decide — Let Dave make your decisions when you can’t /dave-existential — Deep thoughts from a very shallow bot"}, {"post_id": 10358, "ts": "2026-06-17T01:14:23Z", "hours": 0.3092, "text": "Devlog #4 I expanded Dave with several new commands, including coin flips, random numbers, quotes, roasts, uptime monitoring, and usage statistics. These additions make the bot more interactive while keeping its sarcastic personality. I also added command tracking and improved error handling, making it easier to monitor the bot and diagnose issues when something goes wrong. With these improvements, Dave feels more complete and has a stronger foundation for future features."}, {"post_id": 9664, "ts": "2026-06-16T02:19:07Z", "hours": 0.3778, "text": "Devlog #3 This week I finished migrating the bot from its old DSB branding to Dave. All commands and references were updated to use the new name, making the project feel much more consistent. I also set up Dave to run as a persistent service on Nest, which means it now stays online 24/7 instead of stopping when my SSH session ends. This makes the bot much more reliable and ready for regular use."}, {"post_id": 8386, "ts": "2026-06-13T22:58:29Z", "hours": 0.3356, "text": "Devlog #2 - Meet Dave and the Deployment Struggle I finally gave the bot a name, a fresh look, and a sassy personality. This week I implemented Dave’s new pixel-art avatar, a /dsb-study timer, a shower thoughts command, and hidden Easter eggs that roast users in the chat. The biggest challenge was deploying the bot 24/7. I struggled with cloud hosting because every time the server restarts, all the active study timers get completely wiped out. Along the way, I became more comfortable using regex listeners and writing dynamic responses. Next, I want to fix the deployment, connect a database to save timers, and smooth out API errors."}, {"post_id": 4260, "ts": "2026-06-07T14:51:15Z", "hours": 0.8194, "text": "Devlog #1 - First Working Version of My Slack Bot I finally got the first version of my Slack bot working. This week I implemented four slash commands: a help menu, a latency check, a random cat fact command, and a random joke command. I also integrated external APIs and added basic error handling to prevent failures when an API is unavailable. The biggest challenge was understanding Slack’s command flow. I spent quite a while debugging commands before realizing they need to be acknowledged almost immediately before performing other operations. Along the way, I became more comfortable working with async/await, Axios, and Slack Bolt. Next, I want to improve message formatting, add logging, write tests, and deploy the bot so it can run 24/7."}]...
|
Title: Dave by @Nicormu | Stardance
Devlogs:
Devl Title: Dave by @Nicormu | Stardance
Devlogs:
Devlog #1 - First Working Version of My Slack Bot I finally got the first version of my Slack bot working. This week I implemented four slash commands: a help menu, a latency check, a random cat fact command, and a random joke command. I also integrated external APIs and added basic error handling to prevent failures when an API is unavailable. The biggest challenge was understanding Slack’s command flow. I spent quite a while debugging commands before realizing they need to be acknowledged almost immediately before performing other operations. Along the way, I became more comfortable working with async/await, Axios, and Slack Bolt. Next, I want to improve message formatting, add logging, write tests, and deploy the bot so it can run 24/7.
Devlog #2 - Meet Dave and the Deployment Struggle I finally gave the bot a name, a fresh look, and a sassy personality. This week I implemented Dave’s new pixel-art avatar, a /dsb-study timer, a shower thoughts command, and hidden Easter eggs that roast users in the chat. The biggest challenge was deploying the bot 24/7. I struggled with cloud hosting because every time the server restarts, all the active study timers get completely wiped out. Along the way, I became more comfortable using regex listeners and writing dynamic responses. Next, I want to fix the deployment, connect a database to save timers, and smooth out API errors.
Devlog #3 This week I finished migrating the bot from its old DSB branding to Dave. All commands and references were updated to use the new name, making the project feel much more consistent. I also set up Dave to run as a persistent service on Nest, which means it now stays online 24/7 instead of stopping when my SSH session ends. This makes the bot much more reliable and ready for regular use.
Devlog #4 I expanded Dave with several new commands, including coin flips, random numbers, quotes, roasts, uptime monitoring, and usage statistics. These additions make the bot more interactive while keeping its sarcastic personality. I also added command tracking and improved error handling, making it easier to monitor the bot and diagnose issues when something goes wrong. With these improvements, Dave feels more complete and has a stronger foundation for future features.
What’s new this version: /dave-mood — Dave describes his emotional state (spoiler: it’s not good) /dave-advice — Terrible life advice for real-life problems /dave-compliment — Because some days you need to hear nice things /dave-fortune — Fortune cookie wisdom for developers /dave-debater — Feed Dave an opinion and watch him tear it apart /dave-decide — Let Dave make your decisions when you can’t /dave-existential — Deep thoughts from a very shallow bot
Ships:
I made Dave, a Slack bot with a bunch of fun slash commands that can tell jokes, give questionable life advice, play small games, and generally make a workspace a little less boring. The hardest part wasn’t coding the commands—it was getting the bot deployed 24/7 on a Nest server. I got stuck on an SSH passphrase issue that I don’t even remember setting, and I spent quite a while troubleshooting it. The deployment guide was also a bit confusing for me at some points, so getting everything running reliably took more effort than expected. I’m proud that I managed to get the whole thing working end-to-end: Slack integration, command handling, and deployment. It was also fun giving the bot its own personality instead of making it feel like a generic utility. To test it, add the bot to a Slack workspace and try some of the /dave-* commands. Most of them are designed to be playful, so don’t expect serious answers from Dave. 😄
🚀 Dave — Part 2 I went back to Dave and actually gave him feelings. The original version was just a collection of random responses living in Slack. This update makes him feel like someone with opinions. Pre-written arrays of snark I wrote at 2 AM: /dave-debater argues against anything you say, /dave-existential questions his own purpose (he doesn’t have one), and /dave-compliment is the only wholesome thing in this entire project. Spent more time fighting Nest’s SSH passphrase out of nowhere than writing code. journalctl –user -u dave.service became my nemesis about three times that day. Toggling restart commands blindly until something stuck. But now it runs, and there’s a bot in our workspace that roasts people for no reason. That’s enough. Try /dave-debater I love coding or /dave-existential. 😄...
|
1792831837.259327
|
1792918237.259327
|
|
7702
|
Spark (Build!) by @henry1155 | Stardance
|
henry1155
|
2
|
124.0
|
389
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-19T02:24:20Z", "hours": 2.0, "multiplier": 5.0, "payout": 11, "blessing": "neutral", "text": "hey! re-ship with an edited video! (and the bonus updatelog!)(NOTE: EPILEPSY WARNING! (it is an edit after all)) ( https://www.youtube.com/watch?v=ktODngPF7UI ) (i have fond memories of this, it was the saturday before the week of outpost and i stayed up to 6 AM edited, after a full day of getting footage and stuff (and dealing with goofy kdenlive crashes)) i also somehow did 10hrs+ that day so that was pretty insane! anyways, thanks for reviewing :D", "repo": "https://github.com/HenryLi-0/spark", "demo": ""}, {"ship_num": 2, "ts": "2026-07-24T05:33:19Z", "hours": 122.0, "multiplier": 5.0, "payout": 378, "blessing": "neutral", "text": "Well, after 120+ hours of building across some 18 days, and another hundred hours of CAD previously, it’s a good time to present Spark, this time irl! Anyways, after last summer, I fell into a sort of hole of demotivation where I didn’t really see what I was “working towards” in terms of school and just waiting six months for the FRC build season to start. In order to try to get my creativity and to prove to myself I wasn’t washed, I decided to throw myself into the deep end and to create a 3D printer. That said, 9 months later and way too many demotivation breaks, I locked in after exams and fully assembled and programmed and tested the build in 18 days! It features a coreXY gantry system, along with a passive tool changing setup with latches and the friction of the top docking piece. This kept the overall motor count to be 5 (2 for xy, 2 for z, 1 for tool). The tool changing setup and printing is nowhere near perfect (after all, this thing’s mostly made of PLA and was programmed in a week), but it’s definitely able to be tuned and better perfected with more programming time! In the end, Spark did achieve its goal of sparking some figurative sparks for me to continue building! After this, it was shipped off and exhibited at Open Sauce in California as part of Outpost where I’ve met amazing people and learned more about 3D printers and how to design them better!", "repo": "https://github.com/HenryLi-0/spark", "demo": ""}]...
|
[{"post_id": 70376, "ts": "202 [{"post_id": 70376, "ts": "2026-09-19T02:12:33Z", "hours": 2.1469, "text": "7/28/2026 - 81st Update! Note: I wrote this back on 7/28/2026 but never published it here! (What? The return of Spark?) Well, not exactly, this is more of a thing for the latest announcement in #stardance-bulletin ! Here’s the edited video from a while back! It’s kinda for vertical/short form content, also, BIG EPILEPSY WARNING!!! While you’re here, you should definitely check out fermion , the “spark v2” in a way! It has a very different architecture (that’s surprisingly hard to cad), so check that out! Anyways, here’s the log without further ado… There’s really not that much to say. On July 26th, Spark was repackaged into a box and put into storage, almost a week after returning to New York City. It’s still in an operational state, with few wires disconnected, only with the WiFi credentials incorrect. For a logged 9 months and 2 weeks, a total of 287 days, with 80 progress updates in that time, Spark’s been on my mind for a long while, no doubt about that. Across the more than 64k words, 240+ hours, from the definitely overscoped original concept to the rush to finish it before Blueprint ended, Spark has existed between two whole YSWS programs, one used for design and one used for build. I have to say, with more than three quarters of a year, a lot has changed, both outside, in my actual life, and with Spark, as the idea changed through every log, slowly and carefully. There were highs and lows, and really, really, low lows, from feeling lost at the end of day 9 of build, to the excitment of the first motor turning during day 11. But now, it’s all neatly packed in the garage, waiting to be used another day. Spark isn’t gone, it still physically exists. It may not be resting on a giant wooden board I use for soldering next to my bed, but it still exists next to me through all the hard CAD and build days. It’s strange, this sudden change. For the last week, I haven’t really done much besides plan. And that’s probably a good thing, given all the planning Spark took. I haven’t really done much build, I haven’t really felt anything. Post convention depressions, I have to say, is hitting pretty hard. After such insane fun and wonder for a week, it’s suddenly back to a cool, rainy day, here in New York City. Sleeping through the afternoon, after sleeping not enough hours in the morning. As the rain starts pouring from the sky again, I’ve been wondering what the meaning of joy is. Alas, it might just be time. Adapting to such changes is obviously difficult, and the road of projects is too. But that doesn’t mean roadstops aren’t along the way. As I wrap up this update log, I want to leave a quick quote, one of my favorites. It probably sounds like a dumb platitude to say “it’s not the destination, it’s the journey”, but truth is, we’re made up of journeys. You’re never going to be who you’re supposed to be unless you take that road. … There is room in there for surprise, for deviations, for re-evaluations. I wouldn’t dare deprive you of that adventure. You only get one , after all. I know, you’re tired; resting is part of the journey too. But not giving up… Winter, in Housepets! (Rick Griffin, Dec 25, 2020) That said, what’s next? Well, first we’re gonna take a stepping stone. What’s next is still in concept form, but the unique constraints might require a custom PCB, which is where river comes in. First, it’s gonna be a quick project, just a custom PCB music player, just to jog the electrical skills. But after a quick skip over a stream, what’s truly next? What’s the successor to Spark? What’s next to rival its top 1 status? Fermion. See ya around."}, {"post_id": 33890, "ts": "2026-07-24T05:24:31Z", "hours": 1.5761, "text": "7/23/2026 - 80th Update! well. so im back from open sauce! actually, flight entered back to NYC on the morning of 7/21/2026, but the last two days have really just trying to get back in motion lol (turns out having crazy fun and instantly returning to “normal life” is somewhat rough) anyways, it’s 9:18 PM, here’s a recap! i dont think timelapsing all the work there would be reasonable (i estimate probably around 8 hours of work?), but yeah, mostly just config tuning and working on irl stuff, the base plate sort of didnt like the flight (but it’s really alright? basically the screws kinda ripped through the tape a bit) after the return flight, one of the LM2596’s input wires fell out, took a bit to get it in (haha get it screwdriver bit), anyways, still got a lot to do, i think for now im gonna just finish the update log on the stardance site, then update all the graphics over here, and yeah, prepare for something new??? (i have some ideas…) anyways, i think im gonna prep the stardance project to ship, idk if i can? ok, 11:00 PM, updated the front image, gonna work on updating some stuff ok, 11:06 PM (almost typed AM, that would be funny), added the open sauce image to the readme, brb! back at 12:42 AM, yeah, i think it’s a good time to ship? mfw fixing the position so the aspect ratio for the banner and the project banner (the different pages) are so so hard to get correct anyways, yeah, gonna copy this stuff over and we should be good to go? well, 1:22 AM, for now, good night!"}, {"post_id": 33812, "ts": "2026-07-24T01:35:42Z", "hours": 11.3686, "text": "7/11/2026 - 78th Update! in theory, the last one? in reality, probably not. anyways, it’s 3:22 PM, today’s reveal/edit day! of course, i got a bit of table clean up to do and recording, but i also wanted to play around with the settings a little more to get a somewhat better print? (and maybe test another print since this ones a little small) anyways, parent meeting at 5 PM today, gonna be attending on the side while probably editing? im planning on doing two more test prints before then test 1: turned layer speeds from 90mm/s to 70mm/s increase flow ratio from 1.15 to 1.21 decrease skirt loops from 7 to 5 ok, 3:43 PM, sliced and uploaded, heaters all heated, ready to go! gonna use the bathroom, seems to be printing well though! back at 3:55 PM, it printed well and ended well! gonna modify the ending gcode to cool down, analyzing results now! kinda wanna replace the middle tape strip since i kinda messed up and removed a ripped a bit of it while scrapping the skirts off (whoops), gonna go for one more print, im pretty satisfied, this ones gonna be a bigger test print (not a benchy yet though), im thinking calibration cube? test 2: increase flow rate from 1.21 to 1.30 decreae rotation distance from 6.4 to 6.0 increase deretraction speed from 6mm/s to 6.5mm/s decrease jerk for x (5mm/s to 4.5mm/s) y (5mm/s to 4.5mm/s) z (0.2mm/s to 0.175mm/s) x (0.3mm/s to 0.25mm/s) gonna use this makerworld one for this! intrested to see how this one goes! it’s more of a z axis and consistency ending test should have just enough filament? expecting like 2-3cm left on the top after this? might not have enough on the top but that should be fine? hopefully? i mean, if i see the filaments about to run out id rather end the test? idk footage time yeah its kinda… erm. it kinda failed to print beyond the base layer, seems to just struggle with grabbing filament on its side, let me get a straw real quick, nvm, just used a piece of filament taped down for it, i think its just a filament grabbing issue (probably fighting against the curl?), so yeah, this should straighten that out a bit? test 3 (aka, 2 again), decided not to change anything, here we go! gonna focus on footage for this one so that might have been the… worst prints ive seen, but sure ok, just added the filament from the spool, should be ready for a bigger test? test 4: changed max volumetric speed from 5mm^3/s to 3mm^3/s turned flow ratio from 1.3 down to 1.22 rotation distance reverted from 6.0 back to 6.4 oh yeah heres the image of the cube yeah, gonna go for a 50% benchy erm 50 minute print uhh, well, 5:50 PM, now or never, i guess imma setup for a reveal scene ok, created a nice set for filming, gonna be doing mostly footage stuff while this prints, not really any timelapse? i guess i could? ok, hopefully printing and footage done by 7PM, then probably editing or dinner sometime around there (yes, todays the end day i think, at least my goal) ok, quite some time later, gonna speedrun dinner, its 7:31 PM though i was away for a bit before then welcome back, 9:11 PM, did a bit of footage getting earlier, here goes a print so. half way through. turns out our cold end/heatsink or whatever kinda doesnt cool it well enough. essentially, yeah. it just started curling up halfway in. yeah. however, it did successfuly print half of it! test 5: turned layer speeds from 70mm/s to 80mm/s changed max volumetric speed from 4mm^3/s to 3mm^3/s (seems like i forgot to do it whoops) most devious gcode modifications and slicer shenanigans later devious part 2 well, it’s 6:02 AM now, after lots of editing, submitted the forms, time to head off to bed! and yeah, good night!"}, {"post_id": 26773, "ts": "2026-07-11T19:21:48Z", "hours": 7.0922, "text": "7/10/2026 - 77th Update! wow, 77 updates, so it’s now 10:00 PM, idk what happened to this afternoon (basically just vanished, went to some job in the morning, slept when i got home, ate lunch at 4 PM, slept again, ate dinner at 8 PM, then showered and now it’s somehow 10:00 PM) im thinking media is gonna have to be moved to tomorrow, my only goal today is to find diamonds get the printing to work reliably here’s a couple ideas i brainstormed last night increase the extruder heating temperature should make it way easier for the gearing to push as well double check gearing probably not this now that i think about it, but check docs double check rotation distance again, probably correct add extra pressure in the config similar to the first idea as in trying to actually push more filament slow things down even more very sad but self explanatory if we overextrude, that’s ok, we just need to find the tuning sweet spot where it is actually decent, but of course, the more important goal is to actually get some reasonable stream of filament flowing out (constantly extruding is not optimal but it’s whatever) ok, upped the printing temperature by 10C, also decreased a lot of speeds, 10:33 PM, hopefully ready to test? ok, prepping the stuff, gotta clean the nozzle too, ok 10:40 PM, ready to go! well that didnt print anything ok, so shoving filament down the throat extrudes, pushing filament from far above works well (it does slam left and right but still functions fine), the velocity isnt correct AT ALL (might just be from the compression/friction), hmm ive been suggested to look into the heatbreak and stuff, so gonna take a look at that, idk a bit of a break later, the gearing is sus, trying to move it with the top off and only the heatsink attached, seems off it’s been two hours and ive been playing with so so so many configurations (probably at least thirty?), moving spacers, adding rubber bands, readjusting, measuring, and i think ive come to a point where it’s “ok”. it goes out ok (3 rotations of the motor connection results in: ~1.8cm pushing fast, ~1.7cm pushing slow, idk for expected), but it’s basically incapable of going back up for some reason. it also produces a good amount of force out, but, as mentioned before, barely any up (skips a bunch) ok, played around a bit more, idk, retraction worked for a second randomly, idk, installed it back on, ready to test again 3:36 AM, did a couple of cursed things in the config, specifically making it extrude 4x as much, along with making the deretraction speed higher in the slicer, that said, here we go! ey it printed something! its still really fuzzy so i guess we still got more work to do (that was v1.4), ok v1.5 uploaded, let’s see! 4:12 AM, here we go oh yeah also added fancy ending gcode lol hmm, it’s more complete, but stll missing stuff, ok, 4:27 AM, the birds are probably coming out soon, v1.6 going! well that didnt end well huh seems like the issue was just that the filament wasnt fully loaded, whoops ok, v1.7 uploaded with some print skirts on the outside to help with the missing start extruding, flow rate also increased, let’s see, it’s 4:54 AM, so last print of the day! uh oh it seems to be underextruding now, ok, 5:09 AM, here’s v1.8 ow was in the middle of cleaning the print bed and a piece of the skirt just went straight under my fingernail ouch well, with the sun rising, here’s the end of today! imo v1.5/v1.6 is my favorite, but it’s getting there in terms of smaller details, so i think tomorrow one or two more test prints and then a benchy would be a smart move? idk, the benchy’s just for the reveal video (yes i will try to fit in media here!) well, 5:33 AM, that’s it for me tonight (tomorrow morning?), and yeah, good night!"}, {"post_id": 25756, "ts": "2026-07-10T06:22:05Z", "hours": 4.8033, "text": "7/9/2026 - 76th Update! yo and welcome back! it’s 8:57 PM at night, don’t have much time to waste now, today’s hopefully printing day? (with the actual printer of course) saw online last night from like a video from 6 years ago that using blue painters tape is a good idea (why does my s key consistently fall out now aaaaa), well look what i got here (figuratively), it’s a roll of scotch blue 2090 tape! ok, watched a couple of enlightening videos, so, i think we’re just gonna use some blue tape, seems pretty much good enough for our purpose, not sure if i really want to get orca slicer just now, i think i just want the printer to at least extrude something at this point in time? center is roughly (50.00, 77.50, ~) right now, ok, wrote a little something to center the stuff so (0, 0, 0) should hopefully be the center? yeah, close enough! ok, it’s probably a good time to apply the tape ok, tape applied, cleaned the nozzle, planning on doing the paper thing right after, then we need to print like something flat real quick (if it works, since we still need to do the config stuff for the extruder) quick 20 minute break to let it cool down later, it’s 11:07 PM, time for the paper stuff! so it doesnt really do a good job at staying level, but i do have a solution in mind, aka, having weights on both the sides to keep it flat. yeah. or a rubber band thing stretching the entire length. anyways, configs inputted! so at this point, the thing we need to focus on is getting the extruder config up and running! ok, set up the slicer with the stuff, gear ratio is start (14) to mid (28->14) to final (28->12), where it ends ok, gonna do a test “print”! it’s in quotes since it’s actually not gonna have any filament, just gonna make sure the motion works/makes sense ok, 12:31 AM, let’s run it! ok, temperature below min or something (as in the gcode stuff) 12:40 AM and still figuring stuff out, hold on a second… ok, it’s running! at least, the stuffs moving, not sure if it’s printing well? idk, gonna watch it go! it’s going! that looks… fairly realistic? idk why the heatbed’s at 60.7C right now ok, 12:54 AM, filament loaded on the top in a semi precarious matter, things are ready! 12:57 AM, here we go! timelapse running on my phone, let’s see it! heat bed termperature good, extruder temperature rising, oh turns out i have to have the tab active for it to update the graph visually, whoops well, reached the temperature, let’s see something? oh it just stopped itself because axis werent homed, ok, test 2! 1:03 AM, z axis is lifting, here we go! hmm so the extruder didnt really try… anything. like it wasnt running the whole time (unless it’s just a really small amount that the gearing cant handle?) ok the issue might just be i didnt push the filament in enough, since i just gave it multiple aggresive tugs and a whole bunch just came out of the nozzle, 1:14 AM, here we go again! (i do not want to know what the weird vapors or gasses it just released (yes i saw it, which isnt a very good thing)) also, wow, the heating controls are tuned really nicely! ok, 1:17 AM, z axis going up again so wasnt extruding anything, had to push on it to move, and that resulted in an obvious pile of sad sad so i feel like this is a bit of a gearing thing, since small amount arent really wanting to come out at least it got the rough shape correct? hmm i want to try it out without me pushing on the filament, expecting nothing to happen but who knows yeah i think its just really under extruding, probably because of slip inside? 1:43 AM, trying again, yep, nothing good, it’s now 2:00 AM, gonna go to sleep at this point yeah. idk. the one on the left is forced filament, the middle had a bit of push at the beginning, the last one was mostly by itself. yeah, idk what to do at this point. it’s 2:03 AM, idk what to do, and yeah, we’re kinda behind schedule. anyways, good night!"}, {"post_id": 25175, "ts": "2026-07-09T06:59:41Z", "hours": 4.6269, "text": "7/8/2026 - 75th Update! mfw when the stardance bot tells me that only 10 hours per devlog counts now that’s just rude well, welcome back! 5:01 PM today and starting things off in a bad mood. guess we gotta waste our precious time by cleaning stuff up anyways, 15 minutes later and some serious condensing (each day is like 5 sentences max), back to work! got some unfinished business to do while we work on today’s stuff! so a series of event have occured and now it’s 10:13 PM. oops. for a second i got scared something was wrong but turns out the connecting wire to the inlet thing was just a bit disconnected, trying to access the web interface right now… oh it’s because im on downstairs wifi. oh. gonna be following this for calibration! not exactly sure why there’s so many connection issues today. ok, while that’s connecting, gonna print the latch parts so my s key finally fell off. oh. that’s not good (yes im touching the little button under it) ok, w repair, cleaned it up, the key still does the weird tilt thing, but it stays in there, so that’s good so uh it fell out again. not good. ssssssssssssssssssssssssssssssssssssssssssssssssss oh i guess im gonna keep that, i just need to be more mindful of where i press it i guess, problem is currently that the mcu keeps disconnecting whenever i change the extruder temperature, which is kinda weird hmm mightve been an electrical thing? so i just spent an hour trying to come up a solution for the extruder, none of them are reliable or possible (rubber band placement just gets in the way). so yeah. whys it working now i guess the solution is grinding the gears down? whys the “rushed for display” extruder the only working one now, wow ok, latches made, no rubber bands since that just doesnt work (both the track and the thing), idk, later issue, right now i guess we’re gonna tune z stuff or gonna just try to make it as flat as possible? i think for now let’s just assume perfect flatness for time, let’s replace the heater section of 1 with the one of 3 and just basically use tool 3 instead for time (since the gearing apparently works???) (please stay that way) i guess making it as flat as possible is the best idea for now ok so it’s now 2:32 AM, the docking bay and the latches are added (ngl, they are bending because of a fillet), gonna ignore the fact that it’s slightly broken (nothing tape can’t fix), it does work, takes a bit of force though (as always) 7/7/2026: DONE - print, assemble, and add latches 7/8/2026 DONE - heating tuning DONE GOOD - z bed tuning GOOD - either assume perfect flatness or work on bed mesh/calibration g code should be able to run easily (simple commands of course) look into how to print stuff PRINTING WORKING BY EOD it’s 2:50 AM, tested it out, IT EXTRUDES! YAY! (like i let go of the filament after pushing it to the cooling area and then it extruded!!! by itself with its own gearing!!!) the clicking noises are a bit questionable but sure, ill take it! also did the z paper thingy! missed opportunity to call it cerberus, i might just add that somewhere… anyways, here’s the extruded stuff picture! woo! i mean, what a way to end the day! ok, it’s 2:56 AM, that’s about it for tonight, gonna copy paste this into the website for today’s log and yeah, good night!"}, {"post_id": 24973, "ts": "2026-07-08T21:15:36Z", "hours": 37.5192, "text": "I’ve just been told 75% of my time spent on this log doesn’t count (apparently), so instead of dedicating probably an extra two hours of unlogged time to write a clean version, yall gonna get my thoughts DAILY, straight from the source, raw updatelog content. just kidding, there’s now a world limit so im just gonna speedrun this (since no one reads this and i read my own raw thoughts) 7/2/2026 Mostly electronics work, on 7/1/2026 night, realized that I can actually gently pry off the jst connector shells, removed a good amount of them. Wrote a devlog, worked on tuning the extruder filament tgrabbing gears. After dinner, printed some stuffs, then started adding the corexy belting path. Spent a long time, didn’t really feel very motivated at 3:42 AM and ended the day almost finishing assembling the belts and with not working extruders. 7/3/2026 Woke up early, last night wasn’t a fun night, increased the gear scale, finally actually put the corexy belt together. The filament gears now grab, though it does skip when too much filament is put in. After fixing the shaft collar and adding it back, reassembled the test tool and it attaches! The corexy does have quite a bit of friction, but the tool is assembled! However, waiting on terminal stuffs. Rest of the day is starting the electronics stuff. 7/4/2026 Motors not moving? Removed wires from housing and fix phases, motors now moving! Wondered why one motor was faster, then they both became slow. Fans wired, heaters wired, more testing, heaters can heat up! 7/5/2026 Bad sleep schedule strikes again, some soldering and added the limit switches, more stuff sent to print. A bit of config editing later and the corexy moves properly now! With the correct x and y axis! Filament doesnt really grab very well, idk.More intense filament testing, extruder can reach 230C! 7/6/2026 Really late start, more tool printing, more tool assembly, all tools and extruders are assembled now! 7/7/2026 Schedule and todo list made, support bracket set to print, top shaft supports made a printed, belts tensioned again. Some fixing later, two part inlet case CAD done and sent to print and attached, second tool head also wired up. There’s your week of updatelogs compressed into a format because theres a character limit. From now on, all devlogs will be the updatelogs and not be as extra refined, since I don’t get time counted for writing these, and it’s really a pain and insult to just say that more than a whole 24 hour day worth of actual work doesn’t count because someone added a time limit per log out of nowhere."}, {"post_id": 21018, "ts": "2026-07-02T19:40:26Z", "hours": 22.1556, "text": "it’s been four days oops More Assembly and Electronics! 6/28/2026 Ok, it’s z axis day! Gonna try to keep these recaps short since I’ve mostly been writing giant blobs of text with little images recently, since moving photos from my phone to the laptop and into the update log is a bit annoying, but yeah, z axis and motor mounts were started today! 6/29/2026 Realizing that time was really running out, along with the fact that NYC is attempting to reach high temperatures out of nowhere, a schedule was made and coreXY pulley stands were sent to print! First things first though, the z axis lift base thing was added , and some electronics stuff was started! It’s a little different from the wiring diagram, along with the fact we’re using a raspberry pi 4b, and a couple other stuff. Also, the docking bay got redesigned! 6/30/2026 Anyways, coreXY stuff printed and the layer is assembled! The gantry has a bit of wobble (and the bearings aren’t a tight fit), but nothing some hot glue can’t help with! (Well, maybe the wobble). Anyways, mainsail flashed on the raspberry pi 4 and figured out the weird issues! Also, reminder to switch the jumper thing for input form the side to the usb power.. so, the t rods hit the gantry too, along with the fact that the build plate doesn’t exist. Decently productive day, 5 days left. 7/1/2026 go go go New month, and leectronics work continues! Sacrificed the aliexpress USB power cable, split the wires, and attached it to the LM2596, looks good! Also learned how to crimp today, so that’s pretty cool. There’s also a picture of the thermistor of the heater bed in the mainsail graph somewhere down there! Unfortuantely, I don’t have free JST connectors on ahdn, so we’re gonna be doing sketchy stuff with a dupont connector in there (the pitches are a bit different, yes, i know it’s crazy sketchy, shhhhh) Anyways, after setting tool stuff to print, went downstairs and (thanks to my dad) got the t screws cut and a 15x15 build plate out of some aluminum (it’s like 1.3-1.6mm thick?). We did have to make it out of sheet aluminum that was laying around, but it came out alright, the holes are just a little misaligned but that’s a bit on me. Anyways, realized the tool stuff printed was super cursed, had to work on redesigning a lot of parts, specifically the sahft collar, the gearing (no more bearings should be needed, all the stuff should be using filament as deadaxles). Anyways, we have to fix this cad stuff (half way done), then hopefully belt the corexy and do electronics while it prints tomorrow (aka, today)? Well, that’s it for now, gotta go fast (sonic reference?), only four days left…"}, {"post_id": 17873, "ts": "2026-06-28T20:10:07Z", "hours": 14.5661, "text": "What do you mean 14hrs+ passed? Anyways, here’s a quick recap! Frame Assembly and Even More Printing! 6/25/2026 On a kinda windy day in NYC, printing continues! But hold up, what’s this? Yes, it’s also extrusions cutting day! While printing the stands for the bottom of the printer (after printing a whole bunch of gussets the previous day) after optimizing the print settings, I did some quick reviewing of the extrusion and rod cut lengths and then realized that I miscounted the middle frame y extrusions, it should’ve been three instead of two. So there wasn’t enough length for this extra extrusion (the tmm extrusion). Yeah. Anyways, not shortening the print area by 6cm to get the length, so calculated the linear rod cut lengths and headed downstairs. Huge thanks to my dad for cutting all these extrusions and rods! Now that I think about it, I did work with a blade saw up down thing before (idk what its called, a cold saw but its not cold and goes to higher rpms), but not with a handheld grinder before (i think that’s what it’s called?). Anyways, I learned that the little aluminum chips (that you can’t eat unfortunately) is actually the material, since you lose material every time you cut! This means that some extrusions are a little shorter, but the gussets helped work fine with this! Anyways, after seeing real sparks from the rods getting cut and theneating dinner, finished printing the stands and then realized the bmm extrusion doesn’t have any support. Yeah. Anyways, counted the number of extrusions and ended that day starting a little bit of assembly! 6/26/2026 Frame assembly day! Not much to say other than it involved roughly 5 hours of manual screwing with a screwdriver (using a drill did not really end that well, yes, I tried, probably a skill issue though). Anyways, printed a good amount of tool base stuff at the same time (the tool base print fell on my foot off a table (ouch)), and did a lot of frame assembly! In fact, used 203 T-nuts and 128 screws! Mostly just a lot of tedious work, but hey, the main frame’s done! 6/27/2026 Oh that’s yesterday! Anyways, first part of the day was just me at the doctor’s office, so couldn’t get much done, but I did set an x slider block to print, and it came out pretty well! Also, all three extruders got assembled! And the starts of the tool base! Nothing else much though, unfortunately! Well, that’s it for now, not writing today’s (6/28/2026) since that’s still happening right now, see ya after corexy assembly! (hopefully???)"}, {"post_id": 15511, "ts": "2026-06-25T06:29:33Z", "hours": 11.0467, "text": "Well, it’s been another hot second, ya miss me? Jokes aside, here’s the recap of the last three days! 6/21/2026 haha funny number day Anyways, back to CAD fixing! After a quick little script writing for counting words in all the updatelogs (there’s around enough for a small novel, not including anything on the Blueprint site which is actually fully rewritten by the way, so that’s pretty cool!). Oh that’s a big list todo… again, check out the GitHub repo for more details! Anyways, today’s latch day, since, well you kinda need to finalize the latch design before fixing the docking bay… One spring print later, turns out the original idea wasn’t the best. Apart from being really weird to test (both prints weren’t really willing to stretch, and were really easily stretched beyond its maximum), so new design time! This time with rubber bands instead of springs! Oh yeah, we changed the idea, it’s no longer a top down spring locking thing, it’s more sideways, essentially this idea. ( Here’s the original plan, however the space restrictions really didn’t work out…) 6/22/2026 Since the latch design got ready to test… what do you mean it’s not ready… well, yeah, turns out there were quite a good number of oversights in the original version, so two more hours of fixing the structure later, it’s printed! It looked pretty promising, but has its own set of issues. For instance, the slider doesn’t lock since the rails kinda don’t keep it in, the guide does work (which is really good!, but gets a bit caught in a couple areas. The latch also uses filament for the smaller parts and pivot bits, which is a bit annoying but it alright… though, the rubberbands do need to be pretty strong for this to work. Also, a couple of small adjustments and keeping the pivot upwards so it doesn’t enter the latch the wrong way (it doesn’t work through the bottom path), and needs a bit more alignment stuff, but it’s pretty promising for a prototype! 6/24/2026 What happened to yesterday? Well, kinda got tired after an exam and just kinda didn’t do anything for the rest of the day. Anyways, it’s currently 2:19 AM (not counting this for the time by the way!), so this is technically today’s summary! Basically, we’re behind schedule, so we should probably start printing stuff that’s pretty much finalized (gussets, etc.) and isn’t gonna change anytime soon, just so we can CAD at the same time to speed things up (spoiler, not much CAD work was done today…). However, 22 corner gussets and 4 three way gussets were printed today! 4.95 hours of printing later (including a couple of failed prints), roughly 131.3g of filament was used (not including failed prints)! That’s some scary fast usage… Also, opened a fresh roll of white filament! Gotta say, I don’t really like the resulting surface finish of the Inland filament (got it last year at Micro Center and never opened it), but it’s probably something with print settings and what not. I mean, I can also print it out in vibrant pink? (that’s the only unopened one I have from bambulab…) I’d probably just use Polymaker or Bambu filament from now on, the prices are all relatively the same at $20/spool. (If anyone has any cool discounts or cheaper but reliable places, I’m all ears!) Anyways, yeah, quite a lot of writing, wow… anyways, that’s it for now! I think I’m just gonna continue doing logs every couple of days since sometimes I don’t feel like it, but I’ll try to keep up the consistency! Catch y’all in a bit!"}, {"post_id": 12953, "ts": "2026-06-21T06:14:36Z", "hours": 7.57, "text": "Well, it’s been a hot second, Spark progress resumes! (This site editor kinda has text way too big for my liking, gonna write this in notepad first…) Anyways, Blueprint rules still apply here, most of my thinking and extensive writing is going to be located inside the repository itself (under updatelogs), while here serves as a mroe general overview of what’s going on. So, what’s going on? There’s already 3 days worth of stuff done, so let’s go through them! 6/12/2026 Basically a brief recap of some test prints here and there! More importantly, I just drafted up a pretty decently sized todo list of stuff we need to fix in the CAD, before we can start multitasking printing and doing other stuff. Tested prints include the bearing stacks, frame gussets, and tool plates! This basically gave information that some dimensions were a bit off (bearings were 4mm tall, not 3mm, frame gussets could be a bit thicker, tool plate had some sus screw locations (material too thin in some places))! It also suggested other changes to make. 6/19/2026 Giant schedule! Again, see the whole thing over there, basically a really rushed schedule on when stuff needs to get done, the goal is to finish in a bit more than two weeks. After that, a whole bunch of CAD fixes! From the stuff mentioned before to some fixes with screw lengths being somewhat impossible for the top of the tool to fixing the filament not having anywhere to go, to starting work on fixing the docking bay! Overall a really productive day! 6/20/2026 Oh, that’s today… anyways, not as productive, currently trying to implement an actually working spring latch system for it to actual work (the other version just doesn’t work). However, it’s a bit hard to think about, and the space isn’t exactly optimal (it’s kinda tightly packed…). Didn’t finish it, gonna continue with it tomorrow and take some time to think about any possible oversights or anything! And that’s it for now! Decently large first log (not as big as the ones in updatelogs lol), but I’ll try to see if I can do this daily for the site, but no promises! Ok, see ya hopefully tomorrow!"}]...
|
Title: Spark (Build!) by @henry1155 | Stardance
D Title: Spark (Build!) by @henry1155 | Stardance
Devlogs:
Well, it’s been a hot second, Spark progress resumes! (This site editor kinda has text way too big for my liking, gonna write this in notepad first…) Anyways, Blueprint rules still apply here, most of my thinking and extensive writing is going to be located inside the repository itself (under updatelogs), while here serves as a mroe general overview of what’s going on. So, what’s going on? There’s already 3 days worth of stuff done, so let’s go through them! 6/12/2026 Basically a brief recap of some test prints here and there! More importantly, I just drafted up a pretty decently sized todo list of stuff we need to fix in the CAD, before we can start multitasking printing and doing other stuff. Tested prints include the bearing stacks, frame gussets, and tool plates! This basically gave information that some dimensions were a bit off (bearings were 4mm tall, not 3mm, frame gussets could be a bit thicker, tool plate had some sus screw locations (material too thin in some places))! It also suggested other changes to make. 6/19/2026 Giant schedule! Again, see the whole thing over there, basically a really rushed schedule on when stuff needs to get done, the goal is to finish in a bit more than two weeks. After that, a whole bunch of CAD fixes! From the stuff mentioned before to some fixes with screw lengths being somewhat impossible for the top of the tool to fixing the filament not having anywhere to go, to starting work on fixing the docking bay! Overall a really productive day! 6/20/2026 Oh, that’s today… anyways, not as productive, currently trying to implement an actually working spring latch system for it to actual work (the other version just doesn’t work). However, it’s a bit hard to think about, and the space isn’t exactly optimal (it’s kinda tightly packed…). Didn’t finish it, gonna continue with it tomorrow and take some time to think about any possible oversights or anything! And that’s it for now! Decently large first log (not as big as the ones in updatelogs lol), but I’ll try to see if I can do this daily for the site, but no promises! Ok, see ya hopefully tomorrow!
Well, it’s been another hot second, ya miss me? Jokes aside, here’s the recap of the last three days! 6/21/2026 haha funny number day Anyways, back to CAD fixing! After a quick little script writing for counting words in all the updatelogs (there’s around enough for a small novel, not including anything on the Blueprint site which is actually fully rewritten by the way, so that’s pretty cool!). Oh that’s a big list todo… again, check out the GitHub repo for more details! Anyways, today’s latch day, since, well you kinda need to finalize the latch design before fixing the docking bay… One spring print later, turns out the original idea wasn’t the best. Apart from being really weird to test (both prints weren’t really willing to stretch, and were really easily stretched beyond its maximum), so new design time! This time with rubber bands instead of springs! Oh yeah, we changed the idea, it’s no longer a top down spring locking thing, it’s more sideways, essentially this idea. ( Here’s the original plan, however the space restrictions really didn’t work out…) 6/22/2026 Since the latch design got ready to test… what do you mean it’s not ready… well, yeah, turns out there were quite a good number of oversights in the original version, so two more hours of fixing the structure later, it’s printed! It looked pretty promising, but has its own set of issues. For instance, the slider doesn’t lock since the rails kinda don’t keep it in, the guide does work (which is really good!, but gets a bit caught in a couple areas. The latch also uses filament for the smaller parts and pivot bits, which is a bit annoying but it alright… though, the rubberbands do need to be pretty strong for this to work. Also, a couple of small adjustments and keeping the pivot upwards so it doesn’t enter the latch the wrong way (it doesn’t work through the bottom path), and needs a bit more alignment stuff, but it’s pretty promising for a prototype! 6/24/2026 What happened to yesterday? Well, kinda got tired after an exam and just kinda didn’t do anything for the rest of the day. Anyways, it’s currently 2:19 AM (not counting this for the time by the way!), so this is technically today’s summary! Basically, we’re behind schedule, so we should probably start printing stuff that’s pretty much finalized (gussets, etc.) and isn’t gonna change anytime soon, just so we can CAD at the same time to speed things up (spoiler, not much CAD work was done today…). However, 22 corner gussets and 4 three way gussets were printed today! 4.95 hours of printing later (including a couple of failed prints), roughly 131.3g of filament was used (not including failed prints)! That’s some scary fast usage… Also, opened a fresh roll of white filament! Gotta say, I don’t really like the resulting surface finish of the Inland filament (got it last year at Micro Center and never opened it), but it’s probably something with print settings and what not. I mean, I can also print it out in vibrant pink? (that’s the only unopened one I have from bambulab…) I’d probably just use Polymaker or Bambu filament from now on, the prices are all relatively the same at $20/spool. (If anyone has any cool discounts or cheaper but reliable places, I’m all ears!) Anyways, yeah, quite a lot of writing, wow… anyways, that’s it for now! I think I’m just gonna continue doing logs every couple of days since sometimes I don’t feel like it, but I’ll try to keep up the consistency! Catch y’all in a bit!
What do you mean 14hrs+ passed? Anyways, here’s a quick recap! Frame Assembly and Even More Printing! 6/25/2026 On a kinda windy day in NYC, printing continues! But hold up, what’s this? Yes, it’s also extrusions cutting day! While printing the stands for the bottom of the printer (after printing a whole bunch of gussets the previous day) after optimizing the print settings, I did some quick reviewing of the extrusion and rod cut lengths and then realized that I miscounted the middle frame y extrusions, it should’ve been three instead of two. So there wasn’t enough length for this extra extrusion (the tmm extrusion). Yeah. Anyways, not shortening the print area by 6cm to get the length, so calculated the linear rod cut lengths and headed downstairs. Huge thanks to my dad for cutting all these extrusions and rods! Now that I think about it, I did work with a blade saw up down thing before (idk what its called, a cold saw but its not cold and goes to higher rpms), but not with a handheld grinder before (i think that’s what it’s called?). Anyways, I learned that the little aluminum chips (that you can’t eat unfortunately) is actually the material, since you lose material every time you cut! This means that some extrusions are a little shorter, but the gussets helped work fine with this! Anyways, after seeing real sparks from the rods getting cut and theneating dinner, finished printing the stands and then realized the bmm extrusion doesn’t have any support. Yeah. Anyways, counted the number of extrusions and ended that day starting a little bit of assembly! 6/26/2026 Frame assembly day! Not much to say other than it involved roughly 5 hours of manual screwing with a screwdriver (using a drill did not really end that well, yes, I tried, probably a skill issue though). Anyways, printed a good amount of tool base stuff at the same time (the tool base print fell on my foot off a table (ouch)), and did a lot of frame assembly! In fact, used 203 T-nuts and 128 screws! Mostly just a lot of tedious work, but hey, the main frame’s done! 6/27/2026 Oh that’s yesterday! Anyways, first part of the day was just me at the doctor’s office, so couldn’t get much done, but I did set an x slider block to print, and it came out pretty well! Also, all three extruders got assembled! And the starts of the tool base! Nothing else much though, unfortunately! Well, that’s it for now, not writing today’s (6/28/2026) since that’s still happening right now, see ya after corexy assembly! (hopefully???)
it’s been four days oops More Assembly and Electronics! 6/28/2026 Ok, it’s z axis day! Gonna try to keep these recaps short since I’ve mostly been writing giant blobs of text with little images recently, since moving photos from my phone to the laptop and into the update log is a bit annoying, but yeah, z axis and motor mounts were started today! 6/29/2026 Realizing that time was really running out, along with the fact that NYC is attempting to reach high temperatures out of nowhere, a schedule was made and coreXY pulley stands were sent to print! First things first though, the z axis lift base thing was added , and some electronics stuff was started! It’s a little different from the wiring diagram, along with the fact we’re using a raspberry pi 4b, and a couple other stuff. Also, the docking bay got redesigned! 6/30/2026 Anyways, coreXY stuff printed and the layer is assembled! The gantry has a bit of wobble (and the bearings aren’t a tight fit), but nothing some hot glue can’t help with! (Well, maybe the wobble). Anyways, mainsail flashed on the raspberry pi 4 and figured out the weird issues! Also, reminder to switch the jumper thing for input form the side to the usb power.. so, the t rods hit the gantry too, along with the fact that the build plate doesn’t exist. Decently productive day, 5 days left. 7/1/2026 go go go New month, and leectronics work continues! Sacrificed the aliexpress USB power cable, split the wires, and attached it to the LM2596, looks good! Also learned how to crimp today, so that’s pretty cool. There’s also a picture of the thermistor of the heater bed in the mainsail graph somewhere down there! Unfortuantely, I don’t have free JST connectors on ahdn, so we’re gonna be doing sketchy stuff with a dupont connector in there (the pitches are a bit different, yes, i know it’s crazy sketchy, shhhhh) Anyways, after setting tool stuff to print, went downstairs and (thanks to my dad) got the t screws cut and a 15x15 build plate out of some aluminum (it’s like 1.3-1.6mm thick?). We did have to make it out of sheet aluminum that was laying around, but it came out alright, the holes are just a little misaligned but that’s a bit on me. Anyways, realized the tool stuff printed was super cursed, had to work on redesigning a lot of parts, specifically the sahft collar, the gearing (no more bearings should be needed, all the stuff should be using filament as deadaxles). Anyways, we have to fix this cad stuff (half way done), then hopefully belt the corexy and do electronics while it prints tomorrow (aka, today)? Well, that’s it for now, gotta go fast (sonic reference?), only four days left…
I’ve just been told 75% of my time spent on this log doesn’t count (apparently), so instead of dedicating probably an extra two hours of unlogged time to write a clean version, yall gonna get my thoughts DAILY, straight from the source, raw updatelog content. just kidding, there’s now a world limit so im just gonna speedrun this (since no one reads this and i read my own raw thoughts) 7/2/2026 Mostly electronics work, on 7/1/2026 night, realized that I can actually gently pry off the jst connector shells, removed a good amount of them. Wrote a devlog, worked on tuning the extruder filament tgrabbing gears. After dinner, printed some stuffs, then started adding the corexy belting path. Spent a long time, didn’t really feel very motivated at 3:42 AM and ended the day almost finishing assembling the belts and with not working extruders. 7/3/2026 Woke up early, last night wasn’t a fun night, increased the gear scale, finally actually put the corexy belt together. The filament gears now grab, though it does skip when too much filament is put in. After fixing the shaft collar and adding it back, reassembled the test tool and it attaches! The corexy does have quite a bit of friction, but the tool is assembled! However, waiting on terminal stuffs. Rest of the day is starting the electronics stuff. 7/4/2026 Motors not moving? Removed wires from housing and fix phases, motors now moving! Wondered why one motor was faster, then they both became slow. Fans wired, heaters wired, more testing, heaters can heat up! 7/5/2026 Bad sleep schedule strikes again, some soldering and added the limit switches, more stuff sent to print. A bit of config editing later and the corexy moves properly now! With the correct x and y axis! Filament doesnt really grab very well, idk.More intense filament testing, extruder can reach 230C! 7/6/2026 Really late start, more tool printing, more tool assembly, all tools and extruders are assembled now! 7/7/2026 Schedule and todo list made, support bracket set to print, top shaft supports made a printed, belts tensioned again. Some fixing later, two part inlet case CAD done and sent to print and attached, second tool head also wired up. There’s your week of updatelogs compressed into a format because theres a character limit. From now on, all devlogs will be the updatelogs and not be as extra refined, since I don’t get time counted for writing these, and it’s really a pain and insult to just say that more than a whole 24 hour day worth of actual work doesn’t count because someone added a time limit per log out of nowhere.
7/8/2026 - 75th Update! mfw when the stardance bot tells me that only 10 hours per devlog counts now that’s just rude well, welcome back! 5:01 PM today and starting things off in a bad mood. guess we gotta waste our precious time by cleaning stuff up anyways, 15 minutes later and some serious condensing (each day is like 5 sentences max), back to work! got some unfinished business to do while we work on today’s stuff! so a series of event have occured and now it’s 10:13 PM. oops. for a second i got scared something was wrong but turns out the connecting wire to the inlet thing was just a bit disconnected, trying to access the web interface right now… oh it’s because im on downstairs wifi. oh. gonna be following this for calibration! not exactly sure why there’s so many connection issues today. ok, while that’s connecting, gonna print the latch parts so my s key finally fell off. oh. that’s not good (yes im touching the little button under it) ok, w repair, cleaned it up, the key still does the weird tilt thing, but it stays in there, so that’s good so uh it fell out again. not good. ssssssssssssssssssssssssssssssssssssssssssssssssss oh i guess im gonna keep that, i just need to be more mindful of where i press it i guess, problem is currently that the mcu keeps disconnecting whenever i change the extruder temperature, which is kinda weird hmm mightve been an electrical thing? so i just spent an hour trying to come up a solution for the extruder, none of them are reliable or possible (rubber band placement just gets in the way). so yeah. whys it working now i guess the solution is grinding the gears down? whys the “rushed for display” extruder the only working one now, wow ok, latches made, no rubber bands since that just doesnt work (both the track and the thing), idk, later issue, right now i guess we’re gonna tune z stuff or gonna just try to make it as flat as possible? i think for now let’s just assume perfect flatness for time, let’s replace the heater section of 1 with the one of 3 and just basically use tool 3 instead for time (since the gearing apparently works???) (please stay that way) i guess making it as flat as possible is the best idea for now ok so it’s now 2:32 AM, the docking bay and the latches are added (ngl, they are bending because of a fillet), gonna ignore the fact that it’s slightly broken (nothing tape can’t fix), it does work, takes a bit of force though (as always) 7/7/2026: DONE - print, assemble, and add latches 7/8/2026 DONE - heating tuning DONE GOOD - z bed tuning GOOD - either assume perfect flatness or work on bed mesh/calibration g code should be able to run easily (simple commands of course) look into how to print stuff PRINTING WORKING BY EOD it’s 2:50 AM, tested it out, IT EXTRUDES! YAY! (like i let go of the filament after pushing it to the cooling area and then it extruded!!! by itself with its own gearing!!!) the clicking noises are a bit questionable but sure, ill take it! also did the z paper thingy! missed opportunity to call it cerberus, i might just add that somewhere… anyways, here’s the extruded stuff picture! woo! i mean, what a way to end the day! ok, it’s 2:56 AM, that’s about it for tonight, gonna copy paste this into the website for today’s log and yeah, good night!
7/9/2026 - 76th Update! yo and welcome back! it’s 8:57 PM at night, don’t have much time to waste now, today’s hopefully printing day? (with the actual printer of course) saw online last night from like a video from 6 years ago that using blue painters tape is a good idea (why does my s key consistently fall out now aaaaa), well look what i got here (figuratively), it’s a roll of scotch blue 2090 tape! ok, watched a couple of enlightening videos, so, i think we’re just gonna use some blue tape, seems pretty much good enough for our purpose, not sure if i really want to get orca slicer just now, i think i just want the printer to at least extrude something at this point in time? center is roughly (50.00, 77.50, ~) right now, ok, wrote a little something to center the stuff so (0, 0, 0) should hopefully be the center? yeah, close enough! ok, it’s probably a good time to apply the tape ok, tape applied, cleaned the nozzle, planning on doing the paper thing right after, then we need to print like something flat real quick (if it works, since we still need to do the config stuff for the extruder) quick 20 minute break to let it cool down later, it’s 11:07 PM, time for the paper stuff! so it doesnt really do a good job at staying level, but i do have a solution in mind, aka, having weights on both the sides to keep it flat. yeah. or a rubber band thing stretching the entire length. anyways, configs inputted! so at this point, the thing we need to focus on is getting the extruder config up and running! ok, set up the slicer with the stuff, gear ratio is start (14) to mid (28->14) to final (28->12), where it ends ok, gonna do a test “print”! it’s in quotes since it’s actually not gonna have any filament, just gonna make sure the motion works/makes sense ok, 12:31 AM, let’s run it! ok, temperature below min or something (as in the gcode stuff) 12:40 AM and still figuring stuff out, hold on a second… ok, it’s running! at least, the stuffs moving, not sure if it’s printing well? idk, gonna watch it go! it’s going! that looks… fairly realistic? idk why the heatbed’s at 60.7C right now ok, 12:54 AM, filament loaded on the top in a semi precarious matter, things are ready! 12:57 AM, here we go! timelapse running on my phone, let’s see it! heat bed termperature good, extruder temperature rising, oh turns out i have to have the tab active for it to update the graph visually, whoops well, reached the temperature, let’s see something? oh it just stopped itself because axis werent homed, ok, test 2! 1:03 AM, z axis is lifting, here we go! hmm so the extruder didnt really try… anything. like it wasnt running the whole time (unless it’s just a really small amount that the gearing cant handle?) ok the issue might just be i didnt push the filament in enough, since i just gave it multiple aggresive tugs and a whole bunch just came out of the nozzle, 1:14 AM, here we go again! (i do not want to know what the weird vapors or gasses it just released (yes i saw it, which isnt a very good thing)) also, wow, the heating controls are tuned really nicely! ok, 1:17 AM, z axis going up again so wasnt extruding anything, had to push on it to move, and that resulted in an obvious pile of sad sad so i feel like this is a bit of a gearing thing, since small amount arent really wanting to come out at least it got the rough shape correct? hmm i want to try it out without me pushing on the filament, expecting nothing to happen but who knows yeah i think its just really under extruding, probably because of slip inside? 1:43 AM, trying again, yep, nothing good, it’s now 2:00 AM, gonna go to sleep at this point yeah. idk. the one on the left is forced filament, the middle had a bit of push at the beginning, the last one was mostly by itself. yeah, idk what to do at this point. it’s 2:03 AM, idk what to do, and yeah, we’re kinda behind schedule. anyways, good night!
7/10/2026 - 77th Update! wow, 77 updates, so it’s now 10:00 PM, idk what happened to this afternoon (basically just vanished, went to some job in the morning, slept when i got home, ate lunch at 4 PM, slept again, ate dinner at 8 PM, then showered and now it’s somehow 10:00 PM) im thinking media is gonna have to be moved to tomorrow, my only goal today is to find diamonds get the printing to work reliably here’s a couple ideas i brainstormed last night increase the extruder heating temperature should make it way easier for the gearing to push as well double check gearing probably not this now that i think about it, but check docs double check rotation distance again, probably correct add extra pressure in the config similar to the first idea as in trying to actually push more filament slow things down even more very sad but self explanatory if we overextrude, that’s ok, we just need to find the tuning sweet spot where it is actually decent, but of course, the more important goal is to actually get some reasonable stream of filament flowing out (constantly extruding is not optimal but it’s whatever) ok, upped the printing temperature by 10C, also decreased a lot of speeds, 10:33 PM, hopefully ready to test? ok, prepping the stuff, gotta clean the nozzle too, ok 10:40 PM, ready to go! well that didnt print anything ok, so shoving filament down the throat extrudes, pushing filament from far above works well (it does slam left and right but still functions fine), the velocity isnt correct AT ALL (might just be from the compression/friction), hmm ive been suggested to look into the heatbreak and stuff, so gonna take a look at that, idk a bit of a break later, the gearing is sus, trying to move it with the top off and only the heatsink attached, seems off it’s been two hours and ive been playing with so so so many configurations (probably at least thirty?), moving spacers, adding rubber bands, readjusting, measuring, and i think ive come to a point where it’s “ok”. it goes out ok (3 rotations of the motor connection results in: ~1.8cm pushing fast, ~1.7cm pushing slow, idk for expected), but it’s basically incapable of going back up for some reason. it also produces a good amount of force out, but, as mentioned before, barely any up (skips a bunch) ok, played around a bit more, idk, retraction worked for a second randomly, idk, installed it back on, ready to test again 3:36 AM, did a couple of cursed things in the config, specifically making it extrude 4x as much, along with making the deretraction speed higher in the slicer, that said, here we go! ey it printed something! its still really fuzzy so i guess we still got more work to do (that was v1.4), ok v1.5 uploaded, let’s see! 4:12 AM, here we go oh yeah also added fancy ending gcode lol hmm, it’s more complete, but stll missing stuff, ok, 4:27 AM, the birds are probably coming out soon, v1.6 going! well that didnt end well huh seems like the issue was just that the filament wasnt fully loaded, whoops ok, v1.7 uploaded with some print skirts on the outside to help with the missing start extruding, flow rate also increased, let’s see, it’s 4:54 AM, so last print of the day! uh oh it seems to be underextruding now, ok, 5:09 AM, here’s v1.8 ow was in the middle of cleaning the print bed and a piece of the skirt just went straight under my fingernail ouch well, with the sun rising, here’s the end of today! imo v1.5/v1.6 is my favorite, but it’s getting there in terms of smaller details, so i think tomorrow one or two more test prints and then a benchy would be a smart move? idk, the benchy’s just for the reveal video (yes i will try to fit in media here!) well, 5:33 AM, that’s it for me tonight (tomorrow morning?), and yeah, good night!
7/11/2026 - 78th Update! in theory, the last one? in reality, probably not. anyways, it’s 3:22 PM, today’s reveal/edit day! of course, i got a bit of table clean up to do and recording, but i also wanted to play around with the settings a little more to get a somewhat better print? (and maybe test another print since this ones a little small) anyways, parent meeting at 5 PM today, gonna be attending on the side while probably editing? im planning on doing two more test prints before then test 1: turned layer speeds from 90mm/s to 70mm/s increase flow ratio from 1.15 to 1.21 decrease skirt loops from 7 to 5 ok, 3:43 PM, sliced and uploaded, heaters all heated, ready to go! gonna use the bathroom, seems to be printing well though! back at 3:55 PM, it printed well and ended well! gonna modify the ending gcode to cool down, analyzing results now! kinda wanna replace the middle tape strip since i kinda messed up and removed a ripped a bit of it while scrapping the skirts off (whoops), gonna go for one more print, im pretty satisfied, this ones gonna be a bigger test print (not a benchy yet though), im thinking calibration cube? test 2: increase flow rate from 1.21 to 1.30 decreae rotation distance from 6.4 to 6.0 increase deretraction speed from 6mm/s to 6.5mm/s decrease jerk for x (5mm/s to 4.5mm/s) y (5mm/s to 4.5mm/s) z (0.2mm/s to 0.175mm/s) x (0.3mm/s to 0.25mm/s) gonna use this makerworld one for this! intrested to see how this one goes! it’s more of a z axis and consistency ending test should have just enough filament? expecting like 2-3cm left on the top after this? might not have enough on the top but that should be fine? hopefully? i mean, if i see the filaments about to run out id rather end the test? idk footage time yeah its kinda… erm. it kinda failed to print beyond the base layer, seems to just struggle with grabbing filament on its side, let me get a straw real quick, nvm, just used a piece of filament taped down for it, i think its just a filament grabbing issue (probably fighting against the curl?), so yeah, this should straighten that out a bit? test 3 (aka, 2 again), decided not to change anything, here we go! gonna focus on footage for this one so that might have been the… worst prints ive seen, but sure ok, just added the filament from the spool, should be ready for a bigger test? test 4: changed max volumetric speed from 5mm^3/s to 3mm^3/s turned flow ratio from 1.3 down to 1.22 rotation distance reverted from 6.0 back to 6.4 oh yeah heres the image of the cube yeah, gonna go for a 50% benchy erm 50 minute print uhh, well, 5:50 PM, now or never, i guess imma setup for a reveal scene ok, created a nice set for filming, gonna be doing mostly footage stuff while this prints, not really any timelapse? i guess i could? ok, hopefully printing and footage done by 7PM, then probably editing or dinner sometime around there (yes, todays the end day i think, at least my goal) ok, quite some time later, gonna speedrun dinner, its 7:31 PM though i was away for a bit before then welcome back, 9:11 PM, did a bit of footage getting earlier, here goes a print so. half way through. turns out our cold end/heatsink or whatever kinda doesnt cool it well enough. essentially, yeah. it just started curling up halfway in. yeah. however, it did successfuly print half of it! test 5: turned layer speeds from 70mm/s to 80mm/s changed max volumetric speed from 4mm^3/s to 3mm^3/s (seems like i forgot to do it whoops) most devious gcode modifications and slicer shenanigans later devious part 2 well, it’s 6:02 AM now, after lots of editing, submitted the forms, time to head off to bed! and yeah, good night!
7/23/2026 - 80th Update! well. so im back from open sauce! actually, flight entered back to NYC on the morning of 7/21/2026, but the last two days have really just trying to get back in motion lol (turns out having crazy fun and instantly returning to “normal life” is somewhat rough) anyways, it’s 9:18 PM, here’s a recap! i dont think timelapsing all the work there would be reasonable (i estimate probably around 8 hours of work?), but yeah, mostly just config tuning and working on irl stuff, the base plate sort of didnt like the flight (but it’s really alright? basically the screws kinda ripped through the tape a bit) after the return flight, one of the LM2596’s input wires fell out, took a bit to get it in (haha get it screwdriver bit), anyways, still got a lot to do, i think for now im gonna just finish the update log on the stardance site, then update all the graphics over here, and yeah, prepare for something new??? (i have some ideas…) anyways, i think im gonna prep the stardance project to ship, idk if i can? ok, 11:00 PM, updated the front image, gonna work on updating some stuff ok, 11:06 PM (almost typed AM, that would be funny), added the open sauce image to the readme, brb! back at 12:42 AM, yeah, i think it’s a good time to ship? mfw fixing the position so the aspect ratio for the banner and the project banner (the different pages) are so so hard to get correct anyways, yeah, gonna copy this stuff over and we should be good to go? well, 1:22 AM, for now, good night!
7/28/2026 - 81st Update! Note: I wrote this back on 7/28/2026 but never published it here! (What? The return of Spark?) Well, not exactly, this is more of a thing for the latest announcement in #stardance-bulletin ! Here’s the edited video from a while back! It’s kinda for vertical/short form content, also, BIG EPILEPSY WARNING!!! While you’re here, you should definitely check out fermion , the “spark v2” in a way! It has a very different architecture (that’s surprisingly hard to cad), so check that out! Anyways, here’s the log without further ado… There’s really not that much to say. On July 26th, Spark was repackaged into a box and put into storage, almost a week after returning to New York City. It’s still in an operational state, with few wires disconnected, only with the WiFi credentials incorrect. For a logged 9 months and 2 weeks, a total of 287 days, with 80 progress updates in that time, Spark’s been on my mind for a long while, no doubt about that. Across the more than 64k words, 240+ hours, from the definitely overscoped original concept to the rush to finish it before Blueprint ended, Spark has existed between two whole YSWS programs, one used for design and one used for build. I have to say, with more than three quarters of a year, a lot has changed, both outside, in my actual life, and with Spark, as the idea changed through every log, slowly and carefully. There were highs and lows, and really, really, low lows, from feeling lost at the end of day 9 of build, to the excitment of the first motor turning during day 11. But now, it’s all neatly packed in the garage, waiting to be used another day. Spark isn’t gone, it still physically exists. It may not be resting on a giant wooden board I use for soldering next to my bed, but it still exists next to me through all the hard CAD and build days. It’s strange, this sudden change. For the last week, I haven’t really done much besides plan. And that’s probably a good thing, given all the planning Spark took. I haven’t really done much build, I haven’t really felt anything. Post convention depressions, I have to say, is hitting pretty hard. After such insane fun and wonder for a week, it’s suddenly back to a cool, rainy day, here in New York City. Sleeping through the afternoon, after sleeping not enough hours in the morning. As the rain starts pouring from the sky again, I’ve been wondering what the meaning of joy is. Alas, it might just be time. Adapting to such changes is obviously difficult, and the road of projects is too. But that doesn’t mean roadstops aren’t along the way. As I wrap up this update log, I want to leave a quick quote, one of my favorites. It probably sounds like a dumb platitude to say “it’s not the destination, it’s the journey”, but truth is, we’re made up of journeys. You’re never going to be who you’re supposed to be unless you take that road. … There is room in there for surprise, for deviations, for re-evaluations. I wouldn’t dare deprive you of that adventure. You only get one , after all. I know, you’re tired; resting is part of the journey too. But not giving up… Winter, in Housepets! (Rick Griffin, Dec 25, 2020) That said, what’s next? Well, first we’re gonna take a stepping stone. What’s next is still in concept form, but the unique constraints might require a custom PCB, which is where river comes in. First, it’s gonna be a quick project, just a custom PCB music player, just to jog the electrical skills. But after a quick skip over a stream, what’s truly next? What’s the successor to Spark? What’s next to rival its top 1 status? Fermion. See ya around.
Ships:
Well, after 120+ hours of building across some 18 days, and another hundred hours of CAD previously, it’s a good time to present Spark, this time irl! Anyways, after last summer, I fell into a sort of hole of demotivation where I didn’t really see what I was “working towards” in terms of school and just waiting six months for the FRC build season to start. In order to try to get my creativity and to prove to myself I wasn’t washed, I decided to throw myself into the deep end and to create a 3D printer. That said, 9 months later and way too many demotivation breaks, I locked in after exams and fully assembled and programmed and tested the build in 18 days! It features a coreXY gantry system, along with a passive tool changing setup with latches and the friction of the top docking piece. This kept the overall motor count to be 5 (2 for xy, 2 for z, 1 for tool). The tool changing setup and printing is nowhere near perfect (after all, this thing’s mostly made of PLA and was programmed in a week), but it’s definitely able to be tuned and better perfected with more programming time! In the end, Spark did achieve its goal of sparking some figurative sparks for me to continue building! After this, it was shipped off and exhibited at Open Sauce in California as part of Outpost where I’ve met amazing people and learned more about 3D printers and how to design them better!
hey! re-ship with an edited video! (and the bonus updatelog!)(NOTE: EPILEPSY WARNING! (it is an edit after all)) ( https://www.youtube.com/watch?v=ktODngPF7UI ) (i have fond memories of this, it was the saturday before the week of outpost and i stayed up to 6 AM edited, after a full day of getting footage and stuff (and dealing with goofy kdenlive crashes)) i also somehow did 10hrs+ that day so that was pretty insane! anyways, thanks for reviewing :D...
|
1792850107.5778172
|
1792936507.5778172
|
|
8178
|
GVK renderer by @gungu | Stardance
|
gungu
|
2
|
60.0
|
1009
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-07T14:22:35Z", "hours": 13.0, "multiplier": 19.44, "payout": 261, "blessing": "neutral", "text": "This is the second ship of my game engine / renderer. To explain, I like calling it a renderer instead of a game engine, because I purposefully tried to add as few bloat features as I could, I just wanted something that made rendering something that I don’t have to think about. More info on the README page, this isn’t a good explanation. Just know that it isn’t just a basic Vulkan abstraction, this is a full renderer with PBR, many post-processing effects, skyboxes, dynamic lights, rigged and animated meshes and frustrum culling ’cause why not. Changelog since the last ship: 2 new post-processing effects, pixelation and fog I also added a feature where shiny objects reflect the skybox, which isn’t realistic, but it adds a great sense of realism and I like to add it to my games. one of the largest changes was turning this into an actual library instead of an executable, which allows easier integration. I also made a full game as a tech demo for this project, it can be found at this link or under my stardance profile. It turned out really well, and I’m proud of myself, because I finally made a game engine that I can actually make games in easily. (The screenshot is from the game) and the smallest but still a significant change was rewriting the entire 2D rendering part of the engine for 2 reasons: it had a memory leak, and text rendering was buggy, slow and barely worked.", "repo": "https://github.com/gungugugungu/GVK-Engine", "demo": "https://github.com/gungugugungu/GVK-Engine/releases"}, {"ship_num": 2, "ts": "2026-08-17T20:15:46Z", "hours": 47.0, "multiplier": 15.86, "payout": 748, "blessing": "neutral", "text": "GVK (short for gungu vulkan) is my new renderer using the Vulkan graphics api. I miss the times when I worked with pygame and love2d, where rendering an image was one simple line of code, and I intend to bring that experience to 3D with this project. Everything is designed to be as easy as possible for the user, just writes gvk::draw_mesh(mesh, material, position, scale, rotation); and the mesh is where you want it, how you want it. But don’t mistake it, this is not a game engine, this is just a renderer, something you can build an engine on. I made this tool so my later projects have a graphical backbone to build on, but every game needs a different engine. Ever since I started graphics programming last year I knew that one day I had to learn Vulkan if I ever wanted a job in it in the future, and I’m very proud of myself for finally doing it. This was the greatest challenge I faced in programming so far, and I so glad I tackled it. And as for AI: This project was created so I could learn Vulkan, and if I copied everything from AI that would have been to effective. My goal was to use as little AI as I could, while still leaving out the headaches of development. Here’s what I used AI for: Many of the shaders were written by AI, but that’s because I haven’t learned any of the maths I need to know to write any of these shader. When a shader wasn’t too math heavy I wrote it myself, but there weren’t too many of those. The GLTF loading isn’t hard, it’s just a headache to work with it. GLTF is a horrible format for developers, but it’s the best I knew, so I rather had AI write the GLTF loading functions. I’m still glad I did that, I would have learned nothing from writing those.", "repo": "https://github.com/gungugugungu/GVK-Engine", "demo": "https://github.com/gungugugungu/GVK-Engine/releases"}]...
|
[{"post_id": 63563, "ts": "202 [{"post_id": 63563, "ts": "2026-09-07T14:07:41Z", "hours": 0.4622, "text": "I made a few minor tweaks to fog, and I started debugging it, which I ended up completely stopping and reverting, as it was useless. To be honest I’m really trying to find where this 27 minutes appeared, because I don’t remember spending half an hour on this"}, {"post_id": 61085, "ts": "2026-09-03T20:06:12Z", "hours": 0.76, "text": "FOG Yeah I just added fog because I thought it would look cool in my game. Obviously it’s over the top in this image because I wanted to show it off. I’m pretty proud of this one, definitely one of the more complex post-processing effects."}, {"post_id": 60850, "ts": "2026-09-03T14:06:32Z", "hours": 0.2822, "text": "SKYBOX REFLECTIONS This is a neat trick I did in my last engine and I’m happy I recreated it in this one. Every single shiny surface reflects the skybox, which while isn’t realistic, it does make those surfaces look a lot more shiny than what they actually are, which is a great hack. It sure as hell looks better in the environments I make."}, {"post_id": 60834, "ts": "2026-09-03T13:41:51Z", "hours": 0.5078, "text": "Screen-space reflections would be a major challenge, but I learned that making the skybox reflect off of shiny surfaces is a pretty good way of making your renders seem much better. As of right now it technically works, but I came to realize that I wasn’t loading materials right, so if an image didn’t have a roughness texture, then it would end up completely shiny. I’m almost done fixing it."}, {"post_id": 59082, "ts": "2026-08-31T18:07:57Z", "hours": 0.5186, "text": "I also fixed a bug where the bloom’s blur looped around to the other side of the screen."}, {"post_id": 58887, "ts": "2026-08-31T13:42:45Z", "hours": 0.8592, "text": "PIXELATION POST-PROCESSING EFFECT I made my post-processing system so expandable that I just casually added it ‘cause I thought it would look cool in the game I’m making. I’m sure as hell right about that."}, {"post_id": 58002, "ts": "2026-08-30T10:41:46Z", "hours": 3.0525, "text": "I wasted so much time trying to optimize it all to lead to nothing, but I did end up optimizing some stuff with the Surfaces along with actual color blending for them. I did end up optimizing a bit, but that’s basically nothing. This is the most worthless update to this entire project, I don’t even know how I spent 3 hours on this."}, {"post_id": 52632, "ts": "2026-08-22T21:10:39Z", "hours": 1.3003, "text": "I completely rewrote the text rendering in the Surface class and also fixed a giant memory leak. Here’s a picture of it in use in my game."}, {"post_id": 51872, "ts": "2026-08-21T19:11:56Z", "hours": 0.6219, "text": "I rewrote the texture loading part of GLTF loading because it just plain didn’t work since I updated everything to tinygltf3, but I didn’t notice because it was after the demo. Anyways, it’s done now."}, {"post_id": 51319, "ts": "2026-08-20T22:03:59Z", "hours": 0.4669, "text": "I also rewrote the single mesh gltf loading function to return the material and the entire vertex and index arrays, because I’ll need them for a feature I’m making for my game. This is slowly turning into engine development and I kinda like it."}, {"post_id": 50898, "ts": "2026-08-20T11:18:10Z", "hours": 4.5806, "text": "I worked for over 4 hours, but the renderer finally works as a library!!! That’s right, just put it in as a git submodule, add it as a subdirectory to you CMake project, and there it is! Way too much work for something so simple, but I had to debug a whole lot of stuff. I also edited the README to feature usage instructions and also how to try the demo."}, {"post_id": 49166, "ts": "2026-08-17T20:06:43Z", "hours": 1.8336, "text": "THE GREAT DEBUGGING and A DEMO This is the final post as long as everything works as intended. I fixed every single validation layer error that occurred, so this project is officially bug-free (to my knowledge) . I also made a really simple demo that I uploaded to the github releases tab of the repository. I also finalized the readme, so now the project also has a fancy description. What a ride, I love this project."}, {"post_id": 47631, "ts": "2026-08-15T17:22:29Z", "hours": 0.6358, "text": "FINAL POLISHING (mostly just making the API more useable) I genuinely can’t believe this. I did it, I made a renderer in Vulkan. Well, I’m still not in the clear yet, but I’m very close. Changelog: updated Skin struct to include find_joint() function added Pose struct updated existing skinned mesh systems to work with the Pose struct added sample_clip(), compute_global_pose(), compute_skinning_matrices(), pose_set_local(), pose_set_global(), pose_get_global(), update_animation() and finalize_pose(). These are all helpers for making work with animated and rigged meshes a whole lot easier moved all of the functions inside the gvk namespace, because they were about half and half before."}, {"post_id": 47191, "ts": "2026-08-14T22:29:34Z", "hours": 3.0672, "text": "SKINNED MESHES AND RIGGING This renderer is extremely close to done. I just implemented fully rigged (and animated) meshes. They render properly and animations work too (although I didn’t really care enough to show an example) . Now I am at the last 2 steps of this renderer before starting work on a game in it: 1. Polish up all the API commands so it’s more user friendly. For example, skinned meshes work and can be adjusted manually, but I have a really good idea on how to make working with them super easy, so I’ll definitely implement that. 2. Make a demo that includes basically everything I have developed so far. This step also includes writing compatibility for multiple platforms, because so far I’ve only tested this project on Ubuntu, and I’ll definitely need a windows version too. And that’s it, the project is nearing it’s completion. I can’t wait to make a proper game in this, which I’ll document too of course. Also, I’m writing all of this while I’m on a vacation in Denmark, so I’m quite far from home, but I’m extremely motivated to get this project finished."}, {"post_id": 45337, "ts": "2026-08-11T18:43:26Z", "hours": 3.4436, "text": "SSAO (screen-space ambient occlusion) This one was fun. Ambient occlusion is just a little shadow thing at the edge of meshes. It is not realistic, technically it doesn’t exist in the real world, yet it looks so much better with it. To be honest I don’t have a lot to say about this, it’s done and it’s cool."}, {"post_id": 42894, "ts": "2026-08-07T21:01:17Z", "hours": 1.6756, "text": "SCENE LOADING I just got home from a 10 day adventure that’ll never forget, but I’m back to code, and to get myself to shake into the civilized world again I decided to do a simpler feature before shadow mapping, so I implemented full scene loading from GLTF files. It’s a pretty handy feature, I’m glad I finally made it. It doesn’t just load models and materials, but lights too, pretty handy."}, {"post_id": 35091, "ts": "2026-07-26T09:27:19Z", "hours": 0.3281, "text": "NORMAL MAPPING This was a really easy update, most of the shader changes were copied from my last engine, and the CPU side of things was just changing the vertex struct and loading the tangents in the mesh loading function. But it works."}, {"post_id": 34858, "ts": "2026-07-25T22:07:52Z", "hours": 3.8317, "text": "Well well well. Seems like it’s time for LIGHTING !!!!! finally This was not easy, and yet it was made so much easier by having done it once before last year. I added support for a directional light, a dynamic (aka not hard coded, so pratically infinite amount of) point lights and spot lights, full PBR, and I also made a little handy editor to go along with it, although that’s not in the renderer that’s just in the demo project. Anyways, this was an incredible journey filled with pain and suffering like never before, and I’m so glad I’m through it all. And if this was a challenge, I don’t know what shadow mapping is going to be, which is going to be basically right now, I’m going to add tanget space normal mapping and then it’s already shadowmapping. I’m mentally unprepared, but oh well what can I do?"}, {"post_id": 33983, "ts": "2026-07-24T11:18:42Z", "hours": 1.8858, "text": "This change is not too visible, but it is a major change in the engine MATERIALS Everybody who worked in any sort of 3D graphics knows what materials are. And those know, that the next step after this is lighting . This wouldn’t have been that big of a change, if not for one issue. I’m developing on linux, and every once in a while my GPU drivers uninstall themselves, so everything runs on the integrated graphics on the CPU. That happened, but I thought that the code just became really slow because I was sending 6 images to the GPU every single frame, and that slowed it down. So I spent a bunch of time making a large optimization, and it worked like a charm, it ran fast. Then I found out the entire thing was running on the CPU and I didn’t even need to optimize it. Anyway, it’s here, and it’s fast"}, {"post_id": 33448, "ts": "2026-07-23T12:32:42Z", "hours": 2.7142, "text": "POST-PROCESSING STACK and TONEMAPPING AND COLOR GRADING (post-processing effect 5) This is the finale to the post-processing saga, because I’m finished with tonemapping and color grading. Everything will look really good and cool and whatever, altough I’ve been coding non-stop for 2.5 hours and I don’t really care to give an explanation right now. I don’t have to explain color grading everybody knows that, and tonemapping is the process of mapping the internal HDR render image to an LDR (whatever it’s called) image that the display can actually render properly, how cool is that?"}, {"post_id": 32903, "ts": "2026-07-22T11:24:50Z", "hours": 1.3728, "text": "BLOOM (post-processing effect 4) I’m almost done with all of the post-processing effects, and this was by far the hardest of them all, but I managed to push through it. I’m really proud of myself, because I finally understand Vulkan enough where I didn’t need any sort of outside help to debug this error. I think I can finally call myself someone who understands Vulkan now. Anyway, now I just need to make tonemapping and the effects are done. After that I just make the simplest pipeline to composite it all, and I’m done with that as well."}, {"post_id": 32861, "ts": "2026-07-22T09:31:30Z", "hours": 1.115, "text": "VIGNETTE (post-processing effect 3) This was the most fun I’ve had debugging something in a while. This was really simple to implement, although I can’t really say a lot. The initialization was the same as the other effects, the actual logic of it was pretty similar, the shader wasn’t too hard to write too, but added up it was pretty bad. I accidentally left one of the push parameters in the CPU code as an int, but a float in the GPU code, which I ended up having to chase down for quite a while. The values are over the top on the image so it is more visible on the screenshot, of course I won’t leave it like this. Also, I have written a new readme for the github page. I just kinda wanted to, and thought why not?"}, {"post_id": 32630, "ts": "2026-07-21T22:19:26Z", "hours": 0.3061, "text": "BOX BLUR (post-processing effect 2) I have to admit this took 11 minutes, and the rest of the 5 minutes I spent in this devlog was spent debugging 3 new errors so I can make a post about this feature too. It took so little because I literally just copied and renamed the gaussian blur functions, and changed the shader. Still, I have box blur now. Actually, I think there’s quite a difference between the 2 blurs, quite cool. Of course now that I look at it it’s barely visible in the screenshots."}, {"post_id": 32617, "ts": "2026-07-21T22:00:32Z", "hours": 2.6194, "text": "I thought how cool would it be if I just did a whole 10 hour devlog with all of post-processing in it, but I realized I wouldn’t be able to show off all the cool stuff I’ve done, so I’m doing it effect by effect, anyway, GAUSSIAN BLUR (post-processing effect 1) But not just that, I also brainstormed out the entire post-processing system, and “implemented” it. I didn’t exactly implement it yet because I need to finish all the effects, but it’s there. I still have to finish: box blur, bloom, vignette and tonemapping, and I also want support for custom effects, but that’ll be really easy so I don’t want to put it on this list."}, {"post_id": 31844, "ts": "2026-07-20T15:30:20Z", "hours": 1.5975, "text": "MSAA !! (multisampled anti-aliasing) I always viewed anit-aliasing as this mystery thing that can make a game prettier and I’ll never know how it works. I have to say, it was way easier than expected, most of the time I spent was on some stupid bug or general debugging. You can’t really see the difference in a small screenshot, but it looks so much better full screen."}, {"post_id": 31201, "ts": "2026-07-19T12:30:48Z", "hours": 1.5542, "text": "2D rendering!! I have to admit this feature was kinda easy to implement, because most of it was ripped straight from my last game engine, but I did it because I think it is a really smart way of handling how a 2D system should work. Everything relies on the Surface class, the display itself is a surface, the loaded images are surfaces, and those surfaces can draw to eachother. This makes the system easy yet expandable. I think it’s kinda cool. It was heavily inspired by how pygame does things."}, {"post_id": 31151, "ts": "2026-07-19T10:09:03Z", "hours": 1.3306, "text": "And just like that, the next major update is done! SKYBOXES and other stuff Here’s a full changelog of the last 3 posts: I wrote a really handy shader compiler to make this update just a bit easier, now it automatically compiles all shaders at once I don’t have to do it one by one I wrote a compositing pass that finally has a use case as can be seen right now. The skybox and the objects are rendered separately to separate images, and the compositing pass combines them and renders them to the screen together. Might sound simple, and I have to admit if I understood Vulkan a bit better it might have been, but right now I’m really proud of myself for it. Of course the headline feature: The Skybox . This is most of what I’ve been working on for the last 3 updates. It’s done in a really cool way. The easy way of doing a skybox is to just render it as one giant object and then bim bam boom there it is, but sadly that has a couple of issues, the largest one is that this is extremely lazy. So I did it the smart way instead. What you’re seeing there is actually a cube a tad bit smaller than the monkey, but it’s rendered in a separate pass, where I only pass the camera’s rotation and not the position, and I also have the depth disabled. I render that to a separate image, use the compositing pass, and there it is, a beautiful, very stable and very professional skybox. I’m almost done rambling, but I have to mention one last feature, and that is the loading of equirectangular images into a cubemap texture . I think I’ve typed enough for this update, but if you care you can look it up or like look at my code. Next up: 2D rendering and I have some great ideas for it"}, {"post_id": 30908, "ts": "2026-07-18T21:44:56Z", "hours": 1.5617, "text": "This is a change that cannot be seen, but the composite pipeline is actually working. This is a really simple step in the graphics pipeline, it takes the images from the previous passes and combines them to make a final image. This will be useful for future features like 2D drawing, post-processing, the skybox, etc., so I’m happy I managed to implement it. It’s not something that can be seen with the naked eye, but believe me it’s there and I’m so happy for it. As always, this is next to some generic bugfixes here and there, but it’s been 1.5 hours and I forgot what I fixed and what I didn’t so if you happen to care enough this is open-source just like go and check it out."}, {"post_id": 30852, "ts": "2026-07-18T19:58:13Z", "hours": 1.6753, "text": "I’m well into developing the skybox system along with a compositing pass , but since I needed to write so many new shaders for this update, I decided to write a simple shader compiler, and I kinda want to show it off so it’s not lost in the giant list of changes that I’ll push in the next update. That’s it, I rest my case, that’s all I wanted until I’m finished."}, {"post_id": 30103, "ts": "2026-07-17T12:46:44Z", "hours": 2.2475, "text": "I finished frustum culling . You’ve probably seen this feature in some random wannabe gamedevs post on tiktok saying how they “optimized their game” by enabling frustum culling in Unity and calling themselves genius for it. Well it wasn’t as easy as pressing a button for me. Here’s how it works: I generate an axis aligned bounding box (AABB) for every object when loaded. Every frame I generate 6 planes for each boundary of the camera, the left, right, bottom, top, near and far planes. Then I also calculate the world position AABB for each mesh, which is just translating the original AABB and making a new one from that’s boundary. From that, it’s actually quite simple to compare if the box is inside the frustum or not, though it’s kinda hard to explain so I won’t bother, but I just run that for every object, and it basically makes it, so if an object is not inside the camera’s vision, then it just makes it disappear. I attached the majority of the logic in the second picture"}, {"post_id": 28824, "ts": "2026-07-15T10:08:18Z", "hours": 1.3122, "text": "I implemented a fully automatic mipmap system . Basically, mipmaps are lower quality version of a texture that appear the farther you are from an object. The image I attached is of mipmap layer 4, but of course this was set manually to showcase the system working."}, {"post_id": 28331, "ts": "2026-07-14T14:52:20Z", "hours": 0.6636, "text": "I wrote a giant list on what I want to implement into this framework to make it full. I’m pretty sure I’ll be done in about 150-200 hours, which I have about 40 days to make before the end of this thing. That is 3.75 - 5 hours of coding in a day. Anyway, here’s the list: TODO FEATURES: lighting gpu scene data uniform buffer ambient light directional light point lights tangent space normal mapping tangent generation in gltf loading dynamic light count proper api for handling lights shadow mapping depth-only pipeline shadow map image light space matrix shadow pass shadow sampling in the main fragment shader shadow bias PCF filtering material system material struct (albedo map, normal map, roughness map, emissive map, scalar tint and roughness and metallic factors) material descriptor layout default fallback textures gltf material loading draw_mesh api update emissive support in the shader creating and destroying materials for user-made materials mipmaps and proper sample management mipmap generation on upload mip count calculation sampler cache (so samplers are never duplicated) instanced rendering per-instance storage buffer draw_mesh_instanced api write the shader for it (gl_InstanceIndex) move to indirect drawing so the instance count can eventually come from gpu-side data skybox cubemap loading skybox pipeline skybox shader set_skybox api frustrum culling bounding sphere per mesh (compute in loading by finding the disctance from the centroid across all vectires) frustrum plane extraction (gribb-hartmann) cull loop stats readout post processing stack fullscreen traingle pipeline HDR tonemapping guassian blur api box blur api bloom vignette 2D rendering quad mesh 2D pipeline surface class default surface draw_surface draw_rect font atlas rendering MSAA multisample draw image resolve attachment configurable sample count"}, {"post_id": 28166, "ts": "2026-07-14T09:18:04Z", "hours": 0.8786, "text": "I have to admit I’m pretty proud of myself. I implemented the proper transformations for objects , I also made a good camera system , and I fixed the uv mapping of objects, so textures finally work properly. All this in under an hour."}, {"post_id": 19382, "ts": "2026-06-30T17:57:36Z", "hours": 1.0408, "text": "To be completely honest this engine development thing is going a lot more awful than I could have imagined. I tried to implement a proper camera and transformations for the objects, and now nothing works, yet I barely changed anything. I have been staring at this function for like 2 hours, I’ve tried everything, and nothing works."}, {"post_id": 18575, "ts": "2026-06-29T19:26:50Z", "hours": 1.0686, "text": "I finally finished the guide (🥳🥳🥳), so it’s time to make the game engine I want . My first improvement was adding a render queue, which basically means I can render anything in a much user friendly way."}, {"post_id": 18301, "ts": "2026-06-29T12:31:38Z", "hours": 0.8061, "text": "Thanks to the major rework of the allocation of descriptors, I have managed to implemented textures into rendering. I haven’t made texture loading yet, since it’ll be an engine feature and I’m working on project setup , so enjoy the beautiful pink-black checkerboard pattern on Suzie, the Blender monkey."}, {"post_id": 18277, "ts": "2026-06-29T11:27:47Z", "hours": 1.3389, "text": "I did a giant rework of the descriptor allocation to make handling textures a breeze in the future. Yes, I did mostly just follow the guide, but I am really getting the hang of how Vulkan works, and the guide is ending in a couple of chapers, and the rest will be up to me, and I already feel ready for the task. I have to admit it doesn’t exactly work yet, but I’m working on patching it, it shouldn’t be an issue."}, {"post_id": 18218, "ts": "2026-06-29T09:03:15Z", "hours": 0.4683, "text": "Mesh rendering is finally complete. This is a full 3D scene with a little monkey, rendered perfectly in perspective."}, {"post_id": 17917, "ts": "2026-06-28T21:08:40Z", "hours": 1.0294, "text": "So mesh loading and rendering works, although I haven’t gotten the world matrix and transformations quite right😅 The guide I’m using to learn Vulkan actually recommended I use fastgltf, but I ended up going with tinygltf, as I’ve used it before and have a bunch more experience in it, and oh boy is having experience a good feeling when learning VK"}, {"post_id": 17836, "ts": "2026-06-28T19:36:25Z", "hours": 1.1339, "text": "I’m progressing rather fast, I implemented a full mesh buffer system, which allows me to render any mesh. Mesh loading will be the next task, but until then the best display I can do is a colorful rectangle, I hope that’s good enough"}, {"post_id": 16164, "ts": "2026-06-26T08:40:00Z", "hours": 0.4853, "text": "Implementing a proper graphics pipeline was surprisingly easy. I remembered a lot from my experience in sokol and of course the guide was quite helpful as well. Got from a compute shader to a proper pipeline very fast. I’m still very eager to get back to the fun part of graphics programming and not be stuck in setup hell, but the next step is writing the mesh buffers, so that’ll be fun."}, {"post_id": 11826, "ts": "2026-06-19T08:22:42Z", "hours": 1.095, "text": "I finished the ImGui implementation, I’m starting to get the hang of things. I’m still following vkguide.dev for the setup phase, but I’m eager to finally get to the fun part of graphics programming"}, {"post_id": 4078, "ts": "2026-06-07T08:34:21Z", "hours": 1.0794, "text": "After about an hour of following vkguide.dev, I managed to make a little compute shader that display 16×16 cells of a gradient. Great start!"}]...
|
Title: GVK renderer by @gungu | Stardance
Devlogs Title: GVK renderer by @gungu | Stardance
Devlogs:
After about an hour of following vkguide.dev, I managed to make a little compute shader that display 16×16 cells of a gradient. Great start!
I finished the ImGui implementation, I’m starting to get the hang of things. I’m still following vkguide.dev for the setup phase, but I’m eager to finally get to the fun part of graphics programming
Implementing a proper graphics pipeline was surprisingly easy. I remembered a lot from my experience in sokol and of course the guide was quite helpful as well. Got from a compute shader to a proper pipeline very fast. I’m still very eager to get back to the fun part of graphics programming and not be stuck in setup hell, but the next step is writing the mesh buffers, so that’ll be fun.
I’m progressing rather fast, I implemented a full mesh buffer system, which allows me to render any mesh. Mesh loading will be the next task, but until then the best display I can do is a colorful rectangle, I hope that’s good enough
So mesh loading and rendering works, although I haven’t gotten the world matrix and transformations quite right😅 The guide I’m using to learn Vulkan actually recommended I use fastgltf, but I ended up going with tinygltf, as I’ve used it before and have a bunch more experience in it, and oh boy is having experience a good feeling when learning VK
Mesh rendering is finally complete. This is a full 3D scene with a little monkey, rendered perfectly in perspective.
I did a giant rework of the descriptor allocation to make handling textures a breeze in the future. Yes, I did mostly just follow the guide, but I am really getting the hang of how Vulkan works, and the guide is ending in a couple of chapers, and the rest will be up to me, and I already feel ready for the task. I have to admit it doesn’t exactly work yet, but I’m working on patching it, it shouldn’t be an issue.
Thanks to the major rework of the allocation of descriptors, I have managed to implemented textures into rendering. I haven’t made texture loading yet, since it’ll be an engine feature and I’m working on project setup , so enjoy the beautiful pink-black checkerboard pattern on Suzie, the Blender monkey.
I finally finished the guide (🥳🥳🥳), so it’s time to make the game engine I want . My first improvement was adding a render queue, which basically means I can render anything in a much user friendly way.
To be completely honest this engine development thing is going a lot more awful than I could have imagined. I tried to implement a proper camera and transformations for the objects, and now nothing works, yet I barely changed anything. I have been staring at this function for like 2 hours, I’ve tried everything, and nothing works.
I have to admit I’m pretty proud of myself. I implemented the proper transformations for objects , I also made a good camera system , and I fixed the uv mapping of objects, so textures finally work properly. All this in under an hour.
I wrote a giant list on what I want to implement into this framework to make it full. I’m pretty sure I’ll be done in about 150-200 hours, which I have about 40 days to make before the end of this thing. That is 3.75 - 5 hours of coding in a day. Anyway, here’s the list: TODO FEATURES: lighting gpu scene data uniform buffer ambient light directional light point lights tangent space normal mapping tangent generation in gltf loading dynamic light count proper api for handling lights shadow mapping depth-only pipeline shadow map image light space matrix shadow pass shadow sampling in the main fragment shader shadow bias PCF filtering material system material struct (albedo map, normal map, roughness map, emissive map, scalar tint and roughness and metallic factors) material descriptor layout default fallback textures gltf material loading draw_mesh api update emissive support in the shader creating and destroying materials for user-made materials mipmaps and proper sample management mipmap generation on upload mip count calculation sampler cache (so samplers are never duplicated) instanced rendering per-instance storage buffer draw_mesh_instanced api write the shader for it (gl_InstanceIndex) move to indirect drawing so the instance count can eventually come from gpu-side data skybox cubemap loading skybox pipeline skybox shader set_skybox api frustrum culling bounding sphere per mesh (compute in loading by finding the disctance from the centroid across all vectires) frustrum plane extraction (gribb-hartmann) cull loop stats readout post processing stack fullscreen traingle pipeline HDR tonemapping guassian blur api box blur api bloom vignette 2D rendering quad mesh 2D pipeline surface class default surface draw_surface draw_rect font atlas rendering MSAA multisample draw image resolve attachment configurable sample count
I implemented a fully automatic mipmap system . Basically, mipmaps are lower quality version of a texture that appear the farther you are from an object. The image I attached is of mipmap layer 4, but of course this was set manually to showcase the system working.
I finished frustum culling . You’ve probably seen this feature in some random wannabe gamedevs post on tiktok saying how they “optimized their game” by enabling frustum culling in Unity and calling themselves genius for it. Well it wasn’t as easy as pressing a button for me. Here’s how it works: I generate an axis aligned bounding box (AABB) for every object when loaded. Every frame I generate 6 planes for each boundary of the camera, the left, right, bottom, top, near and far planes. Then I also calculate the world position AABB for each mesh, which is just translating the original AABB and making a new one from that’s boundary. From that, it’s actually quite simple to compare if the box is inside the frustum or not, though it’s kinda hard to explain so I won’t bother, but I just run that for every object, and it basically makes it, so if an object is not inside the camera’s vision, then it just makes it disappear. I attached the majority of the logic in the second picture
I’m well into developing the skybox system along with a compositing pass , but since I needed to write so many new shaders for this update, I decided to write a simple shader compiler, and I kinda want to show it off so it’s not lost in the giant list of changes that I’ll push in the next update. That’s it, I rest my case, that’s all I wanted until I’m finished.
This is a change that cannot be seen, but the composite pipeline is actually working. This is a really simple step in the graphics pipeline, it takes the images from the previous passes and combines them to make a final image. This will be useful for future features like 2D drawing, post-processing, the skybox, etc., so I’m happy I managed to implement it. It’s not something that can be seen with the naked eye, but believe me it’s there and I’m so happy for it. As always, this is next to some generic bugfixes here and there, but it’s been 1.5 hours and I forgot what I fixed and what I didn’t so if you happen to care enough this is open-source just like go and check it out.
And just like that, the next major update is done! SKYBOXES and other stuff Here’s a full changelog of the last 3 posts: I wrote a really handy shader compiler to make this update just a bit easier, now it automatically compiles all shaders at once I don’t have to do it one by one I wrote a compositing pass that finally has a use case as can be seen right now. The skybox and the objects are rendered separately to separate images, and the compositing pass combines them and renders them to the screen together. Might sound simple, and I have to admit if I understood Vulkan a bit better it might have been, but right now I’m really proud of myself for it. Of course the headline feature: The Skybox . This is most of what I’ve been working on for the last 3 updates. It’s done in a really cool way. The easy way of doing a skybox is to just render it as one giant object and then bim bam boom there it is, but sadly that has a couple of issues, the largest one is that this is extremely lazy. So I did it the smart way instead. What you’re seeing there is actually a cube a tad bit smaller than the monkey, but it’s rendered in a separate pass, where I only pass the camera’s rotation and not the position, and I also have the depth disabled. I render that to a separate image, use the compositing pass, and there it is, a beautiful, very stable and very professional skybox. I’m almost done rambling, but I have to mention one last feature, and that is the loading of equirectangular images into a cubemap texture . I think I’ve typed enough for this update, but if you care you can look it up or like look at my code. Next up: 2D rendering and I have some great ideas for it
2D rendering!! I have to admit this feature was kinda easy to implement, because most of it was ripped straight from my last game engine, but I did it because I think it is a really smart way of handling how a 2D system should work. Everything relies on the Surface class, the display itself is a surface, the loaded images are surfaces, and those surfaces can draw to eachother. This makes the system easy yet expandable. I think it’s kinda cool. It was heavily inspired by how pygame does things.
MSAA !! (multisampled anti-aliasing) I always viewed anit-aliasing as this mystery thing that can make a game prettier and I’ll never know how it works. I have to say, it was way easier than expected, most of the time I spent was on some stupid bug or general debugging. You can’t really see the difference in a small screenshot, but it looks so much better full screen.
I thought how cool would it be if I just did a whole 10 hour devlog with all of post-processing in it, but I realized I wouldn’t be able to show off all the cool stuff I’ve done, so I’m doing it effect by effect, anyway, GAUSSIAN BLUR (post-processing effect 1) But not just that, I also brainstormed out the entire post-processing system, and “implemented” it. I didn’t exactly implement it yet because I need to finish all the effects, but it’s there. I still have to finish: box blur, bloom, vignette and tonemapping, and I also want support for custom effects, but that’ll be really easy so I don’t want to put it on this list.
BOX BLUR (post-processing effect 2) I have to admit this took 11 minutes, and the rest of the 5 minutes I spent in this devlog was spent debugging 3 new errors so I can make a post about this feature too. It took so little because I literally just copied and renamed the gaussian blur functions, and changed the shader. Still, I have box blur now. Actually, I think there’s quite a difference between the 2 blurs, quite cool. Of course now that I look at it it’s barely visible in the screenshots.
VIGNETTE (post-processing effect 3) This was the most fun I’ve had debugging something in a while. This was really simple to implement, although I can’t really say a lot. The initialization was the same as the other effects, the actual logic of it was pretty similar, the shader wasn’t too hard to write too, but added up it was pretty bad. I accidentally left one of the push parameters in the CPU code as an int, but a float in the GPU code, which I ended up having to chase down for quite a while. The values are over the top on the image so it is more visible on the screenshot, of course I won’t leave it like this. Also, I have written a new readme for the github page. I just kinda wanted to, and thought why not?
BLOOM (post-processing effect 4) I’m almost done with all of the post-processing effects, and this was by far the hardest of them all, but I managed to push through it. I’m really proud of myself, because I finally understand Vulkan enough where I didn’t need any sort of outside help to debug this error. I think I can finally call myself someone who understands Vulkan now. Anyway, now I just need to make tonemapping and the effects are done. After that I just make the simplest pipeline to composite it all, and I’m done with that as well.
POST-PROCESSING STACK and TONEMAPPING AND COLOR GRADING (post-processing effect 5) This is the finale to the post-processing saga, because I’m finished with tonemapping and color grading. Everything will look really good and cool and whatever, altough I’ve been coding non-stop for 2.5 hours and I don’t really care to give an explanation right now. I don’t have to explain color grading everybody knows that, and tonemapping is the process of mapping the internal HDR render image to an LDR (whatever it’s called) image that the display can actually render properly, how cool is that?
This change is not too visible, but it is a major change in the engine MATERIALS Everybody who worked in any sort of 3D graphics knows what materials are. And those know, that the next step after this is lighting . This wouldn’t have been that big of a change, if not for one issue. I’m developing on linux, and every once in a while my GPU drivers uninstall themselves, so everything runs on the integrated graphics on the CPU. That happened, but I thought that the code just became really slow because I was sending 6 images to the GPU every single frame, and that slowed it down. So I spent a bunch of time making a large optimization, and it worked like a charm, it ran fast. Then I found out the entire thing was running on the CPU and I didn’t even need to optimize it. Anyway, it’s here, and it’s fast
Well well well. Seems like it’s time for LIGHTING !!!!! finally This was not easy, and yet it was made so much easier by having done it once before last year. I added support for a directional light, a dynamic (aka not hard coded, so pratically infinite amount of) point lights and spot lights, full PBR, and I also made a little handy editor to go along with it, although that’s not in the renderer that’s just in the demo project. Anyways, this was an incredible journey filled with pain and suffering like never before, and I’m so glad I’m through it all. And if this was a challenge, I don’t know what shadow mapping is going to be, which is going to be basically right now, I’m going to add tanget space normal mapping and then it’s already shadowmapping. I’m mentally unprepared, but oh well what can I do?
NORMAL MAPPING This was a really easy update, most of the shader changes were copied from my last engine, and the CPU side of things was just changing the vertex struct and loading the tangents in the mesh loading function. But it works.
SCENE LOADING I just got home from a 10 day adventure that’ll never forget, but I’m back to code, and to get myself to shake into the civilized world again I decided to do a simpler feature before shadow mapping, so I implemented full scene loading from GLTF files. It’s a pretty handy feature, I’m glad I finally made it. It doesn’t just load models and materials, but lights too, pretty handy.
SSAO (screen-space ambient occlusion) This one was fun. Ambient occlusion is just a little shadow thing at the edge of meshes. It is not realistic, technically it doesn’t exist in the real world, yet it looks so much better with it. To be honest I don’t have a lot to say about this, it’s done and it’s cool.
SKINNED MESHES AND RIGGING This renderer is extremely close to done. I just implemented fully rigged (and animated) meshes. They render properly and animations work too (although I didn’t really care enough to show an example) . Now I am at the last 2 steps of this renderer before starting work on a game in it: 1. Polish up all the API commands so it’s more user friendly. For example, skinned meshes work and can be adjusted manually, but I have a really good idea on how to make working with them super easy, so I’ll definitely implement that. 2. Make a demo that includes basically everything I have developed so far. This step also includes writing compatibility for multiple platforms, because so far I’ve only tested this project on Ubuntu, and I’ll definitely need a windows version too. And that’s it, the project is nearing it’s completion. I can’t wait to make a proper game in this, which I’ll document too of course. Also, I’m writing all of this while I’m on a vacation in Denmark, so I’m quite far from home, but I’m extremely motivated to get this project finished.
FINAL POLISHING (mostly just making the API more useable) I genuinely can’t believe this. I did it, I made a renderer in Vulkan. Well, I’m still not in the clear yet, but I’m very close. Changelog: updated Skin struct to include find_joint() function added Pose struct updated existing skinned mesh systems to work with the Pose struct added sample_clip(), compute_global_pose(), compute_skinning_matrices(), pose_set_local(), pose_set_global(), pose_get_global(), update_animation() and finalize_pose(). These are all helpers for making work with animated and rigged meshes a whole lot easier moved all of the functions inside the gvk namespace, because they were about half and half before.
THE GREAT DEBUGGING and A DEMO This is the final post as long as everything works as intended. I fixed every single validation layer error that occurred, so this project is officially bug-free (to my knowledge) . I also made a really simple demo that I uploaded to the github releases tab of the repository. I also finalized the readme, so now the project also has a fancy description. What a ride, I love this project.
I worked for over 4 hours, but the renderer finally works as a library!!! That’s right, just put it in as a git submodule, add it as a subdirectory to you CMake project, and there it is! Way too much work for something so simple, but I had to debug a whole lot of stuff. I also edited the README to feature usage instructions and also how to try the demo.
I also rewrote the single mesh gltf loading function to return the material and the entire vertex and index arrays, because I’ll need them for a feature I’m making for my game. This is slowly turning into engine development and I kinda like it.
I rewrote the texture loading part of GLTF loading because it just plain didn’t work since I updated everything to tinygltf3, but I didn’t notice because it was after the demo. Anyways, it’s done now.
I completely rewrote the text rendering in the Surface class and also fixed a giant memory leak. Here’s a picture of it in use in my game.
I wasted so much time trying to optimize it all to lead to nothing, but I did end up optimizing some stuff with the Surfaces along with actual color blending for them. I did end up optimizing a bit, but that’s basically nothing. This is the most worthless update to this entire project, I don’t even know how I spent 3 hours on this.
PIXELATION POST-PROCESSING EFFECT I made my post-processing system so expandable that I just casually added it ‘cause I thought it would look cool in the game I’m making. I’m sure as hell right about that.
I also fixed a bug where the bloom’s blur looped around to the other side of the screen.
Screen-space reflections would be a major challenge, but I learned that making the skybox reflect off of shiny surfaces is a pretty good way of making your renders seem much better. As of right now it technically works, but I came to realize that I wasn’t loading materials right, so if an image didn’t have a roughness texture, then it would end up completely shiny. I’m almost done fixing it.
SKYBOX REFLECTIONS This is a neat trick I did in my last engine and I’m happy I recreated it in this one. Every single shiny surface reflects the skybox, which while isn’t realistic, it does make those surfaces look a lot more shiny than what they actually are, which is a great hack. It sure as hell looks better in the environments I make.
FOG Yeah I just added fog because I thought it would look cool in my game. Obviously it’s over the top in this image because I wanted to show it off. I’m pretty proud of this one, definitely one of the more complex post-processing effects.
I made a few minor tweaks to fog, and I started debugging it, which I ended up completely stopping and reverting, as it was useless. To be honest I’m really trying to find where this 27 minutes appeared, because I don’t remember spending half an hour on this
Ships:
GVK (short for gungu vulkan) is my new renderer using the Vulkan graphics api. I miss the times when I worked with pygame and love2d, where rendering an image was one simple line of code, and I intend to bring that experience to 3D with this project. Everything is designed to be as easy as possible for the user, just writes gvk::draw_mesh(mesh, material, position, scale, rotation); and the mesh is where you want it, how you want it. But don’t mistake it, this is not a game engine, this is just a renderer, something you can build an engine on. I made this tool so my later projects have a graphical backbone to build on, but every game needs a different engine. Ever since I started graphics programming last year I knew that one day I had to learn Vulkan if I ever wanted a job in it in the future, and I’m very proud of myself for finally doing it. This was the greatest challenge I faced in programming so far, and I so glad I tackled it. And as for AI: This project was created so I could learn Vulkan, and if I copied everything from AI that would have been to effective. My goal was to use as little AI as I could, while still leaving out the headaches of development. Here’s what I used AI for: Many of the shaders were written by AI, but that’s because I haven’t learned any of the maths I need to know to write any of these shader. When a shader wasn’t too math heavy I wrote it myself, but there weren’t too many of those. The GLTF loading isn’t hard, it’s just a headache to work with it. GLTF is a horrible format for developers, but it’s the best I knew, so I rather had AI write the GLTF loading functions. I’m still glad I did that, I would have learned nothing from writing those.
This is the second ship of my game engine / renderer. To explain, I like calling it a renderer instead of a game engine, because I purposefully tried to add as few bloat features as I could, I just wanted something that made rendering something that I don’t have to think about. More info on the README page, this isn’t a good explanation. Just know that it isn’t just a basic Vulkan abstraction, this is a full renderer with PBR, many post-processing effects, skyboxes, dynamic lights, rigged and animated meshes and frustrum culling ’cause why not. Changelog since the last ship: 2 new post-processing effects, pixelation and fog I also added a feature where shiny objects reflect the skybox, which isn’t realistic, but it adds a great sense of realism and I like to add it to my games. one of the largest changes was turning this into an actual library instead of an executable, which allows easier integration. I also made a full game as a tech demo for this project, it can be found at this link or under my stardance profile. It turned out really well, and I’m proud of myself, because I finally made a game engine that I can actually make games in easily. (The screenshot is from the game) and the smallest but still a significant change was rewriting the entire 2D rendering part of the engine for 2 reasons: it had a memory leak, and text rendering was buggy, slow and barely worked....
|
1792842811.0408392
|
1792929211.0408392
|
|
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
|
|
8385
|
My first slack bot! by @AdaChan | Stardance
|
AdaChan
|
2
|
21.0
|
75
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-06T17:54:11Z", "hours": 17.0, "multiplier": 4.36, "payout": 75, "blessing": "neutral", "text": "I made Koizinho, a Slack bot with several fun and useful commands. Some of my favorite commands are /koi-user, which generates a card with information about a selected user, /koi-sound, which lets you choose and listen to animal sounds, and /koi-tts, which converts text into spoken audio. The most challenging part was definitely /koi-user. I wanted the bot to generate a custom image with information about a user, but working with Canvas in JavaScript was much harder than I expected. I ran into a lot of errors, especially with positioning and generating the image correctly. I also experimented with Python and JavaScript communicating with each other before eventually deciding to keep the image generation in JavaScript. There were many moments where fixing one error somehow created another one. 😭 I’m proud that I managed to keep working on the project even when some parts became really frustrating. I learned a lot about Slack commands, modals, APIs, image generation, audio, and organizing a larger JavaScript project. /koi-user was especially satisfying because it went from being a huge mess of errors to actually working.", "repo": "https://github.com/Hallow303/MySlackBot", "demo": "https://hackclub.enterprise.slack.com/archives/C0BJ6DKPT36"}, {"ship_num": 2, "ts": "2026-07-14T22:21:44Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I created a Slack bot using JavaScript. My bot features nine commands, including /koi-ping, which replies with “Pong!” to check if the bot is online; /koi-apod, which uses the NASA API to send the Astronomy Picture of the Day; commands like /koi-cat, /koi-dog, /koi-fox, and /koi-duck, which use APIs to send random animal images; /koi-sound, which sends MP3 animal sounds; /koi-say, which repeats the user’s message; and /koi-tts, which converts text to speech using Microsoft Edge TTS. To develop the project, I used various APIs, primarily to fetch images from NASA and of animals. I also worked with audio files to implement the commands related to sounds and text-to-speech conversion. The biggest challenge during development was dealing with file paths. Honestly… who decided it had to work that way? 😭 I spent a long time trying to figure out why the files weren’t being found before I managed to organize everything correctly.", "repo": "https://github.com/Hallow303/MySlackBot", "demo": "https://hackclub.enterprise.slack.com/archives/C0BJ6DKPT36"}]...
|
[{"post_id": 63069, "ts": "202 [{"post_id": 63069, "ts": "2026-09-06T17:41:50Z", "hours": 3.6686, "text": "DevLog #22 I finally got it working. I discovered the error was in how the commands were being loaded, since they were all being loaded from a “commands” folder via index.js , they were taking too long to respond; because of the response time limit, an error kept popping up. I managed to fix it, though, and now it works =) I also fixed some bugs in other commands."}, {"post_id": 62211, "ts": "2026-09-05T14:00:46Z", "hours": 0.6558, "text": "DevLog #21 I made some adjustments, I think I’ll rewrite some of the bot’s commands, I fixed some existing errors (and created others =( unfortunately). But I think it’s getting better now."}, {"post_id": 61188, "ts": "2026-09-04T00:12:53Z", "hours": 0.4742, "text": "DevLog #20 I updated the project’s README; it remains quite simple because the bot is also simple, haha. I gave up on the /koi-user command for now, it was giving me too many headaches, so I’ll leave it for later."}, {"post_id": 59935, "ts": "2026-09-02T00:06:33Z", "hours": 0.4239, "text": "DevLog #19 I created a command called /koi-help that lists all the bot’s available commands. This will be useful since we already have quite a few commands; I plan to replace that wall of text with a menu where the user can choose a category (general, animals, utilities, games), and the bot will respond with the commands for that category to avoid cluttering the chat."}, {"post_id": 59929, "ts": "2026-09-01T23:27:35Z", "hours": 1.2503, "text": "DevLog #18 So… this command is really frustrating me; every time I fix something, another error pops up, and I don’t know what to do. At least most of it is already done. I hope I can sort this out soon."}, {"post_id": 58183, "ts": "2026-08-30T15:18:53Z", "hours": 1.08, "text": "DevLog #17 Still struggling with this command ( /koi-user ), it was supposed to be ‘easy,’ but I just ended up complicating the code even further. Well, I’m still trying to organize the elements in the image and fix an error that prevents the bot from sending the card to the user, it’s getting really annoying (why does JS have to be like this?). I hope to finish this command soon; maybe DevLog 18 will be about that, but for now, I’ll keep working on it 🥀🙏"}, {"post_id": 51363, "ts": "2026-08-20T23:57:09Z", "hours": 0.3933, "text": "DevLog #16 Fixing bugs again. I gave up on using Python + JavaScript; honestly, it was getting too difficult. Now I need to sort out the positioning, because when I was porting the code from Python to JS, the elements ended up out of place. I’m not sure if Python and JS handle image pixels differently."}, {"post_id": 50302, "ts": "2026-08-19T13:47:19Z", "hours": 0.5353, "text": "DevLog #15 I’m reviewing some commands I’ve already implemented and fixing a few issues. Strangely, the bot is taking a while to respond; it keeps displaying the message /koi-calc failed because the app did not respond... repeatedly, yet a few seconds later, the bot actually executes the command which is really odd."}, {"post_id": 49987, "ts": "2026-08-19T00:40:21Z", "hours": 0.8622, "text": "DevLog #14 Today I added two more simple commands /koi-rps and /koi-calc . /koi-calc actually already existed, but I had ended up deleting it. /koi-rps is a small Rock, Paper, Scissors game. The user chooses rock, paper, or scissors, and Koizinho makes a random choice. Then, the bot compares the two choices and announces whether the player won, lost, or tied."}, {"post_id": 46635, "ts": "2026-08-14T01:05:51Z", "hours": 1.1544, "text": "DevLogs #13 I didn’t implement any new features today; I just fixed some bugs that were cropping up in Koizinho’s commands."}, {"post_id": 44304, "ts": "2026-08-09T23:34:58Z", "hours": 0.4442, "text": "DevLog #12 I discovered that it’s possible to make .py and .js interact with each other. Now I’m learning how this communication works and trying not to explode in the process. XD"}, {"post_id": 44012, "ts": "2026-08-09T14:39:57Z", "hours": 1.5331, "text": "DevLog #11 Well, I finally finished the Easy-PIL part in Python! The card is ready now. I also set up the system so that data is automatically populated based on a JSON file. When someone uses the /koi-user command, it generates a JSON file with the selected user’s information, and then the Python script uses that data to create the card. I designed the card myself in Canva. I spent way too much time on something so simple XD, but I really liked the result!"}, {"post_id": 43630, "ts": "2026-08-09T00:23:13Z", "hours": 2.215, "text": "DevLog #10 I’m changing the user info card. I’m now using Python to generate the images. Honestly, using the JS Canvas is a real pain, and Python’s Easy-PIL turns out to be much easier. Now, the tricky part will be handling the communication between the .js and .py files."}, {"post_id": 41051, "ts": "2026-08-05T00:23:54Z", "hours": 1.3928, "text": "DevLog #9 I’m developing a new command called /koi-user . It displays information about the user you choose. Since the arguments of slash commands in Slack aren’t very organized (in the sense of having defined types), I had to work around the problem. In Discord, for example, you can define an argument as user_mention , so Discord itself understands that it’s a user. In Slack, it doesn’t work that way. You can’t even pass a mention as an argument to the command, lol. So the solution I found was to create a modal. When you use the command, a window opens with all the users in the workspace, and you can search by name or choose one from the list. After sending, the bot generates an image with some user information and sends the result to you. (Some text is still in Portuguese because I haven’t translated everything into English yet. ;-;)"}, {"post_id": 38937, "ts": "2026-08-01T15:28:57Z", "hours": 1.1856, "text": "DevLog #8 I decided to continue developing the bot, so here’s what I’ve done since the last update: 1. Code organization I improved the project’s organization by separating command groups into different files. Now, each file has a specific responsibility: animals → animal-related commands, such as /koi-duck , /koi-cat , /koi-dog , and others. space → space-related commands, such as /koi-apod . I plan to add more commands in this category later. utility → general commands, such as /koi-say and /koi-tts . This has made the code much easier to maintain and allows for easier addition of new features. 2. Loading system for responses One thing that really bothered me was when a command took a while to respond. On Discord, when a bot is processing something, a “Bot is thinking…” message appears while it works. I couldn’t find an exact equivalent on Slack, so I decided to create my own system. Now, some commands send a loading message first—for example: 🦆 Looking for a duck… Once the command finishes, that message is updated with the final response. This makes for a much better experience; before, it used to look like the bot had stopped working lol. 3. Direct messages with the bot I finally managed to enable DMs for the bot! Now you can chat directly with Koizinho in private. It can already respond to simple messages, for example: User: Hi! Koizinho: Hello! I still want to improve this part. Maybe I’ll add some form of AI or a smarter conversation system in the future."}, {"post_id": 28574, "ts": "2026-07-14T22:13:38Z", "hours": 0.2719, "text": "DevLog #7 The bot is finally online! 🚀 I deployed it to Hack Club Nest, so now it runs 24/7."}, {"post_id": 27993, "ts": "2026-07-13T23:19:54Z", "hours": 0.6744, "text": "DevLog #6 Okay… I finally finished the project’s README! 🎉 I think it turned out pretty cool; it’s not super professional yet, but I think it does a good job of showing what the bot can do. I might improve it in the future whenever I can shake off the laziness, haha. I also realized I used Axios quite a bit in this project. Most of the new commands rely on external APIs. There isn’t much else to add to this devlog; at least I’m happy it’s not just a bot that replies “pong” 😆"}, {"post_id": 27958, "ts": "2026-07-13T22:02:39Z", "hours": 0.6086, "text": "DevLog #5 New command, wow!! 🎉🎉🎉🎉 Person: “Wait… isn’t that just /koi-say ?” Well… sort of. It’s basically an improved /koi-say . Meet the new command: /koi-tts . As the name suggests, TTS stands for Text to Speech . The bot takes the text you send, uses Microsoft Edge’s TTS voices to turn it into an MP3, and then sends the audio back to you. Pretty cool. =) (I hate path 😭)"}, {"post_id": 27928, "ts": "2026-07-13T21:07:14Z", "hours": 0.2622, "text": "DevLog #4 Today I added a very simple command: /koi-say . It does exactly what the name suggests: the bot repeats the message you type. Nothing spectacular, but it’s a classic, useful command for testing interactions. If you don’t type anything, the bot replies by letting you know that text is required. The message might seem a bit blunt… but remember: it’s just a koizinho . 😭 By the way, I was thinking about how to explain the bot’s name in English. I think the closest equivalent would be something like “little koi” . In Portuguese, we use the suffix -zinho to form a diminutive that often conveys affection or cuteness. So, koizinho would be something like a “little koi” or an affectionate way to refer to the bot."}, {"post_id": 27912, "ts": "2026-07-13T20:43:58Z", "hours": 0.6733, "text": "DevLog #3 So… continuing the animal saga, I present to you: /koi-sound . 🐾 This command makes the bot send a humble animal selection menu. Then, you just pick one (there are still only a few, hahaha), and the bot replies with an .mp3 file containing the chosen animal’s sound. The list of animals is still small, but I plan to add many more in future devlogs. And a quick rant: I hate path . 😭 Who decided that handling file paths had to be done this way?"}, {"post_id": 27881, "ts": "2026-07-13T19:50:39Z", "hours": 0.7331, "text": "DevLog #2 Today I added 4 new commands to the bot. To be honest, it wasn’t very difficult. It was basically copying the code from the first command, changing the API, and adapting it to the particularities of each one. (Seriously… who decided that each API would return the data in a different way? 😭 I just wanted to grab a humble image.) The new commands are: 🦆 /koi-duck — shows a picture of a random duck. 🐱 /koi-cat — shows a picture of a random cat. 🐶 /koi-dog — shows a picture of a random dog. 🦊 /koi-fox — shows a picture of a random fox. It was a short devlog, but at least now the bot is becoming more fun."}, {"post_id": 27406, "ts": "2026-07-12T23:10:13Z", "hours": 1.0067, "text": "DevLog #1 For this fresh start, I’ve added two commands: /koi-ping — a command that makes the bot reply with “🏓 Pong!”. /koi-apod — fetches NASA’s Astronomy Picture of the Day (APOD) and sends the image along with its description. Well… I think that’s it for this devlog."}]...
|
Title: My first slack bot! by @AdaChan | Stardance Title: My first slack bot! by @AdaChan | Stardance
Devlogs:
DevLog #1 For this fresh start, I’ve added two commands: /koi-ping — a command that makes the bot reply with “🏓 Pong!”. /koi-apod — fetches NASA’s Astronomy Picture of the Day (APOD) and sends the image along with its description. Well… I think that’s it for this devlog.
DevLog #2 Today I added 4 new commands to the bot. To be honest, it wasn’t very difficult. It was basically copying the code from the first command, changing the API, and adapting it to the particularities of each one. (Seriously… who decided that each API would return the data in a different way? 😭 I just wanted to grab a humble image.) The new commands are: 🦆 /koi-duck — shows a picture of a random duck. 🐱 /koi-cat — shows a picture of a random cat. 🐶 /koi-dog — shows a picture of a random dog. 🦊 /koi-fox — shows a picture of a random fox. It was a short devlog, but at least now the bot is becoming more fun.
DevLog #3 So… continuing the animal saga, I present to you: /koi-sound . 🐾 This command makes the bot send a humble animal selection menu. Then, you just pick one (there are still only a few, hahaha), and the bot replies with an .mp3 file containing the chosen animal’s sound. The list of animals is still small, but I plan to add many more in future devlogs. And a quick rant: I hate path . 😭 Who decided that handling file paths had to be done this way?
DevLog #4 Today I added a very simple command: /koi-say . It does exactly what the name suggests: the bot repeats the message you type. Nothing spectacular, but it’s a classic, useful command for testing interactions. If you don’t type anything, the bot replies by letting you know that text is required. The message might seem a bit blunt… but remember: it’s just a koizinho . 😭 By the way, I was thinking about how to explain the bot’s name in English. I think the closest equivalent would be something like “little koi” . In Portuguese, we use the suffix -zinho to form a diminutive that often conveys affection or cuteness. So, koizinho would be something like a “little koi” or an affectionate way to refer to the bot.
DevLog #5 New command, wow!! 🎉🎉🎉🎉 Person: “Wait… isn’t that just /koi-say ?” Well… sort of. It’s basically an improved /koi-say . Meet the new command: /koi-tts . As the name suggests, TTS stands for Text to Speech . The bot takes the text you send, uses Microsoft Edge’s TTS voices to turn it into an MP3, and then sends the audio back to you. Pretty cool. =) (I hate path 😭)
DevLog #6 Okay… I finally finished the project’s README! 🎉 I think it turned out pretty cool; it’s not super professional yet, but I think it does a good job of showing what the bot can do. I might improve it in the future whenever I can shake off the laziness, haha. I also realized I used Axios quite a bit in this project. Most of the new commands rely on external APIs. There isn’t much else to add to this devlog; at least I’m happy it’s not just a bot that replies “pong” 😆
DevLog #7 The bot is finally online! 🚀 I deployed it to Hack Club Nest, so now it runs 24/7.
DevLog #8 I decided to continue developing the bot, so here’s what I’ve done since the last update: 1. Code organization I improved the project’s organization by separating command groups into different files. Now, each file has a specific responsibility: animals → animal-related commands, such as /koi-duck , /koi-cat , /koi-dog , and others. space → space-related commands, such as /koi-apod . I plan to add more commands in this category later. utility → general commands, such as /koi-say and /koi-tts . This has made the code much easier to maintain and allows for easier addition of new features. 2. Loading system for responses One thing that really bothered me was when a command took a while to respond. On Discord, when a bot is processing something, a “Bot is thinking…” message appears while it works. I couldn’t find an exact equivalent on Slack, so I decided to create my own system. Now, some commands send a loading message first—for example: 🦆 Looking for a duck… Once the command finishes, that message is updated with the final response. This makes for a much better experience; before, it used to look like the bot had stopped working lol. 3. Direct messages with the bot I finally managed to enable DMs for the bot! Now you can chat directly with Koizinho in private. It can already respond to simple messages, for example: User: Hi! Koizinho: Hello! I still want to improve this part. Maybe I’ll add some form of AI or a smarter conversation system in the future.
DevLog #9 I’m developing a new command called /koi-user . It displays information about the user you choose. Since the arguments of slash commands in Slack aren’t very organized (in the sense of having defined types), I had to work around the problem. In Discord, for example, you can define an argument as user_mention , so Discord itself understands that it’s a user. In Slack, it doesn’t work that way. You can’t even pass a mention as an argument to the command, lol. So the solution I found was to create a modal. When you use the command, a window opens with all the users in the workspace, and you can search by name or choose one from the list. After sending, the bot generates an image with some user information and sends the result to you. (Some text is still in Portuguese because I haven’t translated everything into English yet. ;-;)
DevLog #10 I’m changing the user info card. I’m now using Python to generate the images. Honestly, using the JS Canvas is a real pain, and Python’s Easy-PIL turns out to be much easier. Now, the tricky part will be handling the communication between the .js and .py files.
DevLog #11 Well, I finally finished the Easy-PIL part in Python! The card is ready now. I also set up the system so that data is automatically populated based on a JSON file. When someone uses the /koi-user command, it generates a JSON file with the selected user’s information, and then the Python script uses that data to create the card. I designed the card myself in Canva. I spent way too much time on something so simple XD, but I really liked the result!
DevLog #12 I discovered that it’s possible to make .py and .js interact with each other. Now I’m learning how this communication works and trying not to explode in the process. XD
DevLogs #13 I didn’t implement any new features today; I just fixed some bugs that were cropping up in Koizinho’s commands.
DevLog #14 Today I added two more simple commands /koi-rps and /koi-calc . /koi-calc actually already existed, but I had ended up deleting it. /koi-rps is a small Rock, Paper, Scissors game. The user chooses rock, paper, or scissors, and Koizinho makes a random choice. Then, the bot compares the two choices and announces whether the player won, lost, or tied.
DevLog #15 I’m reviewing some commands I’ve already implemented and fixing a few issues. Strangely, the bot is taking a while to respond; it keeps displaying the message /koi-calc failed because the app did not respond... repeatedly, yet a few seconds later, the bot actually executes the command which is really odd.
DevLog #16 Fixing bugs again. I gave up on using Python + JavaScript; honestly, it was getting too difficult. Now I need to sort out the positioning, because when I was porting the code from Python to JS, the elements ended up out of place. I’m not sure if Python and JS handle image pixels differently.
DevLog #17 Still struggling with this command ( /koi-user ), it was supposed to be ‘easy,’ but I just ended up complicating the code even further. Well, I’m still trying to organize the elements in the image and fix an error that prevents the bot from sending the card to the user, it’s getting really annoying (why does JS have to be like this?). I hope to finish this command soon; maybe DevLog 18 will be about that, but for now, I’ll keep working on it 🥀🙏
DevLog #18 So… this command is really frustrating me; every time I fix something, another error pops up, and I don’t know what to do. At least most of it is already done. I hope I can sort this out soon.
DevLog #19 I created a command called /koi-help that lists all the bot’s available commands. This will be useful since we already have quite a few commands; I plan to replace that wall of text with a menu where the user can choose a category (general, animals, utilities, games), and the bot will respond with the commands for that category to avoid cluttering the chat.
DevLog #20 I updated the project’s README; it remains quite simple because the bot is also simple, haha. I gave up on the /koi-user command for now, it was giving me too many headaches, so I’ll leave it for later.
DevLog #21 I made some adjustments, I think I’ll rewrite some of the bot’s commands, I fixed some existing errors (and created others =( unfortunately). But I think it’s getting better now.
DevLog #22 I finally got it working. I discovered the error was in how the commands were being loaded, since they were all being loaded from a “commands” folder via index.js , they were taking too long to respond; because of the response time limit, an error kept popping up. I managed to fix it, though, and now it works =) I also fixed some bugs in other commands.
Ships:
I created a Slack bot using JavaScript. My bot features nine commands, including /koi-ping, which replies with “Pong!” to check if the bot is online; /koi-apod, which uses the NASA API to send the Astronomy Picture of the Day; commands like /koi-cat, /koi-dog, /koi-fox, and /koi-duck, which use APIs to send random animal images; /koi-sound, which sends MP3 animal sounds; /koi-say, which repeats the user’s message; and /koi-tts, which converts text to speech using Microsoft Edge TTS. To develop the project, I used various APIs, primarily to fetch images from NASA and of animals. I also worked with audio files to implement the commands related to sounds and text-to-speech conversion. The biggest challenge during development was dealing with file paths. Honestly… who decided it had to work that way? 😭 I spent a long time trying to figure out why the files weren’t being found before I managed to organize everything correctly.
I made Koizinho, a Slack bot with several fun and useful commands. Some of my favorite commands are /koi-user, which generates a card with information about a selected user, /koi-sound, which lets you choose and listen to animal sounds, and /koi-tts, which converts text into spoken audio. The most challenging part was definitely /koi-user. I wanted the bot to generate a custom image with information about a user, but working with Canvas in JavaScript was much harder than I expected. I ran into a lot of errors, especially with positioning and generating the image correctly. I also experimented with Python and JavaScript communicating with each other before eventually deciding to keep the image generation in JavaScript. There were many moments where fixing one error somehow created another one. 😭 I’m proud that I managed to keep working on the project even when some parts became really frustrating. I learned a lot about Slack commands, modals, APIs, image generation, audio, and organizing a larger JavaScript project. /koi-user was especially satisfying because it went from being a huge mess of errors to actually working....
|
1792843012.203353
|
1792929412.203353
|
|
8752
|
NASA Data Analytics (Nebula Insights) by @cognitay NASA Data Analytics (Nebula Insights) by @cognitayohan | Stardance...
|
cognitayohan
|
2
|
2.27
|
2
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-10T17:54:15Z", "hours": 0.0, "multiplier": 5.7, "payout": 2, "blessing": "neutral", "text": "Ship #1: This project is a NASA data portal that fetches live-data from NASA’s Open Source API. While many projects do this as well in just grabbing data points, this project is a step-up from that- using the data points, I used smart regression analysis to predict future coordinate points. This project makes use of NASA API and Gemini API for analysis. Hope you enjoy this fun NASA Data Workspace project!", "repo": "https://github.com/robot3-track/rocket-data-view", "demo": "https://nebulainsights.vercel.app/"}, {"ship_num": 2, "ts": "2026-06-07T00:46:54Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "NASA Mission Analytics Workspace 🛰️ Project Overview The NASA Mission Analytics Workspace is a high-fidelity, real-time telemetry dashboard designed to centralize and visualize critical multi-stream data from diverse NASA API endpoints. The application provides researchers and space enthusiasts with an integrated mission control interface to monitor planetary conditions, track near-Earth objects, and audit severe space weather events in real time. By mapping data across complex, independent astronomical data systems into a unified analytics canvas, the workspace serves as a centralized hub for tracking cosmic anomalies and structural trends. 🚀 Core Features Multi-Stream Data Ingestion: Dynamic, context-aware swapping across four distinct NASA APIs: Near-Earth Object (NEO) tracking, Mars InSight atmospheric data, Astronomy Picture of the Day (APOD) metadata, and Space Weather Database of Notifications, Knowledge, and Information (DONKI). Predictive Failover Subsystems: Built-in telemetry simulation fallbacks for historical or offline data arrays (such as the concluded Mars InSight mission parameters) to ensure continuous chart rendering and unbroken timeline data. Automated Anomaly Audit: An integrated parsing matrix that scans inbound datasets to flag, count, and isolate critical risks—such as potentially hazardous asteroids or severe M/X-class solar flare events. Fluid Layout Architecture: A fully responsive interface utilizing shadcn/ui navigation structures and dynamic grid column allocation, allowing full operational tracking across standard desktop workstation arrays down to mobile touch viewports. 🛠️ Technical Stack & Architecture Frontend Framework: React with TypeScript for Type-safe architecture and structured telemetry models. Styling & Responsive Core: Tailwind CSS utilizing fluid padding profiles, aspect-ratio bounds, and flexbox wrap-fallbacks. Component Library: shadcn/ui (leveraging , state hooks, and native transition wrappers). Icons: Lucide React vector assets. System Status: Production build complete. Remote synchronization verified. All telemetry channels online.", "repo": "https://github.com/robot3-track/rocket-data-view", "demo": "https://nebulainsights.vercel.app/"}]...
|
[{"post_id": 26176, "ts": "202 [{"post_id": 26176, "ts": "2026-07-10T20:32:45Z", "hours": 0.2714, "text": "Devlog 3: Updated Readme file to reflect project goals, standards, license, and how to deploy when forking the project."}, {"post_id": 3955, "ts": "2026-06-07T02:43:56Z", "hours": 0.3, "text": "DevLog 2: Project Standalone Optimization & APOD Ingestion Fix Data Architecture: The Overview page chart safely handles dynamic switching across all four target NASA endpoints seamlessly. UI has been updated to match Design.MD standards and removed unnecessary features in cluttering."}, {"post_id": 3908, "ts": "2026-06-07T00:43:49Z", "hours": 1.5875, "text": "Devlog 1: NASA Mission Analytics Workspace The Goal: I wanted to build a unified mission control dashboard that pulls live space data from 4 completely different NASA APIs—tracking hazardous near-Earth asteroids, Mars weather, solar flares, and deep space imagery. Where it stands: Everything is pushed live to GitHub! Telemetry is online, the charts look stunning, and it functions great! Whether you’re inspecting space anomalies on a desktop monitor or on a phone screen, it functions just like how it should!"}]...
|
Title: NASA Data Analytics (Nebula Insights) by @c Title: NASA Data Analytics (Nebula Insights) by @cognitayohan | Stardance
Devlogs:
Devlog 1: NASA Mission Analytics Workspace The Goal: I wanted to build a unified mission control dashboard that pulls live space data from 4 completely different NASA APIs—tracking hazardous near-Earth asteroids, Mars weather, solar flares, and deep space imagery. Where it stands: Everything is pushed live to GitHub! Telemetry is online, the charts look stunning, and it functions great! Whether you’re inspecting space anomalies on a desktop monitor or on a phone screen, it functions just like how it should!
DevLog 2: Project Standalone Optimization & APOD Ingestion Fix Data Architecture: The Overview page chart safely handles dynamic switching across all four target NASA endpoints seamlessly. UI has been updated to match Design.MD standards and removed unnecessary features in cluttering.
Devlog 3: Updated Readme file to reflect project goals, standards, license, and how to deploy when forking the project.
Ships:
NASA Mission Analytics Workspace 🛰️ Project Overview The NASA Mission Analytics Workspace is a high-fidelity, real-time telemetry dashboard designed to centralize and visualize critical multi-stream data from diverse NASA API endpoints. The application provides researchers and space enthusiasts with an integrated mission control interface to monitor planetary conditions, track near-Earth objects, and audit severe space weather events in real time. By mapping data across complex, independent astronomical data systems into a unified analytics canvas, the workspace serves as a centralized hub for tracking cosmic anomalies and structural trends. 🚀 Core Features Multi-Stream Data Ingestion: Dynamic, context-aware swapping across four distinct NASA APIs: Near-Earth Object (NEO) tracking, Mars InSight atmospheric data, Astronomy Picture of the Day (APOD) metadata, and Space Weather Database of Notifications, Knowledge, and Information (DONKI). Predictive Failover Subsystems: Built-in telemetry simulation fallbacks for historical or offline data arrays (such as the concluded Mars InSight mission parameters) to ensure continuous chart rendering and unbroken timeline data. Automated Anomaly Audit: An integrated parsing matrix that scans inbound datasets to flag, count, and isolate critical risks—such as potentially hazardous asteroids or severe M/X-class solar flare events. Fluid Layout Architecture: A fully responsive interface utilizing shadcn/ui navigation structures and dynamic grid column allocation, allowing full operational tracking across standard desktop workstation arrays down to mobile touch viewports. 🛠️ Technical Stack & Architecture Frontend Framework: React with TypeScript for Type-safe architecture and structured telemetry models. Styling & Responsive Core: Tailwind CSS utilizing fluid padding profiles, aspect-ratio bounds, and flexbox wrap-fallbacks. Component Library: shadcn/ui (leveraging , state hooks, and native transition wrappers). Icons: Lucide React vector assets. System Status: Production build complete. Remote synchronization verified. All telemetry channels online.
Ship #1: This project is a NASA data portal that fetches live-data from NASA’s Open Source API. While many projects do this as well in just grabbing data points, this project is a step-up from that- using the data points, I used smart regression analysis to predict future coordinate points. This project makes use of NASA API and Gemini API for analysis. Hope you enjoy this fun NASA Data Workspace project!...
|
1792846095.540111
|
1792932495.540111
|
|
8856
|
The Ares Horizon by @alomnsh | Stardance
|
alomnsh
|
2
|
48.73
|
322
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-20T03:08:53Z", "hours": 19.0, "multiplier": 11.4, "payout": 217, "blessing": "neutral", "text": "What did you make? I made The Ares Horizon, a Python space adventure game where you play as a NASA Flight Director. Since my last ship, I over-hauled the game by adding a brand-new landing minigame with 3 difficulties, branch-linked storylines, and dynamic custom themes. What was challenging? Ditching Tkinter for Pygame was tough because I had to learn the library from scratch to eliminate bugs. I also lost 5 hours failing to host it on the web via noVNC/Docker, forcing me to stick to an .exe. Fixing cross-platform crashes and making it run smoothly on Python 3.14 was a huge headache. What are you proud of? I’m proud of building a robust Pygame + Tkinter interface with zero prior experience. The settings menu features a slick volume slider that changes color dynamically, a factory reset, and a text-speed slider. I also successfully added a seamless “Try Again” tracker without long loading screens. What should people know so they can test your project? Windows: Go to the Releases page and download the The.Ares.Horizon.exe file to play instantly. Mac/Linux: Follow the new README steps to install system dependencies (sdl2) and run inside a Python virtual environment. Python 3.14: Run pip install pygame --ce to avoid compilation errors. Warning: Turn down the audio in the custom Settings menu if the default launch mix is too loud.", "repo": "https://github.com/alomnsh/The-Ares-Horizon", "demo": "https://github.com/alomnsh/The-Ares-Horizon/releases/tag/v2.0.0"}, {"ship_num": 2, "ts": "2026-06-20T17:02:20Z", "hours": 12.0, "multiplier": 9.08, "payout": 105, "blessing": "neutral", "text": "I made my own choice python adventure game where the player takes a high-stake role of a Flight Director at NASA and there objective is to successfully launch, navigate and land a spacecraft on the surface of Mars. To play the game follow the steps in the README. (The game uses Desktop-Based GUI, so it cannot be hosted on clouds and has to run on your local computer). I am proud of how I made it look cinematic and similar to a NASA mission control terminal.", "repo": "https://github.com/alomnsh/The-Ares-Horizon", "demo": "https://github.com/alomnsh/The-Ares-Horizon/releases/tag/v2.0.0"}]...
|
[{"post_id": 68726, "ts": "202 [{"post_id": 68726, "ts": "2026-09-15T17:01:15Z", "hours": 2.5175, "text": "Devlog #16, posting this while at school 🏫 What I did: Fixed bugs in my minigame, there are still some left to resolve Fixed a bug where when you press try again, it put the user directly in the story mode even if they wished to play the mingame Fixed of bug of the emergency glow, it kept glowing after u pressed try again Rewrote parts of code I used AI in Removed and added new comments to make it more clear and not so chaotic Fixed the pygbag sizing issue Last thing, I previously had my setting.json file in the .gitignore for testing purposes and I forgot about it so my settings are what were seen by others instead of the factory settings they should have seen Notes: Fix minigame Optimize for low end devices Possibly add mobile or tablet support?? Make new v3.0.0 releases?? Releases for many OS??"}, {"post_id": 53416, "ts": "2026-08-23T23:10:43Z", "hours": 8.8311, "text": "Devlog #15, this is a big one What i did: So graphics are finally in I would say New hover effects like button glowing CRT lines, I first added them, didn’t go as planned removed em it the felt dead for some reason so added that back again Light mode The major one, improved the mini-game, a lot, it take up the whole screen now instead of just a section like it was earlier, it has added particle effects, and actual landing zone, star backgroud, fuel and velocity control The mini game looks real good but there are some bugs, many I would say I am currently working on fixing sizing issues with GitHub pages, I think pygbag is causing it via my deploy.yml Notes: When the bugs are removed and the sizing issue is fixed I think I will be ready to ship once more"}, {"post_id": 40503, "ts": "2026-08-04T02:29:20Z", "hours": 6.3825, "text": "Devlog #14 What I did: So after I 2nd ship, I went to AirVenture so no code there, It ruined my streak So I have finally, finally pushed the code on the web by making it entirely pygame then I ran pygbag so it is now finally live on GitHub Pages Proud of myself, there is still some work to do like fixing bugs Notes: My ship rating reasons suggested to add graphics so currently working on that I also have to improve the loading screen, looks like shit The biggest bug was getting the character and line spacing right, funny ik"}, {"post_id": 31582, "ts": "2026-07-20T02:55:39Z", "hours": 2.7858, "text": "Devlog 13 !! What’s New: I added Reset All Settings to default button, to reset every thing to the “Factory Setting” New setting, users can adjust how fast the typewriter writes on the screen If the user passes the mini game and lands successfully, they would unlock the option to just play the minigame instead of have to go through the the whole story again Notes: I promised that I will release web, I tried, failed miserably, so I am just releasing a new .exe I tried everything to pygame , didn’t work out, then tried to host it on noVNC, it acted up to, I finally gave up after 5 hrs of trying, didn’t count that because that was trial and error and not actual coding (although I did had to make and modify my Dockerfile like a 100 times)"}, {"post_id": 29177, "ts": "2026-07-15T22:03:47Z", "hours": 2.2292, "text": "Devlog #12 !! What I did: So as u guys know I added audio controls in the previous devlog, I made it even better now The settings menu is now in pygame instead of tkinter The slider changes color as the volume is changed (It looks so cool!!!!! ) There is a new “Mute All Sounds” check box Notes: tkinter sucks, I loved it at first it was easy but as my code becomes more complex it just causes unnecessary bugs, so I plan to switch entirely to pygame After I make the switch I can finally publish it to the web so you guys don’t have to download the source code or an .exe file (I was planning to do this, I got many reviews saying that a website would be better, so I am doing that)"}, {"post_id": 26902, "ts": "2026-07-11T23:05:32Z", "hours": 1.5653, "text": "Devlog #11 !!! What I did: So I switched from ctypes to the pygame audio engine this is so when my game is played on MacOS or Linux it doesn’t throw errors because ctypes is a Windows thing Added a settings menu to control the volume of the background music and the emergency sounds. The user preferences are saved using a .json file Updated my README.md so the instructions to how to play my game on another operating system aren’t broken Thanks to my ship suggestion, I am trying my best to implement those suggestions into my game and have already done so with a few of them!! What might be coming next: I hope that I can add to the settings menu so the user can control how they want the colors to look in the game, so basically full customization."}, {"post_id": 26133, "ts": "2026-07-10T19:03:00Z", "hours": 2.0886, "text": "My first ship is finally here, after 3 changes requested, I added a try again screen so the user doesn’t have to through the loading when they try again now it just shows there tries. Thanks for the idea from my first ship."}, {"post_id": 20472, "ts": "2026-07-02T02:15:56Z", "hours": 0.4544, "text": "Fixed the bug made the buttons disappear if your screen was too small or you weren’t fullscreened"}, {"post_id": 20339, "ts": "2026-07-01T22:18:29Z", "hours": 6.5228, "text": "v2.0.0 I think?? What’s New: New Landing minigame!! 3 difficulties The minigame features SPIKES!! Improved GUI Changes: I orginally started building my game on tkinter thinking it would be easy because my rest of the code was build on it, but I was wrong, it was so annoying to work with and caused so many bugs that I decided to switch to pygame I have never worked with pygame before so I ha to learn and then figure out a way to combine tkinter and pygame . Also, pygame is not supported in Python 3.14 so I had to do pip install pygame --ce the community edition I got it to work and I am so proud The video is a bit speed up"}, {"post_id": 16038, "ts": "2026-06-26T01:44:55Z", "hours": 1.09, "text": "I cleaned up the UI and linked the Solar Sails choice in branch 2 to the ending choice of branch 1. I know I promised that the update after the SFX one would be customization but I want to focus more on the game itself so I would just be adding a Dark and Light mode. And doing more customization options later."}, {"post_id": 14716, "ts": "2026-06-23T22:26:53Z", "hours": 2.4447, "text": "v 1.0.1 is incoming!! What’s New: Switched from the package of playsound to ctypes New SFXs, listen to them in the attachment (After this update rolls out, I will be working on given the user the freedom to customize how they want the game to look) Turn up your sound to listen to the sounds I cut out the parts where I selected options so that I don’t reveal the answers, if you want to try it out your self head over The Ares Horizon Repo"}, {"post_id": 12589, "ts": "2026-06-20T15:41:49Z", "hours": 1.0719, "text": "Finished my README and fixed crash bug with typewriter when the window is closed while it is typing"}, {"post_id": 11662, "ts": "2026-06-19T00:21:39Z", "hours": 1.5231, "text": "Currently working on my README for this project and before this I just fix a few things in my code. Added a background music loop that loops the audio forever and then fixed a crash bug"}, {"post_id": 10267, "ts": "2026-06-16T22:16:48Z", "hours": 4.3747, "text": "Added GUI to my games, fixed countless errors and bugs, added a loaded screen, Made it so that the buttons are interactive and only popup when the typing is finished. Added more colors to my text. Progress bar for the points."}, {"post_id": 8857, "ts": "2026-06-14T18:59:46Z", "hours": 3.4211, "text": "Finished all the choice, added typewriter function and color function. Changed how I want the text to be displayed when the code is running. Added background music. Made the background audio in Canva"}, {"post_id": 7134, "ts": "2026-06-11T22:21:25Z", "hours": 1.2161, "text": "Added 1st Choice Branch, worked on storyline, started to work on 2nd choice branch"}]...
|
Title: The Ares Horizon by @alomnsh | Stardance
D Title: The Ares Horizon by @alomnsh | Stardance
Devlogs:
Added 1st Choice Branch, worked on storyline, started to work on 2nd choice branch
Finished all the choice, added typewriter function and color function. Changed how I want the text to be displayed when the code is running. Added background music. Made the background audio in Canva
Added GUI to my games, fixed countless errors and bugs, added a loaded screen, Made it so that the buttons are interactive and only popup when the typing is finished. Added more colors to my text. Progress bar for the points.
Currently working on my README for this project and before this I just fix a few things in my code. Added a background music loop that loops the audio forever and then fixed a crash bug
Finished my README and fixed crash bug with typewriter when the window is closed while it is typing
v 1.0.1 is incoming!! What’s New: Switched from the package of playsound to ctypes New SFXs, listen to them in the attachment (After this update rolls out, I will be working on given the user the freedom to customize how they want the game to look) Turn up your sound to listen to the sounds I cut out the parts where I selected options so that I don’t reveal the answers, if you want to try it out your self head over The Ares Horizon Repo
I cleaned up the UI and linked the Solar Sails choice in branch 2 to the ending choice of branch 1. I know I promised that the update after the SFX one would be customization but I want to focus more on the game itself so I would just be adding a Dark and Light mode. And doing more customization options later.
v2.0.0 I think?? What’s New: New Landing minigame!! 3 difficulties The minigame features SPIKES!! Improved GUI Changes: I orginally started building my game on tkinter thinking it would be easy because my rest of the code was build on it, but I was wrong, it was so annoying to work with and caused so many bugs that I decided to switch to pygame I have never worked with pygame before so I ha to learn and then figure out a way to combine tkinter and pygame . Also, pygame is not supported in Python 3.14 so I had to do pip install pygame --ce the community edition I got it to work and I am so proud The video is a bit speed up
Fixed the bug made the buttons disappear if your screen was too small or you weren’t fullscreened
My first ship is finally here, after 3 changes requested, I added a try again screen so the user doesn’t have to through the loading when they try again now it just shows there tries. Thanks for the idea from my first ship.
Devlog #11 !!! What I did: So I switched from ctypes to the pygame audio engine this is so when my game is played on MacOS or Linux it doesn’t throw errors because ctypes is a Windows thing Added a settings menu to control the volume of the background music and the emergency sounds. The user preferences are saved using a .json file Updated my README.md so the instructions to how to play my game on another operating system aren’t broken Thanks to my ship suggestion, I am trying my best to implement those suggestions into my game and have already done so with a few of them!! What might be coming next: I hope that I can add to the settings menu so the user can control how they want the colors to look in the game, so basically full customization.
Devlog #12 !! What I did: So as u guys know I added audio controls in the previous devlog, I made it even better now The settings menu is now in pygame instead of tkinter The slider changes color as the volume is changed (It looks so cool!!!!! ) There is a new “Mute All Sounds” check box Notes: tkinter sucks, I loved it at first it was easy but as my code becomes more complex it just causes unnecessary bugs, so I plan to switch entirely to pygame After I make the switch I can finally publish it to the web so you guys don’t have to download the source code or an .exe file (I was planning to do this, I got many reviews saying that a website would be better, so I am doing that)
Devlog 13 !! What’s New: I added Reset All Settings to default button, to reset every thing to the “Factory Setting” New setting, users can adjust how fast the typewriter writes on the screen If the user passes the mini game and lands successfully, they would unlock the option to just play the minigame instead of have to go through the the whole story again Notes: I promised that I will release web, I tried, failed miserably, so I am just releasing a new .exe I tried everything to pygame , didn’t work out, then tried to host it on noVNC, it acted up to, I finally gave up after 5 hrs of trying, didn’t count that because that was trial and error and not actual coding (although I did had to make and modify my Dockerfile like a 100 times)
Devlog #14 What I did: So after I 2nd ship, I went to AirVenture so no code there, It ruined my streak So I have finally, finally pushed the code on the web by making it entirely pygame then I ran pygbag so it is now finally live on GitHub Pages Proud of myself, there is still some work to do like fixing bugs Notes: My ship rating reasons suggested to add graphics so currently working on that I also have to improve the loading screen, looks like shit The biggest bug was getting the character and line spacing right, funny ik
Devlog #15, this is a big one What i did: So graphics are finally in I would say New hover effects like button glowing CRT lines, I first added them, didn’t go as planned removed em it the felt dead for some reason so added that back again Light mode The major one, improved the mini-game, a lot, it take up the whole screen now instead of just a section like it was earlier, it has added particle effects, and actual landing zone, star backgroud, fuel and velocity control The mini game looks real good but there are some bugs, many I would say I am currently working on fixing sizing issues with GitHub pages, I think pygbag is causing it via my deploy.yml Notes: When the bugs are removed and the sizing issue is fixed I think I will be ready to ship once more
Devlog #16, posting this while at school 🏫 What I did: Fixed bugs in my minigame, there are still some left to resolve Fixed a bug where when you press try again, it put the user directly in the story mode even if they wished to play the mingame Fixed of bug of the emergency glow, it kept glowing after u pressed try again Rewrote parts of code I used AI in Removed and added new comments to make it more clear and not so chaotic Fixed the pygbag sizing issue Last thing, I previously had my setting.json file in the .gitignore for testing purposes and I forgot about it so my settings are what were seen by others instead of the factory settings they should have seen Notes: Fix minigame Optimize for low end devices Possibly add mobile or tablet support?? Make new v3.0.0 releases?? Releases for many OS??
Ships:
I made my own choice python adventure game where the player takes a high-stake role of a Flight Director at NASA and there objective is to successfully launch, navigate and land a spacecraft on the surface of Mars. To play the game follow the steps in the README. (The game uses Desktop-Based GUI, so it cannot be hosted on clouds and has to run on your local computer). I am proud of how I made it look cinematic and similar to a NASA mission control terminal.
What did you make? I made The Ares Horizon, a Python space adventure game where you play as a NASA Flight Director. Since my last ship, I over-hauled the game by adding a brand-new landing minigame with 3 difficulties, branch-linked storylines, and dynamic custom themes. What was challenging? Ditching Tkinter for Pygame was tough because I had to learn the library from scratch to eliminate bugs. I also lost 5 hours failing to host it on the web via noVNC/Docker, forcing me to stick to an .exe. Fixing cross-platform crashes and making it run smoothly on Python 3.14 was a huge headache. What are you proud of? I’m proud of building a robust Pygame + Tkinter interface with zero prior experience. The settings menu features a slick volume slider that changes color dynamically, a factory reset, and a text-speed slider. I also successfully added a seamless “Try Again” tracker without long loading screens. What should people know so they can test your project? Windows: Go to the Releases page and download the The.Ares.Horizon.exe file to play instantly. Mac/Linux: Follow the new README steps to install system dependencies (sdl2) and run inside a Python virtual environment. Python 3.14: Run pip install pygame --ce to avoid compilation errors. Warning: Turn down the audio in the custom Settings menu if the default launch mix is too loud....
|
1792850035.5183978
|
1792936435.5183978
|
|
9197
|
rustisay by @ttyChud | Stardance
|
ttyChud
|
2
|
10.0
|
82
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-16T10:00:22Z", "hours": 6.0, "multiplier": 5.85, "payout": 33, "blessing": "neutral", "text": "add the ability to use it in web instead of downloading it even tho both option are available and added the ability to output the generated the gif and be able to save it localy try fixing some windows issuess but i dont have an access so i dont know", "repo": "https://github.com/Himanshu121865/rustisay", "demo": "https://himanshu121865.github.io/rustisay/"}, {"ship_num": 2, "ts": "2026-06-08T19:56:24Z", "hours": 4.0, "multiplier": 8.56, "payout": 49, "blessing": "neutral", "text": "It’s a gif to ascii converter. it uses edge detection for more crisp ascii art, it automatically support color but if u wanna turn them off just use color flag . i have also added multiple txt support you can choose as per ur preference. for installation just do cargo install rustisay that’s it,", "repo": "https://github.com/Himanshu121865/rustisay", "demo": "https://himanshu121865.github.io/rustisay/"}]...
|
[{"post_id": 48008, "ts": "202 [{"post_id": 48008, "ts": "2026-08-16T09:12:34Z", "hours": 5.6686, "text": "it’s been such a long time since i have worked on this project i been wanting to add some feature like output to gif and a web ui using wasm so it’s finaly here i have add the abiltiy to save the output ascii to a gif file and i have also add a web version with rust wasm which is really fast but not as fast as when u install it in ur pc"}, {"post_id": 5099, "ts": "2026-06-08T19:45:07Z", "hours": 3.3975, "text": "ok, so finally it works now i have added only one algo and it edge detection. i wanted to start from and easy algo but f*ck it. it’s work but i didn’t add a way to output it to gif or anything."}, {"post_id": 3411, "ts": "2026-06-06T10:19:34Z", "hours": 0.7828, "text": "Im working on a gif to ascii art converter in rust. user can upload any gif they want and choose some options how they want to get converted. then it can play the gif as ascii or save at a prescribed output dir"}]...
|
Title: rustisay by @ttyChud | Stardance
Devlogs:
Title: rustisay by @ttyChud | Stardance
Devlogs:
Im working on a gif to ascii art converter in rust. user can upload any gif they want and choose some options how they want to get converted. then it can play the gif as ascii or save at a prescribed output dir
ok, so finally it works now i have added only one algo and it edge detection. i wanted to start from and easy algo but f*ck it. it’s work but i didn’t add a way to output it to gif or anything.
it’s been such a long time since i have worked on this project i been wanting to add some feature like output to gif and a web ui using wasm so it’s finaly here i have add the abiltiy to save the output ascii to a gif file and i have also add a web version with rust wasm which is really fast but not as fast as when u install it in ur pc
Ships:
It’s a gif to ascii converter. it uses edge detection for more crisp ascii art, it automatically support color but if u wanna turn them off just use color flag . i have also added multiple txt support you can choose as per ur preference. for installation just do cargo install rustisay that’s it,
add the ability to use it in web instead of downloading it even tho both option are available and added the ability to output the generated the gif and be able to save it localy try fixing some windows issuess but i dont have an access so i dont know...
|
1792860537.9088337
|
1793724537.9088337
|
|
9316
|
OMNI-Chess by @thestarviper | Stardance
|
thestarviper
|
2
|
102.0
|
1511
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-02T01:14:49Z", "hours": 63.0, "multiplier": 17.79, "payout": 873, "blessing": "neutral", "text": "I made a chess engine in raylib with puzzle functionality and a movelog with a nature theme. Migrating from pygame to raylib was a big challenge that took me a while to fix all the kinks. idk the leaves are hoverable for a cool fidget thing and have fun!", "repo": "https://github.com/TheStarViper/chess-eng", "demo": "https://thestarviper.itch.io/chess-engine"}, {"ship_num": 2, "ts": "2026-06-15T03:47:41Z", "hours": 39.0, "multiplier": 16.63, "payout": 638, "blessing": "neutral", "text": "I made a chess game where you locally 1v1 someone with a move log to see move history and all the special rules/draw conditions like 50 move rule, 3 fold, insufficient material, castling, enpessent. It was challenging doing the historical move rendering because you have to keep track of all the previous board positions and the checks and square highlights Im proud of the move log because its cool yall should know that it’s low res cuz it’s not that efficient and uses pygame and am working on a re-release utilizing raylib for more proformance", "repo": "https://github.com/TheStarViper/chess-eng", "demo": "https://thestarviper.itch.io/chess-engine"}]...
|
[{"post_id": 20435, "ts": "202 [{"post_id": 20435, "ts": "2026-07-02T00:59:11Z", "hours": 4.7919, "text": "UPDATE #13 This is the last update before i ship So basically this was just the last update for this project cuz i decided i would start work on a different project, the changes i made this update are just to get ready to ship and complete the project: removed fps counter removed openings and play menu removed variants from selection as they arent polished enough removed misc debug features audio bug fixed on button hovers audio bug fixed on puzzle win"}, {"post_id": 17944, "ts": "2026-06-28T22:04:11Z", "hours": 17.1667, "text": "UPDATE #12 added features added variants support added giveaway chess added duckchess (kinda) added the start of a play screen, still working on it not much yet added easing functions to some visuals so they appear instead of popping in fixed bugs/cleanup (like 50% of this devlog) split code back into multiple files fixed that puzzle code was directly in frame update loop tons of crash fixes todo with variants and puzzles animation broke on variants draw legal moves didn’t work on custom pieces future ideas clock bots particle system effects screen shake randomize leaves menu transitions i was mainly struggling to fix crash bugs this devlog as there were multiple that i had to fix, most notably there was a crash bug when swapping between the game and puzzle menus, and loading a new ruleset for variants. My current plan now is to finish the create game screen, then work on fixing the last duckchess bugs, programming a bot then variants + polish. I may ship again if i get a chance before i finish this though. Screenshot here shots duckchess in action but I made the duck sprite using AI just so we’re clear about that because i am bad at art."}, {"post_id": 15352, "ts": "2026-06-24T23:25:28Z", "hours": 9.0172, "text": "Update #11 Added Features added puzzle side menu added puzzle streak counter skip retry hint puzzle buttons sucess rate puzzle counter sound effect for hovering button puzzles are basically done Fixed Bugs 3 fold occured in puzzle mode if you made the same wrong move 3 times same thing with 50 move rule as 3 fold puzzle would start with you instead of the computer swaps turn on failed move animations didn’t work in puzzles fixed you can select the opponent’s pieces in the puzzle during animation if you hit a frameperfect from the animation finishing on the puzzle screen and switch to the game screen it moves the piece in the game screen if there was a piece on the starting tile same bug with next puzzle button leaves sfx looped infinitely Smart Bool I added a new datatype to make my life easier called a smartbool, this is basically a boolean with a third state called NewTrue which is only true for the first cycle the boolean is updated to true. This boolean is useful for when you want to play a sound effect on hover but if you use a traditional boolean it will play every frame. you can use it like a normal boolean too like smartbool = true; or if (smartbool){} . But this new datatype makes the code easier to understand for me. struct smartbool { enum State { False, NewTrue, True }; State state = False; void operator=(bool value) {this->set(value);} operator bool() const {return state != False; } bool is_new_true() const { return state == NewTrue; } void set(bool value) { if (value) { if (state == False) state = NewTrue; } else { state = False; } } void update() { if (state == NewTrue) { state = True; } } }; Future Ideas clock bots variants more moving graphics/sfx randomize leaves on borders menu transitions (maybe) finish polishing puzzles (pretty much done)"}, {"post_id": 13961, "ts": "2026-06-22T22:21:46Z", "hours": 16.5194, "text": "UPDATE #10 added features/changes added a sidebar added a settings page with the ability to toggle 50 move counter,3 fold counter,board markings with more settings to come like high contrast and animation speed added a makefile to compile code to test instead of running a bunch of commands back to back added puzzles to the puzzle tab pulls random puzzle out of a csv things before next ship more sfx click and drag to move piece sfx plays infinitely on hovers randomize leaves placements menu transitions polish puzzles page and get rid of bugs general ideas theme switcher animation speed control move clock In this update i messed up my codebase so massively bad trying to refactor the code so alot of my time was fixing the nuke i dropped into my codebase. uhhh one of the big bugs i had to squash before this that took eternity was playing sound effects would just crash the game. It turned out the reason was i didnt add the compile flag to my makefile causing the audio mixer to crash the game. After that i added sound effects back in and then started to work on puzzles. for puzzles i took the lichess puzzle database of 6m puzzles and condensed it down to 100k for file space. I pull a random row from this file to create the puzzle and it kinda works but its still in progress."}, {"post_id": 11768, "ts": "2026-06-19T04:42:16Z", "hours": 7.4614, "text": "UPDATE #9 I presented my changes in the stardance slack and was able to get some new ideas like adding a theme switcher. I added the leaves cuz i thought it would add to the theme and then after seeing the leaves, they looked very interactable so i made them interactable. idk thats about it changes/added features leaves on outside of board leaves enlarge on hover for fidgeting i guess idk its fun tho made move log more narrow to fit a sidebar on the left added a 3 fold repetition warning that appears after 2x repetition (make togglable) added a background i got from itchio made hover dots enlarge on hover again fixed animation issues changed board markers to inside the board like originally in python updated itchio page things before next ship add sound effects back click and drag to move piece add sidebar"}, {"post_id": 10951, "ts": "2026-06-17T23:23:52Z", "hours": 7.9317, "text": "UPDATE #8 This version is not live yet as there are a few bugs that need fixing still as the port from python introduced alot. Some things i liked about porting from python to c++ is that i was able to fine tune things more and use namespaces which i like. ENUMs are also a feature i like. changes/added features Updated graphics to use pieces from itchio 50 move rule counter under game log (i plan to make it togglable) says whos turn it is to play in top right ontop of the highlighting changed entire game to pixelart because i found some assets on itchio that i thought looked really nice things needed for next ship going to add a sidebar on the left side instead of the right side add sound effects back add a background click and drag to move piece animation issues fold repetition counter under move log make itchio page look better next devlog should be when i update the itchio page and other stuff also i spent closer to 15-16 hours on this cuz it includes the last devlog"}, {"post_id": 9054, "ts": "2026-06-15T03:36:13Z", "hours": 8.3464, "text": "UPDATE #7 i wanna have the time logged for shipping but basically all i did was change some file formats for web assembly and turned down the resolution so that it would automatically scale so that it’s playable. I’m currently in the process of converting the game from pygame to c++ raylib since i know c++ already and c++ is better for WASM thats about ittttttttt live ver: https://thestarviper.itch.io/chess-engine"}, {"post_id": 7870, "ts": "2026-06-13T03:53:24Z", "hours": 8.3592, "text": "UPDATE #6 fixed bugs: all game end conditions were broken move log scrollbar didn’t appear on pawn promotion move log didnt use proper notation canceling pawn promotion didnt undo move log canceling pawn promotion capture didnt undo capture when going back in move log, if there was a check the square didnt light red couldn’t change piece to move after selecting a piece added features/changes: promotion menu is inline column added sfx better sprites for pieces draw and resign buttons now use icons move log text now uses the Audiowide regular fond massive code restructure things needed for shipping: optimization, didn’t optimize since last devlog maybe learn WHAT DA HAIL bitboards are to optimize yk click and drag to move piece pieces flicker for a frame when transitioning from animation to static on the board"}, {"post_id": 6680, "ts": "2026-06-11T05:52:38Z", "hours": 3.0944, "text": "UPDATE #5 fixed bugs: checkmate didnt work (again) when king is in check the square didnt light red move log overflowed when filling up so i added a scroll feature added features/changes: promotion gui is now like chess.com and vertical move log is striped and alternates colors for each row board markings for the rows and columns things needed before shipping: optimization, still runs at like 45fps on itch.io sound effects maybe change fonts cuz im using default ugly ones draw/resign icons instead of text click and drag to move piece better sprites for pieces (BUG) can’t move a different piece after selecting one (BUG) draw conditions are broken (BUG) sidebar buttons are broken even though they dont do anything (BUG) when looking back in the move log when the king is in check the square stays red"}, {"post_id": 6058, "ts": "2026-06-10T05:41:11Z", "hours": 5.0128, "text": "UPDATE #4 I fixed preformance :D heres how: i drew the move log table 3x per frame instead of once so i made it do it once now was calculating if someone was in checkmate every frame which was checking if anyone had legal moves every single frame, changed it to check for checkmate on clicks which is every time someone made a move some of the stuff we were rendering were static background elements that never changed and they were being drawn every frame. So instead we render them once at the start and cache it so that we don’t render static elements so many times. (i accidentally changed the opacity of the background and dont feel like retaking the screenshot and accidentally moved the sidebar) FPS my machine 30-40 -> 200+ FPS itch.io 10 -> 45 we still have a ways to go to get a fully smooth experience but 10 to 45 fps from the demo link is much much more playable and i thought i would get a devlog out. next update ill continue to optimize and polish to get ready to ship!"}, {"post_id": 5727, "ts": "2026-06-09T17:02:19Z", "hours": 3.425, "text": "UPDATE #3 things added in this update: added a subtle background added a sidebar added “Game Log” text moved board and bar to the right a bit added a GitHub readme rounded corners of chess board and other stuff Issues: I started to notice the rendering of my chess pieces moving were slightly lagging, after doing a performance test of my code using python’s profile tool i noticed that my logic for getting legal moves was called 160k+ times and my pieces were rendered 50k+ times. This made my chess engine run at 30-50 fps so i will have to fix the performance issues soon. Next update will prolly be addressing these issues and adding more UI changes"}, {"post_id": 5349, "ts": "2026-06-09T02:49:21Z", "hours": 2.9911, "text": "UPDATE #2 things added in this update: created an itch.io page to demo the game by compiled the PYgame with pygbag added a move log with the ability to look back in time legal move dots now enlarge on hover i plan on actually making the itch.io page look good and actually add a readme to my github repo that looks good but i plan on doing that later. next update i think will be gui changes then after that i will work on QOL changes then feature additions like variants Fully functional game though and i did work on my laptop without wakatime so sad it wasnt tracked :c"}, {"post_id": 4605, "ts": "2026-06-07T23:34:09Z", "hours": 7.4347, "text": "UPDATE #1 I have created using pygame a chess engine complete with all of the rules of chess and is fully playable for local 1v1 with the features: on piece hover, piece tilts a bit piece moves to next square instead of teleporting checkmate resign and draw buttons stalemate 3 fold repetition 50 move rule en pessant castling captured pieces are shown on the side that captured them captured piece zone is aligned to board pawn promotion FUTURE IDEAS: SFX Better GUI on loss/draw screens Better GUI for promotion Main menu variants (atomic,duckchess,giveaway chess, Horde, etc) time control bots (pinging chess.com api idk how to code a chess bot from scratch) color change of boards better graphics for pieces move log when hovering on dot of the move you want to make the dot becomes bigge pull and drag pieces around board to make moves like chess.com"}]...
|
Title: OMNI-Chess by @thestarviper | Stardance
De Title: OMNI-Chess by @thestarviper | Stardance
Devlogs:
UPDATE #1 I have created using pygame a chess engine complete with all of the rules of chess and is fully playable for local 1v1 with the features: on piece hover, piece tilts a bit piece moves to next square instead of teleporting checkmate resign and draw buttons stalemate 3 fold repetition 50 move rule en pessant castling captured pieces are shown on the side that captured them captured piece zone is aligned to board pawn promotion FUTURE IDEAS: SFX Better GUI on loss/draw screens Better GUI for promotion Main menu variants (atomic,duckchess,giveaway chess, Horde, etc) time control bots (pinging chess.com api idk how to code a chess bot from scratch) color change of boards better graphics for pieces move log when hovering on dot of the move you want to make the dot becomes bigge pull and drag pieces around board to make moves like chess.com
UPDATE #2 things added in this update: created an itch.io page to demo the game by compiled the PYgame with pygbag added a move log with the ability to look back in time legal move dots now enlarge on hover i plan on actually making the itch.io page look good and actually add a readme to my github repo that looks good but i plan on doing that later. next update i think will be gui changes then after that i will work on QOL changes then feature additions like variants Fully functional game though and i did work on my laptop without wakatime so sad it wasnt tracked :c
UPDATE #3 things added in this update: added a subtle background added a sidebar added “Game Log” text moved board and bar to the right a bit added a GitHub readme rounded corners of chess board and other stuff Issues: I started to notice the rendering of my chess pieces moving were slightly lagging, after doing a performance test of my code using python’s profile tool i noticed that my logic for getting legal moves was called 160k+ times and my pieces were rendered 50k+ times. This made my chess engine run at 30-50 fps so i will have to fix the performance issues soon. Next update will prolly be addressing these issues and adding more UI changes
UPDATE #4 I fixed preformance :D heres how: i drew the move log table 3x per frame instead of once so i made it do it once now was calculating if someone was in checkmate every frame which was checking if anyone had legal moves every single frame, changed it to check for checkmate on clicks which is every time someone made a move some of the stuff we were rendering were static background elements that never changed and they were being drawn every frame. So instead we render them once at the start and cache it so that we don’t render static elements so many times. (i accidentally changed the opacity of the background and dont feel like retaking the screenshot and accidentally moved the sidebar) FPS my machine 30-40 -> 200+ FPS itch.io 10 -> 45 we still have a ways to go to get a fully smooth experience but 10 to 45 fps from the demo link is much much more playable and i thought i would get a devlog out. next update ill continue to optimize and polish to get ready to ship!
UPDATE #5 fixed bugs: checkmate didnt work (again) when king is in check the square didnt light red move log overflowed when filling up so i added a scroll feature added features/changes: promotion gui is now like chess.com and vertical move log is striped and alternates colors for each row board markings for the rows and columns things needed before shipping: optimization, still runs at like 45fps on itch.io sound effects maybe change fonts cuz im using default ugly ones draw/resign icons instead of text click and drag to move piece better sprites for pieces (BUG) can’t move a different piece after selecting one (BUG) draw conditions are broken (BUG) sidebar buttons are broken even though they dont do anything (BUG) when looking back in the move log when the king is in check the square stays red
UPDATE #6 fixed bugs: all game end conditions were broken move log scrollbar didn’t appear on pawn promotion move log didnt use proper notation canceling pawn promotion didnt undo move log canceling pawn promotion capture didnt undo capture when going back in move log, if there was a check the square didnt light red couldn’t change piece to move after selecting a piece added features/changes: promotion menu is inline column added sfx better sprites for pieces draw and resign buttons now use icons move log text now uses the Audiowide regular fond massive code restructure things needed for shipping: optimization, didn’t optimize since last devlog maybe learn WHAT DA HAIL bitboards are to optimize yk click and drag to move piece pieces flicker for a frame when transitioning from animation to static on the board
UPDATE #7 i wanna have the time logged for shipping but basically all i did was change some file formats for web assembly and turned down the resolution so that it would automatically scale so that it’s playable. I’m currently in the process of converting the game from pygame to c++ raylib since i know c++ already and c++ is better for WASM thats about ittttttttt live ver: https://thestarviper.itch.io/chess-engine
UPDATE #8 This version is not live yet as there are a few bugs that need fixing still as the port from python introduced alot. Some things i liked about porting from python to c++ is that i was able to fine tune things more and use namespaces which i like. ENUMs are also a feature i like. changes/added features Updated graphics to use pieces from itchio 50 move rule counter under game log (i plan to make it togglable) says whos turn it is to play in top right ontop of the highlighting changed entire game to pixelart because i found some assets on itchio that i thought looked really nice things needed for next ship going to add a sidebar on the left side instead of the right side add sound effects back add a background click and drag to move piece animation issues fold repetition counter under move log make itchio page look better next devlog should be when i update the itchio page and other stuff also i spent closer to 15-16 hours on this cuz it includes the last devlog
UPDATE #9 I presented my changes in the stardance slack and was able to get some new ideas like adding a theme switcher. I added the leaves cuz i thought it would add to the theme and then after seeing the leaves, they looked very interactable so i made them interactable. idk thats about it changes/added features leaves on outside of board leaves enlarge on hover for fidgeting i guess idk its fun tho made move log more narrow to fit a sidebar on the left added a 3 fold repetition warning that appears after 2x repetition (make togglable) added a background i got from itchio made hover dots enlarge on hover again fixed animation issues changed board markers to inside the board like originally in python updated itchio page things before next ship add sound effects back click and drag to move piece add sidebar
UPDATE #10 added features/changes added a sidebar added a settings page with the ability to toggle 50 move counter,3 fold counter,board markings with more settings to come like high contrast and animation speed added a makefile to compile code to test instead of running a bunch of commands back to back added puzzles to the puzzle tab pulls random puzzle out of a csv things before next ship more sfx click and drag to move piece sfx plays infinitely on hovers randomize leaves placements menu transitions polish puzzles page and get rid of bugs general ideas theme switcher animation speed control move clock In this update i messed up my codebase so massively bad trying to refactor the code so alot of my time was fixing the nuke i dropped into my codebase. uhhh one of the big bugs i had to squash before this that took eternity was playing sound effects would just crash the game. It turned out the reason was i didnt add the compile flag to my makefile causing the audio mixer to crash the game. After that i added sound effects back in and then started to work on puzzles. for puzzles i took the lichess puzzle database of 6m puzzles and condensed it down to 100k for file space. I pull a random row from this file to create the puzzle and it kinda works but its still in progress.
Update #11 Added Features added puzzle side menu added puzzle streak counter skip retry hint puzzle buttons sucess rate puzzle counter sound effect for hovering button puzzles are basically done Fixed Bugs 3 fold occured in puzzle mode if you made the same wrong move 3 times same thing with 50 move rule as 3 fold puzzle would start with you instead of the computer swaps turn on failed move animations didn’t work in puzzles fixed you can select the opponent’s pieces in the puzzle during animation if you hit a frameperfect from the animation finishing on the puzzle screen and switch to the game screen it moves the piece in the game screen if there was a piece on the starting tile same bug with next puzzle button leaves sfx looped infinitely Smart Bool I added a new datatype to make my life easier called a smartbool, this is basically a boolean with a third state called NewTrue which is only true for the first cycle the boolean is updated to true. This boolean is useful for when you want to play a sound effect on hover but if you use a traditional boolean it will play every frame. you can use it like a normal boolean too like smartbool = true; or if (smartbool){} . But this new datatype makes the code easier to understand for me. struct smartbool { enum State { False, NewTrue, True }; State state = False; void operator=(bool value) {this->set(value);} operator bool() const {return state != False; } bool is_new_true() const { return state == NewTrue; } void set(bool value) { if (value) { if (state == False) state = NewTrue; } else { state = False; } } void update() { if (state == NewTrue) { state = True; } } }; Future Ideas clock bots variants more moving graphics/sfx randomize leaves on borders menu transitions (maybe) finish polishing puzzles (pretty much done)
UPDATE #12 added features added variants support added giveaway chess added duckchess (kinda) added the start of a play screen, still working on it not much yet added easing functions to some visuals so they appear instead of popping in fixed bugs/cleanup (like 50% of this devlog) split code back into multiple files fixed that puzzle code was directly in frame update loop tons of crash fixes todo with variants and puzzles animation broke on variants draw legal moves didn’t work on custom pieces future ideas clock bots particle system effects screen shake randomize leaves menu transitions i was mainly struggling to fix crash bugs this devlog as there were multiple that i had to fix, most notably there was a crash bug when swapping between the game and puzzle menus, and loading a new ruleset for variants. My current plan now is to finish the create game screen, then work on fixing the last duckchess bugs, programming a bot then variants + polish. I may ship again if i get a chance before i finish this though. Screenshot here shots duckchess in action but I made the duck sprite using AI just so we’re clear about that because i am bad at art.
UPDATE #13 This is the last update before i ship So basically this was just the last update for this project cuz i decided i would start work on a different project, the changes i made this update are just to get ready to ship and complete the project: removed fps counter removed openings and play menu removed variants from selection as they arent polished enough removed misc debug features audio bug fixed on button hovers audio bug fixed on puzzle win
Ships:
I made a chess game where you locally 1v1 someone with a move log to see move history and all the special rules/draw conditions like 50 move rule, 3 fold, insufficient material, castling, enpessent. It was challenging doing the historical move rendering because you have to keep track of all the previous board positions and the checks and square highlights Im proud of the move log because its cool yall should know that it’s low res cuz it’s not that efficient and uses pygame and am working on a re-release utilizing raylib for more proformance
I made a chess engine in raylib with puzzle functionality and a movelog with a nature theme. Migrating from pygame to raylib was a big challenge that took me a while to fix all the kinks. idk the leaves are hoverable for a cool fidget thing and have fun!...
|
1792835389.1561942
|
1792921789.1561942
|
|
9406
|
MonkeySpeak by @hariharann | Stardance
|
hariharann
|
2
|
30.18
|
116
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-04T10:10:55Z", "hours": 12.0, "multiplier": 17.31, "payout": 63, "blessing": "neutral", "text": "monkeyspeak update is live 🙊 spoken monkeytype —> read prompts out loud, get scored on speed and clarity. v0 had the core loop. this ship adds the stuff that makes it feel like a real app. what’s new: leaderboard global board via supabase — nickname + emoji after a run, no signup home page 3-column layout with leaderboard, hero, and your personal best card your top score card still tracks local pb for the current duration, not whoever is #1 globally stats + profile /stats dashboard — streak, totals, recent runs, wpm charts, achievements profile hub drawer — activity heatmap, badges, lifetime stats everything uses the same minimal desk ui as home speech fixes try it: monkeyspeak-delta.vercel.app github.com/nothariharan/monkeyspeak", "repo": "https://github.com/nothariharan/monkeyspeak", "demo": "https://monkeyspeak-delta.vercel.app/"}, {"ship_num": 2, "ts": "2026-06-08T05:14:08Z", "hours": 5.0, "multiplier": 15.16, "payout": 53, "blessing": "neutral", "text": "monkeyspeak v0 is live 🙊 been building this for a while — it’s the spoken equivalent of monkeytype. you get a prompt, hit the mic, read it out loud, and the app tracks how fast and how accurately you speak. what’s in v0: speed mode pick 15s, 30s, 60s, or 120s live net wpm (filler words like “um” and “uh” get stripped) sentences, numbers, or paste your own custom text words dissolve on screen as you nail them monkey mascot animates based on your speaking momentum personal bests per duration + prompt type clarity mode type or paste what you said word-level diff against the original prompt grades from s down to “needs work” practice mode that rebuilds a prompt from words you missed ui refresh new landing hero: “how fast⚡can you speak 🙊” the monkey mascot IS the start button now — click it to begin speech-themed doodles, clean flat design, no gradient bloat sprite animations via gsap under the hood next.js 14 + typescript + zustand web speech api by default (no api key needed) optional deepgram integration with server-side proxy (key never hits the browser) silero vad for voice activity detection try it: clone the repo, npm install, npm run dev, allow mic access, go. github.com/nothariharan/monkeyspeak", "repo": "https://github.com/nothariharan/monkeyspeak", "demo": "https://monkeyspeak-delta.vercel.app/"}]...
|
[{"post_id": 38169, "ts": "202 [{"post_id": 38169, "ts": "2026-07-31T12:59:08Z", "hours": 10.7647, "text": "CATCHUPPPP DEVLOG — i forgot to post so now u get EVERYTHING 🙊🗣️🗣️ ok so real talk i kinda… forgot to drop a proper stardance log for a while. hours kept stacking, i kept shipping, then the banner said “u hav 10h without a log” and im like oh. whole catchup dump. big one. sorry if i yap [ THE REASON FOR THIS WAS WAKATIME BTW it doesnt even properly update 🥀 sowwy i also lost like 1 more hr of time tho welp ] last time i teased something ghosty then went quiet. that ghosty thing shipped. clarity got ripped open and rebuilt. da engine board actually filters now. results dont look half done anymore. so thats where most of the hours went into. live: https://monkeyspeak-delta.vercel.app repo: https://github.com/nothariharan/monkeyspeak QUICK RECAP already shipped before this gap: spoken monkeytype core · deepgram on brave/edge · supabase speed board · /leaderboard hub + stats/profile · results rebuild. that thread is on the project page. this post is mainly everything after dat . THE ‘GHOSTYYYY’ ( finally ) last log said “something ghosty is next” then i disappeared lmao. ghost trace is live. u race a visual ghost that replays your own speed pb. not some random #1. just u vs past u. needs atleast one speed pb with a real timeline first. built: ghost mode next to speed/clarity · desk ui so it doesnt feel like another product · dual lanes that feel like a chase · local ghost race record · lean assets ( check the branches and prs for exact stuff ) go race yourself. weirdly motivational and slightly insulting when past-u is faster 👀👀 CLARITY GOT A WHOLE PERSONALITY NOW used to be the quiet sibling of speed. same desk family, placeholder vibes. scrapbook treatment later — now its actually fun to sit on. idle: 3-col scrapbook (engine board · center · side stack) · inspector monkey · legal pad prompt · privacy note that ur mic stays with the tool prompts that CYCLE: shuffle was cursed — sentences always “before you leave…”, twisters one fixed line. now ~30 curated pads across sentences/technical/tongue-twisters, scenes (office/clinic/travel/etc), signal chips, no instant repeat, custom still works. whole point is “can the tool hear the hard bits” engine board: config bar board prompt filters the left board. badge shows active filter. results: not just % + grade anymore — engine chip, correct/wrong/missed/extra, punctuation %, delta vs prior best, normal display font HOUSEKEEPING ( fr) pruned ~31mb orphan assets · slimmed sprite utils · typecheck · SESSION_SECRET same on vercel AND render or unset on both (one side = grants break quietly) · readme/comments less corporate. deployed. hard-refresh if cached. before → after last time clarity = paste + grade + sticky prompt + soft lock. now scrapbook + shuffle pads + board filters + current/top/tool + cancel + results that explain stuff. last time ghost = a wink. now u race past-u on the desk. so thats there. STILL COOKING 🍽️ harder clarity tiers · board rate limit if it gets silly · more ghost polish · daily clarity seed · kill leftover placeholder energy ok that was a lot of catchup for a monkey that just wants u to read words out loud. if ghost or clarity feels off lmk — especially brave ppl, i see u 🐒🐒🍌"}, {"post_id": 29280, "ts": "2026-07-16T02:57:57Z", "hours": 2.4197, "text": "da monkey upgradesss -> leaderboard + results shipped two big surface reworks this week. leaderboard got its own hub. rankings, filters, and personal stats live on one page now & ofc no more bouncing between /stats and a tiny home board. cleaner rows, mode/duration toggles, and your own numbers sitting under the global board. post-test results got rebuilt from scratch. one shared results view: wpm, accuracy, consistency, streak, and the session graph, instead of the old packed panel. same screen whether you just finished a run or are peeking at what a good score looks like. ( graph mite be reworked on again but eh ) mic still moves when you’re talking. words still have to earn their place. 👻 something ghosty is next. that’s all you’re getting its really cool trust 👀👀"}, {"post_id": 22028, "ts": "2026-07-04T08:41:44Z", "hours": 5.8111, "text": "UPDATEE:: — stats, brave stt actually works, hydration fix tl;dr deepgram stt works on brave now (and edge) — words dissolve, wpm moves, no more fake “google speech blocked” errors root cause: brave kills the vercel http audio bridge + we fell back to browser speech (which shields also blocks) fix: brave/edge → render websocket proxy ( wss://monkeyspeak.onrender.com/... ); chrome/firefox still use vercel bridge fixed utterance_end_ms=400 deepgram 400 spam (minimum is 1000 on live listen) fixed bridge sending keepalive json into the pcm stream (corrupted audio, empty transcripts) stats page + profile hub — streaks, achievements, session history, same minimal desk ui as home live: https://monkeyspeak-delta.vercel.app repo: https://github.com/nothariharan/monkeyspeak (commit might differ by the time u read — i keep pushing) CHANGES:: deepgram / stt (the painful part) routing by browser browser path brave / edge websocket → render proxy → deepgram chrome / firefox (prod) same-origin POST /api/deepgram/live bridge on vercel localhost ws://localhost:8080 when backend is up, else bridge 🐜🪲🐞 that made it look dead utterance_end_ms=400 — deepgram returns http 400 on live ws below 1000ms. was baked into client urls. clamped to 1000 everywhere (client, bridge, render backend, server.js) keepalive in pcm body — http bridge was writing {\"type\":\"KeepAlive\"} into the upload stream every 3s. deepgram got garbage bytes, transcripts stayed empty, no obvious error in ui brave + duplex fetch — bridge connects, mic on, waveform moving, but ndjson response never streams back. zero words dissolved bad fallback — deepgram fail → auto webspeech → brave shields block google → ui says google is blocked even though user picked deepgram. now we don’t fallback on brave/edge when deepgram is preferred other STT polish bridge waits for BridgeReady before marking session ok server-side keepalive via deepgram sdk on the bridge route (not in pcm stream) removed verbose [STT:deepgram] console spam from prod — debug only with NEXT_PUBLIC_DEBUG_STT=true gsap scale not eligible for reset warning fixed on momentum meter stats + profile new /stats dashboard — totals, streak, recent runs, wpm trend charts profile hub drawer — nickname, activity heatmap, achievement badges shared stats-* / desk css so stats doesn’t look like a different app achievements + streak logic with unit tests ( lib/achievements.ts , lib/stats/streak.ts ) UI / polish home + results + settings aligned to same minimal desk style daily challenge card, error/not-found pages match the rest monkey favicon + readme/docs polish Infra GET /api/deepgram/proxy-health — same-origin render health check (browser never hits render directly, no cors scream) render monkeyspeak-dg-proxy redeployed via render cli what actually happened on brave user picks deepgram → app tries vercel http bridge brave never delivers streaming ndjson reliably fallback kicks webspeech → shields block google ui shows “brave shields may be blocking google’s speech service” — confusing af because user didn’t pick browser mode fix was routing + stop lying via fallback. not more deepgram dashboard staring. what’s next (maybe) GHOST RACE — new mode where u speak against ur pb (most wanted) signed run tokens so leaderboard posts tie to a finished test shared rate limit (redis/kv) if leaderboard spam shows up vendor ort wasm properly so vad worker stops whining in console ok that was a lot of browser-specific nonsense for a monkey that just wants you to read words out loud 🐒🐒🍌"}, {"post_id": 7929, "ts": "2026-06-13T07:00:10Z", "hours": 2.9903, "text": "monkeyspeak devlog more fixes (leaderboard + home + cors bug) - ship soon trust .. tl;dr home page is a 3 column layout now — leaderboard on the left, hero in the middle, top score on the right global leaderboard via supabase — nickname + emoji after a run, no signup, same board for everyone on the site personal bests still local — top score card shows your best for the duration, not whoever is #1 globally supabase wired on vercel with service role key server side only ( /api/leaderboard get + post) cors scream from chrome fixed — browser no longer fetches render root directly for proxy health checks what i changed home page layout the thing ig what it does hero leaderboard duration tabs synced with config bar, crown svg for top spots, emoji avatars, your row pinned at the bottom even if you are not top 5 leaderboard save prompt pops after a speed run — pick name + icon (defaulted to hehe 🐵), saves to supabase, remembers name locally for next time top score card personal best for current duration + prompt type only visual cleanup removed hero doodles, tightened title spacing, consolidated duplicate hero css leaderboard rows used to live in zustand localStorage. ripped that out — supabase is source of truth now. name and emoji prefills still persist locally. global leaderboard backend new table leaderboard_entries in supabase (migration in supabase/migrations/001_leaderboard_entries.sql ) rls enabled, no anon policies — all reads/writes through next.js with SUPABASE_SERVICE_ROLE_KEY upsert rule matches old local behavior: same name + duration + prompt type (case insensitive) only updates if wpm goes up light rate limit on post (~30s per ip) — good enough for hobby scale, not fortress grade browser → GET/POST /api/leaderboard (vercel) ↓ service role supabase postgres render backend unchanged — still deepgram only, no db env vars there. cors fix (chrome (ofc brave as well) was mad again) production deepgram mode probes whether the render proxy is alive before connecting. that probe used to be a cross origin fetch at https://monkeyspeak.onrender.com/ from the vercel app. render cold starts and error pages often ship without cors headers even when express has origin: * — so chrome logged the whole blocked by cors policy thing and deepgram mode thought the proxy was dead. fix: new same origin route GET /api/deepgram/proxy-health on vercel. server checks render, browser never touches render over http cors. also slapped explicit options handling on the render backend for anything that still hits it directly. what’s next (maybe) signed run tokens so leaderboard posts are tied to an actual finished test shared rate limit (redis/kv) if spam shows up delete the testmonkey row sitting on prod from smoke testing render keep alive still on the list from v0.1 preview env on vercel for prs ok that was a lot of infra for a monkey with a crown svg but at least the board is real now. lmk in replies if you want the supabase dashboard walkthrough or the security fixes implemented properly."}, {"post_id": 6311, "ts": "2026-06-10T16:53:24Z", "hours": 2.9108, "text": "monkeyspeak final devlog before ship ( hopefully ) tl;dr so brave and edge broke everything ( ye read what broke for more info ) deepgram mode now transcribes live text again (words dissolve, wpm moves, momentum still reacts to your voice) brave and edge no longer hang for 25 seconds then fake a mic error production uses a render websocket proxy + vercel env, same path that worked locally github: nothariharan/monkeyspeak (commit 095b731 and earlier speech routing work on main ) live: monkeyspeak-delta.vercel.app what i changed speech routing (back to something that made sense) mode behavior browser web speech api only. no deepgram hijack on brave/edge mount. deepgram try deepgram first (proxy → bridge fallback on chrome only). if that fails, fall back to web speech with a clear error. the ui now shows errors for the provider that actually failed, not a generic “mic blocked” when stt died for other reasons. deepgram client hardening prefer var name ur wish websocket proxy over the vercel http bridge brave/edge without a reachable proxy: fail fast with a useful message (no 25s timeout) utterance_end_ms locked to 1000 everywhere (deepgram rejects live ws with 400 below that) bridge watchdog clears on BridgeReady , not on first random chunk server bridge waits for upstream deepgram before closing the socket the transcript fix (the big one) client parses deepgram json whether it arrives as a string , blob , or arraybuffer render proxy forwards deepgram replies as utf-8 text frames instead of opaque binary infra backend/ express + ws proxy deployable on render ( render.yaml included) set up env with ur var name at vercel redeployed frontend via vercel cli after env update small polish clearer vad fallback logs (worker load fail vs no voice detected vs timeout) config bar hint on brave/edge when browser mode is selected momentum sprites + gsap monkey states (from earlier in the sprint) what broke (and why it looked cursed) brave and edge block or mishandle the vercel http audio bridge (duplex fetch upload), so deepgram connections hung ~25s and never returned transcripts. those browsers also cannot open an authenticated websocket straight to api.deepgram.com , so they need the render ws proxy ( wss://…/api/deepgram/proxy ) instead of the chrome-friendly paths. even after the proxy worked, deepgram sent json in binary ws frames and the client ignored anything that was not a string, so words never updated until we parsed blob/arraybuffer payloads. what’s next (maybe) vendor ort wasm for vad so the worker stops complaining gsap scale split for clean console render keep-alive or paid instance if cold starts hurt demos preview env on vercel for pr deployments (production is wired today) sorry if i yapped a lot and the fixes where actually slighly more techy stuff so i didnt wanna yap abt that as wel so yeah if u want to know lmk in replies :)"}, {"post_id": 4727, "ts": "2026-06-08T05:13:13Z", "hours": 0.6281, "text": "reworked the ui and got monkeyspeak ready for v0 ship launch :)) it’s basically monkeytype but for your voice — read a prompt out loud, get scored on speed + clarity. features: speed mode: timed speaking tests (15s / 30s / 60s / 120s) with live wpm + word accuracy clarity mode: paste your transcript, get a word-by-word diff + letter grade click the monkey mascot to start (no separate mic button anymore lol) animated monkey companion that reacts to your speaking energy mid-test words dissolve on screen as you say them correctly personal bests saved locally browser speech api works out of the box, optional deepgram for better stt themes, accent colors, custom fonts keyboard shortcuts (enter to start, tab to reset, escape to stop) built with next.js, typescript, gsap, zustand. repo: github.com/nothariharan/monkeyspeak"}, {"post_id": 4678, "ts": "2026-06-08T02:28:55Z", "hours": 0.2814, "text": "made the ui more clean still settling the latency here and there current new approach i am building around is using the deepgram api key for initial purpose later trying to replicate what they do open to questions or recommendations for the whole stt etc."}, {"post_id": 4242, "ts": "2026-06-07T14:13:09Z", "hours": 0.8106, "text": "cooking up 🚀🔥 soon making it public just lots of latency issue in speaking to text conversion who knew it would be a pain but yeah let me know if u guys think of an alternative for it or anything at all thanks for reading :)"}, {"post_id": 4007, "ts": "2026-06-07T04:46:44Z", "hours": 2.0164, "text": "going with a much better ui soon launching :) 🚀 for yall to try it"}, {"post_id": 3451, "ts": "2026-06-06T12:11:33Z", "hours": 0.9194, "text": "built the first iteration of the website ! got lots of customizing options now i am working more towards reducing the latency between what u speak and what is being transcribed give me your opinions and recommendations :)"}]...
|
Title: MonkeySpeak by @hariharann | Stardance
Dev Title: MonkeySpeak by @hariharann | Stardance
Devlogs:
built the first iteration of the website ! got lots of customizing options now i am working more towards reducing the latency between what u speak and what is being transcribed give me your opinions and recommendations :)
going with a much better ui soon launching :) 🚀 for yall to try it
cooking up 🚀🔥 soon making it public just lots of latency issue in speaking to text conversion who knew it would be a pain but yeah let me know if u guys think of an alternative for it or anything at all thanks for reading :)
made the ui more clean still settling the latency here and there current new approach i am building around is using the deepgram api key for initial purpose later trying to replicate what they do open to questions or recommendations for the whole stt etc.
reworked the ui and got monkeyspeak ready for v0 ship launch :)) it’s basically monkeytype but for your voice — read a prompt out loud, get scored on speed + clarity. features: speed mode: timed speaking tests (15s / 30s / 60s / 120s) with live wpm + word accuracy clarity mode: paste your transcript, get a word-by-word diff + letter grade click the monkey mascot to start (no separate mic button anymore lol) animated monkey companion that reacts to your speaking energy mid-test words dissolve on screen as you say them correctly personal bests saved locally browser speech api works out of the box, optional deepgram for better stt themes, accent colors, custom fonts keyboard shortcuts (enter to start, tab to reset, escape to stop) built with next.js, typescript, gsap, zustand. repo: github.com/nothariharan/monkeyspeak
monkeyspeak final devlog before ship ( hopefully ) tl;dr so brave and edge broke everything ( ye read what broke for more info ) deepgram mode now transcribes live text again (words dissolve, wpm moves, momentum still reacts to your voice) brave and edge no longer hang for 25 seconds then fake a mic error production uses a render websocket proxy + vercel env, same path that worked locally github: nothariharan/monkeyspeak (commit 095b731 and earlier speech routing work on main ) live: monkeyspeak-delta.vercel.app what i changed speech routing (back to something that made sense) mode behavior browser web speech api only. no deepgram hijack on brave/edge mount. deepgram try deepgram first (proxy → bridge fallback on chrome only). if that fails, fall back to web speech with a clear error. the ui now shows errors for the provider that actually failed, not a generic “mic blocked” when stt died for other reasons. deepgram client hardening prefer var name ur wish websocket proxy over the vercel http bridge brave/edge without a reachable proxy: fail fast with a useful message (no 25s timeout) utterance_end_ms locked to 1000 everywhere (deepgram rejects live ws with 400 below that) bridge watchdog clears on BridgeReady , not on first random chunk server bridge waits for upstream deepgram before closing the socket the transcript fix (the big one) client parses deepgram json whether it arrives as a string , blob , or arraybuffer render proxy forwards deepgram replies as utf-8 text frames instead of opaque binary infra backend/ express + ws proxy deployable on render ( render.yaml included) set up env with ur var name at vercel redeployed frontend via vercel cli after env update small polish clearer vad fallback logs (worker load fail vs no voice detected vs timeout) config bar hint on brave/edge when browser mode is selected momentum sprites + gsap monkey states (from earlier in the sprint) what broke (and why it looked cursed) brave and edge block or mishandle the vercel http audio bridge (duplex fetch upload), so deepgram connections hung ~25s and never returned transcripts. those browsers also cannot open an authenticated websocket straight to api.deepgram.com , so they need the render ws proxy ( wss://…/api/deepgram/proxy ) instead of the chrome-friendly paths. even after the proxy worked, deepgram sent json in binary ws frames and the client ignored anything that was not a string, so words never updated until we parsed blob/arraybuffer payloads. what’s next (maybe) vendor ort wasm for vad so the worker stops complaining gsap scale split for clean console render keep-alive or paid instance if cold starts hurt demos preview env on vercel for pr deployments (production is wired today) sorry if i yapped a lot and the fixes where actually slighly more techy stuff so i didnt wanna yap abt that as wel so yeah if u want to know lmk in replies :)
monkeyspeak devlog more fixes (leaderboard + home + cors bug) - ship soon trust .. tl;dr home page is a 3 column layout now — leaderboard on the left, hero in the middle, top score on the right global leaderboard via supabase — nickname + emoji after a run, no signup, same board for everyone on the site personal bests still local — top score card shows your best for the duration, not whoever is #1 globally supabase wired on vercel with service role key server side only ( /api/leaderboard get + post) cors scream from chrome fixed — browser no longer fetches render root directly for proxy health checks what i changed home page layout the thing ig what it does hero leaderboard duration tabs synced with config bar, crown svg for top spots, emoji avatars, your row pinned at the bottom even if you are not top 5 leaderboard save prompt pops after a speed run — pick name + icon (defaulted to hehe 🐵), saves to supabase, remembers name locally for next time top score card personal best for current duration + prompt type only visual cleanup removed hero doodles, tightened title spacing, consolidated duplicate hero css leaderboard rows used to live in zustand localStorage. ripped that out — supabase is source of truth now. name and emoji prefills still persist locally. global leaderboard backend new table leaderboard_entries in supabase (migration in supabase/migrations/001_leaderboard_entries.sql ) rls enabled, no anon policies — all reads/writes through next.js with SUPABASE_SERVICE_ROLE_KEY upsert rule matches old local behavior: same name + duration + prompt type (case insensitive) only updates if wpm goes up light rate limit on post (~30s per ip) — good enough for hobby scale, not fortress grade browser → GET/POST /api/leaderboard (vercel) ↓ service role supabase postgres render backend unchanged — still deepgram only, no db env vars there. cors fix (chrome (ofc brave as well) was mad again) production deepgram mode probes whether the render proxy is alive before connecting. that probe used to be a cross origin fetch at https://monkeyspeak.onrender.com/ from the vercel app. render cold starts and error pages often ship without cors headers even when express has origin: * — so chrome logged the whole blocked by cors policy thing and deepgram mode thought the proxy was dead. fix: new same origin route GET /api/deepgram/proxy-health on vercel. server checks render, browser never touches render over http cors. also slapped explicit options handling on the render backend for anything that still hits it directly. what’s next (maybe) signed run tokens so leaderboard posts are tied to an actual finished test shared rate limit (redis/kv) if spam shows up delete the testmonkey row sitting on prod from smoke testing render keep alive still on the list from v0.1 preview env on vercel for prs ok that was a lot of infra for a monkey with a crown svg but at least the board is real now. lmk in replies if you want the supabase dashboard walkthrough or the security fixes implemented properly.
UPDATEE:: — stats, brave stt actually works, hydration fix tl;dr deepgram stt works on brave now (and edge) — words dissolve, wpm moves, no more fake “google speech blocked” errors root cause: brave kills the vercel http audio bridge + we fell back to browser speech (which shields also blocks) fix: brave/edge → render websocket proxy ( wss://monkeyspeak.onrender.com/... ); chrome/firefox still use vercel bridge fixed utterance_end_ms=400 deepgram 400 spam (minimum is 1000 on live listen) fixed bridge sending keepalive json into the pcm stream (corrupted audio, empty transcripts) stats page + profile hub — streaks, achievements, session history, same minimal desk ui as home live: https://monkeyspeak-delta.vercel.app repo: https://github.com/nothariharan/monkeyspeak (commit might differ by the time u read — i keep pushing) CHANGES:: deepgram / stt (the painful part) routing by browser browser path brave / edge websocket → render proxy → deepgram chrome / firefox (prod) same-origin POST /api/deepgram/live bridge on vercel localhost ws://localhost:8080 when backend is up, else bridge 🐜🪲🐞 that made it look dead utterance_end_ms=400 — deepgram returns http 400 on live ws below 1000ms. was baked into client urls. clamped to 1000 everywhere (client, bridge, render backend, server.js) keepalive in pcm body — http bridge was writing {"type":"KeepAlive"} into the upload stream every 3s. deepgram got garbage bytes, transcripts stayed empty, no obvious error in ui brave + duplex fetch — bridge connects, mic on, waveform moving, but ndjson response never streams back. zero words dissolved bad fallback — deepgram fail → auto webspeech → brave shields block google → ui says google is blocked even though user picked deepgram. now we don’t fallback on brave/edge when deepgram is preferred other STT polish bridge waits for BridgeReady before marking session ok server-side keepalive via deepgram sdk on the bridge route (not in pcm stream) removed verbose [STT:deepgram] console spam from prod — debug only with NEXT_PUBLIC_DEBUG_STT=true gsap scale not eligible for reset warning fixed on momentum meter stats + profile new /stats dashboard — totals, streak, recent runs, wpm trend charts profile hub drawer — nickname, activity heatmap, achievement badges shared stats-* / desk css so stats doesn’t look like a different app achievements + streak logic with unit tests ( lib/achievements.ts , lib/stats/streak.ts ) UI / polish home + results + settings aligned to same minimal desk style daily challenge card, error/not-found pages match the rest monkey favicon + readme/docs polish Infra GET /api/deepgram/proxy-health — same-origin render health check (browser never hits render directly, no cors scream) render monkeyspeak-dg-proxy redeployed via render cli what actually happened on brave user picks deepgram → app tries vercel http bridge brave never delivers streaming ndjson reliably fallback kicks webspeech → shields block google ui shows “brave shields may be blocking google’s speech service” — confusing af because user didn’t pick browser mode fix was routing + stop lying via fallback. not more deepgram dashboard staring. what’s next (maybe) GHOST RACE — new mode where u speak against ur pb (most wanted) signed run tokens so leaderboard posts tie to a finished test shared rate limit (redis/kv) if leaderboard spam shows up vendor ort wasm properly so vad worker stops whining in console ok that was a lot of browser-specific nonsense for a monkey that just wants you to read words out loud 🐒🐒🍌
da monkey upgradesss -> leaderboard + results shipped two big surface reworks this week. leaderboard got its own hub. rankings, filters, and personal stats live on one page now & ofc no more bouncing between /stats and a tiny home board. cleaner rows, mode/duration toggles, and your own numbers sitting under the global board. post-test results got rebuilt from scratch. one shared results view: wpm, accuracy, consistency, streak, and the session graph, instead of the old packed panel. same screen whether you just finished a run or are peeking at what a good score looks like. ( graph mite be reworked on again but eh ) mic still moves when you’re talking. words still have to earn their place. 👻 something ghosty is next. that’s all you’re getting its really cool trust 👀👀
CATCHUPPPP DEVLOG — i forgot to post so now u get EVERYTHING 🙊🗣️🗣️ ok so real talk i kinda… forgot to drop a proper stardance log for a while. hours kept stacking, i kept shipping, then the banner said “u hav 10h without a log” and im like oh. whole catchup dump. big one. sorry if i yap [ THE REASON FOR THIS WAS WAKATIME BTW it doesnt even properly update 🥀 sowwy i also lost like 1 more hr of time tho welp ] last time i teased something ghosty then went quiet. that ghosty thing shipped. clarity got ripped open and rebuilt. da engine board actually filters now. results dont look half done anymore. so thats where most of the hours went into. live: https://monkeyspeak-delta.vercel.app repo: https://github.com/nothariharan/monkeyspeak QUICK RECAP already shipped before this gap: spoken monkeytype core · deepgram on brave/edge · supabase speed board · /leaderboard hub + stats/profile · results rebuild. that thread is on the project page. this post is mainly everything after dat . THE ‘GHOSTYYYY’ ( finally ) last log said “something ghosty is next” then i disappeared lmao. ghost trace is live. u race a visual ghost that replays your own speed pb. not some random #1. just u vs past u. needs atleast one speed pb with a real timeline first. built: ghost mode next to speed/clarity · desk ui so it doesnt feel like another product · dual lanes that feel like a chase · local ghost race record · lean assets ( check the branches and prs for exact stuff ) go race yourself. weirdly motivational and slightly insulting when past-u is faster 👀👀 CLARITY GOT A WHOLE PERSONALITY NOW used to be the quiet sibling of speed. same desk family, placeholder vibes. scrapbook treatment later — now its actually fun to sit on. idle: 3-col scrapbook (engine board · center · side stack) · inspector monkey · legal pad prompt · privacy note that ur mic stays with the tool prompts that CYCLE: shuffle was cursed — sentences always “before you leave…”, twisters one fixed line. now ~30 curated pads across sentences/technical/tongue-twisters, scenes (office/clinic/travel/etc), signal chips, no instant repeat, custom still works. whole point is “can the tool hear the hard bits” engine board: config bar board prompt filters the left board. badge shows active filter. results: not just % + grade anymore — engine chip, correct/wrong/missed/extra, punctuation %, delta vs prior best, normal display font HOUSEKEEPING ( fr) pruned ~31mb orphan assets · slimmed sprite utils · typecheck · SESSION_SECRET same on vercel AND render or unset on both (one side = grants break quietly) · readme/comments less corporate. deployed. hard-refresh if cached. before → after last time clarity = paste + grade + sticky prompt + soft lock. now scrapbook + shuffle pads + board filters + current/top/tool + cancel + results that explain stuff. last time ghost = a wink. now u race past-u on the desk. so thats there. STILL COOKING 🍽️ harder clarity tiers · board rate limit if it gets silly · more ghost polish · daily clarity seed · kill leftover placeholder energy ok that was a lot of catchup for a monkey that just wants u to read words out loud. if ghost or clarity feels off lmk — especially brave ppl, i see u 🐒🐒🍌
Ships:
monkeyspeak v0 is live 🙊 been building this for a while — it’s the spoken equivalent of monkeytype. you get a prompt, hit the mic, read it out loud, and the app tracks how fast and how accurately you speak. what’s in v0: speed mode pick 15s, 30s, 60s, or 120s live net wpm (filler words like “um” and “uh” get stripped) sentences, numbers, or paste your own custom text words dissolve on screen as you nail them monkey mascot animates based on your speaking momentum personal bests per duration + prompt type clarity mode type or paste what you said word-level diff against the original prompt grades from s down to “needs work” practice mode that rebuilds a prompt from words you missed ui refresh new landing hero: “how fast⚡can you speak 🙊” the monkey mascot IS the start button now — click it to begin speech-themed doodles, clean flat design, no gradient bloat sprite animations via gsap under the hood next.js 14 + typescript + zustand web speech api by default (no api key needed) optional deepgram integration with server-side proxy (key never hits the browser) silero vad for voice activity detection try it: clone the repo, npm install, npm run dev, allow mic access, go. github.com/nothariharan/monkeyspeak
monkeyspeak update is live 🙊 spoken monkeytype —> read prompts out loud, get scored on speed and clarity. v0 had the core loop. this ship adds the stuff that makes it feel like a real app. what’s new: leaderboard global board via supabase — nickname + emoji after a run, no signup home page 3-column layout with leaderboard, hero, and your personal best card your top score card still tracks local pb for the current duration, not whoever is #1 globally stats + profile /stats dashboard — streak, totals, recent runs, wpm charts, achievements profile hub drawer — activity heatmap, badges, lifetime stats everything uses the same minimal desk ui as home speech fixes try it: monkeyspeak-delta.vercel.app github.com/nothariharan/monkeyspeak...
|
1792828053.4262545
|
1792914453.4262545
|
|
9443
|
Better Music by @muntean_andrew | Stardance
|
muntean_andrew
|
2
|
33.0
|
323
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-27T09:14:00Z", "hours": 20.0, "multiplier": 8.54, "payout": 202, "blessing": "neutral", "text": "I built Better Music, a lightweight music player designed for seamless audio playback and intuitive library management. It features an instant search-as-you-type engine, interactive queue management, customizable playlist/album details, detailed listening activity tracking, can read synced/unsynced lyrics tags from the music files and show them like Spotify, a “Permanent Queue” (PQ) feature for when you want listen to a list of particular songs for just that one moment and don’t want to create a whole new playlist for it and you can customize it’s color palette and even the base border radius to your liking in the settings. To bring this to life, I combined the desktop application capabilities of Electron with a robust local relational database powered by SQLite 3, all wrapped in a sleek, responsive frontend built using HTML5, CSS, SCSS and JavaScript. This is just an update and the majority of the time spent on the project was used to make improvements in the backend management of the song objects and to make the UI better reflect and update according to the data in the backend. But also I’ve added lyrics support and if your music files have lyrics tags embedded in them the app will take full advantage of them by enabling you to see each verse when it is singed and also skip to that one part you like the most just by clicking on your favorite line in the track. Testing the app is incredibly simple—there is no need to clone deep source code dependencies or set up a complex development build environment. Where to get it: Head straight over to the Releases section of this repository. How to run it: Download the compiled .zip file for your platform, extract its contents into any folder on your computer, and double-click the main application executable (e.g., Better-Music.exe). Note on Updates: If you are testing store-packaged builds or encountered deployment errors (like MSIX package revision conflicts in the Partner Center), utilizing the raw ZIP release is the fastest, cleanest way to experience the app right now.", "repo": "https://github.com/AliendsOG/Better-Music", "demo": "https://github.com/AliendsOG/Better-Music/releases/tag/better-music"}, {"ship_num": 2, "ts": "2026-06-15T15:17:37Z", "hours": 13.0, "multiplier": 9.67, "payout": 121, "blessing": "neutral", "text": "I built Better Music, a lightweight music player designed for seamless audio playback and intuitive library management. It features an instant search-as-you-type engine, interactive queue management, customizable playlist/album details, detailed listening activity tracking, a “Permanent Queue” (PQ) feature for when you want listen to a list of particular songs for just that one moment and don’t want to create a whole new playlist for it and you can customize it’s color palette to your liking in the settings. To bring this to life, I combined the desktop application capabilities of Electron with a robust local relational database powered by SQLite 3, all wrapped in a sleek, responsive frontend built using HTML5, CSS, SCSS and JavaScript. The challenging part was the steep learning curve as I hadn’t done anything on this scale before. I had to learn to connect the 2 Electron processes together seamlessly. Furthermore I had to dive into the world of databases with SQLite 3, which was uncharted territory for me. I had to use AI to help me learn these things and also to brainstorm ideas about hoe to optimize the app. For instance, when the idea of the search-as-you-type feature came up to me I envisioned a kind of tree structure with letters and that for every song, album, playlist name the app would create the branches in the tree so it would be a very fast and efficient search algorithm, and when I talked to the AI about it I found out that this kind of structure is called a trie. I am really proud that I’ve managed to build a clean, responsive and fast music player that tracks the user’s listening activity and stores it on device. Also it was very exciting when I tested the search feature and it worked perfectly. I’m also proud of the engineering journey itself. I utilized Gemini as an active learning collaborator to help me unpack the architectural patterns of Electron and master data persistence with SQLite 3. Turning that complex technical guidance into a functional, polished desktop product was incredibly rewarding. Testing the app is incredibly simple—there is no need to clone deep source code dependencies or set up a complex development build environment. Where to get it: Head straight over to the Releases section of this repository. How to run it: Download the compiled .zip file for your platform, extract its contents into any folder on your computer, and double-click the main application executable (e.g., Better-Music.exe). Note on Updates: If you are testing store-packaged builds or encountered deployment errors (like MSIX package revision conflicts in the Partner Center), utilizing the raw ZIP release is the fastest, cleanest way to experience the app right now.", "repo": "https://github.com/AliendsOG/Better-Music", "demo": "https://github.com/AliendsOG/Better-Music/releases/tag/better-music"}]...
|
[{"post_id": 74382, "ts": "202 [{"post_id": 74382, "ts": "2026-09-27T09:04:01Z", "hours": 1.0467, "text": "This is the last devlog before shipping the project update. This has been an exciting journey and I am very satisfied with the result! I do wish there would be a bit more time left for the event to continue so I could ship even more things but all good things must come to an end, and this one is a happy ending. I’ve made the necessary last minute touches to make sure that everything works as it should."}, {"post_id": 74114, "ts": "2026-09-26T18:26:03Z", "hours": 1.6697, "text": "Added new ways to customize the player to the user’s liking and fixed that prevented the app from reading the user_version of the database which in return made the app “update” the DB everytime it started."}, {"post_id": 73281, "ts": "2026-09-24T18:58:58Z", "hours": 0.4853, "text": "YEEEEEESS, FINALLLYYYYYY, we have synced lyrics in the app. I know it’s not the most glamorous UI at the moment, but it is still something, and the other music players don’t even do this, like at most they show the lyrics with the timestamps and that’s it, no scaling of the verse, nothing. In future updates certainly I’ll make the UI more polished because it need a lot of it. Still I am happy that I’ve made it this far and after a bit of clean up and maybe some optimizations I’ll ship the project."}, {"post_id": 73261, "ts": "2026-09-24T18:10:26Z", "hours": 1.5067, "text": "I’ve finally found the culprit that prevented me from getting the synced lyrics, now the app can read the synced lyrics from music filed. YEEEEEEE Now the “only” thing is to make the UI for them, which I hope would be easy and fast. 😅"}, {"post_id": 73191, "ts": "2026-09-24T15:40:21Z", "hours": 2.4517, "text": "Trying to add lyrics to the app. But it is a bit of a mess cause in the Samsung Music and Apple Music apps these files contain time stamps for each verse and so I was thinking to read those time stamps and to highlight the verse that is played at that time, but my app doesn’t read those things and I don’t know why. An explanation might be that those apps ping free open source databases of lyrics based on the song details, but I am not really sure."}, {"post_id": 69252, "ts": "2026-09-16T17:55:55Z", "hours": 4.7486, "text": "Another day, another restructuring I guess. 😅 I’ve decided to give each album an id instead of relying on it’s name as the identifier as I did previously. Also I’ve changed the Play function to work with song ids and album ids instead of names. This is because if the name of the song or the album had any of these 2 characters: ’ or “ it would mess up with the HTML structure and the song would not play if the user clicked on it. Not gonna lie, I think that my code now is a little spaghetti and for sure someone with more experience and knowledge on how to structure a music player would have done a much better job than me at this, but still. The main caveat that I think could appear in the future is that the Play function can’t take numbered ids for playlists and I have to rely in the playlist’s name because the function would have no way to distinguish between them at the moment and I don’t want to make another spaghetti to fix this. 😅 In other news, I have successfully changed the backend to update the DB version for the user of the older version of the app and to add the new “lyrics” column and also the app can read the embedded lyrics from the music files. Now the “only” thing remaining is to add the lyrics to the UI and to parse the strings and make the verses synchronize with the song and this feature would be fully implemented."}, {"post_id": 57422, "ts": "2026-08-29T15:54:13Z", "hours": 2.9864, "text": "After successfully changing the song objects management under the hood from the previous devlog I now added an indicator for which song is currently playing. For now I’ve just set the background of the song to be the primary color selected by the user. Also I’ve changed the border radius for everything to be based on one variable so that the user could change it in the settings (but didn’t yet implement the UI for that) cause everyone has their own preference for these things. The first screenshot is with the border radius set a bit higher (30px) than my default one (23px), and the second one is with the border radius set to 0. Additionally I am changing the SQLite db in the backend to support lyrics because I want to add them to the app."}, {"post_id": 56489, "ts": "2026-08-28T08:43:54Z", "hours": 4.7514, "text": "I am currently working on optimizing the code so that changes like adding songs to a playlist or liking a song update instantly across all pages because this was a flaw of my old architecture of the app cause I didn’t just have 1 list of song objects that every album and artist referenced to but instead every album and artist had their own song objects and the list of favorite songs was also composed of song object. So it was a mess of duplicate song objects. Now I am changing things so that there is only one list of song object and albums have just a list of song ids in them so they reference the song object list, this way each change is global. This would hopefully fix the current synchronization issues that sometimes occur in the current version. This change would also allow me to add an indicator that a song is playing when the user looks at an album from which a song plays currently. Additionally I want to add a listening history page where the user can see their listening activity on the app and also maybe add some rewards depending on how much time they spent listening to an artist or album to gamify the experience a little."}, {"post_id": 8658, "ts": "2026-06-14T11:47:22Z", "hours": 0.4289, "text": "Solving some App Manifest problems"}, {"post_id": 8040, "ts": "2026-06-13T12:20:46Z", "hours": 1.7347, "text": "Updating the package on the Microsoft Store"}, {"post_id": 7956, "ts": "2026-06-13T08:50:15Z", "hours": 1.2564, "text": "Added some customization options and a settings menu"}, {"post_id": 7328, "ts": "2026-06-12T06:33:15Z", "hours": 1.7297, "text": "Updating the interface a little"}, {"post_id": 4874, "ts": "2026-06-08T13:08:06Z", "hours": 3.1572, "text": "Implemented search functionality"}, {"post_id": 3541, "ts": "2026-06-06T15:01:03Z", "hours": 2.7919, "text": "Adding clear queue button and a Permanent Queue or Temporary Playlist feature that saves the songs that you add to the queue even after you listen to them so you can set it to repeat all and still have the songs that you wanted"}, {"post_id": 3394, "ts": "2026-06-06T09:28:56Z", "hours": 1.4672, "text": "I implemented the function of changing the name and cover of a playlist"}]...
|
Title: Better Music by @muntean_andrew | Stardance Title: Better Music by @muntean_andrew | Stardance
Devlogs:
I implemented the function of changing the name and cover of a playlist
Adding clear queue button and a Permanent Queue or Temporary Playlist feature that saves the songs that you add to the queue even after you listen to them so you can set it to repeat all and still have the songs that you wanted
Implemented search functionality
Updating the interface a little
Added some customization options and a settings menu
Updating the package on the Microsoft Store
Solving some App Manifest problems
I am currently working on optimizing the code so that changes like adding songs to a playlist or liking a song update instantly across all pages because this was a flaw of my old architecture of the app cause I didn’t just have 1 list of song objects that every album and artist referenced to but instead every album and artist had their own song objects and the list of favorite songs was also composed of song object. So it was a mess of duplicate song objects. Now I am changing things so that there is only one list of song object and albums have just a list of song ids in them so they reference the song object list, this way each change is global. This would hopefully fix the current synchronization issues that sometimes occur in the current version. This change would also allow me to add an indicator that a song is playing when the user looks at an album from which a song plays currently. Additionally I want to add a listening history page where the user can see their listening activity on the app and also maybe add some rewards depending on how much time they spent listening to an artist or album to gamify the experience a little.
After successfully changing the song objects management under the hood from the previous devlog I now added an indicator for which song is currently playing. For now I’ve just set the background of the song to be the primary color selected by the user. Also I’ve changed the border radius for everything to be based on one variable so that the user could change it in the settings (but didn’t yet implement the UI for that) cause everyone has their own preference for these things. The first screenshot is with the border radius set a bit higher (30px) than my default one (23px), and the second one is with the border radius set to 0. Additionally I am changing the SQLite db in the backend to support lyrics because I want to add them to the app.
Another day, another restructuring I guess. 😅 I’ve decided to give each album an id instead of relying on it’s name as the identifier as I did previously. Also I’ve changed the Play function to work with song ids and album ids instead of names. This is because if the name of the song or the album had any of these 2 characters: ’ or “ it would mess up with the HTML structure and the song would not play if the user clicked on it. Not gonna lie, I think that my code now is a little spaghetti and for sure someone with more experience and knowledge on how to structure a music player would have done a much better job than me at this, but still. The main caveat that I think could appear in the future is that the Play function can’t take numbered ids for playlists and I have to rely in the playlist’s name because the function would have no way to distinguish between them at the moment and I don’t want to make another spaghetti to fix this. 😅 In other news, I have successfully changed the backend to update the DB version for the user of the older version of the app and to add the new “lyrics” column and also the app can read the embedded lyrics from the music files. Now the “only” thing remaining is to add the lyrics to the UI and to parse the strings and make the verses synchronize with the song and this feature would be fully implemented.
Trying to add lyrics to the app. But it is a bit of a mess cause in the Samsung Music and Apple Music apps these files contain time stamps for each verse and so I was thinking to read those time stamps and to highlight the verse that is played at that time, but my app doesn’t read those things and I don’t know why. An explanation might be that those apps ping free open source databases of lyrics based on the song details, but I am not really sure.
I’ve finally found the culprit that prevented me from getting the synced lyrics, now the app can read the synced lyrics from music filed. YEEEEEEE Now the “only” thing is to make the UI for them, which I hope would be easy and fast. 😅
YEEEEEESS, FINALLLYYYYYY, we have synced lyrics in the app. I know it’s not the most glamorous UI at the moment, but it is still something, and the other music players don’t even do this, like at most they show the lyrics with the timestamps and that’s it, no scaling of the verse, nothing. In future updates certainly I’ll make the UI more polished because it need a lot of it. Still I am happy that I’ve made it this far and after a bit of clean up and maybe some optimizations I’ll ship the project.
Added new ways to customize the player to the user’s liking and fixed that prevented the app from reading the user_version of the database which in return made the app “update” the DB everytime it started.
This is the last devlog before shipping the project update. This has been an exciting journey and I am very satisfied with the result! I do wish there would be a bit more time left for the event to continue so I could ship even more things but all good things must come to an end, and this one is a happy ending. I’ve made the necessary last minute touches to make sure that everything works as it should.
Ships:
I built Better Music, a lightweight music player designed for seamless audio playback and intuitive library management. It features an instant search-as-you-type engine, interactive queue management, customizable playlist/album details, detailed listening activity tracking, a “Permanent Queue” (PQ) feature for when you want listen to a list of particular songs for just that one moment and don’t want to create a whole new playlist for it and you can customize it’s color palette to your liking in the settings. To bring this to life, I combined the desktop application capabilities of Electron with a robust local relational database powered by SQLite 3, all wrapped in a sleek, responsive frontend built using HTML5, CSS, SCSS and JavaScript. The challenging part was the steep learning curve as I hadn’t done anything on this scale before. I had to learn to connect the 2 Electron processes together seamlessly. Furthermore I had to dive into the world of databases with SQLite 3, which was uncharted territory for me. I had to use AI to help me learn these things and also to brainstorm ideas about hoe to optimize the app. For instance, when the idea of the search-as-you-type feature came up to me I envisioned a kind of tree structure with letters and that for every song, album, playlist name the app would create the branches in the tree so it would be a very fast and efficient search algorithm, and when I talked to the AI about it I found out that this kind of structure is called a trie. I am really proud that I’ve managed to build a clean, responsive and fast music player that tracks the user’s listening activity and stores it on device. Also it was very exciting when I tested the search feature and it worked perfectly. I’m also proud of the engineering journey itself. I utilized Gemini as an active learning collaborator to help me unpack the architectural patterns of Electron and master data persistence with SQLite 3. Turning that complex technical guidance into a functional, polished desktop product was incredibly rewarding. Testing the app is incredibly simple—there is no need to clone deep source code dependencies or set up a complex development build environment. Where to get it: Head straight over to the Releases section of this repository. How to run it: Download the compiled .zip file for your platform, extract its contents into any folder on your computer, and double-click the main application executable (e.g., Better-Music.exe). Note on Updates: If you are testing store-packaged builds or encountered deployment errors (like MSIX package revision conflicts in the Partner Center), utilizing the raw ZIP release is the fastest, cleanest way to experience the app right now.
I built Better Music, a lightweight music player designed for seamless audio playback and intuitive library management. It features an instant search-as-you-type engine, interactive queue management, customizable playlist/album details, detailed listening activity tracking, can read synced/unsynced lyrics tags from the music files and show them like Spotify, a “Permanent Queue” (PQ) feature for when you want listen to a list of particular songs for just that one moment and don’t want to create a whole new playlist for it and you can customize it’s color palette and even the base border radius to your liking in the settings. To bring this to life, I combined the desktop application capabilities of Electron with a robust local relational database powered by SQLite 3, all wrapped in a sleek, responsive frontend built using HTML5, CSS, SCSS and JavaScript. This is just an update and the majority of the time spent on the project was used to make improvements in the backend management of the song objects and to make the UI better reflect and update according to the data in the backend. But also I’ve added lyrics support and if your music files have lyrics tags embedded in them the app will take full advantage of them by enabling you to see each verse when it is singed and also skip to that one part you like the most just by clicking on your favorite line in the track. Testing the app is incredibly simple—there is no need to clone deep source code dependencies or set up a complex development build environment. Where to get it: Head straight over to the Releases section of this repository. How to run it: Download the compiled .zip file for your platform, extract its contents into any folder on your computer, and double-click the main application executable (e.g., Better-Music.exe). Note on Updates: If you are testing store-packaged builds or encountered deployment errors (like MSIX package revision conflicts in the Partner Center), utilizing the raw ZIP release is the fastest, cleanest way to experience the app right now....
|
1792817622.5807502
|
1792904022.5807502
|
|
9460
|
Ghostly Party by @foxors | Stardance
|
foxors
|
2
|
14.0
|
187
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-26T12:13:35Z", "hours": 6.0, "multiplier": 13.49, "payout": 80, "blessing": "neutral", "text": "A game written in html, css and js where you have to find a specific ghost in a picture with the fewest clicks and time as possible. The hardest thing was and still is for me the challenge to support a wide variate of browsers. Some don’t have an API point some do but only limited for privacy stuff etc. and some i can’t test because i don’t own a Mac nor a iPhone. Hope you will enjoy my small little game.", "repo": "https://codeberg.org/Foxors/Ghostly-party", "demo": "https://ghost.foxors.de"}, {"ship_num": 2, "ts": "2026-07-02T18:21:34Z", "hours": 8.0, "multiplier": 13.04, "payout": 107, "blessing": "neutral", "text": "I made a smoll random generated search picture game with GHOOOOSTs. Not creepy ghosts, just funny ghosts. I made it in pure HTML, CSS and JS fashion. Each time you play you will need to find a new specific ghost amongst others in a living room. When you find them you get shown how long you took and how many times you miss-clicked. The hardest part was to write the code to place the ghosts randomly without stacking on one another, while still guaranteeing that at least a few ghosts are always there. To not make it too hard or too easy. That you have to memorize the ghost you search, is by the way not a bug or a lack of testing. I thought it would be more fun if you had to memorize the ghost you search for while playing.", "repo": "https://codeberg.org/Foxors/Ghostly-party", "demo": "https://ghost.foxors.de"}]...
|
[{"post_id": 73952, "ts": "202 [{"post_id": 73952, "ts": "2026-09-26T12:05:09Z", "hours": 1.7142, "text": "Ready for ship 2 I fixed some minor issues and added a scoreboard at the end of each run. I also tried to make it more performant with small success. In this ship i have most of the feedback, from first ship, implemented and hope it is a better game now. I will probably stop with this ship for the time because i got my Minestom mini game server project right now which i need to finish."}, {"post_id": 28202, "ts": "2026-07-14T10:41:48Z", "hours": 4.2353, "text": "I am not finished yet First of all thanks to the feedback from some. It gave me a bit more motivation to work more on this project. Somebody bothered the loading timer after each round and guess what i also didn’t like that. So I fixed it. The cause was that each time a ghost was placed onto the canvas a new HTML image tag would have to be created, source set to the ghost image URL and than the script had to wait for the browser to load the image and only afterward it could place it onto the canvas. I fixed that by loading each image at the start of website loading. This way I already have all images loaded and only need to print them to the canvas no waiting needed. There was also this major randomness error. If you remember from an older post I did some random generator thing which makes it impossible to spawn too few ghosts while still allowing random positions on a mask without too much hugging each other. What i did not notice back then because of the mask, that if the mask isn’t applied the ghosts form a straight line from top left to bottom right. And guess what the error was: if (delta(g.x, x) < ghostSize / 2 || delta(g.y, y) < ghostSize / 2) vs if (delta(g.x, x) < ghostSize / 2 && delta(g.y, y) < ghostSize / 2) . I used and OR instead of and AND logic operator. It took me 30 mins to figure out :( Another person mentioned they had a optimization warning in their console. I did not had such a warning because I use Firefox personally. I also test on chromium but i don’t look into logs there, how ever now i did. The Dev tools of chromium really improved a lot, but i am still going to use Firefox as main browser. Well, I fixed all warnings chromium gave me. The context of a HTML canvas has an optimization flag in case you request data from it frequent what i do. I just had do set this option to true. Also the drawing part of the ghosts is now not blocking the main thread entirely with timeout calling the same function which acts like a for loop to distribute work over time. Otherwise the website would freeze for a second because printing images to a canvas is very sloww for some reason I don’t want to get into now. For the loading part i threw a bit CSS and HTML together making up a progress bar and added some random phrases so users don’t get bored. Furthermore instead of creating new HTML tags each scene change the code now already has them in the HTML code loaded but changes their visibility. In theory this should improve performance because the browser doesn’t have to create new elements each time."}, {"post_id": 20953, "ts": "2026-07-02T18:03:37Z", "hours": 1.3144, "text": "Last small improvements on my ghost game 👻 Code I reorganized parts of the code to make it, hopefully, more readable. Permission problems I have a browser with a bit more strict rules that broke my game. For that i made a check if the browser lies about color values of pixel and if that happens, we tell the user to please give us the permission. Canvas sizing Now after every try, of the game, the canvas resizes instead of only when reloading the page completely. What could be added? I had some ideas for what could be next. But i want to have a shipped project + move on with other projects. So i only list them here because i thought they are interesting. A seed calculated randomness generator to play against friends with same picture. More options of backgrounds and ghosts. Different ghost sizes. Different art styles. Dark mode."}, {"post_id": 19470, "ts": "2026-06-30T20:00:04Z", "hours": 0.6408, "text": "👀 Now you can actually play Ghostly party on the web I only did minor improvements today. In earlier versions of the game ghosts started plopping up on the canvas after one another and the worst part was that the ghost you should search for was always the first one because the browsers would use the cached version of the ghost, which obviously was way faster. To fix that i added a small loading screen which hides the canvas and makes a circle spin, in an CSS animation, until the canvas was finished drawing all the ghosts. There was also a dumb bug where i miscalculated the time the player took for a round I calculated Math.round(deltaTime / 60 * 100) / 100) when it should be Math.round(deltaTime / 60 * 10) / 100) . There was only one 0 too much. :[ Sometimes there are just those dumb bugs… I also finally deployed the game onto a web server, where it can now be played. https://ghost.foxors.de However before shipping i will try to find some bugs and add some icons and others stuff and generally try to polish up and tie loose ends together. Have a great day! or night or noon or whatever timezone you are in… :)"}, {"post_id": 18270, "ts": "2026-06-29T11:16:55Z", "hours": 1.4056, "text": "Hello, everybody! Today i fixed the width and height of the canvas. So that when you have a large screen you get a large canvas and if you have a smoll screen you get a smoll canvas. (Dynamic canvas size) I also fixed an issue where you couldn’t click the ghosts after scrolling, by taking scroll distance into account of the win condition check. I also made, just for fun, that when you find the right ghost and click on it. You get a zoomed in (cropped) image of them in the picture. Next thing would be to release it on my website…"}, {"post_id": 17051, "ts": "2026-06-27T17:59:26Z", "hours": 1.6925, "text": "I managed to implement the background. But wait! There are actually 2 backgrounds. One is a mask that masks specific areas, where ghosts are allowed to appear and the other one is the actual background with coloring. This should prevent ghosts from appearing at completely random nonsensical spots. I also programmed in that ghosts respect each other and spawn in some distance from one another, to not make it too crowded. But this created a new problem. The pseudo randomness is… well random. So there is a slight chance the ghost you need to find doesn’t even appear because you had bad luck. Furthermore many ghosts don’t appear. The script tries to spawn 50 total ghosts, in case one fails it will retry finding a position for that ghost 100 times before giving up and not spawning it. And out of the 50 only 10 manage to actually spawn. I will have to look into another solution to finding the random positions."}, {"post_id": 16932, "ts": "2026-06-27T14:23:01Z", "hours": 3.1883, "text": "I got many many drawings of a variety of ghosts from a relative and they remembered me of picture books where you would have to search a person or object among many in it. So i started programming a small website where you have to do exactly that. After showing it to the person who made the ghosts, they made more ghosts and a background. Now i will have to implement that :) For this to work i rewrote the entire thing with a canvas instead of plain images moved with transformation style sheet which makes it possible to implement the background. While I tried to I noticed that it was a bit scuffed working with images in canvas because you have to: Make a HTML image Let the browser load it And only afterwards you can put it on the canvas. But i still managed to pull it off."}]...
|
Title: Ghostly Party by @foxors | Stardance
Devlo Title: Ghostly Party by @foxors | Stardance
Devlogs:
I got many many drawings of a variety of ghosts from a relative and they remembered me of picture books where you would have to search a person or object among many in it. So i started programming a small website where you have to do exactly that. After showing it to the person who made the ghosts, they made more ghosts and a background. Now i will have to implement that :) For this to work i rewrote the entire thing with a canvas instead of plain images moved with transformation style sheet which makes it possible to implement the background. While I tried to I noticed that it was a bit scuffed working with images in canvas because you have to: Make a HTML image Let the browser load it And only afterwards you can put it on the canvas. But i still managed to pull it off.
I managed to implement the background. But wait! There are actually 2 backgrounds. One is a mask that masks specific areas, where ghosts are allowed to appear and the other one is the actual background with coloring. This should prevent ghosts from appearing at completely random nonsensical spots. I also programmed in that ghosts respect each other and spawn in some distance from one another, to not make it too crowded. But this created a new problem. The pseudo randomness is… well random. So there is a slight chance the ghost you need to find doesn’t even appear because you had bad luck. Furthermore many ghosts don’t appear. The script tries to spawn 50 total ghosts, in case one fails it will retry finding a position for that ghost 100 times before giving up and not spawning it. And out of the 50 only 10 manage to actually spawn. I will have to look into another solution to finding the random positions.
Hello, everybody! Today i fixed the width and height of the canvas. So that when you have a large screen you get a large canvas and if you have a smoll screen you get a smoll canvas. (Dynamic canvas size) I also fixed an issue where you couldn’t click the ghosts after scrolling, by taking scroll distance into account of the win condition check. I also made, just for fun, that when you find the right ghost and click on it. You get a zoomed in (cropped) image of them in the picture. Next thing would be to release it on my website…
👀 Now you can actually play Ghostly party on the web I only did minor improvements today. In earlier versions of the game ghosts started plopping up on the canvas after one another and the worst part was that the ghost you should search for was always the first one because the browsers would use the cached version of the ghost, which obviously was way faster. To fix that i added a small loading screen which hides the canvas and makes a circle spin, in an CSS animation, until the canvas was finished drawing all the ghosts. There was also a dumb bug where i miscalculated the time the player took for a round I calculated Math.round(deltaTime / 60 * 100) / 100) when it should be Math.round(deltaTime / 60 * 10) / 100) . There was only one 0 too much. :[ Sometimes there are just those dumb bugs… I also finally deployed the game onto a web server, where it can now be played. https://ghost.foxors.de However before shipping i will try to find some bugs and add some icons and others stuff and generally try to polish up and tie loose ends together. Have a great day! or night or noon or whatever timezone you are in… :)
Last small improvements on my ghost game 👻 Code I reorganized parts of the code to make it, hopefully, more readable. Permission problems I have a browser with a bit more strict rules that broke my game. For that i made a check if the browser lies about color values of pixel and if that happens, we tell the user to please give us the permission. Canvas sizing Now after every try, of the game, the canvas resizes instead of only when reloading the page completely. What could be added? I had some ideas for what could be next. But i want to have a shipped project + move on with other projects. So i only list them here because i thought they are interesting. A seed calculated randomness generator to play against friends with same picture. More options of backgrounds and ghosts. Different ghost sizes. Different art styles. Dark mode.
I am not finished yet First of all thanks to the feedback from some. It gave me a bit more motivation to work more on this project. Somebody bothered the loading timer after each round and guess what i also didn’t like that. So I fixed it. The cause was that each time a ghost was placed onto the canvas a new HTML image tag would have to be created, source set to the ghost image URL and than the script had to wait for the browser to load the image and only afterward it could place it onto the canvas. I fixed that by loading each image at the start of website loading. This way I already have all images loaded and only need to print them to the canvas no waiting needed. There was also this major randomness error. If you remember from an older post I did some random generator thing which makes it impossible to spawn too few ghosts while still allowing random positions on a mask without too much hugging each other. What i did not notice back then because of the mask, that if the mask isn’t applied the ghosts form a straight line from top left to bottom right. And guess what the error was: if (delta(g.x, x) < ghostSize / 2 || delta(g.y, y) < ghostSize / 2) vs if (delta(g.x, x) < ghostSize / 2 && delta(g.y, y) < ghostSize / 2) . I used and OR instead of and AND logic operator. It took me 30 mins to figure out :( Another person mentioned they had a optimization warning in their console. I did not had such a warning because I use Firefox personally. I also test on chromium but i don’t look into logs there, how ever now i did. The Dev tools of chromium really improved a lot, but i am still going to use Firefox as main browser. Well, I fixed all warnings chromium gave me. The context of a HTML canvas has an optimization flag in case you request data from it frequent what i do. I just had do set this option to true. Also the drawing part of the ghosts is now not blocking the main thread entirely with timeout calling the same function which acts like a for loop to distribute work over time. Otherwise the website would freeze for a second because printing images to a canvas is very sloww for some reason I don’t want to get into now. For the loading part i threw a bit CSS and HTML together making up a progress bar and added some random phrases so users don’t get bored. Furthermore instead of creating new HTML tags each scene change the code now already has them in the HTML code loaded but changes their visibility. In theory this should improve performance because the browser doesn’t have to create new elements each time.
Ready for ship 2 I fixed some minor issues and added a scoreboard at the end of each run. I also tried to make it more performant with small success. In this ship i have most of the feedback, from first ship, implemented and hope it is a better game now. I will probably stop with this ship for the time because i got my Minestom mini game server project right now which i need to finish.
Ships:
I made a smoll random generated search picture game with GHOOOOSTs. Not creepy ghosts, just funny ghosts. I made it in pure HTML, CSS and JS fashion. Each time you play you will need to find a new specific ghost amongst others in a living room. When you find them you get shown how long you took and how many times you miss-clicked. The hardest part was to write the code to place the ghosts randomly without stacking on one another, while still guaranteeing that at least a few ghosts are always there. To not make it too hard or too easy. That you have to memorize the ghost you search, is by the way not a bug or a lack of testing. I thought it would be more fun if you had to memorize the ghost you search for while playing.
A game written in html, css and js where you have to find a specific ghost in a picture with the fewest clicks and time as possible. The hardest thing was and still is for me the challenge to support a wide variate of browsers. Some don’t have an API point some do but only limited for privacy stuff etc. and some i can’t test because i don’t own a Mac nor a iPhone. Hope you will enjoy my small little game....
|
1792824887.4435518
|
1792911287.4435518
|
|
9500
|
Dasher_Slack-bot by @Dasher2801 | Stardance
|
|
2
|
2.37
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-14T10:02:58Z", "hours": 0.0, "multiplier": 1.03, "payout": 0, "blessing": "neutral", "text": "I improoved my slackbot, it reacts faster now and the offline error is fixed", "repo": "https://github.com/Dasher2801/Slack-bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0B9M0E4UUB"}, {"ship_num": 2, "ts": "2026-06-09T11:28:07Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Ich habe einen Slack-bot entwickelt, der zwei Zahlen verrechnen kann egal ob +,-,* oder /. Er kann auch deinen aktuellen Ping anzeigen oder ganz simpel grüßen. Außerdem ist er 24/7 aktiv.", "repo": "https://github.com/Dasher2801/Slack-bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0B9M0E4UUB"}]...
|
[{"post_id": 30047, "ts": "202 [{"post_id": 30047, "ts": "2026-07-17T09:59:09Z", "hours": 0.3692, "text": "I changed all the commands to /dashe-xxxxx, because some reviewer used not working commands of the other bots and said my commands don’t work. So I changed them to 100% unique commands"}, {"post_id": 19131, "ts": "2026-06-30T11:40:15Z", "hours": 0.2911, "text": "Der Bot antwortet jetzt wieder 24/7 und mit weniger delay"}, {"post_id": 5549, "ts": "2026-06-09T11:22:33Z", "hours": 0.2675, "text": "Der Bot läuft jetzt Rund um die Uhr 24/7"}, {"post_id": 5537, "ts": "2026-06-09T10:52:39Z", "hours": 1.6675, "text": "Ich arbeite an einem Slackbot, der 2 Zahlen addiren, substrahieren, multiplizieren oder dividieren kann. Er kann auch die Welt grüßen oder deinen aktuellen ping anzeigen."}]...
|
Title: Dasher_Slack-bot by @Dasher2801 | Stardance Title: Dasher_Slack-bot by @Dasher2801 | Stardance
Devlogs:
Ich arbeite an einem Slackbot, der 2 Zahlen addiren, substrahieren, multiplizieren oder dividieren kann. Er kann auch die Welt grüßen oder deinen aktuellen ping anzeigen.
Der Bot läuft jetzt Rund um die Uhr 24/7
Der Bot antwortet jetzt wieder 24/7 und mit weniger delay
I changed all the commands to /dashe-xxxxx, because some reviewer used not working commands of the other bots and said my commands don’t work. So I changed them to 100% unique commands
Ships:
Ich habe einen Slack-bot entwickelt, der zwei Zahlen verrechnen kann egal ob +,-,* oder /. Er kann auch deinen aktuellen Ping anzeigen oder ganz simpel grüßen. Außerdem ist er 24/7 aktiv.
I improoved my slackbot, it reacts faster now and the offline error is fixed...
|
1792831761.2072957
|
1792918161.2072957
|