|
32461
|
Local Plant Medic by @cognitayohan | Stardance
|
cognitayohan
|
2
|
5.0
|
75
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-20T22:52:42Z", "hours": 1.0, "multiplier": 15.58, "payout": 16, "blessing": "neutral", "text": "Ship #2: Flora Diagnostics, a Local Plant Medic, is an application that can run completely offline, using ONNX and Next.js to analyze images locally for plant health diagnostics. Read README.md for more information about UN goals and the purpose of the app! Over the course from Ship #1 –> Ship #2, I have added Android build files and started to test offline access. More to come!", "repo": "https://github.com/robot3-track/edge-plant-analyzer", "demo": "https://floradiagnostics.vercel.app/"}, {"ship_num": 2, "ts": "2026-07-10T16:46:29Z", "hours": 4.0, "multiplier": 14.47, "payout": 59, "blessing": "neutral", "text": "Ship #1: Flora Diagnostics, a Local Plant Medic, is an application that can run completely offline, using ONNX and Next.js to analyze images locally for plant health diagnostics. This app covers: UN Sustainable Development Goal 2: Zero Hunger. By helping farmers and home gardeners quickly identify crop diseases, this easy-to-access offline app can prevent massive food loss, promote sustainable agriculture, and improve overall food security. Furthermore, the importance of this app being able to run offline is crucial especially in rural farms and communities. To be able to quickly provide crop analysis for these locations can be a crucial component in a community’s ability to thrive.", "repo": "https://github.com/robot3-track/edge-plant-analyzer", "demo": "https://floradiagnostics.vercel.app/"}]...
|
[{"post_id": 27776, "ts": "202 [{"post_id": 27776, "ts": "2026-07-13T17:05:32Z", "hours": 0.4336, "text": "Devlog 6: Added Android building files to build APK artifact onto Github."}, {"post_id": 27370, "ts": "2026-07-12T21:32:05Z", "hours": 0.3044, "text": "Devlog 5: Fixed code logic to understand wheat inputs better and predict diseases more accurately. The issue was the elimination of lower-probability cases, causing empty inputs for all crops except for rice basically."}, {"post_id": 26072, "ts": "2026-07-10T17:33:46Z", "hours": 0.2942, "text": "Devlog 4: Add Readme to describe the process of the build and the purpose of the project"}, {"post_id": 26031, "ts": "2026-07-10T16:44:06Z", "hours": 0.3264, "text": "Devlog 4: Cleared Cache for rebuild and added new analysis features successfully Finally, after a few more tweaking and editing in the code as well as clearing the cache while testing on the vercel deployment, the app is ready to go! It features diagnostic summaries with condition analysis and symptom checkers. Furthermore, you are allowed to filter the plant for more accurate results. Below is a segment of the code featuring report diagnostics: <div key={idx} className=\"p-4 border border-stone-200 rounded-xl bg-stone-50 space-y-2\"> <div className=\"flex justify-between items-center\"> <span className=\"text-lg font-bold text-stone-900 capitalize\">{cleanLabel}</span> <span className=\"text-xs font-bold text-emerald-800 bg-emerald-100 px-3 py-1 rounded-full\"> {typeof p.score === 'number' ? `${(p.score * 100).toFixed(1)}%` : 'N/A'} </span> </div> <p className=\"text-sm text-stone-600 italic\">{info.desc}</p> <p className=\"text-sm font-semibold text-stone-800\"> Recommended Treatment: <span className=\"font-normal text-stone-600\">{info.treat}</span> </p> </div> );```"}, {"post_id": 26012, "ts": "2026-07-10T16:07:05Z", "hours": 0.3436, "text": "Devlog 3: Refined the new ONNX and setup for new analysis features After rollbacking a few broken commits, I made sure the code was ready to be setup for new analysis features such as giving advice for treating certain types of conditions. In addition, a future setup will be to allow users to narrow down the scope of analysis by stating the exact type of plant first."}, {"post_id": 25700, "ts": "2026-07-10T03:50:37Z", "hours": 2.5464, "text": "Devlog 2: Fixing build errors and correct ONNX I fixed the build errors by cleaning up the next.config.ts file and removing the curl commands that were causing the server to crash. I also updated the code in page.tsx so the image data would be sent as a Uint8Array instead of just an object. Finally, I fixed the worker.js file to wrap that data in a RawImage object, which let the AI model finally understand the images I was sending it. With these fixes, I have finally made the first version of the application that detects properly! However, much more work needs to be done when it comes to expanding analysis and the range of plants in context of agriculture."}, {"post_id": 24518, "ts": "2026-07-08T03:48:36Z", "hours": 1.2028, "text": "Devlog 1: Initial setup Built the first demo UI and connected the ONNX setup along with camera system. Much work to be done still as plant analysis needs to be properly trained locally!! As you can see values and analysis are a bit off since the local model isn’t trained very well yet."}]...
|
Title: Local Plant Medic by @cognitayohan | Starda Title: Local Plant Medic by @cognitayohan | Stardance
Devlogs:
Devlog 1: Initial setup Built the first demo UI and connected the ONNX setup along with camera system. Much work to be done still as plant analysis needs to be properly trained locally!! As you can see values and analysis are a bit off since the local model isn’t trained very well yet.
Devlog 2: Fixing build errors and correct ONNX I fixed the build errors by cleaning up the next.config.ts file and removing the curl commands that were causing the server to crash. I also updated the code in page.tsx so the image data would be sent as a Uint8Array instead of just an object. Finally, I fixed the worker.js file to wrap that data in a RawImage object, which let the AI model finally understand the images I was sending it. With these fixes, I have finally made the first version of the application that detects properly! However, much more work needs to be done when it comes to expanding analysis and the range of plants in context of agriculture.
Devlog 3: Refined the new ONNX and setup for new analysis features After rollbacking a few broken commits, I made sure the code was ready to be setup for new analysis features such as giving advice for treating certain types of conditions. In addition, a future setup will be to allow users to narrow down the scope of analysis by stating the exact type of plant first.
Devlog 4: Cleared Cache for rebuild and added new analysis features successfully Finally, after a few more tweaking and editing in the code as well as clearing the cache while testing on the vercel deployment, the app is ready to go! It features diagnostic summaries with condition analysis and symptom checkers. Furthermore, you are allowed to filter the plant for more accurate results. Below is a segment of the code featuring report diagnostics: <div key={idx} className="p-4 border border-stone-200 rounded-xl bg-stone-50 space-y-2"> <div className="flex justify-between items-center"> <span className="text-lg font-bold text-stone-900 capitalize">{cleanLabel}</span> <span className="text-xs font-bold text-emerald-800 bg-emerald-100 px-3 py-1 rounded-full"> {typeof p.score === 'number' ? `${(p.score * 100).toFixed(1)}%` : 'N/A'} </span> </div> <p className="text-sm text-stone-600 italic">{info.desc}</p> <p className="text-sm font-semibold text-stone-800"> Recommended Treatment: <span className="font-normal text-stone-600">{info.treat}</span> </p> </div> );```
Devlog 4: Add Readme to describe the process of the build and the purpose of the project
Devlog 5: Fixed code logic to understand wheat inputs better and predict diseases more accurately. The issue was the elimination of lower-probability cases, causing empty inputs for all crops except for rice basically.
Devlog 6: Added Android building files to build APK artifact onto Github.
Ships:
Ship #1: Flora Diagnostics, a Local Plant Medic, is an application that can run completely offline, using ONNX and Next.js to analyze images locally for plant health diagnostics. This app covers: UN Sustainable Development Goal 2: Zero Hunger. By helping farmers and home gardeners quickly identify crop diseases, this easy-to-access offline app can prevent massive food loss, promote sustainable agriculture, and improve overall food security. Furthermore, the importance of this app being able to run offline is crucial especially in rural farms and communities. To be able to quickly provide crop analysis for these locations can be a crucial component in a community’s ability to thrive.
Ship #2: Flora Diagnostics, a Local Plant Medic, is an application that can run completely offline, using ONNX and Next.js to analyze images locally for plant health diagnostics. Read README.md for more information about UN goals and the purpose of the app! Over the course from Ship #1 –> Ship #2, I have added Android build files and started to test offline access. More to come!...
|
1793944439.6093447
|
1794030839.6093447
|
|
46635
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944440.8211296
|
1794808440.8211296
|
|
46636
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944441.6787717
|
1794808441.6787717
|
|
46637
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944442.554522
|
1794808442.554522
|
|
36092
|
Personal Website :) by @fish-in-a-puddle | Stardan Personal Website :) by @fish-in-a-puddle | Stardance...
|
fish-in-a-puddle
|
1
|
9.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-04T13:17:07Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I have made a website to display my projects, to write reviews of books that I’ve read, and to share stuff I think is cool or might be helpful to other Hack Clubbers. This website is my first shipped software project, as I usually stick to hardware, but using the guide I was able to make something that I’m proud of. Right now there is no JS in the project, but I may ship it again later with more features. There are the three main sections (My projects, Book reviews and Cool stuff), a short “About Me”, an embedded Spotify playlist with some of my favorite music, some GIFs to add some movement to the page and a “Contact Me” section at the very bottom of the page.", "repo": "https://github.com/fish-in-a-puddle/Personal-Website", "demo": "https://fish-in-a-puddle.github.io/Personal-Website/"}]...
|
[{"post_id": 61128, "ts": "202 [{"post_id": 61128, "ts": "2026-09-03T21:33:39Z", "hours": 2.7664, "text": "Personal Website is done!! I finished adding some GIFs, a “cool stuff” section and fixed a few final issues with the formatting. I’m very happy with how this project has turned out, and I hope that others find it interesting or at least okay to scroll through. I learned a lot about how a website is built and how insanely difficult it is to get anything to go where you want it to, but it got a lot easier over time. Once I finish writing the README (not much to say, just open the link) it’ll be ready to ship."}, {"post_id": 59080, "ts": "2026-08-31T18:07:36Z", "hours": 1.71, "text": "After taking a break from this project to focus on finishing my hackpad, I embedded a Spotify playlist next to the “About Me” section. I also decided to add a “Book reviews” section instead of recommendations or inspiration. For some unknown reason, the book reviews refuse to be formatted like my projects, so I changed it so each individual review takes up the width of the page. The website is getting close to done. I just need to decide what to do with the header, expand the “About Me” section and finish reformatting the book reviews."}, {"post_id": 49844, "ts": "2026-08-18T19:54:48Z", "hours": 4.3703, "text": "I played around with some different ideas, themes and layouts. It took me a while to decide on one, but eventually the look of the site started to come together. I decided to cut out the media recommendations for now, since I want to website to be focused on projects. I’m thinking about replacing that section with an “Inspiration”section with links to projects I think are cool. I also removed the non-electronic projects. There wasn’t really anything I could show for them. So far I have four projects: three have pictures, two have links and they are all formatted the way I wanted. I also have a small “About me” section written. It doesn’t have a picture of the logo I’m working on yet, though. I am also thinking of embedding a Spotify playlist on the site. The next step for this project is to improve the header (not exactly sure how yet - pictures? One big image as the header?) and to change the color of the hyperlinks so they don’t get lost with the background color."}, {"post_id": 29671, "ts": "2026-07-16T18:56:34Z", "hours": 0.5794, "text": "Started working on a personal website! So far I have a vague idea of how it should look and am slowly making it happen. There’s a header with a welcome message, an “about me” section and a section at the bottom with links to my Stardance and github. I’m playing around with flex to get everything in the right place, but it’s pretty ugly right now. I’ll make everything look more put together once everything’s actually there."}]...
|
Title: Personal Website :) by @fish-in-a-puddle | Title: Personal Website :) by @fish-in-a-puddle | Stardance
Devlogs:
Started working on a personal website! So far I have a vague idea of how it should look and am slowly making it happen. There’s a header with a welcome message, an “about me” section and a section at the bottom with links to my Stardance and github. I’m playing around with flex to get everything in the right place, but it’s pretty ugly right now. I’ll make everything look more put together once everything’s actually there.
I played around with some different ideas, themes and layouts. It took me a while to decide on one, but eventually the look of the site started to come together. I decided to cut out the media recommendations for now, since I want to website to be focused on projects. I’m thinking about replacing that section with an “Inspiration”section with links to projects I think are cool. I also removed the non-electronic projects. There wasn’t really anything I could show for them. So far I have four projects: three have pictures, two have links and they are all formatted the way I wanted. I also have a small “About me” section written. It doesn’t have a picture of the logo I’m working on yet, though. I am also thinking of embedding a Spotify playlist on the site. The next step for this project is to improve the header (not exactly sure how yet - pictures? One big image as the header?) and to change the color of the hyperlinks so they don’t get lost with the background color.
After taking a break from this project to focus on finishing my hackpad, I embedded a Spotify playlist next to the “About Me” section. I also decided to add a “Book reviews” section instead of recommendations or inspiration. For some unknown reason, the book reviews refuse to be formatted like my projects, so I changed it so each individual review takes up the width of the page. The website is getting close to done. I just need to decide what to do with the header, expand the “About Me” section and finish reformatting the book reviews.
Personal Website is done!! I finished adding some GIFs, a “cool stuff” section and fixed a few final issues with the formatting. I’m very happy with how this project has turned out, and I hope that others find it interesting or at least okay to scroll through. I learned a lot about how a website is built and how insanely difficult it is to get anything to go where you want it to, but it got a lot easier over time. Once I finish writing the README (not much to say, just open the link) it’ll be ready to ship.
Ships:
I have made a website to display my projects, to write reviews of books that I’ve read, and to share stuff I think is cool or might be helpful to other Hack Clubbers. This website is my first shipped software project, as I usually stick to hardware, but using the guide I was able to make something that I’m proud of. Right now there is no JS in the project, but I may ship it again later with more features. There are the three main sections (My projects, Book reviews and Cool stuff), a short “About Me”, an embedded Spotify playlist with some of my favorite music, some GIFs to add some movement to the page and a “Contact Me” section at the very bottom of the page....
|
1793944443.462067
|
1794030843.462067
|
|
46638
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944444.679882
|
1794808444.679882
|
|
67005
|
Forgery by @Koy | Stardance
|
Koy
|
1
|
56.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-31T23:36:02Z", "hours": 56.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a Minecraft mod! because this is the last day of Stardance, this is only a POC. please read the Readme for explanations into the terms used here. Here’s what works: The melter, and most of main forgery setup works, although not as well as I wanted. You can create melted fluid (you can use the setup bellow ) and then cast it using a nozzle and a cast, please note though, the melted fluid can’t spread (for more info refer to devlog[6]) I hope you enjoy the mod!! Love, –Koy💜", "repo": "https://github.com/By-Koy/Forgery", "demo": "https://github.com/By-Koy/Forgery#testing"}]...
|
[{"post_id": 85987, "ts": "202 [{"post_id": 85987, "ts": "2026-10-31T23:25:58Z", "hours": 5.2989, "text": "DevLog[8] - “A POC” you look over the horizon… The sun sets over Stardance one last time… And for one more log, Hi! Welcome to the pre-ship devlog. What I did: The nozzle and cast are now functional! (no stencils though…) I made a creative mode tab to house the mod’s items! I wrote the Readme! I’ll go ship now, I need to sleep and the sunset it pretty. Goodnight, fellow stardancer"}, {"post_id": 85657, "ts": "2026-10-31T16:17:55Z", "hours": 2.2581, "text": "DevLog[7] - “Almost there…” In the interest of having less 10 hour devlogs, I have made 2 new blocks, with custom models made in blockbench. (which I had to compile on my own btw) The blocks are the nozzle (mostly functioning, at least for POC), and the cast. The nozzle is the output from the forgery, allowing melted fluid to leave the forgery. The cast is the last stop. it’s where the fluid goes to from the forgery to be made into things. (This was heavily inspired by tinker’s construct) In the future, it will have stencils that are used to get the desired output, for today, it will simply create a block (the desired functionality for when a stencil is not present) Toodaloo!"}, {"post_id": 85491, "ts": "2026-10-31T12:43:06Z", "hours": 10.0542, "text": "DevLog[6] - “Cutting Corners” Hiiiiiii For this devlog I mostly went and fixed the problems with DevLog[5]. So here’s the new stuff The melter faces the direction the player is facing when placing it and creates the melted fluid in that direction (so behind it from the player’s perspective) I have implemented the first three of the melter’s activation modes (off, on, and soul), which are chosen based off of the block under it (campfire for on, soul campfire of soul, anything else for off) [soul is currently the same as on] I have fixed the lag (yayy) it turns out that it only happened because I overloaded the port with updates (whoopsie) Aside from that, there are things I have implemented but are currently unused: I have figured out (and theoretically implemented) the (probably) best way to get the tint onto the flowing melted fluid, which is to hold the difference between their positions in the melted fluid block-state itself. I have added a survives-melted block tag to save the blocks that the melted fluid won’t destroy (other planned feature) “Wait so why is this titled cutting corners?” You again!? Well, yeah, Stardance is ending today. So here are things I had to cut to be able to ship a working prototype today: The melted fluid can’t spread, this is because I could not figure out how to restrict its spreading and I already have spent 10 hours working on fixes for the last 10 hour devlog. (I swear they’re supposed to be shorter ) Literally anything that has to do with the flowing melted fluid, after 8 hours of not getting anywhere, I stopped it from spreading and it doesn’t happen anymore (unless forced) Anw I’ll go back to the mines now byeeee"}, {"post_id": 83437, "ts": "2026-10-27T23:27:34Z", "hours": 10.0567, "text": "DevLog[5] - “Wow I did not have enough time” So I would like to prefix this devlog with the fact that this is hard so please don’t laugh Anw here’s my massive failure or whatever (please refer to the attached image) So remember when I said the melted fluid tints based off of it’s value? yeah I did not manage to do that properly, and I (thought) I fixed it! until I realized that it only tints the source Also each block has its own block entity and it kills the game (who wants an update suppressor?) but hey at least it runs frfr Btw it just does NOT stop spreading like wth Anw I did do some things I made the melter create the melted fluid (yippee!!) I made the melted fluid (source) tint I SAID DON’T LAUGH Anw see you in the next devlog where I fix all of ts"}, {"post_id": 80475, "ts": "2026-10-17T19:35:25Z", "hours": 9.9742, "text": "DevLog[4] - “Melted Fluid!” Hiiiiiiiiii (I’m running out of wave emotes help) I made a fluid!!! And it’s also a block entity!!! Anyway, Here’s what I did! Melted fluid (should it be molten??) - I made my first fluid! it tints based off of a value in its block entity (allegedly) and the value gets set on creation from the items that are put in the Melter! (I am currently unable to test this though) Melter enhancements! - I gave it two more slots (yeah that’s basically it) the next devlog will be about connecting both of these features together so stay tuned ⭐ ⭐ ⭐ Have a nice day!! (I should really think of more reviewer-considerate ways to end these huh)"}, {"post_id": 79392, "ts": "2026-10-13T19:55:03Z", "hours": 9.6944, "text": "DevLog[3] - “Containers!!!” “Wait what day is it?” will anyone even get this bit it’s on like three different projects atp Completely Ignoring my failure here’s what I did!! The melter: Yes I only did one block for almost 10 hours (it was hard okay?! ) this is the first container in the mod! (so the next ones should be a bit faster ) I actually didn’t find documentation for how to make it for the first little bit (like 5 hours ) so I looked at the beacon source code and ended up making the whole screen (and parts of the other stuff) completely on my own! Anw yeah it’s Tuesday (oopsie) Yeah I think that deadline might have been ambitious And so I will give myself the slightly-less-ambitious deadline of one more week! (I also have more school than before so I might re-extend) yeah this won’t be polished by the end of sd would it"}, {"post_id": 77939, "ts": "2026-10-08T21:10:26Z", "hours": 7.3261, "text": "DevLog[2] - “The Race” Hey all!! In this devlog I have two main progressions. the first is deesplate palladium ore, attached bellow (very blurry) and raw palladium (blurry chimken), and the second (the one that’s kind of interesting Ig Idk) is the palladium ore placed feature! it spawns naturally now. (I also added a picture of when I tested it but spawning end rods so yayay) this was done with the fabric datagen library thing so it’s cool and not json (yayayayayay) “Wait but why is this called the race?” Why does this always happen (Whisper) “Bcz you can never think of transitions” Shush. The race. (This shouldn’t be called a race I just forgot what it’s called smh ) I decided to ship this by Sunday. This means that the full palladium ore chain should be ready as well as (very basic) forgeries (the structure that melts ores so that you can use them, mostly for the better ores) EDIT: I forgot to mention it was Thursday"}, {"post_id": 75920, "ts": "2026-10-01T16:44:19Z", "hours": 1.1636, "text": "DevLog[1] - “First Item!” Hey there! I wanted to do this project for a while but just couldn’t get myself to start, so here I am! In the last hour all I did was setup, there isn’t much time in an hour and it takes a minute to do. I made this ingot (palladium) in piskel, and it’s going to be the beginning of this mod’s progression! The mod will start by just adding to the normal ore progression (wood -> stone -> iron -> gold, kinda -> diamond -> netherite) by having an item (palladium) that will be better for armor but not for weapons, that way the insanity starts off slow, and gets faster later on. Have a nice day!"}]...
|
Title: Forgery by @Koy | Stardance
Devlogs:
DevLo Title: Forgery by @Koy | Stardance
Devlogs:
DevLog[1] - “First Item!” Hey there! I wanted to do this project for a while but just couldn’t get myself to start, so here I am! In the last hour all I did was setup, there isn’t much time in an hour and it takes a minute to do. I made this ingot (palladium) in piskel, and it’s going to be the beginning of this mod’s progression! The mod will start by just adding to the normal ore progression (wood -> stone -> iron -> gold, kinda -> diamond -> netherite) by having an item (palladium) that will be better for armor but not for weapons, that way the insanity starts off slow, and gets faster later on. Have a nice day!
DevLog[2] - “The Race” Hey all!! In this devlog I have two main progressions. the first is deesplate palladium ore, attached bellow (very blurry) and raw palladium (blurry chimken), and the second (the one that’s kind of interesting Ig Idk) is the palladium ore placed feature! it spawns naturally now. (I also added a picture of when I tested it but spawning end rods so yayay) this was done with the fabric datagen library thing so it’s cool and not json (yayayayayay) “Wait but why is this called the race?” Why does this always happen (Whisper) “Bcz you can never think of transitions” Shush. The race. (This shouldn’t be called a race I just forgot what it’s called smh ) I decided to ship this by Sunday. This means that the full palladium ore chain should be ready as well as (very basic) forgeries (the structure that melts ores so that you can use them, mostly for the better ores) EDIT: I forgot to mention it was Thursday
DevLog[3] - “Containers!!!” “Wait what day is it?” will anyone even get this bit it’s on like three different projects atp Completely Ignoring my failure here’s what I did!! The melter: Yes I only did one block for almost 10 hours (it was hard okay?! ) this is the first container in the mod! (so the next ones should be a bit faster ) I actually didn’t find documentation for how to make it for the first little bit (like 5 hours ) so I looked at the beacon source code and ended up making the whole screen (and parts of the other stuff) completely on my own! Anw yeah it’s Tuesday (oopsie) Yeah I think that deadline might have been ambitious And so I will give myself the slightly-less-ambitious deadline of one more week! (I also have more school than before so I might re-extend) yeah this won’t be polished by the end of sd would it
DevLog[4] - “Melted Fluid!” Hiiiiiiiiii (I’m running out of wave emotes help) I made a fluid!!! And it’s also a block entity!!! Anyway, Here’s what I did! Melted fluid (should it be molten??) - I made my first fluid! it tints based off of a value in its block entity (allegedly) and the value gets set on creation from the items that are put in the Melter! (I am currently unable to test this though) Melter enhancements! - I gave it two more slots (yeah that’s basically it) the next devlog will be about connecting both of these features together so stay tuned ⭐ ⭐ ⭐ Have a nice day!! (I should really think of more reviewer-considerate ways to end these huh)
DevLog[5] - “Wow I did not have enough time” So I would like to prefix this devlog with the fact that this is hard so please don’t laugh Anw here’s my massive failure or whatever (please refer to the attached image) So remember when I said the melted fluid tints based off of it’s value? yeah I did not manage to do that properly, and I (thought) I fixed it! until I realized that it only tints the source Also each block has its own block entity and it kills the game (who wants an update suppressor?) but hey at least it runs frfr Btw it just does NOT stop spreading like wth Anw I did do some things I made the melter create the melted fluid (yippee!!) I made the melted fluid (source) tint I SAID DON’T LAUGH Anw see you in the next devlog where I fix all of ts
DevLog[6] - “Cutting Corners” Hiiiiiii For this devlog I mostly went and fixed the problems with DevLog[5]. So here’s the new stuff The melter faces the direction the player is facing when placing it and creates the melted fluid in that direction (so behind it from the player’s perspective) I have implemented the first three of the melter’s activation modes (off, on, and soul), which are chosen based off of the block under it (campfire for on, soul campfire of soul, anything else for off) [soul is currently the same as on] I have fixed the lag (yayy) it turns out that it only happened because I overloaded the port with updates (whoopsie) Aside from that, there are things I have implemented but are currently unused: I have figured out (and theoretically implemented) the (probably) best way to get the tint onto the flowing melted fluid, which is to hold the difference between their positions in the melted fluid block-state itself. I have added a survives-melted block tag to save the blocks that the melted fluid won’t destroy (other planned feature) “Wait so why is this titled cutting corners?” You again!? Well, yeah, Stardance is ending today. So here are things I had to cut to be able to ship a working prototype today: The melted fluid can’t spread, this is because I could not figure out how to restrict its spreading and I already have spent 10 hours working on fixes for the last 10 hour devlog. (I swear they’re supposed to be shorter ) Literally anything that has to do with the flowing melted fluid, after 8 hours of not getting anywhere, I stopped it from spreading and it doesn’t happen anymore (unless forced) Anw I’ll go back to the mines now byeeee
DevLog[7] - “Almost there…” In the interest of having less 10 hour devlogs, I have made 2 new blocks, with custom models made in blockbench. (which I had to compile on my own btw) The blocks are the nozzle (mostly functioning, at least for POC), and the cast. The nozzle is the output from the forgery, allowing melted fluid to leave the forgery. The cast is the last stop. it’s where the fluid goes to from the forgery to be made into things. (This was heavily inspired by tinker’s construct) In the future, it will have stencils that are used to get the desired output, for today, it will simply create a block (the desired functionality for when a stencil is not present) Toodaloo!
DevLog[8] - “A POC” you look over the horizon… The sun sets over Stardance one last time… And for one more log, Hi! Welcome to the pre-ship devlog. What I did: The nozzle and cast are now functional! (no stencils though…) I made a creative mode tab to house the mod’s items! I wrote the Readme! I’ll go ship now, I need to sleep and the sunset it pretty. Goodnight, fellow stardancer
Ships:
I made a Minecraft mod! because this is the last day of Stardance, this is only a POC. please read the Readme for explanations into the terms used here. Here’s what works: The melter, and most of main forgery setup works, although not as well as I wanted. You can create melted fluid (you can use the setup bellow ) and then cast it using a nozzle and a cast, please note though, the melted fluid can’t spread (for more info refer to devlog[6]) I hope you enjoy the mod!! Love, –Koy💜...
|
1793944445.5590396
|
1794030845.5590396
|
|
46639
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944446.788785
|
1794808446.788785
|
|
46644
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944447.6623778
|
1794808447.6623778
|
|
17138
|
CALCULATOR by @althaf | Stardance
|
althaf
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-25T07:20:18Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "you can do multiplication and division on it", "repo": "https://github.com/muhammedalthaf20250-ui/calculator", "demo": "https://muhammedalthaf20250-ui.github.io/calculator/intex.html"}]...
|
[{"post_id": 15529, "ts": "202 [{"post_id": 15529, "ts": "2026-06-25T07:07:40Z", "hours": 3.7875, "text": "it is a calculator"}]...
|
Title: CALCULATOR by @althaf | Stardance
Devlogs: Title: CALCULATOR by @althaf | Stardance
Devlogs:
it is a calculator
Ships:
you can do multiplication and division on it...
|
1793944448.5530956
|
1794030848.5530956
|
|
14500
|
Minecraft 2.0 by @Michael_G | Stardance
|
Michael_G
|
0
|
0.36
|
0
|
[]
|
[{"post_id": 5890, "ts": "2026 [{"post_id": 5890, "ts": "2026-06-09T21:01:48Z", "hours": 0.3594, "text": "Coding is hard!"}]...
|
Title: Minecraft 2.0 by @Michael_G | Stardance
De Title: Minecraft 2.0 by @Michael_G | Stardance
Devlogs:
Coding is hard!...
|
1793944449.4780538
|
1794808449.4780538
|
|
32859
|
CornOS by @corn | Stardance
|
corn
|
1
|
31.0
|
231
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-28T12:53:33Z", "hours": 31.0, "multiplier": 7.35, "payout": 231, "blessing": "neutral", "text": "A 32-bit x86 OS from complete scratch with GRUB as its bootloader, for educational purpose only.", "repo": "https://github.com/dcorn-stone/CornOS", "demo": "https://github.com/dcorn-stone/CornOS/releases"}]...
|
[{"post_id": 56602, "ts": "202 [{"post_id": 56602, "ts": "2026-08-28T12:50:21Z", "hours": 4.935, "text": "Finished tidying up and completing the ps/2 driver. Preparing to ship now, and try to implement paging in the future!"}, {"post_id": 52766, "ts": "2026-08-23T03:29:28Z", "hours": 7.145, "text": "Just trying to organize things in my codebase, completing the ps/2 scan code decoding function for set 2, and preparing to move on to implementing paging"}, {"post_id": 30524, "ts": "2026-07-18T05:26:27Z", "hours": 3.0786, "text": "Just made my OS capable of loading either exactly one Multiboot module or none. The module can be verified inside a debugger (gdb) which the EAX register should be set to 0xDEADBEEF."}, {"post_id": 27115, "ts": "2026-07-12T11:53:46Z", "hours": 4.3775, "text": "Made output logic better"}, {"post_id": 26357, "ts": "2026-07-11T03:11:05Z", "hours": 1.9347, "text": "Got the keyboard working!!!"}, {"post_id": 26307, "ts": "2026-07-11T01:02:22Z", "hours": 9.9053, "text": "Currently working on a ps/2 keyboard driver, only completing this for basic input. I have just done the state machine and scan code conversion, now trying to handle key events."}]...
|
Title: CornOS by @corn | Stardance
Devlogs:
Curre Title: CornOS by @corn | Stardance
Devlogs:
Currently working on a ps/2 keyboard driver, only completing this for basic input. I have just done the state machine and scan code conversion, now trying to handle key events.
Got the keyboard working!!!
Made output logic better
Just made my OS capable of loading either exactly one Multiboot module or none. The module can be verified inside a debugger (gdb) which the EAX register should be set to 0xDEADBEEF.
Just trying to organize things in my codebase, completing the ps/2 scan code decoding function for set 2, and preparing to move on to implementing paging
Finished tidying up and completing the ps/2 driver. Preparing to ship now, and try to implement paging in the future!
Ships:
A 32-bit x86 OS from complete scratch with GRUB as its bootloader, for educational purpose only....
|
1793944450.3636026
|
1794030850.3636026
|
|
35976
|
wire work by @sebastian2 | Stardance
|
sebastian2
|
0
|
0.63
|
0
|
[]
|
[{"post_id": 30009, "ts": "202 [{"post_id": 30009, "ts": "2026-07-17T07:54:06Z", "hours": 0.6336, "text": "It’s more difficult than I expected."}]...
|
Title: wire work by @sebastian2 | Stardance
Devlo Title: wire work by @sebastian2 | Stardance
Devlogs:
It’s more difficult than I expected....
|
1793944451.5879807
|
1794808451.5879807
|
|
35299
|
MCP creator by @Nawab-as | Stardance
|
Nawab-as
|
0
|
8.0
|
0
|
[]
|
[{"post_id": 29057, "ts": "202 [{"post_id": 29057, "ts": "2026-07-15T18:27:29Z", "hours": 8.0, "text": "Hi This project begins with a bit of a backstory which in hindsight is a bit long. Basically, its a simple web app to create and host custom semantic search MCP server. The Origin So a while back, nearing my final exams, I had a big problem. I was struggling to understand all the material for my IB HL History class (imagine AP but even harder). For reference, me and 4 other guys were taking notes for the entire year (yes, its a 2 semester course, technically 3 but that was last year) just for this class and produced a 253 page google doc filled with notes My solution? In response to this was first and formost to ask AI for help. However, using claude for this much text would use up all of my tokens. This is when I came up with MCP servers . It allows AI to google search into my notes by semantic meaning. For example, ‘Dutch-African’ would yield the same results as ‘Afrikaans’ and ‘Europeans accidentally bringing disease via cattle and wiping out the Aztec empire’ would be the same as ‘The Columbian Exchange’ (both of these are sadly true). Now I though I was a saviour by making this and after a while shared it with the entire class. I even got my history teacher’s approval. Two Weeks Later… Exams are done. I checked my backend to see who had used it (its secured via OAuth so I don’t get DDos’d, and so I can see who signed up to use it).To my devistation, only 5/36 people used it. Now I was furious cuz I spent so much time setting everything up. However, since we were all graduating this year, I figured out the ultimate revenge would be to share it globally and have them reminded of this missed opportunity everytime someone mentions it. Anyways… Now its time for the nitty-gritty details. My main focal point was that given such a big number of people, only a small portion will actually be able to do ‘hacker’ terminal command to run it. Instead I wanted to market specifically for non-technical people, which is why I chose to make a web app. Additionally, since I am running an performance-critical app, I can’t use electron. I don’t want to use tauri cuz I don’t want to learn rust. After a lot of research I found Wails, the golang alternative to electron. I had never written golang code but apparently its one of the easist high performance languages In this devlog, I have been working a lot on the frontend, especially including interactivity and animations based on unity hub’s design. The current artecture: Wails + Vite-Vue –> (GUI) Graphical User Interface Golang –> backend LanceDB go SDK –> indexing data The UX is simple. Either: download an embedding model for your hardware –> select a directory with whatever notes –> click index –> copy-paste a prompt into claude (or whatever desktop AI app) download an entire pre-indexed dataset for a pre-determined model (automatically downloads in the background) I have split this project into 4 pages: Home –> idk like general stats Models –> where you can download/import embedding models for indexing Projects –> where you can see your projects in more detail Prebuilts –> you can download pre-indexed datasets."}]...
|
Title: MCP creator by @Nawab-as | Stardance
Devlo Title: MCP creator by @Nawab-as | Stardance
Devlogs:
Hi This project begins with a bit of a backstory which in hindsight is a bit long. Basically, its a simple web app to create and host custom semantic search MCP server. The Origin So a while back, nearing my final exams, I had a big problem. I was struggling to understand all the material for my IB HL History class (imagine AP but even harder). For reference, me and 4 other guys were taking notes for the entire year (yes, its a 2 semester course, technically 3 but that was last year) just for this class and produced a 253 page google doc filled with notes My solution? In response to this was first and formost to ask AI for help. However, using claude for this much text would use up all of my tokens. This is when I came up with MCP servers . It allows AI to google search into my notes by semantic meaning. For example, ‘Dutch-African’ would yield the same results as ‘Afrikaans’ and ‘Europeans accidentally bringing disease via cattle and wiping out the Aztec empire’ would be the same as ‘The Columbian Exchange’ (both of these are sadly true). Now I though I was a saviour by making this and after a while shared it with the entire class. I even got my history teacher’s approval. Two Weeks Later… Exams are done. I checked my backend to see who had used it (its secured via OAuth so I don’t get DDos’d, and so I can see who signed up to use it).To my devistation, only 5/36 people used it. Now I was furious cuz I spent so much time setting everything up. However, since we were all graduating this year, I figured out the ultimate revenge would be to share it globally and have them reminded of this missed opportunity everytime someone mentions it. Anyways… Now its time for the nitty-gritty details. My main focal point was that given such a big number of people, only a small portion will actually be able to do ‘hacker’ terminal command to run it. Instead I wanted to market specifically for non-technical people, which is why I chose to make a web app. Additionally, since I am running an performance-critical app, I can’t use electron. I don’t want to use tauri cuz I don’t want to learn rust. After a lot of research I found Wails, the golang alternative to electron. I had never written golang code but apparently its one of the easist high performance languages In this devlog, I have been working a lot on the frontend, especially including interactivity and animations based on unity hub’s design. The current artecture: Wails + Vite-Vue –> (GUI) Graphical User Interface Golang –> backend LanceDB go SDK –> indexing data The UX is simple. Either: download an embedding model for your hardware –> select a directory with whatever notes –> click index –> copy-paste a prompt into claude (or whatever desktop AI app) download an entire pre-indexed dataset for a pre-determined model (automatically downloads in the background) I have split this project into 4 pages: Home –> idk like general stats Models –> where you can download/import embedding models for indexing Projects –> where you can see your projects in more detail Prebuilts –> you can download pre-indexed datasets....
|
1793944452.4510107
|
1794808452.4510107
|
|
1063
|
My awesome macropad! by @Tallini | Stardance
|
Tallini
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Tallini | Stardanc Title: My awesome macropad! by @Tallini | Stardance...
|
1793944453.3268766
|
1794808453.3268766
|
|
27797
|
Galaxy Shooter by @1NSANE | Stardance
|
1NSANE
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-29T18:29:59Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a 2D space shooter game in Python using the Arcade library called Galaxy Shooter! The biggest challenge was figuring out Python version compatibility (Arcade needs 3.11) and learning Arcade’s 3.x API from scratch. I’m proud that the game feels complete — it has enemy waves, a boss fight, powerups (shield, health, rapid fire), particle explosions, scrolling background, background music, sound effects, and real sprite graphics. To test it: use WASD to move, mouse to aim, left click to shoot, collect powerups to survive longer, and press R to restart. You’ll need Python 3.11 and the Arcade library installed!", "repo": "https://github.com/1nsaned/Galaxy-Shooter", "demo": "https://1nsaneee.itch.io/galaxy-shooter"}]...
|
[{"post_id": 17790, "ts": "202 [{"post_id": 17790, "ts": "2026-06-28T18:37:37Z", "hours": 5.8469, "text": "Galaxy Shooter - Built a 2D space shooting game using Python and the Arcade library. Features include a start menu, pause functionality, and player shooting mechanics. Used Claude AI to help implement some features and fix bugs. Still working on polishing the gamepla"}]...
|
Title: Galaxy Shooter by @1NSANE | Stardance
Devl Title: Galaxy Shooter by @1NSANE | Stardance
Devlogs:
Galaxy Shooter - Built a 2D space shooting game using Python and the Arcade library. Features include a start menu, pause functionality, and player shooting mechanics. Used Claude AI to help implement some features and fix bugs. Still working on polishing the gamepla
Ships:
I made a 2D space shooter game in Python using the Arcade library called Galaxy Shooter! The biggest challenge was figuring out Python version compatibility (Arcade needs 3.11) and learning Arcade’s 3.x API from scratch. I’m proud that the game feels complete — it has enemy waves, a boss fight, powerups (shield, health, rapid fire), particle explosions, scrolling background, background music, sound effects, and real sprite graphics. To test it: use WASD to move, mouse to aim, left click to shoot, collect powerups to survive longer, and press R to restart. You’ll need Python 3.11 and the Arcade library installed!...
|
1793944454.2032886
|
1794030854.2032886
|
|
6593
|
Duck-terminal by @Astro-Duck | Stardance
|
Astro-Duck
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Duck-terminal by @Astro-Duck | Stardance
|
1793944455.4032202
|
1794808455.4032202
|
|
24390
|
Forensics Copilot by @weibolin322 | Stardance
|
weibolin322
|
1
|
10.85
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-27T22:24:56Z", "hours": 10.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a command-line assistant for CTF forensics challenges. This ship is for v0.1.0. It’s a very simple version so it can only do some easy job like checking for trailing data or plain text flag scaning. I will add more feature to it in the furture. Sorry this release will only work on MacOS with Apple Silicon because it requires magic-lib and I put the version I have into the package. I will make a new release for Linux and Windows soon! Thank you for trying my project!", "repo": "https://github.com/Weibo0123/Forensics-Copilot", "demo": "https://github.com/Weibo0123/Forensics-Copilot/releases/tag/v0.1.0"}]...
|
[{"post_id": 24360, "ts": "202 [{"post_id": 24360, "ts": "2026-07-07T21:29:04Z", "hours": 0.85, "text": "Uploaded my code to pypi. Now users can use it on every OS."}, {"post_id": 17207, "ts": "2026-06-27T22:20:09Z", "hours": 3.4153, "text": "Devlog 5 Added the readme and finish the package for v0.1.0. This is a very early release so it might not work very well :("}, {"post_id": 15721, "ts": "2026-06-25T16:10:16Z", "hours": 1.0981, "text": "Devlog 4 Added regex-based scanning for common flag formats. It also support custom flag format."}, {"post_id": 15326, "ts": "2026-06-24T21:57:54Z", "hours": 1.0764, "text": "Devlog 3 I made a PNG file that has some hidden data appended to the end. This is the report my project generated after analyzing the file. It marked the file as suspicious and gave some suggestions for human to dive in. It could also analize other files, I will make video of all the files later."}, {"post_id": 15123, "ts": "2026-06-24T16:05:02Z", "hours": 2.2317, "text": "Devlog 2 I have already done all the code. Now I’m gonna write some test scripts to test."}, {"post_id": 14138, "ts": "2026-06-23T03:44:01Z", "hours": 1.7892, "text": "Hello! I just started my new project, the Forensics Copilot. Forensics is a main type of challenges in CTF Competitions. But it’s always boring and there are not many people want to do it. So I started this project. This project will help CTF competitors automate the tedious initial screening process for forensic challenges, like identifying real file types (not depends on extensions), catching common steganography/data-hiding tricks, recursively unpacking nested archives, and surfacing a prioritized list of next steps. For people that don’t know the CTF. “Capture The Flag” (CTF) competitions are not related to running outdoors or playing first-person shooters. Instead, they consist of a set of computer security puzzles (or challenges) involving reverse-engineering, forensics, cryptography, web technologies, and more. When players solve them they get a “flag”, a secret string which can be exchanged for points. The more points a team earns, the higher up it moves in rank."}]...
|
Title: Forensics Copilot by @weibolin322 | Stardan Title: Forensics Copilot by @weibolin322 | Stardance
Devlogs:
Hello! I just started my new project, the Forensics Copilot. Forensics is a main type of challenges in CTF Competitions. But it’s always boring and there are not many people want to do it. So I started this project. This project will help CTF competitors automate the tedious initial screening process for forensic challenges, like identifying real file types (not depends on extensions), catching common steganography/data-hiding tricks, recursively unpacking nested archives, and surfacing a prioritized list of next steps. For people that don’t know the CTF. “Capture The Flag” (CTF) competitions are not related to running outdoors or playing first-person shooters. Instead, they consist of a set of computer security puzzles (or challenges) involving reverse-engineering, forensics, cryptography, web technologies, and more. When players solve them they get a “flag”, a secret string which can be exchanged for points. The more points a team earns, the higher up it moves in rank.
Devlog 2 I have already done all the code. Now I’m gonna write some test scripts to test.
Devlog 3 I made a PNG file that has some hidden data appended to the end. This is the report my project generated after analyzing the file. It marked the file as suspicious and gave some suggestions for human to dive in. It could also analize other files, I will make video of all the files later.
Devlog 4 Added regex-based scanning for common flag formats. It also support custom flag format.
Devlog 5 Added the readme and finish the package for v0.1.0. This is a very early release so it might not work very well :(
Uploaded my code to pypi. Now users can use it on every OS.
Ships:
I made a command-line assistant for CTF forensics challenges. This ship is for v0.1.0. It’s a very simple version so it can only do some easy job like checking for trailing data or plain text flag scaning. I will add more feature to it in the furture. Sorry this release will only work on MacOS with Apple Silicon because it requires magic-lib and I put the version I have into the package. I will make a new release for Linux and Windows soon! Thank you for trying my project!...
|
1793944456.2958543
|
1794030856.2958543
|
|
11886
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944457.4753425
|
1794808457.4753425
|
|
33544
|
Untitled project by @Ashlynmathew | Stardance
|
Ashlynmathew
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @Ashlynmathew | Stardan Title: Untitled project by @Ashlynmathew | Stardance...
|
1793944458.3454452
|
1794808458.3454452
|
|
25474
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944459.225275
|
1794808459.225275
|
|
31758
|
Untitled by @Nuno | Stardance
|
Nuno
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @Nuno | Stardance
|
1793944460.127282
|
1794808460.127282
|
|
29965
|
Travel Destination Higher or Lower by @Ombama | St Travel Destination Higher or Lower by @Ombama | Stardance...
|
Ombama
|
1
|
3.0
|
16
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-02T18:12:04Z", "hours": 3.0, "multiplier": 5.63, "payout": 16, "blessing": "neutral", "text": "I made a travel-themed Higher or Lower game using HTML, CSS, and JavaScript. The player compares two famous travel destinations and guesses whether the second destination has higher or lower annual visitors than the first one. The game includes a split-screen design, destination background images, score tracking, high score storage, a shuffled destination system, and a game over screen. The most challenging part was making the game feel smooth and not repetitive. At first, random destinations could repeat too often, so I added a shuffled deck system that goes through the destination list before repeating places. Another challenge was finding visitor numbers because annual tourism data can change depending on the year and source, so I used approximate values for gameplay. I am proud of the visual design because it looks like a real Higher or Lower style game. I am also proud that the JavaScript does more than just compare two numbers. It manages the score, high score, game state, random destination order, answer reveal, and restart logic. To test the project, people should click Higher or Lower and check whether the answer is revealed correctly. They should make sure the score increases after a correct answer and that the game over screen appears after a wrong answer. They should also refresh the page to confirm that the high score is saved. Since the visitor counts are approximate, the game should be tested as an educational guessing game, not as an official tourism statistics source.", "repo": "https://github.com/Om-Bhagat-prog/Travel-Destination-Higher-or-Lower", "demo": "https://travel-destination-higher-or-lower.vercel.app/"}]...
|
[{"post_id": 20959, "ts": "202 [{"post_id": 20959, "ts": "2026-07-02T18:10:03Z", "hours": 2.7756, "text": "Design Goal The goal was to create a game that looked bold, clean, and exciting. The design uses: A full-screen split layout Two large destination panels Background travel images Dark overlays for readable text Large destination names A highlighted annual visitor number A central VS circle Large Higher and Lower buttons Score and high score display The visual style was inspired by modern quiz games and travel websites."}]...
|
Title: Travel Destination Higher or Lower by @Omba Title: Travel Destination Higher or Lower by @Ombama | Stardance
Devlogs:
Design Goal The goal was to create a game that looked bold, clean, and exciting. The design uses: A full-screen split layout Two large destination panels Background travel images Dark overlays for readable text Large destination names A highlighted annual visitor number A central VS circle Large Higher and Lower buttons Score and high score display The visual style was inspired by modern quiz games and travel websites.
Ships:
I made a travel-themed Higher or Lower game using HTML, CSS, and JavaScript. The player compares two famous travel destinations and guesses whether the second destination has higher or lower annual visitors than the first one. The game includes a split-screen design, destination background images, score tracking, high score storage, a shuffled destination system, and a game over screen. The most challenging part was making the game feel smooth and not repetitive. At first, random destinations could repeat too often, so I added a shuffled deck system that goes through the destination list before repeating places. Another challenge was finding visitor numbers because annual tourism data can change depending on the year and source, so I used approximate values for gameplay. I am proud of the visual design because it looks like a real Higher or Lower style game. I am also proud that the JavaScript does more than just compare two numbers. It manages the score, high score, game state, random destination order, answer reveal, and restart logic. To test the project, people should click Higher or Lower and check whether the answer is revealed correctly. They should make sure the score increases after a correct answer and that the game over screen appears after a wrong answer. They should also refresh the page to confirm that the high score is saved. Since the visitor counts are approximate, the game should be tested as an educational guessing game, not as an official tourism statistics source....
|
1793944461.0010233
|
1794030861.0010233
|
|
16294
|
My very own WebOS by @d4rk4rctic | Stardance
|
d4rk4rctic
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @d4rk4rctic | Stardanc Title: My very own WebOS by @d4rk4rctic | Stardance...
|
1793944462.1436615
|
1794808462.1436615
|
|
8593
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944463.013692
|
1794808463.013692
|
|
18113
|
Yu-Gi-Oh! Banlist API by @Karim_xyz | Stardance
|
Karim_xyz
|
1
|
7.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-18T22:50:10Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a pretty basic flask api that returns older yugioh banlists in JSON format (since I needed such thing but didn’t find so I made this), the banlists data was scraped from yugipedia then stored in MongoDB The most challenging part is that I made this in my phone (the only hardware I have), that prevented me from making a UI and improving the project in general I think there wouldn’t be so much yugioh players here, if you are I hope you like it and find it useful, otherwise you can give me feedback about the technical parts and stuff…", "repo": "https://github.com/karim-xyz/yugioh-banlists-api", "demo": "https://yugioh-banlists-api.onrender.com/api/v1/2005-04"}]...
|
[{"post_id": 11621, "ts": "202 [{"post_id": 11621, "ts": "2026-06-18T22:35:50Z", "hours": 2.6878, "text": "I am tired I tried to make a webpage guide for it but I can’t do frontend sice the only hardware I have is my phone"}, {"post_id": 9025, "ts": "2026-06-15T01:46:46Z", "hours": 4.2628, "text": "Finally implemented the api on render"}]...
|
Title: Yu-Gi-Oh! Banlist API by @Karim_xyz | Stard Title: Yu-Gi-Oh! Banlist API by @Karim_xyz | Stardance
Devlogs:
Finally implemented the api on render
I am tired I tried to make a webpage guide for it but I can’t do frontend sice the only hardware I have is my phone
Ships:
This is a pretty basic flask api that returns older yugioh banlists in JSON format (since I needed such thing but didn’t find so I made this), the banlists data was scraped from yugipedia then stored in MongoDB The most challenging part is that I made this in my phone (the only hardware I have), that prevented me from making a UI and improving the project in general I think there wouldn’t be so much yugioh players here, if you are I hope you like it and find it useful, otherwise you can give me feedback about the technical parts and stuff…...
|
1793944463.9134605
|
1794030863.9134605
|
|
8567
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944465.092271
|
1794808465.092271
|
|
68486
|
space-escape (OMEGA-7) by @torren | Stardance
|
torren
|
1
|
8.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T21:20:01Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "omega-7 is an escape room that runs entirely inside a figma prototype, you wake up on a dying space station with the oxygen draining and work through five puzzles to reach the escape pod, from a keycard to a cipher to the airlock pin to a reactor restart to rewiring the pod. the hard part is that figma has no code, no variables, no logic, and no sound, so faking “state” means building a separate frame for every single thing the player could be looking at (the keypad alone is five frames to fake a two digit pin), and i ended up generating all 48 frames and ~160 hotspots. i’m proud that it actually feels like a game and not a slideshow - smart-animate makes the keycard fly into your inventory and the reactor levers flip and glow as you solve it. to test it, play in present mode and click anything interactive: the pin is crew x deck from the whiteboard and roster, and the reactor order is hidden in the captain’s log in nato phonetic, so don’t rush past the clues.", "repo": "https://github.com/nadellasripad11/space-escape", "demo": "https://www.figma.com/proto/KacEHBOZqWUMXmCe6sAqhL/OMEGA-7-%E2%80%94-Figma-Escape-Room?page-id=79%3A2&node-id=79-3&starting-point-node-id=79%3A3&scaling=min-zoom"}]...
|
[{"post_id": 81643, "ts": "202 [{"post_id": 81643, "ts": "2026-10-21T21:15:39Z", "hours": 0.375, "text": "figma can’t play sound, so i leaned all the way into motion instead. added a shared smart-animate transition across every puzzle so the states actually morph into each other: clicking the keycard now flies it off the shelf and shrinks it right into your inventory slot, the pin dots fill in as you type, the reactor levers physically flip and the lights go green as you nail the sequence, and the wires snap into their ports on each correct connection. then i jumped over to the 3d web version and fixed the keycard being annoying to click - the mesh is tiny and the camera sway makes it drift, so i wrapped it in an invisible hit box about 2.5x the size that catches your click anywhere near it without changing how anything looks."}, {"post_id": 80273, "ts": "2026-10-17T02:18:13Z", "hours": 4.2958, "text": "playtested omega-7 and realized you could beat it in like a minute, so i doubled the puzzles from 3 to 5. added a captain’s log cipher that spells out a reactor code in nato phonetic (bravo, alpha, charlie) that you have to decode, and a reactor switch panel where you flip three switches in that exact order, and one wrong flip resets the whole thing. figma has no variables or logic so the switch puzzle is really just 5 separate frames wired together, one per state, same hacky trick i used for the keypad. also squashed a bug in the three.js web version where the crate and fuse box puzzles were wired into the game logic but the 3d scenes never actually had the objects, so clicking them did nothing. added the missing meshes and checked every interactive object is clickable now. full flow is live now: quarters, cipher, airlock pin, reactor, pod wiring, launch. shipping it."}, {"post_id": 77679, "ts": "2026-10-07T20:23:31Z", "hours": 3.4492, "text": "I built OMEGA-7, a space escape room that turns Figma into a playable game. Players explore a dying station and solve puzzles before their oxygen runs out. The escape sequence involves finding a keycard, decoding an airlock PIN, and rewiring a pod. I added 3D-rendered rooms, clickable objects, camera push-ins, and hint screens. I tested the puzzle paths from start to finish to check the full escape sequence. I also launched a browser version with real-time 3D, swinging doors, and sound effects. It adds a seven-minute oxygen timer and a wire-dragging puzzle, linking back to the Figma prototype."}]...
|
Title: space-escape (OMEGA-7) by @torren | Stardan Title: space-escape (OMEGA-7) by @torren | Stardance
Devlogs:
I built OMEGA-7, a space escape room that turns Figma into a playable game. Players explore a dying station and solve puzzles before their oxygen runs out. The escape sequence involves finding a keycard, decoding an airlock PIN, and rewiring a pod. I added 3D-rendered rooms, clickable objects, camera push-ins, and hint screens. I tested the puzzle paths from start to finish to check the full escape sequence. I also launched a browser version with real-time 3D, swinging doors, and sound effects. It adds a seven-minute oxygen timer and a wire-dragging puzzle, linking back to the Figma prototype.
playtested omega-7 and realized you could beat it in like a minute, so i doubled the puzzles from 3 to 5. added a captain’s log cipher that spells out a reactor code in nato phonetic (bravo, alpha, charlie) that you have to decode, and a reactor switch panel where you flip three switches in that exact order, and one wrong flip resets the whole thing. figma has no variables or logic so the switch puzzle is really just 5 separate frames wired together, one per state, same hacky trick i used for the keypad. also squashed a bug in the three.js web version where the crate and fuse box puzzles were wired into the game logic but the 3d scenes never actually had the objects, so clicking them did nothing. added the missing meshes and checked every interactive object is clickable now. full flow is live now: quarters, cipher, airlock pin, reactor, pod wiring, launch. shipping it.
figma can’t play sound, so i leaned all the way into motion instead. added a shared smart-animate transition across every puzzle so the states actually morph into each other: clicking the keycard now flies it off the shelf and shrinks it right into your inventory slot, the pin dots fill in as you type, the reactor levers physically flip and the lights go green as you nail the sequence, and the wires snap into their ports on each correct connection. then i jumped over to the 3d web version and fixed the keycard being annoying to click - the mesh is tiny and the camera sway makes it drift, so i wrapped it in an invisible hit box about 2.5x the size that catches your click anywhere near it without changing how anything looks.
Ships:
omega-7 is an escape room that runs entirely inside a figma prototype, you wake up on a dying space station with the oxygen draining and work through five puzzles to reach the escape pod, from a keycard to a cipher to the airlock pin to a reactor restart to rewiring the pod. the hard part is that figma has no code, no variables, no logic, and no sound, so faking “state” means building a separate frame for every single thing the player could be looking at (the keypad alone is five frames to fake a two digit pin), and i ended up generating all 48 frames and ~160 hotspots. i’m proud that it actually feels like a game and not a slideshow - smart-animate makes the keycard fly into your inventory and the reactor levers flip and glow as you solve it. to test it, play in present mode and click anything interactive: the pin is crew x deck from the whiteboard and roster, and the reactor order is hidden in the captain’s log in nato phonetic, so don’t rush past the clues....
|
1793944465.9519331
|
1794030865.9519331
|
|
18528
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944467.1099918
|
1794808467.1099918
|
|
15707
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944469.937457
|
1794808469.937457
|
|
11803
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944470.8279989
|
1794808470.8279989
|
|
29275
|
Persona Forge by @miles | Stardance
|
miles
|
1
|
10.0
|
23
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-11T01:35:58Z", "hours": 10.0, "multiplier": 2.21, "payout": 23, "blessing": "neutral", "text": "Persona Forge: AI Character Generation for my sister! My sister spent a lot of time on her book making AI character pictures for my book. This is the beta release of the overall goal, as she isn’t allowed to have ChatGPT or AI apps on her computer!", "repo": "https://github.com/MilesWK/CharacterCreator", "demo": "https://character-creator-two.vercel.app/"}]...
|
[{"post_id": 26316, "ts": "202 [{"post_id": 26316, "ts": "2026-07-11T01:33:36Z", "hours": 0.4697, "text": "going to ship it! Has some slight bugs, but I want to ship it and then sort out more bugs."}, {"post_id": 23686, "ts": "2026-07-06T19:54:06Z", "hours": 0.9442, "text": "Pain down the road I mentioned last devlog that moving my backend to vercel could cause some pain down the road. I was right. Now I have moved it back to being hosted on my end, so the preview doesn’t work any more. Sorry about that. Attached is all the commits I made today."}, {"post_id": 23154, "ts": "2026-07-05T22:57:03Z", "hours": 0.9594, "text": "Vercel Deployment Now available in the public in beta!!! https://character-creator-two.vercel.app/ Please give feedback via comments! Good to go on Vercel. Realized though this might cause me pain down the road during development having the issue of committing to get the API to change. We will see though."}, {"post_id": 22312, "ts": "2026-07-04T18:29:01Z", "hours": 1.2325, "text": "This is a smaller devlog for today but I want to go ahead and post it! Added a system that limits users to 10 images a day, and automatically resets. IDK why I like it so much but I do! Of course, there are many loopholes around it, but this whole project is mainly for my sister and she won’t know them whatsoever. I can count on that. Now I just hope tomorrow it resets my request limit! 🤞🤞"}, {"post_id": 22212, "ts": "2026-07-04T15:58:21Z", "hours": 1.4161, "text": "Download Buttons & More AI Well, so far this project makes 4 calls per image generated. That can’t get expensive, right? Right now it Checks if the prompt is a character Generates a list of traits from the prompt Generates a name for the file based on the prompt Generates an image Recently I added a download button that downloads the generated image to your computer. The file name is auto-generated by AI which I think will be useful. Next up is to figure out the share button. I hope this project doesn’t blow up too much, because then I am going to burn through HCAI’s $3 limit so quickly. I want to change the project name! Any suggestions?"}, {"post_id": 21464, "ts": "2026-07-03T12:54:27Z", "hours": 1.9481, "text": "What a productive 2 hours this was! Here is what has changed: The things that work: Images are now being generated! The AI checker to check if the prompt is a character works, and will display a notification denying the request. You can generate a character all in the frontend, so technically this project is functional. Things I need to fix: Images will take up the entire screen when displayed in the HTML Frontend. This isn’t supposed to happen UI is just garbage. This project still has a long ways to go. (There is a roadmap on GitHub showing the completion progress.) Enjoy the picture of Superman holding up a car with the people in the car singing."}, {"post_id": 19937, "ts": "2026-07-01T11:49:16Z", "hours": 3.3242, "text": "Have a foundation done so far. This includes the main frontend screen (just the opening screen), cool styling, and node.js AI stuff. Here is the funny part: It really hasn’t generated a single image yet in over three hours of work."}]...
|
Title: Persona Forge by @miles | Stardance
Devlog Title: Persona Forge by @miles | Stardance
Devlogs:
Have a foundation done so far. This includes the main frontend screen (just the opening screen), cool styling, and node.js AI stuff. Here is the funny part: It really hasn’t generated a single image yet in over three hours of work.
What a productive 2 hours this was! Here is what has changed: The things that work: Images are now being generated! The AI checker to check if the prompt is a character works, and will display a notification denying the request. You can generate a character all in the frontend, so technically this project is functional. Things I need to fix: Images will take up the entire screen when displayed in the HTML Frontend. This isn’t supposed to happen UI is just garbage. This project still has a long ways to go. (There is a roadmap on GitHub showing the completion progress.) Enjoy the picture of Superman holding up a car with the people in the car singing.
Download Buttons & More AI Well, so far this project makes 4 calls per image generated. That can’t get expensive, right? Right now it Checks if the prompt is a character Generates a list of traits from the prompt Generates a name for the file based on the prompt Generates an image Recently I added a download button that downloads the generated image to your computer. The file name is auto-generated by AI which I think will be useful. Next up is to figure out the share button. I hope this project doesn’t blow up too much, because then I am going to burn through HCAI’s $3 limit so quickly. I want to change the project name! Any suggestions?
This is a smaller devlog for today but I want to go ahead and post it! Added a system that limits users to 10 images a day, and automatically resets. IDK why I like it so much but I do! Of course, there are many loopholes around it, but this whole project is mainly for my sister and she won’t know them whatsoever. I can count on that. Now I just hope tomorrow it resets my request limit! 🤞🤞
Vercel Deployment Now available in the public in beta!!! https://character-creator-two.vercel.app/ Please give feedback via comments! Good to go on Vercel. Realized though this might cause me pain down the road during development having the issue of committing to get the API to change. We will see though.
Pain down the road I mentioned last devlog that moving my backend to vercel could cause some pain down the road. I was right. Now I have moved it back to being hosted on my end, so the preview doesn’t work any more. Sorry about that. Attached is all the commits I made today.
going to ship it! Has some slight bugs, but I want to ship it and then sort out more bugs.
Ships:
Persona Forge: AI Character Generation for my sister! My sister spent a lot of time on her book making AI character pictures for my book. This is the beta release of the overall goal, as she isn’t allowed to have ChatGPT or AI apps on her computer!...
|
1793944471.713419
|
1794030871.713419
|
|
14959
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944472.9475486
|
1794808472.9475486
|
|
10712
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944473.889196
|
1794808473.889196
|
|
10796
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944474.76679
|
1794808474.76679
|
|
11812
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944475.6156058
|
1794808475.6156058
|
|
25174
|
Piggy by @Nauticos | Stardance
|
Nauticos
|
1
|
3.0
|
7
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-24T19:21:04Z", "hours": 3.0, "multiplier": 2.87, "payout": 7, "blessing": "neutral", "text": "A Slack bot all about pigs. It was a fun challenge learning how to make a bot and also learning Javascript (I only knew a very tiny bit from Sprig tutorials). I added a few original commands to try challenge myself (I did a lot of research for the Pig Latin translation) and I am very happy with the result! May not be the most practical, but still very fun nonetheless!", "repo": "https://github.com/Nauticos/Piggy", "demo": "https://hackclub.enterprise.slack.com/archives/C0BCWUGRZHQ"}]...
|
[{"post_id": 15239, "ts": "202 [{"post_id": 15239, "ts": "2026-06-24T19:00:57Z", "hours": 0.4747, "text": "Having trouble syncing the old 24/7 version with the new version with new commands…"}, {"post_id": 15129, "ts": "2026-06-24T16:13:45Z", "hours": 0.8767, "text": "Added all my commands and made it 24/7. Started working on the README, should be the last thing I need"}, {"post_id": 15062, "ts": "2026-06-24T14:01:10Z", "hours": 1.1889, "text": "Set up some basic commands, will brainstorm later to think of some more"}]...
|
Title: Piggy by @Nauticos | Stardance
Devlogs:
Se Title: Piggy by @Nauticos | Stardance
Devlogs:
Set up some basic commands, will brainstorm later to think of some more
Added all my commands and made it 24/7. Started working on the README, should be the last thing I need
Having trouble syncing the old 24/7 version with the new version with new commands…
Ships:
A Slack bot all about pigs. It was a fun challenge learning how to make a bot and also learning Javascript (I only knew a very tiny bit from Sprig tutorials). I added a few original commands to try challenge myself (I did a lot of research for the Pig Latin translation) and I am very happy with the result! May not be the most practical, but still very fun nonetheless!...
|
1793944476.4843173
|
1794030876.4843173
|
|
46653
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944477.6701674
|
1794808477.6701674
|
|
46654
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944478.5585456
|
1794808478.5585456
|
|
46658
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944479.413451
|
1794808479.413451
|
|
46666
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944480.276582
|
1794808480.276582
|
|
45358
|
A calculator with the most useless effect in the w A calculator with the most useless effect in the world by @Ditto | Stardance...
|
Ditto
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: A calculator with the most useless effect i Title: A calculator with the most useless effect in the world by @Ditto | Stardance...
|
1793944481.1402712
|
1794808481.1402712
|
|
46672
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944482.0168936
|
1794808482.0168936
|
|
45386
|
WarioWare Game by @rishavshah | Stardance
|
rishavshah
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: WarioWare Game by @rishavshah | Stardance
|
1793944482.8706584
|
1794808482.8706584
|
|
951
|
Website by @Kanata | Stardance
|
Kanata
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-01T11:45:45Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I created a simple website to learn HTML. It includes headings, links, lists, tables, and a form.The most challenging part was publishing the website with GitHub Pages. I had to learn how GitHub Pages works and how to configure the project correctly.I am proud that I built and published my first website by myself.This project is a beginner HTML practice project. It focuses on learning the basics rather than creating a professional website.", "repo": "https://github.com/k4n474/Website", "demo": "https://k4n474.github.io/Website/"}]...
|
[{"post_id": 230, "ts": "2026- [{"post_id": 230, "ts": "2026-06-01T10:58:25Z", "hours": 0.8114, "text": "I wrote code using a wider variety of tags."}, {"post_id": 204, "ts": "2026-06-01T08:05:04Z", "hours": 0.3136, "text": "I’m creating a simple webpage to learn HTML"}]...
|
Title: Website by @Kanata | Stardance
Devlogs:
I’ Title: Website by @Kanata | Stardance
Devlogs:
I’m creating a simple webpage to learn HTML
I wrote code using a wider variety of tags.
Ships:
I created a simple website to learn HTML. It includes headings, links, lists, tables, and a form.The most challenging part was publishing the website with GitHub Pages. I had to learn how GitHub Pages works and how to configure the project correctly.I am proud that I built and published my first website by myself.This project is a beginner HTML practice project. It focuses on learning the basics rather than creating a professional website....
|
1793944483.7686825
|
1794030883.7686825
|
|
46681
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944484.9891956
|
1794808484.9891956
|
|
20490
|
Phoenix - Web Game Framework by @openchanter | Sta Phoenix - Web Game Framework by @openchanter | Stardance...
|
openchanter
|
1
|
29.37
|
325
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-13T06:20:18Z", "hours": 25.0, "multiplier": 12.89, "payout": 325, "blessing": "neutral", "text": "I made Phoenix, a web-based game framework using TypeScript! It is designed to be easy to use and quick to make projects with. I used THREE.js for rendering and Planck.js for the physics engine. The features available in the engine vary from simple rendering components to rigidbodies, UI systems and particle systems! The engine also supports a proper scene hierarchy with objects being able to have children that inherit their translation and rotation. The most challenging part of this was just trying to iron out all of the small bugs that kept popping up in different areas of the engine while I was trying to add a new feature somewhere. Just a note about the demo though, it is meant to just show off the features of the engine, and the demo is not the product of this project but rather the actual engine and it’s API that can be used to make games! I also plan to make an actual game using this engine as my next project for Stardance!", "repo": "https://github.com/OpEnchanter/phoenix", "demo": "https://openchanter.github.io/phoenix"}]...
|
[{"post_id": 31045, "ts": "202 [{"post_id": 31045, "ts": "2026-07-19T03:58:27Z", "hours": 3.1128, "text": "Another devlog as I continue to work on my other project that uses this engine as a dependency. Since I’ve been actually using this engine for making something real, I’ve noticed that it has quite a few flaws that I didn’t catch earlier on in the creation process. For example, when the window resized on the Y axis, the scale of the content within the window would also scale. This actually ended up causing a big issue with my new project as I had to convert screen-space mouse coordinates to positions in the world for placing objects in the editor. Fixing this was pretty simple and I just swapped out the old render resolution for a render scalar that gets multiplied by the window resolution to calculate the render resolution. Over the time of creating my new project there have also been some other small issues with things such as the button hitboxes and the engine not having the ability to resize objects in real time that I have since fixed. For the real time object resizing issue though, it was especially annoying because I had to resize the THREE.js Mesh object directly using the .scale.set() method on it which cannot be simply supplied with the size in pixels you want the object to be and is separate from the size of the geometry. To solve this I had to calculate how much I would have to multiply the scale of the geometry by to get the new scale. This ends up being the math equation, newScale / originalScale . Attached to this devlog are images, showing the window scaling fix in action as well as the scaling fix as it is used in my game. Now the scale of pixels stays exactly the same regardless of the scale of the window, and the 2nd block shown in the image with the Tiles picker is being scaled and rotated when the player hovers it. Overall, this project is becoming quite a bit larger than I originally intended as I work on it more while actually using it to make a real game. Thanks for reading this devlog!"}, {"post_id": 27962, "ts": "2026-07-13T22:18:53Z", "hours": 1.255, "text": "Another quick devlog as I’ve been adding features while trying to make an actual game with the engine! I realized that I hadn’t added offsets for colliders, trigger colliders or collision callbacks, so I added all of those and that works now, and I also realized I needed a special renderer that could draw using THREE.js’ InstancedMesh so I created the InstancedRenderer component that allows for that InstancedMesh to be used, this should afford a decent performance boost for any games that have the ground made up of tiles (if used correctly). The image attached is an image of the game I’ve started working on!"}, {"post_id": 27541, "ts": "2026-07-13T06:08:25Z", "hours": 1.1381, "text": "Another short devlog, again about UI! I got around to adding a proper button component to the engine that supports both a hover and click state! Currently I am using it in one of the demos for a button that slows down time to 1/10 speed when clicked. When I was trying to get this working, I realized I had a pretty major bug with how the scale of the window worked, which was causing issues with mouse inputs not lining up correctly with the engine’s visual output, but after fixing that it works great! The implementation for usage is also pretty simple with the Phoenix.Button() component just having two optional fields, one for onHoverCallback and one for onClickCallback. Here is an example of an onClickCallback being supplied to a button component: new Phoenix . Button (() => { app . args . timescale = ( app . args . timescale == 1 ) ? 0.1 : 1 }) Thanks for reading my boring UI yap again!!"}, {"post_id": 27482, "ts": "2026-07-13T02:51:20Z", "hours": 1.4086, "text": "Very small devlog this time! I’ve now added support for screen-space rendering of objects (rendering of objects relative to the screen rather than the world). This will be very important for adding proper UI components such as buttons, switches, sliders and text boxes to the engine later! With the addition of screen space rendering I also added a new component specifically for it, being the UIRenderer component. It behaves exactly like the standard Renderer component, but it renders to the THREE.js scene that the output of the main scene is rendered to for applying screen-space shaders. This also has the side effect of UI elements being able to ignore the current screen-space shader, so they don’t get distorted or become unreadable in any other way. Here’s a little code example for how the screen-space rendering works when creating an object: app . addObject ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 64 , 96 ), 0 , new Phoenix . Vector2 ( 16 , 16 )), new Phoenix . Sprite ( \" assets/brick.png \" ), new Phoenix . UIRenderer ( 1 ) ) This little bit of code would create an object at coordinates (64, 96) but it would follow the camera rather than staying put in the world! In my next devlog I plan to actually add components for proper interactivity with UI components! Thanks for reading my yap!! Byeeee!"}, {"post_id": 26985, "ts": "2026-07-12T03:38:26Z", "hours": 1.4139, "text": "Hiya there! Another devlog on this project!! This time I added an actual particle system to the engine that can be used to spawn a bunch of little particles. It’s still missing a bit of customization such as turning off gravity for particles or the ability to change particle’s initial velocity, but so far it isn’t causing any lag and seems to work well! I had to figure out THREE.js’ InstancedMesh system to get this working without making the game run horribly, but I got it and it works now! The docs are also updated to reflect this new feature. And the ParticleSystem is used like any other component by just adding it to an object like the following: app . addObject ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 0 , 0 ), 0 , new Phoenix . Vector2 ( 32 , 32 )), new Phoenix . ParticleSystem ( \" assets/brick.png \" , 10 , new Phoenix . Vector2 ( 24 , 24 )) ) ) The entire system for particles is self contained and doesn’t rely on any other components like the Renderer and Sprite because I felt it would be better to separate it due to the fact that the particles using an InstancedMesh, and the user might want to have particles have a different texture than their emitter. As shown in the images, the ParticleSystem can support a lot of particles and from some testing it is able to handle 10, 1000 and 10000 particles with no lag, but 100000 particles is stretching it a bit. I mean who would put over 10000 particles on screen at a time though, right?"}, {"post_id": 26131, "ts": "2026-07-10T19:01:01Z", "hours": 3.8183, "text": "Yay! Another devlog and even more hours poured into this project! This time I finally got around to reworking how the engine works to actually allow for objects to have children! In the past all objects were stored in a flat array which didn’t allow for any object parenting of any kind, but now the root of the scene is just another GameObject, so it can have children and those children can have children and so on forever. As you can see in the example photos, the brick object on the left has a smaller checkerboard-pattern object as a child of it that moves relative to it’s parent’s rotation and position. On the development side of things, adding objects to the scene as a whole remains exactly the same with the way the addition of objects simply being changed to having them be children of the scene root, but now all objects have a new method, GameObject.addChild(object: GameObject) . This allows any object have a child added to it, for example: player . addChild ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 0 , 0 ), 0 , new Phoenix . Vector2 ( 16 , 16 )), new Phoenix . Sprite ( \" assets/null.png \" ), new Phoenix . Renderer ( 1 ) )); This would just add a new smaller object to the player object with the null.png sprite, and this is exactly what is happening in the screenshots attached to this."}, {"post_id": 25126, "ts": "2026-07-09T04:22:25Z", "hours": 2.8756, "text": "I decided to use the feature I added to the engine a while ago that allows for custom screen space shaders to create a lighting shader for the game based on some simple raymarching! I’m going to work on getting it more polished and then implement it as a variable exposed by the main engine as something that can be used in any project. The usage of the shader isn’t too complicated, it just requires data about the lights to be supplied to the shader via uniforms. let lightPositions = [ new THREE . Vector2 ( - 128 , 128 ), new THREE . Vector2 ( 64 , 128 ) ] let lightScales = [ new THREE . Vector2 ( 512 , 512 ), new THREE . Vector2 ( 512 , 512 ) ] let lightColors = [ new THREE . Vector3 ( 1 , 0.3 , 0 ), new THREE . Vector3 ( 0 , 1 , 0.3 ) ] This would be supplied to the App’s options to override the shader. shaderOverride : { vertexShader : Phoenix . DefaultVertexShader , fragmentShader : LitShader , uniforms : { uLightPositions : { value : lightPositions }, uLightScales : { value : lightScales }, uLightColors : { value : lightColors } } } And then positions should be updated every frame to keep them in world space. app . addFrameIntervalCallback (() => { let lps = [] for ( const lightPos of lightPositions ) { const p = new THREE . Vector3 ( lightPos . x , lightPos . y , 0 ); p . project ( app . camera ); const x = ( p . x + 1 ) / 2 const y = ( p . y + 1 ) / 2 lps . push ( new THREE . Vector2 ( x , y )) } app . screenSpaceShader . uniforms . uLightPositions ! . value = lps let scls = [] for ( const lightScale of lightScales ) { const x = lightScale . x ! / rScale.x const y = lightScale . y ! / rScale.y scls . push ( new THREE . Vector2 ( x , y )) } app . screenSpaceShader . uniforms . uLightScales ! . value = scls }) Edit: I completely forgot about this but at some point I added support for animated sprites using the AnimatedSprite class which can be supplied an array of strings representing the paths to the image for each frame as well as a animation rate (number of game frames each animation frame is shown for)"}, {"post_id": 24576, "ts": "2026-07-08T08:10:21Z", "hours": 2.9547, "text": "I did a bunch of backend stuff, adding features and making the engine overall better. My most recent addition to this is the use of a unified renderer component, where rather than having separate components handling the rendering of text, canvas sprites and normal sprites individually and with duplicate code, the main renderer component automatically finds any sprite type and renders it! For example, in the scenes below: the text in past versions would have been rendered with a TextRenderer component, whereas now there is a TextSprite component that feeds a texture to a Renderer component on the object. New Version const text = new Phoenix . TextSprite ( \" Hello world! \" , { fontSize : 32 , backgroundColor : \" #7fefcf \" , padding : 8 }); app . addObject ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 0 , - 83 ), 0 , new Phoenix . Vector2 ( text . texture ! . width , text . texture ! . height )), text , new Phoenix . Renderer ( 1 ) )); Old Version app . addObject ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 0 , - 83 ), 0 , new Phoenix . Vector2 ( 0 , 0 )), new Phoenix . TextRenderer ( \" Hello world! \" , { fontSize : 32 , backgroundColor : \" #7fefcf \" , padding : 8 }, 1 )"}, {"post_id": 15461, "ts": "2026-06-25T04:17:31Z", "hours": 2.4086, "text": "Big update! I finally actually got around to making the demo scenes built with this engine publish on GitHub pages ( here ). I also added a circle collider component and a text renderer which in turn relies on a HTML Canvas Renderer so there’s also now an easier way to create procedural assets for games."}, {"post_id": 14176, "ts": "2026-06-23T05:13:33Z", "hours": 1.6892, "text": "I finally added support for getting inputs within a component without using a web API to register an event listener and then having to deal with destroying that when the object get unloaded! I then updated the test scene to reflect that with a new component added to each object in a tower that adds an impulse when the W key is pressed. The scene can also be switched with the H key."}, {"post_id": 10659, "ts": "2026-06-17T14:54:58Z", "hours": 3.1258, "text": "I added screen-space shader support for now, the shader can’t be overridden but I’ll change that as well as allowing for the shaders attached to individual objects to be overridden."}, {"post_id": 10375, "ts": "2026-06-17T01:44:28Z", "hours": 4.535, "text": "So far I’ve added all the basics, scenes, objects, physics implementation and rendering. The rendering is currently using a basic HTML canvas method, but I am planning to update it to THREE.js for faster rendering and support for complex shader effects. This will probably be a relatively short project and I probably wont make many devlogs for this. It’s kind of hard to show off an engine with images, and without showing the code, so I don’t know how much visual progress I’ll be able to show, but I’ll definately be able to show a lot more for the game I’m planning on making that will use this engine!"}]...
|
Title: Phoenix - Web Game Framework by @openchante Title: Phoenix - Web Game Framework by @openchanter | Stardance
Devlogs:
So far I’ve added all the basics, scenes, objects, physics implementation and rendering. The rendering is currently using a basic HTML canvas method, but I am planning to update it to THREE.js for faster rendering and support for complex shader effects. This will probably be a relatively short project and I probably wont make many devlogs for this. It’s kind of hard to show off an engine with images, and without showing the code, so I don’t know how much visual progress I’ll be able to show, but I’ll definately be able to show a lot more for the game I’m planning on making that will use this engine!
I added screen-space shader support for now, the shader can’t be overridden but I’ll change that as well as allowing for the shaders attached to individual objects to be overridden.
I finally added support for getting inputs within a component without using a web API to register an event listener and then having to deal with destroying that when the object get unloaded! I then updated the test scene to reflect that with a new component added to each object in a tower that adds an impulse when the W key is pressed. The scene can also be switched with the H key.
Big update! I finally actually got around to making the demo scenes built with this engine publish on GitHub pages ( here ). I also added a circle collider component and a text renderer which in turn relies on a HTML Canvas Renderer so there’s also now an easier way to create procedural assets for games.
I did a bunch of backend stuff, adding features and making the engine overall better. My most recent addition to this is the use of a unified renderer component, where rather than having separate components handling the rendering of text, canvas sprites and normal sprites individually and with duplicate code, the main renderer component automatically finds any sprite type and renders it! For example, in the scenes below: the text in past versions would have been rendered with a TextRenderer component, whereas now there is a TextSprite component that feeds a texture to a Renderer component on the object. New Version const text = new Phoenix . TextSprite ( " Hello world! " , { fontSize : 32 , backgroundColor : " #7fefcf " , padding : 8 }); app . addObject ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 0 , - 83 ), 0 , new Phoenix . Vector2 ( text . texture ! . width , text . texture ! . height )), text , new Phoenix . Renderer ( 1 ) )); Old Version app . addObject ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 0 , - 83 ), 0 , new Phoenix . Vector2 ( 0 , 0 )), new Phoenix . TextRenderer ( " Hello world! " , { fontSize : 32 , backgroundColor : " #7fefcf " , padding : 8 }, 1 )
I decided to use the feature I added to the engine a while ago that allows for custom screen space shaders to create a lighting shader for the game based on some simple raymarching! I’m going to work on getting it more polished and then implement it as a variable exposed by the main engine as something that can be used in any project. The usage of the shader isn’t too complicated, it just requires data about the lights to be supplied to the shader via uniforms. let lightPositions = [ new THREE . Vector2 ( - 128 , 128 ), new THREE . Vector2 ( 64 , 128 ) ] let lightScales = [ new THREE . Vector2 ( 512 , 512 ), new THREE . Vector2 ( 512 , 512 ) ] let lightColors = [ new THREE . Vector3 ( 1 , 0.3 , 0 ), new THREE . Vector3 ( 0 , 1 , 0.3 ) ] This would be supplied to the App’s options to override the shader. shaderOverride : { vertexShader : Phoenix . DefaultVertexShader , fragmentShader : LitShader , uniforms : { uLightPositions : { value : lightPositions }, uLightScales : { value : lightScales }, uLightColors : { value : lightColors } } } And then positions should be updated every frame to keep them in world space. app . addFrameIntervalCallback (() => { let lps = [] for ( const lightPos of lightPositions ) { const p = new THREE . Vector3 ( lightPos . x , lightPos . y , 0 ); p . project ( app . camera ); const x = ( p . x + 1 ) / 2 const y = ( p . y + 1 ) / 2 lps . push ( new THREE . Vector2 ( x , y )) } app . screenSpaceShader . uniforms . uLightPositions ! . value = lps let scls = [] for ( const lightScale of lightScales ) { const x = lightScale . x ! / rScale.x const y = lightScale . y ! / rScale.y scls . push ( new THREE . Vector2 ( x , y )) } app . screenSpaceShader . uniforms . uLightScales ! . value = scls }) Edit: I completely forgot about this but at some point I added support for animated sprites using the AnimatedSprite class which can be supplied an array of strings representing the paths to the image for each frame as well as a animation rate (number of game frames each animation frame is shown for)
Yay! Another devlog and even more hours poured into this project! This time I finally got around to reworking how the engine works to actually allow for objects to have children! In the past all objects were stored in a flat array which didn’t allow for any object parenting of any kind, but now the root of the scene is just another GameObject, so it can have children and those children can have children and so on forever. As you can see in the example photos, the brick object on the left has a smaller checkerboard-pattern object as a child of it that moves relative to it’s parent’s rotation and position. On the development side of things, adding objects to the scene as a whole remains exactly the same with the way the addition of objects simply being changed to having them be children of the scene root, but now all objects have a new method, GameObject.addChild(object: GameObject) . This allows any object have a child added to it, for example: player . addChild ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 0 , 0 ), 0 , new Phoenix . Vector2 ( 16 , 16 )), new Phoenix . Sprite ( " assets/null.png " ), new Phoenix . Renderer ( 1 ) )); This would just add a new smaller object to the player object with the null.png sprite, and this is exactly what is happening in the screenshots attached to this.
Hiya there! Another devlog on this project!! This time I added an actual particle system to the engine that can be used to spawn a bunch of little particles. It’s still missing a bit of customization such as turning off gravity for particles or the ability to change particle’s initial velocity, but so far it isn’t causing any lag and seems to work well! I had to figure out THREE.js’ InstancedMesh system to get this working without making the game run horribly, but I got it and it works now! The docs are also updated to reflect this new feature. And the ParticleSystem is used like any other component by just adding it to an object like the following: app . addObject ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 0 , 0 ), 0 , new Phoenix . Vector2 ( 32 , 32 )), new Phoenix . ParticleSystem ( " assets/brick.png " , 10 , new Phoenix . Vector2 ( 24 , 24 )) ) ) The entire system for particles is self contained and doesn’t rely on any other components like the Renderer and Sprite because I felt it would be better to separate it due to the fact that the particles using an InstancedMesh, and the user might want to have particles have a different texture than their emitter. As shown in the images, the ParticleSystem can support a lot of particles and from some testing it is able to handle 10, 1000 and 10000 particles with no lag, but 100000 particles is stretching it a bit. I mean who would put over 10000 particles on screen at a time though, right?
Very small devlog this time! I’ve now added support for screen-space rendering of objects (rendering of objects relative to the screen rather than the world). This will be very important for adding proper UI components such as buttons, switches, sliders and text boxes to the engine later! With the addition of screen space rendering I also added a new component specifically for it, being the UIRenderer component. It behaves exactly like the standard Renderer component, but it renders to the THREE.js scene that the output of the main scene is rendered to for applying screen-space shaders. This also has the side effect of UI elements being able to ignore the current screen-space shader, so they don’t get distorted or become unreadable in any other way. Here’s a little code example for how the screen-space rendering works when creating an object: app . addObject ( app . createObject ( new Phoenix . Transform ( new Phoenix . Vector2 ( 64 , 96 ), 0 , new Phoenix . Vector2 ( 16 , 16 )), new Phoenix . Sprite ( " assets/brick.png " ), new Phoenix . UIRenderer ( 1 ) ) This little bit of code would create an object at coordinates (64, 96) but it would follow the camera rather than staying put in the world! In my next devlog I plan to actually add components for proper interactivity with UI components! Thanks for reading my yap!! Byeeee!
Another short devlog, again about UI! I got around to adding a proper button component to the engine that supports both a hover and click state! Currently I am using it in one of the demos for a button that slows down time to 1/10 speed when clicked. When I was trying to get this working, I realized I had a pretty major bug with how the scale of the window worked, which was causing issues with mouse inputs not lining up correctly with the engine’s visual output, but after fixing that it works great! The implementation for usage is also pretty simple with the Phoenix.Button() component just having two optional fields, one for onHoverCallback and one for onClickCallback. Here is an example of an onClickCallback being supplied to a button component: new Phoenix . Button (() => { app . args . timescale = ( app . args . timescale == 1 ) ? 0.1 : 1 }) Thanks for reading my boring UI yap again!!
Another quick devlog as I’ve been adding features while trying to make an actual game with the engine! I realized that I hadn’t added offsets for colliders, trigger colliders or collision callbacks, so I added all of those and that works now, and I also realized I needed a special renderer that could draw using THREE.js’ InstancedMesh so I created the InstancedRenderer component that allows for that InstancedMesh to be used, this should afford a decent performance boost for any games that have the ground made up of tiles (if used correctly). The image attached is an image of the game I’ve started working on!
Another devlog as I continue to work on my other project that uses this engine as a dependency. Since I’ve been actually using this engine for making something real, I’ve noticed that it has quite a few flaws that I didn’t catch earlier on in the creation process. For example, when the window resized on the Y axis, the scale of the content within the window would also scale. This actually ended up causing a big issue with my new project as I had to convert screen-space mouse coordinates to positions in the world for placing objects in the editor. Fixing this was pretty simple and I just swapped out the old render resolution for a render scalar that gets multiplied by the window resolution to calculate the render resolution. Over the time of creating my new project there have also been some other small issues with things such as the button hitboxes and the engine not having the ability to resize objects in real time that I have since fixed. For the real time object resizing issue though, it was especially annoying because I had to resize the THREE.js Mesh object directly using the .scale.set() method on it which cannot be simply supplied with the size in pixels you want the object to be and is separate from the size of the geometry. To solve this I had to calculate how much I would have to multiply the scale of the geometry by to get the new scale. This ends up being the math equation, newScale / originalScale . Attached to this devlog are images, showing the window scaling fix in action as well as the scaling fix as it is used in my game. Now the scale of pixels stays exactly the same regardless of the scale of the window, and the 2nd block shown in the image with the Tiles picker is being scaled and rotated when the player hovers it. Overall, this project is becoming quite a bit larger than I originally intended as I work on it more while actually using it to make a real game. Thanks for reading this devlog!
Ships:
I made Phoenix, a web-based game framework using TypeScript! It is designed to be easy to use and quick to make projects with. I used THREE.js for rendering and Planck.js for the physics engine. The features available in the engine vary from simple rendering components to rigidbodies, UI systems and particle systems! The engine also supports a proper scene hierarchy with objects being able to have children that inherit their translation and rotation. The most challenging part of this was just trying to iron out all of the small bugs that kept popping up in different areas of the engine while I was trying to add a new feature somewhere. Just a note about the demo though, it is meant to just show off the features of the engine, and the demo is not the product of this project but rather the actual engine and it’s API that can be used to make games! I also plan to make an actual game using this engine as my next project for Stardance!...
|
1793944485.8809958
|
1794030885.8809958
|
|
46683
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944487.1446416
|
1794808487.1446416
|
|
46687
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793944488.017164
|
1794808488.017164
|
|
6578
|
Ytuwu by @heiligetomate | Stardance
|
heiligetomate
|
1
|
61.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-26T00:41:44Z", "hours": 61.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hey, I made a youtube downloader and thats basically it. You can download videos or audios from youtube or youtube music and do whatever you want with the downloaded stuff. I made this because I was using yt-dlp (a python youtube downloader) for my music library. But yt-dlp was not able to downlaod full channels so i built my own downloader in rust. This is my first big project and its still not done. There is a lot of stuff to do like better error handling or adding more features. If you want to try this out yourself, create a new rust project, add the following dependencies: [dependencies] ytuwu = \"0.2.1\" tokio = { version = \"1\", features = [\"full\"] } put this in your main file: use std ::{ fs :: create_dir_all , path :: Path }; use ytuwu :: Downloader ; #[tokio::main] async fn main () -> ytuwu :: Result < () > { let downloader = Downloader :: default (); let dwn = downloader .from_url ( \"https://music.youtube.com/watch?v=-206erZYyBo\" ) ? .as_media () ? .audio () .download () .await ? ; create_dir_all ( \"silly_path\" ) .unwrap (); dwn .save_media_stream ( Path :: new ( \"silly_path\" )) ? ; Ok (()) } and finally replace the url with any youtube url you want. This will download the sound of this video/song and will save it in a newly created directoy called “silly_path”. Hope you enjoy :3", "repo": "https://github.com/Heiligetomate/ytuwu", "demo": "https://crates.io/crates/ytuwu"}]...
|
[{"post_id": 82845, "ts": "202 [{"post_id": 82845, "ts": "2026-10-26T00:28:28Z", "hours": 1.5069, "text": "Final changes I fixed some stuff but now its ready i think. I also made a logo which took wayyyy too long (im horrible at using gimp)"}, {"post_id": 82746, "ts": "2026-10-25T18:38:31Z", "hours": 2.0072, "text": "Publish the lib on crates.io I added maaaaaany “.” because i forgot to add them which was ehm very very very annoying. But now its published, most stuff works I think and ill ship my project now :3"}, {"post_id": 82599, "ts": "2026-10-25T11:35:06Z", "hours": 3.6636, "text": "Fixing stuff I did not update or check on my project for a long time and youtube changed something that made the androidvr client I used previously not usable anymore because it stops sending data after ~1mb. I now changed the client to visionos which allows me to use my old structure without changing much. I will now try to ship my project because I dont really have any time left."}, {"post_id": 57353, "ts": "2026-08-29T13:59:29Z", "hours": 14.6839, "text": "Finally school again 😭 Somehow i forgot to devlog my work before vacation which means i have to do it now </3 My github commits tell me that i fixed many TODOs, improved my error enum and created a basic config which makes it easier to well configure what you want to download and how you want to download something."}, {"post_id": 13750, "ts": "2026-06-22T15:18:20Z", "hours": 9.8178, "text": "A lot of documentation documentation is really important for libraries and that’s why i spent the last ~8h with writing documentation I have 8118 lines of code in total and 931 of them are documentation i wrote the last hours which was a pain and not really fun to do. Also, while documenting I found many things I have to change and i basically farmed TODOs which is awesome because now i can fix many bugs :3"}, {"post_id": 12672, "ts": "2026-06-20T18:15:07Z", "hours": 10.2689, "text": "Changes Everything now uses the task pool and shared downloaded storage Modules are cleaner Improved AnyItags and AnyStreams Remove old, unused code Bundle support for Lists with the simple api New save function for channels Todos now Documentation Logs (More tests)"}, {"post_id": 5114, "ts": "2026-06-08T20:01:16Z", "hours": 5.285, "text": "I started restructuring the entire main Downloader struct. It now has a shared download-task-pool and a shared downloaded-pool. This allows downloading a fixed number of songs at the same time, which is useful when handling rate limits. Right now this is only implemented for single media streams, but the rest should not be too hard to implement - the basics are already there."}, {"post_id": 4232, "ts": "2026-06-07T13:59:50Z", "hours": 2.5894, "text": "fixed a bug for Itag::Highest changed the api (you can still use the old one) The video shows the usage of the new api:"}, {"post_id": 3684, "ts": "2026-06-06T18:50:37Z", "hours": 2.5417, "text": "new stuff all bundle download functions now take &[AnyItag] as a parameter instead of Vec. channels can now be downloaded as bundle add a usage warning in the readme found 2 new bugs 3: renamed some stuff streams have a fn to_any and i added better usage for streams in general some other stuff i forgot probably"}, {"post_id": 2408, "ts": "2026-06-04T21:26:43Z", "hours": 3.9672, "text": "I added a lot of tests to my library and changed some small things i cant remember."}, {"post_id": 2173, "ts": "2026-06-04T14:55:14Z", "hours": 4.2875, "text": "This is the first post on my project “ytuwu”. It’s a YouTube downloader written in rust. The current features can be viewed in my readme. I had this idea because ytdlp, the alternative written in python, does not allow the download of an entire channel, meaning you would have to extract all the singles, EPS and albums by yourself. I wanted something that could do that for me, so here is ytuwu (an ongoing project for ~2 months now). The last 4h were used to make the API more usable, so the user doesn’t have to specify the full path for the channel id/browse ID. I also implemented the default process so it can display media that is just queued and not being downlaoded right now. The attachment shows a full download of a playlist containing 13 songs at full audio quality. :3"}]...
|
Title: Ytuwu by @heiligetomate | Stardance
Devlog Title: Ytuwu by @heiligetomate | Stardance
Devlogs:
This is the first post on my project “ytuwu”. It’s a YouTube downloader written in rust. The current features can be viewed in my readme. I had this idea because ytdlp, the alternative written in python, does not allow the download of an entire channel, meaning you would have to extract all the singles, EPS and albums by yourself. I wanted something that could do that for me, so here is ytuwu (an ongoing project for ~2 months now). The last 4h were used to make the API more usable, so the user doesn’t have to specify the full path for the channel id/browse ID. I also implemented the default process so it can display media that is just queued and not being downlaoded right now. The attachment shows a full download of a playlist containing 13 songs at full audio quality. :3
I added a lot of tests to my library and changed some small things i cant remember.
new stuff all bundle download functions now take &[AnyItag] as a parameter instead of Vec. channels can now be downloaded as bundle add a usage warning in the readme found 2 new bugs 3: renamed some stuff streams have a fn to_any and i added better usage for streams in general some other stuff i forgot probably
fixed a bug for Itag::Highest changed the api (you can still use the old one) The video shows the usage of the new api:
I started restructuring the entire main Downloader struct. It now has a shared download-task-pool and a shared downloaded-pool. This allows downloading a fixed number of songs at the same time, which is useful when handling rate limits. Right now this is only implemented for single media streams, but the rest should not be too hard to implement - the basics are already there.
Changes Everything now uses the task pool and shared downloaded storage Modules are cleaner Improved AnyItags and AnyStreams Remove old, unused code Bundle support for Lists with the simple api New save function for channels Todos now Documentation Logs (More tests)
A lot of documentation documentation is really important for libraries and that’s why i spent the last ~8h with writing documentation I have 8118 lines of code in total and 931 of them are documentation i wrote the last hours which was a pain and not really fun to do. Also, while documenting I found many things I have to change and i basically farmed TODOs which is awesome because now i can fix many bugs :3
Finally school again 😭 Somehow i forgot to devlog my work before vacation which means i have to do it now </3 My github commits tell me that i fixed many TODOs, improved my error enum and created a basic config which makes it easier to well configure what you want to download and how you want to download something.
Fixing stuff I did not update or check on my project for a long time and youtube changed something that made the androidvr client I used previously not usable anymore because it stops sending data after ~1mb. I now changed the client to visionos which allows me to use my old structure without changing much. I will now try to ship my project because I dont really have any time left.
Publish the lib on crates.io I added maaaaaany “.” because i forgot to add them which was ehm very very very annoying. But now its published, most stuff works I think and ill ship my project now :3
Final changes I fixed some stuff but now its ready i think. I also made a logo which took wayyyy too long (im horrible at using gimp)
Ships:
Hey, I made a youtube downloader and thats basically it. You can download videos or audios from youtube or youtube music and do whatever you want with the downloaded stuff. I made this because I was using yt-dlp (a python youtube downloader) for my music library. But yt-dlp was not able to downlaod full channels so i built my own downloader in rust. This is my first big project and its still not done. There is a lot of stuff to do like better error handling or adding more features. If you want to try this out yourself, create a new rust project, add the following dependencies: [dependencies] ytuwu = "0.2.1" tokio = { version = "1", features = ["full"] } put this in your main file: use std ::{ fs :: create_dir_all , path :: Path }; use ytuwu :: Downloader ; #[tokio::main] async fn main () -> ytuwu :: Result < () > { let downloader = Downloader :: default (); let dwn = downloader .from_url ( "https://music.youtube.com/watch?v=-206erZYyBo" ) ? .as_media () ? .audio () .download () .await ? ; create_dir_all ( "silly_path" ) .unwrap (); dwn .save_media_stream ( Path :: new ( "silly_path" )) ? ; Ok (()) } and finally replace the url with any youtube url you want. This will download the sound of this video/song and will save it in a newly created directoy called “silly_path”. Hope you enjoy :3...
|
1793944488.907122
|
1794030888.907122
|