|
7503
|
Pc parts lister by @Fiskerz | Stardance
|
Fiskerz
|
1
|
77.0
|
1286
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-27T13:41:56Z", "hours": 77.0, "multiplier": 19.41, "payout": 1286, "blessing": "neutral", "text": "What is this? You are currently looking at a native windows app , written entirely in C# & XAML . The main goal of this app is to make for a pc hardware person like me, keeping track of components I might happen to have laying around a lot easier and incredibly organized, without having to use endless and ugly excel tables. It is my first ever project of this kind, as I’ve been always making games, or mods, but not actual apps. What was challenging/I’m proud of As I said this was the first project of this type I’ve made ever so learning XAML took me some real time and effort. The expandible system and the mark-down style parser are the real “trophies” here, the amount of time and effort they took is just still horryfic to me. But I’m extremely proud of myself for biting through them. Features I’ll only go through some of the most important features, as there’s just many smaller things to cover. You can view all of the features in the github repository’s README file that took me a pretty long time to write and decorate. There are so many features that I can’t even fit them within this posts text limits. Adding, searching up, viewing, editing and deleting Components You can do all of these with any Component. Adding and searching up components is pretty simple, you just click on the gigantic buttons on the window that you will first see. And once you open the search window you can then view in detail, edit and delete the components from there using the dedicated buttons. Mark-down style description parser, writer and viewer. One of the most difficult things I’ve done in this project, as getting it to fully work was really difficult, even more so due to it being my first time having to solve an issue like this. But hey you can: Write in bold , italic , bold-italic and have two different headings styles. See what you’re writing in a preview box placed next to the description writer View the rendered descriptions in the detail window afterwards. Making your own Parameters, as well as editing default ones, or removing them entirely This is the most difficult thing I’ve dealt with throughout the entire project. As let me tell you - rewriting the entire app into architecture where the app itself has no idea what concrete step it’s doing is pure hell. I called this the Expandible system and it revolves mainly around being dynamic and expandable. Instead of having a Component that has a string value for its model, you now have a Component that may, or may not have a Model parameter assigned in its parameters. And that specific Model parameter can hold some value. And now try explaining this to the app. Just hell to deal with. But hey it works and I am super happy with how it turned out. Thanks to it you can: Add your own parameters . You yourself can make any of available rules for it, all using a pretty simply navigatable UI. Edit current parameters just as easily as you can add parameters, you can also edit any parameters and shape them into your liking. Or.. Delete any parameter you now dislike, or have no interest/use for. The UI scales and renders your parameters all throughout the app, based on what parameters you set up. Filtering Components Once again, from any of the parameters you’ve set up you can use them to filter out specific components, using any kind of parameter you decided to add in. Multi-language support In the app settings you can swap out between English (Default) and Czech. And the language is implemented all accross the app. So much so that even the default parameters will be generated in your selected language. Testing and using You can download the app from the latest release on github for Windows 10/11. There is unfortunately no other way to publish this app, since it’s a native windows app. For more detail follow the guide in the README file.", "repo": "https://github.com/Catmaster543/PC-Parts-Lister", "demo": "https://github.com/Catmaster543/PC-Parts-Lister/releases/tag/v1.0.2"}]...
|
[{"post_id": 74472, "ts": "202 [{"post_id": 74472, "ts": "2026-09-27T13:39:43Z", "hours": 5.5408, "text": "Added QOL features, README rewrite, bugfixes & shipping preparations! After all this time- the app is finally entering the final stretch (atleast for its first ship). A pretty thorough testing has been done and I am now quite confident that there’s not much missing. I got some feedback from a friend of mine and used it to add in some things he found missing, soo shoutout to him! Added many warnings and pop-ups throughout the app . In the app there are many settings that if you tweak at the wrong time, or incorrectly you can get yourself into quite some mess. With these warnings it should be more easily preventable. Completely rewrote the README , so that it now includes many images, gifs and most importantly very good documentation of the features. Added translations for more things , such as when parameters are regenerated it is done so in your chosen language. Added watermark text to the add window . Since I’ve heard it multiple times now, that the text box for components name is not intuitive to click on at all this should fix it. Fixed many issues , ranging from parameters saving as their opposite type, to the app crashing just from opening settings. You can read through these in detail in the respective github commits. Ship preparations . I took some time to deal with these things, such as making the app as humanly simple to run as possible, thourough testing, making github releases and writing the README as well as the ship description. And that is probably it here. This is likely the last devlog before shipping, so hopefully see you there! Seeing this project for the first time? This project is a native windows app written in XAML and C#. It aims to make a software that would allow you to note down any pc components you might have lying around (which I doubt are too many people.. xd). The main reason why I am making it is 1) To make this app, as I would personally appreciate something like this and 2) To learn XAML and practice C#. This is my biggest project and I hope that it will help atleast someone one day. It is also my first time ever making any kind of app, instead of games/mods so I learn quite a bunch on this journey. If you find this project cool, or just want to stick with me on this journey be sure to hit the follow, ty!"}, {"post_id": 74151, "ts": "2026-09-26T19:39:02Z", "hours": 6.2444, "text": "Added multi-language support + settings + first README written! You might notice quite some time logged on this one. And let me tell you, you would not believe just how bad a simple mistake can be. I’ll get to this on the end of the devlog, for now let me tell you about the stuff that I’ve added. Added multi-language support . Now all text you see in the app is either dynamically generated based on the things you make, so that’s in your language, or use a key , which is then filled from the decently sized language tables I’ve written. Added English support . Up until now, the entirety of the app has been written in czech, my native language. But since I’ve now added the multi-language support I of course chose english as the first one to add. Now personally I will probably NOT be adding any other languages, as I don’t want to use google translate for them, since I know how choppy it can come out and personally don’t know any other languages on a tier high-enough to trust myself with writing the tables right. If anyone out there would be willing to translate the app into a language they can speak, I’m down! Added settings . Settings is actually a bit of a.. silly name to use here, as there’s only one setting there. Which is of course the language toggle. Written the first README . Now first clarifies only as first for this project, as I’ve written a few of these before, but this project is the largest one I’ve ever made, so it took me quite a bit of time to write this one. I’ll be improving it further, as it’s incomplete so far. And that’s it I think. The awful mistake I’ve made was forgetting to merge the github branches before starting this part and made an absolutely ridiculous amount of issues by that, such as the app mixing old and new codes and other terrible stuff. Outside these, I think that’s all for this one. I’m expecting this to finally be one of the last devlogs before the first ship, as there’s not much blocking me now from shipping. Seeing this project for the first time? This project is a native windows app written in XAML and C#. It aims to make a software that would allow you to note down any pc components you might have lying around (which I doubt are too many people.. xd). The main reason why I am making it is 1) To make this app, as I would personally appreciate something like this and 2) To learn XAML and practice C#. This is my biggest project and I hope that it will help atleast someone one day. It is also my first time ever making any kind of app, instead of games/mods so I learn quite a bunch on this journey. If you find this project cool, or just want to stick with me on this journey be sure to hit the follow, ty!"}, {"post_id": 73754, "ts": "2026-09-25T21:13:23Z", "hours": 2.4719, "text": "Added the custom settings from last time + custom parameters adding Devlog #9 for PC Parts Lister Soo as I said last time, I’ve now implemented the following: List option for string type parameters . This allows parameters to load as a selectable list of options, instead of just a text field. Allowing custom list entries . An extension to the list option, which when toggled also allows you to type out your own thing if none from the list suits your need. Custom numbers sufix . Just as I said last time- this enables you to set a custom sufix to number type parameters and will do one simple thing - wherever this parameter is displayed, your sufix will be displayed after the number, so instead of “Capacity: 500”, it will now be “Capacity: 500 GB”. That is ofc if you set the sufix to be GB. Adding custom parameters . Since you could edit current parameters last time, I now gave you the power to make your own parameters. Everything since I’ve began building the expandible system has been preparing for this moment and now it’s here. It took me just a few lines of code to add this, but thanks to the complex system I’ve built custom parameters are supported everywhere in the app. Bugfixes Fixed Possible parameters obtaining values . As simple and unimportant this sounds, Possible parameters act only ONLY as a sort of template. Thus no actual value should be assigned to them. And thanks to a bug in the code this was happening, which broke the app way more than I expected. Fixed filtering-related issues . There were issues where the filtering system would be unable to filter out correctly, despite everything being right. UI fixes , such as scrollbars in places that were missing. Seeing this project for the first time? This project is a native windows app written in XAML and C#. It aims to make a software that would allow you to note down any pc components you might have lying around (which I doubt are too many people.. xd). The main reason why I am making it is 1) To make this app, as I would personally appreciate something like this and 2) To learn XAML and practice C#. This is my biggest project and I hope that it will help atleast someone one day. It is also my first time ever making any kind of app, instead of games/mods so I learn quite a bunch on this journey. If you find this project cool, or just want to stick with me on this journey be sure to hit the follow, ty!"}, {"post_id": 73326, "ts": "2026-09-24T21:30:06Z", "hours": 5.9783, "text": "Added the parameters editing windows! Devlog #8 for PC Parts Lister Great day ya’ll. Added the edit parameters window , which features the following: See all current parameters Edit current parameters Delete current parameters Added the parameter edit window itself , which you can from the previous window and it allows you to: Change the parameter name Change the parameters ID Select if the parameter is either text, or a number Change the possible values in case of text Set if the parameter is supposed to be in a list in the case of text Set if the parameter can be edited, or just selected from set values in case of text Set a custom suffix to number type parameters, for example if you want to add a parameter for storage capacity it would be weird to have just “500”. 500 potatoes? You can use this to instead show “500 Gb”. Much better ain’t it? In cases of all these three new settings - they are only selectable here and the app saves them, but they are yet to be implemented! Added and edited the main window layout , adding the parameter settings button. And that is about it, hopefully se any one of you around! Seeing this project for the first time? This project is a native windows app written in XAML and C#. It aims to make a software that would allow you to note down any pc components you might have lying around (which I doubt are too many people.. xd). The main reason why I am making it is 1) To make this app, as I would personally appreciate something like this and 2) To learn XAML and practice C#. This is my biggest project and I hope that it will help atleast someone one day. It is also my first time ever making any kind of app, instead of games/mods so I learn quite a bunch on this journey. If you find this project cool, or just want to stick with me on this journey be sure to hit the follow, ty!"}, {"post_id": 72368, "ts": "2026-09-22T19:27:35Z", "hours": 2.995, "text": "Finished migrating the filter window, added back category selection buttons, filtering by favorite and searching up components by name! Devlog #7 for PC Parts Lister Before I start - WHY THE HELL DOES THE REVIEW PROCESS ON MY OTHER PROJECT TAKE SOO LONG? My other project, the Sponsor system has been under review for OVER 12 DAYS now, anyone got any idea what’s up with that? Either way, to the actual devlog now- Soo since last time not any crazy time has passed, although I still did quite some work and want to write a devlog before heading onto the next parts that I assume will take a little while. Added searching components up by name back. Just like the other features, this has been implemented before already, but due to the migration to the expandible (= aka. dynamic) system has been broken. Added filtering by favorites back. Soo you can filter out all of your favorited components. Added back the category buttons . They behave just as before, you click on a category and see components under that category. Pretty neat, no? A whole lot of bugfixing and testing . Since last time I’ve discovered quite an insane amount of bugs and had to do patches almost constantly. Not to mention I had to pretty deeply test out all of the features to make sure there are not any holes I missed. But I believe not. Anyways I think that’s mostly it this time, I gotta say though that I should really hurry up with this project to finish it on time, soo cya! Seeing this project for the first time? This project is a native windows app written in XAML and C#. It aims to make a software that would allow you to note down any pc components you might have lying around (which I doubt are too many people.. xd). The main reason why I am making it is 1) To make this app, as I would personally appreciate something like this and 2) To learn XAML and practice C#. This is my biggest project and I hope that it will help atleast someone one day. It is also my first time ever making any kind of app, instead of games/mods so I learn quite a bunch on this journey. If you find this project cool, or just want to stick with me on this journey be sure to hit the follow, ty!"}, {"post_id": 70833, "ts": "2026-09-19T20:56:29Z", "hours": 6.3892, "text": "Added support for filtering by numbers and text for the new system! Devlog #6 for PC Parts Lister Since last time I’ve began work on the expandible system quite some time has passed and I’ve worked on other projects in the meantime, but here am I now to hopefully finish this. Soo.. Added support to the filtering window for the new system, meaning it now generates the parameters dynamically, just like add window does Added back filtering by numbers , such as wattage and other number based parameters, with the old smaller/bigger/equal toggles Added back filtering by text so long story short - you can filter the other things that are not in numbers, such as names, series, subseries, etc. Added the reset filter button back . Pretty self explanatory I think, ain’t it? Many bugfixes . Since last time’s revert to the new system old things just keep on breaking and breaking and I have to constantly patch/disable features (temporarily) till I am able to fix them. Outside that I think that’s mostly it for this time, the main eater of time here was me really just spending a whole lot of time figuring out the architecture that would work for this whole system and let me tell you - it’s a real nightmare to think about. (wouldn’t be surprised if I had nightmares abt it tonight lol) Seeing this project for the first time? This project is a native windows app written in XAML and C#. It aims to make a software that would allow you to note down any pc components you might have lying around (which I doubt are too many people.. xd). The main reason why I am making it is 1) To make this app, as I would personally appreciate something like this and 2) To learn XAML and practice C#. This is my biggest project and I hope that it will help atleast someone one day. It is also mz first time making anz kind of app, instead of games/mods so I learn quite a bunch on this journey. If you find this project cool, or just want to stick with me on this journey be sure to stick around and hit the follow, ty!"}, {"post_id": 64275, "ts": "2026-09-08T15:38:48Z", "hours": 6.49, "text": "Overhauled the Add window + started work on the expandible system! Devlog #5 for PC Parts Lister This is a change I’ve long anticipated and feared , but it should elevate the app by entire levels higher. Now what is the Expandible system? Up until now you could only use pre-specified, hardcoded parameters with very little flexibility to it. The expandible system aims to completely overhaul the way information is handled in the app , which will allow for custom parameters, parameter options, etc. etc. in the future. The biggest issue with that is the transfer from the current system. As of now I had to purposely break big chunks of the app for the sake of testing the basics and I will have to rebuild it back up, just with the expandible system. Overhaul of the Add window Since I’ve started the expandible system, the Add window, as one of the most outdated (both technically and visually) had to go first. Also this was due to me needing a way to add in components using the new system outside having to hard-code each tester. I think it is decent, but it is not finished yet, keep that in mind! A majority of the windows overhaul was technical , but I made sure to use the way more recent UI style from Detail and Edit windows that got updated recently to improve the visuals atleast a bit. I think there’s not all that much more I can specify as of right now, but when the system is done I’ll be sure to write some more about it, soo cya for now! Seeing this project for the first time? This project is a native windows app written in XAML and C#. It aims to make a software that would allow you to note down any pc components you might have lying around (which I doubt are too many people.. xd). The main reason why I am making it is 1) To make this app, as I would personally appreciate something like this and 2) To learn XAML and practice C#. This is my biggest project and I hope that it will help atleast someone one day. If you find this project cool be sure to stick around and hit the follow, thx!"}, {"post_id": 43957, "ts": "2026-08-09T12:38:35Z", "hours": 8.3703, "text": "Improved the description by a whole new level! Devlog #4 This time I didn’t forget to post a devlog, so yay I don’t lose the payout on this one- Anyways my focus here was to make a pretty simple yet convenient description system, because the original one was… let’s say way too simple ( just plain text ). So to improve it I changed it into a Markdown-style system . So what did I add/change? An entire new renderer for the description in Detail Window . I had to write a custom parser for it in order for it to read bold, italic and other styles, more on them later though- An entirely new description editor in the Edit Window. Since I do not have the skill, time, or interest in making a live-preview editor that apps like obsidian have I chose a different approach. You have a regular text field with buttons for each function added (such as bold, etc.). On the other half you have a preview window that updates after you stop writing automatically (thus preventing lag) and displays a preview of what you wrote. Bold, Italic, BoldItalic, Heading & Small Heading are all the styles I added (maybe for now, maybe for good.). Each and every single one of these has a button, that either turns on or off that style. And that’s it for now I think. Seeing this project for the first time? This project is a windows app written in XAML and C#. It aims to make a software that would allow you to note down any pc components you might have lying around (which I doubt are too many people.. xd). The main reason why I am making it is 1) To make this app, as I would personally appreciate something like this and 2) To learn XAML and practice C#. This is my biggest project and I hope that it will help atleast someone one day. If you find this project cool be sure to stick around!"}, {"post_id": 24247, "ts": "2026-07-07T18:00:38Z", "hours": 17.6844, "text": "Devlog #3 for PC Parts Lister Alright, so I may, or may not have forgotten to post any updates in a while and quite a lot of things have been added, so here’s a small overview: Complete visual (and technical) overhaul of the Edit and Detail window . I improved their overall visuals, added a lot of new things, such as the photogallery, all while fixing some older bugs and issues. Addition of a whole new photogallery , to both edit and detail window. With it you can now have multiple different pictures for each component + a main picture. You can click on each picture to view them in a new window; in their full scale. You can also delete each picture, or in the case of the main picture you can also swap it out for a new one. In the full picture view you can also cycle between the components individual pictures, just like in most photogallery apps. Newly added description , it is very simple, but you can have a description at the very least. I am currently working on a whole new description system with MarkDown support, so you can make bold text , italic , or things like headings and paragraphs. Also I added the ability to favorite your favorite components and sort by that. It is quite a simple feature but in my opinion it is a nice to have feature. Alongside this I added the ability to filter components, so now you can easily separate your fav components. It is quite a lot of stuff to say the least and I’ll try my best from now on to do the devlogs in their respective times. See the 2 people who even read these in the next one!"}, {"post_id": 8651, "ts": "2026-06-14T11:35:07Z", "hours": 12.955, "text": "Devlog #2 for PC Parts Lister Main addition: Super specific and smart filtering system, allowing to seamlessly filter your components; by name, by type, even by things like amount! List of important changes: Added the smart filtering system window Added the amount value for components Re-used part of code from adding components Completely overhauled the re-used code, to be smarter, more effecient and way more easily expandable in the future Added a smart error reporting inside the filtering window, informing you if there’s something wrong Changed the way certain components values are stored Added and improved a few already existing button designs Improved certain behaviours of windows Fixed issues when opening the app in full-screen Fixed components saving with unrealistic values (for example having a SSD with the capacity “donkey”)"}, {"post_id": 2755, "ts": "2026-06-05T15:07:41Z", "hours": 1.7581, "text": "I just added the ability to search up by name"}]...
|
Title: Pc parts lister by @Fiskerz | Stardance
De Title: Pc parts lister by @Fiskerz | Stardance
Devlogs:
I just added the ability to search up by name
Devlog #2 for PC Parts Lister Main addition: Super specific and smart filtering system, allowing to seamlessly filter your components; by name, by type, even by things like amount! List of important changes: Added the smart filtering system window Added the amount value for components Re-used part of code from adding components Completely overhauled the re-used code, to be smarter, more effecient and way more easily expandable in the future Added a smart error reporting inside the filtering window, informing you if there’s something wrong Changed the way certain components values are stored Added and improved a few already existing button designs Improved certain behaviours of windows Fixed issues when opening the app in full-screen Fixed components saving with unrealistic values (for example having a SSD with the capacity “donkey”)
Devlog #3 for PC Parts Lister Alright, so I may, or may not have forgotten to post any updates in a while and quite a lot of things have been added, so here’s a small overview: Complete visual (and technical) overhaul of the Edit and Detail window . I improved their overall visuals, added a lot of new things, such as the photogallery, all while fixing some older bugs and issues. Addition of a whole new photogallery , to both edit and detail window. With it you can now have multiple different pictures for each component + a main picture. You can click on each picture to view them in a new window; in their full scale. You can also delete each picture, or in the case of the main picture you can also swap it out for a new one. In the full picture view you can also cycle between the components individual pictures, just like in most photogallery apps. Newly added description , it is very simple, but you can have a description at the very least. I am currently working on a whole new description system with MarkDown support, so you can make bold text , italic , or things like headings and paragraphs. Also I added the ability to favorite your favorite components and sort by that. It is quite a simple feature but in my opinion it is a nice to have feature. Alongside this I added the ability to filter components, so now you can easily separate your fav components. It is quite a lot of stuff to say the least and I’ll try my best from now on to do the devlogs in their respective times. See the 2 people who even read these in the next one!
Improved the description by a whole new level! Devlog #4 This time I didn’t forget to post a devlog, so yay I don’t lose the payout on this one- Anyways my focus here was to make a pretty simple yet convenient description system, because the original one was… let’s say way too simple ( just plain text ). So to improve it I changed it into a Markdown-style system . So what did I add/change? An entire new renderer for the description in Detail Window . I had to write a custom parser for it in order for it to read bold, italic and other styles, more on them later though- An entirely new description editor in the Edit Window. Since I do not have the skill, time, or interest in making a live-preview editor that apps like obsidian have I chose a different approach. You have a regular text field with buttons for each function added (such as bold, etc.). On the other half you have a preview window that updates after you stop writing automatically (thus preventing lag) and displays a preview of what you wrote. Bold, Italic, BoldItalic, Heading & Small Heading are all the styles I added (maybe for now, maybe for good.). Each and every single one of these has a button, that either turns on or off that style. And that’s it for now I think. Seeing this project for the first time? This project is a windows app written in XAML and C#. It aims to make a software that would allow you to note down any pc components you might have lying around (which I doubt are too many people.. xd). The main reason why I am making it is 1) To make this app, as I would personally appreciate something like this and 2) To learn XAML and practice C#. This is my biggest project and I hope that it will help atleast someone one day. If you find this project cool be sure to stick around!
Overhauled the Add window + started work on the expandible system! Devlog #5 for PC Parts Lister This is a change I’ve long anticipated and feared , but it should elevate the app by entire levels higher. Now what is the Expandible system? Up until now you could only use pre-specified, hardcoded parameters with very little flexibility to it. The expandible system aims to completely overhaul the way information is handled in the app , which will allow for custom parameters, parameter options, etc. etc. in the future. The biggest issue with that is the transfer from the current system. As of now I had to purposely break big chunks of the app for the sake of testing the basics and I will have to rebuild it back up, just with the expandible system. Overhaul of the Add window Since I’ve started the expandible system, the Add window, as one of the most outdated (both technically and visually) had to go first. Also this was due to me needing a way to add in components using the new system outside having to hard-code each tester. I think it is decent, but it is not finished yet, keep that in mind! A majority of the windows overhaul was technical , but I made sure to use the way more recent UI style from Detail and Edit windows that got updated recently to improve the visuals atleast a bit. I think there’s not all that much more I can specify as of right now, but when the system is done I’ll be sure to write some more about it, soo cya for now! Seeing this project for the first time? This project is a native windows app written in XAML and C#. It aims to make a software that would allow you to note down any pc components you might have lying around (which I doubt are too many people.. xd). The main reason why I am making it is 1) To make this app, as I would personally appreciate something like this and 2) To learn XAML and practice C#. This is my biggest project and I hope that it will help atleast someone one day. If you find this project cool be sure to stick around and hit the follow, thx!
Added support for filtering by numbers and text for the new system! Devlog #6 for PC Parts Lister Since last time I’ve began work on the expandible system quite some time has passed and I’ve worked on other projects in the meantime, but here am I now to hopefully finish this. Soo.. Added support to the filtering window for the new system, meaning it now generates the parameters dynamically, just like add window does Added back filtering by numbers , such as wattage and other number based parameters, with the old smaller/bigger/equal toggles Added back filtering by text so long story short - you can filter the other things that are not in numbers, such as names, series, subseries, etc. Added the reset filter button back . Pretty self explanatory I think, ain’t it? Many bugfixes . Since last time’s revert to the new system old things just keep on breaking and breaking and I have to constantly patch/disable features (temporarily) till I am able to fix them. Outside that I think that’s mostly it for this time, the main eater of time here was me really just spending a whole lot of time figuring out the architecture that would work for this whole system and let me tell you - it’s a real nightmare to think about. (wouldn’t be surprised if I had nightmares abt it tonight lol) Seeing this project for the first time? This project is a native windows app written in XAML and C#. It aims to make a software that would allow you to note down any pc components you might have lying around (which I doubt are too many people.. xd). The main reason why I am making it is 1) To make this app, as I would personally appreciate something like this and 2) To learn XAML and practice C#. This is my biggest project and I hope that it will help atleast someone one day. It is also mz first time making anz kind of app, instead of games/mods so I learn quite a bunch on this journey. If you find this project cool, or just want to stick with me on this journey be sure to stick around and hit the follow, ty!
Finished migrating the filter window, added back category selection buttons, filtering by favorite and searching up components by name! Devlog #7 for PC Parts Lister Before I start - WHY THE HELL DOES THE REVIEW PROCESS ON MY OTHER PROJECT TAKE SOO LONG? My other project, the Sponsor system has been under review for OVER 12 DAYS now, anyone got any idea what’s up with that? Either way, to the actual devlog now- Soo since last time not any crazy time has passed, although I still did quite some work and want to write a devlog before heading onto the next parts that I assume will take a little while. Added searching components up by name back. Just like the other features, this has been implemented before already, but due to the migration to the expandible (= aka. dynamic) system has been broken. Added filtering by favorites back. Soo you can filter out all of your favorited components. Added back the category buttons . They behave just as before, you click on a category and see components under that category. Pretty neat, no? A whole lot of bugfixing and testing . Since last time I’ve discovered quite an insane amount of bugs and had to do patches almost constantly. Not to mention I had to pretty deeply test out all of the features to make sure there are not any holes I missed. But I believe not. Anyways I think that’s mostly it this time, I gotta say though that I should really hurry up with this project to finish it on time, soo cya! Seeing this project for the first time? This project is a native windows app written in XAML and C#. It aims to make a software that would allow you to note down any pc components you might have lying around (which I doubt are too many people.. xd). The main reason why I am making it is 1) To make this app, as I would personally appreciate something like this and 2) To learn XAML and practice C#. This is my biggest project and I hope that it will help atleast someone one day. It is also my first time ever making any kind of app, instead of games/mods so I learn quite a bunch on this journey. If you find this project cool, or just want to stick with me on this journey be sure to hit the follow, ty!
Added the parameters editing windows! Devlog #8 for PC Parts Lister Great day ya’ll. Added the edit parameters window , which features the following: See all current parameters Edit current parameters Delete current parameters Added the parameter edit window itself , which you can from the previous window and it allows you to: Change the parameter name Change the parameters ID Select if the parameter is either text, or a number Change the possible values in case of text Set if the parameter is supposed to be in a list in the case of text Set if the parameter can be edited, or just selected from set values in case of text Set a custom suffix to number type parameters, for example if you want to add a parameter for storage capacity it would be weird to have just “500”. 500 potatoes? You can use this to instead show “500 Gb”. Much better ain’t it? In cases of all these three new settings - they are only selectable here and the app saves them, but they are yet to be implemented! Added and edited the main window layout , adding the parameter settings button. And that is about it, hopefully se any one of you around! Seeing this project for the first time? This project is a native windows app written in XAML and C#. It aims to make a software that would allow you to note down any pc components you might have lying around (which I doubt are too many people.. xd). The main reason why I am making it is 1) To make this app, as I would personally appreciate something like this and 2) To learn XAML and practice C#. This is my biggest project and I hope that it will help atleast someone one day. It is also my first time ever making any kind of app, instead of games/mods so I learn quite a bunch on this journey. If you find this project cool, or just want to stick with me on this journey be sure to hit the follow, ty!
Added the custom settings from last time + custom parameters adding Devlog #9 for PC Parts Lister Soo as I said last time, I’ve now implemented the following: List option for string type parameters . This allows parameters to load as a selectable list of options, instead of just a text field. Allowing custom list entries . An extension to the list option, which when toggled also allows you to type out your own thing if none from the list suits your need. Custom numbers sufix . Just as I said last time- this enables you to set a custom sufix to number type parameters and will do one simple thing - wherever this parameter is displayed, your sufix will be displayed after the number, so instead of “Capacity: 500”, it will now be “Capacity: 500 GB”. That is ofc if you set the sufix to be GB. Adding custom parameters . Since you could edit current parameters last time, I now gave you the power to make your own parameters. Everything since I’ve began building the expandible system has been preparing for this moment and now it’s here. It took me just a few lines of code to add this, but thanks to the complex system I’ve built custom parameters are supported everywhere in the app. Bugfixes Fixed Possible parameters obtaining values . As simple and unimportant this sounds, Possible parameters act only ONLY as a sort of template. Thus no actual value should be assigned to them. And thanks to a bug in the code this was happening, which broke the app way more than I expected. Fixed filtering-related issues . There were issues where the filtering system would be unable to filter out correctly, despite everything being right. UI fixes , such as scrollbars in places that were missing. Seeing this project for the first time? This project is a native windows app written in XAML and C#. It aims to make a software that would allow you to note down any pc components you might have lying around (which I doubt are too many people.. xd). The main reason why I am making it is 1) To make this app, as I would personally appreciate something like this and 2) To learn XAML and practice C#. This is my biggest project and I hope that it will help atleast someone one day. It is also my first time ever making any kind of app, instead of games/mods so I learn quite a bunch on this journey. If you find this project cool, or just want to stick with me on this journey be sure to hit the follow, ty!
Added multi-language support + settings + first README written! You might notice quite some time logged on this one. And let me tell you, you would not believe just how bad a simple mistake can be. I’ll get to this on the end of the devlog, for now let me tell you about the stuff that I’ve added. Added multi-language support . Now all text you see in the app is either dynamically generated based on the things you make, so that’s in your language, or use a key , which is then filled from the decently sized language tables I’ve written. Added English support . Up until now, the entirety of the app has been written in czech, my native language. But since I’ve now added the multi-language support I of course chose english as the first one to add. Now personally I will probably NOT be adding any other languages, as I don’t want to use google translate for them, since I know how choppy it can come out and personally don’t know any other languages on a tier high-enough to trust myself with writing the tables right. If anyone out there would be willing to translate the app into a language they can speak, I’m down! Added settings . Settings is actually a bit of a.. silly name to use here, as there’s only one setting there. Which is of course the language toggle. Written the first README . Now first clarifies only as first for this project, as I’ve written a few of these before, but this project is the largest one I’ve ever made, so it took me quite a bit of time to write this one. I’ll be improving it further, as it’s incomplete so far. And that’s it I think. The awful mistake I’ve made was forgetting to merge the github branches before starting this part and made an absolutely ridiculous amount of issues by that, such as the app mixing old and new codes and other terrible stuff. Outside these, I think that’s all for this one. I’m expecting this to finally be one of the last devlogs before the first ship, as there’s not much blocking me now from shipping. Seeing this project for the first time? This project is a native windows app written in XAML and C#. It aims to make a software that would allow you to note down any pc components you might have lying around (which I doubt are too many people.. xd). The main reason why I am making it is 1) To make this app, as I would personally appreciate something like this and 2) To learn XAML and practice C#. This is my biggest project and I hope that it will help atleast someone one day. It is also my first time ever making any kind of app, instead of games/mods so I learn quite a bunch on this journey. If you find this project cool, or just want to stick with me on this journey be sure to hit the follow, ty!
Added QOL features, README rewrite, bugfixes & shipping preparations! After all this time- the app is finally entering the final stretch (atleast for its first ship). A pretty thorough testing has been done and I am now quite confident that there’s not much missing. I got some feedback from a friend of mine and used it to add in some things he found missing, soo shoutout to him! Added many warnings and pop-ups throughout the app . In the app there are many settings that if you tweak at the wrong time, or incorrectly you can get yourself into quite some mess. With these warnings it should be more easily preventable. Completely rewrote the README , so that it now includes many images, gifs and most importantly very good documentation of the features. Added translations for more things , such as when parameters are regenerated it is done so in your chosen language. Added watermark text to the add window . Since I’ve heard it multiple times now, that the text box for components name is not intuitive to click on at all this should fix it. Fixed many issues , ranging from parameters saving as their opposite type, to the app crashing just from opening settings. You can read through these in detail in the respective github commits. Ship preparations . I took some time to deal with these things, such as making the app as humanly simple to run as possible, thourough testing, making github releases and writing the README as well as the ship description. And that is probably it here. This is likely the last devlog before shipping, so hopefully see you there! Seeing this project for the first time? This project is a native windows app written in XAML and C#. It aims to make a software that would allow you to note down any pc components you might have lying around (which I doubt are too many people.. xd). The main reason why I am making it is 1) To make this app, as I would personally appreciate something like this and 2) To learn XAML and practice C#. This is my biggest project and I hope that it will help atleast someone one day. It is also my first time ever making any kind of app, instead of games/mods so I learn quite a bunch on this journey. If you find this project cool, or just want to stick with me on this journey be sure to hit the follow, ty!
Ships:
What is this? You are currently looking at a native windows app , written entirely in C# & XAML . The main goal of this app is to make for a pc hardware person like me, keeping track of components I might happen to have laying around a lot easier and incredibly organized, without having to use endless and ugly excel tables. It is my first ever project of this kind, as I’ve been always making games, or mods, but not actual apps. What was challenging/I’m proud of As I said this was the first project of this type I’ve made ever so learning XAML took me some real time and effort. The expandible system and the mark-down style parser are the real “trophies” here, the amount of time and effort they took is just still horryfic to me. But I’m extremely proud of myself for biting through them. Features I’ll only go through some of the most important features, as there’s just many smaller things to cover. You can view all of the features in the github repository’s README file that took me a pretty long time to write and decorate. There are so many features that I can’t even fit them within this posts text limits. Adding, searching up, viewing, editing and deleting Components You can do all of these with any Component. Adding and searching up components is pretty simple, you just click on the gigantic buttons on the window that you will first see. And once you open the search window you can then view in detail, edit and delete the components from there using the dedicated buttons. Mark-down style description parser, writer and viewer. One of the most difficult things I’ve done in this project, as getting it to fully work was really difficult, even more so due to it being my first time having to solve an issue like this. But hey you can: Write in bold , italic , bold-italic and have two different headings styles. See what you’re writing in a preview box placed next to the description writer View the rendered descriptions in the detail window afterwards. Making your own Parameters, as well as editing default ones, or removing them entirely This is the most difficult thing I’ve dealt with throughout the entire project. As let me tell you - rewriting the entire app into architecture where the app itself has no idea what concrete step it’s doing is pure hell. I called this the Expandible system and it revolves mainly around being dynamic and expandable. Instead of having a Component that has a string value for its model, you now have a Component that may, or may not have a Model parameter assigned in its parameters. And that specific Model parameter can hold some value. And now try explaining this to the app. Just hell to deal with. But hey it works and I am super happy with how it turned out. Thanks to it you can: Add your own parameters . You yourself can make any of available rules for it, all using a pretty simply navigatable UI. Edit current parameters just as easily as you can add parameters, you can also edit any parameters and shape them into your liking. Or.. Delete any parameter you now dislike, or have no interest/use for. The UI scales and renders your parameters all throughout the app, based on what parameters you set up. Filtering Components Once again, from any of the parameters you’ve set up you can use them to filter out specific components, using any kind of parameter you decided to add in. Multi-language support In the app settings you can swap out between English (Default) and Czech. And the language is implemented all accross the app. So much so that even the default parameters will be generated in your selected language. Testing and using You can download the app from the latest release on github for Windows 10/11. There is unfortunately no other way to publish this app, since it’s a native windows app. For more detail follow the guide in the README file....
|
1792853322.6429143
|
1792939722.6429143
|
|
48315
|
Storm by @Draaal | Stardance
|
Draaal
|
1
|
79.0
|
1279
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-01T20:25:22Z", "hours": 79.0, "multiplier": 18.99, "payout": 1279, "blessing": "neutral", "text": "storm I made a rules engine for the card game MTG. Its basically a giant state machine. You tell it what the players do and based on that it changes the game state. My experience The most challenging thing by far was finding a data model that would allow everything you can do in MTG. And since cards are written in english, there are A LOT of possible actions. Shiny new things I learned I finallyyy have a proper understanding of generics; before it was just this “magic in angle brackets” Pros & Cons of different data structures while I decided what to use for storing cards Experience in how to manage a project that has > 10 files. Might actually be the most valuable thing I gained from all of this.. A somewhat decent understanding of lifetimes in rust Also I finally had a look at metaprogramming with macros (only declarative macros though) I am proud of this The thing I am really proud of in here is how you can have these generic components that define behaviour or targets or such an how you can then use them to create cards as pure data through the power of generics and macros. They are literally just a constant in the code. My experience with AI Later in the implementation when my data structure was mostly fixed I tried having an AI agent do some of the boring work of hooking things up, but it didn’t work. And by that I mean it was pretty awful. It didn’t understand my design, reinvented the wheel several times, took shortcuts that would work for exactly this one card I asked about and just created wrong behaviour. Maybe this was a me problem, because I provided bad context, but I think I will stick writing code by hand for a while longer.", "repo": "https://github.com/andraaal/storm", "demo": "https://crates.io/crates/storm-engine"}]...
|
[{"post_id": 75713, "ts": "202 [{"post_id": 75713, "ts": "2026-09-30T20:35:17Z", "hours": 2.5422, "text": "#12 Of course there is an extension of one month right as I was going to ship… Anyway I published it on crates.io, I added some minimal executable example, did the README and added some metadata for publication. And I drew this wonderful new banner. Its a bit whacky, but I like it"}, {"post_id": 75316, "ts": "2026-09-29T18:52:32Z", "hours": 7.1283, "text": "#11 Devlog (AI adventure) So, since stardance ends soon I have to ship this and I am not sure if I can manage in time. So I had a look at AI coding and how to do it properly, because I tried vibe-coding before and it was abysmal. And I have to say it was miles ahead of anything else AI has ever done for me, when you use some specialized skills, create a roadmap first, split it into tickets (The AI even created tickets on GitHub for whatever godforsaken reason; It knew this is a solo project), structure your work, … It is also a TON more work. And it was still lacking. Maybe it was because my student subscription isn’t that powerful, maybe MTG is just too complex or I didn’t explain my messed up design well enough to the agent. Either way I wasted a bunch more time and … yeah, here’s hoping that I will get a working v0.1 alpha in time!"}, {"post_id": 68841, "ts": "2026-09-15T20:56:08Z", "hours": 7.1406, "text": "#10 Devlog How could I forget git THIS hard??? I didn’t make a single commit in like the last 20 hours. And now everything is so different that I might as well make a new repo. Also the line count in the screenshots is bugged somehow. Its more like +28XX lines. And it took THREE screenshots!! Anyways, heres an actual update: Now casting spells is finally complete (kinda) and static abilities work too. They even share some code through common “behaviour”. Thats just some common action that can be executed on the game state. Also with the help of a few todo! macros (Magic for fixing anything, but throws at runtime) the code finally compiles again. For like the second time in the entire development. There is bound to be a million bugs in there…."}, {"post_id": 66240, "ts": "2026-09-11T23:06:07Z", "hours": 8.4828, "text": "#9 Devlog Casting spells is now almost complete, and my overengineered type system got even more crazy. We have now: Card , that represent, well… cards StackDefinition , which the targets and some other metadata for Spells Selectors , as there name suggests, select objects Behaviour , a closure that can change the game state, but with a lot of fancy type shenanigans to make sure it is only used with appropriate StackDefinitions. Below are some highlights from the new types"}, {"post_id": 63238, "ts": "2026-09-06T22:41:41Z", "hours": 4.5017, "text": "#8 Devlog (Sorry; last one is actually #7) So I finally completed the rewrite my entire project now uses my new overengineered typing. Yay! Finally!! But that also meant that I had to change my library API to use all of those types. What you see below are just the function definitions for that + some minor input validation. And, yes, you could defnitiely make that a lot shorter with macros but it is 1am and I can’t be bothered to go learn how they work."}, {"post_id": 61426, "ts": "2026-09-04T10:21:58Z", "hours": 4.1117, "text": "#5 Devlog Of course fixing stuff took longer than I thought (as always), but we are almost there. Only 16 more errors to go!"}, {"post_id": 59051, "ts": "2026-08-31T17:20:49Z", "hours": 7.4244, "text": "#6 Devlog You know the rewrite I talked about last time? I am STILL doing that. It changed so much more that I had expected. Now I have changed just about every function signature in the entire project. Also there were a million little problems that also needed attention. I think I am close to completing the rewrite though; the core types are all set, I just have to deal with the downstream effects of changing them. That shouldn’t (I hope) take too long"}, {"post_id": 56248, "ts": "2026-08-27T22:35:34Z", "hours": 3.4006, "text": "#5 Devlog I redesigned my engine (not implemented yet); It makes much more extensive use of generics now and has in general much better type-safety. This eliminates a ton of bounds checks and potential errors, because the compiler can prove at compile-time that the program is valid (or not). Also kind of crazy that it says 3.5h for designing. I feel like I spent most of my time in the browser explaining my code to ChatGPT to understand it better myself (ChatGPT did little besides saying “Ah, yes, great idea” and explaining my idea back to me)"}, {"post_id": 55056, "ts": "2026-08-26T14:14:51Z", "hours": 1.5544, "text": "#4 Devlog I have been developing a new model for how cards on the “stack” (a zone for cards). This moves a lot of the verification and testing (“Is the card that is reference by this Id, the card I expect?, Is this card really in the correct zone?, …”) to compile-time and the compiler will simply refuse to compile if its wrong. And I am really proud of it, since this is by far the most advanced thing I have ever done with generics and it is beautiful. All these ifs are just gone"}, {"post_id": 53369, "ts": "2026-08-23T21:53:02Z", "hours": 1.0717, "text": "#3 Devlog I created a single method in this hour. I wanted to just have method that creates an Iterator over a collection of objects. But if you have different objects that becomes very messy very fast, because the concrete type of the iterator is also different then. Now the method only claims to return something that is an iterator, so it shouldn’t be a problem, right? Well it is, because the compiler doesn’t know at compile time what type will be returned and thus can’t do monomorphization. The solution: Make the types of all of the objects the same through static polymorphism BEFORE you construct the iterator by putting everything into an enum and implementing an access method. You could of course avoid all of that and just use dynamic polymorphism, but who needs that. Also sorry for posting so little, I will try to post more often."}, {"post_id": 53291, "ts": "2026-08-23T19:04:07Z", "hours": 11.1336, "text": "#2 Devlog I reworked how static abilities are applied - now they are (mostly) compliant with MTG comp rules. By far the hardest (and most time-consuming) part was coming up with a design that can actually accommodate all of the requirements the rules have. It’s madness; you can change abilities during resolution, partially apply abilities and the order of application is incredibly complicated. Once I had that figured out the implementation was pretty straightforward. Design is in the image below. The second big thing is that I started creating a unified iterator interface to access my cards in a structured manner."}, {"post_id": 47560, "ts": "2026-08-15T15:14:23Z", "hours": 20.0756, "text": "#1 Devlog So originally I didn’t even plan to put this here, it was just me trying some different ideas. But now that I have spent over 20h and the design isn’t complete trash anymore, I should probably put this here as well. It is still far from complete and actually not that much code for 20h due to a million rewrites. Still, it has a working model for spells, permanents and various effects, so some basic cards can already work. What still needs a lot of work is how to cast a spell, but it is so freaking complicated. Also sorry for no image, but it is a lib and far from runnable, so yeah.."}]...
|
Title: Storm by @Draaal | Stardance
Devlogs:
#1 D Title: Storm by @Draaal | Stardance
Devlogs:
#1 Devlog So originally I didn’t even plan to put this here, it was just me trying some different ideas. But now that I have spent over 20h and the design isn’t complete trash anymore, I should probably put this here as well. It is still far from complete and actually not that much code for 20h due to a million rewrites. Still, it has a working model for spells, permanents and various effects, so some basic cards can already work. What still needs a lot of work is how to cast a spell, but it is so freaking complicated. Also sorry for no image, but it is a lib and far from runnable, so yeah..
#2 Devlog I reworked how static abilities are applied - now they are (mostly) compliant with MTG comp rules. By far the hardest (and most time-consuming) part was coming up with a design that can actually accommodate all of the requirements the rules have. It’s madness; you can change abilities during resolution, partially apply abilities and the order of application is incredibly complicated. Once I had that figured out the implementation was pretty straightforward. Design is in the image below. The second big thing is that I started creating a unified iterator interface to access my cards in a structured manner.
#3 Devlog I created a single method in this hour. I wanted to just have method that creates an Iterator over a collection of objects. But if you have different objects that becomes very messy very fast, because the concrete type of the iterator is also different then. Now the method only claims to return something that is an iterator, so it shouldn’t be a problem, right? Well it is, because the compiler doesn’t know at compile time what type will be returned and thus can’t do monomorphization. The solution: Make the types of all of the objects the same through static polymorphism BEFORE you construct the iterator by putting everything into an enum and implementing an access method. You could of course avoid all of that and just use dynamic polymorphism, but who needs that. Also sorry for posting so little, I will try to post more often.
#4 Devlog I have been developing a new model for how cards on the “stack” (a zone for cards). This moves a lot of the verification and testing (“Is the card that is reference by this Id, the card I expect?, Is this card really in the correct zone?, …”) to compile-time and the compiler will simply refuse to compile if its wrong. And I am really proud of it, since this is by far the most advanced thing I have ever done with generics and it is beautiful. All these ifs are just gone
#5 Devlog I redesigned my engine (not implemented yet); It makes much more extensive use of generics now and has in general much better type-safety. This eliminates a ton of bounds checks and potential errors, because the compiler can prove at compile-time that the program is valid (or not). Also kind of crazy that it says 3.5h for designing. I feel like I spent most of my time in the browser explaining my code to ChatGPT to understand it better myself (ChatGPT did little besides saying “Ah, yes, great idea” and explaining my idea back to me)
#6 Devlog You know the rewrite I talked about last time? I am STILL doing that. It changed so much more that I had expected. Now I have changed just about every function signature in the entire project. Also there were a million little problems that also needed attention. I think I am close to completing the rewrite though; the core types are all set, I just have to deal with the downstream effects of changing them. That shouldn’t (I hope) take too long
#5 Devlog Of course fixing stuff took longer than I thought (as always), but we are almost there. Only 16 more errors to go!
#8 Devlog (Sorry; last one is actually #7) So I finally completed the rewrite my entire project now uses my new overengineered typing. Yay! Finally!! But that also meant that I had to change my library API to use all of those types. What you see below are just the function definitions for that + some minor input validation. And, yes, you could defnitiely make that a lot shorter with macros but it is 1am and I can’t be bothered to go learn how they work.
#9 Devlog Casting spells is now almost complete, and my overengineered type system got even more crazy. We have now: Card , that represent, well… cards StackDefinition , which the targets and some other metadata for Spells Selectors , as there name suggests, select objects Behaviour , a closure that can change the game state, but with a lot of fancy type shenanigans to make sure it is only used with appropriate StackDefinitions. Below are some highlights from the new types
#10 Devlog How could I forget git THIS hard??? I didn’t make a single commit in like the last 20 hours. And now everything is so different that I might as well make a new repo. Also the line count in the screenshots is bugged somehow. Its more like +28XX lines. And it took THREE screenshots!! Anyways, heres an actual update: Now casting spells is finally complete (kinda) and static abilities work too. They even share some code through common “behaviour”. Thats just some common action that can be executed on the game state. Also with the help of a few todo! macros (Magic for fixing anything, but throws at runtime) the code finally compiles again. For like the second time in the entire development. There is bound to be a million bugs in there….
#11 Devlog (AI adventure) So, since stardance ends soon I have to ship this and I am not sure if I can manage in time. So I had a look at AI coding and how to do it properly, because I tried vibe-coding before and it was abysmal. And I have to say it was miles ahead of anything else AI has ever done for me, when you use some specialized skills, create a roadmap first, split it into tickets (The AI even created tickets on GitHub for whatever godforsaken reason; It knew this is a solo project), structure your work, … It is also a TON more work. And it was still lacking. Maybe it was because my student subscription isn’t that powerful, maybe MTG is just too complex or I didn’t explain my messed up design well enough to the agent. Either way I wasted a bunch more time and … yeah, here’s hoping that I will get a working v0.1 alpha in time!
#12 Of course there is an extension of one month right as I was going to ship… Anyway I published it on crates.io, I added some minimal executable example, did the README and added some metadata for publication. And I drew this wonderful new banner. Its a bit whacky, but I like it
Ships:
storm I made a rules engine for the card game MTG. Its basically a giant state machine. You tell it what the players do and based on that it changes the game state. My experience The most challenging thing by far was finding a data model that would allow everything you can do in MTG. And since cards are written in english, there are A LOT of possible actions. Shiny new things I learned I finallyyy have a proper understanding of generics; before it was just this “magic in angle brackets” Pros & Cons of different data structures while I decided what to use for storing cards Experience in how to manage a project that has > 10 files. Might actually be the most valuable thing I gained from all of this.. A somewhat decent understanding of lifetimes in rust Also I finally had a look at metaprogramming with macros (only declarative macros though) I am proud of this The thing I am really proud of in here is how you can have these generic components that define behaviour or targets or such an how you can then use them to create cards as pure data through the power of generics and macros. They are literally just a constant in the code. My experience with AI Later in the implementation when my data structure was mostly fixed I tried having an AI agent do some of the boring work of hooking things up, but it didn’t work. And by that I mean it was pretty awful. It didn’t understand my design, reinvented the wheel several times, took shortcuts that would work for exactly this one card I asked about and just created wrong behaviour. Maybe this was a me problem, because I provided bad context, but I think I will stick writing code by hand for a while longer....
|
1792853439.1100554
|
1792939839.1100554
|
|
44537
|
STEMNet.gr by @rosandrox | Stardance
|
rosandrox
|
2
|
72.0
|
1278
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-04T16:15:32Z", "hours": 52.0, "multiplier": 19.12, "payout": 987, "blessing": "neutral", "text": "STEMNet GREECE CAN YOU PLS STAR MY REPO AND GIMME STARS / I POORED A LOT OF EFFORT INTO IT Created by: Rosario Alexandros Morabito (prodevmod) . I built this as a CS50 final project that turned into a real world mission. PLS READ STEMNet was born out of a real struggle in Greece. Here, proper hands-on STEM education and local school clubs are hard to find, and getting your hands on basic electronics like an Arduino is a challenge you either rely on a single physical store in the whole country or buy online. But since parents often don’t trust internet shopping, young innovators get stuck. I wanted to fix this by building a cozy, peer to peer home where young Greek makers of the same age and passion can finally connect, share project feedback, and feel like they aren’t alone. Like I often times feel. Y develop it further The overwhelming amount of positive feedback I got from my previous shipping of the project and my friends who I cowardly showed it to because I was a bit scared they were going to make fun of me pushed me into expanding this with a React framework for the V1, but trust me, even more is coming. What’s Inside the Platform? The STEM Extra Vault: A handy resource library packed with everything students need to kickstart their independent journey into electronics and coding, making up for what traditional schools miss. Community Groups ( can also be used as School Clubs): Forum style discussion spaces where everyone can chat about their favorite topics. Students can even spin up their own groups to act as virtual versions of real world school clubs. Events & Future Webinars: A dedicated space tracking upcoming competitions, team meetups, and future online STEM teaching sessions that I plan to host once the user base grows. Self-Cleaning Notifications: A smart alert system that automatically wipes read notifications older than 30 days (with a cron job for FREE), keeping the interface clean so users never get overwhelmed by clutter. Built-in Safety & Sigma Profiles: BTS, the site keeps things secure with robust account verification thru session cookies and recapca, safe link-checking to keep malicious websites away thru nginx , customized user profiles with social and GitHub links, and easy account settings. I would realy want to see this project skyrocket! If you have any recomandations about how I can scale it or grow my userbase pls tell me!!!", "repo": "https://github.com/prodevmod/STEMNet.gr", "demo": "https://www.stemnet.app"}, {"ship_num": 2, "ts": "2026-08-09T22:25:15Z", "hours": 20.0, "multiplier": 14.46, "payout": 291, "blessing": "neutral", "text": "See video HERE(OLD VERSION OF SITE): https://youtu.be/QUGb-TlbM0Q . I built STEMNet.gr, a student-driven social hub and resource directory designed specifically for Greek students. It aims to bridge the gap for students who lack local access to STEM clubs, robotics, and academic mentorship. It’s a space to discover curated educational resources, post and find events, and build a community where students can learn from and support each other. Moving from a CS50 project to a production-ready application was a steep learning curve. I spent countless hours diving into Flask, Jinja, and database documentation to ensure the site is secure against SQL injections and unauthorized access. Balancing feature development—like AJAX for real-time interaction, mobile responsiveness, and a custom dark/light mode theme system—while ensuring the site remains fast and secure, was the biggest challenge. I am most proud of creating a self-sustaining, alumni-driven ecosystem. This isn’t just a directory; it’s a platform where students can give back by contributing events they’ve discovered, effectively filling the guidance gap for those starting their STEM journey. I’ve successfully migrated it to a faster, more robust server infrastructure, implemented a secure registration flow, and built a fully functional social graph (followers/following).", "repo": "https://github.com/prodevmod/STEMNet.gr", "demo": "https://www.stemnet.app"}]...
|
[{"post_id": 61591, "ts": "202 [{"post_id": 61591, "ts": "2026-09-04T16:02:16Z", "hours": 0.6472, "text": "GUYS I DID SOME FINAL TOUCHUPS! I AM READY TO SHIP! THE TOUCHUPS HAD TO DO WITH THE GROUPPOSTS CONTENT RENDERING!💀💀💀💀"}, {"post_id": 61454, "ts": "2026-09-04T11:53:33Z", "hours": 4.0161, "text": "I FINISHED ITTTT! So, I basically cleaned up the CSS as I told in the previous devlog. I also added category tags in every post, which was a feature of the HTML version but I had forgot to add it. Then, I also added a going and interesting interactions in events so that people may express where they would like to go from all the events. I also added the refactored edit and delete functions for events and groups, they weren’t working. I fixed the notifications cleanup which was previously not working, it was a cron job I added in the previous devlog. Also, in the profile page, I have now separated the person’s content into posts and replies, that way the UX is far better. Also, I made a crop image component so that the users can customize which part of the image they want in their PFP, and that is also good because now I don’t have to do the fitting anymore because once they have selected it, only the selected part of the icon is saved, so it becomes a lot more gestible for me. I am also adding content so that stemnet has lots of stuff, and further on I will be adding one or two more details and then shipping it. I really don’t think there is anything else to do, I really put a lot of hours into this, and yeah."}, {"post_id": 60704, "ts": "2026-09-03T08:14:23Z", "hours": 3.1347, "text": "Hello!!! Sooooo I Did a few things like: I added pagination for if and when I get a larger userbase the app/webapp won’t crash (Mostly for mobile users) by loading all posts at once. I added a few things in the backend to make expanding this app/webapp easier. I also added RSVP buttons for “Going” and “Interested” in EventDetails and Events pages to make them more interesting. Implemented handleRsvp function to manage user RSVP status and update counts. Adjusted comment reply button to display comment count. Updated requirements.txt to include Pillow and redis. Added a second cron job to cleanup old read notifications NEXT UP: Fixing the UI Add right image sizes in every page w/ content Fix the reversed colours thing"}, {"post_id": 60288, "ts": "2026-09-02T15:46:17Z", "hours": 2.7697, "text": "Today I worked on the cybersecurity aspect of my site btw :P ( I meant to write : but I did a typo P). I honestly was chilling doing nginx configuration and I also secured the recaptcha key. I also took heed of one of my comments and added an api for malicious domains plus I hardcoded some others. I also moved the sanatisation to the forms themselves (post, create group)"}, {"post_id": 59440, "ts": "2026-09-01T09:12:44Z", "hours": 2.9211, "text": "I did all of the following: I’m thinking to fix the change password, change email, and report a bug functions. Also, make it able to upload GIFs for content types because currently, although possible, it is not working. I don’t know why. I have to troubleshoot it. And to fix those verification tokens and redirection. Problems I ENCOUNTERED: I tried and tried times again to fix my redirecting script for half an hour antil my stupid a$$ realised the problem was that resend was injecting a tracker in the website to track if the email was clicked and I removed it resulting on verification links working. After searching up my content error on stack overflow I found out it was neither a supabase or python storing error but it was in fact a nginx framework error that needed one line to be solved:( UP NEXT I am currently running Pentests and rawlers to optimise my webapps cybersecurity and when done I ll prevent any vulenerabilities (I got dyslexia). Right after that I ll try to get a userbase by using lapse to record me addvertising my site!"}, {"post_id": 59016, "ts": "2026-08-31T16:28:57Z", "hours": 6.0711, "text": "SOOOOOOOO: Today I tried to make up for yesterday (I only did like 2 hrs) and here is what I did: So, I updated the navbar to have a settings page, which I was inspired to make because when trying to find an icon that represents stem extras and all the stem together and not just one kind of stem, a gear came to mind. But then I thought I should also make settings, so I put that aside for the time. And now I made the stem extras icon a more chemistry-looking bottle, and the gear I kept for the settings as I said I would. Everything is pretty much the same, except I made an edit and delete event buttons that were much needed because after all the test events I made, it was getting kind of sloppy and unprofessional because it was filled with gibberish. Same goes for the groups, so I did the exact same thing. Also, I made a table for the users to delete a post that many people have replied to by adding a soft delete function that basically checks if the post is deletable, and if it is not, it changes it to this post is no longer available, this post has been deleted. So, I then proceeded to make the settings page, which was very difficult and still I haven’t got over yet. So, I’ve made the appearance and delete account. I made the delete account button to work. It was kind of difficult so that I could secure it that there is no misuse of this button and hackers might mass delete accounts by hacking into them. I also made a report bug, change email, and change password tabs that although they technically or three work, they need some improvement, which I will make in the next devlog. I also made the appearance into something more modern and nice, which is like every other setting, an accordion dropdown that you press to switch to what mode you want. I’m trying to currently recreate the icon near the mode text so it’s a bit more fun, and I will do it in the next devlog. Logout works just fine. I’ve made custom emails and verification tokens for every single action. Also, They still need some work to be done. The verification tokens have made because they currently don’t redirect you back to a login page or something, so they feel empty and don’t work exactly as they are built to work as. Everything else is pretty much the same. I updated the content type so users can upload much larger files. For the next dev log, I’m thinking to fix the change password, change email, and report a bug functions. Also, make it able to upload GIFs for content types because currently, although possible, it is not working. I don’t know why. I have to troubleshoot it. And to fix those verification tokens and redirection."}, {"post_id": 57911, "ts": "2026-08-30T07:34:49Z", "hours": 1.1781, "text": "IT TOOK ME 1 HOUR BUT IT WAS WORH IT: LADIES AND GENTS THE NOTIFICATION ICON CHANGES TO INDICATE YOU HAVE NOTIFICATIONS I’ ll describe this session cuz it was so funny frfr: So like I got started wondering why the notification button in navbar doesnt update I then proceeded to delete the svg s I had and replace them with pc generated ones Then I proceeded to change the structure of both my app.py and navbar.jsx (visible in my commits) But I suddenly remembered I can debug with console logs which I have kept cuz y not To cut it short after debugging I saw in the console log a messoge that said and I quote index-D9jqm-wX.js:11 Navbar hasUnreadNotifications: undefined undefined and that was when I realised I had nowhere in the .jsx included the hasUnreadNotification boolean so there was no way of the client knowing what I was yapping abt in Navbar.jsx basically I was saying check if hasUnreadNotification is True I then used the find thingy of VSCode to add the argument to all the react pages Up Next: Have it tested by people give feedback. Activate global acces via Clouflare Automate deletion of old events with cron"}, {"post_id": 57539, "ts": "2026-08-29T18:28:38Z", "hours": 6.2389, "text": "BEFORE I START TAKE 5 mins of your time pls to test my webapp and suggest additions: SUGEST ON GITHUB https://github.com/prodevmod/STEMNet.gr/issues?q=is%3Aissu MY SITE: https://www.stemnet.app I Just finished the Issues I had made from playtestsing with my bros! These are the functional changes made: REPLY buttons worked flawelessly at every page of the site but it took me 2 hrs cause of how many different pathways were inside my webapp and I had to sort them out but guess what it finally took me 3 hrs because there was a PROBLEM with my code CAUSE I HAD to change the api/posts/post_id to api/post_id/posts but had forgotten to change the route and the method from POST to GET and lost 1 f-ing hour of my time searching for a single line of code. REGISTER page was easy I just had to remove some labels to make the UI mure user friendly, like honestly most changes were frontend based in this part so with my BIG brain and a litle of react documentation it was basically a peice of cake THE NOTIFICATIONS PART WAS THE MOST TIME CONSUMING BECAUSE IT TOOK ME 1 hour researching and 2 hours actually typing cause what was written (mostly frontend) was wrong and I had to create a new table for notifications. Ig I just didn’t know how to implement the notifications. Last part was RECAPTCHA V2 for more stable results it was very easy to do (took me 20 mins tops) Next: TESTING with MY bros Making notification icon full when user has unread notifications IMPLEMENT UR IDEAS"}, {"post_id": 56684, "ts": "2026-08-28T15:24:20Z", "hours": 3.0264, "text": "So, for the first half of this session, I was trying to debug the app and website deployment because the app deployment overrode the website deployment. And at some point, nothing worked. I then went ahead and play-tested my site with some friends, and we found some key issues that I have to fix, such as the fact that reply buttons are not functional in all pages, the register page has some unclear parts, while the notifications page doesn’t work at all. While testing, I found that a friend of mine couldn’t register, and so I tried to register too, but it wouldn’t let me because of the reCAPTCHA. So, that’s how I decided to remove reCAPTCHA v3 completely and apply reCAPTCHA v2, which I haven’t done yet. I also then went ahead and made some issues to my GitHub repository so I can keep track of what I need to change. I’m thinking of merging the two branches, although I’m not sure yet because I would like to have my main branch. I might rename my main branch and make default the react-version branch. I also made a mobile branch, but that’s only on the local git. And that’s all I did for this session. I’m thinking of expanding more on this idea and advertising it, and then also shipping it, but that’s for later on. I must first fix every mistake and then do some testing with relatives, friends, and if you want to, you can participate. And then I’m going to have to have them fill out a form so that I find out which are the weakest points of my UI and what functionalities I could add.Also app works now!!!"}, {"post_id": 56510, "ts": "2026-08-28T09:42:45Z", "hours": 0.6783, "text": "Small note: I made a deplyable app but because it is compiled with capacitor it needed a domain and I entered my websites domain so either the app will work fully and the web server ,ust close either only the frontent works!Actual mobile FOOTAGE(My pfp is so JOLLY):"}, {"post_id": 56450, "ts": "2026-08-28T06:51:35Z", "hours": 2.6586, "text": "SO the UI and most of backend is the same (IT WAS A PREEEEEETY BORING SESSION. Moreover in this session I just: (THE APP HAS LIGHT MODE TO, I JUST PREFER DARK) Cleaned up the CSS and .jsx files Polished and Tested Everything was fine Made the webapp’s logo Hated myself cuz I didn’t know how to deploy my site deployed my sit with hackclub nest server and nginx and gunicorn Playtested w/ some friends and gathered opinions What I Have yet to do: make polished/final UI deploy a mobile app version too Start advertising Contacting people interested in hosting my app Propose my idea to the greek government(I have veryyyyyyyyyyyy High Hopes I know) Follow me cuz this is just the start of this WEBAPP! PLEEEEEEEEEEAAAAAASE STAR MY REPO!"}, {"post_id": 55595, "ts": "2026-08-27T15:30:57Z", "hours": 6.9036, "text": "Ladies and Gents there was not in fact a 5% left… More like 50% … Soooooo: I implemented all the event functions and group functions to work as intended. Also, I made the post detail and the event detail. I made the create group, create post, and everything.I included every function of the previous version that was in HTML, so academic profiles for the registering, multimedia code sharing and links, events and groups featuring dedicated tracking for STEM-related events. Social interactions, the platform includes a standard follower-following network. Security and technical architecture, I built using Python Flask, so I didn’t need to change anything security-wise, so I just kept the old version that using SQLite. It then translated to PostgreSQL alongside Supabase for the cloud file storage, and I have added all the login rate limits so that there is no login brute force.This was my first time coding in react so I learned two distinct ways + css to code a frontend and 1 way to do the backend!"}, {"post_id": 55042, "ts": "2026-08-26T13:57:27Z", "hours": 5.2628, "text": "💀💀I AM EXHAUSTED I SEE ERRORS EVERYWHERE! However on the bright side 95% of the website is done for the react version and I am commiting my REACT V1 today!So, let’s see what changed in the React version. So, I added a logout icon that is created on spot as most icons because I removed mine but kept a few to make the site simpler and more easy to load, though I kept my like buttons and my reply buttons. I removed the image to be shown from the actual profile page so that more content fits into less space. The events are pretty much the same only that I added a footer box so that the user understands where the description starts and where the specifications end. I replaced the gem with a gear and I named the page StemNet Extras Education because it sounded more like the actual thing. The group is functioning every function of the group so nothing changed there. Notifications have a bit different way of functioning but it is the same logic. Pretty much everything is the same just in React with a bit better UI and UX.The basic reason why I didn’t do more devlogs and more analytical work is because the hackathon was down so I couldn’t log anything. And when hackathon came back up around 3 hours of work I had already done, I encountered ton of bugs. That’s why I’m exhausted right now. In fact, this is an edited devlog. In my normal devlog I didn’t upload anything because I was exhausted and wanted to take a break. The thread view or the post detail post works the same. I added a cute profile picture for anyone who hasn’t got one with their initial. Light mode and dark mode are better now. Before they were a bit choppy and in some places they didn’t work. New post is very organized. And most of the text is changing with force white and force black because for some reason all the CSS I wrote didn’t make sense to me. So I just added a force thing so I could label the things I want to turn what I want them to turn to."}, {"post_id": 54729, "ts": "2026-08-25T20:12:25Z", "hours": 3.5881, "text": "So one of the MANY reviewers sugested I build the application / website in react and so I have started doing that! I also drew stemnet logo! I ll cover that in the next devlog cause my lapse is still open IN CASE I wanna change it! However turns out react framework is relativly easy! But bcs I am kinda slow it took me 1 week of studying to start building! I redisigned the css to cover some of my needs and made the register login, index and custom error pages! I also found it easier to integrate my rate limit in a simple warning on the login screen! I am working on a seperate branch for better version control (I AM SO SMART IKR), first time actually using anything else than add push pull remote and satus commands for git ( I AM SO PROUD). Abt the actual project: The react framework is wayyyyyyyyyyyyyyyyyyy faster and leaves room for me to do silly things! I addaptes some things like integrating reply in posts directly (FREEDOM OF REACT) that couldn’t be implemented in html Imma do the rest of the app now I also fixed the images so that their shown in their proper aspect as I was suggested I dont also dont have much to document on as much of the work I did in python css and react was baxically boilerplate code found in documentation!"}, {"post_id": 48706, "ts": "2026-08-17T06:48:45Z", "hours": 0.6875, "text": "Guys when reviewing my project please make an account if you dont want to share your real info atleast use a fake email generator and login from the inbox cause rly all the dedication i ve put into this project is in that page after logging in."}, {"post_id": 45438, "ts": "2026-08-11T21:44:13Z", "hours": 1.8439, "text": "I cleaned up some things I added a login limit to avoid bruteforce and a custom html page for when the user exceeds the limit. I wrote the README.md from scratch cause I had used AI to make the process quicker. I added comments so anyone who might wants to do a PR isn’t deterred by the ammount of confusing jargon.Fixed some css issues and added more to the STEM EXTRA page. I also added a captcha v3 verificator to avoid having bots raid my platform…. PLEASE READ PREVIOUS DEVLOGS TO UNDERSTAND THE MISSSION"}, {"post_id": 44272, "ts": "2026-08-09T22:21:53Z", "hours": 0.5536, "text": "Just run last tests added more stem material!!!! With these devlog I want to gain your atention to spread the word to people you think will find it useful as it is primarly for greek students but the important part is that it is for students that do not have stem guidance and don’t know where to start from. With these project students not only gain guidance and benefit from the community but can contribute back into it (by posting about an upcoming event they heard about) creating a self sustaining alumni driven platform.Thank you for your attention!!! Enjoy my project!! Make sure to checkout the vid (old version) see progress!!! https://youtu.be/QUGb-TlbM0Q"}, {"post_id": 44235, "ts": "2026-08-09T21:07:37Z", "hours": 1.91, "text": "Okay, so I did the last cleanup, so my project is ready for shipping. In this session, I removed the feed button because it was unnecessary. The stemnet.gr logo takes you to the feed. I restricted the navigation feature icons only for the logged-in users. I forced the login prompt button to retain a clean white text background and properly structured the mobile and desktop navbar. I added hero card styling. I also added an extremely beneficial part of the site with all the extra academics a student can take. There I will upload different links and resources for Greek students to study STEM outside of the school curriculum. I think that’s a very good idea and very nice I created and thought of. And while testing the final product, I was headbanging to “So Lucky” by Twice and “Loser” by Tame Impala."}, {"post_id": 44082, "ts": "2026-08-09T16:36:46Z", "hours": 3.9775, "text": "I added the group chat section with search results in integration in search.html. Added the dedicated group chat ads section that queries matching groups. Feed discovery banner has some sponsored or featured group chats. Then I added the light and dark mode system with zero flash theme script. I embedded the synchronous script. I also added a dynamic navbar toggle so it will be more user-friendly and theme-aware UI that inverts the colors of non-visible UI depending on the theme."}, {"post_id": 43709, "ts": "2026-08-09T03:49:02Z", "hours": 2.4692, "text": "I’ve implemented a lot of cybersecurity measures, so SQL injection or mitigations won’t happen. I fixed the SQL search. Following and followers list .html didn’t work before, now it works flawlessly. I changed servers because the server I used was very slow. I am using Nest of Hacklab currently. Yeah, that’s all the changes for today, but it turned out pretty neat. Check out the video."}, {"post_id": 42907, "ts": "2026-08-07T21:14:20Z", "hours": 0.4639, "text": "I officially think the first version of my site is ready to be shipped. I fixed some last minute bugs. I added AJAX so that the user doesn’t have to always refresh the page to see their likes.For further informations visit the github repo. Alo I hosted it on nest so that the site would be faster. I also spent 4-5 Hours reading flask and jinja and json documentation to debug and apply cybersecurity measures. Youtube preview: https://www.youtube.com/watch?v=QUGb-TlbM0Q"}, {"post_id": 42764, "ts": "2026-08-07T17:16:02Z", "hours": 3.0769, "text": "Big coding session. I migrated the site to the Hacklab Nest because it gives me more potential and a larger and faster server. It will have many benefits. I finished the basic idea I had in mind for this site. Basically, it includes: A feed An event section A notification section A profile section, along with followers and following sections An affiliate links section in the profile page Posts that show up both in the feed and the logged-out section A search button to search for users and posts that might interest you A filter feature to search posts by category A new post button A log out button A login button A register button with registration verification provided by resend"}, {"post_id": 42275, "ts": "2026-08-06T22:07:18Z", "hours": 2.0411, "text": "I’m clocking off for the day. I think I finished the biggest part of the project. I improved my site’s cyber security from brute force SQL injections, remote post, delete, and edit. I added: a search page an event page a post page a feed page a profile page followers and following list a follow button a like button a comment to reply button where you basically post something replying to something else However I doubt the efficiency of this project and if it’s going to carry out as I want it. I really hope it does. Ideally I host it online with a custom domain. I have the eligibility to take one for free because I’m in the GitHub student pack. I don’t know if it’s really worth it. Take a look at my project and you tell me. I also added a profile picture. please comment your opinion: should I make it public or what? https://stemnet-gr.onrender.com/register"}, {"post_id": 42080, "ts": "2026-08-06T17:17:40Z", "hours": 2.225, "text": "I have made the web app applicable to a mobile app too so if you join from mobile, everything will be in a normal view and it will not be deformed. I worked on the profile. The followers and following are applicable, clickable, and you can see who you are following or who your followers are. I added links to GitHub and LinkedIn, which have their own personalized icons. All the rest have just a bug icon, a reference to all the bugs that have deterred many fellow coders. Next, I’m planning to create the full post and events mechanism because, on this site, you can add posts or events. Additionally, I will implement notifications, which is another functionality. After that, I will work on the verification of each user with an automated email and upload the first working STEMnet to GitHub, although I have a lot to work on."}, {"post_id": 41893, "ts": "2026-08-06T12:09:12Z", "hours": 3.3692, "text": "Before you see the progress I’ve made, I want you to know this project was made by me as the final project of my CS50 course. Not just to get over the course but to solve an actual problem you see in Greece we have very limited access to clubs and robotics in general. Imagine there is only one shop in the whole state that you can buy electronic components from. I managed to make an SQL database with all the users’ posts, likes, etc., information, a login page, a new post page, a profile page, and affiliate links for networking between students. I’m still working on cyber security. However we are clear of SQL injections so that’s good. The CSS is rather simple but working and I think I will keep it. I might add some shadows just to make it feel more interactive. The buttons are already interactive so that’s good."}]...
|
Title: STEMNet.gr by @rosandrox | Stardance
Devlo Title: STEMNet.gr by @rosandrox | Stardance
Devlogs:
Before you see the progress I’ve made, I want you to know this project was made by me as the final project of my CS50 course. Not just to get over the course but to solve an actual problem you see in Greece we have very limited access to clubs and robotics in general. Imagine there is only one shop in the whole state that you can buy electronic components from. I managed to make an SQL database with all the users’ posts, likes, etc., information, a login page, a new post page, a profile page, and affiliate links for networking between students. I’m still working on cyber security. However we are clear of SQL injections so that’s good. The CSS is rather simple but working and I think I will keep it. I might add some shadows just to make it feel more interactive. The buttons are already interactive so that’s good.
I have made the web app applicable to a mobile app too so if you join from mobile, everything will be in a normal view and it will not be deformed. I worked on the profile. The followers and following are applicable, clickable, and you can see who you are following or who your followers are. I added links to GitHub and LinkedIn, which have their own personalized icons. All the rest have just a bug icon, a reference to all the bugs that have deterred many fellow coders. Next, I’m planning to create the full post and events mechanism because, on this site, you can add posts or events. Additionally, I will implement notifications, which is another functionality. After that, I will work on the verification of each user with an automated email and upload the first working STEMnet to GitHub, although I have a lot to work on.
I’m clocking off for the day. I think I finished the biggest part of the project. I improved my site’s cyber security from brute force SQL injections, remote post, delete, and edit. I added: a search page an event page a post page a feed page a profile page followers and following list a follow button a like button a comment to reply button where you basically post something replying to something else However I doubt the efficiency of this project and if it’s going to carry out as I want it. I really hope it does. Ideally I host it online with a custom domain. I have the eligibility to take one for free because I’m in the GitHub student pack. I don’t know if it’s really worth it. Take a look at my project and you tell me. I also added a profile picture. please comment your opinion: should I make it public or what? https://stemnet-gr.onrender.com/register
Big coding session. I migrated the site to the Hacklab Nest because it gives me more potential and a larger and faster server. It will have many benefits. I finished the basic idea I had in mind for this site. Basically, it includes: A feed An event section A notification section A profile section, along with followers and following sections An affiliate links section in the profile page Posts that show up both in the feed and the logged-out section A search button to search for users and posts that might interest you A filter feature to search posts by category A new post button A log out button A login button A register button with registration verification provided by resend
I officially think the first version of my site is ready to be shipped. I fixed some last minute bugs. I added AJAX so that the user doesn’t have to always refresh the page to see their likes.For further informations visit the github repo. Alo I hosted it on nest so that the site would be faster. I also spent 4-5 Hours reading flask and jinja and json documentation to debug and apply cybersecurity measures. Youtube preview: https://www.youtube.com/watch?v=QUGb-TlbM0Q
I’ve implemented a lot of cybersecurity measures, so SQL injection or mitigations won’t happen. I fixed the SQL search. Following and followers list .html didn’t work before, now it works flawlessly. I changed servers because the server I used was very slow. I am using Nest of Hacklab currently. Yeah, that’s all the changes for today, but it turned out pretty neat. Check out the video.
I added the group chat section with search results in integration in search.html. Added the dedicated group chat ads section that queries matching groups. Feed discovery banner has some sponsored or featured group chats. Then I added the light and dark mode system with zero flash theme script. I embedded the synchronous script. I also added a dynamic navbar toggle so it will be more user-friendly and theme-aware UI that inverts the colors of non-visible UI depending on the theme.
Okay, so I did the last cleanup, so my project is ready for shipping. In this session, I removed the feed button because it was unnecessary. The stemnet.gr logo takes you to the feed. I restricted the navigation feature icons only for the logged-in users. I forced the login prompt button to retain a clean white text background and properly structured the mobile and desktop navbar. I added hero card styling. I also added an extremely beneficial part of the site with all the extra academics a student can take. There I will upload different links and resources for Greek students to study STEM outside of the school curriculum. I think that’s a very good idea and very nice I created and thought of. And while testing the final product, I was headbanging to “So Lucky” by Twice and “Loser” by Tame Impala.
Just run last tests added more stem material!!!! With these devlog I want to gain your atention to spread the word to people you think will find it useful as it is primarly for greek students but the important part is that it is for students that do not have stem guidance and don’t know where to start from. With these project students not only gain guidance and benefit from the community but can contribute back into it (by posting about an upcoming event they heard about) creating a self sustaining alumni driven platform.Thank you for your attention!!! Enjoy my project!! Make sure to checkout the vid (old version) see progress!!! https://youtu.be/QUGb-TlbM0Q
I cleaned up some things I added a login limit to avoid bruteforce and a custom html page for when the user exceeds the limit. I wrote the README.md from scratch cause I had used AI to make the process quicker. I added comments so anyone who might wants to do a PR isn’t deterred by the ammount of confusing jargon.Fixed some css issues and added more to the STEM EXTRA page. I also added a captcha v3 verificator to avoid having bots raid my platform…. PLEASE READ PREVIOUS DEVLOGS TO UNDERSTAND THE MISSSION
Guys when reviewing my project please make an account if you dont want to share your real info atleast use a fake email generator and login from the inbox cause rly all the dedication i ve put into this project is in that page after logging in.
So one of the MANY reviewers sugested I build the application / website in react and so I have started doing that! I also drew stemnet logo! I ll cover that in the next devlog cause my lapse is still open IN CASE I wanna change it! However turns out react framework is relativly easy! But bcs I am kinda slow it took me 1 week of studying to start building! I redisigned the css to cover some of my needs and made the register login, index and custom error pages! I also found it easier to integrate my rate limit in a simple warning on the login screen! I am working on a seperate branch for better version control (I AM SO SMART IKR), first time actually using anything else than add push pull remote and satus commands for git ( I AM SO PROUD). Abt the actual project: The react framework is wayyyyyyyyyyyyyyyyyyy faster and leaves room for me to do silly things! I addaptes some things like integrating reply in posts directly (FREEDOM OF REACT) that couldn’t be implemented in html Imma do the rest of the app now I also fixed the images so that their shown in their proper aspect as I was suggested I dont also dont have much to document on as much of the work I did in python css and react was baxically boilerplate code found in documentation!
💀💀I AM EXHAUSTED I SEE ERRORS EVERYWHERE! However on the bright side 95% of the website is done for the react version and I am commiting my REACT V1 today!So, let’s see what changed in the React version. So, I added a logout icon that is created on spot as most icons because I removed mine but kept a few to make the site simpler and more easy to load, though I kept my like buttons and my reply buttons. I removed the image to be shown from the actual profile page so that more content fits into less space. The events are pretty much the same only that I added a footer box so that the user understands where the description starts and where the specifications end. I replaced the gem with a gear and I named the page StemNet Extras Education because it sounded more like the actual thing. The group is functioning every function of the group so nothing changed there. Notifications have a bit different way of functioning but it is the same logic. Pretty much everything is the same just in React with a bit better UI and UX.The basic reason why I didn’t do more devlogs and more analytical work is because the hackathon was down so I couldn’t log anything. And when hackathon came back up around 3 hours of work I had already done, I encountered ton of bugs. That’s why I’m exhausted right now. In fact, this is an edited devlog. In my normal devlog I didn’t upload anything because I was exhausted and wanted to take a break. The thread view or the post detail post works the same. I added a cute profile picture for anyone who hasn’t got one with their initial. Light mode and dark mode are better now. Before they were a bit choppy and in some places they didn’t work. New post is very organized. And most of the text is changing with force white and force black because for some reason all the CSS I wrote didn’t make sense to me. So I just added a force thing so I could label the things I want to turn what I want them to turn to.
Ladies and Gents there was not in fact a 5% left… More like 50% … Soooooo: I implemented all the event functions and group functions to work as intended. Also, I made the post detail and the event detail. I made the create group, create post, and everything.I included every function of the previous version that was in HTML, so academic profiles for the registering, multimedia code sharing and links, events and groups featuring dedicated tracking for STEM-related events. Social interactions, the platform includes a standard follower-following network. Security and technical architecture, I built using Python Flask, so I didn’t need to change anything security-wise, so I just kept the old version that using SQLite. It then translated to PostgreSQL alongside Supabase for the cloud file storage, and I have added all the login rate limits so that there is no login brute force.This was my first time coding in react so I learned two distinct ways + css to code a frontend and 1 way to do the backend!
SO the UI and most of backend is the same (IT WAS A PREEEEEETY BORING SESSION. Moreover in this session I just: (THE APP HAS LIGHT MODE TO, I JUST PREFER DARK) Cleaned up the CSS and .jsx files Polished and Tested Everything was fine Made the webapp’s logo Hated myself cuz I didn’t know how to deploy my site deployed my sit with hackclub nest server and nginx and gunicorn Playtested w/ some friends and gathered opinions What I Have yet to do: make polished/final UI deploy a mobile app version too Start advertising Contacting people interested in hosting my app Propose my idea to the greek government(I have veryyyyyyyyyyyy High Hopes I know) Follow me cuz this is just the start of this WEBAPP! PLEEEEEEEEEEAAAAAASE STAR MY REPO!
Small note: I made a deplyable app but because it is compiled with capacitor it needed a domain and I entered my websites domain so either the app will work fully and the web server ,ust close either only the frontent works!Actual mobile FOOTAGE(My pfp is so JOLLY):
So, for the first half of this session, I was trying to debug the app and website deployment because the app deployment overrode the website deployment. And at some point, nothing worked. I then went ahead and play-tested my site with some friends, and we found some key issues that I have to fix, such as the fact that reply buttons are not functional in all pages, the register page has some unclear parts, while the notifications page doesn’t work at all. While testing, I found that a friend of mine couldn’t register, and so I tried to register too, but it wouldn’t let me because of the reCAPTCHA. So, that’s how I decided to remove reCAPTCHA v3 completely and apply reCAPTCHA v2, which I haven’t done yet. I also then went ahead and made some issues to my GitHub repository so I can keep track of what I need to change. I’m thinking of merging the two branches, although I’m not sure yet because I would like to have my main branch. I might rename my main branch and make default the react-version branch. I also made a mobile branch, but that’s only on the local git. And that’s all I did for this session. I’m thinking of expanding more on this idea and advertising it, and then also shipping it, but that’s for later on. I must first fix every mistake and then do some testing with relatives, friends, and if you want to, you can participate. And then I’m going to have to have them fill out a form so that I find out which are the weakest points of my UI and what functionalities I could add.Also app works now!!!
BEFORE I START TAKE 5 mins of your time pls to test my webapp and suggest additions: SUGEST ON GITHUB https://github.com/prodevmod/STEMNet.gr/issues?q=is%3Aissu MY SITE: https://www.stemnet.app I Just finished the Issues I had made from playtestsing with my bros! These are the functional changes made: REPLY buttons worked flawelessly at every page of the site but it took me 2 hrs cause of how many different pathways were inside my webapp and I had to sort them out but guess what it finally took me 3 hrs because there was a PROBLEM with my code CAUSE I HAD to change the api/posts/post_id to api/post_id/posts but had forgotten to change the route and the method from POST to GET and lost 1 f-ing hour of my time searching for a single line of code. REGISTER page was easy I just had to remove some labels to make the UI mure user friendly, like honestly most changes were frontend based in this part so with my BIG brain and a litle of react documentation it was basically a peice of cake THE NOTIFICATIONS PART WAS THE MOST TIME CONSUMING BECAUSE IT TOOK ME 1 hour researching and 2 hours actually typing cause what was written (mostly frontend) was wrong and I had to create a new table for notifications. Ig I just didn’t know how to implement the notifications. Last part was RECAPTCHA V2 for more stable results it was very easy to do (took me 20 mins tops) Next: TESTING with MY bros Making notification icon full when user has unread notifications IMPLEMENT UR IDEAS
IT TOOK ME 1 HOUR BUT IT WAS WORH IT: LADIES AND GENTS THE NOTIFICATION ICON CHANGES TO INDICATE YOU HAVE NOTIFICATIONS I’ ll describe this session cuz it was so funny frfr: So like I got started wondering why the notification button in navbar doesnt update I then proceeded to delete the svg s I had and replace them with pc generated ones Then I proceeded to change the structure of both my app.py and navbar.jsx (visible in my commits) But I suddenly remembered I can debug with console logs which I have kept cuz y not To cut it short after debugging I saw in the console log a messoge that said and I quote index-D9jqm-wX.js:11 Navbar hasUnreadNotifications: undefined undefined and that was when I realised I had nowhere in the .jsx included the hasUnreadNotification boolean so there was no way of the client knowing what I was yapping abt in Navbar.jsx basically I was saying check if hasUnreadNotification is True I then used the find thingy of VSCode to add the argument to all the react pages Up Next: Have it tested by people give feedback. Activate global acces via Clouflare Automate deletion of old events with cron
SOOOOOOOO: Today I tried to make up for yesterday (I only did like 2 hrs) and here is what I did: So, I updated the navbar to have a settings page, which I was inspired to make because when trying to find an icon that represents stem extras and all the stem together and not just one kind of stem, a gear came to mind. But then I thought I should also make settings, so I put that aside for the time. And now I made the stem extras icon a more chemistry-looking bottle, and the gear I kept for the settings as I said I would. Everything is pretty much the same, except I made an edit and delete event buttons that were much needed because after all the test events I made, it was getting kind of sloppy and unprofessional because it was filled with gibberish. Same goes for the groups, so I did the exact same thing. Also, I made a table for the users to delete a post that many people have replied to by adding a soft delete function that basically checks if the post is deletable, and if it is not, it changes it to this post is no longer available, this post has been deleted. So, I then proceeded to make the settings page, which was very difficult and still I haven’t got over yet. So, I’ve made the appearance and delete account. I made the delete account button to work. It was kind of difficult so that I could secure it that there is no misuse of this button and hackers might mass delete accounts by hacking into them. I also made a report bug, change email, and change password tabs that although they technically or three work, they need some improvement, which I will make in the next devlog. I also made the appearance into something more modern and nice, which is like every other setting, an accordion dropdown that you press to switch to what mode you want. I’m trying to currently recreate the icon near the mode text so it’s a bit more fun, and I will do it in the next devlog. Logout works just fine. I’ve made custom emails and verification tokens for every single action. Also, They still need some work to be done. The verification tokens have made because they currently don’t redirect you back to a login page or something, so they feel empty and don’t work exactly as they are built to work as. Everything else is pretty much the same. I updated the content type so users can upload much larger files. For the next dev log, I’m thinking to fix the change password, change email, and report a bug functions. Also, make it able to upload GIFs for content types because currently, although possible, it is not working. I don’t know why. I have to troubleshoot it. And to fix those verification tokens and redirection.
I did all of the following: I’m thinking to fix the change password, change email, and report a bug functions. Also, make it able to upload GIFs for content types because currently, although possible, it is not working. I don’t know why. I have to troubleshoot it. And to fix those verification tokens and redirection. Problems I ENCOUNTERED: I tried and tried times again to fix my redirecting script for half an hour antil my stupid a$$ realised the problem was that resend was injecting a tracker in the website to track if the email was clicked and I removed it resulting on verification links working. After searching up my content error on stack overflow I found out it was neither a supabase or python storing error but it was in fact a nginx framework error that needed one line to be solved:( UP NEXT I am currently running Pentests and rawlers to optimise my webapps cybersecurity and when done I ll prevent any vulenerabilities (I got dyslexia). Right after that I ll try to get a userbase by using lapse to record me addvertising my site!
Today I worked on the cybersecurity aspect of my site btw :P ( I meant to write : but I did a typo P). I honestly was chilling doing nginx configuration and I also secured the recaptcha key. I also took heed of one of my comments and added an api for malicious domains plus I hardcoded some others. I also moved the sanatisation to the forms themselves (post, create group)
Hello!!! Sooooo I Did a few things like: I added pagination for if and when I get a larger userbase the app/webapp won’t crash (Mostly for mobile users) by loading all posts at once. I added a few things in the backend to make expanding this app/webapp easier. I also added RSVP buttons for “Going” and “Interested” in EventDetails and Events pages to make them more interesting. Implemented handleRsvp function to manage user RSVP status and update counts. Adjusted comment reply button to display comment count. Updated requirements.txt to include Pillow and redis. Added a second cron job to cleanup old read notifications NEXT UP: Fixing the UI Add right image sizes in every page w/ content Fix the reversed colours thing
I FINISHED ITTTT! So, I basically cleaned up the CSS as I told in the previous devlog. I also added category tags in every post, which was a feature of the HTML version but I had forgot to add it. Then, I also added a going and interesting interactions in events so that people may express where they would like to go from all the events. I also added the refactored edit and delete functions for events and groups, they weren’t working. I fixed the notifications cleanup which was previously not working, it was a cron job I added in the previous devlog. Also, in the profile page, I have now separated the person’s content into posts and replies, that way the UX is far better. Also, I made a crop image component so that the users can customize which part of the image they want in their PFP, and that is also good because now I don’t have to do the fitting anymore because once they have selected it, only the selected part of the icon is saved, so it becomes a lot more gestible for me. I am also adding content so that stemnet has lots of stuff, and further on I will be adding one or two more details and then shipping it. I really don’t think there is anything else to do, I really put a lot of hours into this, and yeah.
GUYS I DID SOME FINAL TOUCHUPS! I AM READY TO SHIP! THE TOUCHUPS HAD TO DO WITH THE GROUPPOSTS CONTENT RENDERING!💀💀💀💀
Ships:
See video HERE(OLD VERSION OF SITE): https://youtu.be/QUGb-TlbM0Q . I built STEMNet.gr, a student-driven social hub and resource directory designed specifically for Greek students. It aims to bridge the gap for students who lack local access to STEM clubs, robotics, and academic mentorship. It’s a space to discover curated educational resources, post and find events, and build a community where students can learn from and support each other. Moving from a CS50 project to a production-ready application was a steep learning curve. I spent countless hours diving into Flask, Jinja, and database documentation to ensure the site is secure against SQL injections and unauthorized access. Balancing feature development—like AJAX for real-time interaction, mobile responsiveness, and a custom dark/light mode theme system—while ensuring the site remains fast and secure, was the biggest challenge. I am most proud of creating a self-sustaining, alumni-driven ecosystem. This isn’t just a directory; it’s a platform where students can give back by contributing events they’ve discovered, effectively filling the guidance gap for those starting their STEM journey. I’ve successfully migrated it to a faster, more robust server infrastructure, implemented a secure registration flow, and built a fully functional social graph (followers/following).
STEMNet GREECE CAN YOU PLS STAR MY REPO AND GIMME STARS / I POORED A LOT OF EFFORT INTO IT Created by: Rosario Alexandros Morabito (prodevmod) . I built this as a CS50 final project that turned into a real world mission. PLS READ STEMNet was born out of a real struggle in Greece. Here, proper hands-on STEM education and local school clubs are hard to find, and getting your hands on basic electronics like an Arduino is a challenge you either rely on a single physical store in the whole country or buy online. But since parents often don’t trust internet shopping, young innovators get stuck. I wanted to fix this by building a cozy, peer to peer home where young Greek makers of the same age and passion can finally connect, share project feedback, and feel like they aren’t alone. Like I often times feel. Y develop it further The overwhelming amount of positive feedback I got from my previous shipping of the project and my friends who I cowardly showed it to because I was a bit scared they were going to make fun of me pushed me into expanding this with a React framework for the V1, but trust me, even more is coming. What’s Inside the Platform? The STEM Extra Vault: A handy resource library packed with everything students need to kickstart their independent journey into electronics and coding, making up for what traditional schools miss. Community Groups ( can also be used as School Clubs): Forum style discussion spaces where everyone can chat about their favorite topics. Students can even spin up their own groups to act as virtual versions of real world school clubs. Events & Future Webinars: A dedicated space tracking upcoming competitions, team meetups, and future online STEM teaching sessions that I plan to host once the user base grows. Self-Cleaning Notifications: A smart alert system that automatically wipes read notifications older than 30 days (with a cron job for FREE), keeping the interface clean so users never get overwhelmed by clutter. Built-in Safety & Sigma Profiles: BTS, the site keeps things secure with robust account verification thru session cookies and recapca, safe link-checking to keep malicious websites away thru nginx , customized user profiles with social and GitHub links, and easy account settings. I would realy want to see this project skyrocket! If you have any recomandations about how I can scale it or grow my userbase pls tell me!!!...
|
1792968912.174899
|
1793055312.174899
|
|
41081
|
X by @ManoX | Stardance
|
ManoX
|
3
|
99.88
|
1274
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-25T17:20:40Z", "hours": 40.0, "multiplier": 14.9, "payout": 543, "blessing": "neutral", "text": "Ship #3 - X is pre-production ready X is a full-stack React framework written natively in Bun. It has seen 90+h development and is at the point where I can hand it over to someone else and walk away. What’s in the box • File-based routing with SSR, SSG, ISR - pick per route • Islands architecture for client interactivity, no more use client • Server functions, which at build-time are rewritten to fetch wrappers • Authentication package with credentials + OAuth2, sessions, CSRF, brute-force protection, RBAC • Build-time environment leakage check, implemented as an AST visitor that fails the build on a secret accidental exposure • Adapter for Vercel that generates a .vercel/output directory with static CDN and serverless SSR • MCP server for training AI agents that write correct x applications, not hallucinating Next.js code • Structured JSON logs, /healthz, /readyz, OpenTelemetry/Sentry hooks • Docker builds with explicit workspace COPY gates and CVE scanning at build-time What’s been fixed in this cycle: • SQLite session store did not observe created_at on relogin, unlike Postgres • The AuthGuardResult object had { ok: ‘success’, status: 401 } shape on successful auth guard resolution, has been renamed to a discriminated union type to avoid carrying stale data • The Vercel adapter accepted comma-joined X-Forwarded-For headers that should have been rejected • The auth package had code duplication between brute-force protection and audit logging for parsing X-Forwarded-For, consolidated into a clientIpFromRequest util • The hero component on the landing page broke on actual mobile viewports - fixed a responsive slab assumption in the install command component • Docs had foreign framework artifacts (use client directives, wrong loader signatures), all scrubbed CI is properly set up now, only merged branches push changes. For every PR: • TypeScript checks, Biome linting, tests run on Ubuntu/macOS • Postgres migration checks, Docker builds with CVE scans • Package audits (using a sha256-pinned manifest), load-testing with SLOs • Vercel preview deploys, changeset validation for monorepo packages No automatic merging - everything is watched by the repo until the CI turns green and the PR is squashed. Repo: https://github.com/abdelkabirouadoukou/x Docs: https://thexjs.abdelkabir.me/", "repo": "https://github.com/abdelkabirouadoukou/x", "demo": "https://thexjs.abdelkabir.me/"}, {"ship_num": 2, "ts": "2026-08-13T11:57:23Z", "hours": 49.0, "multiplier": 16.15, "payout": 720, "blessing": "neutral", "text": "Ship #2 is finally done after 50+ hours. Shipped build-time secret leak protection, Vercel deployments, structured logging, and a 100/100 PageSpeed landing page redesign. Check the repo for all the devlogs!", "repo": "https://github.com/abdelkabirouadoukou/x", "demo": "https://thexjs.abdelkabir.me/"}, {"ship_num": 3, "ts": "2026-07-29T08:20:41Z", "hours": 2.0, "multiplier": 5.0, "payout": 11, "blessing": "neutral", "text": "Built “X” — a lightweight full-stack React framework powered natively by the Bun runtime. In this update, I focused on getting the core Server-Side Rendering (SSR) pipeline smooth and ultra-fast. I refactored the dev server to make hot-reloading seamless, fixed routing edge cases, and polished the CLI so you can spin up a full-stack React app with zero-config overhead. The goal is to keep modern React development fast, simple, and bloat-free by leveraging Bun’s speed.", "repo": "https://github.com/abdelkabirouadoukou/x", "demo": "https://thexjs.abdelkabir.me/"}]...
|
[{"post_id": 56299, "ts": "202 [{"post_id": 56299, "ts": "2026-08-28T00:54:57Z", "hours": 8.8839, "text": "I will update this post soon.."}, {"post_id": 54609, "ts": "2026-08-25T17:08:22Z", "hours": 1.0106, "text": "Devlog #13 Fixed two critical auth bugs, both related to the auth package; the fixes are already in the PRs (not merged yet, waiting for CI). sqlite session store silently overwritten created_at (#175) Postgres store used ON CONFLICT (token) DO UPDATE, which does not update created_at column on purpose; therefore, on each re-login with the same token, the created_at would remain the same, signifying that the session was created at the same time. However, the sqlite had a different approach of INSERT OR REPLACE which replaced the whole row, including created_at. This PR changes the sqlite version to use the explicit upsert so that both databases behave the same way. Also adds a regression test that purposely creates a session, re-logins with the same token/data and checks that created_at was not changed. The postgres tests are skipped for local DATABASE_URL absent. AuthGuardResult lied on success (#177) AuthGuardResult was a type { ok: boolean; status: 401 | 403; reason: string }, and on success, the guard returned { ok: true, status: 401, reason: “” }, i.e., a 401 status code with an empty reason string. It was not a problem because toMiddleware always checked result.ok first, but it was a silent bug for anyone who tried to check result.status on success. Now it is properly represented as a discriminated union type { ok: true } | { ok: false; status: 401 | 403; reason: string }, and the status and reason fields are not present on success. All tests were adjusted to narrow the type with if (!result.ok) { … }, and a new test checks that TypeScript actually narrows the type."}, {"post_id": 54536, "ts": "2026-08-25T15:47:21Z", "hours": 5.0458, "text": "Devlog #12 this cycle was about mostly about closing the loop from “framework that works” to “framework someone else can actually adopt without me hovering nearby” Most importantly, agents can now understand x every dev I know, including senior devs, is now asking AI to write code for them. AI doesn’t know x conventions and will confidently write next.js or remix code that looks right but isn’t. So I released @thexjs /mcp - an MCP server for claude code, cursor and other agents that gives them concrete documentation for routing, loaders, server functions, env vars, and a scaffold_file tool that generates files in the right shape rather than the agent making up whatever it wants. This gets automatically added to any new project via .mcp.json / .cursor/mcp.json, and there’s also an llms.txt file on the docs for agents that just browse the site. They’re both generated from the same source so they can’t diverge. The docs got a much needed love, not just in terms of content I added the missing @thexjs /mcp docs page, and got it linked into the sidebar/footer/search index (it was in the code but not easy to find). I also fixed some copy that had diverged from the actual implementation, including a docs page that suggested using “use client” directives that the framework doesn’t actually support. The landing page also got some updates The hero section is now properly responsive (it broke on real phones, not just narrow desktops). There was a bug where the docs sidebar was supposed to be sticky but wasn’t - fixed that (turns out it was an ancestor issue, not the sticky style itself). Copy was de-genericized a bit, since it was previously very similar to other dev tool landing pages. Some internal improvements I fixed a bug in the vercel adapter relating to forwarded-header hostname validation, and made some improvements to the scaffolder (shadcn wasn’t being installed when tailwind was automatically enabled, doctor’s semver range checks were actually checking the ranges, etc). I’m now using proper feature branches + PRs for everything rather than pushing to main directly. It’s more work but should avoid situations where, say, the docs get updated to disagree with the framework in confusing ways. If you want more details on any of this, check my repo!!"}, {"post_id": 53664, "ts": "2026-08-24T10:17:25Z", "hours": 3.4794, "text": "This post will be updated soon.."}, {"post_id": 51202, "ts": "2026-08-20T18:33:34Z", "hours": 8.7919, "text": "I will update this post with all fixes and fetaures i did [Update]: Just posted my last devlog, go read that for the full details! Worked on the @thexjs /mcp server (so that AI agents won’t make up incorrect code for x), some documentation cleanup, some landing page hero/sidebar improvements, and a few adapter/scaffolder bug fixes. Repo links are included if you want to see the real code changes!"}, {"post_id": 50140, "ts": "2026-08-19T07:36:27Z", "hours": 8.1294, "text": "I will update this post with all fixes and fetaures i did [Update]: Just posted my last devlog, go read that for the full details! Worked on the @thexjs /mcp server (so that AI agents won’t make up incorrect code for x), some documentation cleanup, some landing page hero/sidebar improvements, and a few adapter/scaffolder bug fixes. Repo links are included if you want to see the real code changes!"}, {"post_id": 49634, "ts": "2026-08-18T14:59:13Z", "hours": 13.5803, "text": "A loot of update i did plz check my repo to see them all [Update]: Just posted my last devlog, go read that for the full details! Worked on the @thexjs /mcp server (so that AI agents won’t make up incorrect code for x), some documentation cleanup, some landing page hero/sidebar improvements, and a few adapter/scaffolder bug fixes. Repo links are included if you want to see the real code changes!"}, {"post_id": 43975, "ts": "2026-08-09T13:31:41Z", "hours": 8.6686, "text": "Devlog #11 I found that browsers automatically remove tabs and newlines from a URL before checking its scheme, whereas my regex did not, and hence, I missed that javascript URLs could still bypass the sanitization and that is why they still worked. It ended up being part of releases 1.1.0 and 1.2.0. Also, I discovered that when checking whether environment leakage exists (build command is “x build”), this check silently fails without any message if environment is indeed leaky secrets get masked properly but “x build” exits with 0 and therefore CI never discovers that a feature has quietly malfunctioned. This time, the patches for both of these issues have been made properly and checked manually before merging. Roadmap backlog has been taken care of after that. The items are a real end-to-end RBAC example, Redis multi-replica soak test, which would stress the multi-db system in a very large-scale environment; and a time when the security disclosure SLA is truly acted out in real life scenario not just being a paper trail."}, {"post_id": 43364, "ts": "2026-08-08T15:55:01Z", "hours": 5.4342, "text": "Development Blog #10 I spent most of my time working on the documentation backlog of adding new features. The @thexjs /auth was released a blogs ago but I still had not done the documentation for it. We did not have a page for this and some old references were no longer working in other parts of the application. I made a page for /docs/packages/auth on the website. This page has instructions, information about the endpoints and details about CSRF. I also added links to this page from the data-layer and security pages so I do not have to repeat the information in many places. I also started working on the testing gaps that were on the roadmap and marked as “beta” or “not tested”. This includes things like what happens when Postgres is not working problems with authorization and limits for instances using Redis. I changed the way I work on changes. Of making all the changes in the main branch I now make a separate branch, for each change and then open a pull request. This is a way to do things so I will keep doing it this way."}, {"post_id": 41058, "ts": "2026-08-05T00:38:01Z", "hours": 1.7586, "text": "DevLog #9 I ran PageSpeed Insights on the x landing page and obtained the following results: 100 for performance, 100 for accessibility, 100 for best practices, 91 for SEO on desktop, and 96, 100, 100, and 91 on mobile. For a page that makes no use of any framework-level image optimization or lazy-loading techniquesinstead it’s just a monochrome static page built with Bun the SEO score of 91 is likely due to the fact that I haven’t yet added the meta tags; all the other aspects are clean. Built with x: https://github.com/abdelkabirouadoukou/x"}, {"post_id": 41017, "ts": "2026-08-04T22:18:29Z", "hours": 7.6453, "text": "Devlog #8 I redesigned the landing page. It is now black and white with no color at all. I reduced the boot animation from about 5.5 seconds to 4 seconds. CI now runs “bun run build” and a format check on every PR, not just typecheck, lint, and tests. I rewrote most of the docs to reflect reality. There are new pages for Islands, ISR, catch-all routes, batch server-function registration, and CLI flags. I fixed several issues that had occurred, including the wrong RouteProps type, bad apiDir docs, and incorrect 404/middleware behavior. Code blocks now use a monochrome token palette that matches the new design. I also fixed an actual bug. The rate limiter used a shared “unknown” bucket when proxy headers were missing. This meant one client’s burst could cause a 429 error for everyone else. Now it uses the correct socket IP first. I also corrected the missing content-type in the 429 response, which was causing issues with static assets in some browsers."}, {"post_id": 38644, "ts": "2026-08-01T04:33:59Z", "hours": 3.1678, "text": "Devlog #7: clean audits, fixed styling, faster boarding passes This round was about tightening things up. The dependency audit is finally clean with zero ignores. There are no more accepted-risk advisories in CI. Just real fixes: pinned overrides on esbuild and @hono /node-server, and moving shadcn out of production dependencies where it never belonged. I also fixed a frustrating Vercel bug where deployed pages lost their stylesheet. It turns out existsSync doesn’t work the way you’d expect inside a serverless bundle. Now, the CSS href gets included at build time instead of being guessed at runtime. Smaller wins: I swapped the landing page fonts to Space Grotesk, Inter, and JetBrains Mono (all self-hosted, no Google Fonts), fixed a boarding-pass demo bug where signed bit shifts were producing -6undefined seat numbers, and cleaned up lint/typecheck across the workspace. Repo (⭐ appreciated): https://github.com/abdelkabirouadoukou/x Website: https://thexjs.vercel.app/"}, {"post_id": 38288, "ts": "2026-07-31T16:29:57Z", "hours": 14.9219, "text": "Log entry #6: on the day React’s own dispatcher attempted to become window.dispatchEvent Today six items were shipped; one took a lot longer to track down than it should have. The bug: clicking search crashed the site, but only in production Click the search bar, and the command palette should appear. Instead, the deployed build produced: Cannot read properties of undefined (reading ‘target’) Deep inside React’s event system. Not during development. Only in production. It has now been discovered that the island bundle is shipped as a classic rather than as a module, as a result, top-level declarations end up on the window object. In the minified bundle there was a top-level function called dispatchEvent: this was React DOM’s internal event dispatcher, having the same name as the browser’s actual dispatchEvent function, and it quietly overwritten window.dispatchEvent. The search trigger causes a synthetic ⌘K keydown event to be sent to the window in order to activate the palette island. It was doing this by calling React’s internal dispatcher with a raw keydown event and without a nativeEvent, which caused React to fail when it tried to read .target from an object of the incorrect shape. Solution: wrap each emitted island bundle (including the build output and the dev path) in an IIFE so that no top-level declaration now reaches the window object at all. This has been tested to ensure it works correctly. Nested layouts were rendering inside-out The _layout.tsx files contained within the route folders were behaving incorrectly by having the section layout wrap the root rather than the reverse. In order to correct this, the wrap order was reversed in the function renderPageWithLayout so that the root always remains the outermost element. Hydration mismatches stopped spamming the console Islands that have a non-deterministic initial state (mostly games) will always cause a mismatch with SSR output; although React handles the situation without any problems by re-rendering on the client side, each mismatch is still logged as a full error which could in turn spread through the event system. A no-op function was passed to the onRecoverableError handler so that these errors fail silently. Shipped: ⌘K command palette + a konami code easter egg The fuzzy-search palette is now its own island with React as its root, appearing through the same synthetic keydown event that brought up the bug mentioned above (as usual, dogfooding), and I’ve also included a Konami code easter egg. Vercel adapter The x build –adapter vercel now produces a proper .vercel/output in accordance with Vercel’s Build Output API, including the static HTML and island chunks as well as a bundled serverless render function. The route preloading and createApp have been adjusted so that the behaviour of the static and serverless versions matches that of local development. The packages/adapter-vercel have been divided into their own workspace package. Landing redesign + /play New styles, fonts, loading states, and the logo on the docs site. The bigger addition is the /play feature, which turns the framework into a small arcade—route matching treated as a game, an interactive environment leak-protection demonstration, and a static-versus-server call behaviour that you can click through. Two components have already been developed: leak-check (to provide a visual indication of the client/server boundary) and mode-call (comparing static and server rendering side by side). There are six fixes, one adapter, one new page, and a bug resulting from two functions sharing a name rather too casually. Tomorrow: it will probably be more of the same."}, {"post_id": 37586, "ts": "2026-07-30T12:47:06Z", "hours": 4.4567, "text": "Devlog #5: why I built x This all began when I was trying to launch my SaaS, autopermit (autopermit.vercel.app). whenever I clicked anything in Vercel’s dashboard, it was slow to respond. I had previously worked with Astro and built a simple blog. That was a good learning experience, and I liked the speed of the frontend framework. however, I wanted strong backend performance like Next.js offered. I knew I could combine the backend of Next.js with the frontend of Astro, but I wasn’t sure how to make it work for me or why I needed to do it. Then I found Bun, and everything became clear. Bun provided many important features right out of the box: bundler, runtime engine, package manager, and embedded database drivers. i realized i didn’t need to try to combine two heavyweight frameworks anymore. Github Repo (Give it Star ⭐️): https://github.com/abdelkabirouadoukou/x Website of FrameWork: https://thexjs.vercel.app/"}, {"post_id": 37122, "ts": "2026-07-29T16:39:39Z", "hours": 2.5361, "text": "DevLog #4 I’ve built x ( @thexjs ), a single-process, full-stack React framework which runs native on Bun. Project’s on StarDance: https://stardance.hackclub.com/home Why Next.js and the other tools come with Webpack or Vite, together with a development server and a lot of additional abstractions. Bun has already incorporated transpiling, bundling, package management, and native HTTP support , it even includes support for SQLite and Postgres. Which is why, rather than wrapping React around another bundler, I have built it to work directly with what Bun already provides. What it does The system is based on files just place a .tsx file in the src/pages/ directory and it becomes a route. Each route individually chooses whether to use SSR or static pre-rendering (by using the statement export const mode = “static”). The API routes are located in src/api/ and share their memory and database context with the rest of the application. Server functions enable you to call type-safe backend logic directly from within a component. Regarding security, there is build-time leak detection based on AST so that secrets won’t end up in the client bundles, together with CSRF protection and rate limiting built in. For use in production, /healthz and /readyz are provided, along with JSON logging and support for OpenTelemetry and Sentry. The application can be deployed to a VPS, using Docker, or on Vercel via @thexjs /adapter-vercel. Quickstart bash bun create thexjs-app@latest my-app cd my-app bun run dev You get a working app in less than a minute. Link: https://github.com/abdelkabirouadoukou/x If you look around and happen upon anything that’s broken, then open an issue I’ll look into it."}, {"post_id": 36944, "ts": "2026-07-29T10:58:23Z", "hours": 0.8828, "text": "Dev log #3 Shipped new features for x this week: a Vercel adapter, a real security layer, and observability that doesn’t depend on console.log. Vercel adapter ( @thexjs /adapter-vercel) Deploying to Vercel used to require dealing with vercel.json or using runtime hacks. The adapter now connects directly to the build pipeline and creates a proper .vercel/output/ directory. Static hydration bundles and media go to the CDN. SSR routes and server actions get packaged into a standalone Node-compatible ESM function. A config.json manifest directs static files first with SSR as the backup. No configuration is needed. Security @thexjs /core now checks client bundles during the build. If a server-only environment variable, such as STRIPE_SECRET_KEY, slips through without the THEXJS_PUBLIC_ prefix, the build fails immediately—preventing any leaks. Server actions reaching /__x/actions/* get automatic Origin/Referer verification with support for double-submit cookies to protect against CSRF. There’s also built-in CSP, HSTS, and X-Frame-Options headers, along with a customizable in-memory rate limiter. Observability Logs are now structured as JSON, including timestamp, requestId, status, and durationMs. This format works with Datadog, Loki, or Grafana without needing to parse raw text. Added /healthz and /readyz endpoints run before route matching, for those using this in Kubernetes. The createSentryReporter and createOtelReporter hooks automatically catch unhandled SSR and action errors. Config example: import { createApp , createSentryReporter } from \" @thexjs/core \" ; const app = createApp ({ pagesDir : \" ./src/pages \" , actionsDir : \" ./src/actions \" , security : { csrf : { allowedOrigins : [ \" https://app.example.com \" ] }, headers : { contentSecurityPolicy : \" default-src 'self' \" }, rateLimit : { limit : 100 , windowMs : 60 _000 }, }, observability : { logging : true , errorReporter : createSentryReporter ( Sentry ), health : { checks : { database : () => db . ping () } }, }, }); Still working through the rest of the PRD. Routing, i18n, and caching are next."}, {"post_id": 36888, "ts": "2026-07-29T08:19:21Z", "hours": 1.6447, "text": "Dev log #2 Log entry: I’ve been working over the past few days on SSR performance and sorting out the DX side. I reduced the initial size of the payload and altered the way components hydrate, which as a result decreased response latency on the native Bun HTTP server. I refactored the startup CLI and improved hot module reloading, file changes now appear instantly rather than sometimes needing a restart. A routing bug involving the parsing of query parameters which was causing problems with the serving of static assets in certain situations has also been fixed, and the way in which internal state is managed throughout the request lifecycle has been cleaned up. What was annoying was the situation with concurrent requests when doing hot reloads since Bun would leave the state hanging between reloads, a problem that only became apparent under heavy load. It took some time to work out what was going on and in the end I added more detailed logging to detect the cases where the memory wasn’t being freed. The server now runs cleanly without the need for manual restarts, which was the real aim."}, {"post_id": 36836, "ts": "2026-07-29T04:32:21Z", "hours": 0.5161, "text": "Dev log #1 Shipped x (TheXJS) to npm. It’s a full-stack React framework built on Bun. I wanted server-side rendering that truly takes advantage of Bun’s runtime instead of just running on top of it like everything else does. It’s a monorepo. The core engine and CLI are separate packages, so you won’t pull in tools you don’t need. The command bun create thexjs-app sets up a working project in one step. The documentation is live at the link below, and I’m still filling in gaps as I go. Live demo & docs: https://thexjs.vercel.app/ npm: https://www.npmjs.com/~abdelkabirouadoukou create-thexjs-app: https://www.npmjs.com/package/create-thexjs-app @thexjs /core: https://www.npmjs.com/package/@thexjs/core @thexjs /env: https://www.npmjs.com/package/@thexjs/env @thexjs /cli: https://www.npmjs.com/package/@thexjs/cli Repo: https://github.com/abdelkabirouadoukou/x If you try it and something breaks, let me know. That’s the fastest way for me to fix it."}]...
|
Title: X by @ManoX | Stardance
Devlogs:
Dev log # Title: X by @ManoX | Stardance
Devlogs:
Dev log #1 Shipped x (TheXJS) to npm. It’s a full-stack React framework built on Bun. I wanted server-side rendering that truly takes advantage of Bun’s runtime instead of just running on top of it like everything else does. It’s a monorepo. The core engine and CLI are separate packages, so you won’t pull in tools you don’t need. The command bun create thexjs-app sets up a working project in one step. The documentation is live at the link below, and I’m still filling in gaps as I go. Live demo & docs: https://thexjs.vercel.app/ npm: https://www.npmjs.com/~abdelkabirouadoukou create-thexjs-app: https://www.npmjs.com/package/create-thexjs-app @thexjs /core: https://www.npmjs.com/package/@thexjs/core @thexjs /env: https://www.npmjs.com/package/@thexjs/env @thexjs /cli: https://www.npmjs.com/package/@thexjs/cli Repo: https://github.com/abdelkabirouadoukou/x If you try it and something breaks, let me know. That’s the fastest way for me to fix it.
Dev log #2 Log entry: I’ve been working over the past few days on SSR performance and sorting out the DX side. I reduced the initial size of the payload and altered the way components hydrate, which as a result decreased response latency on the native Bun HTTP server. I refactored the startup CLI and improved hot module reloading, file changes now appear instantly rather than sometimes needing a restart. A routing bug involving the parsing of query parameters which was causing problems with the serving of static assets in certain situations has also been fixed, and the way in which internal state is managed throughout the request lifecycle has been cleaned up. What was annoying was the situation with concurrent requests when doing hot reloads since Bun would leave the state hanging between reloads, a problem that only became apparent under heavy load. It took some time to work out what was going on and in the end I added more detailed logging to detect the cases where the memory wasn’t being freed. The server now runs cleanly without the need for manual restarts, which was the real aim.
Dev log #3 Shipped new features for x this week: a Vercel adapter, a real security layer, and observability that doesn’t depend on console.log. Vercel adapter ( @thexjs /adapter-vercel) Deploying to Vercel used to require dealing with vercel.json or using runtime hacks. The adapter now connects directly to the build pipeline and creates a proper .vercel/output/ directory. Static hydration bundles and media go to the CDN. SSR routes and server actions get packaged into a standalone Node-compatible ESM function. A config.json manifest directs static files first with SSR as the backup. No configuration is needed. Security @thexjs /core now checks client bundles during the build. If a server-only environment variable, such as STRIPE_SECRET_KEY, slips through without the THEXJS_PUBLIC_ prefix, the build fails immediately—preventing any leaks. Server actions reaching /__x/actions/* get automatic Origin/Referer verification with support for double-submit cookies to protect against CSRF. There’s also built-in CSP, HSTS, and X-Frame-Options headers, along with a customizable in-memory rate limiter. Observability Logs are now structured as JSON, including timestamp, requestId, status, and durationMs. This format works with Datadog, Loki, or Grafana without needing to parse raw text. Added /healthz and /readyz endpoints run before route matching, for those using this in Kubernetes. The createSentryReporter and createOtelReporter hooks automatically catch unhandled SSR and action errors. Config example: import { createApp , createSentryReporter } from " @thexjs/core " ; const app = createApp ({ pagesDir : " ./src/pages " , actionsDir : " ./src/actions " , security : { csrf : { allowedOrigins : [ " https://app.example.com " ] }, headers : { contentSecurityPolicy : " default-src 'self' " }, rateLimit : { limit : 100 , windowMs : 60 _000 }, }, observability : { logging : true , errorReporter : createSentryReporter ( Sentry ), health : { checks : { database : () => db . ping () } }, }, }); Still working through the rest of the PRD. Routing, i18n, and caching are next.
DevLog #4 I’ve built x ( @thexjs ), a single-process, full-stack React framework which runs native on Bun. Project’s on StarDance: https://stardance.hackclub.com/home Why Next.js and the other tools come with Webpack or Vite, together with a development server and a lot of additional abstractions. Bun has already incorporated transpiling, bundling, package management, and native HTTP support , it even includes support for SQLite and Postgres. Which is why, rather than wrapping React around another bundler, I have built it to work directly with what Bun already provides. What it does The system is based on files just place a .tsx file in the src/pages/ directory and it becomes a route. Each route individually chooses whether to use SSR or static pre-rendering (by using the statement export const mode = “static”). The API routes are located in src/api/ and share their memory and database context with the rest of the application. Server functions enable you to call type-safe backend logic directly from within a component. Regarding security, there is build-time leak detection based on AST so that secrets won’t end up in the client bundles, together with CSRF protection and rate limiting built in. For use in production, /healthz and /readyz are provided, along with JSON logging and support for OpenTelemetry and Sentry. The application can be deployed to a VPS, using Docker, or on Vercel via @thexjs /adapter-vercel. Quickstart bash bun create thexjs-app@latest my-app cd my-app bun run dev You get a working app in less than a minute. Link: https://github.com/abdelkabirouadoukou/x If you look around and happen upon anything that’s broken, then open an issue I’ll look into it.
Devlog #5: why I built x This all began when I was trying to launch my SaaS, autopermit (autopermit.vercel.app). whenever I clicked anything in Vercel’s dashboard, it was slow to respond. I had previously worked with Astro and built a simple blog. That was a good learning experience, and I liked the speed of the frontend framework. however, I wanted strong backend performance like Next.js offered. I knew I could combine the backend of Next.js with the frontend of Astro, but I wasn’t sure how to make it work for me or why I needed to do it. Then I found Bun, and everything became clear. Bun provided many important features right out of the box: bundler, runtime engine, package manager, and embedded database drivers. i realized i didn’t need to try to combine two heavyweight frameworks anymore. Github Repo (Give it Star ⭐️): https://github.com/abdelkabirouadoukou/x Website of FrameWork: https://thexjs.vercel.app/
Log entry #6: on the day React’s own dispatcher attempted to become window.dispatchEvent Today six items were shipped; one took a lot longer to track down than it should have. The bug: clicking search crashed the site, but only in production Click the search bar, and the command palette should appear. Instead, the deployed build produced: Cannot read properties of undefined (reading ‘target’) Deep inside React’s event system. Not during development. Only in production. It has now been discovered that the island bundle is shipped as a classic rather than as a module, as a result, top-level declarations end up on the window object. In the minified bundle there was a top-level function called dispatchEvent: this was React DOM’s internal event dispatcher, having the same name as the browser’s actual dispatchEvent function, and it quietly overwritten window.dispatchEvent. The search trigger causes a synthetic ⌘K keydown event to be sent to the window in order to activate the palette island. It was doing this by calling React’s internal dispatcher with a raw keydown event and without a nativeEvent, which caused React to fail when it tried to read .target from an object of the incorrect shape. Solution: wrap each emitted island bundle (including the build output and the dev path) in an IIFE so that no top-level declaration now reaches the window object at all. This has been tested to ensure it works correctly. Nested layouts were rendering inside-out The _layout.tsx files contained within the route folders were behaving incorrectly by having the section layout wrap the root rather than the reverse. In order to correct this, the wrap order was reversed in the function renderPageWithLayout so that the root always remains the outermost element. Hydration mismatches stopped spamming the console Islands that have a non-deterministic initial state (mostly games) will always cause a mismatch with SSR output; although React handles the situation without any problems by re-rendering on the client side, each mismatch is still logged as a full error which could in turn spread through the event system. A no-op function was passed to the onRecoverableError handler so that these errors fail silently. Shipped: ⌘K command palette + a konami code easter egg The fuzzy-search palette is now its own island with React as its root, appearing through the same synthetic keydown event that brought up the bug mentioned above (as usual, dogfooding), and I’ve also included a Konami code easter egg. Vercel adapter The x build –adapter vercel now produces a proper .vercel/output in accordance with Vercel’s Build Output API, including the static HTML and island chunks as well as a bundled serverless render function. The route preloading and createApp have been adjusted so that the behaviour of the static and serverless versions matches that of local development. The packages/adapter-vercel have been divided into their own workspace package. Landing redesign + /play New styles, fonts, loading states, and the logo on the docs site. The bigger addition is the /play feature, which turns the framework into a small arcade—route matching treated as a game, an interactive environment leak-protection demonstration, and a static-versus-server call behaviour that you can click through. Two components have already been developed: leak-check (to provide a visual indication of the client/server boundary) and mode-call (comparing static and server rendering side by side). There are six fixes, one adapter, one new page, and a bug resulting from two functions sharing a name rather too casually. Tomorrow: it will probably be more of the same.
Devlog #7: clean audits, fixed styling, faster boarding passes This round was about tightening things up. The dependency audit is finally clean with zero ignores. There are no more accepted-risk advisories in CI. Just real fixes: pinned overrides on esbuild and @hono /node-server, and moving shadcn out of production dependencies where it never belonged. I also fixed a frustrating Vercel bug where deployed pages lost their stylesheet. It turns out existsSync doesn’t work the way you’d expect inside a serverless bundle. Now, the CSS href gets included at build time instead of being guessed at runtime. Smaller wins: I swapped the landing page fonts to Space Grotesk, Inter, and JetBrains Mono (all self-hosted, no Google Fonts), fixed a boarding-pass demo bug where signed bit shifts were producing -6undefined seat numbers, and cleaned up lint/typecheck across the workspace. Repo (⭐ appreciated): https://github.com/abdelkabirouadoukou/x Website: https://thexjs.vercel.app/
Devlog #8 I redesigned the landing page. It is now black and white with no color at all. I reduced the boot animation from about 5.5 seconds to 4 seconds. CI now runs “bun run build” and a format check on every PR, not just typecheck, lint, and tests. I rewrote most of the docs to reflect reality. There are new pages for Islands, ISR, catch-all routes, batch server-function registration, and CLI flags. I fixed several issues that had occurred, including the wrong RouteProps type, bad apiDir docs, and incorrect 404/middleware behavior. Code blocks now use a monochrome token palette that matches the new design. I also fixed an actual bug. The rate limiter used a shared “unknown” bucket when proxy headers were missing. This meant one client’s burst could cause a 429 error for everyone else. Now it uses the correct socket IP first. I also corrected the missing content-type in the 429 response, which was causing issues with static assets in some browsers.
DevLog #9 I ran PageSpeed Insights on the x landing page and obtained the following results: 100 for performance, 100 for accessibility, 100 for best practices, 91 for SEO on desktop, and 96, 100, 100, and 91 on mobile. For a page that makes no use of any framework-level image optimization or lazy-loading techniquesinstead it’s just a monochrome static page built with Bun the SEO score of 91 is likely due to the fact that I haven’t yet added the meta tags; all the other aspects are clean. Built with x: https://github.com/abdelkabirouadoukou/x
Development Blog #10 I spent most of my time working on the documentation backlog of adding new features. The @thexjs /auth was released a blogs ago but I still had not done the documentation for it. We did not have a page for this and some old references were no longer working in other parts of the application. I made a page for /docs/packages/auth on the website. This page has instructions, information about the endpoints and details about CSRF. I also added links to this page from the data-layer and security pages so I do not have to repeat the information in many places. I also started working on the testing gaps that were on the roadmap and marked as “beta” or “not tested”. This includes things like what happens when Postgres is not working problems with authorization and limits for instances using Redis. I changed the way I work on changes. Of making all the changes in the main branch I now make a separate branch, for each change and then open a pull request. This is a way to do things so I will keep doing it this way.
Devlog #11 I found that browsers automatically remove tabs and newlines from a URL before checking its scheme, whereas my regex did not, and hence, I missed that javascript URLs could still bypass the sanitization and that is why they still worked. It ended up being part of releases 1.1.0 and 1.2.0. Also, I discovered that when checking whether environment leakage exists (build command is “x build”), this check silently fails without any message if environment is indeed leaky secrets get masked properly but “x build” exits with 0 and therefore CI never discovers that a feature has quietly malfunctioned. This time, the patches for both of these issues have been made properly and checked manually before merging. Roadmap backlog has been taken care of after that. The items are a real end-to-end RBAC example, Redis multi-replica soak test, which would stress the multi-db system in a very large-scale environment; and a time when the security disclosure SLA is truly acted out in real life scenario not just being a paper trail.
A loot of update i did plz check my repo to see them all [Update]: Just posted my last devlog, go read that for the full details! Worked on the @thexjs /mcp server (so that AI agents won’t make up incorrect code for x), some documentation cleanup, some landing page hero/sidebar improvements, and a few adapter/scaffolder bug fixes. Repo links are included if you want to see the real code changes!
I will update this post with all fixes and fetaures i did [Update]: Just posted my last devlog, go read that for the full details! Worked on the @thexjs /mcp server (so that AI agents won’t make up incorrect code for x), some documentation cleanup, some landing page hero/sidebar improvements, and a few adapter/scaffolder bug fixes. Repo links are included if you want to see the real code changes!
I will update this post with all fixes and fetaures i did [Update]: Just posted my last devlog, go read that for the full details! Worked on the @thexjs /mcp server (so that AI agents won’t make up incorrect code for x), some documentation cleanup, some landing page hero/sidebar improvements, and a few adapter/scaffolder bug fixes. Repo links are included if you want to see the real code changes!
This post will be updated soon..
Devlog #12 this cycle was about mostly about closing the loop from “framework that works” to “framework someone else can actually adopt without me hovering nearby” Most importantly, agents can now understand x every dev I know, including senior devs, is now asking AI to write code for them. AI doesn’t know x conventions and will confidently write next.js or remix code that looks right but isn’t. So I released @thexjs /mcp - an MCP server for claude code, cursor and other agents that gives them concrete documentation for routing, loaders, server functions, env vars, and a scaffold_file tool that generates files in the right shape rather than the agent making up whatever it wants. This gets automatically added to any new project via .mcp.json / .cursor/mcp.json, and there’s also an llms.txt file on the docs for agents that just browse the site. They’re both generated from the same source so they can’t diverge. The docs got a much needed love, not just in terms of content I added the missing @thexjs /mcp docs page, and got it linked into the sidebar/footer/search index (it was in the code but not easy to find). I also fixed some copy that had diverged from the actual implementation, including a docs page that suggested using “use client” directives that the framework doesn’t actually support. The landing page also got some updates The hero section is now properly responsive (it broke on real phones, not just narrow desktops). There was a bug where the docs sidebar was supposed to be sticky but wasn’t - fixed that (turns out it was an ancestor issue, not the sticky style itself). Copy was de-genericized a bit, since it was previously very similar to other dev tool landing pages. Some internal improvements I fixed a bug in the vercel adapter relating to forwarded-header hostname validation, and made some improvements to the scaffolder (shadcn wasn’t being installed when tailwind was automatically enabled, doctor’s semver range checks were actually checking the ranges, etc). I’m now using proper feature branches + PRs for everything rather than pushing to main directly. It’s more work but should avoid situations where, say, the docs get updated to disagree with the framework in confusing ways. If you want more details on any of this, check my repo!!
Devlog #13 Fixed two critical auth bugs, both related to the auth package; the fixes are already in the PRs (not merged yet, waiting for CI). sqlite session store silently overwritten created_at (#175) Postgres store used ON CONFLICT (token) DO UPDATE, which does not update created_at column on purpose; therefore, on each re-login with the same token, the created_at would remain the same, signifying that the session was created at the same time. However, the sqlite had a different approach of INSERT OR REPLACE which replaced the whole row, including created_at. This PR changes the sqlite version to use the explicit upsert so that both databases behave the same way. Also adds a regression test that purposely creates a session, re-logins with the same token/data and checks that created_at was not changed. The postgres tests are skipped for local DATABASE_URL absent. AuthGuardResult lied on success (#177) AuthGuardResult was a type { ok: boolean; status: 401 | 403; reason: string }, and on success, the guard returned { ok: true, status: 401, reason: “” }, i.e., a 401 status code with an empty reason string. It was not a problem because toMiddleware always checked result.ok first, but it was a silent bug for anyone who tried to check result.status on success. Now it is properly represented as a discriminated union type { ok: true } | { ok: false; status: 401 | 403; reason: string }, and the status and reason fields are not present on success. All tests were adjusted to narrow the type with if (!result.ok) { … }, and a new test checks that TypeScript actually narrows the type.
I will update this post soon..
Ships:
Built “X” — a lightweight full-stack React framework powered natively by the Bun runtime. In this update, I focused on getting the core Server-Side Rendering (SSR) pipeline smooth and ultra-fast. I refactored the dev server to make hot-reloading seamless, fixed routing edge cases, and polished the CLI so you can spin up a full-stack React app with zero-config overhead. The goal is to keep modern React development fast, simple, and bloat-free by leveraging Bun’s speed.
Ship #2 is finally done after 50+ hours. Shipped build-time secret leak protection, Vercel deployments, structured logging, and a 100/100 PageSpeed landing page redesign. Check the repo for all the devlogs!
Ship #3 - X is pre-production ready X is a full-stack React framework written natively in Bun. It has seen 90+h development and is at the point where I can hand it over to someone else and walk away. What’s in the box • File-based routing with SSR, SSG, ISR - pick per route • Islands architecture for client interactivity, no more use client • Server functions, which at build-time are rewritten to fetch wrappers • Authentication package with credentials + OAuth2, sessions, CSRF, brute-force protection, RBAC • Build-time environment leakage check, implemented as an AST visitor that fails the build on a secret accidental exposure • Adapter for Vercel that generates a .vercel/output directory with static CDN and serverless SSR • MCP server for training AI agents that write correct x applications, not hallucinating Next.js code • Structured JSON logs, /healthz, /readyz, OpenTelemetry/Sentry hooks • Docker builds with explicit workspace COPY gates and CVE scanning at build-time What’s been fixed in this cycle: • SQLite session store did not observe created_at on relogin, unlike Postgres • The AuthGuardResult object had { ok: ‘success’, status: 401 } shape on successful auth guard resolution, has been renamed to a discriminated union type to avoid carrying stale data • The Vercel adapter accepted comma-joined X-Forwarded-For headers that should have been rejected • The auth package had code duplication between brute-force protection and audit logging for parsing X-Forwarded-For, consolidated into a clientIpFromRequest util • The hero component on the landing page broke on actual mobile viewports - fixed a responsive slab assumption in the install command component • Docs had foreign framework artifacts (use client directives, wrong loader signatures), all scrubbed CI is properly set up now, only merged branches push changes. For every PR: • TypeScript checks, Biome linting, tests run on Ubuntu/macOS • Postgres migration checks, Docker builds with CVE scans • Package audits (using a sha256-pinned manifest), load-testing with SLOs • Vercel preview deploys, changeset validation for monorepo packages No automatic merging - everything is watched by the repo until the CI turns green and the PR is squashed. Repo: https://github.com/abdelkabirouadoukou/x Docs: https://thexjs.abdelkabir.me/...
|
1792986959.6449192
|
1793073359.6449192
|
|
7084
|
ALL of the board games I like or Invented by @Nezr ALL of the board games I like or Invented by @Nezruceuil | Stardance...
|
Nezruceuil
|
1
|
151.0
|
1265
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-30T19:52:05Z", "hours": 151.0, "multiplier": 8.44, "payout": 1265, "blessing": "neutral", "text": "I coded a Game in which you can play all of my favorite board games and the games that I invented. I deepened my Godot coding knowledge by recreating complicated games like: Chess, Reversi, Go, Tafl and Shōgi. I really enjoyed doing this project and now you can enjoy it too! hey, if you write **Stardance** in the background texture you can get this amazing background ↓. ✨", "repo": "https://github.com/Nezruceuil/my-board-games", "demo": "https://nezruceuil.itch.io/cool-board-games"}]...
|
[{"post_id": 75686, "ts": "202 [{"post_id": 75686, "ts": "2026-09-30T19:11:44Z", "hours": 1.1744, "text": "Fixed Bugs and added new secrets panels."}, {"post_id": 71414, "ts": "2026-09-20T19:42:26Z", "hours": 9.54, "text": "Fixed bugs, improved my game, added recommendation, added a way to order the games however you want, added art for amazons game fire and added a Chess panel."}, {"post_id": 61656, "ts": "2026-09-04T17:57:46Z", "hours": 5.3467, "text": "Improve my board game, fixed bugs, added a texture for the walls, added a play time estimation for every games, added Amazons and added Gomoku."}, {"post_id": 58882, "ts": "2026-08-31T13:38:25Z", "hours": 1.7225, "text": "Fixed more bugs (tafl and text in wrong place.) and improved Castle War and added some art to it."}, {"post_id": 58076, "ts": "2026-08-30T12:49:31Z", "hours": 10.0364, "text": "Fixed Bugs (tafl,drawback chess,ect…), Added a Spring panel, Added Amazons and Added Castle War (my own strategy game)."}, {"post_id": 48101, "ts": "2026-08-16T12:03:28Z", "hours": 9.0517, "text": "fixed Bugs, added 2 new chess variants and Added 15 unique drawbacks to drawback chess!"}, {"post_id": 46333, "ts": "2026-08-13T14:07:53Z", "hours": 9.0744, "text": "Fixed bugs, added a Hazelnut fight ai (not entirely done) and added more drawbacks to drawback chess."}, {"post_id": 43342, "ts": "2026-08-08T15:20:23Z", "hours": 8.5814, "text": "Added better panel for the main page (added a Summer panel a Winter panel that you can get by being on the game at the right season. and a star dance panel that you can get by typing “Stardance”. (I drew all of the panels myself.)) , added a Save and Load function, change all of the text font to be better and added a script to see the panel (control/option space)."}, {"post_id": 40696, "ts": "2026-08-04T11:49:37Z", "hours": 1.2158, "text": "fixed bugs, improved design and added a delete drawings and arrows function win delete. (a lot of arrows + delete button = no more arrows)"}, {"post_id": 39671, "ts": "2026-08-02T20:01:01Z", "hours": 4.1125, "text": "added an arrow drawing ability and fixed bugs."}, {"post_id": 38699, "ts": "2026-08-01T06:56:05Z", "hours": 1.4872, "text": "added an explanation for every games and fixed bugs with the lines of action game."}, {"post_id": 38178, "ts": "2026-07-31T13:20:17Z", "hours": 1.7389, "text": "fixed a bug with chess and added lines of action!"}, {"post_id": 37562, "ts": "2026-07-30T11:46:29Z", "hours": 3.5211, "text": "fixed bugs and added Go!"}, {"post_id": 37224, "ts": "2026-07-29T19:30:53Z", "hours": 1.4664, "text": "finished making talf games (added the king suffocation mechanic) !"}, {"post_id": 36562, "ts": "2026-07-28T19:20:19Z", "hours": 3.0928, "text": "started added talf game( ≈ 85% done) still need to add the king capture feature"}, {"post_id": 35321, "ts": "2026-07-26T17:18:12Z", "hours": 1.8692, "text": "fixed bugs and added more chess variants"}, {"post_id": 35080, "ts": "2026-07-26T08:26:26Z", "hours": 4.0767, "text": "Fixed bugs and added Reversi!"}, {"post_id": 34274, "ts": "2026-07-24T20:51:45Z", "hours": 2.0453, "text": "added bigger tic tac toe and fixed bugs."}, {"post_id": 33662, "ts": "2026-07-23T19:17:40Z", "hours": 2.0328, "text": "added 4 player Chess, fixed bugs and added a boat for Chaturaji."}, {"post_id": 33528, "ts": "2026-07-23T15:39:08Z", "hours": 2.0022, "text": "added an explanation for every game."}, {"post_id": 33148, "ts": "2026-07-22T19:53:27Z", "hours": 4.4092, "text": "fixed bugs and added Chaturaji"}, {"post_id": 31461, "ts": "2026-07-19T20:45:54Z", "hours": 4.3989, "text": "fixed a bug with duck chess and added Shōgi."}, {"post_id": 30822, "ts": "2026-07-18T19:09:14Z", "hours": 6.975, "text": "added every variants( Atomic,Duck Chess,Fog Of War,Giveaway,King Of The Hill,Capture Anything,Torpedo,No Castling,Ghost Board,Sideways ) and added Connect 4"}, {"post_id": 30297, "ts": "2026-07-17T19:08:42Z", "hours": 7.4939, "text": "Started adding an AI for Hazelnut Fight, fixed bugs with castling in the chess games, added a page to play classic chess variants, and a page where you can see all the chess variants coming in the next devlog. I also added an autofill that checks for similarity to fill in variant names (for example: aTuMyk -> Atomic .)"}, {"post_id": 27888, "ts": "2026-07-13T20:03:40Z", "hours": 0.7567, "text": "added color pickers to the options menu."}, {"post_id": 27847, "ts": "2026-07-13T18:47:36Z", "hours": 1.3992, "text": "added a classic version to pieces fit!"}, {"post_id": 24673, "ts": "2026-07-08T12:50:10Z", "hours": 4.3453, "text": "Added ‘Pieces Fit,’ a game where everyone is given the same randomly generated custom piece and must place as many copies of it as possible without any of them attacking each other."}, {"post_id": 24151, "ts": "2026-07-07T15:08:03Z", "hours": 3.4447, "text": "fixed bugs with some drawbacks and added 5 more uniques drawbacks"}, {"post_id": 22245, "ts": "2026-07-04T16:41:55Z", "hours": 2.2403, "text": "added a resign button 5 more unique drawback and fixed bugs"}, {"post_id": 22065, "ts": "2026-07-04T09:47:55Z", "hours": 3.5369, "text": "added Drawback Chess with 15 drawbacks!"}, {"post_id": 20990, "ts": "2026-07-02T18:48:12Z", "hours": 3.8056, "text": "added draw to the chess games and a options menu (that doesn’t do anything yet)"}, {"post_id": 19446, "ts": "2026-06-30T19:25:45Z", "hours": 0.8839, "text": "added normal chess"}, {"post_id": 19383, "ts": "2026-06-30T17:58:23Z", "hours": 0.91, "text": "added a drawing ability , added color to see the last movement of your enemy and it now turn 180° every turn."}, {"post_id": 19112, "ts": "2026-06-30T11:00:58Z", "hours": 2.1864, "text": "added game mode and additional rule for pizza chess (for example this one makes all pieces looks like pizza ( Kings opening vs King Indian defense ) and you can’t even tell what is what piece)"}, {"post_id": 19057, "ts": "2026-06-30T07:37:39Z", "hours": 8.1514, "text": "added pizza chess (my own version of chess where the left knight is replace by a pizza)"}, {"post_id": 8544, "ts": "2026-06-14T06:27:46Z", "hours": 3.6144, "text": "added a new game with gambling (not real money!)"}, {"post_id": 3536, "ts": "2026-06-06T14:59:28Z", "hours": 1.145, "text": "added a indicator for the player turn and fixed a bug with the golden hazelnut. Added visual to hazelnut fight page in the menu."}, {"post_id": 3391, "ts": "2026-06-06T09:11:28Z", "hours": 0.5789, "text": "Finished the game ! and Fixed some bugs"}, {"post_id": 3377, "ts": "2026-06-06T08:32:40Z", "hours": 0.45, "text": "polished and added texture for this game!"}, {"post_id": 3355, "ts": "2026-06-06T07:38:18Z", "hours": 1.9031, "text": "added a settings for my games that work and finished the gameplay of the game !"}, {"post_id": 3315, "ts": "2026-06-06T05:39:18Z", "hours": 1.3564, "text": "fixed hiding, look around and added a win condition and a win screen!"}, {"post_id": 2792, "ts": "2026-06-05T16:34:28Z", "hours": 1.0958, "text": "added a Hazelnut limit for the inventory, added the possibility of hiding you hazelnuts and added the number of turns"}, {"post_id": 2319, "ts": "2026-06-04T19:05:43Z", "hours": 0.7481, "text": "added movement, look around button with how many hazelnuts you found on your position!"}, {"post_id": 2258, "ts": "2026-06-04T17:29:03Z", "hours": 0.6908, "text": "added a next player button, player turn and player with controlled position!"}, {"post_id": 2137, "ts": "2026-06-04T13:52:30Z", "hours": 0.6044, "text": "added a tile map with random tile (forest, plain or lake) for one of the game"}, {"post_id": 2037, "ts": "2026-06-04T10:08:21Z", "hours": 0.5872, "text": "Added the main page with buttons and a scroll bar"}]...
|
Title: ALL of the board games I like or Invented b Title: ALL of the board games I like or Invented by @Nezruceuil | Stardance
Devlogs:
Added the main page with buttons and a scroll bar
added a tile map with random tile (forest, plain or lake) for one of the game
added a next player button, player turn and player with controlled position!
added movement, look around button with how many hazelnuts you found on your position!
added a Hazelnut limit for the inventory, added the possibility of hiding you hazelnuts and added the number of turns
fixed hiding, look around and added a win condition and a win screen!
added a settings for my games that work and finished the gameplay of the game !
polished and added texture for this game!
Finished the game ! and Fixed some bugs
added a indicator for the player turn and fixed a bug with the golden hazelnut. Added visual to hazelnut fight page in the menu.
added a new game with gambling (not real money!)
added pizza chess (my own version of chess where the left knight is replace by a pizza)
added game mode and additional rule for pizza chess (for example this one makes all pieces looks like pizza ( Kings opening vs King Indian defense ) and you can’t even tell what is what piece)
added a drawing ability , added color to see the last movement of your enemy and it now turn 180° every turn.
added normal chess
added draw to the chess games and a options menu (that doesn’t do anything yet)
added Drawback Chess with 15 drawbacks!
added a resign button 5 more unique drawback and fixed bugs
fixed bugs with some drawbacks and added 5 more uniques drawbacks
Added ‘Pieces Fit,’ a game where everyone is given the same randomly generated custom piece and must place as many copies of it as possible without any of them attacking each other.
added a classic version to pieces fit!
added color pickers to the options menu.
Started adding an AI for Hazelnut Fight, fixed bugs with castling in the chess games, added a page to play classic chess variants, and a page where you can see all the chess variants coming in the next devlog. I also added an autofill that checks for similarity to fill in variant names (for example: aTuMyk -> Atomic .)
added every variants( Atomic,Duck Chess,Fog Of War,Giveaway,King Of The Hill,Capture Anything,Torpedo,No Castling,Ghost Board,Sideways ) and added Connect 4
fixed a bug with duck chess and added Shōgi.
fixed bugs and added Chaturaji
added an explanation for every game.
added 4 player Chess, fixed bugs and added a boat for Chaturaji.
added bigger tic tac toe and fixed bugs.
Fixed bugs and added Reversi!
fixed bugs and added more chess variants
started added talf game( ≈ 85% done) still need to add the king capture feature
finished making talf games (added the king suffocation mechanic) !
fixed bugs and added Go!
fixed a bug with chess and added lines of action!
added an explanation for every games and fixed bugs with the lines of action game.
added an arrow drawing ability and fixed bugs.
fixed bugs, improved design and added a delete drawings and arrows function win delete. (a lot of arrows + delete button = no more arrows)
Added better panel for the main page (added a Summer panel a Winter panel that you can get by being on the game at the right season. and a star dance panel that you can get by typing “Stardance”. (I drew all of the panels myself.)) , added a Save and Load function, change all of the text font to be better and added a script to see the panel (control/option space).
Fixed bugs, added a Hazelnut fight ai (not entirely done) and added more drawbacks to drawback chess.
fixed Bugs, added 2 new chess variants and Added 15 unique drawbacks to drawback chess!
Fixed Bugs (tafl,drawback chess,ect…), Added a Spring panel, Added Amazons and Added Castle War (my own strategy game).
Fixed more bugs (tafl and text in wrong place.) and improved Castle War and added some art to it.
Improve my board game, fixed bugs, added a texture for the walls, added a play time estimation for every games, added Amazons and added Gomoku.
Fixed bugs, improved my game, added recommendation, added a way to order the games however you want, added art for amazons game fire and added a Chess panel.
Fixed Bugs and added new secrets panels.
Ships:
I coded a Game in which you can play all of my favorite board games and the games that I invented. I deepened my Godot coding knowledge by recreating complicated games like: Chess, Reversi, Go, Tafl and Shōgi. I really enjoyed doing this project and now you can enjoy it too! hey, if you write **Stardance** in the background texture you can get this amazing background ↓. ✨...
|
1792853378.4869957
|
1792939778.4869957
|
|
647
|
Space Travel by @Vishy | Stardance
|
Vishy
|
1
|
66.0
|
1260
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-25T22:55:07Z", "hours": 66.0, "multiplier": 19.04, "payout": 1260, "blessing": "neutral", "text": "Hello everyone, this is my first ship for Stardance, and let me introduce you to Space Travel. Space travel is an 2D game I have spent this whole month on creating. I have used tile maps, parallax 2D nodes, pixel art, and many features to create this game. Even though it is a work in progress and a test run for me I would like to congratulate my self on spending over 60 hours for a project. This is the longest I have ever spent on the project, and this is as complex as it gets. Some cool things I think would wow you guys are Parallax 2D nodes, theses give the background life, the make it look like the clouds are moving. Ray Casts, to create avalanches. In this game I have made many types of aliens for the user to battle. I am so proud of my self for finding the time to make this wonder full game. I have had people test it so I could polish it up for the first test run. I know it could be better, but I am planning on adding an Alien Universe. Users will have laser items, pick the planets to travel to, choose their character and much more. I am very motivated to continue this project and push it to it’s absolute max. This game features multiples levels, Level 1 (Earth) your goal is to escape the alien invasion you woke up to. Level 2 (Mars) you travel to an burning hot planet to find out more aliens live their, including goo types. Finally Level 3 (Neptune) you visit this icy place and find icicles, ice balls, avalanches, and ice bunnies waiting for you. This game took a lot of thought and time to create, as it is not as simple as it looks. The code was very complex as I had to calculate speed, and shooting distance (for the goo ball and ice balls). I am so glad I can share this hard worked project with you guys. I hope you enjoy it!", "repo": "https://github.com/fishygaminglife-del/Space-Travel", "demo": "https://fishyyyyyyy-life.itch.io/space-travel"}]...
|
[{"post_id": 15968, "ts": "202 [{"post_id": 15968, "ts": "2026-06-25T22:42:07Z", "hours": 2.2925, "text": "Finishing Up Hello everyone, I have been fixing bugs today and adding items I forgot. Examples are audio, bugs, end scene, making harder levels easier (I was the only one able to beat it) and make text clearer. Bugs Today, I fixed mainly bugs because I am going to ship right after this devlog (my work has payed off). First I am going to talk about the skipping text bug. When I do the dialogue at any part of the level/game, and then press esccape button, (pausing game/pausemenu) and then I press home inside the pause menu, the whole game crashes, and I just figured out why. When ever im doing text I call $MC.wait_for_skip() this is a function, and in the function it has await get_tree().process_frame the bug with this, is that when ever the text is running and wait_for_skip() is called it is waiting and calculating every single frame, so when the user presses home, the player is gone, and that process_frame was never finished, so the game bugs out and ends. Well to counter this, I didn’t really do anything. I am really busy right now, and am trying to make the game good for the first ship, as much as I want to work on this bug I have to set it aside. In short terms, I got rid of the home button. If the player wants to go home they have to close the game and open it (reload page). Bug Two For the second bug, it really confused me. When I restarted the game, and went through level one (keep in mind I only picked up one coin) and then went to the second level, it said I had 30 coins. I saw my error, and it was that I was manually setting it to 30 coins when the game starts, so I then set that value to 0, so user starts with no coins. I thought all was solved, but it now showed five hundred and forty seven coins. I looked closely in the save_game function. I saw that I had set global.coins (the coins for the whole game collected) to what ever was in the label. And it might seem okay, but the label had manually been set to five hundred and forty seven coins. I just delteded that line of code because whenever the player picks up coins, it automatically goes into the global variable, so there was no point in having that line (since it only bugged out the game). Audio I forgot about the audio/sound effects/ background music until the end of the game (today, since I am going to ship). Because of this I had to rush through it, and I am going to warn you, some of the audio in the game might sound… wonky. Anyways I recorded me making the audio, like an alien shooting, icicles falling, avalanches moving. I just realized while writing this devlog, in the game I misspelled avalanche, and I have already exported it and uploaded the game 😭. Difficulty I had some people test out my game, and they had alot of good feedback that I implemented today. I still have not done some of it, but that is for next time. First they said level 1 was harder than level 3. I tested it out but didn’t find any problem, I realize that I play this game everyday to test so it must be easy. I made the boss fight for level 1 easier so the user can get through. To do this, I made the goo rise slower, and added more stepping points on the ground. Then I was told level three’s avalanche was too slow. I had to manually change the speed, but this was easy since I had incorporated a ray cast into the avalanche."}, {"post_id": 15628, "ts": "2026-06-25T12:49:57Z", "hours": 4.1514, "text": "Adding Touches Hello everyone, it has been some time since I have devolved, and I want to talk about what I have been doing, some goals I have, and some deadlines. For the past few days I have not been shipping because I have been working on level 3. From the screenshot you might be able to see the avalanche and the map for the avalanche. So I fixed a bug with the icicle, so even if it touched the ground and then you touched it. You would lose a life. For the collision shape of the icicle whenever it touched the ground I did set_deffered(\"disabled\", true) so this would disabled it, and I would reenable it whenever it starts falling again. Also there was a bug where the aliens could shoot through walls, to solve that I just decreased the time pass value (time pass checks how long it has been running before it can do body checks) and kept time pass the same value for on enemy touched. Finally the avalanche, during the process of this I learned some pretty cool things. So the avalanche. This would be hard to animate, but apparently Godot has something for this. It is called a ray cast, and is brings the items with it down until a collision body. So what I did, is just like my alien script, I made it move right with speed * delta . And the ray cast handled itself, because it was down hill. I am still learning how to properly use a ray cast but for down hill situations I think I now know. When I was putting the animation for the space ship enter and leave. I wanted to reuse previous animations I have made. So I went to level 2 and realized I hadn’t finished it. But level 1 had it. This is where things get interesting, I brought out my calculator, duplicated the values into level 2 and 3, and subtracted the first keyframe from where I wanted the player to start. This allowed me to subtract 1454 from the X value and 104 from the Y value. So I did that for each of the key frames for both level 2 and 3 (keep in mind I wanted them in different places) and I had my animation finished. I tried adding a pause menu for when the player dies or pauses (esc) but I guess it didn’t turn out well it looks grainy and unprofessional, but I really need to ship, because I wont be available for the next few days and I can’t work on it. Future Items Before Ship Before I ship I want to add a few things that have been suggested. First of when testing it was realized that when the shield breaks, there was no pop up or anything indicating that it had broken. So I will have to now go and fix that. Second, I need to add sound. I always add sound at the end of the game, and I completely forgot to. Overall I think that this first ship will tell me a lot on what I have to work on for this game, I think I could do some better improvements if I wait some time then ship. But I think it will do great, and people will see the hard work I put into this game. Thankyou everyone!"}, {"post_id": 13452, "ts": "2026-06-22T01:06:27Z", "hours": 6.0436, "text": "Level 3 Major Changes Hello everyone, today was by far the most productive day I have ever had in all of star dance, and possibly previous Hackclub events I have done. I almost finished level 3 in one day! This was a massive accomplishment for me as for the other levels took at least 3 days to do. An overview of what I did today were, map, icicles, ice skates, new alien, asset placing, inside space ship scene, space ship traveling planet’s scene. New Features Ice Shooter Alien , First I want to talk about the ice shooter I made today. So for every new level, I always add a new alien, and while I was still working on level 2 I was contemplating what new features I should add to the game for level 3, and since I thought I should do an ice planet because I was on mars (fire) and earth (neutral), I thought I might want something cold then I thought of this planet Neptune (I don’t have planet names yet)! So today I made the Ice Shooter Alien , This alien shoots snow which slows the user down for 3 seconds. While the cool down is not slow, there is only a 1 in 10 chance the player looses health to the snow (a rock could be in it). Icicles , it was recommended to me to add icicles to the game since it is an icy biome and there should be some structural relation to the biome and features. So I just used an area 2d as the base structure, and just detected if it touches the player or something else (like the enemy or structure). To make this icicle fall, I couldn’t give it a character body then there would be gravity, and it would keep moving even if I stopped it, there is a way to work but I figured out an clever way. I subtracted the distance between itself and the player using position.x and subtracted to see if the player was in range, and if it was I was changing the position with speed and delta coming down. And I just reset it to the original position because in the ready script I assigned it the starting position. Ice Skates , Ice skates were actually pretty easy, I duplicated the players idle and movement assets, and redrew them to have skates on the bottom, and once the player buys skates from the shop I make has_skate = true then in the physics process whether the player is idle or moving, it changes the sprite sheet to the one with ice skates, and when I disable it, it goes back to the original sprite sheet with no skates. Overall I think I did so much today, I around an hour drawing the art for the spaceship this morning (both the scenes of changing worlds and inside spaceship) because I had to add a new section and duplicate move, and modulate the planets to look like a new space travel. I think tomorrow I should finish or get close to finishing level 3 because I have to create the boss fight. Thankyou, bye guys!"}, {"post_id": 12834, "ts": "2026-06-21T00:31:05Z", "hours": 5.2153, "text": "Level 2 & 3 Updates Hello everyone, I have alot to talk about, especially since I recently just finished level 2 and am starting on level 3. I still need Planet Names waiting for suggestions but so far I am just using analogies in my game like earth (this is going to be the real planet) mars and Neptune. This helps players understand and relate to the geography and climate of the planet. For example in the screen shot you see it is an icy artic place like the planet Neptune. Let’s get started and talk about today! Level 2 Bugs, I was not so lucky, this paragraph is about bugs and fixes, well I am not happy to say that my animations from my text animation player all deleted, and since I didn’t commit to GitHub for the day, when I restored it, all the changes I made went away… I had to remake everything that I changed, and I still have some bugs, but I forgot some items, so it is hard. But I mainly just fixed placement. When I came back home to Godot, some items were gone, some part of the tile map disappeared I had to put the tiles in the right spot, and the code was all messed up. I currently still have no idea what happened, but I fixed it all and I have not had bugs since. Today I got a suggestion to make a cutscene of the level 2 alien boss burning. As you guys know yesterday I changed the goo/lava color to white so I can manually modulate it in the editor because I am reusing assets (this makes it so easy for me 👍). Well now I made a cutscene of the alien boss burning, I would have had to redraw everything, but instead I duplicated the animated sprite (the alien boss in the cutscene) and modulated to low transparency and red, so it looks like the alien boss has a lava shadow. Level 3, Alright I know you guys saw the screen shot, so you saw the icy biome. I am now going to explain my ideas that I plan to add to level 3. First, Ice Shooters , hear me out. I recently added goo shooters to the game, and since this is artic biome ice shooters to slow the player down, and gradually decrease health if they don’t find heat could be an awesome idea! Second actual ice . There are going to be like ice pits/platforms when the player walks on, it is all slippery. And I also might add moving platforms, but these probably will be saved for level 4 but I am still deciding. Space Ship Scene As you guys know, after each level I make a cutscene/scene of the player in their alien spaceship. I think for this one (right after level 2) the player will explore more of the spaceship, and learn something about the aliens. I am still deciding but currently that is my ideas. If you guys have any suggestions feel free to recommend them. Thanks, bye guys !"}, {"post_id": 12264, "ts": "2026-06-20T00:59:37Z", "hours": 5.025, "text": "Level 2 Hello everyone, sit back and get ready for a long devlog, because today I have alot to talk about. Okay, so guys now we have finished level 2, it is fully completed, I just need to add one line of code (changing the scene to the right scene the next one) and then I am done and probably wont touch it. Since I have not devloged in a few days (I did little time and was busy) I will talk about alot of items which is basically what I did for the past few days. Shield Alright I really want to talk about the shield first. So if you guys watch the video you can see how the shield works. Obviously it doesn’t have the code, but I will talk about how I integrated it with the shop and how that works. So I have 2 items in my global script, shield enabled, and shield dead. If I go to the boss fight of my game (where the shield is not allowed and users dont get it) I say Global.shield_enabled = false . This allows me to set if the user can use the shield or not through out the game. And if you guys made games previously or used Godot, you know about func_process() this allows me to simultaneously run items. You might be wondering, how does this simultaneously running fuction affect the shield for the player, and why would I do this. Remember earlier when I used the Global shield enable to turn it on and off, well the process checks it and if it is false, then it makes the shield not visible and not work. I mainly was relying on this for the past few days, because I was working on the shield. I also used process to modulate and change the size of the shield bar shield durability based on how many hits the shield has taken and how many hits it can take, I divide it to get a percentage. I also added the feature that if the player dies, they lose the shield, for the player to get the shield back, they have to buy it again for 15 coins. I plan to add an animation at the beginning of the level showing the shield coming onto the player. The Shop If you guys saw in the video, you saw the shop is accessible from anywhere in the game. This was easy all I had to do was add a button with the shop icon, and make the shop items visible. But I also have to account for mobs aliens shooting the player while they are in the shop. Luckily godot has an in built function called get_tree().paused if I set this to true every item will become paused. But luckily I can set the shop node’s process mode to always so it works even when the game is paused. This solved my problem of the aliens shooting and moving while the player is in shop. Boss Fight If you guys didn’t know, for the past few days I have been working on the boss fight, I have not got enough time to finish it but today I finally finished it today! So in level one, there is a scene with the boss fight for goo rising, and now that is level 2 and the player is on mars I wanted lava. But I didn’t want to redraw it so I just modulated the goo (I now realize that was a bad idea). Because the goo was not originally white, the modulating color started green, so what ever I chose was darker and not the right color. So because of that I had to spend my time fixing the goo and changing it to white and grey. This way for my level 1 goo rise, I just modulate it to the goo green I want and for level 2 I modulate it for the lava. Also for the boss fight, I added it so the shield disappears when the player has to fight, and made the animations more clear. Anyways guys I think this game will turn out great, I am always looking for suggestions especially for level 3 , bye guys!"}, {"post_id": 11042, "ts": "2026-06-18T02:18:53Z", "hours": 2.3531, "text": "Level 2 Boss Fight Hello everyone, I am coming close to an end of my level 2 of Space Travel. So currently I have made the boss and am working on the animation and how the boss fight is, so first I am going to explain the logic, then I will talk about timelines and how I have acomplished, and third I will start the alien UNIVERSE So what I have done today was finish up the shop (I barley did anything to it) and I also worked on the alien. The first part of today I spent a good amount of time creating the alien boss, and it doesn’t even look good 😭, so I became demotivated for today and only did 2 and a half hours. But the day is not over yet, so much left to explain. To continue, I created the animations for this boss, such as the text, and the anime animations, but I am still not done and have not fully tested it so there are bugs, but I will try to fix it. So I think I am good on time, so far I have been trying to finish up 4 levels then ship. For level 1 was follow and static aliens (walk in place). Level 2 was goo spit shooting aliens. I have no idea what to do for level 3 and 4, I really appreciate any suggestions on new items/things to add🙏. Also to clarify my solar system ending (part 1 of game) the user will go back to earth for level 4 and dodge the hardest of items and talk to the alien knight, there would be some type of dialogue like “ I never wanted to do this…” And that will be the end of level 4, and that is part 1 which I would ship my project for the first time, looking at the time line, I probably will get 60 hours when I ship, I hope I do good. But I really appreciate any suggestions, but to conclude, I am working on level 2 boss right now, debugging and making the animations more smoother. For level 3 and 4 I will talk all suggestions . Thank you everyone, bye!"}, {"post_id": 10409, "ts": "2026-06-17T03:09:38Z", "hours": 4.5614, "text": "Level 2 Touches Hello everyone, I have done a lot to my game for Level 2 im almost done. I’ve basically been stacking a bunch of systems together and fixing a lot of the smaller problems I ran into over the last few devlogs (especially with goo, shields, and collisions), and it’s finally starting to feel like an actual full level instead of just a test area. Shop System Fully Finished First of all, I have finished the shop and now it is fully functional and actually works the way I wanted it to.You can now walk up to it and use it properly, and I added a lot of UI polish so it doesn’t feel dead or static. I added a hover function so when the mouse is over an item, it actually reacts (like spinning or doing a small animation), which makes it feel way more alive instead of just a menu.I also added different text responses depending on what happens: if you don’t have enough coins it tells you if you already own the item it tells you and when you buy something it gives proper feedback. This also ties into the coin system I’ve been using in the HUD, which now updates properly every frame so the shop always shows the correct value. Goo + Shield System Improvements (big fixes from earlier devlogs) I also fixed a lot of issues with the goo system that I was struggling with in earlier updates. Before, the goo had problems like hitting the player instantly when spawning shield reflection being inconsistent and weird collision timing issues. So I added a small delay (around 0.2 seconds using time checks) so the goo doesn’t detect itself or instantly trigger collisions when it spawns. I also improved the shield logic so now when the shield is active, the goo can actually be reflected back properly instead of just always damaging the player. I also added a durability feature, it is not visible yet but i am currently working on it. Now the hits count and soon it will be a visible feature. On top of that, I cleaned up how goo behaves when it hits enemies. Instead of doing messy collision disabling and weird states, I simplified it so enemies can just be removed cleanly with queue free, which makes everything way more stable and less buggy. Boss Fight Setup (Level 2 main objective) I’ve also started the boss fight for Level 2. Right now, there is an obby section where the boss is attacking with goo balls that can pass through parts of the environment, which makes dodging them actually important instead of just standing still and tanking hits. The player’s goal in the boss fight is to dodge the goo while making their way through the obstacle area and then press a special button (which has a cool animation). When the button is activated, it triggers lava flow across the map (since the level is on Mars), which is going to be the main mechanic used to defeat the boss. So instead of just fighting directly, it becomes more of a movement + timing fight where you have to avoid attacks and activate the environment against the boss. Overall Progress Overall, Level 2 is finally starting to feel like a real level instead of just a prototype. I’ve fixed a lot of the earlier problems with the goo collision timing shield reflection enemy interactions and UI consistency. And now I’m moving into more “game design” work instead of just fixing bugs, which is a good sign. Next steps are finishing the lava system for the boss fight polishing the obby section adding boss behavior and attack patterns and improving visuals and feedback so everything feels better."}, {"post_id": 9014, "ts": "2026-06-15T01:07:13Z", "hours": 3.6569, "text": "Level 2 Hello everyone, I did major updates and changes to Level 2 and this was the longest I have worked in Stardance in a single day so far! I worked for about 5 and a half hours today and made some really solid progress. Level 2 Setup + Map Design So I officially started Level 2. I created the base map and started building out the layout. I also added aliens around the map to start filling the world and make it feel more alive and challenging.Right now the level is still in early stages, but the structure is there. I still need to add fire/lava sections, more environmental hazards, and set up the boss fight with the goo enemies. I also want to add extra mechanics in Level 2 so it feels like a big step up from Level 1 instead of just a copy. Goo Enemy + Shield System Improvements I also fixed a lot of issues with the goo shooting system and improved how the shield works. Before, the goo had problems with detecting collisions too early, so I added a small delay using get_tree().create_timer() logic so it doesn’t instantly detect its own body when it spawns. I also adjusted the collision timing using a small time check (around 0.2 seconds) so it only starts interacting properly after it has actually left the enemy. The shield system now works with the goo reflection mechanic. When the player shield is active, the goo can sometimes be reflected back instead of dealing damage. I also improved how it visually flips and stays centered so it doesn’t look weird when the player changes direction or moves. Combat + Collision Fixes I also spent time cleaning up how the goo interacts with enemies and the player. Now when the goo hits the player without shield, it properly plays the splat animation, stops movement, and deals damage using the degrade() system. I also made sure it doesn’t instantly re-trigger collisions by adding timing protection so it feels more consistent. For enemies, I started experimenting with making them react when hit by reflected goo. The idea is that when they get hit, their collision gets disabled so they can fall down instead of just standing there, which will make combat feel more dynamic once gravity is properly set up on them. Overall Progress Overall, Level 2 is starting to take shape. The map exists, enemies are placed, and the core systems (goo shooting, shield reflection, and collision handling) are way more stable now. Next steps are: finishing the lava/fire areas improving enemy fall + death behavior adding the boss fight mechanics for goo polishing shield visuals so it feels smoother and making Level 2 feel more intense than Level 1"}, {"post_id": 8791, "ts": "2026-06-14T16:28:33Z", "hours": 4.76, "text": "Level 1 Complete Hello everyone, I just completed level 1, adding the finishing details fixing bugs, and adding a very cool parallax background. Major Bugs, I didn’t have major bugs but I had many bugs, for instance I had a scene change after the player enters the spaceship, this was for them to escape earth, but for some reason the scene change never worked, and it kept saying null, even when I printed this function. To fix this bug I made a variable and before the function was called I set it, so ** var tree = get_tree() ** this allowed me to call the functions without it becoming null, I still have no idea why the function was null but I guess I will have to figure that out. Another bug was my alien. So for my level one I have moving aliens, following aliens, and I was going to have moles, but I think I will add them in level 2 to keep it simple. But the problem was my following aliens, whenever they land on the player they never made the player lose a life or disappear. I looked at the collision bodies, and the one that gives the alien it’s shape was larger than the area 2d’s body, so therefore it would have never made contact with the player and would have not done anything to the player. To fix this, I adjusted the body size of both collision bodies. Parallax Background, a parallax background is basically different parts of the background moving at different speeds when the player moves. I made 7-8 layers of background, trees, clouds, bg colors, floor. To use them I used the parallax 2d in godot and set the scroll speed to different values for each, the farther away the bg element the lower the value, then you get the result as clouds moving at different paces of other elements as shown in the video. But this was not all that easy, I had a bug where the parallax elements went down so much when I started the game, I am pretty sure I am starting the player in the air, and when he falls so does the elements, so I have to place him down, also it is automatically adjusting my scroll offset. Summary/Level 2 That is about it for level 1, I also fixed the coins in the corner, and added more story. For level 2, I am going to start with making a parallax background, and make the actual game. Thank you, bye!"}, {"post_id": 7253, "ts": "2026-06-12T03:06:01Z", "hours": 3.1069, "text": "Shooting, Level 2 Hello everyone, I recently finished level 1 and started building level 2, there are many new things that I am proud to announce. Level 2 Intro Animation I added an introduction to level 2, so after we leave earth, we end up in the alien spaceship, where the player vows to come back to earth and save his home planet because he couldnt do anything on the planet. Then he is in the spaceship and looks around, then he goes to the other planet. Alien Space Shooter So this is the new character the ALien Space Shooter, idk what to call him yet, the acronym for Alien Space Shooter is pretty bad… Anways it gets the difference from the player and the alien, and it shoots the ball that way, but if the alien is on the other side the difference is negative so the code figures out the position and where to shoot, currently I am working on the splat feature on if it touches the shield or the player or a wall/item it splats and stops moving. Shield + MC Adding’s I am adding a shield to the main character, so here is the plan, when the alien shoots out the goo, if the player is presssing the button to use the shield, (I am probably thinking control button) then they are blocking, the shield will have a durability, and they can use the shield for as long as they dont use all the durability. But here is the good thing, if they block the goo then there is a 1 in 5 chance it reflects the goo and it hits the alien and makes it vanish. This is a realy useful feature as the only other way to destroy an alien currently is the walk into and lose a heart. Summary + Updates I plan to make this more polished, as the splat for the alien’s goo shooting, and the shield for the character. I also need to make these all clear, and make the animations much more better and professional, bye guys!"}, {"post_id": 6633, "ts": "2026-06-11T03:51:17Z", "hours": 3.1117, "text": "Level 2 Hello everyone, I am starting Level 2. For the past few days Lapse has not been loading on any of my browsers, and I had no idea why. Then today I tried Chrome and it finally worked, so now I can actually post updates again. Anyways, today I was mostly fixing bugs and finishing up Level 1. I had a weird bug with an Area2D where it kept triggering when it shouldn’t have been. I spent a while checking collision bodies, Area2Ds, animations, and positions. In the end I just rewrote the code and renamed some things, because I think Godot was getting confused about which body was which. After that it started working normally. I also finished the boss section. The Alien Knight now has an introduction cutscene, camera changes, animations, and the goo obstacle that chases the player. There were a lot of small bugs involving AnimationPlayers, Area2Ds, collision shapes, and things resetting to the wrong position. Some of them took way longer than they should have, but eventually I got everything working. I also added some more details to the ending of Level 1. The character now says, “Where am I, what happened to my home Earth?” before leaving on the spaceship. It is only a small detail, but I think it makes the game feel more connected and gives a better transition into the next part of the story. The boss fight is also much better than it was before. Originally all you had to do was sprint and hold the key down. Now there are obstacles, platforming, timing, and hazards that make it feel more like an actual challenge. I think it is way more engaging than just running in a straight line. I also spent some time working on hearts, checkpoints, and restarting parts of the level. I am still deciding exactly how I want that system to work, but I think it is heading in the right direction. Now that Level 1 is basically finished, I am starting work on Level 2. Right now my plan is to have a scene inside the spaceship before the next level begins. I want it to explain more about the aliens, what happened to Earth, and what is actually going on. I think having some story between levels will make the game a lot more interesting instead of just jumping straight into another map. Overall, after spending so much time fixing bugs, collision issues, Area2Ds, animations, and cutscenes, it feels good to finally move on and start making new content. I am excited to start building Level 2 and expanding the story of Space Travel."}, {"post_id": 6023, "ts": "2026-06-10T03:07:19Z", "hours": 2.4161, "text": "Anime Intro Hello everyone, after what I did today I feel so motivated. Let me explain it to you guys. If you see the video, you will see a very professional introduction to our character, Alien Knight, along with his message. Someone recommended that I do this type of thing, so I spent about an hour creating it, and I think it looks really nice. It makes the boss feel much more important, and gives him a proper introduction instead of just appearing out of nowhere. I also worked on the boss cutscene itself. I learned how to switch between cameras during cutscenes, make animations play multiple times, and get everything to happen in the correct order. There were a few bugs where animations would instantly skip or stop after running once, but after a lot of testing I got it working. Besides that, I was fine tuning the map, getting rid of what we don’t need, making it shorter, and making the game make more sense because I don’t want the first level to be overwhelming. At one point I even misplaced about half of the TileMap and had to move it back where it belonged. It was annoying, but the level flows much better now. I also spent a lot of time fixing collision bugs. Some Area2Ds were detecting StaticBody2Ds instead of the player, which caused things like random restarts and enemies triggering when they shouldn’t. After adding proper player group checks and fixing collision layers and masks, everything is working much more consistently. Another bug I tracked down was with animations moving my character to the wrong place. For some reason the player kept spawning where an old animation had moved them. After a lot of confusion, I found out it was caused by a RESET track inside the AnimationPlayer. Once I removed it, the player spawned where they were supposed to again. Overall, I feel like today’s work made the game much more polished. The boss introduction feels better, the map is cleaner, the cutscenes work properly, and a lot of annoying bugs are gone. There is still a lot to do, but seeing everything come together is really motivating."}, {"post_id": 5340, "ts": "2026-06-09T02:28:23Z", "hours": 1.9058, "text": "Boss Fight Hello everyone, as usual I am just fixing bugs and making my game better. “I have some ideas, a couple of suggestions, to fight instead of fleeing west.” Just a quote, but it perfectly matches my game right now. So currently I had sprint, and it was required to hold it down to beat the boss. All you had to do before was run, but now you have to do an obby, in a certain amount of time, while dodging the boss. If you complete all of that, you get to the spaceship. This is much better and more engaging than just holding sprint and running. I also added heart pickups. If you don’t already have 4 hearts, you can pick one up and restore your health. While adding this, I fixed a bunch of bugs with collision layers, Area2Ds, and enemy detection. Some enemies weren’t detecting the player correctly, and at one point they were even falling through the map because I forgot to give them the right collision setup. After a lot of debugging, everything is working properly now. I also improved some of the enemies. The aliens now stop following the player if they get too far away, and I worked on patrol enemies that move left and right. There were some issues where they would get stuck on walls and spam flip back and forth, but that is fixed now. Another thing I spent a lot of time on was cutscenes and dialogue. I added text that the player can skip with Tab, boss dialogue, and a boss intro cutscene. I also learned a lot about AnimationPlayers, AnimatedSprites, camera movement, and even how reset tracks can accidentally move your character to places you didn’t expect. For the boss fight itself, I am still thinking about lives. Right now, if you die, you restart the level. One idea I have is giving the player two lives. If you lose the first life, you restart the level, but if you lose the second life, you restart the entire game. I might stick to restarting levels, but I haven’t decided yet. Right now my main goal is just making the game more fun and polished. Every time I add a new feature, I end up finding three more bugs to fix, but that’s just part of making games. Overall, the boss fight is much more engaging than before, and I think the game is improving a lot with every update."}, {"post_id": 4697, "ts": "2026-06-08T03:50:09Z", "hours": 3.3156, "text": "Finishing Level 1 Hello everyone, im coming close to an end of level 1, today was a big day, and I should be able to finish it tomorow by fixing a few bugs and adding a few things to make it a functional starting tutorial scene. I have got almost to the ending part of level 1, I have made the boss fight/scene (it is not a cutscene, that will be for other levels), but its not finished, because there are many glitches for the user to stay alive but not reach the end, resulting in bad votes so I need to fix that. I finished the map probably just need to add a few things here and there but most of it is fine. I fixed the aliens and for each one, I can stick with the default settings (speed, how far they move both left and right) or I can put custom variables, using @export var, which puts an variable on the node. This was good, as before I had a problem of an alien walking through the wall, but now that is fixed. SO basically I just need to add armor, a laser item, for the user to use to shoot, but right now I am just doing the basic things for the game and sticking with my little tutorial for level 1!"}, {"post_id": 3957, "ts": "2026-06-07T02:51:12Z", "hours": 3.6392, "text": "Character Fixes and Level Progressiveness Whats up Yall, today was a good day, and it helped me develop my project even further, making me so happy and confident. In the picture, you can see there are 8 hearts, coins, aliens moving (well its an image) and coins on the top of the screen, so let me break it down. Aliens I was building the map, and then when testing I realized that the aliens would walk through the walls, so I was learning and testing some code, but then the alien glitched, I tried to fix it but I couldnt, so I went back to my old code and just made the room for it to move larger, because I was trying to get the little steps done, then I would fix the main problems! Coins + Aliens I drew the coin animation today and it was fairly simple, but for both the coins and aliens, I added area 2d body so I could detect when they touch the player, and singled the player out by in_body_(player) then I made them disapear, then either add a coin globaly or lose a life globaly, then I disabled the area 2d with monitoring. Area 2d.monitoring = false, so this made that they could not be used or detect anything until I turn it back on, so no extra coins or more loss of lives. General I drew more items for the map, and will use the atlas for all worlds, will just change colors and add few more items. I was also working with text skip, so now, the text does not go to the next dialouge until user presses tab (skip). But anyways those are all the changes I made, thanks bye guys!"}, {"post_id": 2520, "ts": "2026-06-05T01:47:57Z", "hours": 2.4633, "text": "Alien Fix + Character Bugs + Level 1 Hello everyone, today I did alot I was productive as usual, and I have alot of time to work on this game. First I fixed my player added hearts and made sure all the animations for text are 4.2 seconds because if the user wants to skip they can press tab. Also I fixed some alien bugs so now it works perfectly, when I was testing THE ALIEN GOT STUCK ON MY HEAD. This would have bugged the game and the user would not be able to play, but now they go through the player, but until I make it so they disappear upon touching the player and the player loses a heart that is what I have. Now I created the starting scene with all the instructions on how to move and all of that. It was pretty easy, and I just named the narrator the voice because it is better than just putting ??? or “THE NARRATOR” so anyways, I think by taking this slow one step at a time I can accomplish what I want, and make it better quality than I would think!"}, {"post_id": 1880, "ts": "2026-06-04T03:00:54Z", "hours": 2.2722, "text": "Character Fix Hello everyone! I was working on the character, and all the animations such as movement and the text, because that is part of the character. So the animations all went smooth, and I coded it easily. But the hard part was the text, I had text animations and text skips where you press tab to skip the text. I dont know how to do it where you press tab once it goes to the end of the text, then the second time and it skips and goes to next dialouge, so I just did it so when user presses tab it goes to next dialouge. This was hard and I had to look at my previous games to see how I did it (because it has been over a month since I was making games) and in the previous games I had to put a function in each scene, but in my game, I just put it in the character script, so that where ever the character is the text is. I was thinking my game looks so bad, and it is not professional, but I got reassurance from others that this is one of the best games I have ever made, and it is high quality. That makes me happy and gives me the motivation to continue, but there is one problem, I dont know how to continue. I have created the alien and the character, BUT I DONT KNOW WHAT TO DO NEXT!!! So I am still brainstorming but I think maybe I should add floating islands and an alien king for each world, that the user has to defeat, otherwise they go back to the start of the level and the scene resets. But anyways that is what I am doing, if you guys have any suggestions for my game, I am open to take it. Thank you!"}, {"post_id": 1239, "ts": "2026-06-03T02:55:08Z", "hours": 3.7708, "text": "Finish Cutscene Hello everyone, I had a cutscene at the beginning of the game I was talking about, I recently finished it. So there were problems and good things First I had to draw the alien ship and animate it coming closer to earth and crashing (fire and burnt earth), this took some time but is now complete Problem, I had a problem of everytime it ended on a different frame of the animation so then the ship was in the wrong spot and it looked like it missed land, to solve this problem I called the frame right before I stoped the animation so that it ends on the frame I need. After these I just needed to fix the code for the loading and restarting, this is going to be my first time making a game like this where it saves data, and it is going to be the longest I spend making a game. So right now it saves I think on the cookies, and if you press restart I manually call the level and all the gear to 0 instead of just reseting the cookies. But the way I am saving it, is by after every level or something the user gains, then I add it to the save script. I started making the character, and since this is a platformer game and not a top down movement game it is hard to draw the character let alone the animation, you can see in the screenshot provided below how I drew the character. This took around an hour and I had to view my previous games to see how I wrote the code because I do it differently since I have idle animations and alot of movement. I also had to drawn the floors and make floating ones. This lays down the base of my game, and once I finish the first level I should be familiar. I am now thinking it should incorporate obstacles, instead of just enemies, and also kind of like a scavenger hunt for them to find items. Anyways that is my project, see you next time guys!"}, {"post_id": 586, "ts": "2026-06-02T02:34:27Z", "hours": 2.1167, "text": "Hello everyone! I love making games and have planned out a well thoughtfull game plan that should take 3 months. So basically the outline of my game is Battle monsters through the space realm. Find your way back home. Gain multiple materials for better space gear and ships. This game is both an obby/adventure/action game Users start on earth, a destroyed deserted planet habited with aliens. Users have to fight and find their way out to reach the new planet with their civilization Users unlock different planets after beating one Users must fight through all the planets to reach the end and find their way Aliens/Monsters randomly drop items which can be used to craft gear and after they have enough users find their first space ship and upgrade it with their spare materials Users can choose to switch to a different spaceship and upgrade that or stick to their current spaceship. I took 2 hours to draw the scene you can see in the screen shot because it is important and serves two purposes, one it is the home scene (it is also animated) and two once you start, it will have an alien ship blow up onto it. Now you guys get the gist of the game, but I hope this turns out great and since there is a little over 3 months to finish this, I think I will do great and you guys will enjoy it! See you next time!"}]...
|
Title: Space Travel by @Vishy | Stardance
Devlogs Title: Space Travel by @Vishy | Stardance
Devlogs:
Hello everyone! I love making games and have planned out a well thoughtfull game plan that should take 3 months. So basically the outline of my game is Battle monsters through the space realm. Find your way back home. Gain multiple materials for better space gear and ships. This game is both an obby/adventure/action game Users start on earth, a destroyed deserted planet habited with aliens. Users have to fight and find their way out to reach the new planet with their civilization Users unlock different planets after beating one Users must fight through all the planets to reach the end and find their way Aliens/Monsters randomly drop items which can be used to craft gear and after they have enough users find their first space ship and upgrade it with their spare materials Users can choose to switch to a different spaceship and upgrade that or stick to their current spaceship. I took 2 hours to draw the scene you can see in the screen shot because it is important and serves two purposes, one it is the home scene (it is also animated) and two once you start, it will have an alien ship blow up onto it. Now you guys get the gist of the game, but I hope this turns out great and since there is a little over 3 months to finish this, I think I will do great and you guys will enjoy it! See you next time!
Finish Cutscene Hello everyone, I had a cutscene at the beginning of the game I was talking about, I recently finished it. So there were problems and good things First I had to draw the alien ship and animate it coming closer to earth and crashing (fire and burnt earth), this took some time but is now complete Problem, I had a problem of everytime it ended on a different frame of the animation so then the ship was in the wrong spot and it looked like it missed land, to solve this problem I called the frame right before I stoped the animation so that it ends on the frame I need. After these I just needed to fix the code for the loading and restarting, this is going to be my first time making a game like this where it saves data, and it is going to be the longest I spend making a game. So right now it saves I think on the cookies, and if you press restart I manually call the level and all the gear to 0 instead of just reseting the cookies. But the way I am saving it, is by after every level or something the user gains, then I add it to the save script. I started making the character, and since this is a platformer game and not a top down movement game it is hard to draw the character let alone the animation, you can see in the screenshot provided below how I drew the character. This took around an hour and I had to view my previous games to see how I wrote the code because I do it differently since I have idle animations and alot of movement. I also had to drawn the floors and make floating ones. This lays down the base of my game, and once I finish the first level I should be familiar. I am now thinking it should incorporate obstacles, instead of just enemies, and also kind of like a scavenger hunt for them to find items. Anyways that is my project, see you next time guys!
Character Fix Hello everyone! I was working on the character, and all the animations such as movement and the text, because that is part of the character. So the animations all went smooth, and I coded it easily. But the hard part was the text, I had text animations and text skips where you press tab to skip the text. I dont know how to do it where you press tab once it goes to the end of the text, then the second time and it skips and goes to next dialouge, so I just did it so when user presses tab it goes to next dialouge. This was hard and I had to look at my previous games to see how I did it (because it has been over a month since I was making games) and in the previous games I had to put a function in each scene, but in my game, I just put it in the character script, so that where ever the character is the text is. I was thinking my game looks so bad, and it is not professional, but I got reassurance from others that this is one of the best games I have ever made, and it is high quality. That makes me happy and gives me the motivation to continue, but there is one problem, I dont know how to continue. I have created the alien and the character, BUT I DONT KNOW WHAT TO DO NEXT!!! So I am still brainstorming but I think maybe I should add floating islands and an alien king for each world, that the user has to defeat, otherwise they go back to the start of the level and the scene resets. But anyways that is what I am doing, if you guys have any suggestions for my game, I am open to take it. Thank you!
Alien Fix + Character Bugs + Level 1 Hello everyone, today I did alot I was productive as usual, and I have alot of time to work on this game. First I fixed my player added hearts and made sure all the animations for text are 4.2 seconds because if the user wants to skip they can press tab. Also I fixed some alien bugs so now it works perfectly, when I was testing THE ALIEN GOT STUCK ON MY HEAD. This would have bugged the game and the user would not be able to play, but now they go through the player, but until I make it so they disappear upon touching the player and the player loses a heart that is what I have. Now I created the starting scene with all the instructions on how to move and all of that. It was pretty easy, and I just named the narrator the voice because it is better than just putting ??? or “THE NARRATOR” so anyways, I think by taking this slow one step at a time I can accomplish what I want, and make it better quality than I would think!
Character Fixes and Level Progressiveness Whats up Yall, today was a good day, and it helped me develop my project even further, making me so happy and confident. In the picture, you can see there are 8 hearts, coins, aliens moving (well its an image) and coins on the top of the screen, so let me break it down. Aliens I was building the map, and then when testing I realized that the aliens would walk through the walls, so I was learning and testing some code, but then the alien glitched, I tried to fix it but I couldnt, so I went back to my old code and just made the room for it to move larger, because I was trying to get the little steps done, then I would fix the main problems! Coins + Aliens I drew the coin animation today and it was fairly simple, but for both the coins and aliens, I added area 2d body so I could detect when they touch the player, and singled the player out by in_body_(player) then I made them disapear, then either add a coin globaly or lose a life globaly, then I disabled the area 2d with monitoring. Area 2d.monitoring = false, so this made that they could not be used or detect anything until I turn it back on, so no extra coins or more loss of lives. General I drew more items for the map, and will use the atlas for all worlds, will just change colors and add few more items. I was also working with text skip, so now, the text does not go to the next dialouge until user presses tab (skip). But anyways those are all the changes I made, thanks bye guys!
Finishing Level 1 Hello everyone, im coming close to an end of level 1, today was a big day, and I should be able to finish it tomorow by fixing a few bugs and adding a few things to make it a functional starting tutorial scene. I have got almost to the ending part of level 1, I have made the boss fight/scene (it is not a cutscene, that will be for other levels), but its not finished, because there are many glitches for the user to stay alive but not reach the end, resulting in bad votes so I need to fix that. I finished the map probably just need to add a few things here and there but most of it is fine. I fixed the aliens and for each one, I can stick with the default settings (speed, how far they move both left and right) or I can put custom variables, using @export var, which puts an variable on the node. This was good, as before I had a problem of an alien walking through the wall, but now that is fixed. SO basically I just need to add armor, a laser item, for the user to use to shoot, but right now I am just doing the basic things for the game and sticking with my little tutorial for level 1!
Boss Fight Hello everyone, as usual I am just fixing bugs and making my game better. “I have some ideas, a couple of suggestions, to fight instead of fleeing west.” Just a quote, but it perfectly matches my game right now. So currently I had sprint, and it was required to hold it down to beat the boss. All you had to do before was run, but now you have to do an obby, in a certain amount of time, while dodging the boss. If you complete all of that, you get to the spaceship. This is much better and more engaging than just holding sprint and running. I also added heart pickups. If you don’t already have 4 hearts, you can pick one up and restore your health. While adding this, I fixed a bunch of bugs with collision layers, Area2Ds, and enemy detection. Some enemies weren’t detecting the player correctly, and at one point they were even falling through the map because I forgot to give them the right collision setup. After a lot of debugging, everything is working properly now. I also improved some of the enemies. The aliens now stop following the player if they get too far away, and I worked on patrol enemies that move left and right. There were some issues where they would get stuck on walls and spam flip back and forth, but that is fixed now. Another thing I spent a lot of time on was cutscenes and dialogue. I added text that the player can skip with Tab, boss dialogue, and a boss intro cutscene. I also learned a lot about AnimationPlayers, AnimatedSprites, camera movement, and even how reset tracks can accidentally move your character to places you didn’t expect. For the boss fight itself, I am still thinking about lives. Right now, if you die, you restart the level. One idea I have is giving the player two lives. If you lose the first life, you restart the level, but if you lose the second life, you restart the entire game. I might stick to restarting levels, but I haven’t decided yet. Right now my main goal is just making the game more fun and polished. Every time I add a new feature, I end up finding three more bugs to fix, but that’s just part of making games. Overall, the boss fight is much more engaging than before, and I think the game is improving a lot with every update.
Anime Intro Hello everyone, after what I did today I feel so motivated. Let me explain it to you guys. If you see the video, you will see a very professional introduction to our character, Alien Knight, along with his message. Someone recommended that I do this type of thing, so I spent about an hour creating it, and I think it looks really nice. It makes the boss feel much more important, and gives him a proper introduction instead of just appearing out of nowhere. I also worked on the boss cutscene itself. I learned how to switch between cameras during cutscenes, make animations play multiple times, and get everything to happen in the correct order. There were a few bugs where animations would instantly skip or stop after running once, but after a lot of testing I got it working. Besides that, I was fine tuning the map, getting rid of what we don’t need, making it shorter, and making the game make more sense because I don’t want the first level to be overwhelming. At one point I even misplaced about half of the TileMap and had to move it back where it belonged. It was annoying, but the level flows much better now. I also spent a lot of time fixing collision bugs. Some Area2Ds were detecting StaticBody2Ds instead of the player, which caused things like random restarts and enemies triggering when they shouldn’t. After adding proper player group checks and fixing collision layers and masks, everything is working much more consistently. Another bug I tracked down was with animations moving my character to the wrong place. For some reason the player kept spawning where an old animation had moved them. After a lot of confusion, I found out it was caused by a RESET track inside the AnimationPlayer. Once I removed it, the player spawned where they were supposed to again. Overall, I feel like today’s work made the game much more polished. The boss introduction feels better, the map is cleaner, the cutscenes work properly, and a lot of annoying bugs are gone. There is still a lot to do, but seeing everything come together is really motivating.
Level 2 Hello everyone, I am starting Level 2. For the past few days Lapse has not been loading on any of my browsers, and I had no idea why. Then today I tried Chrome and it finally worked, so now I can actually post updates again. Anyways, today I was mostly fixing bugs and finishing up Level 1. I had a weird bug with an Area2D where it kept triggering when it shouldn’t have been. I spent a while checking collision bodies, Area2Ds, animations, and positions. In the end I just rewrote the code and renamed some things, because I think Godot was getting confused about which body was which. After that it started working normally. I also finished the boss section. The Alien Knight now has an introduction cutscene, camera changes, animations, and the goo obstacle that chases the player. There were a lot of small bugs involving AnimationPlayers, Area2Ds, collision shapes, and things resetting to the wrong position. Some of them took way longer than they should have, but eventually I got everything working. I also added some more details to the ending of Level 1. The character now says, “Where am I, what happened to my home Earth?” before leaving on the spaceship. It is only a small detail, but I think it makes the game feel more connected and gives a better transition into the next part of the story. The boss fight is also much better than it was before. Originally all you had to do was sprint and hold the key down. Now there are obstacles, platforming, timing, and hazards that make it feel more like an actual challenge. I think it is way more engaging than just running in a straight line. I also spent some time working on hearts, checkpoints, and restarting parts of the level. I am still deciding exactly how I want that system to work, but I think it is heading in the right direction. Now that Level 1 is basically finished, I am starting work on Level 2. Right now my plan is to have a scene inside the spaceship before the next level begins. I want it to explain more about the aliens, what happened to Earth, and what is actually going on. I think having some story between levels will make the game a lot more interesting instead of just jumping straight into another map. Overall, after spending so much time fixing bugs, collision issues, Area2Ds, animations, and cutscenes, it feels good to finally move on and start making new content. I am excited to start building Level 2 and expanding the story of Space Travel.
Shooting, Level 2 Hello everyone, I recently finished level 1 and started building level 2, there are many new things that I am proud to announce. Level 2 Intro Animation I added an introduction to level 2, so after we leave earth, we end up in the alien spaceship, where the player vows to come back to earth and save his home planet because he couldnt do anything on the planet. Then he is in the spaceship and looks around, then he goes to the other planet. Alien Space Shooter So this is the new character the ALien Space Shooter, idk what to call him yet, the acronym for Alien Space Shooter is pretty bad… Anways it gets the difference from the player and the alien, and it shoots the ball that way, but if the alien is on the other side the difference is negative so the code figures out the position and where to shoot, currently I am working on the splat feature on if it touches the shield or the player or a wall/item it splats and stops moving. Shield + MC Adding’s I am adding a shield to the main character, so here is the plan, when the alien shoots out the goo, if the player is presssing the button to use the shield, (I am probably thinking control button) then they are blocking, the shield will have a durability, and they can use the shield for as long as they dont use all the durability. But here is the good thing, if they block the goo then there is a 1 in 5 chance it reflects the goo and it hits the alien and makes it vanish. This is a realy useful feature as the only other way to destroy an alien currently is the walk into and lose a heart. Summary + Updates I plan to make this more polished, as the splat for the alien’s goo shooting, and the shield for the character. I also need to make these all clear, and make the animations much more better and professional, bye guys!
Level 1 Complete Hello everyone, I just completed level 1, adding the finishing details fixing bugs, and adding a very cool parallax background. Major Bugs, I didn’t have major bugs but I had many bugs, for instance I had a scene change after the player enters the spaceship, this was for them to escape earth, but for some reason the scene change never worked, and it kept saying null, even when I printed this function. To fix this bug I made a variable and before the function was called I set it, so ** var tree = get_tree() ** this allowed me to call the functions without it becoming null, I still have no idea why the function was null but I guess I will have to figure that out. Another bug was my alien. So for my level one I have moving aliens, following aliens, and I was going to have moles, but I think I will add them in level 2 to keep it simple. But the problem was my following aliens, whenever they land on the player they never made the player lose a life or disappear. I looked at the collision bodies, and the one that gives the alien it’s shape was larger than the area 2d’s body, so therefore it would have never made contact with the player and would have not done anything to the player. To fix this, I adjusted the body size of both collision bodies. Parallax Background, a parallax background is basically different parts of the background moving at different speeds when the player moves. I made 7-8 layers of background, trees, clouds, bg colors, floor. To use them I used the parallax 2d in godot and set the scroll speed to different values for each, the farther away the bg element the lower the value, then you get the result as clouds moving at different paces of other elements as shown in the video. But this was not all that easy, I had a bug where the parallax elements went down so much when I started the game, I am pretty sure I am starting the player in the air, and when he falls so does the elements, so I have to place him down, also it is automatically adjusting my scroll offset. Summary/Level 2 That is about it for level 1, I also fixed the coins in the corner, and added more story. For level 2, I am going to start with making a parallax background, and make the actual game. Thank you, bye!
Level 2 Hello everyone, I did major updates and changes to Level 2 and this was the longest I have worked in Stardance in a single day so far! I worked for about 5 and a half hours today and made some really solid progress. Level 2 Setup + Map Design So I officially started Level 2. I created the base map and started building out the layout. I also added aliens around the map to start filling the world and make it feel more alive and challenging.Right now the level is still in early stages, but the structure is there. I still need to add fire/lava sections, more environmental hazards, and set up the boss fight with the goo enemies. I also want to add extra mechanics in Level 2 so it feels like a big step up from Level 1 instead of just a copy. Goo Enemy + Shield System Improvements I also fixed a lot of issues with the goo shooting system and improved how the shield works. Before, the goo had problems with detecting collisions too early, so I added a small delay using get_tree().create_timer() logic so it doesn’t instantly detect its own body when it spawns. I also adjusted the collision timing using a small time check (around 0.2 seconds) so it only starts interacting properly after it has actually left the enemy. The shield system now works with the goo reflection mechanic. When the player shield is active, the goo can sometimes be reflected back instead of dealing damage. I also improved how it visually flips and stays centered so it doesn’t look weird when the player changes direction or moves. Combat + Collision Fixes I also spent time cleaning up how the goo interacts with enemies and the player. Now when the goo hits the player without shield, it properly plays the splat animation, stops movement, and deals damage using the degrade() system. I also made sure it doesn’t instantly re-trigger collisions by adding timing protection so it feels more consistent. For enemies, I started experimenting with making them react when hit by reflected goo. The idea is that when they get hit, their collision gets disabled so they can fall down instead of just standing there, which will make combat feel more dynamic once gravity is properly set up on them. Overall Progress Overall, Level 2 is starting to take shape. The map exists, enemies are placed, and the core systems (goo shooting, shield reflection, and collision handling) are way more stable now. Next steps are: finishing the lava/fire areas improving enemy fall + death behavior adding the boss fight mechanics for goo polishing shield visuals so it feels smoother and making Level 2 feel more intense than Level 1
Level 2 Touches Hello everyone, I have done a lot to my game for Level 2 im almost done. I’ve basically been stacking a bunch of systems together and fixing a lot of the smaller problems I ran into over the last few devlogs (especially with goo, shields, and collisions), and it’s finally starting to feel like an actual full level instead of just a test area. Shop System Fully Finished First of all, I have finished the shop and now it is fully functional and actually works the way I wanted it to.You can now walk up to it and use it properly, and I added a lot of UI polish so it doesn’t feel dead or static. I added a hover function so when the mouse is over an item, it actually reacts (like spinning or doing a small animation), which makes it feel way more alive instead of just a menu.I also added different text responses depending on what happens: if you don’t have enough coins it tells you if you already own the item it tells you and when you buy something it gives proper feedback. This also ties into the coin system I’ve been using in the HUD, which now updates properly every frame so the shop always shows the correct value. Goo + Shield System Improvements (big fixes from earlier devlogs) I also fixed a lot of issues with the goo system that I was struggling with in earlier updates. Before, the goo had problems like hitting the player instantly when spawning shield reflection being inconsistent and weird collision timing issues. So I added a small delay (around 0.2 seconds using time checks) so the goo doesn’t detect itself or instantly trigger collisions when it spawns. I also improved the shield logic so now when the shield is active, the goo can actually be reflected back properly instead of just always damaging the player. I also added a durability feature, it is not visible yet but i am currently working on it. Now the hits count and soon it will be a visible feature. On top of that, I cleaned up how goo behaves when it hits enemies. Instead of doing messy collision disabling and weird states, I simplified it so enemies can just be removed cleanly with queue free, which makes everything way more stable and less buggy. Boss Fight Setup (Level 2 main objective) I’ve also started the boss fight for Level 2. Right now, there is an obby section where the boss is attacking with goo balls that can pass through parts of the environment, which makes dodging them actually important instead of just standing still and tanking hits. The player’s goal in the boss fight is to dodge the goo while making their way through the obstacle area and then press a special button (which has a cool animation). When the button is activated, it triggers lava flow across the map (since the level is on Mars), which is going to be the main mechanic used to defeat the boss. So instead of just fighting directly, it becomes more of a movement + timing fight where you have to avoid attacks and activate the environment against the boss. Overall Progress Overall, Level 2 is finally starting to feel like a real level instead of just a prototype. I’ve fixed a lot of the earlier problems with the goo collision timing shield reflection enemy interactions and UI consistency. And now I’m moving into more “game design” work instead of just fixing bugs, which is a good sign. Next steps are finishing the lava system for the boss fight polishing the obby section adding boss behavior and attack patterns and improving visuals and feedback so everything feels better.
Level 2 Boss Fight Hello everyone, I am coming close to an end of my level 2 of Space Travel. So currently I have made the boss and am working on the animation and how the boss fight is, so first I am going to explain the logic, then I will talk about timelines and how I have acomplished, and third I will start the alien UNIVERSE So what I have done today was finish up the shop (I barley did anything to it) and I also worked on the alien. The first part of today I spent a good amount of time creating the alien boss, and it doesn’t even look good 😭, so I became demotivated for today and only did 2 and a half hours. But the day is not over yet, so much left to explain. To continue, I created the animations for this boss, such as the text, and the anime animations, but I am still not done and have not fully tested it so there are bugs, but I will try to fix it. So I think I am good on time, so far I have been trying to finish up 4 levels then ship. For level 1 was follow and static aliens (walk in place). Level 2 was goo spit shooting aliens. I have no idea what to do for level 3 and 4, I really appreciate any suggestions on new items/things to add🙏. Also to clarify my solar system ending (part 1 of game) the user will go back to earth for level 4 and dodge the hardest of items and talk to the alien knight, there would be some type of dialogue like “ I never wanted to do this…” And that will be the end of level 4, and that is part 1 which I would ship my project for the first time, looking at the time line, I probably will get 60 hours when I ship, I hope I do good. But I really appreciate any suggestions, but to conclude, I am working on level 2 boss right now, debugging and making the animations more smoother. For level 3 and 4 I will talk all suggestions . Thank you everyone, bye!
Level 2 Hello everyone, sit back and get ready for a long devlog, because today I have alot to talk about. Okay, so guys now we have finished level 2, it is fully completed, I just need to add one line of code (changing the scene to the right scene the next one) and then I am done and probably wont touch it. Since I have not devloged in a few days (I did little time and was busy) I will talk about alot of items which is basically what I did for the past few days. Shield Alright I really want to talk about the shield first. So if you guys watch the video you can see how the shield works. Obviously it doesn’t have the code, but I will talk about how I integrated it with the shop and how that works. So I have 2 items in my global script, shield enabled, and shield dead. If I go to the boss fight of my game (where the shield is not allowed and users dont get it) I say Global.shield_enabled = false . This allows me to set if the user can use the shield or not through out the game. And if you guys made games previously or used Godot, you know about func_process() this allows me to simultaneously run items. You might be wondering, how does this simultaneously running fuction affect the shield for the player, and why would I do this. Remember earlier when I used the Global shield enable to turn it on and off, well the process checks it and if it is false, then it makes the shield not visible and not work. I mainly was relying on this for the past few days, because I was working on the shield. I also used process to modulate and change the size of the shield bar shield durability based on how many hits the shield has taken and how many hits it can take, I divide it to get a percentage. I also added the feature that if the player dies, they lose the shield, for the player to get the shield back, they have to buy it again for 15 coins. I plan to add an animation at the beginning of the level showing the shield coming onto the player. The Shop If you guys saw in the video, you saw the shop is accessible from anywhere in the game. This was easy all I had to do was add a button with the shop icon, and make the shop items visible. But I also have to account for mobs aliens shooting the player while they are in the shop. Luckily godot has an in built function called get_tree().paused if I set this to true every item will become paused. But luckily I can set the shop node’s process mode to always so it works even when the game is paused. This solved my problem of the aliens shooting and moving while the player is in shop. Boss Fight If you guys didn’t know, for the past few days I have been working on the boss fight, I have not got enough time to finish it but today I finally finished it today! So in level one, there is a scene with the boss fight for goo rising, and now that is level 2 and the player is on mars I wanted lava. But I didn’t want to redraw it so I just modulated the goo (I now realize that was a bad idea). Because the goo was not originally white, the modulating color started green, so what ever I chose was darker and not the right color. So because of that I had to spend my time fixing the goo and changing it to white and grey. This way for my level 1 goo rise, I just modulate it to the goo green I want and for level 2 I modulate it for the lava. Also for the boss fight, I added it so the shield disappears when the player has to fight, and made the animations more clear. Anyways guys I think this game will turn out great, I am always looking for suggestions especially for level 3 , bye guys!
Level 2 & 3 Updates Hello everyone, I have alot to talk about, especially since I recently just finished level 2 and am starting on level 3. I still need Planet Names waiting for suggestions but so far I am just using analogies in my game like earth (this is going to be the real planet) mars and Neptune. This helps players understand and relate to the geography and climate of the planet. For example in the screen shot you see it is an icy artic place like the planet Neptune. Let’s get started and talk about today! Level 2 Bugs, I was not so lucky, this paragraph is about bugs and fixes, well I am not happy to say that my animations from my text animation player all deleted, and since I didn’t commit to GitHub for the day, when I restored it, all the changes I made went away… I had to remake everything that I changed, and I still have some bugs, but I forgot some items, so it is hard. But I mainly just fixed placement. When I came back home to Godot, some items were gone, some part of the tile map disappeared I had to put the tiles in the right spot, and the code was all messed up. I currently still have no idea what happened, but I fixed it all and I have not had bugs since. Today I got a suggestion to make a cutscene of the level 2 alien boss burning. As you guys know yesterday I changed the goo/lava color to white so I can manually modulate it in the editor because I am reusing assets (this makes it so easy for me 👍). Well now I made a cutscene of the alien boss burning, I would have had to redraw everything, but instead I duplicated the animated sprite (the alien boss in the cutscene) and modulated to low transparency and red, so it looks like the alien boss has a lava shadow. Level 3, Alright I know you guys saw the screen shot, so you saw the icy biome. I am now going to explain my ideas that I plan to add to level 3. First, Ice Shooters , hear me out. I recently added goo shooters to the game, and since this is artic biome ice shooters to slow the player down, and gradually decrease health if they don’t find heat could be an awesome idea! Second actual ice . There are going to be like ice pits/platforms when the player walks on, it is all slippery. And I also might add moving platforms, but these probably will be saved for level 4 but I am still deciding. Space Ship Scene As you guys know, after each level I make a cutscene/scene of the player in their alien spaceship. I think for this one (right after level 2) the player will explore more of the spaceship, and learn something about the aliens. I am still deciding but currently that is my ideas. If you guys have any suggestions feel free to recommend them. Thanks, bye guys !
Level 3 Major Changes Hello everyone, today was by far the most productive day I have ever had in all of star dance, and possibly previous Hackclub events I have done. I almost finished level 3 in one day! This was a massive accomplishment for me as for the other levels took at least 3 days to do. An overview of what I did today were, map, icicles, ice skates, new alien, asset placing, inside space ship scene, space ship traveling planet’s scene. New Features Ice Shooter Alien , First I want to talk about the ice shooter I made today. So for every new level, I always add a new alien, and while I was still working on level 2 I was contemplating what new features I should add to the game for level 3, and since I thought I should do an ice planet because I was on mars (fire) and earth (neutral), I thought I might want something cold then I thought of this planet Neptune (I don’t have planet names yet)! So today I made the Ice Shooter Alien , This alien shoots snow which slows the user down for 3 seconds. While the cool down is not slow, there is only a 1 in 10 chance the player looses health to the snow (a rock could be in it). Icicles , it was recommended to me to add icicles to the game since it is an icy biome and there should be some structural relation to the biome and features. So I just used an area 2d as the base structure, and just detected if it touches the player or something else (like the enemy or structure). To make this icicle fall, I couldn’t give it a character body then there would be gravity, and it would keep moving even if I stopped it, there is a way to work but I figured out an clever way. I subtracted the distance between itself and the player using position.x and subtracted to see if the player was in range, and if it was I was changing the position with speed and delta coming down. And I just reset it to the original position because in the ready script I assigned it the starting position. Ice Skates , Ice skates were actually pretty easy, I duplicated the players idle and movement assets, and redrew them to have skates on the bottom, and once the player buys skates from the shop I make has_skate = true then in the physics process whether the player is idle or moving, it changes the sprite sheet to the one with ice skates, and when I disable it, it goes back to the original sprite sheet with no skates. Overall I think I did so much today, I around an hour drawing the art for the spaceship this morning (both the scenes of changing worlds and inside spaceship) because I had to add a new section and duplicate move, and modulate the planets to look like a new space travel. I think tomorrow I should finish or get close to finishing level 3 because I have to create the boss fight. Thankyou, bye guys!
Adding Touches Hello everyone, it has been some time since I have devolved, and I want to talk about what I have been doing, some goals I have, and some deadlines. For the past few days I have not been shipping because I have been working on level 3. From the screenshot you might be able to see the avalanche and the map for the avalanche. So I fixed a bug with the icicle, so even if it touched the ground and then you touched it. You would lose a life. For the collision shape of the icicle whenever it touched the ground I did set_deffered("disabled", true) so this would disabled it, and I would reenable it whenever it starts falling again. Also there was a bug where the aliens could shoot through walls, to solve that I just decreased the time pass value (time pass checks how long it has been running before it can do body checks) and kept time pass the same value for on enemy touched. Finally the avalanche, during the process of this I learned some pretty cool things. So the avalanche. This would be hard to animate, but apparently Godot has something for this. It is called a ray cast, and is brings the items with it down until a collision body. So what I did, is just like my alien script, I made it move right with speed * delta . And the ray cast handled itself, because it was down hill. I am still learning how to properly use a ray cast but for down hill situations I think I now know. When I was putting the animation for the space ship enter and leave. I wanted to reuse previous animations I have made. So I went to level 2 and realized I hadn’t finished it. But level 1 had it. This is where things get interesting, I brought out my calculator, duplicated the values into level 2 and 3, and subtracted the first keyframe from where I wanted the player to start. This allowed me to subtract 1454 from the X value and 104 from the Y value. So I did that for each of the key frames for both level 2 and 3 (keep in mind I wanted them in different places) and I had my animation finished. I tried adding a pause menu for when the player dies or pauses (esc) but I guess it didn’t turn out well it looks grainy and unprofessional, but I really need to ship, because I wont be available for the next few days and I can’t work on it. Future Items Before Ship Before I ship I want to add a few things that have been suggested. First of when testing it was realized that when the shield breaks, there was no pop up or anything indicating that it had broken. So I will have to now go and fix that. Second, I need to add sound. I always add sound at the end of the game, and I completely forgot to. Overall I think that this first ship will tell me a lot on what I have to work on for this game, I think I could do some better improvements if I wait some time then ship. But I think it will do great, and people will see the hard work I put into this game. Thankyou everyone!
Finishing Up Hello everyone, I have been fixing bugs today and adding items I forgot. Examples are audio, bugs, end scene, making harder levels easier (I was the only one able to beat it) and make text clearer. Bugs Today, I fixed mainly bugs because I am going to ship right after this devlog (my work has payed off). First I am going to talk about the skipping text bug. When I do the dialogue at any part of the level/game, and then press esccape button, (pausing game/pausemenu) and then I press home inside the pause menu, the whole game crashes, and I just figured out why. When ever im doing text I call $MC.wait_for_skip() this is a function, and in the function it has await get_tree().process_frame the bug with this, is that when ever the text is running and wait_for_skip() is called it is waiting and calculating every single frame, so when the user presses home, the player is gone, and that process_frame was never finished, so the game bugs out and ends. Well to counter this, I didn’t really do anything. I am really busy right now, and am trying to make the game good for the first ship, as much as I want to work on this bug I have to set it aside. In short terms, I got rid of the home button. If the player wants to go home they have to close the game and open it (reload page). Bug Two For the second bug, it really confused me. When I restarted the game, and went through level one (keep in mind I only picked up one coin) and then went to the second level, it said I had 30 coins. I saw my error, and it was that I was manually setting it to 30 coins when the game starts, so I then set that value to 0, so user starts with no coins. I thought all was solved, but it now showed five hundred and forty seven coins. I looked closely in the save_game function. I saw that I had set global.coins (the coins for the whole game collected) to what ever was in the label. And it might seem okay, but the label had manually been set to five hundred and forty seven coins. I just delteded that line of code because whenever the player picks up coins, it automatically goes into the global variable, so there was no point in having that line (since it only bugged out the game). Audio I forgot about the audio/sound effects/ background music until the end of the game (today, since I am going to ship). Because of this I had to rush through it, and I am going to warn you, some of the audio in the game might sound… wonky. Anyways I recorded me making the audio, like an alien shooting, icicles falling, avalanches moving. I just realized while writing this devlog, in the game I misspelled avalanche, and I have already exported it and uploaded the game 😭. Difficulty I had some people test out my game, and they had alot of good feedback that I implemented today. I still have not done some of it, but that is for next time. First they said level 1 was harder than level 3. I tested it out but didn’t find any problem, I realize that I play this game everyday to test so it must be easy. I made the boss fight for level 1 easier so the user can get through. To do this, I made the goo rise slower, and added more stepping points on the ground. Then I was told level three’s avalanche was too slow. I had to manually change the speed, but this was easy since I had incorporated a ray cast into the avalanche.
Ships:
Hello everyone, this is my first ship for Stardance, and let me introduce you to Space Travel. Space travel is an 2D game I have spent this whole month on creating. I have used tile maps, parallax 2D nodes, pixel art, and many features to create this game. Even though it is a work in progress and a test run for me I would like to congratulate my self on spending over 60 hours for a project. This is the longest I have ever spent on the project, and this is as complex as it gets. Some cool things I think would wow you guys are Parallax 2D nodes, theses give the background life, the make it look like the clouds are moving. Ray Casts, to create avalanches. In this game I have made many types of aliens for the user to battle. I am so proud of my self for finding the time to make this wonder full game. I have had people test it so I could polish it up for the first test run. I know it could be better, but I am planning on adding an Alien Universe. Users will have laser items, pick the planets to travel to, choose their character and much more. I am very motivated to continue this project and push it to it’s absolute max. This game features multiples levels, Level 1 (Earth) your goal is to escape the alien invasion you woke up to. Level 2 (Mars) you travel to an burning hot planet to find out more aliens live their, including goo types. Finally Level 3 (Neptune) you visit this icy place and find icicles, ice balls, avalanches, and ice bunnies waiting for you. This game took a lot of thought and time to create, as it is not as simple as it looks. The code was very complex as I had to calculate speed, and shooting distance (for the goo ball and ice balls). I am so glad I can share this hard worked project with you guys. I hope you enjoy it!...
|
1792997329.9302886
|
1793083729.9302886
|
|
37205
|
Neurorust by @toqtu | Stardance
|
toqtu
|
1
|
60.0
|
1254
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-06T20:32:48Z", "hours": 60.0, "multiplier": 17.4, "payout": 1254, "blessing": "neutral", "text": "Neurorust lets you train a simple neural network in your browser, using the GPU. The network predicts handwritten digits. After training you can draw your own digits and see its predictions. This project has tought me a lot about neural networks, Rust, GPU programming and WebAssembly. It was really challenging to produce a good result when just learning about everything. Even though the code is not perfect and there are a lot of things I would do different next time I feel like the end result has turned out quite well.", "repo": "https://github.com/fritl/neurorust", "demo": "https://neurorust.toqtou.me"}]...
|
[{"post_id": 63169, "ts": "202 [{"post_id": 63169, "ts": "2026-09-06T20:24:25Z", "hours": 4.1433, "text": "Done I added a README, improved the website defaults and did some final debugging. Now the project is ready to ship."}, {"post_id": 61056, "ts": "2026-09-03T19:23:48Z", "hours": 8.6478, "text": "Website finished I finished the frontend. You can now create a network with specific hyperparameters and then train it. After training you can draw a number and see what it predicts. Now I just need a good README and the project is ready to ship."}, {"post_id": 59056, "ts": "2026-08-31T17:25:19Z", "hours": 6.1647, "text": "Does it ever get easier? I thought using the network in the web would be a piece of cake. I was wrong. After fixing some minor issues I wrote some quick code to test training. It worked… technically. It was really slow and froze my whole pc. A quick glance into my system monitor revealed the secret. All CPU cores were almost maxed out while the GPU sat idle. So after spending a bunch of time to use the GPU everything was back to the CPU again. WebGPU is still experimental. Especially on Linux which is why instead of throwing an error when it couldn’t access my graphics card it just used all my CPU cores as a fallback. To get the GPU back into the game I started my browser with some flags and compatibility layers which makes training still slower than on native hardware but faster than with the CPU. Hopefully this was the last major challenge and implementing the frontend will be easier."}, {"post_id": 54637, "ts": "2026-08-25T17:43:42Z", "hours": 6.8453, "text": "It acutally learns (again) After some more pain with the loss function, buffer sizes and shape mismatches I got a neural network running on the gpu. The GPU is about 10x faster than the CPU version although some hyperparameters can affect this result. Now I want to build a small wasm interface and build a small web page around that to allow anyone to run a local neural net in the browser."}, {"post_id": 51621, "ts": "2026-08-21T12:20:16Z", "hours": 4.3658, "text": "GPU Layers I initially thought porting the forward and backward passes to the GPU would be as simple as replacing Matrix with GpuMatrix everywhere. It wasn’t. Unlike CPU operations, GPU operations can’t allocate memory themselves. On the CPU, x + 2 simply creates a new value. On the GPU, every operation needs a pre-existing buffer to write its result into. So x += 2 works, but y = x + 2 requires a buffer for y to exist first. And x = x + 2 isn’t supported on the GPU at all. The solution is to pre-allocate buffers and keep them around, resizing them only when the batch size changes. It works, but it also means every struct starts accumulating buffer fields and scaling that approach to an entire network only makes the problem worse. Next: some kind of global buffer manager, before tackling the loss function."}, {"post_id": 47481, "ts": "2026-08-15T12:37:59Z", "hours": 4.6719, "text": "Forward pass After adding all necessary operations on the GpuMatrix I implemented the forward pass. It was surprisingly hard to get the caching for the backward pass right because reallocating buffers on the gpu should be avoided. As always I let AI write some test cases and everything passed. Next I’ll implement the backward pass which will hopefully let the network learn with incredible speeds."}, {"post_id": 38223, "ts": "2026-07-31T14:55:33Z", "hours": 4.6517, "text": "GPU Matmul I thought beating the CPU at matrix multiplication would be easy. It turns out that hand-optimized assembly code is a tough opponent. My naive GPU version isn’t bad, though: it’s roughly on par with NumPy, and about 13x faster than my CPU code but still worse than I initially expected. There’s plenty of room to improve. Right now the GPU sits idle about 80% of the time, just waiting on memory reads. For now, I’ll keep building out the rest of the neural net on the GPU and come back to optimizing matmul later."}, {"post_id": 37145, "ts": "2026-07-29T17:08:59Z", "hours": 1.7775, "text": "Sidequest: Doubling numbers In my last devlog I stated that doubling numbers on the GPU is only faster if you want to double a HUUUGE amount of numbers. Of course I wanted to see at what point the GPU really is faster. I found out that the CPU is actually quite good at doubling numbers so the GPU wasn’t faster at all. I then measured just the time the GPU takes to double the numbers ignoring the time it needs to transfer the data. With that the GPU eventually overtakes the CPU."}, {"post_id": 36003, "ts": "2026-07-27T20:21:29Z", "hours": 2.0819, "text": "Doubling numbers Turns out you have to go back to square one to run a neural net on the GPU. For me that meant writing a program that multiplies every number in an array by 2, on the GPU. Limited learning resources Rust has a great library called wgpu for talking to the GPU. It’s cross-platform and can even run in WebAssembly if you do it right. The problem: most tutorials only cover rendering, and my neural net doesn’t care about triangles on a screen, it needs compute. I never found a tutorial on compute shaders from scratch, so I read the rendering material, stripped out what didn’t apply (windows, vertices, …), and added what did (workgroup size, how a compute pass works, …). Not trivial, but the official wgpu compute example got me on track. I mostly just copied it. Why it’s hard GPU programming isn’t straightforward. Here’s everything required just to multiply an array by 2: Get a wgpu instance , adapter , device , and queue Create a shader module Create the input , output , and download buffers Create the bind group layout and bind group Create the pipeline layout Create an encoder and a compute pass Copy data CPU → GPU , run the shader, then copy data GPU → CPU After 190 lines and some unexpected debugging (on code copied straight from an example, no less), I could finally double numbers fast, but only with huge arrays. Below a certain size, shuttling data to the GPU and back is slower than just doing the math on the CPU. I don’t fully understand every step yet. Hopefully I won’t need to, or I’ll pick it up along the way. Up next Matrix multiplication is next, and most of the boilerplate above should carry over. Big questions remain about the final network, but taking it one step at a time should get me there eventually… or to a complete surrender, who knows."}, {"post_id": 34824, "ts": "2026-07-25T20:39:43Z", "hours": 5.475, "text": "It actually learns After getting XOR working, I tried my neural net on MNIST (handwritten digit recognition). Loading the data was easier than expected, though getting it into the right shape for my network took some fiddling. To make sure I loaded it correctly, I drew a few of the digits to check they looked right before training. Once that was sorted, training worked well, and the results were better than I hoped: 97.8% accuracy , in about 5 minutes. I also experimented with running the whole thing in a browser, but that turned out to be more involved than expected, so I’m parking it for now and focusing on other improvements first."}, {"post_id": 32587, "ts": "2026-07-21T21:16:07Z", "hours": 7.3772, "text": "It learns (a bit) After implementing loss functions, activation functions, and the forward and backward pass for the layers, I tried training a simple network to predict the XOR function. After running the network, I found that it didn’t learn at all. The loss just stayed at 0.25 without any changes. Not only that, the whole neural network didn’t update anything. After some initial digging, I had a feeling this was one of those dumb, simple bugs you can’t find for hours. Unfortunately, my feeling was right: the error was multiplying the bias instead of adding it. This is really bad because the bias initially has a value of 0, which means all outputs turn out to be 0 (not good). Of course, the fix was a one character change: * to + . Now that the network can predict XOR, I’ll see if it can also handle MNIST. I’m still a bit scared about performance issues with matrix multiplication."}, {"post_id": 31187, "ts": "2026-07-19T12:03:17Z", "hours": 3.8625, "text": "Rust Learning Project: Building a Neural Network I recently read a few chapters of The Rust Programming Language and wanted to put my newly gained knowledge to use. Naturally, the first thing that came to mind was building a neural network in Rust. I’d already tried this in Python and failed, so I figured maybe, for some reason, it would go better this time around. Matmul The first step was implementing matrices and their operations in Rust, the most important of course being matrix multiplication. Since this would likely become the biggest bottleneck for the whole model, I got curious about its performance and benchmarked multiplying two 1024x1024 matrices. The naive implementation took about 20 seconds. One simple optimization brought that down to 14 seconds. Then I built with compiler optimizations enabled, and the naive implementation suddenly ran in 63 nanoseconds. I was floored, briefly convinced I’d stumbled onto some incredible compiler magic, before realizing what actually happened: the compiler had simply skipped the calculation entirely, since the result was never used. Classic dead code elimination. After forcing the compiler to keep the computation, the naive implementation came in at a more believable 2 seconds, and the optimized version dropped to 200ms. For comparison, Numpy does the same multiplication in about 4ms. Whether 200ms is fast enough for training neural nets in reasonable time remains to be seen."}]...
|
Title: Neurorust by @toqtu | Stardance
Devlogs:
R Title: Neurorust by @toqtu | Stardance
Devlogs:
Rust Learning Project: Building a Neural Network I recently read a few chapters of The Rust Programming Language and wanted to put my newly gained knowledge to use. Naturally, the first thing that came to mind was building a neural network in Rust. I’d already tried this in Python and failed, so I figured maybe, for some reason, it would go better this time around. Matmul The first step was implementing matrices and their operations in Rust, the most important of course being matrix multiplication. Since this would likely become the biggest bottleneck for the whole model, I got curious about its performance and benchmarked multiplying two 1024x1024 matrices. The naive implementation took about 20 seconds. One simple optimization brought that down to 14 seconds. Then I built with compiler optimizations enabled, and the naive implementation suddenly ran in 63 nanoseconds. I was floored, briefly convinced I’d stumbled onto some incredible compiler magic, before realizing what actually happened: the compiler had simply skipped the calculation entirely, since the result was never used. Classic dead code elimination. After forcing the compiler to keep the computation, the naive implementation came in at a more believable 2 seconds, and the optimized version dropped to 200ms. For comparison, Numpy does the same multiplication in about 4ms. Whether 200ms is fast enough for training neural nets in reasonable time remains to be seen.
It learns (a bit) After implementing loss functions, activation functions, and the forward and backward pass for the layers, I tried training a simple network to predict the XOR function. After running the network, I found that it didn’t learn at all. The loss just stayed at 0.25 without any changes. Not only that, the whole neural network didn’t update anything. After some initial digging, I had a feeling this was one of those dumb, simple bugs you can’t find for hours. Unfortunately, my feeling was right: the error was multiplying the bias instead of adding it. This is really bad because the bias initially has a value of 0, which means all outputs turn out to be 0 (not good). Of course, the fix was a one character change: * to + . Now that the network can predict XOR, I’ll see if it can also handle MNIST. I’m still a bit scared about performance issues with matrix multiplication.
It actually learns After getting XOR working, I tried my neural net on MNIST (handwritten digit recognition). Loading the data was easier than expected, though getting it into the right shape for my network took some fiddling. To make sure I loaded it correctly, I drew a few of the digits to check they looked right before training. Once that was sorted, training worked well, and the results were better than I hoped: 97.8% accuracy , in about 5 minutes. I also experimented with running the whole thing in a browser, but that turned out to be more involved than expected, so I’m parking it for now and focusing on other improvements first.
Doubling numbers Turns out you have to go back to square one to run a neural net on the GPU. For me that meant writing a program that multiplies every number in an array by 2, on the GPU. Limited learning resources Rust has a great library called wgpu for talking to the GPU. It’s cross-platform and can even run in WebAssembly if you do it right. The problem: most tutorials only cover rendering, and my neural net doesn’t care about triangles on a screen, it needs compute. I never found a tutorial on compute shaders from scratch, so I read the rendering material, stripped out what didn’t apply (windows, vertices, …), and added what did (workgroup size, how a compute pass works, …). Not trivial, but the official wgpu compute example got me on track. I mostly just copied it. Why it’s hard GPU programming isn’t straightforward. Here’s everything required just to multiply an array by 2: Get a wgpu instance , adapter , device , and queue Create a shader module Create the input , output , and download buffers Create the bind group layout and bind group Create the pipeline layout Create an encoder and a compute pass Copy data CPU → GPU , run the shader, then copy data GPU → CPU After 190 lines and some unexpected debugging (on code copied straight from an example, no less), I could finally double numbers fast, but only with huge arrays. Below a certain size, shuttling data to the GPU and back is slower than just doing the math on the CPU. I don’t fully understand every step yet. Hopefully I won’t need to, or I’ll pick it up along the way. Up next Matrix multiplication is next, and most of the boilerplate above should carry over. Big questions remain about the final network, but taking it one step at a time should get me there eventually… or to a complete surrender, who knows.
Sidequest: Doubling numbers In my last devlog I stated that doubling numbers on the GPU is only faster if you want to double a HUUUGE amount of numbers. Of course I wanted to see at what point the GPU really is faster. I found out that the CPU is actually quite good at doubling numbers so the GPU wasn’t faster at all. I then measured just the time the GPU takes to double the numbers ignoring the time it needs to transfer the data. With that the GPU eventually overtakes the CPU.
GPU Matmul I thought beating the CPU at matrix multiplication would be easy. It turns out that hand-optimized assembly code is a tough opponent. My naive GPU version isn’t bad, though: it’s roughly on par with NumPy, and about 13x faster than my CPU code but still worse than I initially expected. There’s plenty of room to improve. Right now the GPU sits idle about 80% of the time, just waiting on memory reads. For now, I’ll keep building out the rest of the neural net on the GPU and come back to optimizing matmul later.
Forward pass After adding all necessary operations on the GpuMatrix I implemented the forward pass. It was surprisingly hard to get the caching for the backward pass right because reallocating buffers on the gpu should be avoided. As always I let AI write some test cases and everything passed. Next I’ll implement the backward pass which will hopefully let the network learn with incredible speeds.
GPU Layers I initially thought porting the forward and backward passes to the GPU would be as simple as replacing Matrix with GpuMatrix everywhere. It wasn’t. Unlike CPU operations, GPU operations can’t allocate memory themselves. On the CPU, x + 2 simply creates a new value. On the GPU, every operation needs a pre-existing buffer to write its result into. So x += 2 works, but y = x + 2 requires a buffer for y to exist first. And x = x + 2 isn’t supported on the GPU at all. The solution is to pre-allocate buffers and keep them around, resizing them only when the batch size changes. It works, but it also means every struct starts accumulating buffer fields and scaling that approach to an entire network only makes the problem worse. Next: some kind of global buffer manager, before tackling the loss function.
It acutally learns (again) After some more pain with the loss function, buffer sizes and shape mismatches I got a neural network running on the gpu. The GPU is about 10x faster than the CPU version although some hyperparameters can affect this result. Now I want to build a small wasm interface and build a small web page around that to allow anyone to run a local neural net in the browser.
Does it ever get easier? I thought using the network in the web would be a piece of cake. I was wrong. After fixing some minor issues I wrote some quick code to test training. It worked… technically. It was really slow and froze my whole pc. A quick glance into my system monitor revealed the secret. All CPU cores were almost maxed out while the GPU sat idle. So after spending a bunch of time to use the GPU everything was back to the CPU again. WebGPU is still experimental. Especially on Linux which is why instead of throwing an error when it couldn’t access my graphics card it just used all my CPU cores as a fallback. To get the GPU back into the game I started my browser with some flags and compatibility layers which makes training still slower than on native hardware but faster than with the CPU. Hopefully this was the last major challenge and implementing the frontend will be easier.
Website finished I finished the frontend. You can now create a network with specific hyperparameters and then train it. After training you can draw a number and see what it predicts. Now I just need a good README and the project is ready to ship.
Done I added a README, improved the website defaults and did some final debugging. Now the project is ready to ship.
Ships:
Neurorust lets you train a simple neural network in your browser, using the GPU. The network predicts handwritten digits. After training you can draw your own digits and see its predictions. This project has tought me a lot about neural networks, Rust, GPU programming and WebAssembly. It was really challenging to produce a good result when just learning about everything. Even though the code is not perfect and there are a lot of things I would do different next time I feel like the end result has turned out quite well....
|
1792853365.4315357
|
1792939765.4315357
|
|
17862
|
Arona Chat by @yearcakes | Stardance
|
yearcakes
|
4
|
79.0
|
1237
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-30T12:39:46Z", "hours": 1.0, "multiplier": 9.78, "payout": 7, "blessing": "neutral", "text": "Some small improvements.", "repo": "https://github.com/zhaozhuoran/arona-chat-open", "demo": "https://aronachat.yearcakes.com/"}, {"ship_num": 2, "ts": "2026-09-16T14:26:13Z", "hours": 21.0, "multiplier": 18.5, "payout": 396, "blessing": "neutral", "text": "This is the last ship for Arona Chat for the time being. Since my new semester started on August 31st, I won’t have as much time to work on Arona Chat or add new features. Anyway, I hope you all enjoy Arona Chat!", "repo": "https://github.com/zhaozhuoran/arona-chat-open", "demo": "https://aronachat.yearcakes.com/"}, {"ship_num": 3, "ts": "2026-07-20T05:46:47Z", "hours": 56.0, "multiplier": 14.84, "payout": 826, "blessing": "neutral", "text": "After a lot of work, AronaChat v1.2.0 is finally here! With this update, I’m continuing to transform AronaChat from a simple project into a real product that people can actually use. The Public Demo is now live! This is not just a temporary showcase — I want to build it into a long-term usable product. You can connect your own API providers and use AronaChat with your own models. Security and privacy are also a priority. API keys are stored with encryption and protected by multiple security measures to keep your credentials as safe as possible. Due to storage and cost considerations, each user currently has a limited storage quota. When the limit is reached, attachments will be automatically removed using a FIFO rolling deletion system. Chat history will be preserved as long as possible while keeping operating costs sustainable. Thank you everyone who has followed AronaChat’s journey! This is only the beginning, and I hope AronaChat can become a tool that people truly enjoy using.", "repo": "https://github.com/zhaozhuoran/arona-chat-open", "demo": "https://aronachat.yearcakes.com/"}, {"ship_num": 4, "ts": "2026-06-13T09:11:19Z", "hours": 1.0, "multiplier": 8.56, "payout": 8, "blessing": "neutral", "text": "What did you make? I built Arona Chat, a full-stack AI chat application powered by Cloudflare Workers, D1, R2, Durable Objects, and OpenRouter. It supports chat sessions, file attachments, usage tracking, budget management, authentication, and model selection, all wrapped in a Blue Archive-inspired interface. What was challenging? The most challenging part was designing the backend architecture around long-running AI responses and usage tracking. One lesson I learned the hard way is that inefficient SQLite access patterns can dramatically increase database costs. As the project grew, I had to rethink how usage statistics were stored and aggregated instead of recalculating everything repeatedly. Another challenge was handling very long SSE streams. For AI responses that may take a long time to complete, it is important that processing continues even if the client disconnects. This was my first time introducing Durable Objects into a production project, and they turned out to be a great fit for maintaining state and ensuring reliable streaming behavior. What are you proud of? I’m proud that this project pushed me beyond simple CRUD applications and into distributed system design. Integrating Durable Objects, building usage aggregation, and optimizing streaming performance taught me a lot about how real-world AI applications are built. I’m also genuinely impressed by Cloudflare R2. It was extremely easy to integrate, works reliably, and offers a very generous free tier, making it an excellent choice for student developers and hobby projects. How can people test it? Fork this repository. Update the wrangler.toml configuration for your own Cloudflare resources (do not commit any secrets). Deploy the frontend (frontend) to Cloudflare Pages and the backend (backend) to Cloudflare Workers. Configure the required Secrets in Cloudflare after deployment. Open the deployed site and log in using the password you configured. Create your first Passkey (highly recommended for a better login experience). Start chatting, upload files, try different models, and explore usage statistics and budget management features.", "repo": "https://github.com/zhaozhuoran/arona-chat-open", "demo": "https://aronachat.yearcakes.com/"}]...
|
[{"post_id": 75553, "ts": "202 [{"post_id": 75553, "ts": "2026-09-30T12:37:56Z", "hours": 1.2942, "text": "I added a simple sharing function. I also added automatic picture attachment compression, which should save a lot of tokens. Commit"}, {"post_id": 68643, "ts": "2026-09-15T13:37:00Z", "hours": 4.7658, "text": "This is the last update for Arona Chat for the time being. In this update, I’ve added automatic image resizing, support for TXT and Markdown files, dynamic username injection in the greeting and system prompt, and the new Ethereal Dark theme. However, since my new semester started on August 31st, I won’t have as much time to work on Arona Chat or add new features. Anyway, I hope you all enjoy Arona Chat! Commit"}, {"post_id": 40574, "ts": "2026-08-04T06:52:05Z", "hours": 2.5586, "text": "Hey guys! I’m currently working on a new theme (Ethereal Dark) for Arona Chat, and it will probably introduce a very large diff with many UI/CSS/component changes. I’m thinking about creating a dedicated feature branch (theme/ethereal-dark) for this work instead of directly committing everything to main. The idea is to keep the development process transparent and easier to review for future reviewers and users. After the theme is complete, I’ll merge it back into main. So I’d like to get your opinion: Do you prefer seeing the full development history through a feature branch? Or do you think keeping a cleaner main history with a larger commit is better? Thanks!"}, {"post_id": 40524, "ts": "2026-08-04T03:31:20Z", "hours": 6.0331, "text": "Settings now save automatically as soon as you make changes, so there’s no more clicking Save everywhere. The user list also shows each user’s email when available (falling back to the Clerk ID). Improved auth by showing a recovery screen if initialization gets stuck for 12 seconds, and hardened SSRF protection against alternative IPv4 bypass tricks. I’ve already started designing the Ethereal Dark theme too, but since it’s unrelated to this commit I didn’t include it yet. Still probably another 8–10 hours to go before it’s ready. Commit"}, {"post_id": 38059, "ts": "2026-07-31T07:37:52Z", "hours": 4.6294, "text": "After using the Ethereal Light theme for a while, I realized that although the core chat interface was done, many secondary pages still looked like they belonged to a completely different application. So this update wasn’t about adding a flashy new feature, it was about finishing what Ethereal Light was always meant to be. This is one of those updates where most users probably won’t notice every individual change, but I hope everyone notices that Ethereal Light feels even more beautiful now. I also realized that good UI isn’t about making one page beautiful, it’s about making every page feel like it was designed together. Commit"}, {"post_id": 37591, "ts": "2026-07-30T12:56:46Z", "hours": 1.7836, "text": "Confession time: I’m a high school STEM student. I spend far more time studying math, physics, chemistry, and biology than anything related to design. I have almost no artistic background, and I’m much more of a coder than a designer, so building Ethereal Light has been quite a journey. Half of the CSS for Ethereal Light only exists because I kept googling, “How do I make this look less ugly?” 😭 Somehow, after countless tiny tweaks, it’s finally starting to look like the theme I imagined. Anyway, I hope you love Arona Chat."}, {"post_id": 37517, "ts": "2026-07-30T10:14:34Z", "hours": 1.0261, "text": "I’m planning to further polish Ethereal Light theme and address the suggestions mentioned in the rating feedback. Thanks everyone for the support!"}, {"post_id": 32697, "ts": "2026-07-22T00:42:44Z", "hours": 0.5992, "text": "Upcoming Changes: Add more personalization features, such as customizable tone and emoji usage. Refine the Ethereal Light theme."}, {"post_id": 31626, "ts": "2026-07-20T05:40:15Z", "hours": 1.5953, "text": "After fixing a number of issues, the Arona Chat Public Demo is finally ready! You can try it using the link below. https://aronachat.yearcakes.com/"}, {"post_id": 31317, "ts": "2026-07-19T16:46:36Z", "hours": 4.7217, "text": "AronaChat v1.2.0 — A Bigger Update Than The Version Number Suggests Today, I completed AronaChat v1.2.0! Although this is only a minor version bump, it actually includes a lot of major improvements and new features. In this update, I added multi-provider support, custom models, the new Ethereal Light theme, and many other improvements. There are still many things to polish, but I’m working hard to turn AronaChat into something that we can genuinely use in our daily lives — not just a project. The current codebase has grown into a very complex system, so I’m planning to deploy the Public Demo version tomorrow. But this Public Demo is not just a temporary showcase. My goal is to make it a long-term usable product. You will be able to connect your own API providers and use AronaChat with your own services. To protect your privacy and security, the current version includes encrypted API key storage and multiple layers of security protection to keep your credentials as safe as possible. Due to storage and cost considerations, each user will have a fixed storage quota. If the limit is exceeded, attachments will be automatically removed using a FIFO (First In, First Out) rolling deletion system. For chat history, I’ll try my best to keep conversations stored for as long as possible while maintaining reasonable operating costs. Thank you for following the development of AronaChat! This is still just the beginning, and I hope it can become a tool that people truly enjoy using."}, {"post_id": 30657, "ts": "2026-07-18T12:26:38Z", "hours": 2.2361, "text": "The core development work is pretty much done! I’m now moving into the final polishing phase—doing security reviews, testing everything thoroughly, and fixing all the little rough edges I can find. Once that’s finished, I’ll deploy the new build as a public instance that everyone can use long-term. Can’t wait to share it with you all!"}, {"post_id": 30560, "ts": "2026-07-18T07:28:12Z", "hours": 2.12, "text": "🌸 Devlog Update I’m currently exploring a better and more reasonable resource limitation system, hoping to make the DEMO experience smoother, friendlier, and more enjoyable for everyone! I’m also working on adding support for custom model providers, so you’ll be able to add your own providers and use this project as a complete long-term solution instead of just a DEMO. Of course, this also brings some new challenges qwq Since users will be able to add their own API Keys, I need to carefully design a secure system to make sure your keys stay safe and never get exposed. I’m planning a layered architecture with encryption, multiple authentication layers, and additional security protections. This project is becoming much more complicated than I originally expected… but I want to build it properly instead of rushing it 🥺✨ 🌱 About Storage S3-compatible storage is really expensive qwq, so for now I’ve added per-user file size limits and a 7-day automatic cleanup system. I know these limits are a little too strict, and I’m really sorry about that 🥲💦 I hope you can understand that I’m still a solo developer trying to keep the service sustainable. To improve this, I’m building my own tiered storage system — Minamo 🌊 After Minamo is finished, attachment storage limits will be increased significantly, and the 7-day automatic cleanup will be removed! 🎉 If you like this project, you can follow this project or follow Minamo to receive future updates and new features 💫 Thank you so much for supporting this project! 💙"}, {"post_id": 30185, "ts": "2026-07-17T15:34:58Z", "hours": 4.2597, "text": "Whitelist is almost finished! There’s only a little bit left to polish, and I should have it done within the next few days. New ship coming soon™"}, {"post_id": 29884, "ts": "2026-07-17T01:31:04Z", "hours": 1.4356, "text": "Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [DONE] Animations [DONE] Visual polish [DONE] Final UI review - almost done Whitelist User resource usage limits (for the demo) Lazy frontend loading"}, {"post_id": 27088, "ts": "2026-07-12T10:32:05Z", "hours": 2.3678, "text": "Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [DONE] Animations [DONE] Visual polish [IN PROGRESS] Final UI review - almost done Whitelist User resource usage limits (for the demo) Lazy frontend loading"}, {"post_id": 27039, "ts": "2026-07-12T06:47:49Z", "hours": 1.4494, "text": "Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [DONE] Animations [DONE] Visual polish Final UI review Whitelist User resource usage limits (for the demo) Lazy frontend loading"}, {"post_id": 27020, "ts": "2026-07-12T05:11:34Z", "hours": 2.5303, "text": "Finally fixed the security vulnerabilities and the remaining bugs. Next, I’ll continue reviewing the codebase and finish the new theme."}, {"post_id": 26596, "ts": "2026-07-11T14:50:43Z", "hours": 3.3919, "text": "I’m currently fixing a number of bugs in the new Ethereal Light theme. At the same time, I had the codebase audited by AI, which identified several critical security issues. I’m actively working through both the theme bugs and the reported vulnerabilities, so the next public commit may be delayed a bit. Before anything is published, I’ll also perform a full manual security review to make sure the public release is free of known security issues."}, {"post_id": 26481, "ts": "2026-07-11T09:28:21Z", "hours": 2.2219, "text": "Unexpectedly discovered several critical bugs. Currently fixing them."}, {"post_id": 26419, "ts": "2026-07-11T06:13:44Z", "hours": 1.4672, "text": "Fixed a bunch of UI, animation, rendering, and performance issues across the Ethereal Light theme and the Settings Panel. Real-time reasoning topic extraction now handles unfinished Markdown chunks correctly, so active words no longer get cut off while responses are streaming. I also switched to stable React keys, which eliminates the annoying text flickering during streaming. The scrolling lock, content clipping, and hidden input issues in Ethereal Light have also been fixed by improving layer isolation and hardware acceleration. Finally, repeated clicks on the Save button in Settings are now automatically deduplicated, preventing duplicate requests when the same configuration is submitted multiple times within 5 seconds."}, {"post_id": 26378, "ts": "2026-07-11T04:07:14Z", "hours": 0.9244, "text": "Fixed a critical bug that could allow users to perform unauthorized operations."}, {"post_id": 25794, "ts": "2026-07-10T08:01:30Z", "hours": 2.67, "text": "Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [DONE] Animations Visual polish Final UI review Whitelist User resource usage limits (for the demo) Lazy frontend loading"}, {"post_id": 25669, "ts": "2026-07-10T02:34:24Z", "hours": 3.2403, "text": "Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [IN PROGRESS] Animations (almost done) Visual polish Final UI review Whitelist User resource usage limits (for the demo) Lazy frontend loading"}, {"post_id": 25112, "ts": "2026-07-09T03:30:04Z", "hours": 2.4272, "text": "I couldn’t decide between a typewriter effect and a fade-in animation for AI responses, so I added both! You can now choose your preferred output animation in Settings."}, {"post_id": 24128, "ts": "2026-07-07T14:30:38Z", "hours": 0.7944, "text": "I refactored the usage calculation. This fixes an issue where the per-model cost wasn’t updated automatically, while also reducing database usage."}, {"post_id": 22584, "ts": "2026-07-05T03:34:45Z", "hours": 2.1117, "text": "I discovered that adding a new feature caused an existing feature to break. To prevent similar regressions, I added smoke tests and a full end-to-end (E2E) test suite."}, {"post_id": 21564, "ts": "2026-07-03T16:19:24Z", "hours": 4.1964, "text": "Status Updated! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft Animations Component art polish Final UI review Whitelist User resource usage limits (for the demo) Lazy frontend loading"}, {"post_id": 19919, "ts": "2026-07-01T11:05:33Z", "hours": 2.1733, "text": "I am currently working on: New frontend UI theme (I named it Ethereal Light. It will be very, very beautiful!), and it will be released with a theme selector (if you don’t like it, you can switch to the current Classic theme). Whitelist: enabling you to have a private deployment! User resource usage limits: designed for the demo. Lazy frontend loading: makes the frontend start faster! Bug fixes: the current version has many bugs, including Clerk integration, multi-provider switching, etc. Locating the source of these bugs is very tiring. The next public version will take a long time to release and be pushed to the public repo. I will sync my progress via devlogs. If you have any suggestions, please tell me — they are very, very important to me!"}, {"post_id": 16796, "ts": "2026-06-27T08:28:33Z", "hours": 3.0211, "text": "Integrated Clerk for authentication and fixed various bugs :D"}, {"post_id": 13718, "ts": "2026-06-22T14:21:24Z", "hours": 3.1058, "text": "feat: optimize chat stream stability, security, and frontend rendering performance- Security: Added sensitive data redaction (masking password , secret , token , apiKey ) for trace logs in backend utility request/response body parsing. Stability: Enhanced Durable Object state recovery by persisting and restoring runtime payloads, ensuring the process queue resumes on restart, and adding a 100-second upstream API fetch timeout. Database: Bumped DB schema version to 15, adding applySchemaV14 and applySchemaV15 compatibility stubs. Performance: Refactored ChatSession message lists by extracting and memoizing UserMessageRow and AssistantMessageRow with React.memo , and extracted static Markdown plugins outside of render scopes to eliminate redundant parsing. State Management: Integrated Zustand useShallow selectors across App , ChatInputArea , and ChatSession to prevent unnecessary re-renders. Resilience: Upgraded stream reconnect/resume flow in the store to pass existing stream progress (content and reasoning), preventing flickering and duplicate content rendering on stream recovery."}, {"post_id": 12359, "ts": "2026-06-20T05:08:29Z", "hours": 1.1664, "text": "Added a Demo Mode that allows guest access via a password-based login. Demo mode can be enabled via config. Guests can log in using a shared demo password. All demo sessions are isolated per device. Demo data is separated from production."}, {"post_id": 7960, "ts": "2026-06-13T08:59:45Z", "hours": 0.5317, "text": "Release 1.1.0 This update focuses on enhancing usage tracking capabilities, introducing flexible service tiers and budget management, and delivering deep performance optimizations for the chat experience. 🌟 New Features Usage Aggregation: Added persistent tracking of total requests, prompt/completion tokens, and total cost (USD) within user profiles, including a detailed breakdown by model. Service Tiers: Introduced OpenRouter Service Tier support to balance cost and performance: Flex (0.5x cost): More affordable, but potentially slower or less reliable. Default (1.0x cost): Standard service level. Priority (2.5x cost): Fastest response times and highest priority. Temporary Daily Budget: Added the ability to set a temporary budget override for the current UTC day, allowing short-term flexibility without altering long-term settings. Usage Sync Tool: A new “Recalculate Usage Statistics” feature in the settings allows users to force a backend scan of all records to synchronize aggregated totals. ⚡ Performance Improvements Streaming Render Optimization: Implemented a buffering mechanism using requestAnimationFrame in useStore, shifting high-frequency streaming updates from “immediate trigger” to “frame-synced updates,” significantly reducing re-renders and improving UI smoothness. Refined Auto-Scroll: Overhauled auto-scroll logic in ChatSession to distinguish between session switches, message count changes, and active streaming, ensuring smoother scrolling behavior. 🎨 UI/UX Enhancements Session Management: Pagination: Session list now uses lazy loading (“Load More”) instead of loading all sessions at once, improving startup speed. Quick Actions: Added Pin and Archive capabilities in session menu for better organization. Settings Panel Upgrade: Advanced Tab: Introduced a new “Advanced” tab for system maintenance tools and technical information. Budget UI: Improved budget settings interface with detailed cost multiplier explanations and a dedicated temporary budget input. System Info: Added visibility for Instance ID and Schema Version. 🛠️ Technical Changes Backend Architecture: Modularized routing and migrated chat sessions to a Durable Object-based implementation for better state consistency. Database Migration: Updated user profile schema to support usage aggregation (Schema v13). Shared Types: Updated UserProfile and ChatGenerationSettings types to support new tracking and configuration options."}, {"post_id": 7928, "ts": "2026-06-13T06:57:41Z", "hours": 0.3606, "text": "First Public Release!"}]...
|
Title: Arona Chat by @yearcakes | Stardance
Devlo Title: Arona Chat by @yearcakes | Stardance
Devlogs:
First Public Release!
Release 1.1.0 This update focuses on enhancing usage tracking capabilities, introducing flexible service tiers and budget management, and delivering deep performance optimizations for the chat experience. 🌟 New Features Usage Aggregation: Added persistent tracking of total requests, prompt/completion tokens, and total cost (USD) within user profiles, including a detailed breakdown by model. Service Tiers: Introduced OpenRouter Service Tier support to balance cost and performance: Flex (0.5x cost): More affordable, but potentially slower or less reliable. Default (1.0x cost): Standard service level. Priority (2.5x cost): Fastest response times and highest priority. Temporary Daily Budget: Added the ability to set a temporary budget override for the current UTC day, allowing short-term flexibility without altering long-term settings. Usage Sync Tool: A new “Recalculate Usage Statistics” feature in the settings allows users to force a backend scan of all records to synchronize aggregated totals. ⚡ Performance Improvements Streaming Render Optimization: Implemented a buffering mechanism using requestAnimationFrame in useStore, shifting high-frequency streaming updates from “immediate trigger” to “frame-synced updates,” significantly reducing re-renders and improving UI smoothness. Refined Auto-Scroll: Overhauled auto-scroll logic in ChatSession to distinguish between session switches, message count changes, and active streaming, ensuring smoother scrolling behavior. 🎨 UI/UX Enhancements Session Management: Pagination: Session list now uses lazy loading (“Load More”) instead of loading all sessions at once, improving startup speed. Quick Actions: Added Pin and Archive capabilities in session menu for better organization. Settings Panel Upgrade: Advanced Tab: Introduced a new “Advanced” tab for system maintenance tools and technical information. Budget UI: Improved budget settings interface with detailed cost multiplier explanations and a dedicated temporary budget input. System Info: Added visibility for Instance ID and Schema Version. 🛠️ Technical Changes Backend Architecture: Modularized routing and migrated chat sessions to a Durable Object-based implementation for better state consistency. Database Migration: Updated user profile schema to support usage aggregation (Schema v13). Shared Types: Updated UserProfile and ChatGenerationSettings types to support new tracking and configuration options.
Added a Demo Mode that allows guest access via a password-based login. Demo mode can be enabled via config. Guests can log in using a shared demo password. All demo sessions are isolated per device. Demo data is separated from production.
feat: optimize chat stream stability, security, and frontend rendering performance- Security: Added sensitive data redaction (masking password , secret , token , apiKey ) for trace logs in backend utility request/response body parsing. Stability: Enhanced Durable Object state recovery by persisting and restoring runtime payloads, ensuring the process queue resumes on restart, and adding a 100-second upstream API fetch timeout. Database: Bumped DB schema version to 15, adding applySchemaV14 and applySchemaV15 compatibility stubs. Performance: Refactored ChatSession message lists by extracting and memoizing UserMessageRow and AssistantMessageRow with React.memo , and extracted static Markdown plugins outside of render scopes to eliminate redundant parsing. State Management: Integrated Zustand useShallow selectors across App , ChatInputArea , and ChatSession to prevent unnecessary re-renders. Resilience: Upgraded stream reconnect/resume flow in the store to pass existing stream progress (content and reasoning), preventing flickering and duplicate content rendering on stream recovery.
Integrated Clerk for authentication and fixed various bugs :D
I am currently working on: New frontend UI theme (I named it Ethereal Light. It will be very, very beautiful!), and it will be released with a theme selector (if you don’t like it, you can switch to the current Classic theme). Whitelist: enabling you to have a private deployment! User resource usage limits: designed for the demo. Lazy frontend loading: makes the frontend start faster! Bug fixes: the current version has many bugs, including Clerk integration, multi-provider switching, etc. Locating the source of these bugs is very tiring. The next public version will take a long time to release and be pushed to the public repo. I will sync my progress via devlogs. If you have any suggestions, please tell me — they are very, very important to me!
Status Updated! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft Animations Component art polish Final UI review Whitelist User resource usage limits (for the demo) Lazy frontend loading
I discovered that adding a new feature caused an existing feature to break. To prevent similar regressions, I added smoke tests and a full end-to-end (E2E) test suite.
I refactored the usage calculation. This fixes an issue where the per-model cost wasn’t updated automatically, while also reducing database usage.
I couldn’t decide between a typewriter effect and a fade-in animation for AI responses, so I added both! You can now choose your preferred output animation in Settings.
Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [IN PROGRESS] Animations (almost done) Visual polish Final UI review Whitelist User resource usage limits (for the demo) Lazy frontend loading
Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [DONE] Animations Visual polish Final UI review Whitelist User resource usage limits (for the demo) Lazy frontend loading
Fixed a critical bug that could allow users to perform unauthorized operations.
Fixed a bunch of UI, animation, rendering, and performance issues across the Ethereal Light theme and the Settings Panel. Real-time reasoning topic extraction now handles unfinished Markdown chunks correctly, so active words no longer get cut off while responses are streaming. I also switched to stable React keys, which eliminates the annoying text flickering during streaming. The scrolling lock, content clipping, and hidden input issues in Ethereal Light have also been fixed by improving layer isolation and hardware acceleration. Finally, repeated clicks on the Save button in Settings are now automatically deduplicated, preventing duplicate requests when the same configuration is submitted multiple times within 5 seconds.
Unexpectedly discovered several critical bugs. Currently fixing them.
I’m currently fixing a number of bugs in the new Ethereal Light theme. At the same time, I had the codebase audited by AI, which identified several critical security issues. I’m actively working through both the theme bugs and the reported vulnerabilities, so the next public commit may be delayed a bit. Before anything is published, I’ll also perform a full manual security review to make sure the public release is free of known security issues.
Finally fixed the security vulnerabilities and the remaining bugs. Next, I’ll continue reviewing the codebase and finish the new theme.
Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [DONE] Animations [DONE] Visual polish Final UI review Whitelist User resource usage limits (for the demo) Lazy frontend loading
Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [DONE] Animations [DONE] Visual polish [IN PROGRESS] Final UI review - almost done Whitelist User resource usage limits (for the demo) Lazy frontend loading
Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [DONE] Animations [DONE] Visual polish [DONE] Final UI review - almost done Whitelist User resource usage limits (for the demo) Lazy frontend loading
Whitelist is almost finished! There’s only a little bit left to polish, and I should have it done within the next few days. New ship coming soon™
🌸 Devlog Update I’m currently exploring a better and more reasonable resource limitation system, hoping to make the DEMO experience smoother, friendlier, and more enjoyable for everyone! I’m also working on adding support for custom model providers, so you’ll be able to add your own providers and use this project as a complete long-term solution instead of just a DEMO. Of course, this also brings some new challenges qwq Since users will be able to add their own API Keys, I need to carefully design a secure system to make sure your keys stay safe and never get exposed. I’m planning a layered architecture with encryption, multiple authentication layers, and additional security protections. This project is becoming much more complicated than I originally expected… but I want to build it properly instead of rushing it 🥺✨ 🌱 About Storage S3-compatible storage is really expensive qwq, so for now I’ve added per-user file size limits and a 7-day automatic cleanup system. I know these limits are a little too strict, and I’m really sorry about that 🥲💦 I hope you can understand that I’m still a solo developer trying to keep the service sustainable. To improve this, I’m building my own tiered storage system — Minamo 🌊 After Minamo is finished, attachment storage limits will be increased significantly, and the 7-day automatic cleanup will be removed! 🎉 If you like this project, you can follow this project or follow Minamo to receive future updates and new features 💫 Thank you so much for supporting this project! 💙
The core development work is pretty much done! I’m now moving into the final polishing phase—doing security reviews, testing everything thoroughly, and fixing all the little rough edges I can find. Once that’s finished, I’ll deploy the new build as a public instance that everyone can use long-term. Can’t wait to share it with you all!
AronaChat v1.2.0 — A Bigger Update Than The Version Number Suggests Today, I completed AronaChat v1.2.0! Although this is only a minor version bump, it actually includes a lot of major improvements and new features. In this update, I added multi-provider support, custom models, the new Ethereal Light theme, and many other improvements. There are still many things to polish, but I’m working hard to turn AronaChat into something that we can genuinely use in our daily lives — not just a project. The current codebase has grown into a very complex system, so I’m planning to deploy the Public Demo version tomorrow. But this Public Demo is not just a temporary showcase. My goal is to make it a long-term usable product. You will be able to connect your own API providers and use AronaChat with your own services. To protect your privacy and security, the current version includes encrypted API key storage and multiple layers of security protection to keep your credentials as safe as possible. Due to storage and cost considerations, each user will have a fixed storage quota. If the limit is exceeded, attachments will be automatically removed using a FIFO (First In, First Out) rolling deletion system. For chat history, I’ll try my best to keep conversations stored for as long as possible while maintaining reasonable operating costs. Thank you for following the development of AronaChat! This is still just the beginning, and I hope it can become a tool that people truly enjoy using.
After fixing a number of issues, the Arona Chat Public Demo is finally ready! You can try it using the link below. https://aronachat.yearcakes.com/
Upcoming Changes: Add more personalization features, such as customizable tone and emoji usage. Refine the Ethereal Light theme.
I’m planning to further polish Ethereal Light theme and address the suggestions mentioned in the rating feedback. Thanks everyone for the support!
Confession time: I’m a high school STEM student. I spend far more time studying math, physics, chemistry, and biology than anything related to design. I have almost no artistic background, and I’m much more of a coder than a designer, so building Ethereal Light has been quite a journey. Half of the CSS for Ethereal Light only exists because I kept googling, “How do I make this look less ugly?” 😭 Somehow, after countless tiny tweaks, it’s finally starting to look like the theme I imagined. Anyway, I hope you love Arona Chat.
After using the Ethereal Light theme for a while, I realized that although the core chat interface was done, many secondary pages still looked like they belonged to a completely different application. So this update wasn’t about adding a flashy new feature, it was about finishing what Ethereal Light was always meant to be. This is one of those updates where most users probably won’t notice every individual change, but I hope everyone notices that Ethereal Light feels even more beautiful now. I also realized that good UI isn’t about making one page beautiful, it’s about making every page feel like it was designed together. Commit
Settings now save automatically as soon as you make changes, so there’s no more clicking Save everywhere. The user list also shows each user’s email when available (falling back to the Clerk ID). Improved auth by showing a recovery screen if initialization gets stuck for 12 seconds, and hardened SSRF protection against alternative IPv4 bypass tricks. I’ve already started designing the Ethereal Dark theme too, but since it’s unrelated to this commit I didn’t include it yet. Still probably another 8–10 hours to go before it’s ready. Commit
Hey guys! I’m currently working on a new theme (Ethereal Dark) for Arona Chat, and it will probably introduce a very large diff with many UI/CSS/component changes. I’m thinking about creating a dedicated feature branch (theme/ethereal-dark) for this work instead of directly committing everything to main. The idea is to keep the development process transparent and easier to review for future reviewers and users. After the theme is complete, I’ll merge it back into main. So I’d like to get your opinion: Do you prefer seeing the full development history through a feature branch? Or do you think keeping a cleaner main history with a larger commit is better? Thanks!
This is the last update for Arona Chat for the time being. In this update, I’ve added automatic image resizing, support for TXT and Markdown files, dynamic username injection in the greeting and system prompt, and the new Ethereal Dark theme. However, since my new semester started on August 31st, I won’t have as much time to work on Arona Chat or add new features. Anyway, I hope you all enjoy Arona Chat! Commit
I added a simple sharing function. I also added automatic picture attachment compression, which should save a lot of tokens. Commit
Ships:
What did you make? I built Arona Chat, a full-stack AI chat application powered by Cloudflare Workers, D1, R2, Durable Objects, and OpenRouter. It supports chat sessions, file attachments, usage tracking, budget management, authentication, and model selection, all wrapped in a Blue Archive-inspired interface. What was challenging? The most challenging part was designing the backend architecture around long-running AI responses and usage tracking. One lesson I learned the hard way is that inefficient SQLite access patterns can dramatically increase database costs. As the project grew, I had to rethink how usage statistics were stored and aggregated instead of recalculating everything repeatedly. Another challenge was handling very long SSE streams. For AI responses that may take a long time to complete, it is important that processing continues even if the client disconnects. This was my first time introducing Durable Objects into a production project, and they turned out to be a great fit for maintaining state and ensuring reliable streaming behavior. What are you proud of? I’m proud that this project pushed me beyond simple CRUD applications and into distributed system design. Integrating Durable Objects, building usage aggregation, and optimizing streaming performance taught me a lot about how real-world AI applications are built. I’m also genuinely impressed by Cloudflare R2. It was extremely easy to integrate, works reliably, and offers a very generous free tier, making it an excellent choice for student developers and hobby projects. How can people test it? Fork this repository. Update the wrangler.toml configuration for your own Cloudflare resources (do not commit any secrets). Deploy the frontend (frontend) to Cloudflare Pages and the backend (backend) to Cloudflare Workers. Configure the required Secrets in Cloudflare after deployment. Open the deployed site and log in using the password you configured. Create your first Passkey (highly recommended for a better login experience). Start chatting, upload files, try different models, and explore usage statistics and budget management features.
After a lot of work, AronaChat v1.2.0 is finally here! With this update, I’m continuing to transform AronaChat from a simple project into a real product that people can actually use. The Public Demo is now live! This is not just a temporary showcase — I want to build it into a long-term usable product. You can connect your own API providers and use AronaChat with your own models. Security and privacy are also a priority. API keys are stored with encryption and protected by multiple security measures to keep your credentials as safe as possible. Due to storage and cost considerations, each user currently has a limited storage quota. When the limit is reached, attachments will be automatically removed using a FIFO rolling deletion system. Chat history will be preserved as long as possible while keeping operating costs sustainable. Thank you everyone who has followed AronaChat’s journey! This is only the beginning, and I hope AronaChat can become a tool that people truly enjoy using.
This is the last ship for Arona Chat for the time being. Since my new semester started on August 31st, I won’t have as much time to work on Arona Chat or add new features. Anyway, I hope you all enjoy Arona Chat!
Some small improvements....
|
1792986647.1937532
|
1793073047.1937532
|
|
23875
|
Open Wall by @Liam303 | Stardance
|
Liam303
|
1
|
119.0
|
1204
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-11T11:26:33Z", "hours": 119.0, "multiplier": 11.57, "payout": 1204, "blessing": "neutral", "text": "This is Open Wall, my first every complete Python project, this app takes data from open f1 and displays it visual in a clean way so that any user can use it. The biggest struggle throughout this project what converting the data supplied by open f1 into functional number, this involves time conversion, coordinate setting and proper caching.", "repo": "https://github.com/Minos303/OpenWall", "demo": "https://github.com/Minos303/OpenWall/releases"}]...
|
[{"post_id": 26517, "ts": "202 [{"post_id": 26517, "ts": "2026-07-11T11:21:18Z", "hours": 2.0, "text": "Its officially done, Open Wall is finished. 120 hours have gone into the project and I’ve gone from a complete beginner in python to somewhat competent. I’ve lost a huge amount of sleep trying to get this working but now that’s it’s finished I feel so proud of the final design. A massive thanks to Star Dance for hosting this and giving me a reason to finally learn python, I’ve never given myself a good enough reason until now. My dream is to become a aero engineering and this project is a stepping stone in that journey, my next project will be alot more relaxed. Thanks to everyone that supported me along the way, and with that I need sleep so in case I don’t see ya, good afternoon, good evening, and good night!"}, {"post_id": 26461, "ts": "2026-07-11T08:37:04Z", "hours": 9.0, "text": "Sorry if it sounds like I’m in a rush but I was in the process of testing my code for bugs and I discovered a gasp bug. Basically for driver swaps in the middle of the year like Lawson and Red bull the code would download separate data for the team for two different instances, and since previously I would have it assume they were the same it would crash. This fix shouldn’t take long, just like 30 minutes of testing values, but I’ve confirmed everything else works, fixed some bugs surrounding the time library I use, and so I’m confident my next post will be one announcing the conclusion of this project. For dramatic effect my project will officially be released in Bum bum baa 2 Hours. (Sorry for the lack of a project image, you’ll just have to check it out for yourself ;)"}, {"post_id": 26234, "ts": "2026-07-10T22:00:31Z", "hours": 9.0, "text": "I’ve officially passed 100 hours on my project. Today is the final stretch, the final sprint to the finish line, I was able to get it all running normally on windows, my plan is to lock in the for the remaining time, hopefully my next post will be to tell you all of the projects completion, I found the problem from yesterday and was able to get the data to cache properly and now I’m literally just running the app over and over to find as many bugs and errors as possible, I’d rather get the errors myself then make the final user have them. Sorry if none of this makes sense or if it lacks any of my previous humor, I’m pretty tired and I know the second this project is over I will be sleeping as long as possible, but for now I’m just desperately trying to get the final project finished."}, {"post_id": 25835, "ts": "2026-07-10T09:48:26Z", "hours": 9.0, "text": "I jinxed myself. So earlier I might have got a bit cocky about my own error fixing ability, it all worked perfectly well on my Cachy os laptop, but on my windows pc it all breaks for absolutely no reason. What I’ve spent the past 9 hours doing is converting it to use a different library, while this is easier than it sounds it’s by no means a walk in the park, so far I’ve got the functions to run, but efficiency, ironically the thing I was bragging about before, it still a problem so it crashes after like 5 minutes due to the previously displayed data not being properly cached. My plan is to finish the entire project by the end of tomorrow, I’m so close and super exited to show the final product."}, {"post_id": 25581, "ts": "2026-07-09T22:28:38Z", "hours": 9.0, "text": "Mānawatia a Matariki! 🌟, I am in a very good mood. For the past 9 hours I’ve worked on this project everything has just worked, within an hour the error that plagued me yesterday just dissapeared, do I know why? No. Do I care? Not at all. If it works it works. Today was more of a continuation of yesterday, making everything feel faster, better, fixing everything that didn’t work yesterday, I made the graphs scroll properly, I made the ui look even better, my plan is to lock in today and tomorrow and finish it by the end of tomorrow, might pull an all nighter"}, {"post_id": 25225, "ts": "2026-07-09T10:53:21Z", "hours": 9.0, "text": "Error time: For the past 9 Hours I’ve spent trying to make everything more efficient and I’ve been plagued with error after error, and as of this moment the errors are still erroring. The first error I got was the “texture not found”, which is unusual when I directly gave it the image texture, now obviously the fix to this error was that a completely unrelated button was labeled wrong so… Also some random thing about the way it downloaded the values from online meant specific races would spit out values that led to random websites, so basically it would try to download the f1 values from a bands website that had f1 in its name. Also the error below which I’m in the process of fixing."}, {"post_id": 25031, "ts": "2026-07-08T23:32:20Z", "hours": 11.0, "text": "Day number, you know what I’ve lost track of the time. Hours go by so quickly yet it refuses to work, I refuse to give in the ai and let it fix it for me, what could I have done, did I displease the coding gods, how can I undo my, oh wait it works now. Seems I mistook a full stop for a comma. That definitely didn’t take me over 5 hours to fix, and of course the error messages point to a random line that has nothing to do with the problem. Today was mainly just cleaning up the ui, just unifying everything into a good looking color scheme, next I think will be a few new features."}, {"post_id": 24445, "ts": "2026-07-08T00:26:07Z", "hours": 14.0, "text": "The beta build is now live. Please feel free to try out the program, test it, give feedback, the more I know the better this becomes. Close to 60 hours have been spent so far and so I hope this project brings as much joy to you all as it did to me, more updates coming soon and the final build should be released by the end of the week, have fun. installation: To install this program go to the releases page, and download the version for your operating system (as of now there is no Mac OS installer and no plans to implement one), extract the .zip file, open the read me and follow the instruction inside, if there are any issues at all please record them and respond. Have Fun"}, {"post_id": 23899, "ts": "2026-07-07T03:16:17Z", "hours": 12.0, "text": "UI Update: Added a new ui for the user to make it easier to select everything. Remove practice qauli and sprint sessions, they may return but they kept bringing up errors, added a loading screen, it doesn’t look great but… Tomorrow the app will be officially downloadable and hopefully after some small ui and error fixes in two days it should be fully finished"}, {"post_id": 23391, "ts": "2026-07-06T10:03:40Z", "hours": 15.0, "text": "Map Update: -Fast forward, pause rewind ect all works now -Tidied everything up making it look nice + colors -Now shows driver information -Shows current race information Planned Features: -Complete ui access -Making it downloadable Sorry for the long wait, I’ve had school internals ect and most of my time coding has been minor error fixing and starting to implement a few of the features above, on holiday for the next week so the project should speed up."}, {"post_id": 18163, "ts": "2026-06-29T05:50:18Z", "hours": 4.0, "text": "So I know it’s been a couple of days since my last update but for the past 2 days everything refused to work, most of my fixing wasn’t even me writing code just adjusting browser and html settings. I finally caved in and switched to an app ui for stability because the website keeped crashing. and after about 2 hours of work everything just started working, I can start graphing the speed gear that sort of stuff and even draw the track map so in the future I can animate it, this project is coming along really well, I look forward to sharing my first usable build in the near future, if you have any ideas for this project please feel free to tell me"}, {"post_id": 15501, "ts": "2026-06-25T06:13:21Z", "hours": 3.0, "text": "It does stuff now, yay, you can actually get back the driver speed and their gear and stuff, tried to make website gui but the diffrent code laungages have decided to gang up on me to make this task as hard as possible so I’ll hopefully finish that tomorrow. So far the website looks very unintresting but so be it, thats later me’s problem."}, {"post_id": 14897, "ts": "2026-06-24T05:57:34Z", "hours": 3.0, "text": "FINALY got it running on linux, added terminal interface so it doesnt take 5 minutes each time to select a track, and you can immediately get into the f1 action. It can now go and actually get the data so its not just a blank page, kinda a necessary part. Then spent close to an hour trying to sort the data, apparently “Sakhir” has an h in it which messed up all my code, its inefficient, terribly written, but it works so… And then finally I added a user interface because not everyone’s a nerd like me who likes staring at console screens. MORE F1 GREATNESS COMING SOON"}, {"post_id": 14196, "ts": "2026-06-23T06:00:23Z", "hours": 1.0, "text": "Day 2, spent most of my time today going back and forth with the server trying to get it to respond with the session info, in the end it seems the problem was the wrongly named race course, e.g. Monte Carlo vs Monaco, so got that fixed and I can now get the proper token for the session so progress should speed up from here, the other two things I got done was setting up the error codes so I could quickly identify the issue and began setting up a better user input system for simplicity, but all good things come in time"}, {"post_id": 13966, "ts": "2026-06-22T22:31:50Z", "hours": 0.0, "text": "Setting up the very basic function"}]...
|
Title: Open Wall by @Liam303 | Stardance
Devlogs: Title: Open Wall by @Liam303 | Stardance
Devlogs:
Setting up the very basic function
Day 2, spent most of my time today going back and forth with the server trying to get it to respond with the session info, in the end it seems the problem was the wrongly named race course, e.g. Monte Carlo vs Monaco, so got that fixed and I can now get the proper token for the session so progress should speed up from here, the other two things I got done was setting up the error codes so I could quickly identify the issue and began setting up a better user input system for simplicity, but all good things come in time
FINALY got it running on linux, added terminal interface so it doesnt take 5 minutes each time to select a track, and you can immediately get into the f1 action. It can now go and actually get the data so its not just a blank page, kinda a necessary part. Then spent close to an hour trying to sort the data, apparently “Sakhir” has an h in it which messed up all my code, its inefficient, terribly written, but it works so… And then finally I added a user interface because not everyone’s a nerd like me who likes staring at console screens. MORE F1 GREATNESS COMING SOON
It does stuff now, yay, you can actually get back the driver speed and their gear and stuff, tried to make website gui but the diffrent code laungages have decided to gang up on me to make this task as hard as possible so I’ll hopefully finish that tomorrow. So far the website looks very unintresting but so be it, thats later me’s problem.
So I know it’s been a couple of days since my last update but for the past 2 days everything refused to work, most of my fixing wasn’t even me writing code just adjusting browser and html settings. I finally caved in and switched to an app ui for stability because the website keeped crashing. and after about 2 hours of work everything just started working, I can start graphing the speed gear that sort of stuff and even draw the track map so in the future I can animate it, this project is coming along really well, I look forward to sharing my first usable build in the near future, if you have any ideas for this project please feel free to tell me
Map Update: -Fast forward, pause rewind ect all works now -Tidied everything up making it look nice + colors -Now shows driver information -Shows current race information Planned Features: -Complete ui access -Making it downloadable Sorry for the long wait, I’ve had school internals ect and most of my time coding has been minor error fixing and starting to implement a few of the features above, on holiday for the next week so the project should speed up.
UI Update: Added a new ui for the user to make it easier to select everything. Remove practice qauli and sprint sessions, they may return but they kept bringing up errors, added a loading screen, it doesn’t look great but… Tomorrow the app will be officially downloadable and hopefully after some small ui and error fixes in two days it should be fully finished
The beta build is now live. Please feel free to try out the program, test it, give feedback, the more I know the better this becomes. Close to 60 hours have been spent so far and so I hope this project brings as much joy to you all as it did to me, more updates coming soon and the final build should be released by the end of the week, have fun. installation: To install this program go to the releases page, and download the version for your operating system (as of now there is no Mac OS installer and no plans to implement one), extract the .zip file, open the read me and follow the instruction inside, if there are any issues at all please record them and respond. Have Fun
Day number, you know what I’ve lost track of the time. Hours go by so quickly yet it refuses to work, I refuse to give in the ai and let it fix it for me, what could I have done, did I displease the coding gods, how can I undo my, oh wait it works now. Seems I mistook a full stop for a comma. That definitely didn’t take me over 5 hours to fix, and of course the error messages point to a random line that has nothing to do with the problem. Today was mainly just cleaning up the ui, just unifying everything into a good looking color scheme, next I think will be a few new features.
Error time: For the past 9 Hours I’ve spent trying to make everything more efficient and I’ve been plagued with error after error, and as of this moment the errors are still erroring. The first error I got was the “texture not found”, which is unusual when I directly gave it the image texture, now obviously the fix to this error was that a completely unrelated button was labeled wrong so… Also some random thing about the way it downloaded the values from online meant specific races would spit out values that led to random websites, so basically it would try to download the f1 values from a bands website that had f1 in its name. Also the error below which I’m in the process of fixing.
Mānawatia a Matariki! 🌟, I am in a very good mood. For the past 9 hours I’ve worked on this project everything has just worked, within an hour the error that plagued me yesterday just dissapeared, do I know why? No. Do I care? Not at all. If it works it works. Today was more of a continuation of yesterday, making everything feel faster, better, fixing everything that didn’t work yesterday, I made the graphs scroll properly, I made the ui look even better, my plan is to lock in today and tomorrow and finish it by the end of tomorrow, might pull an all nighter
I jinxed myself. So earlier I might have got a bit cocky about my own error fixing ability, it all worked perfectly well on my Cachy os laptop, but on my windows pc it all breaks for absolutely no reason. What I’ve spent the past 9 hours doing is converting it to use a different library, while this is easier than it sounds it’s by no means a walk in the park, so far I’ve got the functions to run, but efficiency, ironically the thing I was bragging about before, it still a problem so it crashes after like 5 minutes due to the previously displayed data not being properly cached. My plan is to finish the entire project by the end of tomorrow, I’m so close and super exited to show the final product.
I’ve officially passed 100 hours on my project. Today is the final stretch, the final sprint to the finish line, I was able to get it all running normally on windows, my plan is to lock in the for the remaining time, hopefully my next post will be to tell you all of the projects completion, I found the problem from yesterday and was able to get the data to cache properly and now I’m literally just running the app over and over to find as many bugs and errors as possible, I’d rather get the errors myself then make the final user have them. Sorry if none of this makes sense or if it lacks any of my previous humor, I’m pretty tired and I know the second this project is over I will be sleeping as long as possible, but for now I’m just desperately trying to get the final project finished.
Sorry if it sounds like I’m in a rush but I was in the process of testing my code for bugs and I discovered a gasp bug. Basically for driver swaps in the middle of the year like Lawson and Red bull the code would download separate data for the team for two different instances, and since previously I would have it assume they were the same it would crash. This fix shouldn’t take long, just like 30 minutes of testing values, but I’ve confirmed everything else works, fixed some bugs surrounding the time library I use, and so I’m confident my next post will be one announcing the conclusion of this project. For dramatic effect my project will officially be released in Bum bum baa 2 Hours. (Sorry for the lack of a project image, you’ll just have to check it out for yourself ;)
Its officially done, Open Wall is finished. 120 hours have gone into the project and I’ve gone from a complete beginner in python to somewhat competent. I’ve lost a huge amount of sleep trying to get this working but now that’s it’s finished I feel so proud of the final design. A massive thanks to Star Dance for hosting this and giving me a reason to finally learn python, I’ve never given myself a good enough reason until now. My dream is to become a aero engineering and this project is a stepping stone in that journey, my next project will be alot more relaxed. Thanks to everyone that supported me along the way, and with that I need sleep so in case I don’t see ya, good afternoon, good evening, and good night!
Ships:
This is Open Wall, my first every complete Python project, this app takes data from open f1 and displays it visual in a clean way so that any user can use it. The biggest struggle throughout this project what converting the data supplied by open f1 into functional number, this involves time conversion, coordinate setting and proper caching....
|
1792882040.134691
|
1793746040.134691
|
|
6590
|
Flower by @IvyMycelia | Stardance
|
IvyMycelia
|
2
|
104.2
|
1193
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-07T02:27:02Z", "hours": 27.0, "multiplier": 19.07, "payout": 503, "blessing": "neutral", "text": "The compiler is written in Flower itself and currently targets C, so this release was mostly geared towards making the type system have actual Flower semantics instead of a thin little blanket over whatever the backend happened to be doing. The big additions in v1.4 were: transparent type aliases real null nullable types as ?T == T | null semantic unions like int | string explicit narrowing with is explicit extraction with as That support now works across locals, parameters, return types, struct fields, and stable field-expression chains. The work had to touch parser logic, typecheck, narrowing, lowering, codegen, bootstrap, and then all the weird regressions those changes politely dragged into the room. It was.. a process for sure What I’m most proud of is that v1.4 pushed Flower toward a clearer identity that wasn’t defined by C as much anymore. This release also brought the docs back in line with the compiler, which was LONGGGGG overdue. If you want to test it, the main things to look at are the Better Types examples and the self-hosting flow. The compiler should bootstrap cleanly, the test suite should pass, and the examples now cover aliases, nullable values, semantic unions, inference, and struct/field narrowing behavior. For those who will be testing it, DO NOTE that I develop exclusively on my MacBook which is a UNIX system! I do not have the ability to properly develop and provide releases for Linux-specificalities or non-POSIX systems. I’m extremely sorry for this, but alternatively watch the provided video to see Flower in action :) If you’re not able to test it, watch this short (crappy) video instead: https://youtube.com/shorts/DyPtIru6cjY?feature=share", "repo": "https://github.com/IvyMycelia/flower", "demo": "https://github.com/IvyMycelia/flower/releases"}, {"ship_num": 2, "ts": "2026-06-18T16:00:30Z", "hours": 38.0, "multiplier": 18.19, "payout": 690, "blessing": "neutral", "text": "Flower is a self-hosted programming language for writing simple, explicit systems code without the abstraction bloat and OOP-heavy direction a lot of modern languages have. The compiler is written in Flower itself, currently targets C, and follows a straightforward pipeline: lexing, parsing, module loading, typechecking, and code generation. Over the past few months, Flower grew from a small lexer/parser/codegen experiment in C into a way bigger language project than I couldv’e imagined. This wasn’t my first attempt at a language, but it has been my favorite! I implemented compiler-enforced module semantics, stronger type-aware codegen, real boolean support, real string support, and a small standard library foundation. Strings now have equality, .length, indexing, and explicit casts to and from @char , while modules support exported prop declarations, aliases as namespaces, and private-by-default top-level declarations. The hardest part was bootstrap stability. I ran into idempotency failures, parser edge cases, compiler corruption scares, and plenty of my own bad logic. A lot of the challenge was getting new features to work not just once, but consistently enough for the compiler to rebuild itself cleanly. One bootstrap it succeeds, and then the next I’m scrambling to figure out why the new binary executable has a corrupted parser despite just working (Still haven’t fixed that yet! It.. was really confusing and I’ve got no clue why it happened lol). I’m proud that I kept pushing through that and ended up with something much more fun to use than where I started — I mean, I don’t even have to write that much C anymore!! If people want to test Flower, the important thing to know is that it is self-hosted and still experimental, but it does work. The repo includes a bootstrap path, a test suite, and example programs covering types, control flow, memory, imports, strings, and bools. The current release is focused on making the core language feel real and usable before moving on to a larger standard library and a future non-C backend, so don’t be surprised if a C file is shoved in your face!", "repo": "https://github.com/IvyMycelia/flower", "demo": "https://github.com/IvyMycelia/flower/releases"}]...
|
[{"post_id": 79537, "ts": "202 [{"post_id": 79537, "ts": "2026-10-14T14:44:10Z", "hours": 10.3042, "text": "Integers, Integers, Integers Hello!! Been a while :) Lately I have been working on v1.6. I call it the “Usefullness” update — rhymes with Grug — because it adds a ton of long awaited features and various convenience implementations Flower DESPERATELY needs. For example, currently the progress has to do with v1.6.1, or Fixed-Width Integers . When it comes to systems programming and in-general efficiency, having various integer sizes is important as it provides an additional layer of manual control over memory and sizes. I know I would have to add them eventualy, so why not put them at the start of the Usefulness update?? I’m sure they’ll come in handy later on. What Actually Changed? Well, for starters, there’s now fixed-width integers (yay)! They’re built in types, so you declare them as you would with any other atom / primitive: type Byte = u8 type Choice = Byte | u16 type OptionalByte = ?Byte struct Packet { pair: Byte[2], size: Choice, owner: OptionalByte } A whole bunch of commits and integer-specific changes regarding indices, arity, unions, nullables, etc etc etc have been made, and they all won’t fit here so instead, take a look at the current branch ! What’s In Store? Plenty more features, you can assure yourself! There’s maybe 6 or 7 — I swear — or so commits left for this specific addition, and after that a lot more features laid out in the roadmap for 1.6! As always, thanks for sticking around and watching the fiasco that is this project become more and more estranged with every hour. Love y’all!! Ivy <3"}, {"post_id": 75225, "ts": "2026-09-29T15:04:00Z", "hours": 9.9331, "text": "Integer Types, Parser Fixes, and Segfaults! Phew — this one was biiiiiggg. Flower is pretty much just a glorified C transpiler, which is NOT what I want for it! In order to move on, the data has to be handled explicitly by the FloC. So essentially, I implemented i8 , u8 , i16 , u16 , i32 , u32 , i64 , and u64 . For now, int canonically refers to an i32 value. A New Era? With these new literals, the old hoist-sized representation had to go. The decimal source text is preserved, meaning values such as 18446744073709551615 remain after parsing without causing any overflow. Types are picked up from declarations, assignments, function arguments, return values, field writes, array-element writes, * breath in * and binary expressions! Oof, that was a mouthful. That, of course, resulted in proper errors for things like: 256 assigned to u8 −1 assigned to an unsigned type values beyond u64 unconstrained literals outside the default i32 range I Hate Memory During printing, every width is handled. Integer conditions retain existing zero / nonzero behavior, and literal types print their values rather than a character. Halfway through, I ran into sudden segfaults and memory leaks. I was taken aback, because I didn’t even change anything parser related yet. Turns out, I forgot an assignment in a declaration, which apparently the parser wasn’t able to handle (whoops!). Anyways, I fixed it by propagating errors through the compilation process, so the compiler doesn’t try to typecheck or code gen if the parser reports back errors, and instead will print them out. And that’s it! Not that’s it, but that’s all I’m going to explain for now. More specifics available on the GitHub, of course. Speaking of GitHub thank you so much to S1monr3dst0ne07 on GitHub for fixing some memory leaks in the previous version of Flower — I forgot to prune allocations before returning from a function :p Love y’all!! <3 P.S.: So glad I gave up on documentation, I was genuinely dreading workong on the project and that’s why I’ve been ianctive for a long time :c"}, {"post_id": 53525, "ts": "2026-08-24T03:18:35Z", "hours": 9.7706, "text": "Hey, it’s been a while! I’ve been finding it difficult to stay motivated for this project, especially with how the new payout system works and just my in-general inability to keep commitment despite having a lot of passion. That said, I am going back to working on this diligently, and I think to start I’m going to cut down on the documentation by making perhaps one or two changes, and then going right back to the compiler work. Documentation writing has not been the most fun for me, especially with how long it takes and how it’s so difficult to not only write language reference that works, but also keeping the same whimsy Flower should have. Thank you to everyone who’s been following this journey, and I can’t wait to see y’all later!!! With Love, - Ivy <3"}, {"post_id": 26743, "ts": "2026-07-11T18:25:46Z", "hours": 9.1964, "text": "Devlog: v1.5.1 – v1.5.5 Following all of the changes Flower has undergone, I felt it was time for some much-needed documentation. On paper this was supposed to be fairly quick, simple, and not require much brain power. Unfortunately for me I got a bit too over-zealous, and included things I thought should work, but in reality hadn’t. For example, in a lot of the code snippets I’d have something like: for i in range 0..10: print(i) end Printing non-string values was not yet supported in Flower. To fix this, I took a small detour back to v1.4 and implemented support for it — mostly in a single codegen case: if ast.data._print.value_type.base == TOKEN_FLOAT or ast.data._print.value_type.base == TOKEN_DOUBLE: fprintf(out, \"printf(\\\"%%f\\\", \") gen_expr(ast.data._print.value, out, src) fprintf(out, \");\\n\") end Afterwards I added more smoke-tests in examples/io/print.flo . Every few runs, however, I’d get a segfault. This was especially odd because it wasn’t simply an error but rather a silent memory bug. Eventually I found out where it was originating — thanks, ASan! Turns out after the new type system changes, I had forgotten to initialize some values to null / 0 in for loop handlers and a few other places. I just added typeInfo.data = null / 0 where applicable and it fixed the issue! What is v1.5, and why is this devlog so long? To answer the latter first.. I lowkey just forgot to post a devlog for the first two docs I made. That’s it. For the former question, v1.5 is supposed to be explicitly a documentation pass. First thing I worked on was structure. I cleaned up the docs layout, moved things toward a more consistent lowercase docs/ tree — I had been trying for so long to do that and I just finally got it to work — and wrote down the documentation process itself so new pages aren’t just floating about. The point was to try and make the docs feel like a book instead of a folder full of unrelated notes. I wrote and checked the language pages for types, functions, and control flow by reading the compiler itself, not by trusting my (poor) memory. That meant checking parser rules, typecheck behavior, codegen boundaries, and example files before writing anything solid. Types especially needed this, given how Flower now has enough real type machinery that the docs can quickly go from being coherent to completely incorrect: nullable sugar, semantic unions, explicit casts after narrowing, alias behavior, current member limits, and the difference between what the language wants to become and what the compiler supports currently. Functions and control flow had a similar issue. I had to document prop , return rules, direct call forms, logical conditions, range-based for , and the rough edges like break and continue not yet being enforced cleanly as loop-only. That kind of thing is small until someone learns the language from the docs and hits the edge head-first (been there, done that). What Now? I’m just going to keep writing docs. Maybe do one devlog for every new doc, or a batch of docs, who knows! I certainly don’t :p"}, {"post_id": 23761, "ts": "2026-07-06T21:49:25Z", "hours": 0.6008, "text": "Devlog: Syncing Flower’s Docs Back to Reality Just a doc cleanup lol. No code change or compiler updates. Probably did more than needed for now but oh well! The mismatch was REALLY bad. The old docs preserve old assumptions, and someone reading them could walk away with a version of Flower that no longer really exists (or, in some cases, doesn’t exist yet or never ever existed)! What changed I updated the docs that had drifted the most from reality (relatable): README.md now reflects the current type-system shape ROADMAP.md treats v1.4 as accomplished the v1.4.0 milestone doc now includes more of the outcome, not just the original plan contributor docs no longer have stale semantics structure.md is more accurate to what Flower currently is, and what still needs a fuller rewrite later Yea, that’s it."}, {"post_id": 23618, "ts": "2026-07-06T18:01:45Z", "hours": 1.6556, "text": "Devlog: Finishing Nullable Field Narrowing At this point, Flower could already narrow semantic unions through field access in the is / as case, and nullable field checks were supposed to be the obvious follow-through: if maybe_box.value != null: label: string = maybe_box.value as string end Instead, I had forgotten to remove a LOT of stale code, and thus part of it was still behaving like only plain local variables could ever be narrowed. There was also a second, smaller mismatch hiding, where null in type position was not lining up with the compiler’s actual internal null representation. ?string and string | null weren’t leading to a congruent output and at times were wobblier than they should be. So the fix was mostly cleanup, but the meaningful kind: make null in type syntax lower the same way the compiler expects remove the stale var-only branches in nullable narrowing let stable field paths like maybe_box.value and holder.box.value narrow properly The funny part is that this felt bigger initially than it actually was once fixed. Nothing fundamentally new had to be invented, I just had to stop the old code from interfering with the newer code, which once I figured out how to do so it was quite quick. I spent an embarrassingly long time figuring it out…"}, {"post_id": 22284, "ts": "2026-07-04T17:48:44Z", "hours": 1.8161, "text": "Devlog: Letting Union Narrowing Follow Field Access Before v1.4.13 , union narrowing only really worked when the thing being narrowed had a variable name due to almost every similarity check relying on name_start and name_length . This was dumb, because semantic unions already knew how to test tags and extract members. Codegen was not the issue, but rather the annoying part was that the typechecker could remember this: if value is int: n: int = value as int end but not this: if box.value is int: n: int = box.value as int end So I still had to do a little temp-variable ritual: tmp: Value = box.value if tmp is int: n: int = tmp as int end Which was gross. Not necessarily catastrophic, just gross and annoying. I wanted needed convenience What changed The compiler was remembering narrowings by variable name, not by expression shape, so box.value looked obvious in source (to me, at least), but to the typechecker it was basically some random expression and not something it could reliably recognize again later. A variable name already had a stable identity, whereas field access chain did not. So the change was to let narrowable expressions represent more than just AST_VAR_REF . For now, that only means stable dot-access chains. The typechecker can record a narrowing for an expression like: box.value and then recognize the same expression later when a cast shows up. So this works directly now: if box.value is int: n: int = box.value as int end Same for the other union members, like string . The detour My first example accidentally wandered into a different feature: if maybe_box.value != null: That exposed a real nullable-field-guard gap, but that is not what this was supposed to be about. Very rude of the test case to have ambition hmph >:( Where this leaves it Semantic union narrowing now persists past field access — at least for stable dot-access chains — and the temp-local is no longer needed. Butttt now I gotta work on nullable-field-guards, ugh (hehe)"}, {"post_id": 21926, "ts": "2026-07-04T03:34:19Z", "hours": 0.4592, "text": "Devlog: Direct Semantic Union Parameters Now instead of having to do this workaround: type Value = int | string func accept(value: Value): bool You can just pass semantic unions directly: func accept(value: int | string): bool That was it. All I had to do was remove a stale type_error clause in register_params and allow binding variables. Then I updated the two relevant accept functions in /examples."}, {"post_id": 21751, "ts": "2026-07-03T20:51:30Z", "hours": 4.9086, "text": "Devlog: Making ?T Actually Mean T | null Before v1.4.10 , ?T was treated as its own nullable system and not really integrated with the rest of the semantic unions. This was unideal, because it created a separation of logic which was cumbersome to maintain. The idea was to make the following be the default: ?int == int | null ?string == string | null ?@int == @int | null Prior to the refactor, nullable types were still mostly pointer-oriented. That worked when ?T basically meant “maybe this pointer is null,” but it did not really fit anymore once semantic unions became actual runtime values. If Flower has T | null , then ?T should use that instead of being its own special thing. This is a more pragmatic choice, as it keeps the compiler easier to manage and update later on. What changed Typecheck now lowers ?T into the same semantic-union machinery used by normal unions. That means nullable values now go through the same general path as union values: null checks use union-aware narrowing narrowed nullable values can be extracted with as codegen emits tagged union storage assignments pack into the right union member So this now works as an actual nullable flow: maybe: ?@int = raw if maybe == null: return false end real: @int = maybe as @int The annoying part is that Flower has to track two things at once: the type the programmer is allowed to see after narrowing, and the actual union shape that remains underneath it. After the guard, maybe behaves like an @int . But codegen still has to remember it came from @int | null , because apparently the compiler cannot simply “vibe” its way through storage layout. Tragic! The bugs that annoyed the heck out of me Most of the work was not surface syntax. The syntax was just standing nearby looking innocent. The actual bugs were in the places where Flower knew “this is non-null now,” but then forgot how to lower, such as: narrowed nullable values falling back to raw C casts like (int*)(maybe) false branches of == null / != null narrowing to the wrong side (this was my fault lol) null getting packed into the wrong union member That last one was the rude one. For ?@int , generated C could end up doing something like: . tag = 1 , . m0 = NULL instead of packing into the actual null member. So the value looked almost right, but the tag/member pairing was wrong. Then later null checks would fail, because the compiler had technically put null somewhere. Just not the correct somewhere. Very helpful. The fix was separating two questions I had accidentally merged: is this type compatible with this union? which exact union member should this value occupy? Those look related, but they are not the same question. Flower was using the first answer for the second problem, and then acting surprised when everything became soup. Where this leaves Better Types ?T now lowers through the same path as T | null , which means null checks, narrowing, extraction, and storage all line up with the semantic union model. This should make later work cleaner, such as nullable inference, nicer union ergonomics, maybe pattern-like narrowing eventually. Not easy. I am not saying easy near a compiler. That is how they hear you. You do not want them to hear you .."}, {"post_id": 19626, "ts": "2026-07-01T00:18:08Z", "hours": 0.4472, "text": "Devlog: Teaching Flower to Understand Guard Clauses gave Flower branch-local inference. Last update, I added support for branch-local inference, so the compiler could understand things like: if maybe == null: return false else: real: @int = maybe end and: if value is int: return false else: s: string = value as string end That was an improvement, but it still meant narrowing stopped at the end of the branch. That meant stuff like returninging in some conditions still did not really work as naturally as it should: if maybe == null: return false end real: @int = maybe or: if value is string: return false end n: int = value as int In v1.4.9 I fixed that. What changed Now narrowing propagates past very obvious guard clauses. If one branch definitely returns and the other falls through, the compiler now carries the interpretation forward after the if . This means that the compiler can now understand: after if x == null: return ... , x is non-null after if x is string: return ... , a two-member semantic union can narrow to its remaining member I kept this intentionally conservative for now. The compiler is not doing full control-flow analysis yet. It is only recognizing the simplest and most explicit early-exit shape. How it works The main addition was a small semantic check for “does this branch definitely return?” Right now that means: direct return if where both branches definitely return Once the compiler knows one side exits and the other survives, it applies the branch’s narrowing to the following statements. Yea.. that’s it lol."}, {"post_id": 19014, "ts": "2026-06-30T05:39:45Z", "hours": 1.2028, "text": "Devlog: Adding Obvious Branch-Local Inference to Flower Before this, narrowing mostly worked in the obvious “true branch” cases: if maybe != null: real: @int = maybe end and: if value is string: s: string = value as string end But the else branch was still kind of standing there empty-headed, even when the meaning was extremely obvious. Like, if this happens: if maybe == null: return false else: real: @int = maybe end then inside the else , maybe is clearly not null. So now it doesn’t!! What changed Flower now does branch-local narrowing in else for small, explicit cases. That means these now work: if maybe == null: return false else: real: @int = maybe end and: if value is int: return false else: s: string = value as string end It is only applying inference when the condition says something directly and the opposite branch has one obvious meaning. Nullable narrowing For nullable pointer-like values, Flower now understands both sides of simple null checks: if x != null narrows x to non-null in the if body if x == null narrows x to non-null in the else body the opposite side can narrow to null when that is the only meaning left Semantic union narrowing The same idea applies to semantic unions, but a bit more ‘held back.’ Essentially, if Flower sees: if value is int: then the if branch narrows to int , like before. Now, if the union only has one other possible member, the else branch can narrow too. So for: int | string the else after if value is int can be treated as string . This is not full control-flow wizardry, since it doesn’t reason across deep boolean chains, early-returns, or giant branches yet. It is deliberately small and local, because I do not want Flower “helping” so much that I need a detective board to figure out what type something is."}, {"post_id": 18478, "ts": "2026-06-29T17:18:49Z", "hours": 0.8039, "text": "Devlog: Letting Semantic Unions Work In Functions After getting semantic unions working in local declarations, the next problem was fairly obvious (and in my roadmap hehe). This did not work before: func make_value(): int | string return 7 end func accept_value(value: int | string): bool return value is int end Which was annoying, because int | string was already a real union type at this point. Flower could use it in locals, it could pack assigned values, it could check variants. But if I returned 7 from a function declared as int | string , or passed 7 into a parameter expecting int | string , the compiler did not know how to carry that union-lowering information across the boundary. This has been one of the easier changes I’ve made in a long while. It compiled properly first try (if you ignore a tiny misspell I made which I fixed really quickly), and there were no prior hidden bugs that surfaced. This.. is too suspicious. What changed The compiler now carries semantic union info through: function parameters function returns imported alias calls If a function expects: int | string and I call: accept_value(7) typecheck records that 7 needs to be packed as the int member of that union. Same for returns: func make_value(): int | string return 7 end That matters because codegen cannot guess later due to the separation of responsibilities I’ve laid out. By the time Flower is emitting C, it needs to know which tag to set and which member to write. Lowering it properly Codegen already knew how to pack union values for declarations and assignments. The missing part was doing the same thing for call arguments and return statements. So now a value can be packed into a tagged union when it is: stored locally passed into a function returned from a function Alias calls got handled too, so things like: remote.accept(11) remote.make_string() do not become their own weird little cursed island. Why this mattered Without this, semantic unions only worked as long as I never organized my code. They worked in local tests, but not in helper functions, imported providers, or normal inputs and outputs. Now union values can actually move around the program instead of being trapped in the one scope where they were declared — and for me, forgotten! Very exciting, the union can leave the house. They grow up so fast ⁎⁍̴̛ ₃ ⁍̴̛⁎"}, {"post_id": 18151, "ts": "2026-06-29T05:17:03Z", "hours": 3.3186, "text": "Devlog: Semantic Unions Become Actual Values (Part I) In v1.4.6 , I made semantic unions actual runtime values instead of just parsed/typechecked shapes. Before this, Flower could understand: type Value = int | string as a type. It could point at it and say, “yes, that is a union,” but that was mostly theoretical. The goal was to make this work-work for realsies: type Value = int | string value: Value = 7 if value is int: n: int = value as int end value = \"Ivy\" if value is string: s: string = value as string end That meant Flower needed more than TypeInfo.is_union = true . It needed a full path from syntax, to type proof, to lowered storage, to runtime extraction. Otherwise unions would just be fancy typechecker thingy-ma-bobbies, which is not very useful when the backend still emits C. What changed Instead of treating a union as a vague “one of these types, probably,” Flower now lowers it into a tagged structure. Conceptually, this: type Value = int | string becomes something like: struct Value { int tag ; union { int as_int ; flower_string as_string ; } data ; }; Not the final sacred form forever, but that is the shape of it: a tag saying which variant is active, plus storage for the possible members. Since Flower emits C right now, the lowering is C-shaped. I am not fully sure how I want this to look in ASM yet, but I do know it would be way more technical, and uglier. This required a few things to play nicely with one another: if value is int creates a union proof the guarded branch stores narrowing information value as int is only allowed after proof assignments pack values into the right tagged member explicit casts extract the right member from storage Otherwise the compiler is just writing checks its own backend cannot cash. The part that makes it ACTUALLY semantic For pointer narrowing, if value is T mostly refines how the compiler treats an existing value. For semantic unions, the check also becomes a runtime tag test. So this: if value is int: means: check the active tag of value , then inside this branch, treat it as the int variant. Then this becomes valid: n: int = value as int because the branch already proved the active variant. Without that proof, value as int should not be casually allowed. Flower is supposed to be explicit, not psychic, and I am not confident enough yet to implement a proper intuitive implicit checker without summoning something cursed. Assignment and extraction This: value: Value = 7 now packs 7 into the int member and sets the tag to the int variant. Then this: value = \"Ivy\" does the same thing, but for the string member. So a semantic union is not just some bytes, but rather a tagged runtime object where Flower knows which member is active. Then explicit casts like: value as string can lower into extracting the string member, but only when the typechecker has accepted that the operation is safe in that control-flow path. Why this checkpoint matters Flower can now store variant values, prove which variant is active, and require explicit extraction instead of relying on random magic I threw together. The flower has grown another concerning little organ."}, {"post_id": 16395, "ts": "2026-06-26T17:55:41Z", "hours": 2.0825, "text": "Devlog: is Checks v1.4.5 added is checks, mostly so code like this can work: if maybe_ptr is @int: real_ptr: @int = maybe_ptr end The idea is (fairly) simple: if the condition proves maybe_ptr is an @int , the inside of the branch should be allowed to treat it like one. Flower did not know how to do that before. It knew what a variable was declared as, but it did not really learn anything from control flow yet. Now it can, at least for the pointer/nullable-ish cases I care about first. This touched the parser, AST, typechecker, narrowing logic, and codegen. So, naturally, the “small feature” went everywhere. I’d actually consider this one of the bigger refactors so far, mostly because it added a new TypeAtom structure. Before this, types were still a bit too attached to the places they appeared, and all fell under the TypeInfo . That worked for simpler declarations, but is checks needed type syntax to have something the compiler could pass around to use for comparisons, validations, and narrowing. The parser had to recognize the new expression shape. The AST had to store the left side and the tested type. The typechecker had to make sure the test was allowed and not totally garbage. Then the narrowing logic had to say, “inside this branch, this variable has the proven type of x and therefore we won’t flag you for being an idiot.” That last part was where the bug goblin lived. I’m calling them a goblin because they were sneaky (and I also think it’s quite a funny and cute name). For a while, Flower had applied narrowing from the if body instead of the if condition, which meant the compiler saw this: if maybe_ptr is @int: real_ptr: @int = maybe_ptr end and somehow still failed on the assignment inside the branch. Very helpful. Thank you, compiler. EVen though it’s obviously 100% my fault, I made the compiler, but oh well!! Once I changed the narrowing step to inspect the actual condition expression, it started behaving like it should. The typechecker could see maybe_ptr is @int , attach that narrowed type to the branch scope, and allow maybe_ptr to be used as @int inside the guarded block. For now this explicitness is how I want it. There may come a time in the near future where I decide some implicity is ok, but we’ll see ;) is checks are the first real step towards control-flow-aware typing in Flower. Not full union support yet, but definitely the beginning of that road soon to come. Right now it mostly helps with nullable and pointer-like cases. Later, the same idea can support richer unions, better narrowing, and more type-driven control flow without making the programmer manually restate everything the compiler should already know. Also, it bootstrapped cleanly twice — which.. is obviously the bare minimum, but still!!"}, {"post_id": 15458, "ts": "2026-06-25T04:05:50Z", "hours": 2.4619, "text": "v1.4.4 Devlog: Giving Flower Real Semantic Union Types I made it so that semantic unions are now in Flower’s parser and type system — but not yet its codegen. The goal was to support types like: value: int | string next: @Node | null type Result = int | string What’s new The parser now understands | inside type positions and builds semantic union type information instead of relying on those old plain aliases or backend-shaped hacks. On the typecheck side, unions are now carried through normal type copying and alias resolution. That means named aliases like: type MaybeName = string | null make sense after resolution, instead of collapsing into nonsense. The typechecker also now accepts union-compatible usage in the places that matter for a foundation: variable initialization assignment parameter passing return checking alias resolution So if a value matches one union member, it is accepted. This is sorta implicit behavior, but I think it gets a pass due to its somewhat explicit nature? What it does not do yet This version was intentionally strict about using unions as values. You cannot yet directly: index a semantic union access a field on a semantic union use arithmetic / comparison operators on one print one directly Instead, Flower now requires an explicit cast before using a union value that way. That may sound harsh, but it is the right restriction.. for now. There is not any narrowing yet, so pretending unions were fully usable would just make the language lie and spit out 2,000 errors. Where this leaves v1.4 Flower now has: transparent type aliases null as a real type-system concept pointer-first nullable types semantic union type representation The next step is the part that will make unions actually usable rather than merely legal: narrowing with is better explicit extraction with as eventually making ?T truly become T | null instead of remaining pointer-first for now No fun screenshot this time :p just frontend work for now… Ivy, signing off <3"}, {"post_id": 14511, "ts": "2026-06-23T17:31:39Z", "hours": 1.8206, "text": "Devlog: Adding Pointer-First Nullable Types to Flower I worked on giving Flower its first real nullable type surface without being overambitious and pretending the compiler is ready for full optional-everything semantics yet. The new syntax now works like this: ptr: ?@int = null text: ?@char = null That means there is now an explicit way to say “this pointer-like value may be absent,” instead of relying entirely on raw pointer habits from C (If you couldn’t tell by now, I despise C). What changed The main work was split across lexer, parser, and typecheck. I added: ? as a type marker in type positions is_nullable tracking in TypeInfo type rules for nullable pointer/reference values explicit compatibility for: assigning null into nullable pointer-like types comparing nullable values against null casting between @T and ?@T I also kept the scope intentionally narrow: this implementation is pointer-first nullable support , not full nullable scalars. So ?@int makes sense right now, but ?int is still deferred until I make a better semantic union / optional representation for plain values. Why this matters It would have been easy to overreach here and claim “nullable types are done,” but that would have been a big phat lie. Pointer-like nullability lowers naturally enough with the current backend and current compiler model. Scalar nullability, however, does not. Once you let int or bool become nullable, you need a more real representation for “has value / no value,” and that belongs in the later union work, not here. Result explicit absence compiler-owned semantics better future unions stronger type meaning without hidden magic The next real step after this is not more patching around null — I consider that done for now — but instead giving Flower the deeper machinery needed for nullable non-pointer values and semantic unions later in v1.4 so it doesn’t come back to bite me in my butt."}, {"post_id": 13935, "ts": "2026-06-22T21:20:58Z", "hours": 0.355, "text": "Devlog: Formalizing Flower’s Null Foundation Flower already had some of the pieces for null , but they were a bit scattered. The goal here was to make it explicit, consistent, and safe before moving on to nullable syntax like ?T or full union-based nullability later in v1.4 . Another shorter devlog, but still important and distinct enough for me to think “Hmm devlog time? Yes, devlog time!” What changed The main work was in typechecking. I added to the compiler’s idea of what null is, how it is represented internally, and what kinds of values are actually allowed to accept it. Rather than letting null-related behavior stay implicit across a few checks, null now follows a clearer rule set: null has one centralized internal type representation pointer-like values can explicitly accept null null comparisons and assignments now go through the same semantic path Why this matters This isn’t all that important on its own, but it matters a lot for where Flower is going next. If null is not defined well, then later features like: ?T better unions smarter narrowing more expressive type flow all become more error-prone (or so I assume given my track record) than I want need them to be. Validation I also expanded the example coverage so null : it now has dedicated behavior checks around assignment, passing values around, and comparison behavior."}, {"post_id": 13918, "ts": "2026-06-22T20:30:15Z", "hours": 1.0089, "text": "Devlog: Fixing Flower’s Compiler Process So It Stops Fighting the Host This wasn’t really about language design at all buttttt it is much more embarrassing , AND more important: Flower’s compiler process itself was too fragile. The immediate issue showed up on Linux, specifically NixOS (thanks shipwrights <3). The build flow was assuming too much: a previously existing bin/Flower could be reused safely bash would exist at the expected path clang would always be available the checked-in compiler binary would be runnable on whatever machine the repo landed on That worked well enough on my machine until it didn’t. On NixOS — and by extension probably any other machine without the prexisting binaries I had — it broke: make targets were inconsistent, the shell script failed on interpreter assumptions, and the compiler binary itself could be the wrong format for the host. What changed The fix was to separate “the compiler source exists” from “the current compiler binary is usable on this machine.” The build process now starts by compiling a fresh host-native bootstrap compiler from bin/Flower.c , instead of trusting whatever happens to already exist in bin/Flower . That means the flow is now: bin/Flower.c -> host-native bootstrap compiler -> new Flower compiler -> self-check instead of: maybe existing bin/Flower -> hopefully works -> maybe bootstrap Ok well that’s kinda a lie; it still relies on hopes and dreams to bootstrap sometimes. BUT it’s MUCH safer! And now everyone gets to experience crippling bootstrap anxiety, instead of being met with a failure before the actual compiler gets to.. well, do its thign! I also cleaned up the surrounding tooling: switched the bootstrap script to portable sh restored a clearer build / bootstrap / rebuild / test / clean structure made the compiler use CC and CFLAGS from the environment instead of hardcoding clang What this actually improves Flower is still not universally cross-platform yet. The compiler driver still has POSIX-shaped assumptions in places, and the emitted C can still depend on host APIs depending on what the program uses. I’m not yet at the point of wanting to make it completely universal, especially given how I’m only one person and with v2.0 coming up soon it’d — in my humblest of opinions — be a waste of time. I am honestly grateful for people reviewing my code and otherwise viewing it catching onto details I have overlooked. My goal is to not make a ‘just-barely working on my machine’ project; I enjoy sharing development with others, and it hurts knowing people can’t appreciate code, whether it be mine or others’, due to something as simple as hard-coded sh flags."}, {"post_id": 13822, "ts": "2026-06-22T17:23:16Z", "hours": 3.7814, "text": "Devlog: Making Flower’s Type Aliases Transparent This version was simple to develop on paper (and even in practice it wasn’t too bad, only around 4 or so hours!): type Count = int type Total = Count type Name = string and then have those aliases behave like the real type everywhere: n: Count = 12 total: Total = identity(n) name: Name = \"Ivy\" if name != \"Ivy\": return false end if name.length != 3: return false end That meant aliases could not just be parsed and stored, but rather had to be transparent to the compiler’s semantic checks. What changed I added type alias declarations to the AST, parser, and type environment, then added the ability to resolve aliases in typechecking before comparing types. That included: return type checks variable initializers function call arguments binary comparisons string-specific comparison logic struct field access The important rule here is that aliases are semantic, not codegen-facing. Count should behave as int , Name should behave as string , and chained aliases like Total -> Count -> int should collapse correctly. In the future, especially post v2.0 , this could change and custom types might become real — but for now, they’re just aliases. The bug that exploded bootstrap The first real failure was not in aliases themselves, but in function argument checking. Inside check_call_args(...) , the compiler was resolving the argument expression into expected_type instead of arg_type . That overwrote the parameter type, left the actual argument type uninitialized, and caused the second bootstrap stage to explode into over a thousand misleading errors. This was not a pre-existing issue, it was instead from human error (my error) during the initial implementation where I accidentally put the wrong variable. Once that was fixed, the remaining failures were much more helpful than the bright flash of red and “Typecheck failed with 1224 error(s)” message! Where this leaves v1.4 With the first step toward “better types” done, aliases are no longer just syntax. That gives v1.4 a solid base for whatever comes next in the type system without having to fake around raw names. During this whole dev session, I did discover that a whole lot more of the source code was left using legacy work-arounds: int instead of bool , name_start; name_length and @char instead of string . In all fairness, some of these aren’t exactly the easiest to refactor. However, I will probably hold off on refactoring the codebase until either right before v2.0 , or right after. Just know it’s on my radar ;)"}, {"post_id": 11351, "ts": "2026-06-18T15:46:42Z", "hours": 1.4231, "text": "Devlog: Cleaning Up v1.3 For Release After many hours of work, bool and `string finally became real, and it was time to cleanup the mess I left behind from the version’s development. Mainly the only thing worked on was some cleanup: roadmap now reflects actual v1.3 features and implementations updated README and contribution documents to match the current compiler pipeline cleaned up string examples so they have the full intended v1.3 style instead of some leftover testing usage pushed the compiler’s version to 1.3.0 updated help / usage text so it matches the new output-path and auto-run behavior Prior to this, if I had just merged and shipped, the release wouldv’e been messy: README, Contributing, example files, and guidance commands were all mixing older details which made it confusing — even for me — when trying to explore the language and what it has to offer. For a bootstrapped compiler especially, making sure everything is cleaned up and polished is something that should not be ignored. I’m definitely guilty of overlooking this, but I’ve outlayed a whole plan for v1.3 unlike past versions, and part of it was setting up a proper versioning system and polishing its release as it goes. This format will be adopted in future versions, since it’s just way cleaner and nicer to look at. Future work At this point, v1.3 is done and has implemented, at minimum, a concrete foundation for post-v2 bools and strings. Next will likely be more subtle improvements, and features that are currently reliant explicitly on C rather than Flower-hosted code. In order for v2.0 , Flower will have to be effectively independent from C if it wants to emit machine code. Currently I am planning on adding features such as Type Aliases and maybe a stdlib prior to that, but anything can change!! Thanks for being here for all of v1.3 <3"}, {"post_id": 11116, "ts": "2026-06-18T05:51:28Z", "hours": 1.7269, "text": "Devlog: Giving Flower an Internal cstr Foundation Even after Flower got a real string type, the compiler itself was still leaning directly on C-style string helpers for its own internal work. That meant a lot of Flower source was still semantically depending on libc behavior: !strncmp(...) strcmp(...) strlen(...) strcpy(...) strncpy(...) strdup(...) strrchr(...) That is not where I want the language to stay. What changed I added a new internal module: import \"src/stdlib/cstr.flo\" as cstr and gave it compiler-facing helpers like: prop func len(s: @char): int prop func eq(a: @char, b: @char): bool prop func eq_n(a: @char, b: @char, n: int): bool prop func copy(dst: @char, src: @char): @char prop func copy_n(dst: @char, src: @char, n: int): @char prop func dup(src: @char): @char prop func find_last(src: @char, ch: char): @char This helper module is essentially the precursor to a future strings.flo library that can be distributed. But for now, it uses a basic API layer purely meant for in-house usage. Then I migrated compiler internals over to that module across: src/parser.flo src/module.flo src/lexer.flo src/typecheck.flo src/codegen.flo src/globals.flo src/main.flo So instead of using C-string behavior directly everywhere, the compiler now goes through Flower-owned helpers first. The Compiler Strikes Back This was one of those changes that sounds mechanical until it absolutely is not. A big trap was that old code often relied on C comparison functions returning 0 on equality, so patterns looked like this: not strncmp(...) But cstr.eq_n(...) returns an actual bool , which means blindly rewriting those calls gives inverted logic. So this: if ps.alias_lengths[i] == tok.length and not cstr.eq_n(...): was completely wrong. It had to become: if ps.alias_lengths[i] == tok.length and cstr.eq_n(...): That bug showed up in alias parsing first, which made it especially cursed, because it caused normal namespace-style calls like cstr.eq(...) to stop parsing correctly and crash the bootstrap path in confusing ways. I spent way longer than I wish to admit on trying to figure out why it wasn’t playing nice. But, once I figured it out, it was a really quick fix (I literally just cmd + f ’d not cstr and replaced it with cstr lol). Are we done yet..? This does not mean Flower is free from the C backend yet. It does mean something important, though: compiler logic is starting to depend on Flower-defined helper semantics instead of scattered raw libc calls. That is a much better stage for the future backend story, because when C eventually stops being the primary lowering target, the compiler will already have more of its own vocabulary. In other words, this was less about “remove C” and more about “stop letting C define the language’s internal habits.” Nah just kidding, I really wanted that bloated “builtin_c_call” stuff gone. Unfortunately I only managed to skim it, but that’s closer than before! Result After fixing the migration mistakes and the alias/parser fallout, the compiler bootstrapped successfully again. Flower now has an internal cstr layer, and compiler string handling is a little more its own."}, {"post_id": 11068, "ts": "2026-06-18T03:16:30Z", "hours": 1.2611, "text": "Devlog: Fixing Flower’s Output Driver and Starting the String Stdlib This checkpoint was really two different kinds of progress that ended up helping each other a lot. The first part was not glamorous, but it was necessary: Flower’s compile driver was tripping over its own default output naming. This was a known issue that I had been putting off, but for some reason it really annoyed me this time so I decided enough and to fix it. If no explicit output path was provided, the compiler would generate output.c , then strip the .c and try to emit a binary named output . That worked fine right up until the repo itself already had an output/ directory. At that point, linking failed because the compiler was trying to create a file where a directory already existed. Worse — because it annoyed me more — the driver logic was also mixing up “the generated program exited non-zero” with “compilation failed.” That became especially annoying during bootstrap, because the generated compiler binary would run without CLI arguments, print its own usage error, and then cause bootstrap to report failure even though codegen and C compilation had both succeeded. So I finally got off my butt and cleaned that up. Driver Cleanup The default output path now goes to: output/out.c which naturally produces: output/out as the binary. That avoids the old output filename collision. I also separated compile success from auto-run behavior: explicit output path: compile only default output path: compile, then auto-run if appropriate That means bootstrap no longer “fails” just because the compiled compiler exits non-zero with missing arguments, and demo/test files can still run automatically when that is actually useful. This sounds like a small driver fix, but honestly it removed a lot of noise from string work — and more — immediately. String Stdlib Beginnings Once that output weirdness was under control, I could finish doing what I just started and actually wanted: making string behavior live in Flower instead of endlessly leaning on ad hoc C calls (Call back to last devlog, absolute ball knowledge!!). So I added the first real reusable helpers in src/stdlib/string.flo : is_empty(s) starts_with(s, prefix) ends_with(s, suffix) find_char(s, ch) These are intentionally simple. They mostly exist to prove that the current string support is now strong enough for normal library code to be written on top of it. Not incredibly useful, at least at the level the compiler needs, but at least I could translate some AP Comp Sci A into Flower hehe A string feature does not really feel “real” until I can build helpers with the language itself instead of only teaching the compiler more special cases. The day I remove the builtin C handlers is the day I’m at peace… Validation To exercise that new library surface, I changed string_pass.flo to now act as a small pass file for the experimental library. Its job is not to be impressive. Its job is to answer a more important question: can I import string helpers, call them from normal Flower code, and get expected results through the full compile pipeline? At this point, yes. Where this leaves things This checkpoint did not remove all C string dependencies from the compiler. In fact, it removed essentially none! That is still a separate step, one that may even be in v1.3.7 ;) But it did establish two important things: Flower’s output/driver behavior is now much less annoying. We can start growing a real string library in Flower itself. That is a good place to be, because the next string work can build outward from a stable driver and an actual library surface instead of piling more special behavior into the compiler."}, {"post_id": 11013, "ts": "2026-06-18T01:18:51Z", "hours": 1.0825, "text": "Devlog: Adding String Indexing to Flower This one was fairly quick, and was about making one very normal-looking thing actually work: name: string = \"Ivy\" as string first: char = name[0] That sounds small, but once string became a real Flower type, indexing could no longer piggyback on the old “arrays and pointers only” behavior. The compiler needed to understand that string[index] is its own case. What changed I taught the typechecker to treat string subscripts as char . That means: string[index] now resolves to char the index expression must be an integer string indexing is readonly for now So this is valid: first: char = name[0] but this is not: name[0] = 'X' I wanted reads first, writes later. That keeps the rules simple while the string representation is still compiler-owned. I’m not sure how writes would work with a C backend, due to how ‘strings’ are allocated. Perhaps a feature for post-v2.0? Lowering it to C Since Flower strings currently lower to a struct with .data and .length , codegen needed a special path for string subscripts. Normal arrays and pointers still lower like: arr [ index ] but strings now lower like: name . data [ index ] That keeps the generated C valid without changing how regular subscripts work elsewhere in the language. So something conceptually like: This checkpoint also forced one strict-but-correct rule that required me to update a WHOLE SINGLE LINE (hehe): arg[i] = tolower(arg[i] as char) to arg[i] = tolower(arg[i] as char) as char Because tolower(...) is effectively treated as returning int , assigning it back into a char subscript needs an explicit cast. I kept that strictness on purpose. I do not want Flower silently narrowing values just because C would let it. Validation I expanded the string example coverage to check: string indexing returns the expected chars string[index] works alongside string <-> @char casts bootstrap still succeeds repeated bootstrap succeeds tests still pass Which, after all the recent bootstrap chaos, was very nice to see. Where this leaves v1.3 Now we can: store strings compare strings print strings inspect length index into them as char This should make it much easier to replace the builtin C functions with a Flower library in the near-near future."}, {"post_id": 10953, "ts": "2026-06-17T23:26:21Z", "hours": 3.3353, "text": "Devlog: Finishing Flower’s String Interop Bridge The last round got string into Flower as a real type. This round was about making that foundation actually work lol. The big problem was that once string became real, plain string literals started living in an in-between state: Flower wanted them to mean “Flower string,” but the compiler’s own source still has plenty of places that really mean “raw C string,” like: RED: @char = \"\\033[0;31m\" if not strcmp(arg, \"help\") or not strcmp(arg, \"h\"): ... end Those cases worked before only because everything was basically pretending string literals were already @char . Once that stopped being true, bootstrap started throwing a fit (my spoiled child). What changed The main fix was to make string literal lowering contextual instead of all-or-nothing. If a literal is being used as a real Flower string , it stays a string . If a literal is being used in a C interop position, it gets lowered as a C string instead. That meant tightening a few compiler rules so this kind of thing works cleanly again: name: string = \"Ivy\" as string raw: @char = name as @char if strcmp(raw, \"Ivy\") == 0: print(name) end I also fixed top-level declarations so globals like: RED: @char = \"\\033[0;31m\" no longer generate nonsense like: char * RED = (( flower_string ){ ... }); which, unsurprisingly, C does not appreciate. The subtle compiler bug The nastiest issue wasn’t even the globals. It was that builtin C calls like strcmp , strncmp , printf , snprintf , and friends are not real Flower functions. That meant the typechecker could hit one of them inside a larger expression, fail early, and stop walking the rest of the tree. So something like: if not strcmp(arg, \"help\") or not strcmp(arg, \"h\"): could partially resolve one side, then leave the other side unprocessed. Very cool. Very stable. Definitely what I wanted. The fix was to add a temporary builtin C-call bridge so the compiler can recognize these calls well enough to keep type resolution and literal lowering consistent during bootstrap. I’m not happy with this fix by any means, but due to the limitations of emitting C, it was the only solution I found that made sense at the time. Tests and examples Once that stopped exploding, I finally wired string testing into the normal types suite instead of leaving it commented out and pretending I’d “get back to it later.” The string tests now cover: string <-> @char casts string equality / inequality .length empty strings printing strings literal use in current interop cases And the full test suite passed with string included as a first-class part of Types on its first try . Now that’s what I like to see :D What this means This does not mean Flower’s long-term answer is “hardcode libc into the compiler forever.” It means Flower now has a temporary interop bridge that keeps self-hosting stable while string is worked on. The actual language semantics stay in Flower; the backend-specific weirdness is just being tolerated for now so progress does not stall. In the near, I’ll probably replace all of the necessary C libs with minimal Flower-equivalents. Where this leaves v1.3 At this point, the string foundation feels much sturdier. Not “done forever,” not backend-agnostic, and definitely not free of cursed bootstrap energy — but it works. The next work is no longer rescue work. It is actual forward work: string operations, stdlib basics, and eventually replacing this temporary C bridge with something cleaner when Flower grows past the C backend."}, {"post_id": 9012, "ts": "2026-06-15T01:03:21Z", "hours": 2.7858, "text": "Devlog: Building Flower’s String Type Foundation The core goal was to make this work in a meaningful, compiler-owned way: name: string = \"Ivy\" as string raw: @char = name as @char other: string = raw as string if name == other: print(\"same\\n\") end print(name.length) That meant Flower needed more than a typedef in generated C. It needed actual type rules, actual lowering rules, and I needed enough hairs on my head to not be bald after the amount of scares that occurred. What changed The first step was giving string real compiler support without going too far too fast. I added support for: explicit casts between string and @char string equality / inequality string.length runtime helpers in generated C for: flower_string_from_cstr(...) flower_string_eq(...) flower_print_string(...) That gave Flower a usable string foundation while still keeping literals conservative for self-hosting. Right now, string literals are not fully “native string values everywhere” yet; the compiler still uses explicit casts like \"Ivy\" as string as the safe bridge. The reason for this “safe bridge” is because when I got too ambitious, the compiler would break since everywhere @char was used with a string literal it’d break due to no implicity being allowed. I had to comment out the following new changes and keep the legacy support so it’d compile: else if ast.kind == AST_STRING_LIT: // fprintf(out, \"flowe_string_from_cst(\") // fprintf(out, \"%.*s\", ast.data._string.str_length, src + ast.data._string.str_start) // fprintf(out, \")\") // LEGACY CODE HERE and else if expr.kind == AST_STRING_LIT: // set_plain_type(out, TOKEN_STRING) // LEGACY CODE HERE return 1 The part that broke The most annoying issue was not string equality or .length . It was print . Originally, non-string print(...) was basically lowered like this: printf ( expr ); That only works when expr is already a C format string. So something like: print(name.length) generated invalid C: printf ( name . length ); The fix was to make print(...) type-aware. Typecheck now records the operand type, and codegen lowers print differently for string , @char , char , floats/doubles, and integer-like values. That sounds small, but it matters a lot: once string became real, print could no longer get away with pretending every printable value was already a C string. An Unsolved Bootstrap Mystery Somehow Flower’s bootstrap process was breaking, and it will probably break again. Despite the bootstrap requiring it to compile itself, somehow afterwords the binary could become corrupted. l-2: ~/Documents/GitHub/FloC % make bootstrap === Building new version === Compiled ./bin/Flower_new.c → ./bin/Flower_new === Testing new compiler === Compiled ./bin/Flower_test.c → ./bin/Flower_test Verified bootstrap build complete l-2: ~/Documents/GitHub/FloC % make bootstrap === Building new version === Luckily, I always make sure to keep a backup Flower bin stored under /bin/Flower_backup so I used that to compile the new binary and then it worked. Where this leaves v1.3 What still remains is the bigger ergonomic question: how fully native string literals should behave, and how to migrate the compiler’s own source to that world without setting bootstrap on fire again. I’m not sure yet how I want to approach this question, or what the goals for it should even be, but I guess I’ll have to find out soon enough! That is the next fight. But at least now, it is a fight on solid ground."}, {"post_id": 8529, "ts": "2026-06-14T05:55:45Z", "hours": 3.8414, "text": "Devlog: Making Bool Real Without Breaking Bootstrap The original goal, asper usual, was straightforward: before moving on to string , Flower needed bool to actually mean something semantically. Up to this point, boolean-ish behavior mostly worked by accident. Comparisons, conditions, returns, and general expression checking were still loose enough that the compiler could get away with treating a lot of things as “close enough,” especially since the C backend ultimately lowers bool to int anyway. That was not going to hold once v1.3 started leaning on richer typing. So this was about drawing a clean line between Flower semantics and C lowering. The Goal In Flower: bool should be its own real type comparisons and logical operators should produce bool arithmetic should not quietly accept bool implicit conversion should stay narrow and predictable explicit casting should remain available through as In C: bool can still lower to int That distinction ended up being the easy part. What Changed The typechecker now treats bool as a proper language type instead of an int-shaped placeholder. Condition checks were tightened so if , while , and not use condition-compatible rules. Arithmetic paths now reject boolean operands, and return / initializer / argument checking now runs through more explicit conversion rules. I also kept implicit widening one-directional: int -> float -> double while leaving narrowing conversions as explicit casts. The actual implementation of booleans and their typing, enforcement, and semantics was a breeze. It’s what came after that got me. What Actually Broke As usual, bootstrap had opinions. The stricter type work exposed older weaknesses that were easy to miss before (This is my coping): function argument checks needed array-to-pointer decay alias and module call lookup paths were too narrow unresolved calls could prevent nested expressions from being fully type-resolved that, in turn, broke some dot-access lowering and caused bad . vs -> emission in generated C So part of this checkpoint turned into compiler stabilization work rather than just bool semantics due to my crappy ‘temporary’ logic, error handling — or lack thereof, and impeccable ability to miss very important details. I’m an amazing programmer, if you couldn’t tell :p Result Flower now has a much firmer semantic base for bool, and the compiler is back to bootstrapping cleanly with those rules in place. That matters because this was really the floor for the next part of v1.3: string . And.. maybe I’ll fix the bootstrap process so it doesn’t blow up in my face again. Oh yea, forgot to mention that. The bootstrapper bootstrapped itself into this very broken parser state that refused to go away so I had to stash my changes, checkout the prior merge (detached), and then recompile manually and fix the parser. Toodles!"}, {"post_id": 6924, "ts": "2026-06-11T16:28:33Z", "hours": 1.3047, "text": "Devlog: Fixing the Typechecker After Bool Enforcement Getting bool into Flower exposed a reallyyyy annoying problem: the typechecker had a couple of tiny logic mistakes (I’m so good at this) which caused the bootstrap to blow up in my face and I ahd no idea why. At first the errors looked unrelated. The compiler started reporting huge numbers of mismatches across main.flo , lexer.flo , module.flo , typecheck.flo , and codegen.flo . I was so confused as to why out of nowhere 903 lines were reporting various typechecking errors when they shouldn’t be. As it turns out, types_match() was the culprit. The function had been inverted in a few places: Mismatched base types and pointer depths were returning success, while normal matching primitive types were falling through to failure. That made the new compiler think ordinary initializers, assignments, comparisons, and returns were all invalid. Once that was fixed, the remaining failures turned out to be a second real compiler bug: pointer arithmetic over arrays was decaying in the wrong direction. Expressions like: mods.modules + j env.structs + env.struct_count arr + 1 should produce pointer types. Instead, the typechecker was reducing pointer depth when arrays decayed, which made perfectly normal indexed access and table walking look type-invalid. So this dev session ended up doing three important things: fixed types_match(...) so actual matches succeed and actual mismatches fail preserved decimal compatibility for float / double matching fixed array-to-pointer decay in pointer arithmetic so compiler internals and examples resolve correctly again What made this especially annoying is that the symptoms looked much larger than the cause. A couple of bad returns in the typechecker created hundreds of downstream errors, and because Flower is self-hosting, that meant the compiler started rejecting its own source. After correcting those core issues, both bootstrap and the example test suite started working again. That is the real value of issues like this: not just “fewer errors,” but restoring (MY) trust in the compiler and its ability to enforce Flower’s rules and report issues. With that stable again, the path forward is much clearer: continue bool work from a solid base, then move on to the remaining numeric and string improvements without the whole compiler collapsing under one bad predicate."}, {"post_id": 6207, "ts": "2026-06-10T12:52:51Z", "hours": 4.0928, "text": "Devlog: Making Flower’s Bool Support Real Enough to Survive Bootstrap The goal sounded small at first: add proper boolean support, while still lowering booleans to integers in C. In practice, this turned into an overarching type-system problem (typical!). Flower had reached a point where bool could not just be a naming trick over 1 and 0 . The compiler itself needed to understand when an expression was semantically boolean, when it was integer, and when older bootstrap-era shortcuts were no longer valid. A lot of those shortcuts had survived because the backend lowers bool to int anyway. But self-hosting exposed a major issue: source-level typing and C lowering are not the same thing. Things like these started breaking: val: int = parser_peek(ps).kind == TOKEN_TRUE and helper predicates that returned comparison expressions from int -typed functions. So the checkpoint became: keep C lowering simple, but make Flower’s typechecker treat booleans as a real source-level type. The main changes were: parser -> typecheck -> codegen true / false now parse into AST_BOOL_LIT bool literals are still emitted as 0 / 1 in C logical and comparison expressions now resolve to bool arithmetic rejects bool operands if , while , and not now validate condition-compatible expressions variable initializers, assignments, and returns now check types more strictly One of the more annoying bugs turned out not to be “about bools” at all. When code like this failed inside the compiler: defined_structs[i].length emitted_imports[i].path the real problem was that for i in 0..count was never registering i in the type environment, so indexed access looked broken when really the loop variable itself had no known type. Once loop indices were typed as int , those field-access failures disappeared (yay!!). The result is a much better place to build from: bool is now semantically distinct in Flower it still lowers cleanly to integer values in generated C bootstrap works again the compiler is stricter without collapsing under its own source That makes the next step much easier: real string support, instead of trying to build strings on top of a type system that still half-thinks everything is an int ."}, {"post_id": 5369, "ts": "2026-06-09T03:37:15Z", "hours": 5.4503, "text": "Devlog: Giving Flower Real Module Support v1.2.x was the point where Flower’s impors had to stop being “you can import stuff.. and there’s a fake layer of security” to a prop er (get it?) module system. Before this work, imports and aliases mostly behaved like naming conveniences. You could write: import \"math.flo\" as math math.add(1, 2) but the compiler was still too loose about what that really meant . Alias names were in emitted C symbol names, top-level declarations were not private, and prop existed more as syntax than as a real feature. That was fine for early bootstrap work, but it was not strong enough for the next stage of the language. So the main goal of v1.2.x became: make imported aliases act like real namespaces make prop define the public interface of a module make top-level declarations private by default lay groundwork for field visibility rules like hidden and readonly Module Semantics Instead of Alias Tricks One of the biggest changes was separating Flower semantics from C lowering. Previously, imported aliases were drifting toward becoming part of emitted symbol identity. A local alias should just be a source-level name bound to a module, not the backend symbol. So now each module has its own lowered symbol prefix, and alias lookup happens semantically during compilation. That means: import \"math.flo\" as math math.add(1, 2) is resolved as “look up exported add in module math.flo ,” not “invent a C symbol from the local alias text as math_add() .” That change also forced a cleanup of emitted names so they stopped leaking absolute filesystem paths. Generated symbols now use project-relative module prefixes instead of machine-specific paths. prop Became Real Another major part of this was making prop actually do something. Instead of treating it as a thin wrapper around only functions, the compiler now recognizes prop as a real top-level export marker. That means the module’s public interface is defined by what it explicitly exports, while non- prop declarations remain internal. This moved Flower closer to the model I wanted all along: explicit modules, explicit public APIs, no heavy object system (OOP), no fake privacy delegated to the C backend. Dot Access, Pointers, and the Annoying Middle Part This work also exposed a weakness in the compiler’s dot-access resolution. Flower source always uses . , while the C backend must decide whether a given access becomes . or -> . That mostly worked already, but nested pointer-heavy field chains exposed cases where the type tracker was not propagating enough information, which caused bad fallback behavior during self-hosting. So before field visibility could be trusted, I had to harden nested dot-access resolution. Not fun, but necessary. As it turns out, I was missing several AST kinds which caused the logic to fall through. Very tedious work, but it was well-worth it in the end! Field Flags Groundwork With module ownership and access resolution in better shape, I added the first field visibility modifiers: hidden readonly frozen Originally I debated having these as bitwise operations, but I decided it’d be best to stay within the current update’s scope, so sometime in the future I’ll refactor. Right now, hidden and readonly are the meaningful additions: hidden blocks external field access readonly blocks external assignment frozen is groundwork for later. It is parsed, stored, and carried through the compiler, but full assignment-once enforcement is still deferred. Unsure how I’ll go about it, but that’s an issue for future me :p"}, {"post_id": 4525, "ts": "2026-06-07T21:22:43Z", "hours": 3.6428, "text": "Devlog: Replacing Flower’s Old Function Syntax with func name(...): type This feature started out as what I thought would be a straightforward syntax cleanup. Flower’s old function syntax looked like this: int add(a: int, b: int): return a + b end and exported functions looked like this: prop int test(): return 1 end It worked, technically, but it had started to annoy me more. The biggest issue was that function declarations did not visually match the direction Flower was already heading in, and instead felt much more C-like than I wanted. prop func create(...): Person func main(): int This style says “this is a function” up front, gives a clean place for modifiers like prop , and keeps the return type attached to the signature rather than awkwardly leading it. The goal was simple: func name(...): type instead of: type name(...): Simple in theory. not so much when the compiler is written in the language being refactored. The Problem Flower’s parser assumes top-level function definitions start with a type. Old parser logic was built around that: int main(): means: parse a type, an identifier, params, and a body That assumption was scattered through a few different places: normal function definitions prop function declarations forward declarations examples and docs the compiler’s own source Now, in retrospect, this was actually one of the easier changes. It didn’t take a whole lot of planning nor brain power, and I was able to change it pretty quickly. Luckily for me, I’ve built codegen to rely purely on ast values rather than shaping. The New Shape The new syntax is: func add(a: int, b: int): int return a + b end and exported functions now look like: prop func test(): int return 1 end This is nicer because: func makes declarations immediately recognizable prop composes more cleanly with func return types now live where people expect them to future syntax has more room to grow without feeling backwards It also feels more in line with Flower’s broader goals: explicit, readable, and not complex. The Refactor Previously, parse_func_def looked for a return type first: type name(...): Now it expects: func name(...): type So the order changed to: expect func parse function name parse parameter list expect : parse return type parse body until end That part was conceptually easy. The more annoying part was updating all the places that assumed if it isn’t a var decl and it looks like a func, it’s a func. That fallback had to go (Good riddance!). Instead, top-level parsing needed to become more explicit: prop func → exported function func → normal function forward func → forward declaration The old one worked, but it relied on vague “anything else is probably a function” rules. The Bootstrap Mistake At one point, I made a bootstrap build so I could use a Flower_new binary to compile the refactored compiler. Unfortunately, I had made a mistake in parse_forward : advancing before peek checks. Feel free to check out the bootstrapper to see why this was an issue ;) This meant my “new compiler to compile the new compiler” was built from a broken parser. The workaround was cursed, but it worked : check out the commit before the refactor fix the bug compile a new binary switch to the refactor branch use the binary to compile the new version Since the compiled binary was ignored by Git, this was actually fairly simple. Not the most elegant bootstrap story, but it got the compiler to, well, compile."}, {"post_id": 3962, "ts": "2026-06-07T03:08:31Z", "hours": 8.2967, "text": "Devlog: Making Flower’s Type Tracking “Enough” for Stdlib / String Work The original motivation was simple and — supposedly — quick; I wanted to move on to v1.1.1 , “stdlib basics,” especially string utilities. But Flower’s current compiler did not really know what types expressions had. It mostly had pointer_depth on declarations, which was enough to generate * in C types and sometimes guess whether field access should become . or -> . That worked for very simple cases: p: @Vector2 = new Vector2 p.x = 5 But it broke down for nested access: outer.inner.value outer.inner_ptr.value The compiler could see the syntax chain, but it did not know whether inner was a value field or pointer field. Since Flower source only uses . , the C backend needs to decide whether each hop becomes . or -> . That meant stdlib work was blocked. If I want something like: if strings.equal(string_a, string_b): print(\"same\\n\") end then Flower needs to understand that string_a.length , string_a.data , etc. are real typed fields, not just random syntax to dump into C. Originally I thought I could just simply create a Symbol Table to get that to work. Unfortunately, that plan soon failed as it introduced a mariad of issues relating to the import system. At the time, this frustrated me because I knew the import system sucked, but I didn’t want to fix it until a later version. Eventually, I settled on a specific plan which did actually end up changing how imports are handled.. kinda. The Plan The design I landed on was to add a typecheck/type-tracking stage between parsing and codegen: lexer -> parser -> typecheck -> codegen The parser should stay mostly syntax-only. It builds AST nodes like “dot access,” so I didn’t really change it. The typecheck pass now collects declarations into a TypeEnv : struct TypeEnv { structs: StructInfo[1024], struct_count: int, vars: VarInfo[8192], var_count: int, funcs: FuncInfo[8192], func_count: int, error_count: int } Then it walks expressions and annotates dot access nodes with an access kind: ACCESS_UNKNOWN: int = 0 ACCESS_DOT: int = 1 ACCESS_ARROW: int = 2 So codegen no longer has to fully guess. It can do: if ast.data._dot_access.access_kind == ACCESS_ARROW: fprintf(out, \"->%.*s\", ...) else if ast.data._dot_access.access_kind == ACCESS_DOT: fprintf(out, \".%.*s\", ...) else: // fallback end That fallback is important because Flower is self-hosted-ish right now. The compiler is written in Flower, and the compiler’s own source code is full of field access. If the new typechecker is too strict too early, it breaks the compiler while trying to compile the compiler. Very elegant. Very cursed. Just how I like it ;) Import-Aware Type Tracking At first, typechecking only saw the main file, so I added a module loading pass. Instead of codegen discovering and parsing imports late, the compiler now loads modules earlier: load main module load imports recursively collect declarations from all modules typecheck all modules codegen all modules That required a new module structure: struct Module { path: @char, src: @char, tokens: @TokenStream, ast: @AST } struct ModuleSet { modules: Module[128], count: int } Unfortunately, it didn’t go as smoothly as I wanted. Near the end when I was sure everything would work, I ran into an Idempotency failure due to the new handling of system imports. I.. just manually passed it :p"}]...
|
Title: Flower by @IvyMycelia | Stardance
Devlogs: Title: Flower by @IvyMycelia | Stardance
Devlogs:
Devlog: Making Flower’s Type Tracking “Enough” for Stdlib / String Work The original motivation was simple and — supposedly — quick; I wanted to move on to v1.1.1 , “stdlib basics,” especially string utilities. But Flower’s current compiler did not really know what types expressions had. It mostly had pointer_depth on declarations, which was enough to generate * in C types and sometimes guess whether field access should become . or -> . That worked for very simple cases: p: @Vector2 = new Vector2 p.x = 5 But it broke down for nested access: outer.inner.value outer.inner_ptr.value The compiler could see the syntax chain, but it did not know whether inner was a value field or pointer field. Since Flower source only uses . , the C backend needs to decide whether each hop becomes . or -> . That meant stdlib work was blocked. If I want something like: if strings.equal(string_a, string_b): print("same\n") end then Flower needs to understand that string_a.length , string_a.data , etc. are real typed fields, not just random syntax to dump into C. Originally I thought I could just simply create a Symbol Table to get that to work. Unfortunately, that plan soon failed as it introduced a mariad of issues relating to the import system. At the time, this frustrated me because I knew the import system sucked, but I didn’t want to fix it until a later version. Eventually, I settled on a specific plan which did actually end up changing how imports are handled.. kinda. The Plan The design I landed on was to add a typecheck/type-tracking stage between parsing and codegen: lexer -> parser -> typecheck -> codegen The parser should stay mostly syntax-only. It builds AST nodes like “dot access,” so I didn’t really change it. The typecheck pass now collects declarations into a TypeEnv : struct TypeEnv { structs: StructInfo[1024], struct_count: int, vars: VarInfo[8192], var_count: int, funcs: FuncInfo[8192], func_count: int, error_count: int } Then it walks expressions and annotates dot access nodes with an access kind: ACCESS_UNKNOWN: int = 0 ACCESS_DOT: int = 1 ACCESS_ARROW: int = 2 So codegen no longer has to fully guess. It can do: if ast.data._dot_access.access_kind == ACCESS_ARROW: fprintf(out, "->%.*s", ...) else if ast.data._dot_access.access_kind == ACCESS_DOT: fprintf(out, ".%.*s", ...) else: // fallback end That fallback is important because Flower is self-hosted-ish right now. The compiler is written in Flower, and the compiler’s own source code is full of field access. If the new typechecker is too strict too early, it breaks the compiler while trying to compile the compiler. Very elegant. Very cursed. Just how I like it ;) Import-Aware Type Tracking At first, typechecking only saw the main file, so I added a module loading pass. Instead of codegen discovering and parsing imports late, the compiler now loads modules earlier: load main module load imports recursively collect declarations from all modules typecheck all modules codegen all modules That required a new module structure: struct Module { path: @char, src: @char, tokens: @TokenStream, ast: @AST } struct ModuleSet { modules: Module[128], count: int } Unfortunately, it didn’t go as smoothly as I wanted. Near the end when I was sure everything would work, I ran into an Idempotency failure due to the new handling of system imports. I.. just manually passed it :p
Devlog: Replacing Flower’s Old Function Syntax with func name(...): type This feature started out as what I thought would be a straightforward syntax cleanup. Flower’s old function syntax looked like this: int add(a: int, b: int): return a + b end and exported functions looked like this: prop int test(): return 1 end It worked, technically, but it had started to annoy me more. The biggest issue was that function declarations did not visually match the direction Flower was already heading in, and instead felt much more C-like than I wanted. prop func create(...): Person func main(): int This style says “this is a function” up front, gives a clean place for modifiers like prop , and keeps the return type attached to the signature rather than awkwardly leading it. The goal was simple: func name(...): type instead of: type name(...): Simple in theory. not so much when the compiler is written in the language being refactored. The Problem Flower’s parser assumes top-level function definitions start with a type. Old parser logic was built around that: int main(): means: parse a type, an identifier, params, and a body That assumption was scattered through a few different places: normal function definitions prop function declarations forward declarations examples and docs the compiler’s own source Now, in retrospect, this was actually one of the easier changes. It didn’t take a whole lot of planning nor brain power, and I was able to change it pretty quickly. Luckily for me, I’ve built codegen to rely purely on ast values rather than shaping. The New Shape The new syntax is: func add(a: int, b: int): int return a + b end and exported functions now look like: prop func test(): int return 1 end This is nicer because: func makes declarations immediately recognizable prop composes more cleanly with func return types now live where people expect them to future syntax has more room to grow without feeling backwards It also feels more in line with Flower’s broader goals: explicit, readable, and not complex. The Refactor Previously, parse_func_def looked for a return type first: type name(...): Now it expects: func name(...): type So the order changed to: expect func parse function name parse parameter list expect : parse return type parse body until end That part was conceptually easy. The more annoying part was updating all the places that assumed if it isn’t a var decl and it looks like a func, it’s a func. That fallback had to go (Good riddance!). Instead, top-level parsing needed to become more explicit: prop func → exported function func → normal function forward func → forward declaration The old one worked, but it relied on vague “anything else is probably a function” rules. The Bootstrap Mistake At one point, I made a bootstrap build so I could use a Flower_new binary to compile the refactored compiler. Unfortunately, I had made a mistake in parse_forward : advancing before peek checks. Feel free to check out the bootstrapper to see why this was an issue ;) This meant my “new compiler to compile the new compiler” was built from a broken parser. The workaround was cursed, but it worked : check out the commit before the refactor fix the bug compile a new binary switch to the refactor branch use the binary to compile the new version Since the compiled binary was ignored by Git, this was actually fairly simple. Not the most elegant bootstrap story, but it got the compiler to, well, compile.
Devlog: Giving Flower Real Module Support v1.2.x was the point where Flower’s impors had to stop being “you can import stuff.. and there’s a fake layer of security” to a prop er (get it?) module system. Before this work, imports and aliases mostly behaved like naming conveniences. You could write: import "math.flo" as math math.add(1, 2) but the compiler was still too loose about what that really meant . Alias names were in emitted C symbol names, top-level declarations were not private, and prop existed more as syntax than as a real feature. That was fine for early bootstrap work, but it was not strong enough for the next stage of the language. So the main goal of v1.2.x became: make imported aliases act like real namespaces make prop define the public interface of a module make top-level declarations private by default lay groundwork for field visibility rules like hidden and readonly Module Semantics Instead of Alias Tricks One of the biggest changes was separating Flower semantics from C lowering. Previously, imported aliases were drifting toward becoming part of emitted symbol identity. A local alias should just be a source-level name bound to a module, not the backend symbol. So now each module has its own lowered symbol prefix, and alias lookup happens semantically during compilation. That means: import "math.flo" as math math.add(1, 2) is resolved as “look up exported add in module math.flo ,” not “invent a C symbol from the local alias text as math_add() .” That change also forced a cleanup of emitted names so they stopped leaking absolute filesystem paths. Generated symbols now use project-relative module prefixes instead of machine-specific paths. prop Became Real Another major part of this was making prop actually do something. Instead of treating it as a thin wrapper around only functions, the compiler now recognizes prop as a real top-level export marker. That means the module’s public interface is defined by what it explicitly exports, while non- prop declarations remain internal. This moved Flower closer to the model I wanted all along: explicit modules, explicit public APIs, no heavy object system (OOP), no fake privacy delegated to the C backend. Dot Access, Pointers, and the Annoying Middle Part This work also exposed a weakness in the compiler’s dot-access resolution. Flower source always uses . , while the C backend must decide whether a given access becomes . or -> . That mostly worked already, but nested pointer-heavy field chains exposed cases where the type tracker was not propagating enough information, which caused bad fallback behavior during self-hosting. So before field visibility could be trusted, I had to harden nested dot-access resolution. Not fun, but necessary. As it turns out, I was missing several AST kinds which caused the logic to fall through. Very tedious work, but it was well-worth it in the end! Field Flags Groundwork With module ownership and access resolution in better shape, I added the first field visibility modifiers: hidden readonly frozen Originally I debated having these as bitwise operations, but I decided it’d be best to stay within the current update’s scope, so sometime in the future I’ll refactor. Right now, hidden and readonly are the meaningful additions: hidden blocks external field access readonly blocks external assignment frozen is groundwork for later. It is parsed, stored, and carried through the compiler, but full assignment-once enforcement is still deferred. Unsure how I’ll go about it, but that’s an issue for future me :p
Devlog: Making Flower’s Bool Support Real Enough to Survive Bootstrap The goal sounded small at first: add proper boolean support, while still lowering booleans to integers in C. In practice, this turned into an overarching type-system problem (typical!). Flower had reached a point where bool could not just be a naming trick over 1 and 0 . The compiler itself needed to understand when an expression was semantically boolean, when it was integer, and when older bootstrap-era shortcuts were no longer valid. A lot of those shortcuts had survived because the backend lowers bool to int anyway. But self-hosting exposed a major issue: source-level typing and C lowering are not the same thing. Things like these started breaking: val: int = parser_peek(ps).kind == TOKEN_TRUE and helper predicates that returned comparison expressions from int -typed functions. So the checkpoint became: keep C lowering simple, but make Flower’s typechecker treat booleans as a real source-level type. The main changes were: parser -> typecheck -> codegen true / false now parse into AST_BOOL_LIT bool literals are still emitted as 0 / 1 in C logical and comparison expressions now resolve to bool arithmetic rejects bool operands if , while , and not now validate condition-compatible expressions variable initializers, assignments, and returns now check types more strictly One of the more annoying bugs turned out not to be “about bools” at all. When code like this failed inside the compiler: defined_structs[i].length emitted_imports[i].path the real problem was that for i in 0..count was never registering i in the type environment, so indexed access looked broken when really the loop variable itself had no known type. Once loop indices were typed as int , those field-access failures disappeared (yay!!). The result is a much better place to build from: bool is now semantically distinct in Flower it still lowers cleanly to integer values in generated C bootstrap works again the compiler is stricter without collapsing under its own source That makes the next step much easier: real string support, instead of trying to build strings on top of a type system that still half-thinks everything is an int .
Devlog: Fixing the Typechecker After Bool Enforcement Getting bool into Flower exposed a reallyyyy annoying problem: the typechecker had a couple of tiny logic mistakes (I’m so good at this) which caused the bootstrap to blow up in my face and I ahd no idea why. At first the errors looked unrelated. The compiler started reporting huge numbers of mismatches across main.flo , lexer.flo , module.flo , typecheck.flo , and codegen.flo . I was so confused as to why out of nowhere 903 lines were reporting various typechecking errors when they shouldn’t be. As it turns out, types_match() was the culprit. The function had been inverted in a few places: Mismatched base types and pointer depths were returning success, while normal matching primitive types were falling through to failure. That made the new compiler think ordinary initializers, assignments, comparisons, and returns were all invalid. Once that was fixed, the remaining failures turned out to be a second real compiler bug: pointer arithmetic over arrays was decaying in the wrong direction. Expressions like: mods.modules + j env.structs + env.struct_count arr + 1 should produce pointer types. Instead, the typechecker was reducing pointer depth when arrays decayed, which made perfectly normal indexed access and table walking look type-invalid. So this dev session ended up doing three important things: fixed types_match(...) so actual matches succeed and actual mismatches fail preserved decimal compatibility for float / double matching fixed array-to-pointer decay in pointer arithmetic so compiler internals and examples resolve correctly again What made this especially annoying is that the symptoms looked much larger than the cause. A couple of bad returns in the typechecker created hundreds of downstream errors, and because Flower is self-hosting, that meant the compiler started rejecting its own source. After correcting those core issues, both bootstrap and the example test suite started working again. That is the real value of issues like this: not just “fewer errors,” but restoring (MY) trust in the compiler and its ability to enforce Flower’s rules and report issues. With that stable again, the path forward is much clearer: continue bool work from a solid base, then move on to the remaining numeric and string improvements without the whole compiler collapsing under one bad predicate.
Devlog: Making Bool Real Without Breaking Bootstrap The original goal, asper usual, was straightforward: before moving on to string , Flower needed bool to actually mean something semantically. Up to this point, boolean-ish behavior mostly worked by accident. Comparisons, conditions, returns, and general expression checking were still loose enough that the compiler could get away with treating a lot of things as “close enough,” especially since the C backend ultimately lowers bool to int anyway. That was not going to hold once v1.3 started leaning on richer typing. So this was about drawing a clean line between Flower semantics and C lowering. The Goal In Flower: bool should be its own real type comparisons and logical operators should produce bool arithmetic should not quietly accept bool implicit conversion should stay narrow and predictable explicit casting should remain available through as In C: bool can still lower to int That distinction ended up being the easy part. What Changed The typechecker now treats bool as a proper language type instead of an int-shaped placeholder. Condition checks were tightened so if , while , and not use condition-compatible rules. Arithmetic paths now reject boolean operands, and return / initializer / argument checking now runs through more explicit conversion rules. I also kept implicit widening one-directional: int -> float -> double while leaving narrowing conversions as explicit casts. The actual implementation of booleans and their typing, enforcement, and semantics was a breeze. It’s what came after that got me. What Actually Broke As usual, bootstrap had opinions. The stricter type work exposed older weaknesses that were easy to miss before (This is my coping): function argument checks needed array-to-pointer decay alias and module call lookup paths were too narrow unresolved calls could prevent nested expressions from being fully type-resolved that, in turn, broke some dot-access lowering and caused bad . vs -> emission in generated C So part of this checkpoint turned into compiler stabilization work rather than just bool semantics due to my crappy ‘temporary’ logic, error handling — or lack thereof, and impeccable ability to miss very important details. I’m an amazing programmer, if you couldn’t tell :p Result Flower now has a much firmer semantic base for bool, and the compiler is back to bootstrapping cleanly with those rules in place. That matters because this was really the floor for the next part of v1.3: string . And.. maybe I’ll fix the bootstrap process so it doesn’t blow up in my face again. Oh yea, forgot to mention that. The bootstrapper bootstrapped itself into this very broken parser state that refused to go away so I had to stash my changes, checkout the prior merge (detached), and then recompile manually and fix the parser. Toodles!
Devlog: Building Flower’s String Type Foundation The core goal was to make this work in a meaningful, compiler-owned way: name: string = "Ivy" as string raw: @char = name as @char other: string = raw as string if name == other: print("same\n") end print(name.length) That meant Flower needed more than a typedef in generated C. It needed actual type rules, actual lowering rules, and I needed enough hairs on my head to not be bald after the amount of scares that occurred. What changed The first step was giving string real compiler support without going too far too fast. I added support for: explicit casts between string and @char string equality / inequality string.length runtime helpers in generated C for: flower_string_from_cstr(...) flower_string_eq(...) flower_print_string(...) That gave Flower a usable string foundation while still keeping literals conservative for self-hosting. Right now, string literals are not fully “native string values everywhere” yet; the compiler still uses explicit casts like "Ivy" as string as the safe bridge. The reason for this “safe bridge” is because when I got too ambitious, the compiler would break since everywhere @char was used with a string literal it’d break due to no implicity being allowed. I had to comment out the following new changes and keep the legacy support so it’d compile: else if ast.kind == AST_STRING_LIT: // fprintf(out, "flowe_string_from_cst(") // fprintf(out, "%.*s", ast.data._string.str_length, src + ast.data._string.str_start) // fprintf(out, ")") // LEGACY CODE HERE and else if expr.kind == AST_STRING_LIT: // set_plain_type(out, TOKEN_STRING) // LEGACY CODE HERE return 1 The part that broke The most annoying issue was not string equality or .length . It was print . Originally, non-string print(...) was basically lowered like this: printf ( expr ); That only works when expr is already a C format string. So something like: print(name.length) generated invalid C: printf ( name . length ); The fix was to make print(...) type-aware. Typecheck now records the operand type, and codegen lowers print differently for string , @char , char , floats/doubles, and integer-like values. That sounds small, but it matters a lot: once string became real, print could no longer get away with pretending every printable value was already a C string. An Unsolved Bootstrap Mystery Somehow Flower’s bootstrap process was breaking, and it will probably break again. Despite the bootstrap requiring it to compile itself, somehow afterwords the binary could become corrupted. l-2: ~/Documents/GitHub/FloC % make bootstrap === Building new version === Compiled ./bin/Flower_new.c → ./bin/Flower_new === Testing new compiler === Compiled ./bin/Flower_test.c → ./bin/Flower_test Verified bootstrap build complete l-2: ~/Documents/GitHub/FloC % make bootstrap === Building new version === Luckily, I always make sure to keep a backup Flower bin stored under /bin/Flower_backup so I used that to compile the new binary and then it worked. Where this leaves v1.3 What still remains is the bigger ergonomic question: how fully native string literals should behave, and how to migrate the compiler’s own source to that world without setting bootstrap on fire again. I’m not sure yet how I want to approach this question, or what the goals for it should even be, but I guess I’ll have to find out soon enough! That is the next fight. But at least now, it is a fight on solid ground.
Devlog: Finishing Flower’s String Interop Bridge The last round got string into Flower as a real type. This round was about making that foundation actually work lol. The big problem was that once string became real, plain string literals started living in an in-between state: Flower wanted them to mean “Flower string,” but the compiler’s own source still has plenty of places that really mean “raw C string,” like: RED: @char = "\033[0;31m" if not strcmp(arg, "help") or not strcmp(arg, "h"): ... end Those cases worked before only because everything was basically pretending string literals were already @char . Once that stopped being true, bootstrap started throwing a fit (my spoiled child). What changed The main fix was to make string literal lowering contextual instead of all-or-nothing. If a literal is being used as a real Flower string , it stays a string . If a literal is being used in a C interop position, it gets lowered as a C string instead. That meant tightening a few compiler rules so this kind of thing works cleanly again: name: string = "Ivy" as string raw: @char = name as @char if strcmp(raw, "Ivy") == 0: print(name) end I also fixed top-level declarations so globals like: RED: @char = "\033[0;31m" no longer generate nonsense like: char * RED = (( flower_string ){ ... }); which, unsurprisingly, C does not appreciate. The subtle compiler bug The nastiest issue wasn’t even the globals. It was that builtin C calls like strcmp , strncmp , printf , snprintf , and friends are not real Flower functions. That meant the typechecker could hit one of them inside a larger expression, fail early, and stop walking the rest of the tree. So something like: if not strcmp(arg, "help") or not strcmp(arg, "h"): could partially resolve one side, then leave the other side unprocessed. Very cool. Very stable. Definitely what I wanted. The fix was to add a temporary builtin C-call bridge so the compiler can recognize these calls well enough to keep type resolution and literal lowering consistent during bootstrap. I’m not happy with this fix by any means, but due to the limitations of emitting C, it was the only solution I found that made sense at the time. Tests and examples Once that stopped exploding, I finally wired string testing into the normal types suite instead of leaving it commented out and pretending I’d “get back to it later.” The string tests now cover: string <-> @char casts string equality / inequality .length empty strings printing strings literal use in current interop cases And the full test suite passed with string included as a first-class part of Types on its first try . Now that’s what I like to see :D What this means This does not mean Flower’s long-term answer is “hardcode libc into the compiler forever.” It means Flower now has a temporary interop bridge that keeps self-hosting stable while string is worked on. The actual language semantics stay in Flower; the backend-specific weirdness is just being tolerated for now so progress does not stall. In the near, I’ll probably replace all of the necessary C libs with minimal Flower-equivalents. Where this leaves v1.3 At this point, the string foundation feels much sturdier. Not “done forever,” not backend-agnostic, and definitely not free of cursed bootstrap energy — but it works. The next work is no longer rescue work. It is actual forward work: string operations, stdlib basics, and eventually replacing this temporary C bridge with something cleaner when Flower grows past the C backend.
Devlog: Adding String Indexing to Flower This one was fairly quick, and was about making one very normal-looking thing actually work: name: string = "Ivy" as string first: char = name[0] That sounds small, but once string became a real Flower type, indexing could no longer piggyback on the old “arrays and pointers only” behavior. The compiler needed to understand that string[index] is its own case. What changed I taught the typechecker to treat string subscripts as char . That means: string[index] now resolves to char the index expression must be an integer string indexing is readonly for now So this is valid: first: char = name[0] but this is not: name[0] = 'X' I wanted reads first, writes later. That keeps the rules simple while the string representation is still compiler-owned. I’m not sure how writes would work with a C backend, due to how ‘strings’ are allocated. Perhaps a feature for post-v2.0? Lowering it to C Since Flower strings currently lower to a struct with .data and .length , codegen needed a special path for string subscripts. Normal arrays and pointers still lower like: arr [ index ] but strings now lower like: name . data [ index ] That keeps the generated C valid without changing how regular subscripts work elsewhere in the language. So something conceptually like: This checkpoint also forced one strict-but-correct rule that required me to update a WHOLE SINGLE LINE (hehe): arg[i] = tolower(arg[i] as char) to arg[i] = tolower(arg[i] as char) as char Because tolower(...) is effectively treated as returning int , assigning it back into a char subscript needs an explicit cast. I kept that strictness on purpose. I do not want Flower silently narrowing values just because C would let it. Validation I expanded the string example coverage to check: string indexing returns the expected chars string[index] works alongside string <-> @char casts bootstrap still succeeds repeated bootstrap succeeds tests still pass Which, after all the recent bootstrap chaos, was very nice to see. Where this leaves v1.3 Now we can: store strings compare strings print strings inspect length index into them as char This should make it much easier to replace the builtin C functions with a Flower library in the near-near future.
Devlog: Fixing Flower’s Output Driver and Starting the String Stdlib This checkpoint was really two different kinds of progress that ended up helping each other a lot. The first part was not glamorous, but it was necessary: Flower’s compile driver was tripping over its own default output naming. This was a known issue that I had been putting off, but for some reason it really annoyed me this time so I decided enough and to fix it. If no explicit output path was provided, the compiler would generate output.c , then strip the .c and try to emit a binary named output . That worked fine right up until the repo itself already had an output/ directory. At that point, linking failed because the compiler was trying to create a file where a directory already existed. Worse — because it annoyed me more — the driver logic was also mixing up “the generated program exited non-zero” with “compilation failed.” That became especially annoying during bootstrap, because the generated compiler binary would run without CLI arguments, print its own usage error, and then cause bootstrap to report failure even though codegen and C compilation had both succeeded. So I finally got off my butt and cleaned that up. Driver Cleanup The default output path now goes to: output/out.c which naturally produces: output/out as the binary. That avoids the old output filename collision. I also separated compile success from auto-run behavior: explicit output path: compile only default output path: compile, then auto-run if appropriate That means bootstrap no longer “fails” just because the compiled compiler exits non-zero with missing arguments, and demo/test files can still run automatically when that is actually useful. This sounds like a small driver fix, but honestly it removed a lot of noise from string work — and more — immediately. String Stdlib Beginnings Once that output weirdness was under control, I could finish doing what I just started and actually wanted: making string behavior live in Flower instead of endlessly leaning on ad hoc C calls (Call back to last devlog, absolute ball knowledge!!). So I added the first real reusable helpers in src/stdlib/string.flo : is_empty(s) starts_with(s, prefix) ends_with(s, suffix) find_char(s, ch) These are intentionally simple. They mostly exist to prove that the current string support is now strong enough for normal library code to be written on top of it. Not incredibly useful, at least at the level the compiler needs, but at least I could translate some AP Comp Sci A into Flower hehe A string feature does not really feel “real” until I can build helpers with the language itself instead of only teaching the compiler more special cases. The day I remove the builtin C handlers is the day I’m at peace… Validation To exercise that new library surface, I changed string_pass.flo to now act as a small pass file for the experimental library. Its job is not to be impressive. Its job is to answer a more important question: can I import string helpers, call them from normal Flower code, and get expected results through the full compile pipeline? At this point, yes. Where this leaves things This checkpoint did not remove all C string dependencies from the compiler. In fact, it removed essentially none! That is still a separate step, one that may even be in v1.3.7 ;) But it did establish two important things: Flower’s output/driver behavior is now much less annoying. We can start growing a real string library in Flower itself. That is a good place to be, because the next string work can build outward from a stable driver and an actual library surface instead of piling more special behavior into the compiler.
Devlog: Giving Flower an Internal cstr Foundation Even after Flower got a real string type, the compiler itself was still leaning directly on C-style string helpers for its own internal work. That meant a lot of Flower source was still semantically depending on libc behavior: !strncmp(...) strcmp(...) strlen(...) strcpy(...) strncpy(...) strdup(...) strrchr(...) That is not where I want the language to stay. What changed I added a new internal module: import "src/stdlib/cstr.flo" as cstr and gave it compiler-facing helpers like: prop func len(s: @char): int prop func eq(a: @char, b: @char): bool prop func eq_n(a: @char, b: @char, n: int): bool prop func copy(dst: @char, src: @char): @char prop func copy_n(dst: @char, src: @char, n: int): @char prop func dup(src: @char): @char prop func find_last(src: @char, ch: char): @char This helper module is essentially the precursor to a future strings.flo library that can be distributed. But for now, it uses a basic API layer purely meant for in-house usage. Then I migrated compiler internals over to that module across: src/parser.flo src/module.flo src/lexer.flo src/typecheck.flo src/codegen.flo src/globals.flo src/main.flo So instead of using C-string behavior directly everywhere, the compiler now goes through Flower-owned helpers first. The Compiler Strikes Back This was one of those changes that sounds mechanical until it absolutely is not. A big trap was that old code often relied on C comparison functions returning 0 on equality, so patterns looked like this: not strncmp(...) But cstr.eq_n(...) returns an actual bool , which means blindly rewriting those calls gives inverted logic. So this: if ps.alias_lengths[i] == tok.length and not cstr.eq_n(...): was completely wrong. It had to become: if ps.alias_lengths[i] == tok.length and cstr.eq_n(...): That bug showed up in alias parsing first, which made it especially cursed, because it caused normal namespace-style calls like cstr.eq(...) to stop parsing correctly and crash the bootstrap path in confusing ways. I spent way longer than I wish to admit on trying to figure out why it wasn’t playing nice. But, once I figured it out, it was a really quick fix (I literally just cmd + f ’d not cstr and replaced it with cstr lol). Are we done yet..? This does not mean Flower is free from the C backend yet. It does mean something important, though: compiler logic is starting to depend on Flower-defined helper semantics instead of scattered raw libc calls. That is a much better stage for the future backend story, because when C eventually stops being the primary lowering target, the compiler will already have more of its own vocabulary. In other words, this was less about “remove C” and more about “stop letting C define the language’s internal habits.” Nah just kidding, I really wanted that bloated “builtin_c_call” stuff gone. Unfortunately I only managed to skim it, but that’s closer than before! Result After fixing the migration mistakes and the alias/parser fallout, the compiler bootstrapped successfully again. Flower now has an internal cstr layer, and compiler string handling is a little more its own.
Devlog: Cleaning Up v1.3 For Release After many hours of work, bool and `string finally became real, and it was time to cleanup the mess I left behind from the version’s development. Mainly the only thing worked on was some cleanup: roadmap now reflects actual v1.3 features and implementations updated README and contribution documents to match the current compiler pipeline cleaned up string examples so they have the full intended v1.3 style instead of some leftover testing usage pushed the compiler’s version to 1.3.0 updated help / usage text so it matches the new output-path and auto-run behavior Prior to this, if I had just merged and shipped, the release wouldv’e been messy: README, Contributing, example files, and guidance commands were all mixing older details which made it confusing — even for me — when trying to explore the language and what it has to offer. For a bootstrapped compiler especially, making sure everything is cleaned up and polished is something that should not be ignored. I’m definitely guilty of overlooking this, but I’ve outlayed a whole plan for v1.3 unlike past versions, and part of it was setting up a proper versioning system and polishing its release as it goes. This format will be adopted in future versions, since it’s just way cleaner and nicer to look at. Future work At this point, v1.3 is done and has implemented, at minimum, a concrete foundation for post-v2 bools and strings. Next will likely be more subtle improvements, and features that are currently reliant explicitly on C rather than Flower-hosted code. In order for v2.0 , Flower will have to be effectively independent from C if it wants to emit machine code. Currently I am planning on adding features such as Type Aliases and maybe a stdlib prior to that, but anything can change!! Thanks for being here for all of v1.3 <3
Devlog: Making Flower’s Type Aliases Transparent This version was simple to develop on paper (and even in practice it wasn’t too bad, only around 4 or so hours!): type Count = int type Total = Count type Name = string and then have those aliases behave like the real type everywhere: n: Count = 12 total: Total = identity(n) name: Name = "Ivy" if name != "Ivy": return false end if name.length != 3: return false end That meant aliases could not just be parsed and stored, but rather had to be transparent to the compiler’s semantic checks. What changed I added type alias declarations to the AST, parser, and type environment, then added the ability to resolve aliases in typechecking before comparing types. That included: return type checks variable initializers function call arguments binary comparisons string-specific comparison logic struct field access The important rule here is that aliases are semantic, not codegen-facing. Count should behave as int , Name should behave as string , and chained aliases like Total -> Count -> int should collapse correctly. In the future, especially post v2.0 , this could change and custom types might become real — but for now, they’re just aliases. The bug that exploded bootstrap The first real failure was not in aliases themselves, but in function argument checking. Inside check_call_args(...) , the compiler was resolving the argument expression into expected_type instead of arg_type . That overwrote the parameter type, left the actual argument type uninitialized, and caused the second bootstrap stage to explode into over a thousand misleading errors. This was not a pre-existing issue, it was instead from human error (my error) during the initial implementation where I accidentally put the wrong variable. Once that was fixed, the remaining failures were much more helpful than the bright flash of red and “Typecheck failed with 1224 error(s)” message! Where this leaves v1.4 With the first step toward “better types” done, aliases are no longer just syntax. That gives v1.4 a solid base for whatever comes next in the type system without having to fake around raw names. During this whole dev session, I did discover that a whole lot more of the source code was left using legacy work-arounds: int instead of bool , name_start; name_length and @char instead of string . In all fairness, some of these aren’t exactly the easiest to refactor. However, I will probably hold off on refactoring the codebase until either right before v2.0 , or right after. Just know it’s on my radar ;)
Devlog: Fixing Flower’s Compiler Process So It Stops Fighting the Host This wasn’t really about language design at all buttttt it is much more embarrassing , AND more important: Flower’s compiler process itself was too fragile. The immediate issue showed up on Linux, specifically NixOS (thanks shipwrights <3). The build flow was assuming too much: a previously existing bin/Flower could be reused safely bash would exist at the expected path clang would always be available the checked-in compiler binary would be runnable on whatever machine the repo landed on That worked well enough on my machine until it didn’t. On NixOS — and by extension probably any other machine without the prexisting binaries I had — it broke: make targets were inconsistent, the shell script failed on interpreter assumptions, and the compiler binary itself could be the wrong format for the host. What changed The fix was to separate “the compiler source exists” from “the current compiler binary is usable on this machine.” The build process now starts by compiling a fresh host-native bootstrap compiler from bin/Flower.c , instead of trusting whatever happens to already exist in bin/Flower . That means the flow is now: bin/Flower.c -> host-native bootstrap compiler -> new Flower compiler -> self-check instead of: maybe existing bin/Flower -> hopefully works -> maybe bootstrap Ok well that’s kinda a lie; it still relies on hopes and dreams to bootstrap sometimes. BUT it’s MUCH safer! And now everyone gets to experience crippling bootstrap anxiety, instead of being met with a failure before the actual compiler gets to.. well, do its thign! I also cleaned up the surrounding tooling: switched the bootstrap script to portable sh restored a clearer build / bootstrap / rebuild / test / clean structure made the compiler use CC and CFLAGS from the environment instead of hardcoding clang What this actually improves Flower is still not universally cross-platform yet. The compiler driver still has POSIX-shaped assumptions in places, and the emitted C can still depend on host APIs depending on what the program uses. I’m not yet at the point of wanting to make it completely universal, especially given how I’m only one person and with v2.0 coming up soon it’d — in my humblest of opinions — be a waste of time. I am honestly grateful for people reviewing my code and otherwise viewing it catching onto details I have overlooked. My goal is to not make a ‘just-barely working on my machine’ project; I enjoy sharing development with others, and it hurts knowing people can’t appreciate code, whether it be mine or others’, due to something as simple as hard-coded sh flags.
Devlog: Formalizing Flower’s Null Foundation Flower already had some of the pieces for null , but they were a bit scattered. The goal here was to make it explicit, consistent, and safe before moving on to nullable syntax like ?T or full union-based nullability later in v1.4 . Another shorter devlog, but still important and distinct enough for me to think “Hmm devlog time? Yes, devlog time!” What changed The main work was in typechecking. I added to the compiler’s idea of what null is, how it is represented internally, and what kinds of values are actually allowed to accept it. Rather than letting null-related behavior stay implicit across a few checks, null now follows a clearer rule set: null has one centralized internal type representation pointer-like values can explicitly accept null null comparisons and assignments now go through the same semantic path Why this matters This isn’t all that important on its own, but it matters a lot for where Flower is going next. If null is not defined well, then later features like: ?T better unions smarter narrowing more expressive type flow all become more error-prone (or so I assume given my track record) than I want need them to be. Validation I also expanded the example coverage so null : it now has dedicated behavior checks around assignment, passing values around, and comparison behavior.
Devlog: Adding Pointer-First Nullable Types to Flower I worked on giving Flower its first real nullable type surface without being overambitious and pretending the compiler is ready for full optional-everything semantics yet. The new syntax now works like this: ptr: ?@int = null text: ?@char = null That means there is now an explicit way to say “this pointer-like value may be absent,” instead of relying entirely on raw pointer habits from C (If you couldn’t tell by now, I despise C). What changed The main work was split across lexer, parser, and typecheck. I added: ? as a type marker in type positions is_nullable tracking in TypeInfo type rules for nullable pointer/reference values explicit compatibility for: assigning null into nullable pointer-like types comparing nullable values against null casting between @T and ?@T I also kept the scope intentionally narrow: this implementation is pointer-first nullable support , not full nullable scalars. So ?@int makes sense right now, but ?int is still deferred until I make a better semantic union / optional representation for plain values. Why this matters It would have been easy to overreach here and claim “nullable types are done,” but that would have been a big phat lie. Pointer-like nullability lowers naturally enough with the current backend and current compiler model. Scalar nullability, however, does not. Once you let int or bool become nullable, you need a more real representation for “has value / no value,” and that belongs in the later union work, not here. Result explicit absence compiler-owned semantics better future unions stronger type meaning without hidden magic The next real step after this is not more patching around null — I consider that done for now — but instead giving Flower the deeper machinery needed for nullable non-pointer values and semantic unions later in v1.4 so it doesn’t come back to bite me in my butt.
v1.4.4 Devlog: Giving Flower Real Semantic Union Types I made it so that semantic unions are now in Flower’s parser and type system — but not yet its codegen. The goal was to support types like: value: int | string next: @Node | null type Result = int | string What’s new The parser now understands | inside type positions and builds semantic union type information instead of relying on those old plain aliases or backend-shaped hacks. On the typecheck side, unions are now carried through normal type copying and alias resolution. That means named aliases like: type MaybeName = string | null make sense after resolution, instead of collapsing into nonsense. The typechecker also now accepts union-compatible usage in the places that matter for a foundation: variable initialization assignment parameter passing return checking alias resolution So if a value matches one union member, it is accepted. This is sorta implicit behavior, but I think it gets a pass due to its somewhat explicit nature? What it does not do yet This version was intentionally strict about using unions as values. You cannot yet directly: index a semantic union access a field on a semantic union use arithmetic / comparison operators on one print one directly Instead, Flower now requires an explicit cast before using a union value that way. That may sound harsh, but it is the right restriction.. for now. There is not any narrowing yet, so pretending unions were fully usable would just make the language lie and spit out 2,000 errors. Where this leaves v1.4 Flower now has: transparent type aliases null as a real type-system concept pointer-first nullable types semantic union type representation The next step is the part that will make unions actually usable rather than merely legal: narrowing with is better explicit extraction with as eventually making ?T truly become T | null instead of remaining pointer-first for now No fun screenshot this time :p just frontend work for now… Ivy, signing off <3
Devlog: is Checks v1.4.5 added is checks, mostly so code like this can work: if maybe_ptr is @int: real_ptr: @int = maybe_ptr end The idea is (fairly) simple: if the condition proves maybe_ptr is an @int , the inside of the branch should be allowed to treat it like one. Flower did not know how to do that before. It knew what a variable was declared as, but it did not really learn anything from control flow yet. Now it can, at least for the pointer/nullable-ish cases I care about first. This touched the parser, AST, typechecker, narrowing logic, and codegen. So, naturally, the “small feature” went everywhere. I’d actually consider this one of the bigger refactors so far, mostly because it added a new TypeAtom structure. Before this, types were still a bit too attached to the places they appeared, and all fell under the TypeInfo . That worked for simpler declarations, but is checks needed type syntax to have something the compiler could pass around to use for comparisons, validations, and narrowing. The parser had to recognize the new expression shape. The AST had to store the left side and the tested type. The typechecker had to make sure the test was allowed and not totally garbage. Then the narrowing logic had to say, “inside this branch, this variable has the proven type of x and therefore we won’t flag you for being an idiot.” That last part was where the bug goblin lived. I’m calling them a goblin because they were sneaky (and I also think it’s quite a funny and cute name). For a while, Flower had applied narrowing from the if body instead of the if condition, which meant the compiler saw this: if maybe_ptr is @int: real_ptr: @int = maybe_ptr end and somehow still failed on the assignment inside the branch. Very helpful. Thank you, compiler. EVen though it’s obviously 100% my fault, I made the compiler, but oh well!! Once I changed the narrowing step to inspect the actual condition expression, it started behaving like it should. The typechecker could see maybe_ptr is @int , attach that narrowed type to the branch scope, and allow maybe_ptr to be used as @int inside the guarded block. For now this explicitness is how I want it. There may come a time in the near future where I decide some implicity is ok, but we’ll see ;) is checks are the first real step towards control-flow-aware typing in Flower. Not full union support yet, but definitely the beginning of that road soon to come. Right now it mostly helps with nullable and pointer-like cases. Later, the same idea can support richer unions, better narrowing, and more type-driven control flow without making the programmer manually restate everything the compiler should already know. Also, it bootstrapped cleanly twice — which.. is obviously the bare minimum, but still!!
Devlog: Semantic Unions Become Actual Values (Part I) In v1.4.6 , I made semantic unions actual runtime values instead of just parsed/typechecked shapes. Before this, Flower could understand: type Value = int | string as a type. It could point at it and say, “yes, that is a union,” but that was mostly theoretical. The goal was to make this work-work for realsies: type Value = int | string value: Value = 7 if value is int: n: int = value as int end value = "Ivy" if value is string: s: string = value as string end That meant Flower needed more than TypeInfo.is_union = true . It needed a full path from syntax, to type proof, to lowered storage, to runtime extraction. Otherwise unions would just be fancy typechecker thingy-ma-bobbies, which is not very useful when the backend still emits C. What changed Instead of treating a union as a vague “one of these types, probably,” Flower now lowers it into a tagged structure. Conceptually, this: type Value = int | string becomes something like: struct Value { int tag ; union { int as_int ; flower_string as_string ; } data ; }; Not the final sacred form forever, but that is the shape of it: a tag saying which variant is active, plus storage for the possible members. Since Flower emits C right now, the lowering is C-shaped. I am not fully sure how I want this to look in ASM yet, but I do know it would be way more technical, and uglier. This required a few things to play nicely with one another: if value is int creates a union proof the guarded branch stores narrowing information value as int is only allowed after proof assignments pack values into the right tagged member explicit casts extract the right member from storage Otherwise the compiler is just writing checks its own backend cannot cash. The part that makes it ACTUALLY semantic For pointer narrowing, if value is T mostly refines how the compiler treats an existing value. For semantic unions, the check also becomes a runtime tag test. So this: if value is int: means: check the active tag of value , then inside this branch, treat it as the int variant. Then this becomes valid: n: int = value as int because the branch already proved the active variant. Without that proof, value as int should not be casually allowed. Flower is supposed to be explicit, not psychic, and I am not confident enough yet to implement a proper intuitive implicit checker without summoning something cursed. Assignment and extraction This: value: Value = 7 now packs 7 into the int member and sets the tag to the int variant. Then this: value = "Ivy" does the same thing, but for the string member. So a semantic union is not just some bytes, but rather a tagged runtime object where Flower knows which member is active. Then explicit casts like: value as string can lower into extracting the string member, but only when the typechecker has accepted that the operation is safe in that control-flow path. Why this checkpoint matters Flower can now store variant values, prove which variant is active, and require explicit extraction instead of relying on random magic I threw together. The flower has grown another concerning little organ.
Devlog: Letting Semantic Unions Work In Functions After getting semantic unions working in local declarations, the next problem was fairly obvious (and in my roadmap hehe). This did not work before: func make_value(): int | string return 7 end func accept_value(value: int | string): bool return value is int end Which was annoying, because int | string was already a real union type at this point. Flower could use it in locals, it could pack assigned values, it could check variants. But if I returned 7 from a function declared as int | string , or passed 7 into a parameter expecting int | string , the compiler did not know how to carry that union-lowering information across the boundary. This has been one of the easier changes I’ve made in a long while. It compiled properly first try (if you ignore a tiny misspell I made which I fixed really quickly), and there were no prior hidden bugs that surfaced. This.. is too suspicious. What changed The compiler now carries semantic union info through: function parameters function returns imported alias calls If a function expects: int | string and I call: accept_value(7) typecheck records that 7 needs to be packed as the int member of that union. Same for returns: func make_value(): int | string return 7 end That matters because codegen cannot guess later due to the separation of responsibilities I’ve laid out. By the time Flower is emitting C, it needs to know which tag to set and which member to write. Lowering it properly Codegen already knew how to pack union values for declarations and assignments. The missing part was doing the same thing for call arguments and return statements. So now a value can be packed into a tagged union when it is: stored locally passed into a function returned from a function Alias calls got handled too, so things like: remote.accept(11) remote.make_string() do not become their own weird little cursed island. Why this mattered Without this, semantic unions only worked as long as I never organized my code. They worked in local tests, but not in helper functions, imported providers, or normal inputs and outputs. Now union values can actually move around the program instead of being trapped in the one scope where they were declared — and for me, forgotten! Very exciting, the union can leave the house. They grow up so fast ⁎⁍̴̛ ₃ ⁍̴̛⁎
Devlog: Adding Obvious Branch-Local Inference to Flower Before this, narrowing mostly worked in the obvious “true branch” cases: if maybe != null: real: @int = maybe end and: if value is string: s: string = value as string end But the else branch was still kind of standing there empty-headed, even when the meaning was extremely obvious. Like, if this happens: if maybe == null: return false else: real: @int = maybe end then inside the else , maybe is clearly not null. So now it doesn’t!! What changed Flower now does branch-local narrowing in else for small, explicit cases. That means these now work: if maybe == null: return false else: real: @int = maybe end and: if value is int: return false else: s: string = value as string end It is only applying inference when the condition says something directly and the opposite branch has one obvious meaning. Nullable narrowing For nullable pointer-like values, Flower now understands both sides of simple null checks: if x != null narrows x to non-null in the if body if x == null narrows x to non-null in the else body the opposite side can narrow to null when that is the only meaning left Semantic union narrowing The same idea applies to semantic unions, but a bit more ‘held back.’ Essentially, if Flower sees: if value is int: then the if branch narrows to int , like before. Now, if the union only has one other possible member, the else branch can narrow too. So for: int | string the else after if value is int can be treated as string . This is not full control-flow wizardry, since it doesn’t reason across deep boolean chains, early-returns, or giant branches yet. It is deliberately small and local, because I do not want Flower “helping” so much that I need a detective board to figure out what type something is.
Devlog: Teaching Flower to Understand Guard Clauses gave Flower branch-local inference. Last update, I added support for branch-local inference, so the compiler could understand things like: if maybe == null: return false else: real: @int = maybe end and: if value is int: return false else: s: string = value as string end That was an improvement, but it still meant narrowing stopped at the end of the branch. That meant stuff like returninging in some conditions still did not really work as naturally as it should: if maybe == null: return false end real: @int = maybe or: if value is string: return false end n: int = value as int In v1.4.9 I fixed that. What changed Now narrowing propagates past very obvious guard clauses. If one branch definitely returns and the other falls through, the compiler now carries the interpretation forward after the if . This means that the compiler can now understand: after if x == null: return ... , x is non-null after if x is string: return ... , a two-member semantic union can narrow to its remaining member I kept this intentionally conservative for now. The compiler is not doing full control-flow analysis yet. It is only recognizing the simplest and most explicit early-exit shape. How it works The main addition was a small semantic check for “does this branch definitely return?” Right now that means: direct return if where both branches definitely return Once the compiler knows one side exits and the other survives, it applies the branch’s narrowing to the following statements. Yea.. that’s it lol.
Devlog: Making ?T Actually Mean T | null Before v1.4.10 , ?T was treated as its own nullable system and not really integrated with the rest of the semantic unions. This was unideal, because it created a separation of logic which was cumbersome to maintain. The idea was to make the following be the default: ?int == int | null ?string == string | null ?@int == @int | null Prior to the refactor, nullable types were still mostly pointer-oriented. That worked when ?T basically meant “maybe this pointer is null,” but it did not really fit anymore once semantic unions became actual runtime values. If Flower has T | null , then ?T should use that instead of being its own special thing. This is a more pragmatic choice, as it keeps the compiler easier to manage and update later on. What changed Typecheck now lowers ?T into the same semantic-union machinery used by normal unions. That means nullable values now go through the same general path as union values: null checks use union-aware narrowing narrowed nullable values can be extracted with as codegen emits tagged union storage assignments pack into the right union member So this now works as an actual nullable flow: maybe: ?@int = raw if maybe == null: return false end real: @int = maybe as @int The annoying part is that Flower has to track two things at once: the type the programmer is allowed to see after narrowing, and the actual union shape that remains underneath it. After the guard, maybe behaves like an @int . But codegen still has to remember it came from @int | null , because apparently the compiler cannot simply “vibe” its way through storage layout. Tragic! The bugs that annoyed the heck out of me Most of the work was not surface syntax. The syntax was just standing nearby looking innocent. The actual bugs were in the places where Flower knew “this is non-null now,” but then forgot how to lower, such as: narrowed nullable values falling back to raw C casts like (int*)(maybe) false branches of == null / != null narrowing to the wrong side (this was my fault lol) null getting packed into the wrong union member That last one was the rude one. For ?@int , generated C could end up doing something like: . tag = 1 , . m0 = NULL instead of packing into the actual null member. So the value looked almost right, but the tag/member pairing was wrong. Then later null checks would fail, because the compiler had technically put null somewhere. Just not the correct somewhere. Very helpful. The fix was separating two questions I had accidentally merged: is this type compatible with this union? which exact union member should this value occupy? Those look related, but they are not the same question. Flower was using the first answer for the second problem, and then acting surprised when everything became soup. Where this leaves Better Types ?T now lowers through the same path as T | null , which means null checks, narrowing, extraction, and storage all line up with the semantic union model. This should make later work cleaner, such as nullable inference, nicer union ergonomics, maybe pattern-like narrowing eventually. Not easy. I am not saying easy near a compiler. That is how they hear you. You do not want them to hear you ..
Devlog: Direct Semantic Union Parameters Now instead of having to do this workaround: type Value = int | string func accept(value: Value): bool You can just pass semantic unions directly: func accept(value: int | string): bool That was it. All I had to do was remove a stale type_error clause in register_params and allow binding variables. Then I updated the two relevant accept functions in /examples.
Devlog: Letting Union Narrowing Follow Field Access Before v1.4.13 , union narrowing only really worked when the thing being narrowed had a variable name due to almost every similarity check relying on name_start and name_length . This was dumb, because semantic unions already knew how to test tags and extract members. Codegen was not the issue, but rather the annoying part was that the typechecker could remember this: if value is int: n: int = value as int end but not this: if box.value is int: n: int = box.value as int end So I still had to do a little temp-variable ritual: tmp: Value = box.value if tmp is int: n: int = tmp as int end Which was gross. Not necessarily catastrophic, just gross and annoying. I wanted needed convenience What changed The compiler was remembering narrowings by variable name, not by expression shape, so box.value looked obvious in source (to me, at least), but to the typechecker it was basically some random expression and not something it could reliably recognize again later. A variable name already had a stable identity, whereas field access chain did not. So the change was to let narrowable expressions represent more than just AST_VAR_REF . For now, that only means stable dot-access chains. The typechecker can record a narrowing for an expression like: box.value and then recognize the same expression later when a cast shows up. So this works directly now: if box.value is int: n: int = box.value as int end Same for the other union members, like string . The detour My first example accidentally wandered into a different feature: if maybe_box.value != null: That exposed a real nullable-field-guard gap, but that is not what this was supposed to be about. Very rude of the test case to have ambition hmph >:( Where this leaves it Semantic union narrowing now persists past field access — at least for stable dot-access chains — and the temp-local is no longer needed. Butttt now I gotta work on nullable-field-guards, ugh (hehe)
Devlog: Finishing Nullable Field Narrowing At this point, Flower could already narrow semantic unions through field access in the is / as case, and nullable field checks were supposed to be the obvious follow-through: if maybe_box.value != null: label: string = maybe_box.value as string end Instead, I had forgotten to remove a LOT of stale code, and thus part of it was still behaving like only plain local variables could ever be narrowed. There was also a second, smaller mismatch hiding, where null in type position was not lining up with the compiler’s actual internal null representation. ?string and string | null weren’t leading to a congruent output and at times were wobblier than they should be. So the fix was mostly cleanup, but the meaningful kind: make null in type syntax lower the same way the compiler expects remove the stale var-only branches in nullable narrowing let stable field paths like maybe_box.value and holder.box.value narrow properly The funny part is that this felt bigger initially than it actually was once fixed. Nothing fundamentally new had to be invented, I just had to stop the old code from interfering with the newer code, which once I figured out how to do so it was quite quick. I spent an embarrassingly long time figuring it out…
Devlog: Syncing Flower’s Docs Back to Reality Just a doc cleanup lol. No code change or compiler updates. Probably did more than needed for now but oh well! The mismatch was REALLY bad. The old docs preserve old assumptions, and someone reading them could walk away with a version of Flower that no longer really exists (or, in some cases, doesn’t exist yet or never ever existed)! What changed I updated the docs that had drifted the most from reality (relatable): README.md now reflects the current type-system shape ROADMAP.md treats v1.4 as accomplished the v1.4.0 milestone doc now includes more of the outcome, not just the original plan contributor docs no longer have stale semantics structure.md is more accurate to what Flower currently is, and what still needs a fuller rewrite later Yea, that’s it.
Devlog: v1.5.1 – v1.5.5 Following all of the changes Flower has undergone, I felt it was time for some much-needed documentation. On paper this was supposed to be fairly quick, simple, and not require much brain power. Unfortunately for me I got a bit too over-zealous, and included things I thought should work, but in reality hadn’t. For example, in a lot of the code snippets I’d have something like: for i in range 0..10: print(i) end Printing non-string values was not yet supported in Flower. To fix this, I took a small detour back to v1.4 and implemented support for it — mostly in a single codegen case: if ast.data._print.value_type.base == TOKEN_FLOAT or ast.data._print.value_type.base == TOKEN_DOUBLE: fprintf(out, "printf(\"%%f\", ") gen_expr(ast.data._print.value, out, src) fprintf(out, ");\n") end Afterwards I added more smoke-tests in examples/io/print.flo . Every few runs, however, I’d get a segfault. This was especially odd because it wasn’t simply an error but rather a silent memory bug. Eventually I found out where it was originating — thanks, ASan! Turns out after the new type system changes, I had forgotten to initialize some values to null / 0 in for loop handlers and a few other places. I just added typeInfo.data = null / 0 where applicable and it fixed the issue! What is v1.5, and why is this devlog so long? To answer the latter first.. I lowkey just forgot to post a devlog for the first two docs I made. That’s it. For the former question, v1.5 is supposed to be explicitly a documentation pass. First thing I worked on was structure. I cleaned up the docs layout, moved things toward a more consistent lowercase docs/ tree — I had been trying for so long to do that and I just finally got it to work — and wrote down the documentation process itself so new pages aren’t just floating about. The point was to try and make the docs feel like a book instead of a folder full of unrelated notes. I wrote and checked the language pages for types, functions, and control flow by reading the compiler itself, not by trusting my (poor) memory. That meant checking parser rules, typecheck behavior, codegen boundaries, and example files before writing anything solid. Types especially needed this, given how Flower now has enough real type machinery that the docs can quickly go from being coherent to completely incorrect: nullable sugar, semantic unions, explicit casts after narrowing, alias behavior, current member limits, and the difference between what the language wants to become and what the compiler supports currently. Functions and control flow had a similar issue. I had to document prop , return rules, direct call forms, logical conditions, range-based for , and the rough edges like break and continue not yet being enforced cleanly as loop-only. That kind of thing is small until someone learns the language from the docs and hits the edge head-first (been there, done that). What Now? I’m just going to keep writing docs. Maybe do one devlog for every new doc, or a batch of docs, who knows! I certainly don’t :p
Hey, it’s been a while! I’ve been finding it difficult to stay motivated for this project, especially with how the new payout system works and just my in-general inability to keep commitment despite having a lot of passion. That said, I am going back to working on this diligently, and I think to start I’m going to cut down on the documentation by making perhaps one or two changes, and then going right back to the compiler work. Documentation writing has not been the most fun for me, especially with how long it takes and how it’s so difficult to not only write language reference that works, but also keeping the same whimsy Flower should have. Thank you to everyone who’s been following this journey, and I can’t wait to see y’all later!!! With Love, - Ivy <3
Integer Types, Parser Fixes, and Segfaults! Phew — this one was biiiiiggg. Flower is pretty much just a glorified C transpiler, which is NOT what I want for it! In order to move on, the data has to be handled explicitly by the FloC. So essentially, I implemented i8 , u8 , i16 , u16 , i32 , u32 , i64 , and u64 . For now, int canonically refers to an i32 value. A New Era? With these new literals, the old hoist-sized representation had to go. The decimal source text is preserved, meaning values such as 18446744073709551615 remain after parsing without causing any overflow. Types are picked up from declarations, assignments, function arguments, return values, field writes, array-element writes, * breath in * and binary expressions! Oof, that was a mouthful. That, of course, resulted in proper errors for things like: 256 assigned to u8 −1 assigned to an unsigned type values beyond u64 unconstrained literals outside the default i32 range I Hate Memory During printing, every width is handled. Integer conditions retain existing zero / nonzero behavior, and literal types print their values rather than a character. Halfway through, I ran into sudden segfaults and memory leaks. I was taken aback, because I didn’t even change anything parser related yet. Turns out, I forgot an assignment in a declaration, which apparently the parser wasn’t able to handle (whoops!). Anyways, I fixed it by propagating errors through the compilation process, so the compiler doesn’t try to typecheck or code gen if the parser reports back errors, and instead will print them out. And that’s it! Not that’s it, but that’s all I’m going to explain for now. More specifics available on the GitHub, of course. Speaking of GitHub thank you so much to S1monr3dst0ne07 on GitHub for fixing some memory leaks in the previous version of Flower — I forgot to prune allocations before returning from a function :p Love y’all!! <3 P.S.: So glad I gave up on documentation, I was genuinely dreading workong on the project and that’s why I’ve been ianctive for a long time :c
Integers, Integers, Integers Hello!! Been a while :) Lately I have been working on v1.6. I call it the “Usefullness” update — rhymes with Grug — because it adds a ton of long awaited features and various convenience implementations Flower DESPERATELY needs. For example, currently the progress has to do with v1.6.1, or Fixed-Width Integers . When it comes to systems programming and in-general efficiency, having various integer sizes is important as it provides an additional layer of manual control over memory and sizes. I know I would have to add them eventualy, so why not put them at the start of the Usefulness update?? I’m sure they’ll come in handy later on. What Actually Changed? Well, for starters, there’s now fixed-width integers (yay)! They’re built in types, so you declare them as you would with any other atom / primitive: type Byte = u8 type Choice = Byte | u16 type OptionalByte = ?Byte struct Packet { pair: Byte[2], size: Choice, owner: OptionalByte } A whole bunch of commits and integer-specific changes regarding indices, arity, unions, nullables, etc etc etc have been made, and they all won’t fit here so instead, take a look at the current branch ! What’s In Store? Plenty more features, you can assure yourself! There’s maybe 6 or 7 — I swear — or so commits left for this specific addition, and after that a lot more features laid out in the roadmap for 1.6! As always, thanks for sticking around and watching the fiasco that is this project become more and more estranged with every hour. Love y’all!! Ivy <3
Ships:
Flower is a self-hosted programming language for writing simple, explicit systems code without the abstraction bloat and OOP-heavy direction a lot of modern languages have. The compiler is written in Flower itself, currently targets C, and follows a straightforward pipeline: lexing, parsing, module loading, typechecking, and code generation. Over the past few months, Flower grew from a small lexer/parser/codegen experiment in C into a way bigger language project than I couldv’e imagined. This wasn’t my first attempt at a language, but it has been my favorite! I implemented compiler-enforced module semantics, stronger type-aware codegen, real boolean support, real string support, and a small standard library foundation. Strings now have equality, .length, indexing, and explicit casts to and from @char , while modules support exported prop declarations, aliases as namespaces, and private-by-default top-level declarations. The hardest part was bootstrap stability. I ran into idempotency failures, parser edge cases, compiler corruption scares, and plenty of my own bad logic. A lot of the challenge was getting new features to work not just once, but consistently enough for the compiler to rebuild itself cleanly. One bootstrap it succeeds, and then the next I’m scrambling to figure out why the new binary executable has a corrupted parser despite just working (Still haven’t fixed that yet! It.. was really confusing and I’ve got no clue why it happened lol). I’m proud that I kept pushing through that and ended up with something much more fun to use than where I started — I mean, I don’t even have to write that much C anymore!! If people want to test Flower, the important thing to know is that it is self-hosted and still experimental, but it does work. The repo includes a bootstrap path, a test suite, and example programs covering types, control flow, memory, imports, strings, and bools. The current release is focused on making the core language feel real and usable before moving on to a larger standard library and a future non-C backend, so don’t be surprised if a C file is shoved in your face!
The compiler is written in Flower itself and currently targets C, so this release was mostly geared towards making the type system have actual Flower semantics instead of a thin little blanket over whatever the backend happened to be doing. The big additions in v1.4 were: transparent type aliases real null nullable types as ?T == T | null semantic unions like int | string explicit narrowing with is explicit extraction with as That support now works across locals, parameters, return types, struct fields, and stable field-expression chains. The work had to touch parser logic, typecheck, narrowing, lowering, codegen, bootstrap, and then all the weird regressions those changes politely dragged into the room. It was.. a process for sure What I’m most proud of is that v1.4 pushed Flower toward a clearer identity that wasn’t defined by C as much anymore. This release also brought the docs back in line with the compiler, which was LONGGGGG overdue. If you want to test it, the main things to look at are the Better Types examples and the self-hosting flow. The compiler should bootstrap cleanly, the test suite should pass, and the examples now cover aliases, nullable values, semantic unions, inference, and struct/field narrowing behavior. For those who will be testing it, DO NOTE that I develop exclusively on my MacBook which is a UNIX system! I do not have the ability to properly develop and provide releases for Linux-specificalities or non-POSIX systems. I’m extremely sorry for this, but alternatively watch the provided video to see Flower in action :) If you’re not able to test it, watch this short (crappy) video instead: https://youtube.com/shorts/DyPtIru6cjY?feature=share...
|
1792983049.3420923
|
1793069449.3420923
|
|
25986
|
Katnip by @b1j2754 | Stardance
|
b1j2754
|
2
|
80.41
|
1182
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-11T09:31:56Z", "hours": 37.0, "multiplier": 19.83, "payout": 741, "blessing": "neutral", "text": "Katnip. For real this time. From text -> blocks. It now exists. Fully type-checked. Powerful enums. Function returns. And it all compiles into scratch. Over the past 36 hours I have worked on making the IR and Codegen layers come to life. From working with stacks, and other more complex algorithms, hoisting, scopes, and everything in between, It now compiles. Katnip is a language designed to not just be a surragate for scratch syntax, its supposed to fix it, and offer a scripting alternative. Gone are the days of wrong data types, debugging random lines, Katnip can do that for you. Types and bugs are well defined, and easy to find. To use this project, I currently do not have a website, but install it through NPM: https://www.npmjs.com/package/@katnip-org/compiler npm i @katnip-org/compiler Happy coding :P", "repo": "https://github.com/Katnip-org/Katnip/", "demo": "https://www.npmjs.com/package/@katnip-org/compiler"}, {"ship_num": 2, "ts": "2026-07-06T22:46:43Z", "hours": 25.0, "multiplier": 19.56, "payout": 441, "blessing": "neutral", "text": "I made the semantic analysis portion to a custom coding language for scratch. It aims to bridge the gap for kids between code blocks and real scripting. It has full type safety, and a variety of different language components, creating a rich and immersive transition from scratch into the real world of programming. It has both simple syntax but also allows a high skill ceiling with more complex syntax. I struggled a lot, spending hours on end chatting with programmers I am friends with, crafting a lot of these language decisions in late night chats. Every single step has been deliberately taken. I am proud of the consistency and quality of the code I wrote. I feel proud to have made this section, and hope that by shipping (and hopefully the community receiving it well) I will be able to continue forwards to finishing the IR and code gen. Since there isn’t a best way to use a programming language, I suggest both installing the npm package and the vscode extension (search ‘Katnip’ in the store). This will give you in-editor syntax highlighting and typechecking. Feel free to use the cli for lexing, parsing, and type checking.", "repo": "https://github.com/Katnip-org/Katnip/", "demo": "https://www.npmjs.com/package/@katnip-org/compiler"}]...
|
[{"post_id": 63302, "ts": "202 [{"post_id": 63302, "ts": "2026-09-07T01:41:07Z", "hours": 4.3019, "text": "Sigma Peak Editor Frfr The editor is turning out beautifully . Like I love it so far. Tons and tons of improvements to mainly the editor, but a few pivotal improvements to the compiler itself. Website / GUI Improvements File uploads — no longer are your costumes handwritten svgs :P AND you can import .knip files! QOL improvements — draggable files, auto-focus editor on openning of website Terminal prettification STAGE BUTTONS! — start / pause / stop + TurboMode Flag functionality rework click => compile + run shift+click => run without compiling Settings file actually does something Compiler improvements Costumes implementation (new syntax!) Forever block + more math blocks! Zip compression level compiler flag"}, {"post_id": 62117, "ts": "2026-09-05T11:32:11Z", "hours": 5.4575, "text": "Costumes + Sounds! Finally, after a long time of putting this off, Katnip finally has syntax to import sounds and assets to use for your projects! stage { costume \"./sky.svg\"; events.onFlag() { looks.switchBackdrop(\"sky\"); } } sprite Cat { costume \"./cat.svg\" as idle; costume \"./cat-blink.svg\" as blink; sound \"./meow.wav\"; events.onFlag() { motion.goTo(-100, 0); looks.switchCostume(\"idle\"); looks.say(\"costumes + sounds work\", 2); forever { wait(0.5); looks.nextCostume(); } } } Changelog Compiler changes Added costume and sound keywords Added stage keyword for stage override (previously auto-gen’d) Added forever keyword (cuz I forgot to add it somehow) Website changes Added upload icon for uploading files Added support for the new costume and sound required fs callbacks Added “rename” in dropdown right-click context Notes Not sure how the forever block and rename button took this long to add, both seem like something I could’ve adressed earlier, but—better late than never :P"}, {"post_id": 55346, "ts": "2026-08-27T03:01:18Z", "hours": 4.2003, "text": "Fleshing out the GUI Finally got a working prototype! Check it out at https://katnip.org Components added: Stage This was honestly a pretty hard part of the process. I am using tw-scaffolding, the core vm from TurboWarp. But it has no types, no docs, and the docs that exist are outdated. So I resorted to having Claude make a .d.ts file for me so I could fuzz my way through instead. This process wasn’t that bad once the functions were clear, and I hooked it up to my compiler—intentionally designed to output Uint8Array. Toolbar This was fun since I don’t know svelte yet that well. I had a state originally stored in my state.svelte.ts, but I figure out I could refactor and not need it. Then I just did some vm tomfoolery to ensure the threads stay open on pausing, and it was good to go. Terminal This is a super rudamentry approach. I plan to have an input method at some point, but we will see. Hopefully I implement a better technique, currently I just have a string array storing the logs. Makes it easy to make it stateful in svelte ig"}, {"post_id": 53486, "ts": "2026-08-24T01:41:19Z", "hours": 4.4464, "text": "Katnip GUI!!! Ahhhh im so excited. I’m building the gui for Katnip right now—built off a small foundation done by a friend. Currently repo is private, but I’ll open it once my computer’s not about to die and I’m on stable internet. Worked on the following things: Re-binding TextMate grammar tokens File editor popup TurboWarp scaffolding library for the running Pulling in my compiler through npm for compilation"}, {"post_id": 44833, "ts": "2026-08-10T21:09:24Z", "hours": 3.1028, "text": "Yikes. So this is a step I didn’t really want to take. I had to take away a part of the language that I always wanted to exist. The existence of the temp keyword. I mean this thing was literally covering my demos and other scripts in the docs and whatnot. But alas, it was not properly implemented, and I have no forseeable good solution to working it out. So its removed for the time being. Brighter note On the flipside, I did finalize and fully implement zip , enumerate , and range ! These functions now properly parse the list arguments and let tuple unpacking do its amazing goodness."}, {"post_id": 44242, "ts": "2026-08-09T21:24:44Z", "hours": 4.6969, "text": "Cooking up straight peak Great new features. Genuinely super cool. This new bout of progress that led to end-to-end compilation has given me so much motivation. Enums So, this already existed. But I realized that they are so much more than just a way to create states to check against, or store values in. Ever since I allowed scalar values to be the represenation of enum members, this has become more powerful than I realized. The key was implementing the type interpretation of an enum. I already was kind of doing this, but when you have an input param for a function, you can assign a type of enum FlowerType for instance. So the input only accepts FlowerType.x where x is the type. But thats long. Look at a function call: sniff(FlowerType.DAFFODIL, backup = FlowerType.ROSE); Instead, I like what typescript does with its discriminant types, allowing a type to represent a set of possible values. So, it was born. sniff(\"daffodil\", backup = \"rose\"); In order to use this, just assign values to your enum: enum FlowerType { DAFFODIL = \"daffodil\", ROSE = \"rose\", ... } STDLib improvements Prior, a lot of stuff including type casting was a mess. I just recently got this up and running, so it was hard to even try to think about this. Scratch only has a few types: round and angled and block. Thats it. And types really only apply to round/angled. So I implemented small blocks that allow scratch’s oddities and allow you to tell the compiler to “shut up”. Want to get the string of a bool? No problem. looks.say( Str(var == 2) + \"apple\") And many many other use cases. Made some marginal improvements to the CLI to allow parsing Made some commands to run with command pallete for the vscode ext"}, {"post_id": 43872, "ts": "2026-08-09T10:04:26Z", "hours": 8.3239, "text": "Holy Guacamole I’m So Excited Insane progress over the past few days has occurred, in large part due to my travels on train, and my apparent ability to lock in when I start seeing things. Codegen Probably the most recognizable part of the project, Katnip can now generate scratch code. Blocks are being made, and complex patterns written in the IR are finally revealing themselves. It is so important that you look at the pictures, as the improvements made here are hard to put into words. Writing this part was arguably the most fun part of the entire project. This part was more scratch-like than any other part so far (“well duh, its the closest stage” you might be saying. And you’d be right.) IR Writing a majority did not come without its need for the IR to step up its game. I was quite fed up with 0 visual progress, so I jumped to codegen to boost my morale for the improvements made to the IR. This includes dict and list slicing, and a proper handling of booleans. I’m so excited"}, {"post_id": 41989, "ts": "2026-08-06T15:08:47Z", "hours": 9.1267, "text": "The light I can see it… (what is it?) … the light at the end of the tunnel… (what are you talking about?) .. its almost here Yea no it ain’t Though the project isn’t done, I will admit I am nearing the closing moments of the IR stage, with only 1 last hurdle to overcome before I can transpile projects beginning -> end . Here’s a small overview of what’s been done in the last two weeks (nah who am I kidding its all last night, I haven’t touched this in a bit) Procedures Katnip is scratch. Kinda. It transpiles to scratch. So it needs procedures. I took a giant bite out of the huge problem that is procedures. It is very complex to try and emulate a return system in a program that just doesn’t support it. Having taken a DSA class, this was a problem that I took to paper, and got the following solution: Stacks are beautiful. Let me elaborate. A stack is a structure that follows FiLo , or first-in, last-out . This is super important for returning from procedures, when considering the fact that a single variable will not be enough for systems when/if the function recurses. So this way, you push and pop on the stack to keep the order, and all return values are kept track of nicely! Mangled vars. Scope is a really hard concept to grasp, but even harder to emulate in a non-scoped language. For the most part, I want to keep Scratch’s inherent scope-less design, in the sense that variables can exist in similar ways. But I do want scopes. So I take back the before-last sentence. To do this, I mangle vars, allowing scopes to exist, multiple instances of the same code to run, and to have variables not collide. For loops A smaller sections, but still cool. A for loop in scratch is a hidden–but supported–block. You can only iterate a variable, lets call it x , from 1..y inclusive, where y is the max range. So for lists, this means lowering this: for (x, myList) { looks.say(x); } into this: for (x, listLength(myList)) { x = myList[x]; looks.say(x); } Additionally, if doing a range function like this: for (x, range(4, 10, 2)) { looks.say(x); } it lowers into this: for (x, 3) { x = x * 2 + 4; looks.say(x); }"}, {"post_id": 32049, "ts": "2026-07-20T22:44:57Z", "hours": 6.3789, "text": "Project depth increase Retrospectively, this probably should’ve been multiple seperate posts. But I forgot. Again. Return statements For compiling to scratch, a variety of different appracohes have been done. Personally, these fall under a few distinct approaches: variable and list. Variable is simply setting a variable to the output, whereas a list is just a stack following LiFo rules. A variable should be used for single value, non-recursive functions. It’s pretty naive actually. The better alternative way is to use a stack, in which you push and pop from it. This way, you know the exact offset that correlates to the return value in recursive functions. The stack also allows for easy nesting of functions next to each other, like foo(1, 2) + foo(3, 4) , which is only possible in variable form with temporary vars. Vscode Autocomplete Less said here, but this was actually pretty simple. I just ran some regex to get all the identifiers, and then seperated them by type. Pretty rudamentry, but nice. Scratch Defs This was a huge first step in the IR design. Basically, I need a good way of storing metadata. Inventing whole new katnip syntax for this would: a. Look bad, but also b. Be horrible to implement So I wrote a typescript file that takes care of the json metadata, allowing only rudamentry tags and opcode to be stored in Katnip portion. Imports This was a fun portion to tackle. Because I am targeting 3 deployments: vsc, cli, and web, I need a design that covers all 3. A friend suggested callbacks. This allows me to assume the user will define a function that allows filesystem interactions, without me touching a thing. So all I did was bring in the code from the imported file, and ran compilation over it too. I pulled it in during the semantic analysis phase as that was the correct timing; after verifying the import statement; before the codegen. Structs Lots of deliberation occured here. It was very crucial to implement this, personally, because I use this type of feature (self-implemented, each time) in scratch. It always felt like a thing that I needed. I was torn between strided and parallel list storage for the pieces of it. Strided was cool, and was more efficient with space and project list bloat, but in the end parallel lists were just SO much cleaner."}, {"post_id": 29545, "ts": "2026-07-16T15:27:53Z", "hours": 5.7258, "text": "Bugfixes + webprep This will be a shorter devlog, because, though there is a lot of time logged, much of this was just troubleshooting the few things I was adding. Bugfixes: In the lexer, there existed some issues with my fsm, and the way I processed escaped characters Added some protections in the parser instead of semantic analysis so enforcement was throurough and non-manual Webprep: Removed external dependencies that only npm could run. This enabled the beginning of development of a web editor gui by my friend in Svelte Rewrote dependencies and npm-specific stuff to my npm-agnostic, using my own implementations (mostly just pico-colors tbh) The photo attached is it showing how another runtime (in this example, bun) can run the project that originally only worked with npm."}, {"post_id": 23783, "ts": "2026-07-06T22:36:35Z", "hours": 1.3239, "text": "Getting ready! Getting ready to ship the semantic analysis. General config stuff, npm registry, vsc ext, open vsx, all those fun things. https://www.npmjs.com/package/@katnip-org/compiler https://marketplace.visualstudio.com/items?itemName=Katnip-org.katnip-vscode https://open-vsx.org/extension/Katnip-org/katnip-vscode"}, {"post_id": 23347, "ts": "2026-07-06T07:47:42Z", "hours": 11.2783, "text": "Phase 2 complete (plus a lil extra) Phase 2 Function overloads This was an interesting task to take on. I had to first figure out how to match a function’s signiture to its call. I couldn’t simply check if a signiture existed or not, I had to check which variation it satisfied. This involved reworking the way I stored signitures, and allowed a single object to hold them all for a certain function name. This way, it was a lot cleaner and put together. STDLIB After working through the project, I realized that I needed a way to define the primitive blocks used in Scratch. I didn’t think adding them in as a Typescript object was elegant, and it definently wasn’t extendable. Instead, I opted to expand the language syntax to allow generics, and therefore enable modular and clean code in the form of a katnip-defined STDLib. Katnip LSP This section is less in depth, because the setup wasn’t as hard. I look up some docs, and most of it was drag and drop. There exists a single file for defining the regex expressions with which to color the words on the page, and then I connected my error reporter to the lsp’s standard error reporter to further enhance the experience. Every 300ms or so, it updates, and tells the user where the errors are, just like any other language supported in text editors."}, {"post_id": 18873, "ts": "2026-06-30T02:11:27Z", "hours": 4.7678, "text": "Almost completed phase 2 of the Semantic Analysis Today I built a wide variety of things. But 3 specific features. visit(node: StatementNode): void This function parses all of my nodes. It covers variable assignment, sprite declaration, etc etc. It has many jobs, including entering scopes, declaring bodies, and following each AST-node stack recursively. Some are left stubbed out, as I spent most of my time on #2: inferType(expression: ExpressionNode): InternalType This function is ~200loc. It covers a wide variety of cases, all pertaining to the type inference of an expression AST. It not only infers the type, but recursively builds an internal model of what the user has written. So a type of list<dict<num, str>> becomes the stored internal representation of: { kind : \" list \" , element : { kind : \" dict \" , key : { kind : \" primitive \" , name : \" num \" }, value : { kind : \" primitive \" , name : \" str \" } } } Though it is a lot more complex than that, that’s what it boils down to. And lots and lots and lots of error statements. InternalTypes itself I built a system that stores the type state, with a few extra helper functions: isAssignable and typeToString. The former recursively traces both types and ensures total match. This means that a variable of type to could be assigned to a value of type from . The latter is just a pretty-print function for pretty errors to see what types were being looked at/expected at certain parts of the code."}, {"post_id": 17300, "ts": "2026-06-28T00:56:35Z", "hours": 3.6656, "text": "Finished phase 1 of the Semantic Analysis Implemented Scope-Analysis checks. It can correctly identify and point out issues with scopes. It understands a variety of different scopes, from for-loops to functions to Sprites. Also added support for switch-statements. Importantly, I chose to force only 1 default, and force it to be only at the end. I also implemented true and false as a new Boolean primitive type, alongside a true return statement"}, {"post_id": 16732, "ts": "2026-06-27T05:49:23Z", "hours": 2.8311, "text": "2. Building Semantic Analysis This will be shorter, since most of what I say is better just written in code. The main idea is two passes: Hoist Bring procedures to the top to allow forward references. I explain why I did so above. Visit Acctually go through and validate. This is the main core bit of the semantic analysis portion. I am a little stuck at a desgin fork. Should I allow scripts inside no ‘Sprite’ Scope to be there? Or should I force them into the Stage. Or do I error? Scratch-like behaviors tell me that it should go to stage, but that feels tacky and wrong. Can functions be public? I think so. Can’t be temp. Need to make start and end possibly null Make function be able to be public/private. Assumed private Everything at the root of a file should be invalidated. The space should be reserved for imports, functions, global stuff. Overall, I worked on building semantic analysis, at least the basic parts. I added variable decleration handling in scopes, and all of expressionstatement parsing."}, {"post_id": 16096, "ts": "2026-06-26T05:23:16Z", "hours": 1.1658, "text": "Semantic Analysis Planning Currently trying to think about how best to implement semantic analysis. I can’t lie, I am just getting back into this project, so I am rediscovering what I had previously written.I guess I have to start at the beginning. What is semantic analysis? Type Checking Operations need to be with compatible data types One note to myself here is that I have reserved functions because it’s Scratch, so those need to have a designed store for their types2. Scope Resolution Make sure variables and functions are designed in the right parts of code I think this will cover imports too, but its worth thinking about Undeclared and redeclared variable checks Function Call Validation I’ll have to go back and check if I accidentally covered that in the parser, but I believe this should go here Flow Control Switch case validations, make sure fall through keywords and default cases etc. are all in valid places5. Reserved Keyword Check if variable and functions defined are conflicting with Katnip’s First I’m going to do symbol collection and scope resolution. One important nuance I discovered was whether or not to enforce scope declaration. Should there be an inferred scope? In Scratch, this inferred scope is mostly ‘Public’, as variables are shared across sprites. However, I think I am going to flip this, as it feels wrong to teach the user that variables work across sprites. Thought dump: ‘Private’ kward can’t be used at root level (stage). Can’t be used as modifier for sprite either, tho neither should any modifier. Scope-less definitions are okay. Scratch does this, just opposite of me. I am going to raise function declarations so that they can be referenced before making. Requires 2 passes, but seems simpler and more intuitive in my opinion. I am going to allow function overloading. It seems useful, and I like the way Java does it."}]...
|
Title: Katnip by @b1j2754 | Stardance
Devlogs:
Se Title: Katnip by @b1j2754 | Stardance
Devlogs:
Semantic Analysis Planning Currently trying to think about how best to implement semantic analysis. I can’t lie, I am just getting back into this project, so I am rediscovering what I had previously written.I guess I have to start at the beginning. What is semantic analysis? Type Checking Operations need to be with compatible data types One note to myself here is that I have reserved functions because it’s Scratch, so those need to have a designed store for their types2. Scope Resolution Make sure variables and functions are designed in the right parts of code I think this will cover imports too, but its worth thinking about Undeclared and redeclared variable checks Function Call Validation I’ll have to go back and check if I accidentally covered that in the parser, but I believe this should go here Flow Control Switch case validations, make sure fall through keywords and default cases etc. are all in valid places5. Reserved Keyword Check if variable and functions defined are conflicting with Katnip’s First I’m going to do symbol collection and scope resolution. One important nuance I discovered was whether or not to enforce scope declaration. Should there be an inferred scope? In Scratch, this inferred scope is mostly ‘Public’, as variables are shared across sprites. However, I think I am going to flip this, as it feels wrong to teach the user that variables work across sprites. Thought dump: ‘Private’ kward can’t be used at root level (stage). Can’t be used as modifier for sprite either, tho neither should any modifier. Scope-less definitions are okay. Scratch does this, just opposite of me. I am going to raise function declarations so that they can be referenced before making. Requires 2 passes, but seems simpler and more intuitive in my opinion. I am going to allow function overloading. It seems useful, and I like the way Java does it.
2. Building Semantic Analysis This will be shorter, since most of what I say is better just written in code. The main idea is two passes: Hoist Bring procedures to the top to allow forward references. I explain why I did so above. Visit Acctually go through and validate. This is the main core bit of the semantic analysis portion. I am a little stuck at a desgin fork. Should I allow scripts inside no ‘Sprite’ Scope to be there? Or should I force them into the Stage. Or do I error? Scratch-like behaviors tell me that it should go to stage, but that feels tacky and wrong. Can functions be public? I think so. Can’t be temp. Need to make start and end possibly null Make function be able to be public/private. Assumed private Everything at the root of a file should be invalidated. The space should be reserved for imports, functions, global stuff. Overall, I worked on building semantic analysis, at least the basic parts. I added variable decleration handling in scopes, and all of expressionstatement parsing.
Finished phase 1 of the Semantic Analysis Implemented Scope-Analysis checks. It can correctly identify and point out issues with scopes. It understands a variety of different scopes, from for-loops to functions to Sprites. Also added support for switch-statements. Importantly, I chose to force only 1 default, and force it to be only at the end. I also implemented true and false as a new Boolean primitive type, alongside a true return statement
Almost completed phase 2 of the Semantic Analysis Today I built a wide variety of things. But 3 specific features. visit(node: StatementNode): void This function parses all of my nodes. It covers variable assignment, sprite declaration, etc etc. It has many jobs, including entering scopes, declaring bodies, and following each AST-node stack recursively. Some are left stubbed out, as I spent most of my time on #2: inferType(expression: ExpressionNode): InternalType This function is ~200loc. It covers a wide variety of cases, all pertaining to the type inference of an expression AST. It not only infers the type, but recursively builds an internal model of what the user has written. So a type of list<dict<num, str>> becomes the stored internal representation of: { kind : " list " , element : { kind : " dict " , key : { kind : " primitive " , name : " num " }, value : { kind : " primitive " , name : " str " } } } Though it is a lot more complex than that, that’s what it boils down to. And lots and lots and lots of error statements. InternalTypes itself I built a system that stores the type state, with a few extra helper functions: isAssignable and typeToString. The former recursively traces both types and ensures total match. This means that a variable of type to could be assigned to a value of type from . The latter is just a pretty-print function for pretty errors to see what types were being looked at/expected at certain parts of the code.
Phase 2 complete (plus a lil extra) Phase 2 Function overloads This was an interesting task to take on. I had to first figure out how to match a function’s signiture to its call. I couldn’t simply check if a signiture existed or not, I had to check which variation it satisfied. This involved reworking the way I stored signitures, and allowed a single object to hold them all for a certain function name. This way, it was a lot cleaner and put together. STDLIB After working through the project, I realized that I needed a way to define the primitive blocks used in Scratch. I didn’t think adding them in as a Typescript object was elegant, and it definently wasn’t extendable. Instead, I opted to expand the language syntax to allow generics, and therefore enable modular and clean code in the form of a katnip-defined STDLib. Katnip LSP This section is less in depth, because the setup wasn’t as hard. I look up some docs, and most of it was drag and drop. There exists a single file for defining the regex expressions with which to color the words on the page, and then I connected my error reporter to the lsp’s standard error reporter to further enhance the experience. Every 300ms or so, it updates, and tells the user where the errors are, just like any other language supported in text editors.
Getting ready! Getting ready to ship the semantic analysis. General config stuff, npm registry, vsc ext, open vsx, all those fun things. https://www.npmjs.com/package/@katnip-org/compiler https://marketplace.visualstudio.com/items?itemName=Katnip-org.katnip-vscode https://open-vsx.org/extension/Katnip-org/katnip-vscode
Bugfixes + webprep This will be a shorter devlog, because, though there is a lot of time logged, much of this was just troubleshooting the few things I was adding. Bugfixes: In the lexer, there existed some issues with my fsm, and the way I processed escaped characters Added some protections in the parser instead of semantic analysis so enforcement was throurough and non-manual Webprep: Removed external dependencies that only npm could run. This enabled the beginning of development of a web editor gui by my friend in Svelte Rewrote dependencies and npm-specific stuff to my npm-agnostic, using my own implementations (mostly just pico-colors tbh) The photo attached is it showing how another runtime (in this example, bun) can run the project that originally only worked with npm.
Project depth increase Retrospectively, this probably should’ve been multiple seperate posts. But I forgot. Again. Return statements For compiling to scratch, a variety of different appracohes have been done. Personally, these fall under a few distinct approaches: variable and list. Variable is simply setting a variable to the output, whereas a list is just a stack following LiFo rules. A variable should be used for single value, non-recursive functions. It’s pretty naive actually. The better alternative way is to use a stack, in which you push and pop from it. This way, you know the exact offset that correlates to the return value in recursive functions. The stack also allows for easy nesting of functions next to each other, like foo(1, 2) + foo(3, 4) , which is only possible in variable form with temporary vars. Vscode Autocomplete Less said here, but this was actually pretty simple. I just ran some regex to get all the identifiers, and then seperated them by type. Pretty rudamentry, but nice. Scratch Defs This was a huge first step in the IR design. Basically, I need a good way of storing metadata. Inventing whole new katnip syntax for this would: a. Look bad, but also b. Be horrible to implement So I wrote a typescript file that takes care of the json metadata, allowing only rudamentry tags and opcode to be stored in Katnip portion. Imports This was a fun portion to tackle. Because I am targeting 3 deployments: vsc, cli, and web, I need a design that covers all 3. A friend suggested callbacks. This allows me to assume the user will define a function that allows filesystem interactions, without me touching a thing. So all I did was bring in the code from the imported file, and ran compilation over it too. I pulled it in during the semantic analysis phase as that was the correct timing; after verifying the import statement; before the codegen. Structs Lots of deliberation occured here. It was very crucial to implement this, personally, because I use this type of feature (self-implemented, each time) in scratch. It always felt like a thing that I needed. I was torn between strided and parallel list storage for the pieces of it. Strided was cool, and was more efficient with space and project list bloat, but in the end parallel lists were just SO much cleaner.
The light I can see it… (what is it?) … the light at the end of the tunnel… (what are you talking about?) .. its almost here Yea no it ain’t Though the project isn’t done, I will admit I am nearing the closing moments of the IR stage, with only 1 last hurdle to overcome before I can transpile projects beginning -> end . Here’s a small overview of what’s been done in the last two weeks (nah who am I kidding its all last night, I haven’t touched this in a bit) Procedures Katnip is scratch. Kinda. It transpiles to scratch. So it needs procedures. I took a giant bite out of the huge problem that is procedures. It is very complex to try and emulate a return system in a program that just doesn’t support it. Having taken a DSA class, this was a problem that I took to paper, and got the following solution: Stacks are beautiful. Let me elaborate. A stack is a structure that follows FiLo , or first-in, last-out . This is super important for returning from procedures, when considering the fact that a single variable will not be enough for systems when/if the function recurses. So this way, you push and pop on the stack to keep the order, and all return values are kept track of nicely! Mangled vars. Scope is a really hard concept to grasp, but even harder to emulate in a non-scoped language. For the most part, I want to keep Scratch’s inherent scope-less design, in the sense that variables can exist in similar ways. But I do want scopes. So I take back the before-last sentence. To do this, I mangle vars, allowing scopes to exist, multiple instances of the same code to run, and to have variables not collide. For loops A smaller sections, but still cool. A for loop in scratch is a hidden–but supported–block. You can only iterate a variable, lets call it x , from 1..y inclusive, where y is the max range. So for lists, this means lowering this: for (x, myList) { looks.say(x); } into this: for (x, listLength(myList)) { x = myList[x]; looks.say(x); } Additionally, if doing a range function like this: for (x, range(4, 10, 2)) { looks.say(x); } it lowers into this: for (x, 3) { x = x * 2 + 4; looks.say(x); }
Holy Guacamole I’m So Excited Insane progress over the past few days has occurred, in large part due to my travels on train, and my apparent ability to lock in when I start seeing things. Codegen Probably the most recognizable part of the project, Katnip can now generate scratch code. Blocks are being made, and complex patterns written in the IR are finally revealing themselves. It is so important that you look at the pictures, as the improvements made here are hard to put into words. Writing this part was arguably the most fun part of the entire project. This part was more scratch-like than any other part so far (“well duh, its the closest stage” you might be saying. And you’d be right.) IR Writing a majority did not come without its need for the IR to step up its game. I was quite fed up with 0 visual progress, so I jumped to codegen to boost my morale for the improvements made to the IR. This includes dict and list slicing, and a proper handling of booleans. I’m so excited
Cooking up straight peak Great new features. Genuinely super cool. This new bout of progress that led to end-to-end compilation has given me so much motivation. Enums So, this already existed. But I realized that they are so much more than just a way to create states to check against, or store values in. Ever since I allowed scalar values to be the represenation of enum members, this has become more powerful than I realized. The key was implementing the type interpretation of an enum. I already was kind of doing this, but when you have an input param for a function, you can assign a type of enum FlowerType for instance. So the input only accepts FlowerType.x where x is the type. But thats long. Look at a function call: sniff(FlowerType.DAFFODIL, backup = FlowerType.ROSE); Instead, I like what typescript does with its discriminant types, allowing a type to represent a set of possible values. So, it was born. sniff("daffodil", backup = "rose"); In order to use this, just assign values to your enum: enum FlowerType { DAFFODIL = "daffodil", ROSE = "rose", ... } STDLib improvements Prior, a lot of stuff including type casting was a mess. I just recently got this up and running, so it was hard to even try to think about this. Scratch only has a few types: round and angled and block. Thats it. And types really only apply to round/angled. So I implemented small blocks that allow scratch’s oddities and allow you to tell the compiler to “shut up”. Want to get the string of a bool? No problem. looks.say( Str(var == 2) + "apple") And many many other use cases. Made some marginal improvements to the CLI to allow parsing Made some commands to run with command pallete for the vscode ext
Yikes. So this is a step I didn’t really want to take. I had to take away a part of the language that I always wanted to exist. The existence of the temp keyword. I mean this thing was literally covering my demos and other scripts in the docs and whatnot. But alas, it was not properly implemented, and I have no forseeable good solution to working it out. So its removed for the time being. Brighter note On the flipside, I did finalize and fully implement zip , enumerate , and range ! These functions now properly parse the list arguments and let tuple unpacking do its amazing goodness.
Katnip GUI!!! Ahhhh im so excited. I’m building the gui for Katnip right now—built off a small foundation done by a friend. Currently repo is private, but I’ll open it once my computer’s not about to die and I’m on stable internet. Worked on the following things: Re-binding TextMate grammar tokens File editor popup TurboWarp scaffolding library for the running Pulling in my compiler through npm for compilation
Fleshing out the GUI Finally got a working prototype! Check it out at https://katnip.org Components added: Stage This was honestly a pretty hard part of the process. I am using tw-scaffolding, the core vm from TurboWarp. But it has no types, no docs, and the docs that exist are outdated. So I resorted to having Claude make a .d.ts file for me so I could fuzz my way through instead. This process wasn’t that bad once the functions were clear, and I hooked it up to my compiler—intentionally designed to output Uint8Array. Toolbar This was fun since I don’t know svelte yet that well. I had a state originally stored in my state.svelte.ts, but I figure out I could refactor and not need it. Then I just did some vm tomfoolery to ensure the threads stay open on pausing, and it was good to go. Terminal This is a super rudamentry approach. I plan to have an input method at some point, but we will see. Hopefully I implement a better technique, currently I just have a string array storing the logs. Makes it easy to make it stateful in svelte ig
Costumes + Sounds! Finally, after a long time of putting this off, Katnip finally has syntax to import sounds and assets to use for your projects! stage { costume "./sky.svg"; events.onFlag() { looks.switchBackdrop("sky"); } } sprite Cat { costume "./cat.svg" as idle; costume "./cat-blink.svg" as blink; sound "./meow.wav"; events.onFlag() { motion.goTo(-100, 0); looks.switchCostume("idle"); looks.say("costumes + sounds work", 2); forever { wait(0.5); looks.nextCostume(); } } } Changelog Compiler changes Added costume and sound keywords Added stage keyword for stage override (previously auto-gen’d) Added forever keyword (cuz I forgot to add it somehow) Website changes Added upload icon for uploading files Added support for the new costume and sound required fs callbacks Added “rename” in dropdown right-click context Notes Not sure how the forever block and rename button took this long to add, both seem like something I could’ve adressed earlier, but—better late than never :P
Sigma Peak Editor Frfr The editor is turning out beautifully . Like I love it so far. Tons and tons of improvements to mainly the editor, but a few pivotal improvements to the compiler itself. Website / GUI Improvements File uploads — no longer are your costumes handwritten svgs :P AND you can import .knip files! QOL improvements — draggable files, auto-focus editor on openning of website Terminal prettification STAGE BUTTONS! — start / pause / stop + TurboMode Flag functionality rework click => compile + run shift+click => run without compiling Settings file actually does something Compiler improvements Costumes implementation (new syntax!) Forever block + more math blocks! Zip compression level compiler flag
Ships:
I made the semantic analysis portion to a custom coding language for scratch. It aims to bridge the gap for kids between code blocks and real scripting. It has full type safety, and a variety of different language components, creating a rich and immersive transition from scratch into the real world of programming. It has both simple syntax but also allows a high skill ceiling with more complex syntax. I struggled a lot, spending hours on end chatting with programmers I am friends with, crafting a lot of these language decisions in late night chats. Every single step has been deliberately taken. I am proud of the consistency and quality of the code I wrote. I feel proud to have made this section, and hope that by shipping (and hopefully the community receiving it well) I will be able to continue forwards to finishing the IR and code gen. Since there isn’t a best way to use a programming language, I suggest both installing the npm package and the vscode extension (search ‘Katnip’ in the store). This will give you in-editor syntax highlighting and typechecking. Feel free to use the cli for lexing, parsing, and type checking.
Katnip. For real this time. From text -> blocks. It now exists. Fully type-checked. Powerful enums. Function returns. And it all compiles into scratch. Over the past 36 hours I have worked on making the IR and Codegen layers come to life. From working with stacks, and other more complex algorithms, hoisting, scopes, and everything in between, It now compiles. Katnip is a language designed to not just be a surragate for scratch syntax, its supposed to fix it, and offer a scripting alternative. Gone are the days of wrong data types, debugging random lines, Katnip can do that for you. Types and bugs are well defined, and easy to find. To use this project, I currently do not have a website, but install it through NPM: https://www.npmjs.com/package/@katnip-org/compiler npm i @katnip-org/compiler Happy coding :P...
|
1792993913.4194849
|
1793080313.4194849
|
|
46463
|
DAEMON by @katopirat | Stardance
|
katopirat
|
1
|
61.0
|
1164
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-22T13:26:15Z", "hours": 61.0, "multiplier": 19.19, "payout": 1164, "blessing": "neutral", "text": "I shipped my game: DAEMON It’s 2am. Your friend is online. He wants you to print something. ⚠ Browser version can lag — grab the Windows build if you can. The game: first-person psychological horror about a 3D printer, a friend who won’t stop messaging you, and an OS that’s a little too honest about what it sees. Built: a real in-game OS — file explorer reading actual disk files, Discord-style chat, mail, terminal, all Windows 95 style over a gritty PSX world. A working 3D printer with its own physics, shader-based print reveal, and sound. Story written entirely in JSON, no code touched for content. Hardest part: never made horror before. Built the whole tech first, had a friend playtest — verdict: not scary. Rebuilt most of the second half because of it. Proud of: the printer, the OS, and the ending — which flips the camera around so you end up watching yourself through the eyes of the thing you built. Stuck? Check “Files” often, especially after a conversation ends.", "repo": "https://github.com/katopirat/DAEMON/", "demo": "https://katopiratgames.itch.io/daemon"}]...
|
[{"post_id": 72194, "ts": "202 [{"post_id": 72194, "ts": "2026-09-22T13:11:43Z", "hours": 6.9956, "text": "THIS IS THE LAST DEVLOG —————————————— finished the ending. you end up seeing everything through a screen from the other side, watching “him” sit down at the desk you’ve been sitting at the whole game. there’s a voice line now too (ElevenLabs), and two different ways it can end depending on what you do in the terminal went through and fixed a genuinely embarrassing bug where photos silently failed to save on a fresh install because the folder never existed. found it the hard way, glad I caught it before shipping it’s live: playable in browser on itch.io, Windows build on GitHub releases this is my last devlog for this one. never made a horror game before this, first version wasn’t scary at all according to a friend, and honestly that stung a bit. rebuilt a good chunk of it because of that. really happy with where it ended up thanks for reading these"}, {"post_id": 70636, "ts": "2026-09-19T14:23:51Z", "hours": 9.4572, "text": "NIGHT 4 IS NOW THE ENDING cut nights 5-6 and made night 4 the finale instead. it’s tighter and actually scarier than the original 6-night plan would’ve been the thing built from the printed pieces finally shows up in the room. it turns its head to look at you if you get close, then the lights flicker and it’s gone. added a proper scare sequence too - see it once through a window, then somewhere else it’s right behind you. screen goes black next: finishing the ending"}, {"post_id": 65332, "ts": "2026-09-10T12:36:07Z", "hours": 9.8781, "text": "NIGHT 3 FINISHED + MAIN MENU + TERMINAL built the main menu and its honestly my fav part. not a boring menu screen but literally ur monitor in the apartment. night 3 u wake up and the 3d printer is ALREADY running even tho u didnt queue anything and a terminal appeared terminal app has 4 commands - help ps clear and kill oh and the printer is making a hand. scaryyyy 👻 and in night 4 the hadn move into a room next to the livingroom next: night 4 - more body parts I’m sorry for the low quality video but it was too large :("}, {"post_id": 61901, "ts": "2026-09-05T02:23:10Z", "hours": 9.3094, "text": "SENDING REAL PHOTOS IN CHAT + SLEEP SYSTEM u can now physically take a pic of the 3d print and it saves to disk. in chat u just open the file explorer and send the actual photo. built a working sleep cycle too. walk to bed camera does a nice eyes-closing fade into a NIGHT 2 screen. so the story actually progresses now instead of just looping the same day forever funniest bug: realized my in game file explorer let u type “/” and browse my actual irl computer files. patched it but for like an hour my horror game had a literal zero day vulnerability lol added proper sound design everywhere. next: writing the story for night 3 + 2since all the tools are finally ready 📝"}, {"post_id": 58703, "ts": "2026-08-31T07:22:56Z", "hours": 7.6203, "text": "DISCORD CLONE + THE HORROR ACTUALLY STARTED built a full discord-style chat app from scratch. typing indicators message bubbles and it looks so sick in the win95 theme also made a win95 mail client . file explorer now reads straight off the real disk so adding content is literally just dropping a file in and the horror system went live. finished a chat, checked my files later, and a text file had silently renamed itself. added a notification sound next: writing the actual story since the skeleton is basically done"}, {"post_id": 52522, "ts": "2026-08-22T17:50:42Z", "hours": 8.6172, "text": "8.5 HOURS LATER: 3D PRINTER WORKS + OS FIXED spent 8.5 solid hours on this and honestly my brain is fried. finally got printhead and hotbed animated with a shader so models build layer by layer. syncing the movement was absolute pain but watching it print is insanely satisfying 🔥 added a bouncy physical print button and a grab system. once it finishes u can actually pick up the printed model as a real physics object finally fixed the annoying stuff: windows got classic win95 headers taskbar has icons and grabbed objects dont clip through walls anymore built a real file explorer reading disk files. It took a long time, but now the file browser reads files directly from the folder on your disk, so when you add a file to the folder, you can open it in the game. opening .stl opens a printer app biggest pain: godots UI anchors for sizing window content. offsets act totally diff depending on edge and nobody warned me >:( next: making the OS cursed. Finally… Maybe… 🥲"}, {"post_id": 48850, "ts": "2026-08-17T12:19:45Z", "hours": 6.9931, "text": "JUST CODED MY FIRST FAKE OS IN GAME 7 hours in and absolutely zero regrets i created my first ingame OS from scratch. I got desktop icons, windows you can drag around, and a working taskbar. never tried anything like this so it was basically a live speedrun of learning biggest win: slapped a free Windows 95 icon pack on it and now it genuinely looks like a legit retro OS instead of just ugly gray boxes also just added a grab mechanic so you can physically pick up objects and spin them around biggest bug: wasted 20 minutes thinking the click logic was broken :( turns out only the icon TEXT was clickable not the actual image lol next up: making the whole OS feel cursed. icons glitching out, files changing their own names. 😈"}, {"post_id": 45669, "ts": "2026-08-12T09:37:29Z", "hours": 1.8022, "text": "So i started a new Project! :) - it will be a first person psychological horror game set in a single apartment. I got a basic first person player movement working first, then i make the appartment from free assets (i thing it’s looking verry good!) and then i added psx style filter , whitch took some fighting to get looking and working right. then i added collisions for all the walls and furniture so the player can’t walk trought anything or escape the apartment, and set ip lighting that’s finaly starting to sell the mood I’m going for."}]...
|
Title: DAEMON by @katopirat | Stardance
Devlogs:
Title: DAEMON by @katopirat | Stardance
Devlogs:
So i started a new Project! :) - it will be a first person psychological horror game set in a single apartment. I got a basic first person player movement working first, then i make the appartment from free assets (i thing it’s looking verry good!) and then i added psx style filter , whitch took some fighting to get looking and working right. then i added collisions for all the walls and furniture so the player can’t walk trought anything or escape the apartment, and set ip lighting that’s finaly starting to sell the mood I’m going for.
JUST CODED MY FIRST FAKE OS IN GAME 7 hours in and absolutely zero regrets i created my first ingame OS from scratch. I got desktop icons, windows you can drag around, and a working taskbar. never tried anything like this so it was basically a live speedrun of learning biggest win: slapped a free Windows 95 icon pack on it and now it genuinely looks like a legit retro OS instead of just ugly gray boxes also just added a grab mechanic so you can physically pick up objects and spin them around biggest bug: wasted 20 minutes thinking the click logic was broken :( turns out only the icon TEXT was clickable not the actual image lol next up: making the whole OS feel cursed. icons glitching out, files changing their own names. 😈
8.5 HOURS LATER: 3D PRINTER WORKS + OS FIXED spent 8.5 solid hours on this and honestly my brain is fried. finally got printhead and hotbed animated with a shader so models build layer by layer. syncing the movement was absolute pain but watching it print is insanely satisfying 🔥 added a bouncy physical print button and a grab system. once it finishes u can actually pick up the printed model as a real physics object finally fixed the annoying stuff: windows got classic win95 headers taskbar has icons and grabbed objects dont clip through walls anymore built a real file explorer reading disk files. It took a long time, but now the file browser reads files directly from the folder on your disk, so when you add a file to the folder, you can open it in the game. opening .stl opens a printer app biggest pain: godots UI anchors for sizing window content. offsets act totally diff depending on edge and nobody warned me >:( next: making the OS cursed. Finally… Maybe… 🥲
DISCORD CLONE + THE HORROR ACTUALLY STARTED built a full discord-style chat app from scratch. typing indicators message bubbles and it looks so sick in the win95 theme also made a win95 mail client . file explorer now reads straight off the real disk so adding content is literally just dropping a file in and the horror system went live. finished a chat, checked my files later, and a text file had silently renamed itself. added a notification sound next: writing the actual story since the skeleton is basically done
SENDING REAL PHOTOS IN CHAT + SLEEP SYSTEM u can now physically take a pic of the 3d print and it saves to disk. in chat u just open the file explorer and send the actual photo. built a working sleep cycle too. walk to bed camera does a nice eyes-closing fade into a NIGHT 2 screen. so the story actually progresses now instead of just looping the same day forever funniest bug: realized my in game file explorer let u type “/” and browse my actual irl computer files. patched it but for like an hour my horror game had a literal zero day vulnerability lol added proper sound design everywhere. next: writing the story for night 3 + 2since all the tools are finally ready 📝
NIGHT 3 FINISHED + MAIN MENU + TERMINAL built the main menu and its honestly my fav part. not a boring menu screen but literally ur monitor in the apartment. night 3 u wake up and the 3d printer is ALREADY running even tho u didnt queue anything and a terminal appeared terminal app has 4 commands - help ps clear and kill oh and the printer is making a hand. scaryyyy 👻 and in night 4 the hadn move into a room next to the livingroom next: night 4 - more body parts I’m sorry for the low quality video but it was too large :(
NIGHT 4 IS NOW THE ENDING cut nights 5-6 and made night 4 the finale instead. it’s tighter and actually scarier than the original 6-night plan would’ve been the thing built from the printed pieces finally shows up in the room. it turns its head to look at you if you get close, then the lights flicker and it’s gone. added a proper scare sequence too - see it once through a window, then somewhere else it’s right behind you. screen goes black next: finishing the ending
THIS IS THE LAST DEVLOG —————————————— finished the ending. you end up seeing everything through a screen from the other side, watching “him” sit down at the desk you’ve been sitting at the whole game. there’s a voice line now too (ElevenLabs), and two different ways it can end depending on what you do in the terminal went through and fixed a genuinely embarrassing bug where photos silently failed to save on a fresh install because the folder never existed. found it the hard way, glad I caught it before shipping it’s live: playable in browser on itch.io, Windows build on GitHub releases this is my last devlog for this one. never made a horror game before this, first version wasn’t scary at all according to a friend, and honestly that stung a bit. rebuilt a good chunk of it because of that. really happy with where it ended up thanks for reading these
Ships:
I shipped my game: DAEMON It’s 2am. Your friend is online. He wants you to print something. ⚠ Browser version can lag — grab the Windows build if you can. The game: first-person psychological horror about a 3D printer, a friend who won’t stop messaging you, and an OS that’s a little too honest about what it sees. Built: a real in-game OS — file explorer reading actual disk files, Discord-style chat, mail, terminal, all Windows 95 style over a gritty PSX world. A working 3D printer with its own physics, shader-based print reveal, and sound. Story written entirely in JSON, no code touched for content. Hardest part: never made horror before. Built the whole tech first, had a friend playtest — verdict: not scary. Rebuilt most of the second half because of it. Proud of: the printer, the OS, and the ending — which flips the camera around so you end up watching yourself through the eyes of the thing you built. Stuck? Check “Files” often, especially after a conversation ends....
|
1792853717.6976306
|
1792940117.6976306
|
|
43613
|
Stardance Stats by @mixidmb | Stardance
|
mixidmb
|
1
|
58.0
|
1157
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-18T21:20:53Z", "hours": 58.0, "multiplier": 19.81, "payout": 1157, "blessing": "neutral", "text": "Stardance Stats stardancestats.xyz · API docs A better way The best way to browse Stardance. Stardance just shows you a number, and that’s it. No history, no sorting. So I made an app that tracks those numbers. A crawler reads the public pages on a schedule, saves everything, and serves it back as a site and an open API. Global is the whole platform, with tiles you click to chart. People and Projects rank everyone on whatever you pick, with profiles, history, and search. Devlogs is every devlog in one feed, searchable by words included in the body. Ask takes a question in plain English and writes the query for it. The API is open. Every group has a list, a detail, and a /history endpoint for stats over time. curl \"https://api.stardancestats.xyz/v1/projects/2155/history?metrics=likes,devlogs&interval=1d\" Everything worth crawling sits in a queue with a tier. Pages that keep moving get checked hourly; quiet ones drop back. The sitemap misses plenty, so it also walks ID ranges to find what isn’t listed. Python, FastAPI, MongoDB, Svelte, Docker. Star creatures are from Hack Club’s Stardance repo.", "repo": "https://github.com/MIXIDtheSilly/StardanceStats", "demo": "https://stardancestats.xyz"}]...
|
[{"post_id": 49864, "ts": "202 [{"post_id": 49864, "ts": "2026-08-18T20:16:59Z", "hours": 5.5761, "text": "Stardance Stats dev log #9 Ask is done. You type a question in plain English, and a model writes the database query for it. You get a table back, and bars if it makes sense to chart. It only gets to write queries out of a list I picked. No writes, its own read-only database user, a time limit, and a rate limit on how many questions you can ask an hour. If it writes something outside that, it just gets refused. Also made API docs with examples for every endpoint, a README, and a license. There’s a docs button in the sidebar now."}, {"post_id": 49026, "ts": "2026-08-17T16:48:42Z", "hours": 6.3583, "text": "Stardance Stats dev log #8 SDS website is already up! Check it out at https://stardancestats.xyz/ Devlogs page. Every devlog on the site in one feed. Cards with the author, the project, the numbers, the text, and the images or videos. Filter by how recent, sort by newest, likes, comments, or views, or search. Search reads the body. Type “cat” and you get everyone’s cat posts, or put quotes around something to match it exactly. Whatever you searched gets highlighted in the card. Also put the little star creatures around the pages. (the sillies)"}, {"post_id": 47639, "ts": "2026-08-15T17:47:33Z", "hours": 7.6028, "text": "Stardance Stats dev log #7 Projects page is done. Same podium as People but with the banners behind the top three. The list under it includes a thumbnail, the owner, and hours and devlogs in a single row. Buttons to filter to Super Stars or hardware. Click one, and you get everything about a project. Banner, tiles, a chart from 1 to 30 days, every ship, and all the devlogs. Sort them by newest, longest, most liked, most discussed, or most viewed."}, {"post_id": 46577, "ts": "2026-08-13T22:10:26Z", "hours": 5.9692, "text": "Stardance Stats dev log #6 People page: Leaderboard with a podium for the top three; click through to anyone’s profile. Search goes through the API since whoever you’re looking for usually isn’t on the page you’re on. It tries handles that start with what you typed first, then ones that just contain it. Added a blacklist. Some people don’t want to be tracked, so their ID goes in, and everything of theirs gets deleted. Fixed missions. Some pay a fixed amount instead; others go to rating; and none of that shows up as a payout on the page. Now each ship gets credited properly. Also added those silly creatures to the global page."}, {"post_id": 45813, "ts": "2026-08-12T15:17:04Z", "hours": 7.9811, "text": "Stardance Stats dev log #5 (almost done for ship!) Comments. A thread gets queued when its count moves, and they run in their own lane so they don’t starve behind everything else. Deleted ones get marked gone instead of vanishing. I got the shop too. Prices are per region, and the region is just a cookie, so it just grabs the catalogue seven times. That gives you the spread: how much more the same thing costs depending on where you are. Devlogs have their own history now, so you can watch one post’s likes over time. Fixed a demotion bug. Crawling a page more often used to make it go cold faster, which is backwards. Now it just checks how long it’s actually been quiet. Frontend started too. One page with the totals and a chart. The rest of the tabs are greyed out. And that’s what I’m going to be working on right now."}, {"post_id": 43999, "ts": "2026-08-09T14:17:47Z", "hours": 2.5447, "text": "Stardance Stats dev log #4 History endpoints. Projects, users, and the whole platform all run through the same thing. Pick your metrics, pick hourly, daily or weekly, get points back. Points only get written when a number moves, which means quiet stretches look like gaps. There’s a fill option that carries the last value forward so a flat line renders as a flat line. Ask for too wide a range, and it says no instead of trying. Every response now says when the data was last seen and whether that’s old. Responses also carry an ETag, so asking again for something that hasn’t changed costs nothing. Also added a platform endpoint for the site-wide totals, and a single devlog one."}, {"post_id": 42134, "ts": "2026-08-06T18:42:26Z", "hours": 8.6581, "text": "Stardance Stats dev log #3 Little differently today. I fetched all of Stardance today, and if you have any query requests, make a comment and I will answer! It can be something like, “What’s the best rated project on SD?” or “How many users have over 20 followers?” There’s a queue of everything worth crawling, and each page gets a tier. Pages that keep changing get checked often; pages that never change drop to the slow lane. It reads the sitemap to find pages and see what changed recently. But the sitemap misses a lot, so it also just walks id ranges past the highest one it knows is real. Most of those 404s, that’s fine. Owners that never got listed get found through their projects instead. Hidden and unverified profiles still parse."}, {"post_id": 41585, "ts": "2026-08-05T21:40:50Z", "hours": 6.9583, "text": "Stardance Stats dev log #2 Users and leaderboards. It reads profiles now, by handle or ID. Followers, streaks, achievements, what projects you’re on. Renames are fine, the old handle still finds you. Project pages only show handles, no IDs, so those rows just wait until the user gets crawled and then link up. Order doesn’t matter. Ships only pay after review, so shipped hours and paid hours aren’t the same. Payouts also use capped hours that aren’t shown anywhere, so I work those out from the payout and multiplier. Unpaid hours get an estimate. Super Star badges too."}, {"post_id": 40805, "ts": "2026-08-04T15:51:12Z", "hours": 6.7464, "text": "Stardance Stats dev log #1 New project! Stardance Stats, a better way to browse Stardance. The crawler is polite. It’s rate-limited, retries when things fail, and backs off entirely if the site starts struggling. Pages that haven’t changed don’t get re-parsed. Parsing hooks onto stable attributes instead of layout, so a restyle won’t break it. It reads devlogs and ships off the feed, then checks the numbers against the page’s own totals. If those drift too far, something broke. Everything goes into MongoDB as time series. Counters like devlogs or stardust can’t go down, so if they do, it’s a bad parse, and it gets rejected. First crawl also backfills old history from dates already on the page. oh btw all testing is done on @The_Craw project, so shoutout to him."}]...
|
Title: Stardance Stats by @mixidmb | Stardance
De Title: Stardance Stats by @mixidmb | Stardance
Devlogs:
Stardance Stats dev log #1 New project! Stardance Stats, a better way to browse Stardance. The crawler is polite. It’s rate-limited, retries when things fail, and backs off entirely if the site starts struggling. Pages that haven’t changed don’t get re-parsed. Parsing hooks onto stable attributes instead of layout, so a restyle won’t break it. It reads devlogs and ships off the feed, then checks the numbers against the page’s own totals. If those drift too far, something broke. Everything goes into MongoDB as time series. Counters like devlogs or stardust can’t go down, so if they do, it’s a bad parse, and it gets rejected. First crawl also backfills old history from dates already on the page. oh btw all testing is done on @The_Craw project, so shoutout to him.
Stardance Stats dev log #2 Users and leaderboards. It reads profiles now, by handle or ID. Followers, streaks, achievements, what projects you’re on. Renames are fine, the old handle still finds you. Project pages only show handles, no IDs, so those rows just wait until the user gets crawled and then link up. Order doesn’t matter. Ships only pay after review, so shipped hours and paid hours aren’t the same. Payouts also use capped hours that aren’t shown anywhere, so I work those out from the payout and multiplier. Unpaid hours get an estimate. Super Star badges too.
Stardance Stats dev log #3 Little differently today. I fetched all of Stardance today, and if you have any query requests, make a comment and I will answer! It can be something like, “What’s the best rated project on SD?” or “How many users have over 20 followers?” There’s a queue of everything worth crawling, and each page gets a tier. Pages that keep changing get checked often; pages that never change drop to the slow lane. It reads the sitemap to find pages and see what changed recently. But the sitemap misses a lot, so it also just walks id ranges past the highest one it knows is real. Most of those 404s, that’s fine. Owners that never got listed get found through their projects instead. Hidden and unverified profiles still parse.
Stardance Stats dev log #4 History endpoints. Projects, users, and the whole platform all run through the same thing. Pick your metrics, pick hourly, daily or weekly, get points back. Points only get written when a number moves, which means quiet stretches look like gaps. There’s a fill option that carries the last value forward so a flat line renders as a flat line. Ask for too wide a range, and it says no instead of trying. Every response now says when the data was last seen and whether that’s old. Responses also carry an ETag, so asking again for something that hasn’t changed costs nothing. Also added a platform endpoint for the site-wide totals, and a single devlog one.
Stardance Stats dev log #5 (almost done for ship!) Comments. A thread gets queued when its count moves, and they run in their own lane so they don’t starve behind everything else. Deleted ones get marked gone instead of vanishing. I got the shop too. Prices are per region, and the region is just a cookie, so it just grabs the catalogue seven times. That gives you the spread: how much more the same thing costs depending on where you are. Devlogs have their own history now, so you can watch one post’s likes over time. Fixed a demotion bug. Crawling a page more often used to make it go cold faster, which is backwards. Now it just checks how long it’s actually been quiet. Frontend started too. One page with the totals and a chart. The rest of the tabs are greyed out. And that’s what I’m going to be working on right now.
Stardance Stats dev log #6 People page: Leaderboard with a podium for the top three; click through to anyone’s profile. Search goes through the API since whoever you’re looking for usually isn’t on the page you’re on. It tries handles that start with what you typed first, then ones that just contain it. Added a blacklist. Some people don’t want to be tracked, so their ID goes in, and everything of theirs gets deleted. Fixed missions. Some pay a fixed amount instead; others go to rating; and none of that shows up as a payout on the page. Now each ship gets credited properly. Also added those silly creatures to the global page.
Stardance Stats dev log #7 Projects page is done. Same podium as People but with the banners behind the top three. The list under it includes a thumbnail, the owner, and hours and devlogs in a single row. Buttons to filter to Super Stars or hardware. Click one, and you get everything about a project. Banner, tiles, a chart from 1 to 30 days, every ship, and all the devlogs. Sort them by newest, longest, most liked, most discussed, or most viewed.
Stardance Stats dev log #8 SDS website is already up! Check it out at https://stardancestats.xyz/ Devlogs page. Every devlog on the site in one feed. Cards with the author, the project, the numbers, the text, and the images or videos. Filter by how recent, sort by newest, likes, comments, or views, or search. Search reads the body. Type “cat” and you get everyone’s cat posts, or put quotes around something to match it exactly. Whatever you searched gets highlighted in the card. Also put the little star creatures around the pages. (the sillies)
Stardance Stats dev log #9 Ask is done. You type a question in plain English, and a model writes the database query for it. You get a table back, and bars if it makes sense to chart. It only gets to write queries out of a list I picked. No writes, its own read-only database user, a time limit, and a rate limit on how many questions you can ask an hour. If it writes something outside that, it just gets refused. Also made API docs with examples for every endpoint, a README, and a license. There’s a docs button in the sidebar now.
Ships:
Stardance Stats stardancestats.xyz · API docs A better way The best way to browse Stardance. Stardance just shows you a number, and that’s it. No history, no sorting. So I made an app that tracks those numbers. A crawler reads the public pages on a schedule, saves everything, and serves it back as a site and an open API. Global is the whole platform, with tiles you click to chart. People and Projects rank everyone on whatever you pick, with profiles, history, and search. Devlogs is every devlog in one feed, searchable by words included in the body. Ask takes a question in plain English and writes the query for it. The API is open. Every group has a list, a detail, and a /history endpoint for stats over time. curl "https://api.stardancestats.xyz/v1/projects/2155/history?metrics=likes,devlogs&interval=1d" Everything worth crawling sits in a queue with a tier. Pages that keep moving get checked hourly; quiet ones drop back. The sitemap misses plenty, so it also walks ID ranges to find what isn’t listed. Python, FastAPI, MongoDB, Svelte, Docker. Star creatures are from Hack Club’s Stardance repo....
|
1792875214.2244315
|
1793739214.2244315
|
|
37233
|
Drowned Fish by @cauadev | Stardance
|
cauadev
|
1
|
80.29
|
1155
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T15:31:11Z", "hours": 80.0, "multiplier": 14.43, "payout": 1155, "blessing": "neutral", "text": "Hello guys! Drowned-Fish A simple 2D troll game made with Love2D. The name is a thing as impossible as you beating this game. It has 26 levels, uncountable traps and lots and lots of teasing voicelines meant specifically to annoy you. Controls WASD - Move P - Pause/unpause Struggles (Only the main ones) Creative block at level design (especially for the last sectors). Physics, because I thought Bump.lua would do the job well, but discovered (too late to switch for something like love.physics ) that it doesn’t work well with moving objects (basically a lot of my game), so it still has some physics quirks, although I did my best to fix a lot of them. Making my game pretty (I’m a dev, not an artist) Voicelines (like finding them on my phone to transfer to the project or changing their volume because they were too low. Also, they’re kind of bad quality Drowned-Fish Initiative uses cheap speakers). UI, because Love2D, although being awesome, doesn’t have helpers for UI, so all UI logic had to be hand written Implementing specific props, such as lasers, moveable props, spinning platforms and boosters I’m proud of… Having a whole game to call mine Overcoming all topics mentioned in Struggles Learning: Game dev, a new language (Lua), a framework (Love2D) and some unexpected things (like discovering Tiled existence or how AppImage works under the hood) Download You can download it at the GitHub releases page . It’s officially supported for Windows and Linux at the x86_64 architecture. If your system isn’t supported, you can: Download the universal .love build, along with a Love2D runtime (they’re available at the official Love2D page ) and open the build with Love2D Skip this project and rate another project instead (don’t rate it if you can’t play it first, please)", "repo": "https://github.com/Br-Zueira/Drowned-Fish", "demo": "https://github.com/Br-Zueira/Drowned-Fish/releases/tag/v1.0.0"}]...
|
[{"post_id": 75741, "ts": "202 [{"post_id": 75741, "ts": "2026-09-30T22:18:40Z", "hours": 0.2886, "text": "Hello! Struggles at shipping My game was rejected for using an old OpenGL version, but forcing it to use a newer OpenGL by default isn’t something I can easily change without forking Love2D (simply not doable for me). Also, it did work as intended on a variety of devices (old, new, Windows, Linux). And searching a bit, apparently Love2D automatically try using OpenGL 3.0 if it’s available on the device. So, if you’re a shipwright, please take this in consideration. Note -> Also, I want to say that during this midtime I changed my Chromebook setup from ChromeOS Crostini (Debian container) to bare metal Linux (I use Arch btw)"}, {"post_id": 71223, "ts": "2026-09-20T14:03:54Z", "hours": 1.4161, "text": "Hello guys! Finally shipping this thing! Made S5L5 and S5L6 (yeah, this one has 6 levels, although level 6 is just like an “ending”) and added new voicelines. Goodbye! See you guys again in my new projects! (check out Hello-Raylib, my current one, or Boilerplater, my Vscode extension)"}, {"post_id": 62373, "ts": "2026-09-05T18:19:55Z", "hours": 2.1108, "text": "Hello guys! New levels Finished Sector 5 Level 3 (S5L3) and did S5L4. Features of S5L4 Fake integer overflow at the level deaths counter, which explains the “broken” level Falling tiles (Can go up, down and custom directions, either moving at a fixed speed or suffering from a “gravity”) Struggles Level design: Solved by testing whatever came to my mind and seemed fun, even for a slight bit. Figuring out how to make the falling tiles without being a total pain: Solved by some default values, syntatic sugar and abstractions (variables with isUp = true are assumed to go only up, else and not EndX and EndY are assumed to go only down). Bye!"}, {"post_id": 59957, "ts": "2026-09-02T01:01:40Z", "hours": 1.8258, "text": "Hello guys! Progress I’ve done this silly cursor (with a frowned face!) that can follow a target! It has two options: Fixed time to reach target (with variable speed) and fixed speed (with variable time to reach target). It has a trigger collision (equals no collision with player) by default, but can be solid. It uses mostly of moveable props updating logic. Struggles Thinking about edge cases (like time being on 0 and division by 0 happening or cursor already being at target) and how to implement my ideas (like a variable speed based on time). This silly bug where cursor can crush you (even when having a trigger collision). Probably letting it as a troll feature. Wanted to draw cursor over everything else (solved it by adding a “layer” property at props, where cursor is at layer 999 while tiles are at -999 and default is 0. Also, player is still rendering at cursor front, but probably ignoring this, as it’s not an issue.) TODO Finishing the level (S5L3) and doing lots of troll shenanigans."}, {"post_id": 59182, "ts": "2026-08-31T20:34:32Z", "hours": 2.2239, "text": "Hello guys! What I’ve done (No, I’ll not face myself) Sector 5 levels 1 and 2, and the beginning of brainstorming for level 3. Level 1 messes up with controls. Level 2 takes it further and also messes with gravity. Level 3 is… I dunno, have to think (creative block is being a huge roadblock for this game). Struggles Creative block for levels (already said it) Being lazy (mostly because the creative block makes my brain want to avoid this project) Lack of free time (It’s better now, but was kind of an issue for me) TODO More levels (at least Level 3 to 5, but I thought of doing more) Maybe improving UX/UI (NOT A PROMISE) More voicelines (absolutely needed)"}, {"post_id": 55251, "ts": "2026-08-26T22:19:20Z", "hours": 1.0742, "text": "Hello, guys! Development Yesterday, I’ve done this level (S4L5). It’s officially the last level for Sector 4. The X thing rotates clockwise, then there are the traps I won’t tell (go play it by yourself to discover!) Struggles I really struggled with physics (the player often noclips through the walls or the spinning X thing), and decided it’ll be a feature/something explained in-game (the sector already messes with physics, such as gravity inversion, so it can be treated as a “colateral effect”). I added a death condition, which is being squished at axis X (didn’t solve, but now it’s there). Sector 5 You guys can be sure Sector 5 will be the silliest one. I plan to get very creative at this one, such as messing with controls, breaking the 4th wall, etc. Note Just discovered those awesome emojis, so I’ll definitively start using them. Also, just decided to use Markdown features simply because I can."}, {"post_id": 54641, "ts": "2026-08-25T17:49:56Z", "hours": 2.0483, "text": "Hello guys! On the last days, I’ve been doing sector 4 level 3 (the one at the picture) and 4! I struggled with gravity effects (spoiler: those levels mess up with gravity and Y-axis acceleration), and this was not that easy. Ended up having to do a trigger that doesn’t get deleted as soon as it gets trigged, so it can smoothly slow down player until velY gets to 0. Also, changed jump system in order to be able of jumping from the ceiling. TODO: S4L5 (maybe horizontal gravity?) and S5 (probably the last sector, and the hardest to code, as I want it to break the 4th wall and mess up with controls and UI). Bye!"}, {"post_id": 51329, "ts": "2026-08-20T22:26:49Z", "hours": 1.6053, "text": "Hello guys! In the last days, I’ve done these translucid tiles. They pulsate using sine waves, and gets brighter if player is close (had to learn easing functions just to make it smoother!). Not too much struggles (fortunately), except by the fact I first tried to use bump.lua collision checking (for some forbidden reason didn’t work), then went to euclidian distance formula (linear) and finally used an easing formula (as smooth as butter on hot knife). That’s it! (Also, some tiny patches that are probably smaller than this sentence so are not worth being mentioned.)"}, {"post_id": 49790, "ts": "2026-08-18T18:40:46Z", "hours": 2.57, "text": "Hello guys! Oh these days, I worked on these amazing particle systems. Also, did you notice a small delay between dying or touching a goal/sector gate and respawning or loading the new level? That’s the brand new freeze player option. The player becomes invisible, immortal and immoveable for a small amount of time (500ms to be more specific) to make it feel more smooth. At first, it caused me a simple yet huge headache involving voicelines that play right at the start of levels entered by a sector gate. Turns out it was that the sector gates kept detecting collision with frozen player (and consequently refiring logic) and bugging it all. Shout out to Claude for finding the bug root for me!"}, {"post_id": 48535, "ts": "2026-08-16T23:15:39Z", "hours": 2.7033, "text": "Hello guys! On the last days, I’ve been making this level (S4L2). The single thing that was a thorn at my side was the rotating moving platform at right. The individual tiles would incorrectly spin around rotation center because they wouldn’t keep a constant radius from center, causing a mess. The solution was to force the tiles to keep a constant radius from rotation center. Also, level design is being a real struggle for me: Lack of inspiration for cool, unique and with funny trolling. I’m open for suggestions!"}, {"post_id": 45346, "ts": "2026-08-11T18:53:24Z", "hours": 3.4861, "text": "Hello guys! In those days, I’ve been making those spinning platforms, and also S4L1 (this level). It’s probably not 100% finished, considering its still not troll. Struggle: Physics (Bump.lua really hates moving and rotating props) and figuring out how to actually make it rotate. Also, I’m struggling with ideas for the level."}, {"post_id": 43235, "ts": "2026-08-08T11:38:33Z", "hours": 4.205, "text": "Hello guys! In the last days, I added new assets, such as songs and backgrounds (one for each sector). I also finally added SFX! Then, I re-included and re-formulated death by crush (struggled with it, ended up having to use subtick system for it to work correctly). Finally, I did a logo/icon for the game."}, {"post_id": 41350, "ts": "2026-08-05T14:39:50Z", "hours": 5.0219, "text": "Hello guys! Yesterday, I made s3l5. I’ve also made s3l4 a bit easier. Also, I’ve made the laser seem a bit thicker and way more cool. Finally, I’ve done some bash scripts: bundle.sh = Bundles the game modules, assets, maps, libraries, main.lua (entry point) and conf.lua (Love2D configurations) into a .love file windows-package.sh = Merges the .love file with Love2D standalone .exe, puts it into a folder with Love2D dlls, game license and readme linux-x86_64-package.sh = Unpacks Love2D AppImage, changes variables and filenames, merges Love2D bin with the .love file, handles both Love2D and game license and game readme and packs it back into an AppImage using AppImageTool"}, {"post_id": 39807, "ts": "2026-08-03T01:25:25Z", "hours": 2.1606, "text": "Hello guys! Today, I’ve basically done those lasers and s3l4 (the level on the pic). Struggled with: alternating laser patterns based on lasers that started disabled. It was a single line of code (if isDisabled then return instance end) but lots of headaches and anger and unexpected behaviour. Also, it was kind of hard to figure out how to make these dynamic beans work out. Ended up basically taking advantage of table references (parent laser emitters coordinates) and “if isDisabled then return end” code guards."}, {"post_id": 39229, "ts": "2026-08-02T01:56:01Z", "hours": 3.1364, "text": "Hello guys! Today, I’ve made Sector 3 Level 3 (the background level). I’ve also done this pause menu. It even saves the volume and the muted state in a settings.json file. TODO: More levels, maybe a few brand new props and probably my first sound effects."}, {"post_id": 37947, "ts": "2026-07-31T00:06:18Z", "hours": 6.5086, "text": "Hey guys! On these days, I made sector 3 along with its two first levels. I also started making this terminal-style pause menu where you can adjust the audio channels. Finally, I enhanced the song playing (now it has better support to multiple tracks). Struggles: making a UI that is both functional and not completely awful simply with Love (pun intended). TODO: Put a volume changer (probably not a slider, more simple, like arrow keys) and a button to go back to hub."}, {"post_id": 36483, "ts": "2026-07-28T16:50:27Z", "hours": 1.8083, "text": "Hello guys! Yesterday and the day before, I made sector 2 level 4. I also added springs and speed boosters to the game. Save features: Unlocking levels gradually and saving least death count per sector, everything in save.json file and with temp json files to avoid corruption (atomic saving). The least death count is showed at sector hub over each sector gate. Struggles: boosting player’s velX (its zeroed after every frame to avoid sliding, but this also zeroed the boost. The solution was to create a different variable in player, called boostedX, that is managed diferently from velX and taken in account with velX to move player). And bump.lua’s bounce, which I had to replace with “self.velY = -self.velY”, and for some reason automatically ensured energy loss (realistic physics) even though I didn’t program it. And I’ll keep it this way because it’s good, realistic and, most important, fun. Bye!"}, {"post_id": 35973, "ts": "2026-07-27T19:22:49Z", "hours": 2.6047, "text": "Hello fellas! Yesterday and today, I added a saving system. It saves unlocked sectors and least death counts. This least death counts is showed in sector hub below sector number. I also made sector 2 level 3 (the level in the picture)."}, {"post_id": 35502, "ts": "2026-07-26T23:48:00Z", "hours": 4.0628, "text": "Hello, guys! On the last days, I did this sector hub! Also, I was finally able of patching the physics bugs involving moveables and player! Besides that, I added sector 2 level 2. Bye!"}, {"post_id": 34631, "ts": "2026-07-25T14:50:05Z", "hours": 4.7336, "text": "Hello, fellas! Yesterday, I did this new UI and also added a moveable prop class (until that, every moving prop was jury-rigging involving moversaws) and sector 2 level 1."}, {"post_id": 34000, "ts": "2026-07-24T12:09:06Z", "hours": 4.9647, "text": "Hello, guys! Yesterday, I did two brand new levels: 4 and 5 (this one). I also started organizing levels in “sectors” - Level groups. Besides that, I made improvements in mover saws, debugging (now the game supports level and sector flags) and even a separate test map if I ever need to test specific things. Issues: Collision. Yeah, that’s it. The fake saw in level 4 gave me looots of trouble, debugging and some unfixed bugs involving player on vertically moving objects. The ultimate “fix”? Slowing the saw. But it worked. That’s what matters."}, {"post_id": 33469, "ts": "2026-07-23T13:26:08Z", "hours": 4.6464, "text": "Hello guys! Yesterday and today, I added level 3, with portals. I also added a voiceline manager module and two brand new voicelines. Besides that, as you can see, I added some new visual improvements: A background, a font and a sprite for the player. Now the game went from 100% ugly to 99% ugly. It’s still an improvement, though, plus I want to replace these sprites later."}, {"post_id": 32972, "ts": "2026-07-22T14:01:01Z", "hours": 4.7653, "text": "Hello guys! Yesterday and today, I did the first two actual levels of the game (I discarded the old test map!) I also did some new obstacles, such as fake tiles and moving saws. Not only that, but a trigger class too. I added some helpers for audio and even a soundtrack (Thanks Imphenzia for the awesome and no copyright “Discovery of Planet X” soundtrack). Struggles: Crostini (ChromeOS Linux container) mysterious volume changes each time I opened it, making me think the problem were the voicelines and the soundtrack, collision quirks (like the saw from the gif getting stuck at the player and not killing or triggers being sticky instead of untoucheable) and Tiled/STI (mainly about tilesets). That’s it!"}, {"post_id": 32316, "ts": "2026-07-21T12:36:06Z", "hours": 4.3033, "text": "Hello guys! Yesterday, I moved the main logic from props to player itself (the deadly and the goal thing). Also, as you can see in this gif, I added some of the first troll items: a goal that moves when player is close and a spike that only appears when player is close. Besides that, I added a logic handler where you can have levelx__data.lua separate from the Tiled’s levelx.lua, where __data contains logic exclusive to that level. Finally, I used all my dubbing skills (100% of 0 is 0) to make some voice lines to the game. It’s a narrator that keeps teasing you."}, {"post_id": 31539, "ts": "2026-07-20T00:57:14Z", "hours": 2.9972, "text": "Hey guys! Today, I officially integrated Tiled to the game and added spawn points and “killable” (killer) props. Today’s struggles: nil values, killer props not killing and Tiled itself. TODO: a lot, probably more focused on organizing code and adding new props."}, {"post_id": 31211, "ts": "2026-07-19T12:56:11Z", "hours": 3.0753, "text": "Hey guys! Yesterday and today, I’ve made this simple setup. It has a player and a prop managment (the green platform is composed by individual tiles of 32x32px, where a tile is considered a prop). As you can see, it also has death system (with counting) and movement system. This is just the beginning!"}]...
|
Title: Drowned Fish by @cauadev | Stardance
Devlo Title: Drowned Fish by @cauadev | Stardance
Devlogs:
Hey guys! Yesterday and today, I’ve made this simple setup. It has a player and a prop managment (the green platform is composed by individual tiles of 32x32px, where a tile is considered a prop). As you can see, it also has death system (with counting) and movement system. This is just the beginning!
Hey guys! Today, I officially integrated Tiled to the game and added spawn points and “killable” (killer) props. Today’s struggles: nil values, killer props not killing and Tiled itself. TODO: a lot, probably more focused on organizing code and adding new props.
Hello guys! Yesterday, I moved the main logic from props to player itself (the deadly and the goal thing). Also, as you can see in this gif, I added some of the first troll items: a goal that moves when player is close and a spike that only appears when player is close. Besides that, I added a logic handler where you can have levelx__data.lua separate from the Tiled’s levelx.lua, where __data contains logic exclusive to that level. Finally, I used all my dubbing skills (100% of 0 is 0) to make some voice lines to the game. It’s a narrator that keeps teasing you.
Hello guys! Yesterday and today, I did the first two actual levels of the game (I discarded the old test map!) I also did some new obstacles, such as fake tiles and moving saws. Not only that, but a trigger class too. I added some helpers for audio and even a soundtrack (Thanks Imphenzia for the awesome and no copyright “Discovery of Planet X” soundtrack). Struggles: Crostini (ChromeOS Linux container) mysterious volume changes each time I opened it, making me think the problem were the voicelines and the soundtrack, collision quirks (like the saw from the gif getting stuck at the player and not killing or triggers being sticky instead of untoucheable) and Tiled/STI (mainly about tilesets). That’s it!
Hello guys! Yesterday and today, I added level 3, with portals. I also added a voiceline manager module and two brand new voicelines. Besides that, as you can see, I added some new visual improvements: A background, a font and a sprite for the player. Now the game went from 100% ugly to 99% ugly. It’s still an improvement, though, plus I want to replace these sprites later.
Hello, guys! Yesterday, I did two brand new levels: 4 and 5 (this one). I also started organizing levels in “sectors” - Level groups. Besides that, I made improvements in mover saws, debugging (now the game supports level and sector flags) and even a separate test map if I ever need to test specific things. Issues: Collision. Yeah, that’s it. The fake saw in level 4 gave me looots of trouble, debugging and some unfixed bugs involving player on vertically moving objects. The ultimate “fix”? Slowing the saw. But it worked. That’s what matters.
Hello, fellas! Yesterday, I did this new UI and also added a moveable prop class (until that, every moving prop was jury-rigging involving moversaws) and sector 2 level 1.
Hello, guys! On the last days, I did this sector hub! Also, I was finally able of patching the physics bugs involving moveables and player! Besides that, I added sector 2 level 2. Bye!
Hello fellas! Yesterday and today, I added a saving system. It saves unlocked sectors and least death counts. This least death counts is showed in sector hub below sector number. I also made sector 2 level 3 (the level in the picture).
Hello guys! Yesterday and the day before, I made sector 2 level 4. I also added springs and speed boosters to the game. Save features: Unlocking levels gradually and saving least death count per sector, everything in save.json file and with temp json files to avoid corruption (atomic saving). The least death count is showed at sector hub over each sector gate. Struggles: boosting player’s velX (its zeroed after every frame to avoid sliding, but this also zeroed the boost. The solution was to create a different variable in player, called boostedX, that is managed diferently from velX and taken in account with velX to move player). And bump.lua’s bounce, which I had to replace with “self.velY = -self.velY”, and for some reason automatically ensured energy loss (realistic physics) even though I didn’t program it. And I’ll keep it this way because it’s good, realistic and, most important, fun. Bye!
Hey guys! On these days, I made sector 3 along with its two first levels. I also started making this terminal-style pause menu where you can adjust the audio channels. Finally, I enhanced the song playing (now it has better support to multiple tracks). Struggles: making a UI that is both functional and not completely awful simply with Love (pun intended). TODO: Put a volume changer (probably not a slider, more simple, like arrow keys) and a button to go back to hub.
Hello guys! Today, I’ve made Sector 3 Level 3 (the background level). I’ve also done this pause menu. It even saves the volume and the muted state in a settings.json file. TODO: More levels, maybe a few brand new props and probably my first sound effects.
Hello guys! Today, I’ve basically done those lasers and s3l4 (the level on the pic). Struggled with: alternating laser patterns based on lasers that started disabled. It was a single line of code (if isDisabled then return instance end) but lots of headaches and anger and unexpected behaviour. Also, it was kind of hard to figure out how to make these dynamic beans work out. Ended up basically taking advantage of table references (parent laser emitters coordinates) and “if isDisabled then return end” code guards.
Hello guys! Yesterday, I made s3l5. I’ve also made s3l4 a bit easier. Also, I’ve made the laser seem a bit thicker and way more cool. Finally, I’ve done some bash scripts: bundle.sh = Bundles the game modules, assets, maps, libraries, main.lua (entry point) and conf.lua (Love2D configurations) into a .love file windows-package.sh = Merges the .love file with Love2D standalone .exe, puts it into a folder with Love2D dlls, game license and readme linux-x86_64-package.sh = Unpacks Love2D AppImage, changes variables and filenames, merges Love2D bin with the .love file, handles both Love2D and game license and game readme and packs it back into an AppImage using AppImageTool
Hello guys! In the last days, I added new assets, such as songs and backgrounds (one for each sector). I also finally added SFX! Then, I re-included and re-formulated death by crush (struggled with it, ended up having to use subtick system for it to work correctly). Finally, I did a logo/icon for the game.
Hello guys! In those days, I’ve been making those spinning platforms, and also S4L1 (this level). It’s probably not 100% finished, considering its still not troll. Struggle: Physics (Bump.lua really hates moving and rotating props) and figuring out how to actually make it rotate. Also, I’m struggling with ideas for the level.
Hello guys! On the last days, I’ve been making this level (S4L2). The single thing that was a thorn at my side was the rotating moving platform at right. The individual tiles would incorrectly spin around rotation center because they wouldn’t keep a constant radius from center, causing a mess. The solution was to force the tiles to keep a constant radius from rotation center. Also, level design is being a real struggle for me: Lack of inspiration for cool, unique and with funny trolling. I’m open for suggestions!
Hello guys! Oh these days, I worked on these amazing particle systems. Also, did you notice a small delay between dying or touching a goal/sector gate and respawning or loading the new level? That’s the brand new freeze player option. The player becomes invisible, immortal and immoveable for a small amount of time (500ms to be more specific) to make it feel more smooth. At first, it caused me a simple yet huge headache involving voicelines that play right at the start of levels entered by a sector gate. Turns out it was that the sector gates kept detecting collision with frozen player (and consequently refiring logic) and bugging it all. Shout out to Claude for finding the bug root for me!
Hello guys! In the last days, I’ve done these translucid tiles. They pulsate using sine waves, and gets brighter if player is close (had to learn easing functions just to make it smoother!). Not too much struggles (fortunately), except by the fact I first tried to use bump.lua collision checking (for some forbidden reason didn’t work), then went to euclidian distance formula (linear) and finally used an easing formula (as smooth as butter on hot knife). That’s it! (Also, some tiny patches that are probably smaller than this sentence so are not worth being mentioned.)
Hello guys! On the last days, I’ve been doing sector 4 level 3 (the one at the picture) and 4! I struggled with gravity effects (spoiler: those levels mess up with gravity and Y-axis acceleration), and this was not that easy. Ended up having to do a trigger that doesn’t get deleted as soon as it gets trigged, so it can smoothly slow down player until velY gets to 0. Also, changed jump system in order to be able of jumping from the ceiling. TODO: S4L5 (maybe horizontal gravity?) and S5 (probably the last sector, and the hardest to code, as I want it to break the 4th wall and mess up with controls and UI). Bye!
Hello, guys! Development Yesterday, I’ve done this level (S4L5). It’s officially the last level for Sector 4. The X thing rotates clockwise, then there are the traps I won’t tell (go play it by yourself to discover!) Struggles I really struggled with physics (the player often noclips through the walls or the spinning X thing), and decided it’ll be a feature/something explained in-game (the sector already messes with physics, such as gravity inversion, so it can be treated as a “colateral effect”). I added a death condition, which is being squished at axis X (didn’t solve, but now it’s there). Sector 5 You guys can be sure Sector 5 will be the silliest one. I plan to get very creative at this one, such as messing with controls, breaking the 4th wall, etc. Note Just discovered those awesome emojis, so I’ll definitively start using them. Also, just decided to use Markdown features simply because I can.
Hello guys! What I’ve done (No, I’ll not face myself) Sector 5 levels 1 and 2, and the beginning of brainstorming for level 3. Level 1 messes up with controls. Level 2 takes it further and also messes with gravity. Level 3 is… I dunno, have to think (creative block is being a huge roadblock for this game). Struggles Creative block for levels (already said it) Being lazy (mostly because the creative block makes my brain want to avoid this project) Lack of free time (It’s better now, but was kind of an issue for me) TODO More levels (at least Level 3 to 5, but I thought of doing more) Maybe improving UX/UI (NOT A PROMISE) More voicelines (absolutely needed)
Hello guys! Progress I’ve done this silly cursor (with a frowned face!) that can follow a target! It has two options: Fixed time to reach target (with variable speed) and fixed speed (with variable time to reach target). It has a trigger collision (equals no collision with player) by default, but can be solid. It uses mostly of moveable props updating logic. Struggles Thinking about edge cases (like time being on 0 and division by 0 happening or cursor already being at target) and how to implement my ideas (like a variable speed based on time). This silly bug where cursor can crush you (even when having a trigger collision). Probably letting it as a troll feature. Wanted to draw cursor over everything else (solved it by adding a “layer” property at props, where cursor is at layer 999 while tiles are at -999 and default is 0. Also, player is still rendering at cursor front, but probably ignoring this, as it’s not an issue.) TODO Finishing the level (S5L3) and doing lots of troll shenanigans.
Hello guys! New levels Finished Sector 5 Level 3 (S5L3) and did S5L4. Features of S5L4 Fake integer overflow at the level deaths counter, which explains the “broken” level Falling tiles (Can go up, down and custom directions, either moving at a fixed speed or suffering from a “gravity”) Struggles Level design: Solved by testing whatever came to my mind and seemed fun, even for a slight bit. Figuring out how to make the falling tiles without being a total pain: Solved by some default values, syntatic sugar and abstractions (variables with isUp = true are assumed to go only up, else and not EndX and EndY are assumed to go only down). Bye!
Hello guys! Finally shipping this thing! Made S5L5 and S5L6 (yeah, this one has 6 levels, although level 6 is just like an “ending”) and added new voicelines. Goodbye! See you guys again in my new projects! (check out Hello-Raylib, my current one, or Boilerplater, my Vscode extension)
Hello! Struggles at shipping My game was rejected for using an old OpenGL version, but forcing it to use a newer OpenGL by default isn’t something I can easily change without forking Love2D (simply not doable for me). Also, it did work as intended on a variety of devices (old, new, Windows, Linux). And searching a bit, apparently Love2D automatically try using OpenGL 3.0 if it’s available on the device. So, if you’re a shipwright, please take this in consideration. Note -> Also, I want to say that during this midtime I changed my Chromebook setup from ChromeOS Crostini (Debian container) to bare metal Linux (I use Arch btw)
Ships:
Hello guys! Drowned-Fish A simple 2D troll game made with Love2D. The name is a thing as impossible as you beating this game. It has 26 levels, uncountable traps and lots and lots of teasing voicelines meant specifically to annoy you. Controls WASD - Move P - Pause/unpause Struggles (Only the main ones) Creative block at level design (especially for the last sectors). Physics, because I thought Bump.lua would do the job well, but discovered (too late to switch for something like love.physics ) that it doesn’t work well with moving objects (basically a lot of my game), so it still has some physics quirks, although I did my best to fix a lot of them. Making my game pretty (I’m a dev, not an artist) Voicelines (like finding them on my phone to transfer to the project or changing their volume because they were too low. Also, they’re kind of bad quality Drowned-Fish Initiative uses cheap speakers). UI, because Love2D, although being awesome, doesn’t have helpers for UI, so all UI logic had to be hand written Implementing specific props, such as lasers, moveable props, spinning platforms and boosters I’m proud of… Having a whole game to call mine Overcoming all topics mentioned in Struggles Learning: Game dev, a new language (Lua), a framework (Love2D) and some unexpected things (like discovering Tiled existence or how AppImage works under the hood) Download You can download it at the GitHub releases page . It’s officially supported for Windows and Linux at the x86_64 architecture. If your system isn’t supported, you can: Download the universal .love build, along with a Love2D runtime (they’re available at the official Love2D page ) and open the build with Love2D Skip this project and rate another project instead (don’t rate it if you can’t play it first, please)...
|
1792856988.2244444
|
1792943388.2244444
|
|
32700
|
NetLink by @Leon36 | Stardance
|
Leon36
|
2
|
75.0
|
1132
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-09T14:54:33Z", "hours": 64.0, "multiplier": 16.47, "payout": 982, "blessing": "neutral", "text": "NetLink connect to your network from everywhere without a VPN I made a Web based “OS” to connect to your network without a VPN and accses your resources with protocols like sftp or ssh. I also build a desktop client to emulate a VPN on your pc, so you can accses your network with your own programms Technologys I used WebSockets to transfer data between the client and the Server. For the frontend I choose React, for the backend I used TypeScript.", "repo": "https://github.com/leonst036/NetLink", "demo": "https://netlink.legaming.tech/"}, {"ship_num": 2, "ts": "2026-07-14T19:45:47Z", "hours": 11.0, "multiplier": 14.76, "payout": 150, "blessing": "neutral", "text": "I built a project called NetLink! It lets you connect to your home network from anywhere. Right now, it supports access via VNC, SSH, and SFTP. It uses WebSockets and web based apps to establish the connection. Everything is routed through a relay node, so you don’t need to open any ports on your router. In the demo version, you can set up your own PC as a local server to try it out (active for 24 hours). If you want to use it long-term, you can easily self-host the project on your own hardware (GitHub Readme). I’m planning to add support for more protocols soon. If you have any feedback or ideas on how to improve the project, feel free to leave a comment or send me a DM! Heads up: If you’re using the demo, it might take a few moments to load all your devices.", "repo": "https://github.com/leonst036/NetLink", "demo": "https://netlink.legaming.tech/"}]...
|
[{"post_id": 78081, "ts": "202 [{"post_id": 78081, "ts": "2026-10-09T14:48:26Z", "hours": 6.1889, "text": "Summary: Polished NetLink for a ship Fixed some bugs Remade some screens Made a demo version Made some security fixes"}, {"post_id": 58474, "ts": "2026-08-30T21:50:58Z", "hours": 2.4225, "text": "Summary: Made some bugfixes That’s pretty much all. I found some small thing I didn’t like and fixed them."}, {"post_id": 53323, "ts": "2026-08-23T19:58:03Z", "hours": 6.5603, "text": "Summary: Made NetConnect a programm for Linux to bring you Network to you everywhere (without VPN) I made this using Go and a virtual network device wich act like a spit tunnel vpn, to extract all request from you subnet e.g. 192.168.1.0/24 sends it over a WebSocket to the NetLink relay server and to its target server. I’m not fully done with this, but right now it’s working. Maybe I’ll do a version for windows soon. How you can install it is defined in the NetConnect Repo ONLY FOR LINUX"}, {"post_id": 52016, "ts": "2026-08-22T01:39:34Z", "hours": 6.1189, "text": "Summaray: Refactored netgraph and settings app Yeah, I refactored it. That’s it. I gues I put these applications as picture :-|"}, {"post_id": 49947, "ts": "2026-08-18T22:48:47Z", "hours": 13.9178, "text": "Summary: Refactored NetStore, gave the NetStore it’s own Repo and started making a Minecraft Server Manager. I just refactored the I gues 1200 line longe NetStore app, and I have so much to refactor left. I started the Minecraft Server Manager before the refactoring but it wasn’t in my usual hackatime project, it was in a new one, and my stupid ass thought it was just a technical mistake that the time wasn’t tracked."}, {"post_id": 46375, "ts": "2026-08-13T15:30:43Z", "hours": 3.2525, "text": "Summary: Moved all build-in apps into the NetStore That’s pretty much all…"}, {"post_id": 46019, "ts": "2026-08-12T22:06:19Z", "hours": 1.8247, "text": "Summary: Made a traffic monitor for the NetStore This Devlog isn’t gona be that long, I just made a smal traffic monitor. And some small improvements."}, {"post_id": 45387, "ts": "2026-08-11T20:17:00Z", "hours": 2.0261, "text": "Summary: Secured NetStore and published it. I secured the NetStore so far that I can release it on the main branch. Right now it isn’t in the demo, so you can test it only when you install it by yourself (wich is very easy with the new install script)"}, {"post_id": 44059, "ts": "2026-08-09T16:06:18Z", "hours": 6.2664, "text": "Summary: Added a Docker Manager and done some fixes with the NetStore In my last devlog I made the NetStore, and this is the first application by myself. It’s used to manage your dockers from everywhere (What a wonder, the docker manager can manage docker). It isn’t perfect right now, so it’s not an alternative to something like Portainer or Coolify, but for simple tasks, it’s good enough. Primarily I made this application to add features to the NetStore (I added a lot, only for this application) and of course I found some bugs. The NetStore itself isn’t secured yet (Right now I only added Deno), but I’m working on it!"}, {"post_id": 43289, "ts": "2026-08-08T13:55:07Z", "hours": 3.1814, "text": "Summary: Added NetStore to create custom applications I added an application that allows you to create your own custom applications. I will use this Store to build additional apps myself for niche use cases (e.g., Docker management or local server containers) that will be fetched directly from GitHub. Key features: Custom Routes: Register your own custom backend routes. Frontend: Build and design your own user interface. Local Code: Execute custom code on the local server. IMPORTANT: DO NOT USE NETSTORE IN PRODUCTION OR DEPLOYMENT ENVIRONMENTS. IT IS CURRENTLY NOT SECURE. If you choose to use it anyway, you do so at your own risk. It’s on the dev Branch. I’d recommend to use it only in your local Network"}, {"post_id": 40183, "ts": "2026-08-03T16:15:22Z", "hours": 5.7364, "text": "I fixed some Bugs in the frontend and made some improvements in the backend."}, {"post_id": 33121, "ts": "2026-07-22T18:59:08Z", "hours": 1.8814, "text": "I just refactored the Project I optimized the structure of the local server and the relay. In the frontend, apps will load just when opening them wich is very good for the performance"}, {"post_id": 31896, "ts": "2026-07-20T17:40:45Z", "hours": 4.185, "text": "I completely remade the frontend! It’s now a hybrid of Material 3 and modern Glassmorphism. The overhaul took well over 4 hours though a good chunk was done at school (untracked since I wasn’t logged into Hackatime). Overall, I’m really happy with how the new look turned out! There are probably a few subtle UI bugs hiding in the new design, but I’ll squash those as I find them."}, {"post_id": 28489, "ts": "2026-07-14T19:25:14Z", "hours": 2.3664, "text": "I just finished a few bugs and created an demo enviroment. If you wanna try it, I’ll explain everything in the ship description."}, {"post_id": 27126, "ts": "2026-07-12T12:17:35Z", "hours": 3.7031, "text": "NetLink features a web-based operating system designed to enhance the user experience with VNC and SFTP. I plan to add support for additional protocols, such as RDP, in the future"}, {"post_id": 25976, "ts": "2026-07-10T14:54:42Z", "hours": 1.5586, "text": "Added dynamic SSH server selection. The network scan was a bit difficult. It’s not the prettiest solution to ping every device, but it works!"}, {"post_id": 25492, "ts": "2026-07-09T20:04:51Z", "hours": 2.8922, "text": "Streaming a SSH Session over the relay server"}]...
|
Title: NetLink by @Leon36 | Stardance
Devlogs:
St Title: NetLink by @Leon36 | Stardance
Devlogs:
Streaming a SSH Session over the relay server
Added dynamic SSH server selection. The network scan was a bit difficult. It’s not the prettiest solution to ping every device, but it works!
NetLink features a web-based operating system designed to enhance the user experience with VNC and SFTP. I plan to add support for additional protocols, such as RDP, in the future
I just finished a few bugs and created an demo enviroment. If you wanna try it, I’ll explain everything in the ship description.
I completely remade the frontend! It’s now a hybrid of Material 3 and modern Glassmorphism. The overhaul took well over 4 hours though a good chunk was done at school (untracked since I wasn’t logged into Hackatime). Overall, I’m really happy with how the new look turned out! There are probably a few subtle UI bugs hiding in the new design, but I’ll squash those as I find them.
I just refactored the Project I optimized the structure of the local server and the relay. In the frontend, apps will load just when opening them wich is very good for the performance
I fixed some Bugs in the frontend and made some improvements in the backend.
Summary: Added NetStore to create custom applications I added an application that allows you to create your own custom applications. I will use this Store to build additional apps myself for niche use cases (e.g., Docker management or local server containers) that will be fetched directly from GitHub. Key features: Custom Routes: Register your own custom backend routes. Frontend: Build and design your own user interface. Local Code: Execute custom code on the local server. IMPORTANT: DO NOT USE NETSTORE IN PRODUCTION OR DEPLOYMENT ENVIRONMENTS. IT IS CURRENTLY NOT SECURE. If you choose to use it anyway, you do so at your own risk. It’s on the dev Branch. I’d recommend to use it only in your local Network
Summary: Added a Docker Manager and done some fixes with the NetStore In my last devlog I made the NetStore, and this is the first application by myself. It’s used to manage your dockers from everywhere (What a wonder, the docker manager can manage docker). It isn’t perfect right now, so it’s not an alternative to something like Portainer or Coolify, but for simple tasks, it’s good enough. Primarily I made this application to add features to the NetStore (I added a lot, only for this application) and of course I found some bugs. The NetStore itself isn’t secured yet (Right now I only added Deno), but I’m working on it!
Summary: Secured NetStore and published it. I secured the NetStore so far that I can release it on the main branch. Right now it isn’t in the demo, so you can test it only when you install it by yourself (wich is very easy with the new install script)
Summary: Made a traffic monitor for the NetStore This Devlog isn’t gona be that long, I just made a smal traffic monitor. And some small improvements.
Summary: Moved all build-in apps into the NetStore That’s pretty much all…
Summary: Refactored NetStore, gave the NetStore it’s own Repo and started making a Minecraft Server Manager. I just refactored the I gues 1200 line longe NetStore app, and I have so much to refactor left. I started the Minecraft Server Manager before the refactoring but it wasn’t in my usual hackatime project, it was in a new one, and my stupid ass thought it was just a technical mistake that the time wasn’t tracked.
Summaray: Refactored netgraph and settings app Yeah, I refactored it. That’s it. I gues I put these applications as picture :-|
Summary: Made NetConnect a programm for Linux to bring you Network to you everywhere (without VPN) I made this using Go and a virtual network device wich act like a spit tunnel vpn, to extract all request from you subnet e.g. 192.168.1.0/24 sends it over a WebSocket to the NetLink relay server and to its target server. I’m not fully done with this, but right now it’s working. Maybe I’ll do a version for windows soon. How you can install it is defined in the NetConnect Repo ONLY FOR LINUX
Summary: Made some bugfixes That’s pretty much all. I found some small thing I didn’t like and fixed them.
Summary: Polished NetLink for a ship Fixed some bugs Remade some screens Made a demo version Made some security fixes
Ships:
I built a project called NetLink! It lets you connect to your home network from anywhere. Right now, it supports access via VNC, SSH, and SFTP. It uses WebSockets and web based apps to establish the connection. Everything is routed through a relay node, so you don’t need to open any ports on your router. In the demo version, you can set up your own PC as a local server to try it out (active for 24 hours). If you want to use it long-term, you can easily self-host the project on your own hardware (GitHub Readme). I’m planning to add support for more protocols soon. If you have any feedback or ideas on how to improve the project, feel free to leave a comment or send me a DM! Heads up: If you’re using the demo, it might take a few moments to load all your devices.
NetLink connect to your network from everywhere without a VPN I made a Web based “OS” to connect to your network without a VPN and accses your resources with protocols like sftp or ssh. I also build a desktop client to emulate a VPN on your pc, so you can accses your network with your own programms Technologys I used WebSockets to transfer data between the client and the Server. For the frontend I choose React, for the backend I used TypeScript....
|
1792990307.4654815
|
1793076707.4654815
|
|
22643
|
station-siege by @Abbos | Stardance
|
Abbos
|
1
|
90.0
|
1130
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-29T11:46:37Z", "hours": 90.0, "multiplier": 15.55, "payout": 1130, "blessing": "neutral", "text": "I made Station Siege, a first-person zombie shooter set on an abandoned space station. You fight through 10 waves of zombies, earn gold for kills, and spend it on weapons, ammo, and unlocking doors to different rooms. It’s built in Godot 4.7 and runs in the browser. The hardest part was zombie pathfinding. Zombies kept getting stuck in their spawn rooms, and one stuck zombie was enough to stop the next wave from starting. It turned out the doors were baked into the navigation mesh as closed, so even with a door open, the zombies had no path out. I rebuilt the navmesh without doors and barricades, and added a backup that despawns any zombie that makes no progress for 20 seconds. Getting it onto the web was the other big challenge. The first export was 2.3 GB, so I cut unused models and switched textures to a web-safe format to get it under itch’s 200 MB limit. I’m proudest of the atmosphere: the dark corridors, the barricades zombies tear through, and the moment a wave starts pouring in from several directions at once. How to test: Open the itch link in Chrome or Edge on a desktop computer. It doesn’t work on phones. Click Start, then click inside the game window to lock the mouse. Controls: WASD to move, Shift to sprint, left click to shoot, R to reload, 1-3 to switch weapons, E to interact or buy, hold F to repair a barricade, Esc to pause. They’re also on the Controls screen in the main menu. The first load can take a little while because the game is about 150 MB. Read the note near the spawn. It tells you where to find the shotgun, machine gun and gives a small backstory.", "repo": "https://github.com/Madyarov27/station-siege", "demo": "https://madyarov27.itch.io/station-siege-web"}]...
|
[{"post_id": 75174, "ts": "202 [{"post_id": 75174, "ts": "2026-09-29T11:36:11Z", "hours": 2.5928, "text": "Devlog #10 - my last devlog. Done: Removed jumping (it had no purpose) Repairing is now done via the F button. Shipped the game to itch.io. This took me a while. The export was 2.3 gigabytes, so itch.io flat-out rejected it due to size limits. I removed a pile of unused models from the export. GPU texture compression came out garbled in WebGL, so I switched the textures to WebP capped at 2048px. That got the build down to about 150 MB, well under itch’s 200 MB per-file limit. You can play it here: https://madyarov27.itch.io/station-siege-web . I also cleaned up the repo, rewrote the README, and pushed everything to GitHub, including the zombie model through Git LFS."}, {"post_id": 74902, "ts": "2026-09-28T15:52:46Z", "hours": 16.2392, "text": "#9th devlog. Station Siege. Achieved: Added acid puddle as an environmental threat. Can be used to kite zombies and kill them or likewise, end up hurting yourself if you step on it. Messages in HUD when interacting with barricades, vending machine, and acid puddle. Improved zombie navigation. Now it’s completely foolproof to sharp corner turns. Added sound effect when reloading. I had the mp3 and wav files lying there doing nothing for a while but now i finally wired them in. Added like a dozen new props. Took everything from SketchFab, and used them to decorate medical bay, engineering, and cargo. Replaced almost all existing AI generated 3d models to the ones took from sketchfab. Mainly because they had like a trillion faces which was frying my CPU but also they kinda looked soulless and low effort. Added an interior wall in the spawn chamber so zombies dont look like they appear out of thin air when they spawn. Also redesigned the barricade slightly. Good for realism Changed the game map extensively. The ring part is gone. That part made sense in the beginning but the more I tested, the more I realized that shape is not ideal for my game. It’s too big and you can kite zombies forever. Now, the map looks more like spaceship themed family home interior and it’s actualyl challenging here now. You can get cornered and slimed unexpectedly."}, {"post_id": 71096, "ts": "2026-09-20T09:08:46Z", "hours": 10.3072, "text": "Devlog #wa8 I’ll just keep it short Added: Sprinting Added male zombie (finally) Overhauled wave manager. Now zombies in rooms that are locked will not spawn until you unlock them yourself. Switched to open only doors so players can’t just go to empty room to heal forever Replaced wooden plank in barricades for rusty slab of metal with sound effect when fixing. Fixed a bug where zombies broke barricades unreliably. A dozen zombies took a whole minute to break 2 barricades due to a timing mismatch Built main menu screen Built pause menu Added ammo reserve system so weapons finally stop having infinite ammo except for default pistol"}, {"post_id": 67979, "ts": "2026-09-14T09:40:17Z", "hours": 12.8564, "text": "**Devlog #7 ** A lot of stuff added so this time I’ll try to keep it short and concise. Gun model kickback on firing. Muzzle smoke on every shot Real travelling bullet projectile instead of yellow ray Bullet shell ejected every time you fire Fixed the weird bug with zombie not spawning at all. Fixed an unexpepcted bug where corridor lights worked facing one way but not the other. It was because of too many lights crowded into one area after duplicating the lights node to new added areas. Fixed the bug with bullets sometimes passing through the zombies without hitting Fixed the bug with the gun accidentally damaging the player Added extra damage for headshot Added head bob to player POV so it feels more natural Fixed the crosshair not being perfectly centered on screen Added a sliding door"}, {"post_id": 61005, "ts": "2026-09-03T18:19:05Z", "hours": 10.0069, "text": "Station siege - Devlog #6 This time I spent my hours optimizing the game, mainly because the game was borderline unplayable to work on. The map had ~90 live CSG collision shapes constantly recalculating in real time. I baked them into static geometry. Also, I swapped out the majority of 3D models in the map, which were absurdly overbuilt. Most had over a million faces, while one was sitting at ~3 million faces for a single 1x1 meter window. The editor is noticeably faster now. Another huge change was the map. Now it is a tube-like corridor connected to a polygon with 18 sides. There is also a small room connected to the ring. This ate up most of my hours. A small yet meaningful thing was the lighting overhaul. I pivoted from flat, evenly lit corridors to nearly dark chambers with higher contrast and isolated pools of light. Moreover, I added flickering animation to some of the lights so there’s some variety. Last thing is the new HUD. It’s not final yet; I will likely iterate multiple times before settling on the ideal one. However, it’s a noticeable upgrade from the previous flat white text on the screen. What I’m most happy about is still the optimization. My laptop isn’t particularly a RAM titan, so this is really important for me. I think this will ripple into other areas of the development and speed things up a lot."}, {"post_id": 52856, "ts": "2026-08-23T06:59:58Z", "hours": 13.4275, "text": "Devlog #5 - The station finally looks like a station. Last time, the place was simply a box with some texture, fog and good lighting. Now it actually has real objects, and smoothher gameplay. Biggest thing: I built out a full Tripo3D asset pipeline and used it to generate a whole set of props. Window, metal junk, archways, tubes, a metal fence, vent, door, and a vending machine used for weapon purchasing, all are wired up. The place, at least the corridor, can larp as an abandoned space station and not just a box. Another small update for immersiveness: I added creepy ambient background music. Small, but does a lot of work when you are in an empty hallway and hear nothing but that song. Took me expensive 13 hours but it was all worth it."}, {"post_id": 19506, "ts": "2026-06-30T20:37:05Z", "hours": 14.3875, "text": "This one’s huge. 14 hours logged and the game is totally not the same game anymore. Biggest news first: I pivoted the whole thing. It used to be a generic zombie shooter on Earth. Now it’s Station Siege - a dark horror-survival game set on n abandoned space station. And no, this wasn’t a random. Three reasons: Earth zombies are overdone and generic, my 2018 Intel Mac physically cannot handle realistic Earth environments without dying, and a pitch-black abandoned space station justifies the oppressive lighting and lore for free. I even did actual homework, studied why Lethal Company, R.E.P.O. and PEAK blew up (turns out: co-op survival horror, simple visuals, mood over graphics). So the direction is locked now, backed by real reasoning instead of vibes. The zombies got a massive glow-up. They now groan at you in the dark (positional audio on random timers. Honestly the single biggest horror upgrade I’ve made), they wind up an attack animation when they reach you or a barricade, and they play a death animation before crumpling and disappearing instead of just vanishing. I also generated a custom horror zombie with Tripo3D, retopologized it from 1.9 million triangles down to ~11k so my Mac doesn’t catch fire, and rigged it through Mixamo. The struggle award goes to the AnimationPlayer. Getting multiple Mixamo animations onto one model in Godot is way more painful than it sounds, name collisions everywhere (everything Mixamo exports is named “mixamo_com”), two AnimationPlayers fighting over one skeleton, and getting the death animation to actually finish before the body gets deleted. I spent hours in that menu. But it works now. Btw thanks to @sol4r_on_hackclub for suggesting using mixamo assets. Atmosphere-wise: black space void background, cold dark lighting, fog retuned to feel like a morgue. Added screen shake when you get hit and a blood overlay that gets heavier the lower your health drops. Also solved a nasty FPS hitch where the whole map stuttered the first time it rendered, fixed it with a black loading screen that spins the camera in a full circle while hidden, so all the shaders compile before the player ever sees anything. Pretty proud of that one. And of course, the Intel GPU texture curse struck again (devlog #3 readers know the grass saga). Every single model I imported rendered as a black blob until I remembered my own golden rule: compress everything Lossless or it won’t decode. Nearly lost my mind a second time before it clicked. One design decision I’m happy about: I’m keeping real gun sounds instead of sci-fi laser noises. Grounded firearms fit horror way better, and they make sense for a human station that got overrun. Next up: Finish wiring the male zombie (texture + animations) Reskin barricades into hull breaches / blast doors Build out the 4-room map (Airlock → Hangar → Reactor / Med Bay) Per-room zombie spawning (only spawn in rooms you’ve unlocked) Props to fill the empty rooms - consoles, crates, corpses - so the station feels lived-in and abandoned"}, {"post_id": 14666, "ts": "2026-06-23T21:04:15Z", "hours": 6.9606, "text": "Devlog #3 - A lot of updates on the zombie-game. Whooh, where do I even start? I made a functional barricade that repairs when pressing shift and that zombies can break to escape. I added crosshair, gold and health labels on screen. I added actual grass texture instead of grey floor I added shotgun - a second weapon - and a real shop where you can buy it using gold. I added jumping mechanics I changed the map from 2 platforms connected by a bridge to a single large platform. The biggest struggle was the grass although it sounds kinda ridiculous. I added it for the first time and it rendered either extreme green or extreme grey, nothing in between. It resembled nothing in the actual grass texture that I used. Turns out my Intel Mac can’t decode DXT-compressed textures so anything I imported rendered as weird slop. Fixed it with one setting - compress: losless. Nearly ragequit but then reimported and worked perfectly. A lot of stuff out of my to-do list in just 7 hours. Next, I will focus on adding more weapons (e.g sniper), expanding the map, adding actual buidings (e.g bunker), dedicated zombie spawning spots, and real sound effects."}, {"post_id": 13034, "ts": "2026-06-21T09:59:49Z", "hours": 0.9778, "text": "Made some progress on my zombie game! the map is a larger now with a corridor connecting 2 platforms. I also added 3 more zombies and obstacles to the map. Next step is to make them spawn continuously and give them actual body instead of green cube :/"}, {"post_id": 12664, "ts": "2026-06-20T18:06:58Z", "hours": 2.1242, "text": "Working on a cool zombie game :). Just made the first map, working gun and zombie (that little green cube on the screen). So far smooth, never had so much fun. Next step is to give shape to the player and the zombie"}]...
|
Title: station-siege by @Abbos | Stardance
Devlog Title: station-siege by @Abbos | Stardance
Devlogs:
Working on a cool zombie game :). Just made the first map, working gun and zombie (that little green cube on the screen). So far smooth, never had so much fun. Next step is to give shape to the player and the zombie
Made some progress on my zombie game! the map is a larger now with a corridor connecting 2 platforms. I also added 3 more zombies and obstacles to the map. Next step is to make them spawn continuously and give them actual body instead of green cube :/
Devlog #3 - A lot of updates on the zombie-game. Whooh, where do I even start? I made a functional barricade that repairs when pressing shift and that zombies can break to escape. I added crosshair, gold and health labels on screen. I added actual grass texture instead of grey floor I added shotgun - a second weapon - and a real shop where you can buy it using gold. I added jumping mechanics I changed the map from 2 platforms connected by a bridge to a single large platform. The biggest struggle was the grass although it sounds kinda ridiculous. I added it for the first time and it rendered either extreme green or extreme grey, nothing in between. It resembled nothing in the actual grass texture that I used. Turns out my Intel Mac can’t decode DXT-compressed textures so anything I imported rendered as weird slop. Fixed it with one setting - compress: losless. Nearly ragequit but then reimported and worked perfectly. A lot of stuff out of my to-do list in just 7 hours. Next, I will focus on adding more weapons (e.g sniper), expanding the map, adding actual buidings (e.g bunker), dedicated zombie spawning spots, and real sound effects.
This one’s huge. 14 hours logged and the game is totally not the same game anymore. Biggest news first: I pivoted the whole thing. It used to be a generic zombie shooter on Earth. Now it’s Station Siege - a dark horror-survival game set on n abandoned space station. And no, this wasn’t a random. Three reasons: Earth zombies are overdone and generic, my 2018 Intel Mac physically cannot handle realistic Earth environments without dying, and a pitch-black abandoned space station justifies the oppressive lighting and lore for free. I even did actual homework, studied why Lethal Company, R.E.P.O. and PEAK blew up (turns out: co-op survival horror, simple visuals, mood over graphics). So the direction is locked now, backed by real reasoning instead of vibes. The zombies got a massive glow-up. They now groan at you in the dark (positional audio on random timers. Honestly the single biggest horror upgrade I’ve made), they wind up an attack animation when they reach you or a barricade, and they play a death animation before crumpling and disappearing instead of just vanishing. I also generated a custom horror zombie with Tripo3D, retopologized it from 1.9 million triangles down to ~11k so my Mac doesn’t catch fire, and rigged it through Mixamo. The struggle award goes to the AnimationPlayer. Getting multiple Mixamo animations onto one model in Godot is way more painful than it sounds, name collisions everywhere (everything Mixamo exports is named “mixamo_com”), two AnimationPlayers fighting over one skeleton, and getting the death animation to actually finish before the body gets deleted. I spent hours in that menu. But it works now. Btw thanks to @sol4r_on_hackclub for suggesting using mixamo assets. Atmosphere-wise: black space void background, cold dark lighting, fog retuned to feel like a morgue. Added screen shake when you get hit and a blood overlay that gets heavier the lower your health drops. Also solved a nasty FPS hitch where the whole map stuttered the first time it rendered, fixed it with a black loading screen that spins the camera in a full circle while hidden, so all the shaders compile before the player ever sees anything. Pretty proud of that one. And of course, the Intel GPU texture curse struck again (devlog #3 readers know the grass saga). Every single model I imported rendered as a black blob until I remembered my own golden rule: compress everything Lossless or it won’t decode. Nearly lost my mind a second time before it clicked. One design decision I’m happy about: I’m keeping real gun sounds instead of sci-fi laser noises. Grounded firearms fit horror way better, and they make sense for a human station that got overrun. Next up: Finish wiring the male zombie (texture + animations) Reskin barricades into hull breaches / blast doors Build out the 4-room map (Airlock → Hangar → Reactor / Med Bay) Per-room zombie spawning (only spawn in rooms you’ve unlocked) Props to fill the empty rooms - consoles, crates, corpses - so the station feels lived-in and abandoned
Devlog #5 - The station finally looks like a station. Last time, the place was simply a box with some texture, fog and good lighting. Now it actually has real objects, and smoothher gameplay. Biggest thing: I built out a full Tripo3D asset pipeline and used it to generate a whole set of props. Window, metal junk, archways, tubes, a metal fence, vent, door, and a vending machine used for weapon purchasing, all are wired up. The place, at least the corridor, can larp as an abandoned space station and not just a box. Another small update for immersiveness: I added creepy ambient background music. Small, but does a lot of work when you are in an empty hallway and hear nothing but that song. Took me expensive 13 hours but it was all worth it.
Station siege - Devlog #6 This time I spent my hours optimizing the game, mainly because the game was borderline unplayable to work on. The map had ~90 live CSG collision shapes constantly recalculating in real time. I baked them into static geometry. Also, I swapped out the majority of 3D models in the map, which were absurdly overbuilt. Most had over a million faces, while one was sitting at ~3 million faces for a single 1x1 meter window. The editor is noticeably faster now. Another huge change was the map. Now it is a tube-like corridor connected to a polygon with 18 sides. There is also a small room connected to the ring. This ate up most of my hours. A small yet meaningful thing was the lighting overhaul. I pivoted from flat, evenly lit corridors to nearly dark chambers with higher contrast and isolated pools of light. Moreover, I added flickering animation to some of the lights so there’s some variety. Last thing is the new HUD. It’s not final yet; I will likely iterate multiple times before settling on the ideal one. However, it’s a noticeable upgrade from the previous flat white text on the screen. What I’m most happy about is still the optimization. My laptop isn’t particularly a RAM titan, so this is really important for me. I think this will ripple into other areas of the development and speed things up a lot.
**Devlog #7 ** A lot of stuff added so this time I’ll try to keep it short and concise. Gun model kickback on firing. Muzzle smoke on every shot Real travelling bullet projectile instead of yellow ray Bullet shell ejected every time you fire Fixed the weird bug with zombie not spawning at all. Fixed an unexpepcted bug where corridor lights worked facing one way but not the other. It was because of too many lights crowded into one area after duplicating the lights node to new added areas. Fixed the bug with bullets sometimes passing through the zombies without hitting Fixed the bug with the gun accidentally damaging the player Added extra damage for headshot Added head bob to player POV so it feels more natural Fixed the crosshair not being perfectly centered on screen Added a sliding door
Devlog #wa8 I’ll just keep it short Added: Sprinting Added male zombie (finally) Overhauled wave manager. Now zombies in rooms that are locked will not spawn until you unlock them yourself. Switched to open only doors so players can’t just go to empty room to heal forever Replaced wooden plank in barricades for rusty slab of metal with sound effect when fixing. Fixed a bug where zombies broke barricades unreliably. A dozen zombies took a whole minute to break 2 barricades due to a timing mismatch Built main menu screen Built pause menu Added ammo reserve system so weapons finally stop having infinite ammo except for default pistol
#9th devlog. Station Siege. Achieved: Added acid puddle as an environmental threat. Can be used to kite zombies and kill them or likewise, end up hurting yourself if you step on it. Messages in HUD when interacting with barricades, vending machine, and acid puddle. Improved zombie navigation. Now it’s completely foolproof to sharp corner turns. Added sound effect when reloading. I had the mp3 and wav files lying there doing nothing for a while but now i finally wired them in. Added like a dozen new props. Took everything from SketchFab, and used them to decorate medical bay, engineering, and cargo. Replaced almost all existing AI generated 3d models to the ones took from sketchfab. Mainly because they had like a trillion faces which was frying my CPU but also they kinda looked soulless and low effort. Added an interior wall in the spawn chamber so zombies dont look like they appear out of thin air when they spawn. Also redesigned the barricade slightly. Good for realism Changed the game map extensively. The ring part is gone. That part made sense in the beginning but the more I tested, the more I realized that shape is not ideal for my game. It’s too big and you can kite zombies forever. Now, the map looks more like spaceship themed family home interior and it’s actualyl challenging here now. You can get cornered and slimed unexpectedly.
Devlog #10 - my last devlog. Done: Removed jumping (it had no purpose) Repairing is now done via the F button. Shipped the game to itch.io. This took me a while. The export was 2.3 gigabytes, so itch.io flat-out rejected it due to size limits. I removed a pile of unused models from the export. GPU texture compression came out garbled in WebGL, so I switched the textures to WebP capped at 2048px. That got the build down to about 150 MB, well under itch’s 200 MB per-file limit. You can play it here: https://madyarov27.itch.io/station-siege-web . I also cleaned up the repo, rewrote the README, and pushed everything to GitHub, including the zombie model through Git LFS.
Ships:
I made Station Siege, a first-person zombie shooter set on an abandoned space station. You fight through 10 waves of zombies, earn gold for kills, and spend it on weapons, ammo, and unlocking doors to different rooms. It’s built in Godot 4.7 and runs in the browser. The hardest part was zombie pathfinding. Zombies kept getting stuck in their spawn rooms, and one stuck zombie was enough to stop the next wave from starting. It turned out the doors were baked into the navigation mesh as closed, so even with a door open, the zombies had no path out. I rebuilt the navmesh without doors and barricades, and added a backup that despawns any zombie that makes no progress for 20 seconds. Getting it onto the web was the other big challenge. The first export was 2.3 GB, so I cut unused models and switched textures to a web-safe format to get it under itch’s 200 MB limit. I’m proudest of the atmosphere: the dark corridors, the barricades zombies tear through, and the moment a wave starts pouring in from several directions at once. How to test: Open the itch link in Chrome or Edge on a desktop computer. It doesn’t work on phones. Click Start, then click inside the game window to lock the mouse. Controls: WASD to move, Shift to sprint, left click to shoot, R to reload, 1-3 to switch weapons, E to interact or buy, hold F to repair a barricade, Esc to pause. They’re also on the Controls screen in the main menu. The first load can take a little while because the game is about 150 MB. Read the note near the spawn. It tells you where to find the shotgun, machine gun and gives a small backstory....
|
1792853701.2621484
|
1792940101.2621484
|
|
28121
|
Chatbot RAG by @Hamna | Stardance
|
Hamna
|
2
|
77.71
|
1127
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-04T20:16:08Z", "hours": 37.0, "multiplier": 16.89, "payout": 615, "blessing": "neutral", "text": "Made a RAG chatbot that mimics my friends personality using Llama and Hugging Face. NOTE: I’m using zero GPU on HF so after 100 msgs it goes to sleeping mood , in that case the chatbot would reply a random thing like “system off” , “internet is down” or something like that , so don’t worry about that, come after 24Hr and she’ll talk normally FACT: Senpai used to say a lot “Haii haii” which is a japanese phrase for “yes” so don’t worry about that either, she’s just being friendly with ya Hope ya’ll love this version of chatbot", "repo": "https://github.com/lilithCode/Senpai-Chatbot", "demo": "https://senpai-chatbot.vercel.app/"}, {"ship_num": 2, "ts": "2026-08-17T14:23:40Z", "hours": 36.0, "multiplier": 14.99, "payout": 512, "blessing": "neutral", "text": "I built a AI RAG chatbot that mimics my friends personality , trained on whatsapp chats so it actually talks like my friend instead of generic robot ai. fine tuned llama 3b with LoRA on kaggle’s free gpu, deployed it on hf spaces zeroGPU gradio for backend and next.js on vercel for frontend, plus added RAG so it can clean up messy texts and pull live info from the web when needed. it genuinely feels like talking to my friend, all built for free. to test it. just start chatting, first msg might take a sec to load (model’s waking up)", "repo": "https://github.com/lilithCode/Senpai-Chatbot", "demo": "https://senpai-chatbot.vercel.app/"}]...
|
[{"post_id": 78990, "ts": "202 [{"post_id": 78990, "ts": "2026-10-12T08:38:28Z", "hours": 4.7081, "text": "here"}, {"post_id": 61751, "ts": "2026-09-04T20:10:09Z", "hours": 0.5464, "text": "Guyss!! This is gonna be the last change I’ve made today, Senpai chatbot is live now and she’s talking like my friend (really couldn’t be more happy to see her talk to me again 🥹 )"}, {"post_id": 61709, "ts": "2026-09-04T19:04:49Z", "hours": 0.4631, "text": "Made some Minor UI changes on frontend nextjs"}, {"post_id": 53148, "ts": "2026-08-23T16:07:39Z", "hours": 9.6033, "text": "After testing the chatbot with around 50 beta users, I found several issues that weren’t obvious during development. Responses were too long, the personality became too generic when using RAG, Urdu and English were sometimes mixed incorrectly, and the mobile layout needed work. I shortened the responses, restricted web search to things like news and sports, improved the system prompt and input handling, redesigned the mobile UI, and added a message explaining the cold start delay"}, {"post_id": 51779, "ts": "2026-08-21T16:52:36Z", "hours": 8.5322, "text": "I added logging, I started finding problems that weren’t obvious from the frontend. Web searches were sometimes failing silently, too many messages were causing token overflows, and using both max_length and max_new_tokens was causing unexpected behavior. I fixed these issues by adding proper error handling, limiting the conversation context, and simplifying the token settings. I also built a small debug dashboard to track searches, response times, token usage, and errors (Ughh I’m really exhausted now)"}, {"post_id": 50775, "ts": "2026-08-20T04:39:03Z", "hours": 8.7972, "text": "I initially moved the deployment to Replicate to improve response speed. It worked and responses dropped from around 15–30 seconds to about 5–10 seconds but then it also introduced extra cost and complexity. In the end, I decided to stay with Hugging Face Spaces because the free setup is more suitable for this side project. Also improved the HF app.py file"}, {"post_id": 50127, "ts": "2026-08-19T06:54:46Z", "hours": 8.6286, "text": "I noticed that the model was giving very generic and robotic responses even though it worked much better during training. After debugging, I realized I was using a different system prompt during inference than the one I used while fine tuning. Once I switched back to the exact same prompt, the responses became much more consistent. Also fixed Hackclub key errors , now it’s working fine"}, {"post_id": 48921, "ts": "2026-08-17T14:15:13Z", "hours": 10.1547, "text": "wanted senpai to be more. Previous It was only talking with using fine tuned Llama model but if i’ll ask it something like what’s happening in the world, it won’t talk back like my friend cause it didn’t have that latest information of the world so i added RAG. used the hackclub api as a middleman llm that cleans up messy input and decides if a web search is needed ( like “what’s the fifa score rn” this will be flagged as a web search needed query) two bugs along the way: responses were so slow at first , turns out just zeroGPU cold starts, chills out after msg 1 model started sounding fake n robotic bc i overwrote it with a huge system prompt. fixed this by making the heavy prompt short so now gng it’s live, plz talk to her"}, {"post_id": 46190, "ts": "2026-08-13T07:44:42Z", "hours": 7.7883, "text": "I uploaded my model on Hugging Face with zero GPU (made a new hf space called amadeus, picked gradio as the sdk, zeroGPU as hardware) If someone else is thinking about starting in HF, just wanna tell the annoying part: cold starts. first message takes 20-40s while the model loads into memory. after that it’s quick like 3-8s then built an actual next.js frontend since raw gradio ui felt kinda mid, hooked it up through an api route, deployed on vercel with my env keys And it’s live"}, {"post_id": 45064, "ts": "2026-08-11T10:21:56Z", "hours": 11.2864, "text": "Trained the data ( This took soo much time fr) I used kaggle’s free gpu (t4, sometimes p100 if i got lucky) to fine tune llama 3b with LoRA through PEFT. quick explainer since people asked LoRA freezes the whole base model (32m params untouched) and only trains a tiny set of adapter params (420k). instead of retraining the entire model I put a extra layer of changed weights on top of the model which is way cheaper and faster than the traditional training tested it after training and it WORKED. The model is giving the same energy, same little phrases, actual personality of my friend which is kinda scary ngl notebook’s public if you wanna nerd out: https://www.kaggle.com/code/hamnamubarak/amadeus/edit"}, {"post_id": 33459, "ts": "2026-07-23T13:12:01Z", "hours": 6.3861, "text": "so i’m building senpai, an ai that actually talks like my friend, not some normal chatbot. so first thing first, I need data to learn from so here’s wht I did: exported a whole year of whatsapp chats with my friend (yes i read through all of it, and got his consent). wrote a python script on kaggle to clean it up and formatting it into proper training pairs not glamorous but this is like 30% of the actual work tbh, garbage data can cause strange and irrelevant replies Then I trained this on Kaggle with Llama model with LoRA adaptation Right now the replies aren’t so great, I’ll do some fine tuning later"}]...
|
Title: Chatbot RAG by @Hamna | Stardance
Devlogs: Title: Chatbot RAG by @Hamna | Stardance
Devlogs:
so i’m building senpai, an ai that actually talks like my friend, not some normal chatbot. so first thing first, I need data to learn from so here’s wht I did: exported a whole year of whatsapp chats with my friend (yes i read through all of it, and got his consent). wrote a python script on kaggle to clean it up and formatting it into proper training pairs not glamorous but this is like 30% of the actual work tbh, garbage data can cause strange and irrelevant replies Then I trained this on Kaggle with Llama model with LoRA adaptation Right now the replies aren’t so great, I’ll do some fine tuning later
Trained the data ( This took soo much time fr) I used kaggle’s free gpu (t4, sometimes p100 if i got lucky) to fine tune llama 3b with LoRA through PEFT. quick explainer since people asked LoRA freezes the whole base model (32m params untouched) and only trains a tiny set of adapter params (420k). instead of retraining the entire model I put a extra layer of changed weights on top of the model which is way cheaper and faster than the traditional training tested it after training and it WORKED. The model is giving the same energy, same little phrases, actual personality of my friend which is kinda scary ngl notebook’s public if you wanna nerd out: https://www.kaggle.com/code/hamnamubarak/amadeus/edit
I uploaded my model on Hugging Face with zero GPU (made a new hf space called amadeus, picked gradio as the sdk, zeroGPU as hardware) If someone else is thinking about starting in HF, just wanna tell the annoying part: cold starts. first message takes 20-40s while the model loads into memory. after that it’s quick like 3-8s then built an actual next.js frontend since raw gradio ui felt kinda mid, hooked it up through an api route, deployed on vercel with my env keys And it’s live
wanted senpai to be more. Previous It was only talking with using fine tuned Llama model but if i’ll ask it something like what’s happening in the world, it won’t talk back like my friend cause it didn’t have that latest information of the world so i added RAG. used the hackclub api as a middleman llm that cleans up messy input and decides if a web search is needed ( like “what’s the fifa score rn” this will be flagged as a web search needed query) two bugs along the way: responses were so slow at first , turns out just zeroGPU cold starts, chills out after msg 1 model started sounding fake n robotic bc i overwrote it with a huge system prompt. fixed this by making the heavy prompt short so now gng it’s live, plz talk to her
I noticed that the model was giving very generic and robotic responses even though it worked much better during training. After debugging, I realized I was using a different system prompt during inference than the one I used while fine tuning. Once I switched back to the exact same prompt, the responses became much more consistent. Also fixed Hackclub key errors , now it’s working fine
I initially moved the deployment to Replicate to improve response speed. It worked and responses dropped from around 15–30 seconds to about 5–10 seconds but then it also introduced extra cost and complexity. In the end, I decided to stay with Hugging Face Spaces because the free setup is more suitable for this side project. Also improved the HF app.py file
I added logging, I started finding problems that weren’t obvious from the frontend. Web searches were sometimes failing silently, too many messages were causing token overflows, and using both max_length and max_new_tokens was causing unexpected behavior. I fixed these issues by adding proper error handling, limiting the conversation context, and simplifying the token settings. I also built a small debug dashboard to track searches, response times, token usage, and errors (Ughh I’m really exhausted now)
After testing the chatbot with around 50 beta users, I found several issues that weren’t obvious during development. Responses were too long, the personality became too generic when using RAG, Urdu and English were sometimes mixed incorrectly, and the mobile layout needed work. I shortened the responses, restricted web search to things like news and sports, improved the system prompt and input handling, redesigned the mobile UI, and added a message explaining the cold start delay
Made some Minor UI changes on frontend nextjs
Guyss!! This is gonna be the last change I’ve made today, Senpai chatbot is live now and she’s talking like my friend (really couldn’t be more happy to see her talk to me again 🥹 )
here
Ships:
I built a AI RAG chatbot that mimics my friends personality , trained on whatsapp chats so it actually talks like my friend instead of generic robot ai. fine tuned llama 3b with LoRA on kaggle’s free gpu, deployed it on hf spaces zeroGPU gradio for backend and next.js on vercel for frontend, plus added RAG so it can clean up messy texts and pull live info from the web when needed. it genuinely feels like talking to my friend, all built for free. to test it. just start chatting, first msg might take a sec to load (model’s waking up)
Made a RAG chatbot that mimics my friends personality using Llama and Hugging Face. NOTE: I’m using zero GPU on HF so after 100 msgs it goes to sleeping mood , in that case the chatbot would reply a random thing like “system off” , “internet is down” or something like that , so don’t worry about that, come after 24Hr and she’ll talk normally FACT: Senpai used to say a lot “Haii haii” which is a japanese phrase for “yes” so don’t worry about that either, she’s just being friendly with ya Hope ya’ll love this version of chatbot...
|
1792983108.5054207
|
1793069508.5054207
|
|
44357
|
Starforge by @lacorte | Stardance
|
lacorte
|
2
|
81.24
|
1116
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-24T15:29:30Z", "hours": 34.0, "multiplier": 18.98, "payout": 618, "blessing": "neutral", "text": "⭐ Starforge is a pixel art & animation studio that runs entirely in your browser. Open (starforge.lacorte.city)[https://starforge.lacorte.city] and draw, as of this ship, your drawing moves. Ship 2 is the Animation Update. Animate : a frame timeline where every frame carries its own duration in milliseconds. Add, reorder and duplicate frames, play the reel on the document’s own clock, and draw with onion skinning. Export : an animated GIF encoder written byte by byte, from the GIF89a header to the LZW dictionary resets. When your art has more than 256 colors, a hand-rolled median-cut quantizer folds it into a legal palette instead of refusing. The Export dialog plays the actual GIF before you download it, next to its true byte size. Spritesheets come out of the same door. Draw : mirror mode, switch on an axis and the editor paints the reflection live under your pencil. The Color Studio mixes any color in HSV, hex or per-channel RGBA. Trackpad zoom got tamed: wheel deltas accumulate into clean notches instead of stepping twenty-five times per glide. Keep your work : editable .starforge project files, and Portable PNG, a real image with the whole project embedded inside, so the file you post is also the file you keep editing. Autosave still catches every stroke, and even a crash screen can still export your drawing. Under the hood : 563 tests, zero dependencies in the core. The encoder is proven against ffmpeg that decodes my GIFs and every pixel comes back identical, including a noise frame built to overflow the LZW dictionary. Quantization is deterministic, same art to the same bytes, and folds ~10,000 colors into 256 in about 23ms. Where it’s going : next ship, the “multiplayer” in the tagline becomes real, a hand-rolled CRDT (last-writer-wins per cell, Lamport clocks) and shareable rooms. Works on your phone. Shortcuts follow Aseprite. Press ? in the editor.", "repo": "https://github.com/Gabriel-Lacorte/starforge", "demo": "https://starforge.lacorte.city/"}, {"ship_num": 2, "ts": "2026-08-10T01:15:34Z", "hours": 29.0, "multiplier": 17.82, "payout": 498, "blessing": "neutral", "text": "⭐ Starforge is a pixel art studio that runs entirely in your browser. Open starforge.lacorte.city and draw. This first ship is the whole editor core, built from scratch in TypeScript with zero dependencies in the core. Draw : pencil, eraser, line, rectangle and ellipse (outline or filled), and a bucket fill with per-channel tolerance and a contiguous/global switch. Rectangular selection that lifts the pixels and lets you drag them anywhere. Layers : add, duplicate, reorder, rename. Per-layer opacity, seven blend modes, visibility and lock. Keep your work : undo/redo across pixel strokes and structural edits alike, autosave in the browser, and PNG export If the editor ever crashes, the error screen still exports your drawing. Under the hood : 208 tests, including property tests that throw hundreds of random actions at the history and require a byte-identical document back. The renderer composites once per change, not once per layer: the cache key is two integers, and panning triggers zero recompositions. Flood fill, Bresenham lines, ellipse rasterizer, composito, all hand-rolled, no graphics libraries. Where it’s going : the “multiplayer” in the tagline is the arc: a hand-rolled CRDT (last-writer-wins per cell with Lamport clocks) and shareable rooms are the next major ships. Works on your phone. Shortcuts follow Aseprite. Press ? in the editor.", "repo": "https://github.com/Gabriel-Lacorte/starforge", "demo": "https://starforge.lacorte.city/"}]...
|
[{"post_id": 64302, "ts": "202 [{"post_id": 64302, "ts": "2026-09-08T16:20:23Z", "hours": 8.6656, "text": "⭐ Starforge is a pixel art & animation studio that runs in your browser. Last time the relay queue was in memory. Now it is a real wire using native WebSocket to talk with the relay I wrote by hand on node:http , handshake, framing, mask, fragmentation, ping/pong, close codes, all of it. Draw a horizontal stroke here, a vertical one there, and both canvases land on the same pixels. 900 pixels travel in 2,730 bytes. Raw it would be 7,200 (8 bytes per pixel: u16 x , u16 y , u32 color ). On the wire the cells sort by (y, x) , coordinates go as zigzag deltas, colors go as an index into a 1-entry table. That is 3.033 bytes per pixel, and every one of the 19 operation kinds round-trips byte-for-byte. The server does not trust a single byte, each op is validated with the same applyOperation the editor uses, on a clone. A bad op earns an ERROR and the connection stays open. Receipts: 662 unit tests green 23 Chromium E2E zero production dependencies Next: the ephemeral room becomes shareable rooms /r/<id>"}, {"post_id": 61840, "ts": "2026-09-04T23:16:43Z", "hours": 9.5767, "text": "⭐ Starforge is a pixel art & animation studio that runs in your browser. Since last week Starforge learned how to disagree without falling apart, and got more comfortable on tablets along the way. This is the first piece of multiplayer, two complete editors, two independent copies of the same drawing, and a queue between them. There is no server yet. I can draw in both editors, hold every message back, reverse their order, deliver one twice, and the documents still finish on the same pixels. Alongside that invisible foundation, community conversations pointed at five visible workflow breaks: the compact tablet layout only kicked in below 720 px, colours sat with layers and frames instead of the brush, palette authoring bounced between two dialogs, brush opacity used a tiny track while layer opacity had a fine large slider, and precise add/subtract selection hid behind keyboard modifiers touch users never see. All five are fixed in this pass. Receipts 633 green unit tests, with 4 ffmpeg cross four pinned seeds × 100 generated operations across three replicas, including pixel conflicts, scalar edits, palette replacement, layer/frame creation, deletion and ordering 20 Chromium E2E tests pass receiving and applying a 900-pixel patch averages about 0.49 ms on my development machine (2,034 patches/second in the recorded run) zero production dependencies in the core Next: the queue becomes a real wire, WebSocket handshake will be written by hand on node:http with the relay on a Raspberry Pi."}, {"post_id": 52640, "ts": "2026-08-22T21:36:24Z", "hours": 9.3367, "text": "⭐ Day 18 of building Starforge, a pixel art & animation studio that lives in your browser. That heart is only half real. I drew the left side and the editor drew the right side under my pencil, live. Mirror mode landed today, and I spent an embarrassing amount of time just watching the other half appear. Two more things came with it. The Export dialog now plays your actual GIF before you download it, next to its true size, same bytes as the download, so the dialog can’t lie to you. My greeting star comes out at 2.4 KB, using 125 of 256 colors. And the encoder learned to lose colors gracefully, which is my favorite thing I’ve built this week: How it works A GIF holds at most 256 colors. Until today, art with more colors hit a wall, an error message asking you to reduce your palette. I hated that message, so now the encoder runs median cut instead. Median cut, in human terms: pour every color in your drawing into one box. Find the box’s longest side, red, green or blue, whichever stretches widest, sort the colors along that side, and cut the box in half at the median. Repeat, always cutting the widest box you have left. After 255 cuts you hold 256 boxes, and each box’s average becomes one crayon in the final palette. Colors that sat close together end up sharing a crayon, which is exactly the kind of loss your eye forgives. The sneaky part is that the same drawing must produce the identical file every single time, so every sort breaks ties by the color’s own value and every average rounds the same way. There’s a test that encodes the same art twice and demands the bytes back, identical. Receipts 563 green tests ~10,000 colors in, 256 out, in about 23ms ffmpeg decodes the quantized file, and re-encoding what it hands back produces the identical bytes Last post I asked you to export a GIF and drop it in the comments. Nobody did :C, fair enough, the star was doing all the work. So today I made it personal: open starforge.lacorte.city , turn on mirror mode, and draw half a thing. The editor does the other half. Post what you get, I’ll feature my favorite in the next devlog :D. And a real question I can’t decide alone: diagonal axes or kaleidoscope. which should mirror mode learn first? Both are on the backlog. You can decide the order. (If you want to catch the next post, follow the project, that button actually notifies you. )"}, {"post_id": 51943, "ts": "2026-08-21T21:51:53Z", "hours": 5.2739, "text": "⭐ Starforge is a pixel art & animation studio that runs in your browser. The GIF above was drawn, animated and exported inside Starforge. Yesterday I said I was writing the GIF encoder by hand. It’s finished, and already sitting behind the Export button in the editor. How it works A GIF doesn’t store pixels. It stores a conversation between two sides that build the same notebook and never send it. The encoder walks the image. The first time it meets a run of pixels it spells the run out, then writes that run in a notebook next to a number. The next time the same run shows up, it sends the number instead of the pixels. The decoder reads those numbers and builds the identical notebook as it goes, which is why the notebook itself never travels, both sides derive it from the same stream. That’s LZW, and it’s lovely right up until you notice the decoder is permanently one entry behind. It can’t file a new run until it has read the code that comes after it. So when the notebook outgrows the current code width, the two sides widen at different moments, and the encoder has to wait one step longer than feels correct. Get that off-by-one wrong and the file is perfect for a few hundred bytes and then dissolves into confetti. That was my morning. Receipts 545 green tests I encoded with my code and decoded with ffmpeg . Every pixel came back identical 16 frames of 256×256 encode in 135ms Browsers quietly treat any GIF delay under 2 centiseconds as 10, so the encoder floors every frame there. Draw something at starforge.lacorte.city , export the GIF, and drop it in the comments! I’ll feature my favorites in the next devlog :D."}, {"post_id": 51700, "ts": "2026-08-21T15:01:44Z", "hours": 7.9314, "text": "⭐ Starforge is a pixel art & animation studio that runs in your browser. Yesterday I said those numbered cells at the bottom of the screenshot were today’s story. Here they are: every cell is a frame with its own duration in milliseconds, play runs the reel on the document’s own clock, and since today, the frame you’re drawing shows its neighbours behind it as ghosts. The star that greets you is a loop with 4 frames now, so you can already see the animation. Receipts : 527 green tests 3 recompositions parked with ghosts on three new end-to-end tests in a real browser Next : I’m writing a GIF encoder from scratch. By hand. :D"}, {"post_id": 51127, "ts": "2026-08-20T17:01:06Z", "hours": 11.9494, "text": "⭐ Starforge is a pixel art & animation studio that runs in your browser. The first ship reviews asked for three things: custom colors (two voters), a less twitchy zoom (one), and opening files (one). All three landed this week. The Color Studio mixes any color in HSV, hex or per-channel RGBA and drops it straight into your palette. The zoom got tamed (story below). And you can now save and open editable .starforge projects, including inside a Portable PNG, a real image with the whole project embedded in it, so the file you post is also the file you can keep editing. Wheel deltas lie about intent A Mac voter said the zoom flew. They were right, and the bug was pretty interesting (it also ate my whole morning). One click of a mouse wheel arrives as a single event of about 100px, but a trackpad glide arrives as dozens of tiny ~4px events. The old code stepped the zoom once per event: a mouse user got one clean step per click, a trackpad user got twenty-five. And I didn’t even know pinch was part of the bug until I read how Chrome handles it: a pinch is faked as ctrl+wheel, so it lands in the same handler too. The fix: accumulate to 100, then discard the remainder. Every event banks its delta. A step only fires when the bank crosses a notch, and turning around mid-glide resets the bank instead of cancelling a step you already saw. Receipts : 511 green tests an e2e that draws, reloads the page and exports in a real browser golden ink fixtures pinned by SHA256 Those numbered cells at the bottom of the screenshot are tomorrow’s story :D"}, {"post_id": 44328, "ts": "2026-08-10T00:30:52Z", "hours": 5.2836, "text": "⭐ Starforge is a pixel art editor that runs in your browser. No engine work today, since I focused on a more important point: Whoever opens starforge.lacorte.city from a feed post, leaves in about two minutes, with no instructions and usually a phone in their hand, so the whole day went into that first visit. You can start your own document now insted of only erasing the star, your drawings survives a reload, and on a phone the layer panel became a drawer. How it works Most web editors take your drawing with them when they break. This one doesn’t. When a component throws, an error boundary renders a screen where Export PNG still works, if the editor dies, you get the PNG out before you reload. Two reasons that’s possible. The document never lived inside the component that broke: it belongs to the DocumentSession, outside the render tree. And the export never goes through the editor, it composites the frame straight from the document. The thing that holds your art and the thing that failed are not the same thing. Receipts: 208 green tests draw, reload, auto-save a keys help menu for shortcuts and gestures zoom by button, fit in one click Tomorrow morning the first real ship goes out :D"}, {"post_id": 43584, "ts": "2026-08-08T22:37:35Z", "hours": 6.3333, "text": "⭐ Starforge is a pixel art editor that runs in your browser. Yesterday it could only draw in a single surface. Today the same old star is five stacked layers, carrying its own opacity, visibility and lock, plus a rule for how its colors blend with the layers below. How it works Compositing every layer on every frame can’t hold 60fps. At 256x256 with eight layers at 800% zoom that’s eight blits of 2048×2048 per frame, about 33 megapixels of work to show a picture that didn’t change. So the editor composites once per change into an offscreen canvas, and the screen just draws that one image. Rendering with no cost since that nothing changed. All with 169 green tests."}, {"post_id": 42960, "ts": "2026-08-07T23:09:15Z", "hours": 10.7408, "text": "⭐ Starfoge: A multiplayer pixel art & animation studio that runs in your browser. Day three, and it finally draws! The whole toolbox landed with six drawing tools and keyboard shortcuts already known by pixel artists. Yesterday’s 37 green tests are 117 today. Today i want to deep dive in one of the questions i had: why fast strokes come out dotted. The browser only tells the page where the mouse is once per screen frame (~60fps), but a hand can cross half the canvas between two of those reports and a quick zigzag would become a trail of separated dots. The fix comes in two layers: First , the browser actually keeps the positions it skipped and hands them back in a bundle with each event, so I ask for those in-between samples. Second , even those have gaps when the gesture is really fast, so between every pair of samples I draw a tiny line using Bresenham algorithm , the same grid walker my line tool uses, it steps from one pixel to a touching neighbor and can’t skip a cell by construction. So every stroke you see is secretly dozens of tiny straight lines, stitched end to end. Tomorrow i will start landing Layers to our studio. Thanks for reading and see you on the next devlog :D"}, {"post_id": 42013, "ts": "2026-08-06T15:42:02Z", "hours": 6.3106, "text": "⭐ Starforge is alive in the browser! This is day two building a multiplayer pixel art studio. So far the editor opens with a little star, and every pixel stays razor sharp at any zoom. With 37 green tests I already started coding the first drawing tools (pencil, eraser, bucket). The sharpness comes from a two stage blit with shared memory. A sprite’s pixels live in one Uint8Array wrapped in an ImageData view, using only one buffer for model and image bytes. Stage one pushes just the changed rectangle onto an offscreen canvas (1:1) which ignores scaling and smoothing so it never blurs. Stage two is a single draw image that stretches the offscreen canvas to the current zoom with the GPU doing the nearest-neighbor upscaling for free. When the pencil lands next ship, the bytes it writes are already the bytes the renderer reads."}]...
|
Title: Starforge by @lacorte | Stardance
Devlogs: Title: Starforge by @lacorte | Stardance
Devlogs:
⭐ Starforge is alive in the browser! This is day two building a multiplayer pixel art studio. So far the editor opens with a little star, and every pixel stays razor sharp at any zoom. With 37 green tests I already started coding the first drawing tools (pencil, eraser, bucket). The sharpness comes from a two stage blit with shared memory. A sprite’s pixels live in one Uint8Array wrapped in an ImageData view, using only one buffer for model and image bytes. Stage one pushes just the changed rectangle onto an offscreen canvas (1:1) which ignores scaling and smoothing so it never blurs. Stage two is a single draw image that stretches the offscreen canvas to the current zoom with the GPU doing the nearest-neighbor upscaling for free. When the pencil lands next ship, the bytes it writes are already the bytes the renderer reads.
⭐ Starfoge: A multiplayer pixel art & animation studio that runs in your browser. Day three, and it finally draws! The whole toolbox landed with six drawing tools and keyboard shortcuts already known by pixel artists. Yesterday’s 37 green tests are 117 today. Today i want to deep dive in one of the questions i had: why fast strokes come out dotted. The browser only tells the page where the mouse is once per screen frame (~60fps), but a hand can cross half the canvas between two of those reports and a quick zigzag would become a trail of separated dots. The fix comes in two layers: First , the browser actually keeps the positions it skipped and hands them back in a bundle with each event, so I ask for those in-between samples. Second , even those have gaps when the gesture is really fast, so between every pair of samples I draw a tiny line using Bresenham algorithm , the same grid walker my line tool uses, it steps from one pixel to a touching neighbor and can’t skip a cell by construction. So every stroke you see is secretly dozens of tiny straight lines, stitched end to end. Tomorrow i will start landing Layers to our studio. Thanks for reading and see you on the next devlog :D
⭐ Starforge is a pixel art editor that runs in your browser. Yesterday it could only draw in a single surface. Today the same old star is five stacked layers, carrying its own opacity, visibility and lock, plus a rule for how its colors blend with the layers below. How it works Compositing every layer on every frame can’t hold 60fps. At 256x256 with eight layers at 800% zoom that’s eight blits of 2048×2048 per frame, about 33 megapixels of work to show a picture that didn’t change. So the editor composites once per change into an offscreen canvas, and the screen just draws that one image. Rendering with no cost since that nothing changed. All with 169 green tests.
⭐ Starforge is a pixel art editor that runs in your browser. No engine work today, since I focused on a more important point: Whoever opens starforge.lacorte.city from a feed post, leaves in about two minutes, with no instructions and usually a phone in their hand, so the whole day went into that first visit. You can start your own document now insted of only erasing the star, your drawings survives a reload, and on a phone the layer panel became a drawer. How it works Most web editors take your drawing with them when they break. This one doesn’t. When a component throws, an error boundary renders a screen where Export PNG still works, if the editor dies, you get the PNG out before you reload. Two reasons that’s possible. The document never lived inside the component that broke: it belongs to the DocumentSession, outside the render tree. And the export never goes through the editor, it composites the frame straight from the document. The thing that holds your art and the thing that failed are not the same thing. Receipts: 208 green tests draw, reload, auto-save a keys help menu for shortcuts and gestures zoom by button, fit in one click Tomorrow morning the first real ship goes out :D
⭐ Starforge is a pixel art & animation studio that runs in your browser. The first ship reviews asked for three things: custom colors (two voters), a less twitchy zoom (one), and opening files (one). All three landed this week. The Color Studio mixes any color in HSV, hex or per-channel RGBA and drops it straight into your palette. The zoom got tamed (story below). And you can now save and open editable .starforge projects, including inside a Portable PNG, a real image with the whole project embedded in it, so the file you post is also the file you can keep editing. Wheel deltas lie about intent A Mac voter said the zoom flew. They were right, and the bug was pretty interesting (it also ate my whole morning). One click of a mouse wheel arrives as a single event of about 100px, but a trackpad glide arrives as dozens of tiny ~4px events. The old code stepped the zoom once per event: a mouse user got one clean step per click, a trackpad user got twenty-five. And I didn’t even know pinch was part of the bug until I read how Chrome handles it: a pinch is faked as ctrl+wheel, so it lands in the same handler too. The fix: accumulate to 100, then discard the remainder. Every event banks its delta. A step only fires when the bank crosses a notch, and turning around mid-glide resets the bank instead of cancelling a step you already saw. Receipts : 511 green tests an e2e that draws, reloads the page and exports in a real browser golden ink fixtures pinned by SHA256 Those numbered cells at the bottom of the screenshot are tomorrow’s story :D
⭐ Starforge is a pixel art & animation studio that runs in your browser. Yesterday I said those numbered cells at the bottom of the screenshot were today’s story. Here they are: every cell is a frame with its own duration in milliseconds, play runs the reel on the document’s own clock, and since today, the frame you’re drawing shows its neighbours behind it as ghosts. The star that greets you is a loop with 4 frames now, so you can already see the animation. Receipts : 527 green tests 3 recompositions parked with ghosts on three new end-to-end tests in a real browser Next : I’m writing a GIF encoder from scratch. By hand. :D
⭐ Starforge is a pixel art & animation studio that runs in your browser. The GIF above was drawn, animated and exported inside Starforge. Yesterday I said I was writing the GIF encoder by hand. It’s finished, and already sitting behind the Export button in the editor. How it works A GIF doesn’t store pixels. It stores a conversation between two sides that build the same notebook and never send it. The encoder walks the image. The first time it meets a run of pixels it spells the run out, then writes that run in a notebook next to a number. The next time the same run shows up, it sends the number instead of the pixels. The decoder reads those numbers and builds the identical notebook as it goes, which is why the notebook itself never travels, both sides derive it from the same stream. That’s LZW, and it’s lovely right up until you notice the decoder is permanently one entry behind. It can’t file a new run until it has read the code that comes after it. So when the notebook outgrows the current code width, the two sides widen at different moments, and the encoder has to wait one step longer than feels correct. Get that off-by-one wrong and the file is perfect for a few hundred bytes and then dissolves into confetti. That was my morning. Receipts 545 green tests I encoded with my code and decoded with ffmpeg . Every pixel came back identical 16 frames of 256×256 encode in 135ms Browsers quietly treat any GIF delay under 2 centiseconds as 10, so the encoder floors every frame there. Draw something at starforge.lacorte.city , export the GIF, and drop it in the comments! I’ll feature my favorites in the next devlog :D.
⭐ Day 18 of building Starforge, a pixel art & animation studio that lives in your browser. That heart is only half real. I drew the left side and the editor drew the right side under my pencil, live. Mirror mode landed today, and I spent an embarrassing amount of time just watching the other half appear. Two more things came with it. The Export dialog now plays your actual GIF before you download it, next to its true size, same bytes as the download, so the dialog can’t lie to you. My greeting star comes out at 2.4 KB, using 125 of 256 colors. And the encoder learned to lose colors gracefully, which is my favorite thing I’ve built this week: How it works A GIF holds at most 256 colors. Until today, art with more colors hit a wall, an error message asking you to reduce your palette. I hated that message, so now the encoder runs median cut instead. Median cut, in human terms: pour every color in your drawing into one box. Find the box’s longest side, red, green or blue, whichever stretches widest, sort the colors along that side, and cut the box in half at the median. Repeat, always cutting the widest box you have left. After 255 cuts you hold 256 boxes, and each box’s average becomes one crayon in the final palette. Colors that sat close together end up sharing a crayon, which is exactly the kind of loss your eye forgives. The sneaky part is that the same drawing must produce the identical file every single time, so every sort breaks ties by the color’s own value and every average rounds the same way. There’s a test that encodes the same art twice and demands the bytes back, identical. Receipts 563 green tests ~10,000 colors in, 256 out, in about 23ms ffmpeg decodes the quantized file, and re-encoding what it hands back produces the identical bytes Last post I asked you to export a GIF and drop it in the comments. Nobody did :C, fair enough, the star was doing all the work. So today I made it personal: open starforge.lacorte.city , turn on mirror mode, and draw half a thing. The editor does the other half. Post what you get, I’ll feature my favorite in the next devlog :D. And a real question I can’t decide alone: diagonal axes or kaleidoscope. which should mirror mode learn first? Both are on the backlog. You can decide the order. (If you want to catch the next post, follow the project, that button actually notifies you. )
⭐ Starforge is a pixel art & animation studio that runs in your browser. Since last week Starforge learned how to disagree without falling apart, and got more comfortable on tablets along the way. This is the first piece of multiplayer, two complete editors, two independent copies of the same drawing, and a queue between them. There is no server yet. I can draw in both editors, hold every message back, reverse their order, deliver one twice, and the documents still finish on the same pixels. Alongside that invisible foundation, community conversations pointed at five visible workflow breaks: the compact tablet layout only kicked in below 720 px, colours sat with layers and frames instead of the brush, palette authoring bounced between two dialogs, brush opacity used a tiny track while layer opacity had a fine large slider, and precise add/subtract selection hid behind keyboard modifiers touch users never see. All five are fixed in this pass. Receipts 633 green unit tests, with 4 ffmpeg cross four pinned seeds × 100 generated operations across three replicas, including pixel conflicts, scalar edits, palette replacement, layer/frame creation, deletion and ordering 20 Chromium E2E tests pass receiving and applying a 900-pixel patch averages about 0.49 ms on my development machine (2,034 patches/second in the recorded run) zero production dependencies in the core Next: the queue becomes a real wire, WebSocket handshake will be written by hand on node:http with the relay on a Raspberry Pi.
⭐ Starforge is a pixel art & animation studio that runs in your browser. Last time the relay queue was in memory. Now it is a real wire using native WebSocket to talk with the relay I wrote by hand on node:http , handshake, framing, mask, fragmentation, ping/pong, close codes, all of it. Draw a horizontal stroke here, a vertical one there, and both canvases land on the same pixels. 900 pixels travel in 2,730 bytes. Raw it would be 7,200 (8 bytes per pixel: u16 x , u16 y , u32 color ). On the wire the cells sort by (y, x) , coordinates go as zigzag deltas, colors go as an index into a 1-entry table. That is 3.033 bytes per pixel, and every one of the 19 operation kinds round-trips byte-for-byte. The server does not trust a single byte, each op is validated with the same applyOperation the editor uses, on a clone. A bad op earns an ERROR and the connection stays open. Receipts: 662 unit tests green 23 Chromium E2E zero production dependencies Next: the ephemeral room becomes shareable rooms /r/<id>
Ships:
⭐ Starforge is a pixel art studio that runs entirely in your browser. Open starforge.lacorte.city and draw. This first ship is the whole editor core, built from scratch in TypeScript with zero dependencies in the core. Draw : pencil, eraser, line, rectangle and ellipse (outline or filled), and a bucket fill with per-channel tolerance and a contiguous/global switch. Rectangular selection that lifts the pixels and lets you drag them anywhere. Layers : add, duplicate, reorder, rename. Per-layer opacity, seven blend modes, visibility and lock. Keep your work : undo/redo across pixel strokes and structural edits alike, autosave in the browser, and PNG export If the editor ever crashes, the error screen still exports your drawing. Under the hood : 208 tests, including property tests that throw hundreds of random actions at the history and require a byte-identical document back. The renderer composites once per change, not once per layer: the cache key is two integers, and panning triggers zero recompositions. Flood fill, Bresenham lines, ellipse rasterizer, composito, all hand-rolled, no graphics libraries. Where it’s going : the “multiplayer” in the tagline is the arc: a hand-rolled CRDT (last-writer-wins per cell with Lamport clocks) and shareable rooms are the next major ships. Works on your phone. Shortcuts follow Aseprite. Press ? in the editor.
⭐ Starforge is a pixel art & animation studio that runs entirely in your browser. Open (starforge.lacorte.city)[https://starforge.lacorte.city] and draw, as of this ship, your drawing moves. Ship 2 is the Animation Update. Animate : a frame timeline where every frame carries its own duration in milliseconds. Add, reorder and duplicate frames, play the reel on the document’s own clock, and draw with onion skinning. Export : an animated GIF encoder written byte by byte, from the GIF89a header to the LZW dictionary resets. When your art has more than 256 colors, a hand-rolled median-cut quantizer folds it into a legal palette instead of refusing. The Export dialog plays the actual GIF before you download it, next to its true byte size. Spritesheets come out of the same door. Draw : mirror mode, switch on an axis and the editor paints the reflection live under your pencil. The Color Studio mixes any color in HSV, hex or per-channel RGBA. Trackpad zoom got tamed: wheel deltas accumulate into clean notches instead of stepping twenty-five times per glide. Keep your work : editable .starforge project files, and Portable PNG, a real image with the whole project embedded inside, so the file you post is also the file you keep editing. Autosave still catches every stroke, and even a crash screen can still export your drawing. Under the hood : 563 tests, zero dependencies in the core. The encoder is proven against ffmpeg that decodes my GIFs and every pixel comes back identical, including a noise frame built to overflow the LZW dictionary. Quantization is deterministic, same art to the same bytes, and folds ~10,000 colors into 256 in about 23ms. Where it’s going : next ship, the “multiplayer” in the tagline becomes real, a hand-rolled CRDT (last-writer-wins per cell, Lamport clocks) and shareable rooms. Works on your phone. Shortcuts follow Aseprite. Press ? in the editor....
|
1792878732.4859972
|
1793742732.4859972
|
|
41476
|
Contango by @igowu | Stardance
|
igowu
|
2
|
83.0
|
1107
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-15T20:46:02Z", "hours": 58.0, "multiplier": 19.01, "payout": 1046, "blessing": "neutral", "text": "Contango I built a Python framework for quantitative research of trading strategies, whether it be backtesting them, tuning parameter combinations, or turning the results into graphs that can easily reveal profitability/risk in strategies. It started as solely a backtesting framework, but it has grown into an entire suite for optimization and analysis. The latest release, v0.1.1, is now on PyPI. What it is It is an event-driven trading framework with two ways to build strategies. Strategy gives you complete control over the framework, while RuleBasedStrategy provides a higher-level interface for expressing trading rules with less boilerplate. On top of that is the research tooling. Contango can run Cartesian parameter sweeps, evaluating every combination of selected parameters rather than forcing you to manually run a strategy over and over. That makes it possible to take a strategy idea and view a whole parameter space in one run. Market data is handled through a local repository that caches OHLCV data, so repeated experiments don’t need to keep downloading the same data. This permits for offline usage once data has previously been downloaded. Yfinance (a data provider) works without setup or an API key, while the data provider system is designed so additional providers can be added without touching codebase’s internals. Possibly the most important part is the graphs. Equity curves, drawdowns, trade-quality metrics, parameter distributions, risk/return views, and more can be generated from the results of a research run. However, the goal isn’t just to analyze the amount of profit the strategy returns. Instead, it’s to make the behavior of the strategy visible by exposing a variety of different risk/trading/drawdown metrics, revealed clearly in the generated graphs. What was hard I spent a lot of time separating components, defining cleaner interfaces (modularity), and deciding where abstraction was beneficial rather than just adding redundancy and boilerplate. The parameter optimization system was another massive difficulty to create. A Cartesian sweep sounds simple on paper; however, the question arises: how do you distinguish all of the strategies from each other? My initial solution was to display all of the parameters for each strategy, but this ended up with strategy names that were way too large to render. Lastly, documentation ended up being much more work than I expected. I wanted someone to be able to use Contango without having to understand how its internals work first, while still having enough documentation available for someone who actually wants to extend the framework. What I’m proud of The part I’m happiest with is that Contango now feels genuinely easy to use after a small learning curve. You can write a strategy, point it at market data, sweep its parameters, and get a collection of research results and visualizations without having to manually glue all of those pieces together. The other thing I’m proud of is the amount of attention that I put into making the project understandable. The public API is documented, the internal API is documented, components have been modularized, and there are now unit tests for essentially everything that needs them. It’s not finished in the sense that no software ever is, but it finally feels complete. How to test it Install it from PyPI: pip install contango Then run the included research demo: python -m contango.research.demo_strategies.cartesian_bollinger_strategy.runner The demo runs a Bollinger Band strategy across a Cartesian grid of parameters and generates performance and parameter-analysis graphs (HTML) that can be reviewed. I want to thank Stardance for this experience - the opportunity to build software while earning rewards and be in such a welcoming community is amazing to me. I’m looking forward to future work with Hackclub!", "repo": "https://github.com/igowuu/Contango", "demo": "https://pypi.org/project/contango/"}, {"ship_num": 2, "ts": "2026-07-30T16:02:17Z", "hours": 25.0, "multiplier": 6.1, "payout": 61, "blessing": "neutral", "text": "Contango Have you ever wanted to create strategies programmatically for the stock market, cryptocurrencies, or anything else related to trading?! Maybe not… But I have! So, what is Contango? Contango is a full trading engine that allows you to make strategies in Python without worrying about any potential biases in your workflow. Instead of focusing on simulation, metrics, results, and graphs, you can avert your focus solely to the quality of the strategies you create. Strategies - what do they look like? Strategies are a part of an event-driven engine. This means that they receive and react to events that are released from a “mode”. A “mode” is anything that handles the logic of the event bus and/or engine - backtesting, live trading, etc. An example of a strategy: class MyStrategy ( Strategy ): \"\"\" A very simple strategy outline - not all logic is included. \"\"\" def on_market_event ( self , event : MarketDataEvent ) -> None : # Strategy market logic here def on_end ( self ) -> None : ... Results Contango processes the raw events emitted from your strategy and converts them to metrics. These metrics are then used to produce seven unique graphs. Each of these graphs tell you something unique about the strategy, whether it be profitability, risk, drawdown, consistency, win rate, etc. For most modern workflows, this is enough; however, all modules are cleanly decoupled from each other, so raw events or raw metrics can be processed & analyzed however you would like. Challenges Challenges: A massive learning curve. I’ve spent probably 50 hours or more just researching and absorbing the information used in this project. Packaging was difficult to get right, whether it be “missing type stub” warnings or incorrect rendering of my README.md. Documentation was terrible to write. Spending large amounts of time writing English words instead of code that accomplishes something was extremely tedious, yet completely necessary for a shipped project like this. I’m proud of this project Genuinely, this is one of the first big project I’ve ever made. I have never released anything to PyPI, nor shipped something of this scale before. Hackatime only shows 22 hours since I set it up partway through, but Contango’s been my main project since June, and it’s the second largest thing I’ve built. Usage The GitHub has detailed instructions, demos, videos, and more; however, since it’s so short, here is how to install the project & run the built-in demo from any python IDE: pip install contango python -m contango.research.research_strategies.bollinger_band_mean_reversion.runner Final Notes I’ve had a lot of fun with this project, and I hope anyone who sees this enjoys it just as much as me. Happy coding!", "repo": "https://github.com/igowuu/Contango", "demo": "https://pypi.org/project/contango/"}]...
|
[{"post_id": 68711, "ts": "202 [{"post_id": 68711, "ts": "2026-09-15T16:17:49Z", "hours": 6.9347, "text": "Contango - Devlog #8 (final devlog?) The latest version of Contango (v. 0.1.1) been is released on PyPI. What Changed? Rule-based strategies and Cartesian Sweeps Strategies can be created using a rule-based system that allows them to be swept over all combinations in a Cartesian Search. This is especially useful for finding a broad spectrum of tuned parameters after creating & coding a strategy concept. Documentation The documentation has been expanded to give direct tutorials on how to set up strategies and make additions to the framework without touching any of its internals. Further, the documentation now has in-depth explanations on the public AND private API. Other The graphs now have a GraphType subclass - essentially, graphs can now be added to or removed by the user if this is desired. This eliminates the hardcoding and confusing behavior that the graphs had prior to this change. Unit tests created for just about everything that needs it. General maturing of the framework, whether that be creating modular components, exposing or hiding certain details from the user, or creating docstrings for the public and private API. That’s all. This will likely be my last devlog before shipping for the final time. I’m praying to the Gods of Stardance that I can get a 3d printer! We’ll see."}, {"post_id": 62560, "ts": "2026-09-06T00:29:54Z", "hours": 6.6617, "text": "Contango - Devlog #7 Research Research has been rough. I haven’t found any real edge with a calmar ratio above 1.0, nor a sharpe ratio that is statistically meaningful to suggest a somewhat profitable strategy. Cartesian Parameterized Grid Search This system was absolutely effective in what it did; however, I’ve concluded that using brute-force to generate strategies does not yield any genuine edge. The system was powerful, but honestly hard to use; hence, I came to the decision of deleting it as it did not have much use other than brute-forcing trading strategies. Rule-based Strategies Rule-based strategies, again, allow for strategies to be created with minimal and highly declarative code. The API has improved significantly with less unnecessary generics and more docstrings. It will be the intended system for backtesting strategies rather than using static strategies. They will both coexist, however; the static strategies will be intended to be used for live trading if implemented in the future. Graphs The graph system was relatively ad-hoc, hard to use, and hardcoded; therefore, I have restructured it to take a more composable approach to allow for the user to create & add graphs. The default graphs have not disappeared; however, they can be overridden. New graphs can be subclassed and the user can register & create custom graphs if desirable. Future Finish the graphing system. Fix all of the demo strategies for the new structure. Create new unit tests for the codebase. Publish to PyPI and commit to github. I’m beginning to wrap up the project to get it to a publishable state."}, {"post_id": 55673, "ts": "2026-08-27T17:10:44Z", "hours": 6.5972, "text": "I was wrong . …But that’s okay. Hyper-parameterized Cartesian grid search I built a system capable of searching an enormous strategy space, and the system worked. My original goal was to have computers literally generate trading strategies and hypothesize by themselves through testing all possible indicator combinations. However, simple strategies based on widely known indicators aren’t producing the profitability I was initially looking for. However , this isn’t necessarily bad news - it just means that the system should be used to help hypothesizing rather than automating it entirely. The same system can be used heavily for optimization of a concept. For example, it can completely automate the process of testing if ATR scaling or an RSI confirmation yields better results. Further, I can still find optimal parameters through the grid search for a given strategy. On Overfitting A grid search inherently will find “amazing” results - however, that doesn’t necessarily mean that it would actually perform well in the market. The parallel coordinate graphs, heatmap graphs, and manual walk-forward tests have made it genuinely easy to pick out overfit results, so this accepts part of my hypothesis in the earlier devlogs. Future I finished most of the work I wanted to do. I stress tested the suite, created unit tests, and created the hyper-parameterization system in its entirety. Now is finally the fun part - research. I’m genuinely curious if I’m able to find some profitable strategies with my system, so my future devlogs will likely be related to the research I’m going to conduct. That’s all. Have a great day!"}, {"post_id": 53484, "ts": "2026-08-24T01:40:11Z", "hours": 13.0403, "text": "Devlog #5 - Contango Hyperparameter Cartesian grid search Apparently this isn’t easy to design! Who could have thought? Not me! Jokes aside, this has been a miserable experience. I’ve created two different designs so far. The first one failed outright - far in, I realized that having mutable objects in a nested grid search breaks all of the results, and it wasn’t easy to integrate Callable types with what I had already created, so I scrapped it. Another massive hurdle was trying to find out how to parameterize the rules that indicators must follow (i.e. close crosses above middle bollinger band crosses). The idea here is to have a set of rules, and have each and every one of them parameterized amongst each other to find the best rules in the subset. My current design uses callables to generate fresh instances of both the parameters and indicators used in the hyperparameter grid search. However, another issue has become known to me - how do you derive unique, dynamically created names for each individual parameterized result? My thought is to derive the name of the indicators from the caller (which I have been doing), but on top of that, force all rule-based modules in my codebase to implement an ABC & override repr . This has not been formally implemented yet. Future Finish & finalize the hyperparameter Cartesian grid search strategy. Create unit tests for it. Genuinely take some time to look over the codebase, see what may be confusing for any users, & implement fixes for them (whether it be documentation, simplifying concepts, or creating abstractions for modules). Add quite a lot of documentation. Ship."}, {"post_id": 48243, "ts": "2026-08-16T15:24:07Z", "hours": 6.8711, "text": "Devlog #4 - Contango Rule-based Strategies I found a lot of issues and limitations with them. However, after working for hours coding them, I believe I’ve reached a point where I’m happy with how they’re looking. To summarize, every strategy is composed of rules, where a rule has a condition & action. If the condition is true, the action (intent) is released. In the case of this suite, intents express to buy, sell, create stoploss orders, etc. You can see the syntax in the attached screenshot. Unit testing Unit tests are completely finished! The suite has 290 passing unit tests as of now. Parameterization I’m going to give parameterization another try. Instead of creating another layer on rule-based strategies, I’m going to instead pass indicators (or “streams” as I call them) into a base strategy along with their parameters in an attempt to perform a Cartisan hyperparameter grid search for both the indicators and their parameters. That was a mouthful to say; however, I’ll demonstrate what I mean in the next devlog (hopefully). Future As always, I like to document what I want to accomplish before shipping: Start & finish the Cartisan hyperparameter grid search API, along with testing it. Fix up documentation (there are major gaps at this point in my development from alpha v.0.1.0). Release on PyPI. That’s it. Happy coding!"}, {"post_id": 46293, "ts": "2026-08-13T12:50:56Z", "hours": 7.9789, "text": "Devlog #3 - Contango Rule-based Strategies I completed the rule-based strategy engine, and it seems to be yielding correct results with integration tests. It allows for both Cartesian Parameterization & indicator parameterization, mentioned in the previous devlog. Unit tests I’ve noticed that as I make more changes, my unit tests have been lacking. The majority of the time for this devlog has been spent creating unit tests for my code. This has proved to be very time consuming and tedious (it always is), and has taken more than five hours at this point. However, I’m only halfway done, so this might take a while longer… Future I always like to make a list for what I want to do before shipping. Here’s where I’m at now: Finish unit tests & fix any issues they reveal Manually test everything myself by creating example strategies Document everything (at this point there are massive gaps in documentation from the changes I have made) Release v.0.1.1 on PyPI & then ship That’s all. Have a great rest of your day!"}, {"post_id": 42736, "ts": "2026-08-07T16:30:57Z", "hours": 10.1167, "text": "Devlog #2 - Contango Massive changes have been made relating to strategy creation & the capability of the framework. Creating a strategy An entire Bollinger Band Mean Reversion strategy now looks like this: indicators = { \" bb \" : BollingerBands ( period = period , k = num_std )} rules : Sequence [ Rule [ TradingContext , Intent ]] = [ Rule ( Predicate ( lambda ctx : ctx . event . close < ctx . indicators [ \" bb \" ]. value . lower ), Emit ( EnterLongIntent ( symbol = symbol )) ), Rule ( Predicate ( lambda ctx : ctx . event . close > ctx . indicators [ \" bb \" ]. value . upper ), Emit ( ExitIntent ( symbol = symbol )), ) ] super (). __init__ ( indicators = indicators , rules = rules , position_sizer = AllocationPositionSizer ( size ) ) With this structure, an entire trading strategy can be expressed with a few unequivocal rules. Further, because indicators and their parameters are major components, both can now be parameterized during optimization. That means grid searches can iterate over not only different parameter values, but entirely different indicator combinations. In a favorable environment, this means that with enough computing power, you can automate the creation and development of strategies. However, in practice, real markets make this significantly less straightforward due to overfitting; therefore, human analysis is still essential since larger search spaces dramatically increase the risk of these biases. Nonetheless, this gives a major advantage to manually creating code for each strategy individually. Other things I restructured the file tree to make the codebase easier for new future contributors (including myself) to make changes. I created a rule system for the backtester under the hood that doesn’t hard-code any limitations in preparation for full support of pyramiding, multiple tickers, & short selling. Future There are some things I want to do before shipping. I’ll list them here: Complete the indicator grid search mentioned above. Stress-test everything & create unit tests where necessary. Complete the documentation - especially with strategy creation, which is not definitely extensive enough as of now. Anyway, enough technical talk for this devlog - happy coding!"}, {"post_id": 37644, "ts": "2026-07-30T15:09:38Z", "hours": 24.5403, "text": "Devlog #1 - Contango I have finally released Contango on PyPI! What is Contango? Contango is a full trading engine that helps you build trading strategies. It does all of the heavy lifting - the results, metrics, and the entire trading engine behind the hood. I’ve never created a package on PyPI, so doing this was a massive learning experience - from uploading to TestPyPI to iterating multiple times before I got my pyproject.toml right. I sent one of the graphs generated after testing my project demo out using the package. See the package on PyPI here: https://pypi.org/project/contango/ Have a great rest of your day!"}]...
|
Title: Contango by @igowu | Stardance
Devlogs:
De Title: Contango by @igowu | Stardance
Devlogs:
Devlog #1 - Contango I have finally released Contango on PyPI! What is Contango? Contango is a full trading engine that helps you build trading strategies. It does all of the heavy lifting - the results, metrics, and the entire trading engine behind the hood. I’ve never created a package on PyPI, so doing this was a massive learning experience - from uploading to TestPyPI to iterating multiple times before I got my pyproject.toml right. I sent one of the graphs generated after testing my project demo out using the package. See the package on PyPI here: https://pypi.org/project/contango/ Have a great rest of your day!
Devlog #2 - Contango Massive changes have been made relating to strategy creation & the capability of the framework. Creating a strategy An entire Bollinger Band Mean Reversion strategy now looks like this: indicators = { " bb " : BollingerBands ( period = period , k = num_std )} rules : Sequence [ Rule [ TradingContext , Intent ]] = [ Rule ( Predicate ( lambda ctx : ctx . event . close < ctx . indicators [ " bb " ]. value . lower ), Emit ( EnterLongIntent ( symbol = symbol )) ), Rule ( Predicate ( lambda ctx : ctx . event . close > ctx . indicators [ " bb " ]. value . upper ), Emit ( ExitIntent ( symbol = symbol )), ) ] super (). __init__ ( indicators = indicators , rules = rules , position_sizer = AllocationPositionSizer ( size ) ) With this structure, an entire trading strategy can be expressed with a few unequivocal rules. Further, because indicators and their parameters are major components, both can now be parameterized during optimization. That means grid searches can iterate over not only different parameter values, but entirely different indicator combinations. In a favorable environment, this means that with enough computing power, you can automate the creation and development of strategies. However, in practice, real markets make this significantly less straightforward due to overfitting; therefore, human analysis is still essential since larger search spaces dramatically increase the risk of these biases. Nonetheless, this gives a major advantage to manually creating code for each strategy individually. Other things I restructured the file tree to make the codebase easier for new future contributors (including myself) to make changes. I created a rule system for the backtester under the hood that doesn’t hard-code any limitations in preparation for full support of pyramiding, multiple tickers, & short selling. Future There are some things I want to do before shipping. I’ll list them here: Complete the indicator grid search mentioned above. Stress-test everything & create unit tests where necessary. Complete the documentation - especially with strategy creation, which is not definitely extensive enough as of now. Anyway, enough technical talk for this devlog - happy coding!
Devlog #3 - Contango Rule-based Strategies I completed the rule-based strategy engine, and it seems to be yielding correct results with integration tests. It allows for both Cartesian Parameterization & indicator parameterization, mentioned in the previous devlog. Unit tests I’ve noticed that as I make more changes, my unit tests have been lacking. The majority of the time for this devlog has been spent creating unit tests for my code. This has proved to be very time consuming and tedious (it always is), and has taken more than five hours at this point. However, I’m only halfway done, so this might take a while longer… Future I always like to make a list for what I want to do before shipping. Here’s where I’m at now: Finish unit tests & fix any issues they reveal Manually test everything myself by creating example strategies Document everything (at this point there are massive gaps in documentation from the changes I have made) Release v.0.1.1 on PyPI & then ship That’s all. Have a great rest of your day!
Devlog #4 - Contango Rule-based Strategies I found a lot of issues and limitations with them. However, after working for hours coding them, I believe I’ve reached a point where I’m happy with how they’re looking. To summarize, every strategy is composed of rules, where a rule has a condition & action. If the condition is true, the action (intent) is released. In the case of this suite, intents express to buy, sell, create stoploss orders, etc. You can see the syntax in the attached screenshot. Unit testing Unit tests are completely finished! The suite has 290 passing unit tests as of now. Parameterization I’m going to give parameterization another try. Instead of creating another layer on rule-based strategies, I’m going to instead pass indicators (or “streams” as I call them) into a base strategy along with their parameters in an attempt to perform a Cartisan hyperparameter grid search for both the indicators and their parameters. That was a mouthful to say; however, I’ll demonstrate what I mean in the next devlog (hopefully). Future As always, I like to document what I want to accomplish before shipping: Start & finish the Cartisan hyperparameter grid search API, along with testing it. Fix up documentation (there are major gaps at this point in my development from alpha v.0.1.0). Release on PyPI. That’s it. Happy coding!
Devlog #5 - Contango Hyperparameter Cartesian grid search Apparently this isn’t easy to design! Who could have thought? Not me! Jokes aside, this has been a miserable experience. I’ve created two different designs so far. The first one failed outright - far in, I realized that having mutable objects in a nested grid search breaks all of the results, and it wasn’t easy to integrate Callable types with what I had already created, so I scrapped it. Another massive hurdle was trying to find out how to parameterize the rules that indicators must follow (i.e. close crosses above middle bollinger band crosses). The idea here is to have a set of rules, and have each and every one of them parameterized amongst each other to find the best rules in the subset. My current design uses callables to generate fresh instances of both the parameters and indicators used in the hyperparameter grid search. However, another issue has become known to me - how do you derive unique, dynamically created names for each individual parameterized result? My thought is to derive the name of the indicators from the caller (which I have been doing), but on top of that, force all rule-based modules in my codebase to implement an ABC & override repr . This has not been formally implemented yet. Future Finish & finalize the hyperparameter Cartesian grid search strategy. Create unit tests for it. Genuinely take some time to look over the codebase, see what may be confusing for any users, & implement fixes for them (whether it be documentation, simplifying concepts, or creating abstractions for modules). Add quite a lot of documentation. Ship.
I was wrong . …But that’s okay. Hyper-parameterized Cartesian grid search I built a system capable of searching an enormous strategy space, and the system worked. My original goal was to have computers literally generate trading strategies and hypothesize by themselves through testing all possible indicator combinations. However, simple strategies based on widely known indicators aren’t producing the profitability I was initially looking for. However , this isn’t necessarily bad news - it just means that the system should be used to help hypothesizing rather than automating it entirely. The same system can be used heavily for optimization of a concept. For example, it can completely automate the process of testing if ATR scaling or an RSI confirmation yields better results. Further, I can still find optimal parameters through the grid search for a given strategy. On Overfitting A grid search inherently will find “amazing” results - however, that doesn’t necessarily mean that it would actually perform well in the market. The parallel coordinate graphs, heatmap graphs, and manual walk-forward tests have made it genuinely easy to pick out overfit results, so this accepts part of my hypothesis in the earlier devlogs. Future I finished most of the work I wanted to do. I stress tested the suite, created unit tests, and created the hyper-parameterization system in its entirety. Now is finally the fun part - research. I’m genuinely curious if I’m able to find some profitable strategies with my system, so my future devlogs will likely be related to the research I’m going to conduct. That’s all. Have a great day!
Contango - Devlog #7 Research Research has been rough. I haven’t found any real edge with a calmar ratio above 1.0, nor a sharpe ratio that is statistically meaningful to suggest a somewhat profitable strategy. Cartesian Parameterized Grid Search This system was absolutely effective in what it did; however, I’ve concluded that using brute-force to generate strategies does not yield any genuine edge. The system was powerful, but honestly hard to use; hence, I came to the decision of deleting it as it did not have much use other than brute-forcing trading strategies. Rule-based Strategies Rule-based strategies, again, allow for strategies to be created with minimal and highly declarative code. The API has improved significantly with less unnecessary generics and more docstrings. It will be the intended system for backtesting strategies rather than using static strategies. They will both coexist, however; the static strategies will be intended to be used for live trading if implemented in the future. Graphs The graph system was relatively ad-hoc, hard to use, and hardcoded; therefore, I have restructured it to take a more composable approach to allow for the user to create & add graphs. The default graphs have not disappeared; however, they can be overridden. New graphs can be subclassed and the user can register & create custom graphs if desirable. Future Finish the graphing system. Fix all of the demo strategies for the new structure. Create new unit tests for the codebase. Publish to PyPI and commit to github. I’m beginning to wrap up the project to get it to a publishable state.
Contango - Devlog #8 (final devlog?) The latest version of Contango (v. 0.1.1) been is released on PyPI. What Changed? Rule-based strategies and Cartesian Sweeps Strategies can be created using a rule-based system that allows them to be swept over all combinations in a Cartesian Search. This is especially useful for finding a broad spectrum of tuned parameters after creating & coding a strategy concept. Documentation The documentation has been expanded to give direct tutorials on how to set up strategies and make additions to the framework without touching any of its internals. Further, the documentation now has in-depth explanations on the public AND private API. Other The graphs now have a GraphType subclass - essentially, graphs can now be added to or removed by the user if this is desired. This eliminates the hardcoding and confusing behavior that the graphs had prior to this change. Unit tests created for just about everything that needs it. General maturing of the framework, whether that be creating modular components, exposing or hiding certain details from the user, or creating docstrings for the public and private API. That’s all. This will likely be my last devlog before shipping for the final time. I’m praying to the Gods of Stardance that I can get a 3d printer! We’ll see.
Ships:
Contango Have you ever wanted to create strategies programmatically for the stock market, cryptocurrencies, or anything else related to trading?! Maybe not… But I have! So, what is Contango? Contango is a full trading engine that allows you to make strategies in Python without worrying about any potential biases in your workflow. Instead of focusing on simulation, metrics, results, and graphs, you can avert your focus solely to the quality of the strategies you create. Strategies - what do they look like? Strategies are a part of an event-driven engine. This means that they receive and react to events that are released from a “mode”. A “mode” is anything that handles the logic of the event bus and/or engine - backtesting, live trading, etc. An example of a strategy: class MyStrategy ( Strategy ): """ A very simple strategy outline - not all logic is included. """ def on_market_event ( self , event : MarketDataEvent ) -> None : # Strategy market logic here def on_end ( self ) -> None : ... Results Contango processes the raw events emitted from your strategy and converts them to metrics. These metrics are then used to produce seven unique graphs. Each of these graphs tell you something unique about the strategy, whether it be profitability, risk, drawdown, consistency, win rate, etc. For most modern workflows, this is enough; however, all modules are cleanly decoupled from each other, so raw events or raw metrics can be processed & analyzed however you would like. Challenges Challenges: A massive learning curve. I’ve spent probably 50 hours or more just researching and absorbing the information used in this project. Packaging was difficult to get right, whether it be “missing type stub” warnings or incorrect rendering of my README.md. Documentation was terrible to write. Spending large amounts of time writing English words instead of code that accomplishes something was extremely tedious, yet completely necessary for a shipped project like this. I’m proud of this project Genuinely, this is one of the first big project I’ve ever made. I have never released anything to PyPI, nor shipped something of this scale before. Hackatime only shows 22 hours since I set it up partway through, but Contango’s been my main project since June, and it’s the second largest thing I’ve built. Usage The GitHub has detailed instructions, demos, videos, and more; however, since it’s so short, here is how to install the project & run the built-in demo from any python IDE: pip install contango python -m contango.research.research_strategies.bollinger_band_mean_reversion.runner Final Notes I’ve had a lot of fun with this project, and I hope anyone who sees this enjoys it just as much as me. Happy coding!
Contango I built a Python framework for quantitative research of trading strategies, whether it be backtesting them, tuning parameter combinations, or turning the results into graphs that can easily reveal profitability/risk in strategies. It started as solely a backtesting framework, but it has grown into an entire suite for optimization and analysis. The latest release, v0.1.1, is now on PyPI. What it is It is an event-driven trading framework with two ways to build strategies. Strategy gives you complete control over the framework, while RuleBasedStrategy provides a higher-level interface for expressing trading rules with less boilerplate. On top of that is the research tooling. Contango can run Cartesian parameter sweeps, evaluating every combination of selected parameters rather than forcing you to manually run a strategy over and over. That makes it possible to take a strategy idea and view a whole parameter space in one run. Market data is handled through a local repository that caches OHLCV data, so repeated experiments don’t need to keep downloading the same data. This permits for offline usage once data has previously been downloaded. Yfinance (a data provider) works without setup or an API key, while the data provider system is designed so additional providers can be added without touching codebase’s internals. Possibly the most important part is the graphs. Equity curves, drawdowns, trade-quality metrics, parameter distributions, risk/return views, and more can be generated from the results of a research run. However, the goal isn’t just to analyze the amount of profit the strategy returns. Instead, it’s to make the behavior of the strategy visible by exposing a variety of different risk/trading/drawdown metrics, revealed clearly in the generated graphs. What was hard I spent a lot of time separating components, defining cleaner interfaces (modularity), and deciding where abstraction was beneficial rather than just adding redundancy and boilerplate. The parameter optimization system was another massive difficulty to create. A Cartesian sweep sounds simple on paper; however, the question arises: how do you distinguish all of the strategies from each other? My initial solution was to display all of the parameters for each strategy, but this ended up with strategy names that were way too large to render. Lastly, documentation ended up being much more work than I expected. I wanted someone to be able to use Contango without having to understand how its internals work first, while still having enough documentation available for someone who actually wants to extend the framework. What I’m proud of The part I’m happiest with is that Contango now feels genuinely easy to use after a small learning curve. You can write a strategy, point it at market data, sweep its parameters, and get a collection of research results and visualizations without having to manually glue all of those pieces together. The other thing I’m proud of is the amount of attention that I put into making the project understandable. The public API is documented, the internal API is documented, components have been modularized, and there are now unit tests for essentially everything that needs them. It’s not finished in the sense that no software ever is, but it finally feels complete. How to test it Install it from PyPI: pip install contango Then run the included research demo: python -m contango.research.demo_strategies.cartesian_bollinger_strategy.runner The demo runs a Bollinger Band strategy across a Cartesian grid of parameters and generates performance and parameter-analysis graphs (HTML) that can be reviewed. I want to thank Stardance for this experience - the opportunity to build software while earning rewards and be in such a welcoming community is amazing to me. I’m looking forward to future work with Hackclub!...
|
1792849921.0409572
|
1792936321.0409572
|
|
34039
|
World Engine by @NITHIN | Stardance
|
NITHIN
|
1
|
67.0
|
1092
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-16T16:42:55Z", "hours": 67.0, "multiplier": 16.4, "payout": 1092, "blessing": "neutral", "text": "World Engine is an immersive, high-fidelity 3D command center that completely transforms how we interact with global planetary telemetry. Built on a cutting-edge web architecture, it acts as a digital twin of Earth, featuring a breathtaking interactive holographic globe suspended within a sleek, deep-space obsidian interface. From tracking hyper-velocity orbital debris and live seismic fault lines to monitoring global aviation corridors and renewable energy grids, World Engine consolidates the planet's most critical data streams into a single, visually stunning cockpit. Beyond its gorgeous visualization layer, World Engine is powered by a groundbreaking AI Mission Commander that acts as your autonomous copilot. Instead of passively analyzing charts, you can deploy the AI Operator to proactively investigate emerging global events such as routing congestion in the Suez Canal or tracking atmospheric carbon anomalies and generate real-time, actionable risk assessments. It isn't just a dashboard; it's a living, breathing mission control deck designed to put the pulse of the entire planet right at your fingertips.", "repo": "https://github.com/Nithinfgs/World-Engine", "demo": "https://magenta-starship-a51964.netlify.app/"}]...
|
[{"post_id": 29576, "ts": "202 [{"post_id": 29576, "ts": "2026-07-16T16:40:26Z", "hours": 1.0, "text": "Added the readme project is fully done and ready to be shipped"}, {"post_id": 29527, "ts": "2026-07-16T14:49:35Z", "hours": 4.0, "text": "I am fully done with all the code have made the final push to github have added a netify link for the demo the only task left to complete is the readme file which i will soon complete"}, {"post_id": 29263, "ts": "2026-07-16T02:12:19Z", "hours": 7.0, "text": "I am fully done with the package.json file and have made the push to github if you want check it out and give me feedback."}, {"post_id": 29058, "ts": "2026-07-15T18:27:35Z", "hours": 8.0, "text": "Updated the project’s dependency lockfile by adding the latest Oxc Lint (v1.73.0) Linux ARM native bindings, including support for both arm-musleabihf and arm64-gnu architectures. The new packages are configured as optional, platform-specific dependencies with Node.js compatibility set to ^20.19.0 or >=22.12.0, ensuring only the appropriate binaries are installed on supported systems. This update improves cross-platform compatibility, keeps dependencies current, and helps maintain fast native linting performance on Linux ARM environments."}, {"post_id": 28658, "ts": "2026-07-15T01:29:42Z", "hours": 7.0, "text": "Working on the project today. I’m currently setting up and reviewing the project’s Node.js dependencies, checking the package-lock.json, and making sure the correct platform-specific packages are configured properly. The goal is to ensure everything installs correctly and the development environment is stable before moving on to the next stage. Another 15 or so hours and I will be done and will be pushing to github"}, {"post_id": 28452, "ts": "2026-07-14T18:18:07Z", "hours": 7.0, "text": "I am currently working on the project and have been focusing on setting up and configuring the development environment. A significant amount of progress has been made in establishing the project’s foundation, including configuring the TypeScript, React, and Vite development stack, as well as integrating the required libraries for 3D rendering and physics. This work provides a stable base for implementing the main functionality. Over the next phase of development, I will be concentrating on building the application’s core features, integrating the remaining components, and testing the system to ensure everything works as expected. Based on my current progress, I estimate that the project will require approximately 15–20 more hours of development to reach completion, provided I can dedicate that amount of focused time to the project."}, {"post_id": 28053, "ts": "2026-07-14T02:19:21Z", "hours": 8.0, "text": "Finished the index.html file and pushed the latest changes to GitHub. If you want to check out the progress, feel free to take a look at the repository.Next up: I’ll be working on the package.json file later today."}, {"post_id": 27769, "ts": "2026-07-13T16:46:25Z", "hours": 6.0, "text": "Continued development of the World Engine frontend interface. Implemented and refined the React-based sidebar responsible for managing world layers. The sidebar dynamically renders available layers from a configuration array, tracks active layer states, and allows users to toggle individual layers through interactive buttons. Worked on component structure, conditional styling using Tailwind CSS, event handling, and overall UI organization. Progress also included improving code readability and modularity in preparation for expanding additional world-generation features."}, {"post_id": 27507, "ts": "2026-07-13T04:07:59Z", "hours": 8.0, "text": "Half way through my index.html deciding on logos for each section will make the push to github later today"}, {"post_id": 27244, "ts": "2026-07-12T17:09:36Z", "hours": 3.0, "text": "Have just started on the index.html will create a github repo and add files to it tomorrow"}, {"post_id": 27148, "ts": "2026-07-12T13:20:53Z", "hours": 2.0, "text": "I have started working on World Engine. I began by setting up the project’s file structure and started building the index.html layout that will serve as the foundation for the entire application. Right now I’m focusing on creating a clean and scalable structure before implementing the core features. Once the initial layout and project structure are complete, I’ll be pushing everything to GitHub.World Engine is a real-time planetary intelligence platform that aims to create a living digital twin of Earth. The project brings together multiple real-world systems into a single interactive experience, allowing users to explore the planet through an immersive 3D globe while viewing live data from areas such as aviation, satellites, oceans, weather, geology, energy, internet infrastructure, cities, and global supply chains. It will also include AI-powered analysis that can combine different datasets to explain global events, detect patterns, and help users better understand how the world’s interconnected systems work together. My goal is to build a mission-control-style platform that transforms complex real-world data into an interactive and visually engaging experience."}]...
|
Title: World Engine by @NITHIN | Stardance
Devlog Title: World Engine by @NITHIN | Stardance
Devlogs:
I have started working on World Engine. I began by setting up the project’s file structure and started building the index.html layout that will serve as the foundation for the entire application. Right now I’m focusing on creating a clean and scalable structure before implementing the core features. Once the initial layout and project structure are complete, I’ll be pushing everything to GitHub.World Engine is a real-time planetary intelligence platform that aims to create a living digital twin of Earth. The project brings together multiple real-world systems into a single interactive experience, allowing users to explore the planet through an immersive 3D globe while viewing live data from areas such as aviation, satellites, oceans, weather, geology, energy, internet infrastructure, cities, and global supply chains. It will also include AI-powered analysis that can combine different datasets to explain global events, detect patterns, and help users better understand how the world’s interconnected systems work together. My goal is to build a mission-control-style platform that transforms complex real-world data into an interactive and visually engaging experience.
Have just started on the index.html will create a github repo and add files to it tomorrow
Half way through my index.html deciding on logos for each section will make the push to github later today
Continued development of the World Engine frontend interface. Implemented and refined the React-based sidebar responsible for managing world layers. The sidebar dynamically renders available layers from a configuration array, tracks active layer states, and allows users to toggle individual layers through interactive buttons. Worked on component structure, conditional styling using Tailwind CSS, event handling, and overall UI organization. Progress also included improving code readability and modularity in preparation for expanding additional world-generation features.
Finished the index.html file and pushed the latest changes to GitHub. If you want to check out the progress, feel free to take a look at the repository.Next up: I’ll be working on the package.json file later today.
I am currently working on the project and have been focusing on setting up and configuring the development environment. A significant amount of progress has been made in establishing the project’s foundation, including configuring the TypeScript, React, and Vite development stack, as well as integrating the required libraries for 3D rendering and physics. This work provides a stable base for implementing the main functionality. Over the next phase of development, I will be concentrating on building the application’s core features, integrating the remaining components, and testing the system to ensure everything works as expected. Based on my current progress, I estimate that the project will require approximately 15–20 more hours of development to reach completion, provided I can dedicate that amount of focused time to the project.
Working on the project today. I’m currently setting up and reviewing the project’s Node.js dependencies, checking the package-lock.json, and making sure the correct platform-specific packages are configured properly. The goal is to ensure everything installs correctly and the development environment is stable before moving on to the next stage. Another 15 or so hours and I will be done and will be pushing to github
Updated the project’s dependency lockfile by adding the latest Oxc Lint (v1.73.0) Linux ARM native bindings, including support for both arm-musleabihf and arm64-gnu architectures. The new packages are configured as optional, platform-specific dependencies with Node.js compatibility set to ^20.19.0 or >=22.12.0, ensuring only the appropriate binaries are installed on supported systems. This update improves cross-platform compatibility, keeps dependencies current, and helps maintain fast native linting performance on Linux ARM environments.
I am fully done with the package.json file and have made the push to github if you want check it out and give me feedback.
I am fully done with all the code have made the final push to github have added a netify link for the demo the only task left to complete is the readme file which i will soon complete
Added the readme project is fully done and ready to be shipped
Ships:
World Engine is an immersive, high-fidelity 3D command center that completely transforms how we interact with global planetary telemetry. Built on a cutting-edge web architecture, it acts as a digital twin of Earth, featuring a breathtaking interactive holographic globe suspended within a sleek, deep-space obsidian interface. From tracking hyper-velocity orbital debris and live seismic fault lines to monitoring global aviation corridors and renewable energy grids, World Engine consolidates the planet's most critical data streams into a single, visually stunning cockpit. Beyond its gorgeous visualization layer, World Engine is powered by a groundbreaking AI Mission Commander that acts as your autonomous copilot. Instead of passively analyzing charts, you can deploy the AI Operator to proactively investigate emerging global events such as routing congestion in the Suez Canal or tracking atmospheric carbon anomalies and generate real-time, actionable risk assessments. It isn't just a dashboard; it's a living, breathing mission control deck designed to put the pulse of the entire planet right at your fingertips....
|
1792882108.3512828
|
1793746108.3512828
|
|
27454
|
MacWall - Website by @foundrceo | Stardance
|
foundrceo
|
3
|
116.0
|
1090
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T12:01:12Z", "hours": 18.0, "multiplier": 18.8, "payout": 331, "blessing": "neutral", "text": "Redesigned the homepage and site UI New hero, navbar, category strip and License pop-up. Features shown as rows, an Apple-style footer, and new 404 and error pages. New app icon everywhere (favicons, email logo) and a new social share image. New hero app video in 1080p, slowed down. Redesigned pricing page that says “one-time payment”. Install guide with animations, shown after you download. New help center with topic cards, search, and help inside the ⌘K command menu. Moved the whole site from Vercel to Cloudflare Workers macwall.app now runs on Cloudflare; Vercel is kept only as a backup. I connected the domains, moved the scheduled jobs (cron) over, set up caching for the landing pages, and fixed visitor country/IP detection on Cloudflare. Before the move I cut Vercel costs: videos served from R2, longer caching, lighter images, smaller 404 pages. Phone visitors On a phone, “Send to my Mac” emails you the download link instead of downloading a Mac file. “Set on Mac” opens the app directly through a macwall:// link. Wallpaper gallery and search traffic 45 wallpaper collections, more detailed wallpaper pages, and guides written to answer questions directly. Gallery sorted by most liked, with a “Download free” button and a sticky bar at the bottom. Faster loading: static gallery pages, lighter images, and full-size wallpaper files no longer served.", "repo": "https://github.com/foundrceo/MacWall-Web", "demo": "https://macwall.app/"}, {"ship_num": 2, "ts": "2026-09-16T07:40:26Z", "hours": 55.0, "multiplier": 10.94, "payout": 556, "blessing": "neutral", "text": "I just updated the entire ui ux of my website to make it 100x better and get better conversions update all the files and components name also to a professional / enterprise level", "repo": "https://github.com/foundrceo/MacWall-Web", "demo": "https://macwall.app/"}, {"ship_num": 3, "ts": "2026-07-24T10:16:41Z", "hours": 43.0, "multiplier": 9.79, "payout": 203, "blessing": "neutral", "text": "what did you make? macwall.app - the website for my macos live wallpaper app. download the free app buy pro with stripe and activate with a deep link. also pricing blog submit wallpapers and affiliates. what was challenging? getting checkout right. stripe → license email → macwall://activate had a lot of edge cases. india pricing and the reel refund flow took a few rewrites. keeping price copy in sync with real stripe prices was annoying. what are you proud of? it is live and people can actually use it. one click download one click checkout and the app unlocks. the site feels like a real product not a template. what should people know so they can test? open https://macwall.app hit download for macos (or grab the dmg on the github release). you need macos 26. browse pricing if you want to see permanent annual and reel refund. free try works without paying.", "repo": "https://github.com/foundrceo/MacWall-Web", "demo": "https://macwall.app/"}]...
|
[{"post_id": 80623, "ts": "202 [{"post_id": 80623, "ts": "2026-10-18T10:19:19Z", "hours": 10.7622, "text": "Just Shipped a major update in the ui ux overall application."}, {"post_id": 74829, "ts": "2026-09-28T12:06:55Z", "hours": 3.3728, "text": "raised macwall pricing recently and the response has actually been really good traffic is growing a lot too now around 59k visitors and 128k page views been testing pricing changes and polishing the site while watching how people respond to it"}, {"post_id": 72557, "ts": "2026-09-23T06:44:37Z", "hours": 2.4158, "text": "Update: v4.0.3Sep 18, 2026"}, {"post_id": 69630, "ts": "2026-09-17T13:22:36Z", "hours": 1.8347, "text": "mihi"}, {"post_id": 69026, "ts": "2026-09-16T07:39:04Z", "hours": 8.0711, "text": "Updated Entire Website UI/UX to 100x better :)"}, {"post_id": 64279, "ts": "2026-09-08T15:39:49Z", "hours": 0.9261, "text": "Fixes - Older free installs are treated the same as an ended trial: wallpapers stay paused until you unlock Pro."}, {"post_id": 62817, "ts": "2026-09-06T10:44:52Z", "hours": 6.8814, "text": "Improvements Public changelog page synced with shipping updates. Align the site catalog with the nine app categories. Allow timed unique conversion codes at checkout and in recovery mail."}, {"post_id": 43780, "ts": "2026-08-09T06:37:47Z", "hours": 10.1469, "text": "Improvements- Overhaul marketing copy, pricing UX, and hero assets for conversion. Fixes - Fix checkout recovery mail for failed and abandoned payments."}, {"post_id": 41147, "ts": "2026-08-05T05:28:58Z", "hours": 9.2678, "text": "New features - Public wallpaper gallery with search, SEO, and app deep links. Improvements - Clearer pricing cards, benefits, and upgrade prompts. Fixes - Fix blank wallpaper player caused by expired ISR signed URLs. Fix gallery Back wiping Show more and jumping to the footer."}, {"post_id": 39858, "ts": "2026-08-03T03:47:19Z", "hours": 13.9444, "text": "Highlights MacWall 3.0 — a redesigned Home with Liquid Glass chrome and a cleaner everyday workflow. Heart any wallpaper to bookmark it in Library Favorites without downloading. Save wallpapers to your Library, then auto-cycle them as a slideshow. New features Home rebuilt around Top Charts and Categories for faster browsing. Spotlight-style search to find wallpapers instantly (⌘K / ⌘F). One Add Wallpaper flow for private Library imports and community submissions. Save-only Library actions — keep a wallpaper without setting it on the desktop. Auto-cycle slideshow through saved Library wallpapers. Open wallpapers from macwall.app share links directly in the app. Pro+ licenses now support 10, 15, or 20 Macs. New features - Home rebuilt around Top Charts and Categories for faster browsing. Discord community invite pointed at the new server link. Improvements Liquid Glass navigation, Cause brand type, and tighter Home composition. Pro unlock sheet with glass chrome and smooth open / close motion. Escape closes overlays reliably — no blue focus ring around the window. Native Settings sidebar Forms and simpler window chrome. App icon refreshed to match macwall.app. Instagram handle updated to @macwallapp_ . Discord community invite pointed at the new server link. Highlights - MacWall 3.0 — a redesigned Home with Liquid Glass chrome and a cleaner everyday workflow. Heart any wallpaper to bookmark it in Library Favorites without downloading. Save wallpapers to your Library, then auto-cycle them as a slideshow. Spotlight-style search to find wallpapers instantly (⌘K / ⌘F). Save-only Library actions — keep a wallpaper without setting it on the desktop. Auto-cycle slideshow through saved Library wallpapers. Open wallpapers from macwall.app share links directly in the app. Improvements - Liquid Glass navigation, Cause brand type, and tighter Home composition. Favorites correctly appear in Library without a silent full download. Stronger app lifecycle, liveness, and desktop wallpaper stability. Smoother Live Support handoff with fewer stuck tickets. Fixes More reliable native wallpaper apply, repair, and extension playback. Favorites correctly appear in Library without a silent full download. Stronger app lifecycle, liveness, and desktop wallpaper stability. Smoother Live Support handoff with fewer stuck tickets. Fixes - More reliable native wallpaper apply, repair, and extension playback."}, {"post_id": 35582, "ts": "2026-07-27T03:37:07Z", "hours": 2.1853, "text": "MacWall updates after June 1, 2026"}, {"post_id": 34484, "ts": "2026-07-25T07:47:03Z", "hours": 3.4406, "text": "Working on MacWall.app :)"}, {"post_id": 33965, "ts": "2026-07-24T10:14:34Z", "hours": 0.7647, "text": "I built MacWall because I wanted live wallpapers on Mac that feel native not an Electron wrapper eating battery. The Swift app is the product. This repo is the storefront: marketing, Stripe checkout, license activation, downloads, blog, community submit, and admin tools."}, {"post_id": 33944, "ts": "2026-07-24T08:38:07Z", "hours": 14.6167, "text": "shipped pricing model today let’s go visit for free live wallpapers for your mac 💻 macwall.app get your one now !"}, {"post_id": 17445, "ts": "2026-06-28T07:04:17Z", "hours": 27.6111, "text": "live wallpaper for macos download the app now"}]...
|
Title: MacWall - Website by @foundrceo | Stardance Title: MacWall - Website by @foundrceo | Stardance
Devlogs:
live wallpaper for macos download the app now
shipped pricing model today let’s go visit for free live wallpapers for your mac 💻 macwall.app get your one now !
I built MacWall because I wanted live wallpapers on Mac that feel native not an Electron wrapper eating battery. The Swift app is the product. This repo is the storefront: marketing, Stripe checkout, license activation, downloads, blog, community submit, and admin tools.
Working on MacWall.app :)
MacWall updates after June 1, 2026
Highlights MacWall 3.0 — a redesigned Home with Liquid Glass chrome and a cleaner everyday workflow. Heart any wallpaper to bookmark it in Library Favorites without downloading. Save wallpapers to your Library, then auto-cycle them as a slideshow. New features Home rebuilt around Top Charts and Categories for faster browsing. Spotlight-style search to find wallpapers instantly (⌘K / ⌘F). One Add Wallpaper flow for private Library imports and community submissions. Save-only Library actions — keep a wallpaper without setting it on the desktop. Auto-cycle slideshow through saved Library wallpapers. Open wallpapers from macwall.app share links directly in the app. Pro+ licenses now support 10, 15, or 20 Macs. New features - Home rebuilt around Top Charts and Categories for faster browsing. Discord community invite pointed at the new server link. Improvements Liquid Glass navigation, Cause brand type, and tighter Home composition. Pro unlock sheet with glass chrome and smooth open / close motion. Escape closes overlays reliably — no blue focus ring around the window. Native Settings sidebar Forms and simpler window chrome. App icon refreshed to match macwall.app. Instagram handle updated to @macwallapp_ . Discord community invite pointed at the new server link. Highlights - MacWall 3.0 — a redesigned Home with Liquid Glass chrome and a cleaner everyday workflow. Heart any wallpaper to bookmark it in Library Favorites without downloading. Save wallpapers to your Library, then auto-cycle them as a slideshow. Spotlight-style search to find wallpapers instantly (⌘K / ⌘F). Save-only Library actions — keep a wallpaper without setting it on the desktop. Auto-cycle slideshow through saved Library wallpapers. Open wallpapers from macwall.app share links directly in the app. Improvements - Liquid Glass navigation, Cause brand type, and tighter Home composition. Favorites correctly appear in Library without a silent full download. Stronger app lifecycle, liveness, and desktop wallpaper stability. Smoother Live Support handoff with fewer stuck tickets. Fixes More reliable native wallpaper apply, repair, and extension playback. Favorites correctly appear in Library without a silent full download. Stronger app lifecycle, liveness, and desktop wallpaper stability. Smoother Live Support handoff with fewer stuck tickets. Fixes - More reliable native wallpaper apply, repair, and extension playback.
New features - Public wallpaper gallery with search, SEO, and app deep links. Improvements - Clearer pricing cards, benefits, and upgrade prompts. Fixes - Fix blank wallpaper player caused by expired ISR signed URLs. Fix gallery Back wiping Show more and jumping to the footer.
Improvements- Overhaul marketing copy, pricing UX, and hero assets for conversion. Fixes - Fix checkout recovery mail for failed and abandoned payments.
Improvements Public changelog page synced with shipping updates. Align the site catalog with the nine app categories. Allow timed unique conversion codes at checkout and in recovery mail.
Fixes - Older free installs are treated the same as an ended trial: wallpapers stay paused until you unlock Pro.
Updated Entire Website UI/UX to 100x better :)
mihi
Update: v4.0.3Sep 18, 2026
raised macwall pricing recently and the response has actually been really good traffic is growing a lot too now around 59k visitors and 128k page views been testing pricing changes and polishing the site while watching how people respond to it
Just Shipped a major update in the ui ux overall application.
Ships:
what did you make? macwall.app - the website for my macos live wallpaper app. download the free app buy pro with stripe and activate with a deep link. also pricing blog submit wallpapers and affiliates. what was challenging? getting checkout right. stripe → license email → macwall://activate had a lot of edge cases. india pricing and the reel refund flow took a few rewrites. keeping price copy in sync with real stripe prices was annoying. what are you proud of? it is live and people can actually use it. one click download one click checkout and the app unlocks. the site feels like a real product not a template. what should people know so they can test? open https://macwall.app hit download for macos (or grab the dmg on the github release). you need macos 26. browse pricing if you want to see permanent annual and reel refund. free try works without paying.
I just updated the entire ui ux of my website to make it 100x better and get better conversions update all the files and components name also to a professional / enterprise level
Redesigned the homepage and site UI New hero, navbar, category strip and License pop-up. Features shown as rows, an Apple-style footer, and new 404 and error pages. New app icon everywhere (favicons, email logo) and a new social share image. New hero app video in 1080p, slowed down. Redesigned pricing page that says “one-time payment”. Install guide with animations, shown after you download. New help center with topic cards, search, and help inside the ⌘K command menu. Moved the whole site from Vercel to Cloudflare Workers macwall.app now runs on Cloudflare; Vercel is kept only as a backup. I connected the domains, moved the scheduled jobs (cron) over, set up caching for the landing pages, and fixed visitor country/IP detection on Cloudflare. Before the move I cut Vercel costs: videos served from R2, longer caching, lighter images, smaller 404 pages. Phone visitors On a phone, “Send to my Mac” emails you the download link instead of downloading a Mac file. “Set on Mac” opens the app directly through a macwall:// link. Wallpaper gallery and search traffic 45 wallpaper collections, more detailed wallpaper pages, and guides written to answer questions directly. Gallery sorted by most liked, with a “Download free” button and a sticky bar at the bottom. Faster loading: static gallery pages, lighter images, and full-size wallpaper files no longer served....
|
1792994075.7772334
|
1793080475.7772334
|
|
52936
|
DevToolBox by @Prajwol_Gynawali | Stardance
|
Prajwol_Gynawali
|
5
|
72.0
|
1086
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-03T06:42:41Z", "hours": 6.0, "multiplier": 14.51, "payout": 91, "blessing": "neutral", "text": "DevSatchel — Final Update I’ve added a lot of tools to Devsatchel and it’s finally starting to feel like a complete toolbox for everyday development work. Developer Tools JSON Formatter JSON Validator Regex Tester Diff Checker Base64 Encoder / Decoder URL Encoder / Decoder JWT Decoder UUID Generator Password Generator QR Code Generator Barcode Generator Hash Generator HTTP Request Builder CSS Unit Converter Code Beautifier HTML/CSS/JS Playground CSV ↔ JSON Converter CSS & Design Color Converter Gradient Generator Box Shadow Generator Flexbox Generator Color Palette Generator AI AI Code Reviewer Image Tools Image Compressor Image Resizer Image to PDF Image to Text (OCR) PDF Tools PDF to JPG PDF Merger Image to PDF Security AES Encryption Base64 Encoder / Decoder Hash Generator I also updated the UI, logo and logo background, added dark/light mode, improved the tool search, and fixed a lot of bugs while building everything.", "repo": "https://github.com/SnaggingCobra/DevToolBox", "demo": "https://devsatchel.vercel.app/"}, {"ship_num": 2, "ts": "2026-09-27T07:47:10Z", "hours": 31.0, "multiplier": 16.52, "payout": 511, "blessing": "neutral", "text": "DevSatchel Ship I’ve finished a bunch of new tools and the project is finally starting to feel like a proper toolbox. Tools JSON Formatter JSON Validator Regex Tester Diff Checker Base64 Encoder / Decoder URL Encoder / Decoder JWT Decoder UUID Generator Password Generator Hash Generator HTTP Request Builder CSS Unit Converter Code Beautifier HTML/CSS/JS Playground CSS & Design Color Converter Gradient Generator Box Shadow Generator Flexbox Generator Color Palette Generator AI AI Code Reviewer Image Tools Image Compressor Image Resizer Image to PDF PDF to JPG Image to Text (OCR) PDF Image to PDF PDF to JPG Security AES Encryption Base64 Encoder / Decoder Hash Generator Also updated the UI, logo and logo background and fixed a lot of bugs along the way. The AI Code Reviewer now uses a backend API so the API key isn’t exposed in the frontend. Still have more tools I want to add, but this is where DevToolBox is at right now.", "repo": "https://github.com/SnaggingCobra/DevToolBox", "demo": "https://devsatchel.vercel.app/"}, {"ship_num": 3, "ts": "2026-09-20T07:44:28Z", "hours": 9.0, "multiplier": 15.65, "payout": 135, "blessing": "neutral", "text": "DevSatchel Ship Added AI Code Reviewer using the Gemini API Dev Jokes using an external API Small descriptions for the tools Fixed some issues from the last review All Tools JSON Formatter JSON Validator Regex Tester Diff Checker Color Converter Gradient Generator Box Shadow Generator Flexbox Generator Base64 Encoder/Decoder URL Encoder/Decoder JWT Decoder UUID Generator Password Generator QR Code Generator Barcode Generator Hash Generator CSS Unit Converter HTTP Request Builder AI Code Reviewer", "repo": "https://github.com/SnaggingCobra/DevToolBox", "demo": "https://devsatchel.vercel.app/"}, {"ship_num": 4, "ts": "2026-09-11T17:17:31Z", "hours": 16.0, "multiplier": 16.74, "payout": 267, "blessing": "neutral", "text": "When I first shipped DevSatchel it has name DevToolBox but i changed the name because in internet i found other have already used this name and i pulished it through netlify , it only had 8 tools. Since then I’ve been adding a lot more useful tools and slowly turning it into a proper all-in-one developer toolbox. The tools now include: JSON Formatter JSON Validator Regex Tester Diff Checker Color Converter Gradient Generator Box Shadow Generator Flexbox Generator Base64 Encoder/Decoder URL Encoder/Decoder JWT Decoder UUID Generator Password Generator QR Code Generator Barcode Generator Hash Generator CSS Unit Converter HTTP Request Builder i will be adding new tools in future also", "repo": "https://github.com/SnaggingCobra/DevToolBox", "demo": "https://devsatchel.vercel.app/"}, {"ship_num": 5, "ts": "2026-08-29T05:10:53Z", "hours": 10.0, "multiplier": 7.89, "payout": 82, "blessing": "neutral", "text": "Hey! I’m shipping my DevToolBox project to test out the shipping and voting process and understand how everything works. DevToolBox is a web-based developer toolbox where I’m building different useful developer utilities in one place, with a sidebar for navigating between tools and a workspace where each tool runs. Right now I have 8 working tools: • JSON Formatter • JSON Validator • Regex Tester • Diff Checker • Color Converter • Gradient Generator • Box Shadow Generator • Flexbox Generator The project isn’t completely finished yet — I’m still planning to add more tools, especially in the Encoding and Generators sections. I’m shipping it now because I want to experience the full ship → review → voting process with a project I’ve already built a significant part of. I’d appreciate any feedback on what I can improve before I continue expanding it!", "repo": "https://github.com/SnaggingCobra/DevToolBox", "demo": "https://devsatchel.vercel.app/"}]...
|
[{"post_id": 76325, "ts": "202 [{"post_id": 76325, "ts": "2026-10-03T06:36:30Z", "hours": 6.2589, "text": "#Devpost #32 this is not much of a big buti was short of 50 stardust so i dont had a plan so added one tool and improved some design for now closing this project with the base rate of 10 per hour i can get 60 thats enough for me"}, {"post_id": 74362, "ts": "2026-09-27T07:43:29Z", "hours": 4.3617, "text": "DevPost #31: DevSatchel Update PDF Merger The PDF Merger lets you select multiple PDFs and combine them into one file. Select multiple PDFs Merge them into one Simple browser-based interface I ran into a few issues while handling multiple PDFs and keeping the pages in the correct order, but got it working. image to Text The Image to Text tool uses OCR to extract text from images. Upload Image → Preview → Extract Text → Copy I kept it simple with just the extracted text and a Copy Text button. OCR works better with clear, high-quality images. Both tools run directly in the browser, and I’m continuing to add more useful tools to DevSatchel"}, {"post_id": 73983, "ts": "2026-09-26T13:41:59Z", "hours": 5.2164, "text": "DevPost #30: DevSatchel Update Today, I added two new tools to DevToolBox: Image to PDF Converter – Convert images into PDF files directly in the browser. PDF to JPG Converter – Convert PDF pages into JPG images and download them individually. I also updated the logo and changed the background to give DevSatchel a fresh new look. While working on the PDF to JPG converter, I faced a lot of errors, especially with rendering PDF pages and converting them into images. I had to spend time debugging and fixing issues to make the conversion work properly. Still improving and adding more useful tools. More updates coming soon"}, {"post_id": 73553, "ts": "2026-09-25T11:56:55Z", "hours": 4.5008, "text": "DevPost #29: devsatchel Update ### HTML/CSS/JS Playground A small browser-based coding environment for quickly testing web code. HTML, CSS, and JavaScript editors Live preview Run and Clear buttons Isolated JavaScript execution Responsive layout PDF to JPG Converter A browser-based tool for converting PDF pages into JPG images. PDF upload and drag & drop Adjustable JPG quality Page-by-page preview Download individual JPGs Download all pages as a ZIP Uses PDF.js and JSZip Both tools run mainly in the browser without requiring a backend for processing."}, {"post_id": 73127, "ts": "2026-09-24T13:22:34Z", "hours": 5.4194, "text": "Devpost #28 : added Image Compressor & Image Resizer Image Compressor Compress JPG, PNG, and WebP images. Adjust image quality and preview file size changes. Download compressed images. Image Resizer Resize images using custom width and height in pixels. Maintain aspect ratio or resize by percentage. Added size presets, fit, fill/crop, and stretch modes. Choose output format and quality. Challenges & Learning I faced some challenges with maintaining image proportions, handling different resize modes, and balancing image quality with file size. I used JavaScript and the Canvas API to process images directly in the browser without external APIs."}, {"post_id": 72649, "ts": "2026-09-23T12:45:45Z", "hours": 3.6008, "text": "DevPost #27: DevSatchel CSS Added Random color palettes generator Monochromatic, complementary, analogous, and triadic palettes Lock individual colors while generating Copy individual colors or the full palette Improvements Fixed errors in the previous tools Improved tool functionality and integration Fixed some issues found during testing More improvements coming soon!"}, {"post_id": 72315, "ts": "2026-09-22T17:25:17Z", "hours": 5.2369, "text": "DevPost #26: Devsatchel Update Spent some more time improving project and working on multiple parts of the project. Added Added AES Encryption / Decryption using the Web Crypto API more Faster Loading Tool Improvements & Fixes Updated the AI Code Reviewer backend and request handling Fixed issues in the HTTP Request Builder Improved tool loading and integration Fixed bugs found while testing existing tools Made some UI and workspace improvements"}, {"post_id": 71830, "ts": "2026-09-21T16:50:23Z", "hours": 2.5803, "text": "DevPost #25: Code Beautifier Added Added a new Code Beautifier tool to DevSatchel It uses Prettier to format and clean up: JavaScript JSON HTML CSS It also includes Beautify, Copy, and Clear buttons. Everything runs directly in the browser — no AI or API needed."}, {"post_id": 71030, "ts": "2026-09-20T07:18:30Z", "hours": 0.5519, "text": "Devpost #24: Dev Jokes Added Added a small Dev Jokes section below the Quick Links in DevToolBox! It fetches a random programming joke using JokeAPI whenever the website is opened or refreshed. There’s also a New Joke button to get another one without refreshing the page. Small feature, but it makes the workspace a little more fun while coding!"}, {"post_id": 70997, "ts": "2026-09-20T05:41:29Z", "hours": 1.7203, "text": "DevPost: #23 #AI Code Reviewer I have finally completed the AI Code Reviewer The AI Code Reviewer uses the Gemini API to review source code based on the specific task selected by the user. It supports: Full Review Bug Detection Security Review Performance Review Code Quality Readability Test Suggestions The code is sent to my backend through a Netlify Function, which then communicates with the Gemini API."}, {"post_id": 70104, "ts": "2026-09-18T14:03:32Z", "hours": 3.0833, "text": "#DecPost #22: # AI Code Reviewer Last time I was mostly working on the UI and getting the basic structure in place. This time I started working more on the actual review logic . I added different review modes so the AI doesn’t just give the same generic review every time: Full Review Bugs Security Performance Code Quality Readability Tests Each mode now has its own specific prompt. So if I choose Bugs the AI should focus on finding bugs and incorrect behavior instead of trying to review everything at once. I also worked on making the selected review type control what gets sent to the AI. What’s left Connect the actual AI API Send the code + selected review type Display the AI response Add loading and error handling Test all the review modes Improve the prompts based on the results Test with different programming languages Clean up anything that breaks during testing What’s next Next I’m going to work on connecting the actual AI and finally see how the reviewer performs with real code."}, {"post_id": 69111, "ts": "2026-09-16T12:06:13Z", "hours": 2.5633, "text": "DevPost #21: AI Code Reviewer I’ve been working on adding an AI Code Reviewer to DevSatchel recently. The main goal is pretty simple: paste your code, let the AI look through it, and get feedback that actually helps you understand what could be improved. What I’ve done so far Created the AI Code Reviewer tool Built the UI and layout Added the code input area Added the review/results section Added the basic review workflow Connected it to the DevToolBox tool system Finished the initial frontend work The UI is now in place, so I can actually start working on the part that matters most — the AI review itself. What’s left Connect the AI/API Send the user’s code to the AI for review Show the feedback properly in the results section Make the AI identify bugs and possible issues Add suggestions for improving the code Support multiple programming languages Add proper loading/error handling Test it with different types of code Clean up anything that feels rough after testing What I’m doing next My next step is connecting the actual AI backend. Once that’s working, I’ll test it with real code and see how useful the reviews actually are. From there I’ll probably spend more time improving the prompts, handling different languages, and making the feedback easier to understand. The frontend part is mostly there now. Now it’s time to make the AI actually do the work."}, {"post_id": 67749, "ts": "2026-09-14T00:00:31Z", "hours": 0.6944, "text": "DevPost #20: Starting AI Code Reviewer starting a new project yesterday i got busy and coudnt code much did 12m but my streak is broken and im busy today also so strying to do a devpost now not much for now # Ai Code Reviwer is a tool that will be reviewing your code in diffrent terms like bug security and much more i will be using API of a chatbot and only leave few section that will allow user to review their code"}, {"post_id": 66051, "ts": "2026-09-11T16:47:05Z", "hours": 5.8292, "text": "DevPost #19: one of the hardest and challenging tool i have ever worked i would have created a new project here for thisbut i added this most of time im just reding documentation atching fixes and tool little course to make this tol working properly HTTP Request BuilderIt can create and send GET, POST, PUT, PATCH, and DELETE requests, add parameters and headers, view responses, and generate JavaScript, cURL, and Python code. The main challenges were fixing JavaScript errors, handling URL parameters correctly, and dealing with browser CORS restrictions."}, {"post_id": 64653, "ts": "2026-09-09T06:55:33Z", "hours": 2.3989, "text": "DevPost #18: Finally fixed the hash geneatpor error it took over a hour this tiime and also have done some changes in the main style.css for a better ui working in this for a quite long also now i am thinking o add more tools lets see what gets me their"}, {"post_id": 63662, "ts": "2026-09-07T16:20:42Z", "hours": 0.3547, "text": "DevPost #17: Asimple and functional tool Password generator was added and now after i implement the css design i will work on the qrcode generator and i have found a simple guide for this an di think it will aslo work as intended i have watched some guide for this and it is looking grate fr now need to implement it to main now"}, {"post_id": 63643, "ts": "2026-09-07T15:48:20Z", "hours": 0.8675, "text": "DevPost #16: currently i have been updating all tools css and also added the uuid generator but mainly im focused on improving css of whole site . After i finish this im resuming the password Generator section."}, {"post_id": 62297, "ts": "2026-09-05T16:30:36Z", "hours": 0.7217, "text": "DevPost #15: Currently working on the improvement of whole ui and adding new features im thinking to add more featiures like quicklinks where i will add 100+ other tools that will have link toother website"}, {"post_id": 61526, "ts": "2026-09-04T14:08:14Z", "hours": 0.6561, "text": "DevPost #14: the toolboox is looking too dull and many have suggested me to imprve my css and the ui is very boring so im trying to add css in my website with my own toolbox gradient generator and im also using my own toolbox color conveter to add some colores here hope everyone will like my new design"}, {"post_id": 60099, "ts": "2026-09-02T07:50:01Z", "hours": 0.6417, "text": "Devpost #13: In my recent ship rating i got suggestion that if we could add no of items it would be grate so i have implemented it i have additionally added a section to enter number of items and a generate button and its working perfectly"}, {"post_id": 59666, "ts": "2026-09-01T16:10:38Z", "hours": 0.7028, "text": "DevPost #12 : From the recent revire from my ship over 5 out of 12 peope have suggested me too fix the css loading its taking time so now i have Improved the tool loading system by preloading the tool CSS and making sure the CSS loads before the tool is displayed also fixed up the JavaScript loading to minimze the loading time"}, {"post_id": 59020, "ts": "2026-08-31T16:30:59Z", "hours": 0.8525, "text": "DevPost #11 : First Of all m ship was approved thats nice and after that i have restarted my project worked in the url encoder and jwt decoder section i have a lot of problem in the jwt decoder because i dont even knoe properly to use this so i took help from other creators online used their method and isea for this and implemented my toolbox design in it ."}, {"post_id": 58694, "ts": "2026-08-31T06:39:59Z", "hours": 0.3475, "text": "DevPost #10 this is my final devpost until my previous ship is approved . i woudnt do this but i need some work to do in base64 that wasnt working properly so did some fixes their and now closing it until previous ship is approved"}, {"post_id": 58215, "ts": "2026-08-30T16:00:31Z", "hours": 2.5661, "text": "DevPost #9 : recently got a lot of troublee when shipping my project so ciudnt work properly for previous day still i have now added Base64 Encoder/Decoder you can now encode and decode base64 text and also recently i have finished the url encoder where you can encode the url or decode the given url these are some tools that i have never used but got suggestion to add so i ahve added them"}, {"post_id": 57073, "ts": "2026-08-29T05:06:27Z", "hours": 0.3483, "text": "DevPost #8 : just now figured out that i could ship my project multple time and get reviewed so im shipping my project currently i have 8 tools all working properly added readme and page is live through github pages lets see my first ship"}, {"post_id": 56459, "ts": "2026-08-28T07:14:29Z", "hours": 2.8381, "text": "Devpost #7 : added boxshadow and flexbox generator in the CSS secction and finished the css section for now now will be working on encoding"}, {"post_id": 55157, "ts": "2026-08-26T17:05:48Z", "hours": 2.1258, "text": "DevPost #6: Added Color Coverter and Gradient generrator with live preview that very good you should checkout that"}, {"post_id": 54604, "ts": "2026-08-25T17:04:14Z", "hours": 0.8622, "text": "DevPost #5: added diff checker and fixed the incoming errors fixed css errors"}, {"post_id": 53187, "ts": "2026-08-23T17:00:52Z", "hours": 2.2847, "text": "DevPost #4: Added the css for the main page and made sub folders for tools and connected to the main js . currenlty finished 3 tools json formatter , json validator, regex tester. search is working theme is working"}, {"post_id": 52875, "ts": "2026-08-23T07:51:08Z", "hours": 0.635, "text": "DevPost #3 : done the structure thing this is the main design now i will be adding the whole design and then add js also . Can someone help me in the top header section I have a Text DevToolBox in h1 but in screen i have seen DevToolBox! why is this"}, {"post_id": 52857, "ts": "2026-08-23T07:00:06Z", "hours": 0.9311, "text": "DevPost #2 : Maing some design an dtesting which design migh tbe good for whole structure . im trying to make a good looking skeliton before writing the actual code"}, {"post_id": 52477, "ts": "2026-08-22T16:44:53Z", "hours": 0.3392, "text": "#1 DevPost : Started to make a Toolbox for devs got a lot of errors in like first 5 min like coudnt connect the git togithub a lot o fproblem thanks to vscode agent and chatgpt they helpedme to fix the error"}]...
|
Title: DevToolBox by @Prajwol_Gynawali | Stardance Title: DevToolBox by @Prajwol_Gynawali | Stardance
Devlogs:
#1 DevPost : Started to make a Toolbox for devs got a lot of errors in like first 5 min like coudnt connect the git togithub a lot o fproblem thanks to vscode agent and chatgpt they helpedme to fix the error
DevPost #2 : Maing some design an dtesting which design migh tbe good for whole structure . im trying to make a good looking skeliton before writing the actual code
DevPost #3 : done the structure thing this is the main design now i will be adding the whole design and then add js also . Can someone help me in the top header section I have a Text DevToolBox in h1 but in screen i have seen DevToolBox! why is this
DevPost #4: Added the css for the main page and made sub folders for tools and connected to the main js . currenlty finished 3 tools json formatter , json validator, regex tester. search is working theme is working
DevPost #5: added diff checker and fixed the incoming errors fixed css errors
DevPost #6: Added Color Coverter and Gradient generrator with live preview that very good you should checkout that
Devpost #7 : added boxshadow and flexbox generator in the CSS secction and finished the css section for now now will be working on encoding
DevPost #8 : just now figured out that i could ship my project multple time and get reviewed so im shipping my project currently i have 8 tools all working properly added readme and page is live through github pages lets see my first ship
DevPost #9 : recently got a lot of troublee when shipping my project so ciudnt work properly for previous day still i have now added Base64 Encoder/Decoder you can now encode and decode base64 text and also recently i have finished the url encoder where you can encode the url or decode the given url these are some tools that i have never used but got suggestion to add so i ahve added them
DevPost #10 this is my final devpost until my previous ship is approved . i woudnt do this but i need some work to do in base64 that wasnt working properly so did some fixes their and now closing it until previous ship is approved
DevPost #11 : First Of all m ship was approved thats nice and after that i have restarted my project worked in the url encoder and jwt decoder section i have a lot of problem in the jwt decoder because i dont even knoe properly to use this so i took help from other creators online used their method and isea for this and implemented my toolbox design in it .
DevPost #12 : From the recent revire from my ship over 5 out of 12 peope have suggested me too fix the css loading its taking time so now i have Improved the tool loading system by preloading the tool CSS and making sure the CSS loads before the tool is displayed also fixed up the JavaScript loading to minimze the loading time
Devpost #13: In my recent ship rating i got suggestion that if we could add no of items it would be grate so i have implemented it i have additionally added a section to enter number of items and a generate button and its working perfectly
DevPost #14: the toolboox is looking too dull and many have suggested me to imprve my css and the ui is very boring so im trying to add css in my website with my own toolbox gradient generator and im also using my own toolbox color conveter to add some colores here hope everyone will like my new design
DevPost #15: Currently working on the improvement of whole ui and adding new features im thinking to add more featiures like quicklinks where i will add 100+ other tools that will have link toother website
DevPost #16: currently i have been updating all tools css and also added the uuid generator but mainly im focused on improving css of whole site . After i finish this im resuming the password Generator section.
DevPost #17: Asimple and functional tool Password generator was added and now after i implement the css design i will work on the qrcode generator and i have found a simple guide for this an di think it will aslo work as intended i have watched some guide for this and it is looking grate fr now need to implement it to main now
DevPost #18: Finally fixed the hash geneatpor error it took over a hour this tiime and also have done some changes in the main style.css for a better ui working in this for a quite long also now i am thinking o add more tools lets see what gets me their
DevPost #19: one of the hardest and challenging tool i have ever worked i would have created a new project here for thisbut i added this most of time im just reding documentation atching fixes and tool little course to make this tol working properly HTTP Request BuilderIt can create and send GET, POST, PUT, PATCH, and DELETE requests, add parameters and headers, view responses, and generate JavaScript, cURL, and Python code. The main challenges were fixing JavaScript errors, handling URL parameters correctly, and dealing with browser CORS restrictions.
DevPost #20: Starting AI Code Reviewer starting a new project yesterday i got busy and coudnt code much did 12m but my streak is broken and im busy today also so strying to do a devpost now not much for now # Ai Code Reviwer is a tool that will be reviewing your code in diffrent terms like bug security and much more i will be using API of a chatbot and only leave few section that will allow user to review their code
DevPost #21: AI Code Reviewer I’ve been working on adding an AI Code Reviewer to DevSatchel recently. The main goal is pretty simple: paste your code, let the AI look through it, and get feedback that actually helps you understand what could be improved. What I’ve done so far Created the AI Code Reviewer tool Built the UI and layout Added the code input area Added the review/results section Added the basic review workflow Connected it to the DevToolBox tool system Finished the initial frontend work The UI is now in place, so I can actually start working on the part that matters most — the AI review itself. What’s left Connect the AI/API Send the user’s code to the AI for review Show the feedback properly in the results section Make the AI identify bugs and possible issues Add suggestions for improving the code Support multiple programming languages Add proper loading/error handling Test it with different types of code Clean up anything that feels rough after testing What I’m doing next My next step is connecting the actual AI backend. Once that’s working, I’ll test it with real code and see how useful the reviews actually are. From there I’ll probably spend more time improving the prompts, handling different languages, and making the feedback easier to understand. The frontend part is mostly there now. Now it’s time to make the AI actually do the work.
#DecPost #22: # AI Code Reviewer Last time I was mostly working on the UI and getting the basic structure in place. This time I started working more on the actual review logic . I added different review modes so the AI doesn’t just give the same generic review every time: Full Review Bugs Security Performance Code Quality Readability Tests Each mode now has its own specific prompt. So if I choose Bugs the AI should focus on finding bugs and incorrect behavior instead of trying to review everything at once. I also worked on making the selected review type control what gets sent to the AI. What’s left Connect the actual AI API Send the code + selected review type Display the AI response Add loading and error handling Test all the review modes Improve the prompts based on the results Test with different programming languages Clean up anything that breaks during testing What’s next Next I’m going to work on connecting the actual AI and finally see how the reviewer performs with real code.
DevPost: #23 #AI Code Reviewer I have finally completed the AI Code Reviewer The AI Code Reviewer uses the Gemini API to review source code based on the specific task selected by the user. It supports: Full Review Bug Detection Security Review Performance Review Code Quality Readability Test Suggestions The code is sent to my backend through a Netlify Function, which then communicates with the Gemini API.
Devpost #24: Dev Jokes Added Added a small Dev Jokes section below the Quick Links in DevToolBox! It fetches a random programming joke using JokeAPI whenever the website is opened or refreshed. There’s also a New Joke button to get another one without refreshing the page. Small feature, but it makes the workspace a little more fun while coding!
DevPost #25: Code Beautifier Added Added a new Code Beautifier tool to DevSatchel It uses Prettier to format and clean up: JavaScript JSON HTML CSS It also includes Beautify, Copy, and Clear buttons. Everything runs directly in the browser — no AI or API needed.
DevPost #26: Devsatchel Update Spent some more time improving project and working on multiple parts of the project. Added Added AES Encryption / Decryption using the Web Crypto API more Faster Loading Tool Improvements & Fixes Updated the AI Code Reviewer backend and request handling Fixed issues in the HTTP Request Builder Improved tool loading and integration Fixed bugs found while testing existing tools Made some UI and workspace improvements
DevPost #27: DevSatchel CSS Added Random color palettes generator Monochromatic, complementary, analogous, and triadic palettes Lock individual colors while generating Copy individual colors or the full palette Improvements Fixed errors in the previous tools Improved tool functionality and integration Fixed some issues found during testing More improvements coming soon!
Devpost #28 : added Image Compressor & Image Resizer Image Compressor Compress JPG, PNG, and WebP images. Adjust image quality and preview file size changes. Download compressed images. Image Resizer Resize images using custom width and height in pixels. Maintain aspect ratio or resize by percentage. Added size presets, fit, fill/crop, and stretch modes. Choose output format and quality. Challenges & Learning I faced some challenges with maintaining image proportions, handling different resize modes, and balancing image quality with file size. I used JavaScript and the Canvas API to process images directly in the browser without external APIs.
DevPost #29: devsatchel Update ### HTML/CSS/JS Playground A small browser-based coding environment for quickly testing web code. HTML, CSS, and JavaScript editors Live preview Run and Clear buttons Isolated JavaScript execution Responsive layout PDF to JPG Converter A browser-based tool for converting PDF pages into JPG images. PDF upload and drag & drop Adjustable JPG quality Page-by-page preview Download individual JPGs Download all pages as a ZIP Uses PDF.js and JSZip Both tools run mainly in the browser without requiring a backend for processing.
DevPost #30: DevSatchel Update Today, I added two new tools to DevToolBox: Image to PDF Converter – Convert images into PDF files directly in the browser. PDF to JPG Converter – Convert PDF pages into JPG images and download them individually. I also updated the logo and changed the background to give DevSatchel a fresh new look. While working on the PDF to JPG converter, I faced a lot of errors, especially with rendering PDF pages and converting them into images. I had to spend time debugging and fixing issues to make the conversion work properly. Still improving and adding more useful tools. More updates coming soon
DevPost #31: DevSatchel Update PDF Merger The PDF Merger lets you select multiple PDFs and combine them into one file. Select multiple PDFs Merge them into one Simple browser-based interface I ran into a few issues while handling multiple PDFs and keeping the pages in the correct order, but got it working. image to Text The Image to Text tool uses OCR to extract text from images. Upload Image → Preview → Extract Text → Copy I kept it simple with just the extracted text and a Copy Text button. OCR works better with clear, high-quality images. Both tools run directly in the browser, and I’m continuing to add more useful tools to DevSatchel
#Devpost #32 this is not much of a big buti was short of 50 stardust so i dont had a plan so added one tool and improved some design for now closing this project with the base rate of 10 per hour i can get 60 thats enough for me
Ships:
Hey! I’m shipping my DevToolBox project to test out the shipping and voting process and understand how everything works. DevToolBox is a web-based developer toolbox where I’m building different useful developer utilities in one place, with a sidebar for navigating between tools and a workspace where each tool runs. Right now I have 8 working tools: • JSON Formatter • JSON Validator • Regex Tester • Diff Checker • Color Converter • Gradient Generator • Box Shadow Generator • Flexbox Generator The project isn’t completely finished yet — I’m still planning to add more tools, especially in the Encoding and Generators sections. I’m shipping it now because I want to experience the full ship → review → voting process with a project I’ve already built a significant part of. I’d appreciate any feedback on what I can improve before I continue expanding it!
When I first shipped DevSatchel it has name DevToolBox but i changed the name because in internet i found other have already used this name and i pulished it through netlify , it only had 8 tools. Since then I’ve been adding a lot more useful tools and slowly turning it into a proper all-in-one developer toolbox. The tools now include: JSON Formatter JSON Validator Regex Tester Diff Checker Color Converter Gradient Generator Box Shadow Generator Flexbox Generator Base64 Encoder/Decoder URL Encoder/Decoder JWT Decoder UUID Generator Password Generator QR Code Generator Barcode Generator Hash Generator CSS Unit Converter HTTP Request Builder i will be adding new tools in future also
DevSatchel Ship Added AI Code Reviewer using the Gemini API Dev Jokes using an external API Small descriptions for the tools Fixed some issues from the last review All Tools JSON Formatter JSON Validator Regex Tester Diff Checker Color Converter Gradient Generator Box Shadow Generator Flexbox Generator Base64 Encoder/Decoder URL Encoder/Decoder JWT Decoder UUID Generator Password Generator QR Code Generator Barcode Generator Hash Generator CSS Unit Converter HTTP Request Builder AI Code Reviewer
DevSatchel Ship I’ve finished a bunch of new tools and the project is finally starting to feel like a proper toolbox. Tools JSON Formatter JSON Validator Regex Tester Diff Checker Base64 Encoder / Decoder URL Encoder / Decoder JWT Decoder UUID Generator Password Generator Hash Generator HTTP Request Builder CSS Unit Converter Code Beautifier HTML/CSS/JS Playground CSS & Design Color Converter Gradient Generator Box Shadow Generator Flexbox Generator Color Palette Generator AI AI Code Reviewer Image Tools Image Compressor Image Resizer Image to PDF PDF to JPG Image to Text (OCR) PDF Image to PDF PDF to JPG Security AES Encryption Base64 Encoder / Decoder Hash Generator Also updated the UI, logo and logo background and fixed a lot of bugs along the way. The AI Code Reviewer now uses a backend API so the API key isn’t exposed in the frontend. Still have more tools I want to add, but this is where DevToolBox is at right now.
DevSatchel — Final Update I’ve added a lot of tools to Devsatchel and it’s finally starting to feel like a complete toolbox for everyday development work. Developer Tools JSON Formatter JSON Validator Regex Tester Diff Checker Base64 Encoder / Decoder URL Encoder / Decoder JWT Decoder UUID Generator Password Generator QR Code Generator Barcode Generator Hash Generator HTTP Request Builder CSS Unit Converter Code Beautifier HTML/CSS/JS Playground CSV ↔ JSON Converter CSS & Design Color Converter Gradient Generator Box Shadow Generator Flexbox Generator Color Palette Generator AI AI Code Reviewer Image Tools Image Compressor Image Resizer Image to PDF Image to Text (OCR) PDF Tools PDF to JPG PDF Merger Image to PDF Security AES Encryption Base64 Encoder / Decoder Hash Generator I also updated the UI, logo and logo background, added dark/light mode, improved the tool search, and fixed a lot of bugs while building everything....
|
1792975951.840139
|
1793062351.840139
|
|
28030
|
Star Browser by @adri_3763 | Stardance
|
adri_3763
|
1
|
104.97
|
1079
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-28T12:07:03Z", "hours": 99.0, "multiplier": 12.69, "payout": 1079, "blessing": "neutral", "text": "I built a ligthweight and a beutiful browser with AI integrated. It was pretty easy at first but then some bugs started to appear and we had to work hard to fix them with some help of AI. I’m proud that I pulled off such a big project especially with my friend @Aron_3763 I’m so glad we finished it after all difficulties and stress. Try out the AI chat integrated into this browser and AI Memory. Let us know what you think of the project or if you have any feedback to give us.", "repo": "https://github.com/Adriii3793/Star-Browser", "demo": "https://github.com/Adriii3793/Star-Browser/releases/tag/v1.1.2"}]...
|
[{"post_id": 63889, "ts": "202 [{"post_id": 63889, "ts": "2026-09-07T22:14:07Z", "hours": 5.9744, "text": "Hello, @Aron_3763 and I fixed some bugs on Linux and made some improvements after a week of trying to test on virtual machines. It was pretty hard testing because the virtual machines sometimes took so long to load and create the app and we had some difficulties trying to fix the bugs. Plus we took a while because we had some stuff going on in our lives apparently but we hope y’all will like this browser and we’re glad it’s working now. Let us know what you think of this project, we would love to hear your feedback on it. That’s all for today soon we will upload the app. Byee!"}, {"post_id": 56554, "ts": "2026-08-28T11:07:12Z", "hours": 6.2892, "text": "Hey everyone, we finally made it. We did round of testing, fixed the last remaining issues and made some improvements. The App is almost ready to submit. We put a lot of effort into this build and we really hope you all enjoy it. Let us know what you think."}, {"post_id": 55172, "ts": "2026-08-26T17:28:31Z", "hours": 9.7044, "text": "Hello guys, we are almost done catching the bugs and fixing them. @Aron_3763 and I are doing some refinements on the code and optimizing it and in a few hours we will ship it.Hope y’all have a wonderful day.Bye bye"}, {"post_id": 54454, "ts": "2026-08-25T14:02:21Z", "hours": 10.1133, "text": "Hello guys, We’ve been trying to fix some bugs and we still have some issues with it We are trying to fix it and find the reason. Meanwhile Aron is trying to help me find out some issues too with me and testing and moral support hahah 😭 We’re still trying to find the bugs and I hope soon I will be able to ship it so y’all can try it. fun fact: we added this silly cat drooling working that represent us working on this project hahaha Hope you have a great day Byee"}, {"post_id": 53660, "ts": "2026-08-24T10:05:38Z", "hours": 16.6439, "text": "Hey guys sorry I haven’t updated you for a while, I was away on vacation and did a ton of stuff so everything has been a bit of a mess. While I was away, @Aron_3763 worked on a bunch of features for the browser. We fixed a lot of bugs, added memory to the AI so it can remember things and put in ad blockers and custom wallpapers. I also added a button to copy links from the search bar, optimized the favorite websites section and media players on the homepage and ran some tests with AI to clean up the code and prevent lag. However right now we’re having some issues in the frontend. We’ve been using AI to help us understand some of the problems and fix bugs because it started acting super strange whenever we try to use the AI chat and sometimes it just won’t respond at all. We’ve been trying to solve this for so many hours now with no luck but we’re still grinding and trying to figure it out. I will show more later byeee!"}, {"post_id": 38119, "ts": "2026-07-31T10:26:32Z", "hours": 10.4014, "text": "Hello guys Lately I’ve been working on few design changes and adding new features to make the browsing experience much smoother. We added 2 new feature Tab groups: you can categorize and group your open tabs together to stay organized while browsing. Honestly implementing this was pretty tough. It kept glitching, doing unexpected things and completely messing up the UI but after a lot of debugging with the help of AI, I managed to understand the errors and learned a lot along the way. Quick access Favorites: we updated the main start page layout and moved favorites right to the top for instant access to your most important websites. @Aron_3763 is currently working on the AI assistant + AI memory to make our built-in assistant remember past context and feel much smarter. That’s all for now baii"}, {"post_id": 36042, "ts": "2026-07-27T21:19:41Z", "hours": 15.9719, "text": "Hey guys, back with another update! Lately we’ve been spending a lot of time working on the setup of the browser, the AI, and the design. We decided to split the work to get things done. Things got pretty hard and I kept getting a lot of errors that were breaking the code but after trying many times, I figured it out and fixed all the backend issues by myself. Meanwhile, @Aron_3763 is working on the frontend, fixing bugs there and making the design look great. That’s it, byeee!"}, {"post_id": 34326, "ts": "2026-07-24T22:46:05Z", "hours": 10.0811, "text": "Hello guys! In these three days, I have been debugging some files and adding some fixes to the code. I would say it was pretty tough, but I did it with a lot of effort. Also, I have been working on the backend for AI memory and improving the AI with new cool features such as tagging tab and file uploads which @Aron_3763 worked on. For the apps, we were working on Windows, but we wanted to make it cross-platform, so we used a virtual machine to install macOS. It was pretty hard, but I luckily made it possible to use and work on my project. I also made some improvements for macOS, and now we are making it perfect. For now, we made it compatible with macOS and Windows and soon we will test it on Linux to understand it better and try to make it compatible with all operating systems. We are also trying to optimize this browser and I would say it’s pretty overwhelming, but I am glad we are seeing some progress. Let us know what you think about this project. Thanks for your attention baii!"}, {"post_id": 32333, "ts": "2026-07-21T13:18:23Z", "hours": 9.0183, "text": "Hello everyone Over the past few days, @Aron_3763 and I have been trying to solve bugs and polish the UI. We focused on fixing the window dragging and styling the tabs, including making them draggable. The tabs took a lot of effort because we ran into some crashing issues but we finally solved it. We also had some issues with Git giving us errors while trying to share our files which slowed us down a bit. Yesterday I was working on importing a webview into the page to enable website navigation. The backend has been pretty hard. I’ve spent almost 5 hours on it and I’m still working on it. Meanwhile Aron is currently styling the AI window so we can integrate AI into our browser. That’s all for now. Baii guys take care"}, {"post_id": 30352, "ts": "2026-07-17T20:34:32Z", "hours": 10.7142, "text": "Hello everyone Yesterday and today my friend @Aron_3763 and I worked together at the library each day for 8h on a project. We planned to build a fast, secure and beautiful browser. We divided the tasks after deciding to collaborate on the files. I designed the front page while Aron continued working on the window controls. We saw some issues, especially with the UI and parts of the code that wouldn’t work. However, we resolved them using AI and supporting each other throughout the process. Later, we will find the issues of the window controls, refine the UI, and if possible begin to work on the backend.This project is new for us, since we’ve never done this one before. We’re already learning new languages like Svelte, collaborating, and discovering how to create applications.Thanks for reading this. Hope you’ll support us during the process and share your thoughts on how it looksBaiii"}]...
|
Title: Star Browser by @adri_3763 | Stardance
Dev Title: Star Browser by @adri_3763 | Stardance
Devlogs:
Hello everyone Yesterday and today my friend @Aron_3763 and I worked together at the library each day for 8h on a project. We planned to build a fast, secure and beautiful browser. We divided the tasks after deciding to collaborate on the files. I designed the front page while Aron continued working on the window controls. We saw some issues, especially with the UI and parts of the code that wouldn’t work. However, we resolved them using AI and supporting each other throughout the process. Later, we will find the issues of the window controls, refine the UI, and if possible begin to work on the backend.This project is new for us, since we’ve never done this one before. We’re already learning new languages like Svelte, collaborating, and discovering how to create applications.Thanks for reading this. Hope you’ll support us during the process and share your thoughts on how it looksBaiii
Hello everyone Over the past few days, @Aron_3763 and I have been trying to solve bugs and polish the UI. We focused on fixing the window dragging and styling the tabs, including making them draggable. The tabs took a lot of effort because we ran into some crashing issues but we finally solved it. We also had some issues with Git giving us errors while trying to share our files which slowed us down a bit. Yesterday I was working on importing a webview into the page to enable website navigation. The backend has been pretty hard. I’ve spent almost 5 hours on it and I’m still working on it. Meanwhile Aron is currently styling the AI window so we can integrate AI into our browser. That’s all for now. Baii guys take care
Hello guys! In these three days, I have been debugging some files and adding some fixes to the code. I would say it was pretty tough, but I did it with a lot of effort. Also, I have been working on the backend for AI memory and improving the AI with new cool features such as tagging tab and file uploads which @Aron_3763 worked on. For the apps, we were working on Windows, but we wanted to make it cross-platform, so we used a virtual machine to install macOS. It was pretty hard, but I luckily made it possible to use and work on my project. I also made some improvements for macOS, and now we are making it perfect. For now, we made it compatible with macOS and Windows and soon we will test it on Linux to understand it better and try to make it compatible with all operating systems. We are also trying to optimize this browser and I would say it’s pretty overwhelming, but I am glad we are seeing some progress. Let us know what you think about this project. Thanks for your attention baii!
Hey guys, back with another update! Lately we’ve been spending a lot of time working on the setup of the browser, the AI, and the design. We decided to split the work to get things done. Things got pretty hard and I kept getting a lot of errors that were breaking the code but after trying many times, I figured it out and fixed all the backend issues by myself. Meanwhile, @Aron_3763 is working on the frontend, fixing bugs there and making the design look great. That’s it, byeee!
Hello guys Lately I’ve been working on few design changes and adding new features to make the browsing experience much smoother. We added 2 new feature Tab groups: you can categorize and group your open tabs together to stay organized while browsing. Honestly implementing this was pretty tough. It kept glitching, doing unexpected things and completely messing up the UI but after a lot of debugging with the help of AI, I managed to understand the errors and learned a lot along the way. Quick access Favorites: we updated the main start page layout and moved favorites right to the top for instant access to your most important websites. @Aron_3763 is currently working on the AI assistant + AI memory to make our built-in assistant remember past context and feel much smarter. That’s all for now baii
Hey guys sorry I haven’t updated you for a while, I was away on vacation and did a ton of stuff so everything has been a bit of a mess. While I was away, @Aron_3763 worked on a bunch of features for the browser. We fixed a lot of bugs, added memory to the AI so it can remember things and put in ad blockers and custom wallpapers. I also added a button to copy links from the search bar, optimized the favorite websites section and media players on the homepage and ran some tests with AI to clean up the code and prevent lag. However right now we’re having some issues in the frontend. We’ve been using AI to help us understand some of the problems and fix bugs because it started acting super strange whenever we try to use the AI chat and sometimes it just won’t respond at all. We’ve been trying to solve this for so many hours now with no luck but we’re still grinding and trying to figure it out. I will show more later byeee!
Hello guys, We’ve been trying to fix some bugs and we still have some issues with it We are trying to fix it and find the reason. Meanwhile Aron is trying to help me find out some issues too with me and testing and moral support hahah 😭 We’re still trying to find the bugs and I hope soon I will be able to ship it so y’all can try it. fun fact: we added this silly cat drooling working that represent us working on this project hahaha Hope you have a great day Byee
Hello guys, we are almost done catching the bugs and fixing them. @Aron_3763 and I are doing some refinements on the code and optimizing it and in a few hours we will ship it.Hope y’all have a wonderful day.Bye bye
Hey everyone, we finally made it. We did round of testing, fixed the last remaining issues and made some improvements. The App is almost ready to submit. We put a lot of effort into this build and we really hope you all enjoy it. Let us know what you think.
Hello, @Aron_3763 and I fixed some bugs on Linux and made some improvements after a week of trying to test on virtual machines. It was pretty hard testing because the virtual machines sometimes took so long to load and create the app and we had some difficulties trying to fix the bugs. Plus we took a while because we had some stuff going on in our lives apparently but we hope y’all will like this browser and we’re glad it’s working now. Let us know what you think of this project, we would love to hear your feedback on it. That’s all for today soon we will upload the app. Byee!
Ships:
I built a ligthweight and a beutiful browser with AI integrated. It was pretty easy at first but then some bugs started to appear and we had to work hard to fix them with some help of AI. I’m proud that I pulled off such a big project especially with my friend @Aron_3763 I’m so glad we finished it after all difficulties and stress. Try out the AI chat integrated into this browser and AI Memory. Let us know what you think of the project or if you have any feedback to give us....
|
1792997587.3734443
|
1793083987.3734443
|
|
20269
|
Social Media Website (YSX) by @AuraMonster | Stard Social Media Website (YSX) by @AuraMonster | Stardance...
|
AuraMonster
|
1
|
61.45
|
1074
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-07T00:44:15Z", "hours": 61.0, "multiplier": 17.75, "payout": 1074, "blessing": "neutral", "text": "This is YSX! A social media website where you can do pretty much anything! This project took a lot of time because of all the complex code involved with it. Fortunately, UI libraries (Such as ShadCN and Radix UI) and frameworks (such as Next.JS), as well as AI and other stuff helped me overcome this. IMPORTANT NOTE FOR SHIPWRIGHTS: IF YOU WANT TO TEST ADMIN PLEASE DM ME ON SLACK (username: mdmutahhar24).", "repo": "https://github.com/mdmutahhar24-pixel/YSX", "demo": "https://ysx-mu.vercel.app/"}]...
|
[{"post_id": 25748, "ts": "202 [{"post_id": 25748, "ts": "2026-07-10T05:57:49Z", "hours": 0.45, "text": "reship"}, {"post_id": 23816, "ts": "2026-07-06T23:48:56Z", "hours": 6.0539, "text": "Eleventh and final Devlog for YSX Social Media Website :D Changes: Removed empty screen from home page Heavy UI Changes Added Search bar to create Conversation Share, Comment Added Dislike removed Scrapped some ideas (or will come next ship) Updated Changelog so that it fits release New Features: Home Screen got added You can Now comment and share Files now compress in Chat but takes longer for larger files background around your name if you are creator of the post and you commented on it. Project will be shipped out soon :) (Image is admin POV)"}, {"post_id": 17752, "ts": "2026-06-28T17:50:39Z", "hours": 3.8953, "text": "Tenth Devlog for YSX Social Media Website Changes: Feed bug fixed and works again Liked button remains toggled even after refreshing the page Added a UI Sheet (from ShadCN) to comments button (Comments not finished) Switched from custom attachment style to using UI library’s attachment New Features: Ban Page (redirected when user is banned) In Progress: Comments Algorithm Chat Rework Feed Ban Expiry Being able to attach large files to chat Future Plans (Subject to Change): More features on Settings page Changelog upon release More (If you guys have any more ideas, I could use them!)"}, {"post_id": 16610, "ts": "2026-06-27T00:50:38Z", "hours": 4.315, "text": "Ninth Devlog for YSX Social Media Website Changes: UI Changes Chat Bug fixes New Features: Admin Features section now added! Frontend for Admin features Frontend Ban feature for admins In Progress: Chat UI revamp due to ShadCN (UI library) adding a message component Admin Features backend Ban backend Future Plans(subject to change): Being able to attach large files to chat Setting Page more features More loading pages Bug fixes More"}, {"post_id": 16033, "ts": "2026-06-26T01:13:55Z", "hours": 5.1086, "text": "Eight Devlog for YSX Social Media Website Changes: Added a posts tag feature Heavy UI changes and Bug fixes New Features: Added Banner Change feature Added Profile picture change feature Added scoring system (AKA an algorithm that tracks what you watch) Account Page now complete! You can also now delete your account via the settings page In Progress: Chat Page down due to multiple errors (trying to fix) Algorithm bug fixes Future plans (Subject to change): New features to settings page Ability to attach large files to chat Admin features Posts’ like, dislike, comment, share (crucial for algorithm) More"}, {"post_id": 15393, "ts": "2026-06-25T00:55:18Z", "hours": 8.6514, "text": "Seventh Devlog for YSX Social Media website Changes: Multiple bugs were fixed Loading Screens added for only a few pages New Features: Notifications now work! (This took me a long time and lots of frustration) Change description feature added In Progress: Banner change (frontend) Profile Picture change (frontend and backend) Settings Page Skeletons (loading pages) for other pages Future Plans (Subject to change): Being able to attach large files to chat (pushed off for later) Reels Algorithm Admin Features Post Editing Chat Editing Post likes, dislikes, messaging, share More"}, {"post_id": 14010, "ts": "2026-06-23T00:00:49Z", "hours": 5.8522, "text": "Sixth Devlog for YSX Social Media Website Changes: Chat Input styling Changed Messages styling Changed New Features: You can now attach small images/videos to chat Backend resolved for images/video attachments Mobile Support for chatting In Progress: Account Profile Picture changing being able to attach large files Account Banner Picture changing Account Page Settings Page Future Features (Subject to Change): Add comment, share, and like/dislike on posts Post editing Changelog editing upon release Admin Features Featured Posts Status for chatting Continually add mobile support for upcoming features"}, {"post_id": 13298, "ts": "2026-06-21T19:36:50Z", "hours": 2.9967, "text": "Fifth Devlog of YSX Social Media Website Changes: None New Features: Typing messages now works Backend added for Messaging Both users get messages and are automatically added to a conversation if one users starts it. In Progress: Account page Settings Page Future Things (To-Do list): Add attachments to messaging Add delete button to Posting Make a posts/reels algorithm Add User status on messaging page More (Subject to change)"}, {"post_id": 12700, "ts": "2026-06-20T18:55:57Z", "hours": 2.7692, "text": "Fourth Devlog of YSX Social Media Website Changes: Layout positioning UI design Instead of Relying on built in auth, created a synchronized table for extra features. New Features: Added and Completed Create Chat/Conversation Completed Backend to create chat In Progress: Messaging screen Sidebar Trigger fixed position Planned Features (Subject to change): Profile image changeable Chatting completion Likes/Dislikes feature on posts Comment Feature Share Feature Account and setting pages More undecided…"}, {"post_id": 12266, "ts": "2026-06-20T01:00:45Z", "hours": 6.4089, "text": "Third Devlog for YSX Social Media Website What is YSX? It is a social media website similar to websites like X, instagram, tik tok, etc. Changes: Added changelog section Chatting UI layout complete Chatting backend in progress Worked on UI Style Changes Made Chatting UI layout unique to YSX and no other social media website."}, {"post_id": 11571, "ts": "2026-06-18T21:09:22Z", "hours": 4.6431, "text": "Second Devlog for YSX Social Media Website What is YSX? A social media website. Changes: Added form to post (no built-in recorder) Added Backend to store posts information Added Feed page (Holds all posts) Added Likes feature Added Backend for Likes Log Out and Delete feature added (Incomplete) Mobile support built in Fixed text going under post instead of on top. Added reel snapping Added placeholder incase of no posts"}, {"post_id": 10973, "ts": "2026-06-18T00:07:27Z", "hours": 9.9475, "text": "First Devlog for YSX What is YSX? YSX is a social media website, like instagram, tiktok, x, etc. Why Make This? It’s fun. Added: Register Page Log In Page Sidebar Navigation Reel Creation Custom Logo Backend UI Redirects based on status (logged in/not logged in) Dark/Light Mode"}]...
|
Title: Social Media Website (YSX) by @AuraMonster Title: Social Media Website (YSX) by @AuraMonster | Stardance
Devlogs:
First Devlog for YSX What is YSX? YSX is a social media website, like instagram, tiktok, x, etc. Why Make This? It’s fun. Added: Register Page Log In Page Sidebar Navigation Reel Creation Custom Logo Backend UI Redirects based on status (logged in/not logged in) Dark/Light Mode
Second Devlog for YSX Social Media Website What is YSX? A social media website. Changes: Added form to post (no built-in recorder) Added Backend to store posts information Added Feed page (Holds all posts) Added Likes feature Added Backend for Likes Log Out and Delete feature added (Incomplete) Mobile support built in Fixed text going under post instead of on top. Added reel snapping Added placeholder incase of no posts
Third Devlog for YSX Social Media Website What is YSX? It is a social media website similar to websites like X, instagram, tik tok, etc. Changes: Added changelog section Chatting UI layout complete Chatting backend in progress Worked on UI Style Changes Made Chatting UI layout unique to YSX and no other social media website.
Fourth Devlog of YSX Social Media Website Changes: Layout positioning UI design Instead of Relying on built in auth, created a synchronized table for extra features. New Features: Added and Completed Create Chat/Conversation Completed Backend to create chat In Progress: Messaging screen Sidebar Trigger fixed position Planned Features (Subject to change): Profile image changeable Chatting completion Likes/Dislikes feature on posts Comment Feature Share Feature Account and setting pages More undecided…
Fifth Devlog of YSX Social Media Website Changes: None New Features: Typing messages now works Backend added for Messaging Both users get messages and are automatically added to a conversation if one users starts it. In Progress: Account page Settings Page Future Things (To-Do list): Add attachments to messaging Add delete button to Posting Make a posts/reels algorithm Add User status on messaging page More (Subject to change)
Sixth Devlog for YSX Social Media Website Changes: Chat Input styling Changed Messages styling Changed New Features: You can now attach small images/videos to chat Backend resolved for images/video attachments Mobile Support for chatting In Progress: Account Profile Picture changing being able to attach large files Account Banner Picture changing Account Page Settings Page Future Features (Subject to Change): Add comment, share, and like/dislike on posts Post editing Changelog editing upon release Admin Features Featured Posts Status for chatting Continually add mobile support for upcoming features
Seventh Devlog for YSX Social Media website Changes: Multiple bugs were fixed Loading Screens added for only a few pages New Features: Notifications now work! (This took me a long time and lots of frustration) Change description feature added In Progress: Banner change (frontend) Profile Picture change (frontend and backend) Settings Page Skeletons (loading pages) for other pages Future Plans (Subject to change): Being able to attach large files to chat (pushed off for later) Reels Algorithm Admin Features Post Editing Chat Editing Post likes, dislikes, messaging, share More
Eight Devlog for YSX Social Media Website Changes: Added a posts tag feature Heavy UI changes and Bug fixes New Features: Added Banner Change feature Added Profile picture change feature Added scoring system (AKA an algorithm that tracks what you watch) Account Page now complete! You can also now delete your account via the settings page In Progress: Chat Page down due to multiple errors (trying to fix) Algorithm bug fixes Future plans (Subject to change): New features to settings page Ability to attach large files to chat Admin features Posts’ like, dislike, comment, share (crucial for algorithm) More
Ninth Devlog for YSX Social Media Website Changes: UI Changes Chat Bug fixes New Features: Admin Features section now added! Frontend for Admin features Frontend Ban feature for admins In Progress: Chat UI revamp due to ShadCN (UI library) adding a message component Admin Features backend Ban backend Future Plans(subject to change): Being able to attach large files to chat Setting Page more features More loading pages Bug fixes More
Tenth Devlog for YSX Social Media Website Changes: Feed bug fixed and works again Liked button remains toggled even after refreshing the page Added a UI Sheet (from ShadCN) to comments button (Comments not finished) Switched from custom attachment style to using UI library’s attachment New Features: Ban Page (redirected when user is banned) In Progress: Comments Algorithm Chat Rework Feed Ban Expiry Being able to attach large files to chat Future Plans (Subject to Change): More features on Settings page Changelog upon release More (If you guys have any more ideas, I could use them!)
Eleventh and final Devlog for YSX Social Media Website :D Changes: Removed empty screen from home page Heavy UI Changes Added Search bar to create Conversation Share, Comment Added Dislike removed Scrapped some ideas (or will come next ship) Updated Changelog so that it fits release New Features: Home Screen got added You can Now comment and share Files now compress in Chat but takes longer for larger files background around your name if you are creator of the post and you commented on it. Project will be shipped out soon :) (Image is admin POV)
reship
Ships:
This is YSX! A social media website where you can do pretty much anything! This project took a lot of time because of all the complex code involved with it. Fortunately, UI libraries (Such as ShadCN and Radix UI) and frameworks (such as Next.JS), as well as AI and other stuff helped me overcome this. IMPORTANT NOTE FOR SHIPWRIGHTS: IF YOU WANT TO TEST ADMIN PLEASE DM ME ON SLACK (username: mdmutahhar24)....
|
1792993829.1901798
|
1793080229.1901798
|
|
36065
|
SpacecraftOS by @madzia | Stardance
|
madzia
|
3
|
81.0
|
1072
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-04T21:32:08Z", "hours": 49.0, "multiplier": 18.53, "payout": 914, "blessing": "neutral", "text": "I made a web Operating System with spacecraft theme! Creating this site was so fun and fulfilling, esp. when a lot of things turned out exactly as I wanted!! I started coding over a month ago, and I’m so happy that I managed to create something like this. I really enjoyed it, especially the css part. SpacecraftOS This OS provides basic app like timer, calendar, maps, gallery, but everything have implemented some spacecraft additions. For example, the map app won’t show you the route to the nearest grocery store, but it will show you where your fav spacecraft is right now. The calendar app will show you astronauts birthdays and the gallery app provides photos humans sent to space on voyager. All these apps you will find on the left and on the bottom there are apps, where you’ll learn about various spacecrafts, and in some of these apps, you can also rate some photos the spacecrafts took! Notes Please start from choosing the most suitable for you theme in the settings (top right corner) Try on laptop/computer for better experience Snake game is only playable with keyboard Remember to double click on apps to open and please leave a toughtful review. Hope you’ll enjoy it!!", "repo": "https://github.com/Maaadzia/SpacecraftOS", "demo": "https://maaadzia.github.io/SpacecraftOS/"}, {"ship_num": 2, "ts": "2026-08-08T18:29:17Z", "hours": 16.0, "multiplier": 9.79, "payout": 158, "blessing": "neutral", "text": "I made an Operating System with spacecraft theme! New features Artemis App Artemis II playlist (app) Settings and darkmode Design - few images on the windows borders Start animation with spacecraftOS baner Challenges Compared to my previous ship, this time all functions and styling went smoothly, but the things that took the most time were adjusting photos and writing, researching about Artemis Mission! I tought that making the darkmode switch would be really hard, but when I focused it was really easy and rewarding process! Proud of I really like the starting animation and the images on the borders. I started coding one month ago so doing something cool with the css all by yourself is so fulfilling! I don’t understand js that much yet, so I had also watched few tutorials. The webOS 1 tutorial was really hard for me, so now I’m really happy when the things I wanted to add to my website turns out well! So I’m also really proud of the images slider in the Artemis App, the spotify playlist embedded and the dark/light mode switcher in the settings! Even tho they were made with tutorials I still needed to adjust it so it fits my site, and I’m so happy that I understand it to the point that I could do this all just by myself Notes Don’t forget to check the README, remember to double click to open apps and just enjoy the vojage!!", "repo": "https://github.com/Maaadzia/SpacecraftOS", "demo": "https://maaadzia.github.io/SpacecraftOS/"}, {"ship_num": 3, "ts": "2026-07-31T11:31:13Z", "hours": 16.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made an operating system based around spacecrafts! My website provides few apps: two about telescopes where you can learn about them and rate few photos they took from 1 to 5 stars, and one with notes, where you can store your ideas if some spacecrafts inspire you! Besides apps, on the top bar you will find two guides on how to catch the ISS and starlink satellites. In the ISS window you can find short youtube video - it’s about Polish astronaut, Sławosz Uznański, eating pierogi (delicious polish dish) on the ISS! I really recommend watching this The apps were the biggest challange for me. That’s why I had spent so many hours on this project. Firts, I couldn’t even open the first app. It was hard to even make the selected function work. Then, I managed to make this one app working! But, it wasn’t the right solution. When I added new apps, they were opening the 1st app window, and not theirs. I spent a lot hours trying to fix it, I tried a lot of possible solutions and finally, I had asked ai for help. That’s the only ai usage in this project. Eventually, everything works! I’m so happy because I’ve almost gave up. I really like the outcome, and I look forward for the future changes! I came up with a lot of ideas and I realised them the exact way I wanted! My favourite parts are def the Sławosz eating pierogi video and the photo ranking which I find so fun to watch and rate. Hope you’ll enjoy this as much as I do!", "repo": "https://github.com/Maaadzia/SpacecraftOS", "demo": "https://maaadzia.github.io/SpacecraftOS/"}]...
|
[{"post_id": 61784, "ts": "202 [{"post_id": 61784, "ts": "2026-09-04T21:11:45Z", "hours": 0.2711, "text": "Scrollbar is working!! Devlog 24 - scrollbar bug Guys I think that this bug was (is) my personal fault, bc the scroll bar is visible in every single browser different than my current one lol I probably have some sort of extension that adds none !important or sth to my code’s head and it ruins everything, but it shall work on every other device, on every other browser. Tbh I also used ai to fix it but it didn’t really helped bc it was my internal problem. So happy that it’s working, just wanted to clarify and log these 16min!! If any problems with scrollbar occur, please use keyboard arrows to scroll through windows Again, thanks for reading and have a nice day!"}, {"post_id": 61753, "ts": "2026-09-04T20:12:54Z", "hours": 3.7797, "text": "happy and frustrated Devlog 23 - Dock animation, scrollbar and NGRSTApp Dock Animation I really like this animation!! It’s so smooth and cool and I’m so happy bc I learned new thing with the tutorial!! It came out exactly as I wanted NGRSTApp It’s finally finished!! I managed to add some things regardless it’s such a fresh mission. Hope yall like it! Scrollbar Yeah so here’s the frustrating part. I coded really pretty, unique and practical scrollbar in the css but I used webkit and it worked on microsoft but on chrome - not anymore! You can’t even see the scrollbar! I don’t have time anymore - I’m leaving in few hours, I commented it out and I hope I’ll fix it one day Additional changes Rewrited README Added some events to the calendar What’s next? I’m gonna ship now!! Wish me luck and thank you all for your support throughout the whole voyage!!"}, {"post_id": 61421, "ts": "2026-09-04T10:10:39Z", "hours": 1.5053, "text": "Which one should I choose? Devlog #22 - Timer So I just made a timer with tutorial, but I need your help!! Should I keep miliseconds (slide 2) or keep it simple just with hours/minutes/seconds?? I kinda think that h/m/s looks better but it also seems so boring and less “advanced” than h/m/s/ms!! Also this was such an easy tutorial, fortunately everything went smoothly!! Yall probably know bro code but if someone wants here’s the link What’s next? Dock animation NGRSTApp Thanks for reading and I’m waiting for your comments!"}, {"post_id": 61029, "ts": "2026-09-03T18:44:03Z", "hours": 1.9033, "text": "I’m back!! Devlog #21 - new colors Hi everyone! I’m finally back but from hospital… right after my trip I was diagnosed with severe anemia and had to stay in the hospital for four days. I’m feeling good but I’m a little worried bc I lost so much time and I’m leaving on next trip again in few days!! There’s not many things left in SpacecraftOS tho, so let’s summarise it What’s new? In the video below you can see that I adjusted the calendar colors for every theme. It was such a fun process! I like how it looks now. I also managed to fix the days align and now it works perfectly, always in 7 columns. Hope yall like it! What’s next? I’m going to work on dock animation!! I also need to finish NGRSTApp but I think I’m going to keep it simple bc I don’t have so much time and I want to ship by the time I leave Thanks for reading, take care and have a nice day!!"}, {"post_id": 53999, "ts": "2026-08-24T18:45:12Z", "hours": 5.9797, "text": "Reallyyyyyyy time consuming Calendar Devlog #20 - Calendar So I spent this whole day coding this calendar with youtube tutorial. This tutorial was only 17min but it took me 5h Then I needed to fix some typos bc I ofc made a lot and then many many styling!! It’s not the final result! I’m going on a trip tomorow, so I need to take a break from coding. To adjust the width and height, make it all fit to my site, it takes so long, and then I need to change the colors, bc I was just testing with the pinks. Change colors to all of my themes 😭 But it’s okay I got this Disappointing surprise You can see in the video on the second slide that there are 6 columns in the next month instead of 7! I’ve been so happy bc it was working in august, and then I changed months and it was a little disappointing surprise. I’m gonna fix it later! What’s next? When I’ll be back I’m going to work on this app! I didn’t expected it to be that hard Thanks for reading and see you in the next one!"}, {"post_id": 53260, "ts": "2026-08-23T18:20:43Z", "hours": 1.9378, "text": "More Animatiooons! Devlog #19 Animations on scroll Animations So recently I’ve been working on animations on scroll! Now my Apps about spacecrafts are more interactive and less boring. In the video below you can see all of the scroll animations I’d added till this moment. I feel so confident with css animations, they give me so much fun!! Icon The video is cropped so you can’t see the snake game icon but it finally is here! I added it in the second slide so you guys can see it! Let me know what yall think. I wanted to keep the one real-life, space themed addition (like moon in the music app) so the snake has galaxy eyes. Nancy Grace Roman Space Telescope PROBLEM As you can see I also added an icon for NGRST App but it’s an upcoming mission and I don’t really know what to do with it!! Someone requested it in the feedback, so I really want to implement it but idk, maybe I shall add a countdown? But it will be outdated soon. Many things can be outdated! Thanks for reading and have a nice day!"}, {"post_id": 52482, "ts": "2026-08-22T16:55:00Z", "hours": 0.6842, "text": "The most spacecraft app on spacecraft os? Devlog #18 - MapApp!!! ALL SPACECRAFTS IN ONE PLACE WHAT AN AMAZING FEATURE!! What’s new? MAAAP AAAPP While doing research on Voyager 1 and 2 I found this “Eyes On The Solar System” from NASA, and noticed that you can embeed it, and that’s what I’ve done! First and foremost, you can check here the position of any spacecraft you want! That’s why I called it Map App. Moreover, that’s a place with a lot of information, and whole spacecraft history! As you can notice, it didn’t take me so long (bc it’s just embeeding), so what I’ve also completed? Fixed some bugs Finished icon for snake game What’s next? NGRST app! (Can someone guess, what does this short stand for? Hint: HST and JWST are already in spacecraftOS!)"}, {"post_id": 52183, "ts": "2026-08-22T08:40:35Z", "hours": 3.7939, "text": "Perfecting Devlog #17 - snake game and organisation What’s new? Snake game As you can see, I’ve styled the snake game a little! I also added start/tutorial/guide window, I added it by creating new window and setting start button as the window close button hihi work smarter not harder. Ai usage I couldn’t figure it out how can I set imgs as the background, food and even for snake, so I asked ai. It’s just creating const with img and adding drawImage instead of fillStyle , and I’m so happy bc now I understand it and know how to implement imgs to js! WHERE’S THE ROCKET? It was too hard!! I really tried, but when I managed to set the rocket as the snake’s head: The rocket was too small It wasn’t rotating It looked so bad and if I wanted to continue with this idea I would need to use ai, so more ai than I would like, so I eventually there’s snake in the snake game. More organisation I created folders in the img folder for each app, bc the img folder was still a little messy. It was such a tedious process, but it’s much clearer now! What’s next? New REALLY COOL APP and snake app icon, which I’m going to edit today while watching F1 sprint"}, {"post_id": 51083, "ts": "2026-08-20T15:53:26Z", "hours": 2.6117, "text": "Random decision (but it was worth it) Devlog #16 - Radio buttons and styles What’s new? Radio buttons In my feedback someone suggested to add radio buttons instead of checkboxes bc then you can just choose one - and today I did it! I also styled it and added cool animation!! Each theme have different stars colors as well - you can check it in the video below. Highscore Somehow, I also added highscore to my snake game! I took a bit of information from tutorial 1 a bit from tutorial 2 and it’s working! Maybe not perfectly, but when you restart, new highscore will be visible, and it’s also in local storage so you can come back after a month and your highscore still will be there!! So, why random? It was a little unexpected bc I was working on the snake game (yeah it’s still not finished) and suddenly I gained a lot of motivation for the radio buttons. I knew I wanted to style them somehow, but I came up with the star design today, and I think it’s perfect!! What yall think about it?? What’s next? Hopefully, I’m going to finish the snake app!"}, {"post_id": 50531, "ts": "2026-08-19T18:36:40Z", "hours": 6.595, "text": "Such a challange! Devlog 15 - snake game Snake game? Yeah I’m surprised too. But I really wanted to see how it works and just code sth like this (with tutorial ofc). I wanted to make it a little later but I had time today and decided - why not? Okay but, 6 hours?!??!?!?!?!? Yeah 😭 in short, I started with tutorial 1, but it didn’t worked, so I deleted everything and switched to another tutorial, where I realised that I just haven’t connected my snake.js to html lolll but anyways, I even liked tutorial 2 more, I feel like it gave me more styling options, but I needed to quit it because to restart you needed to refresh the site. I tried to just implement some functions, change some things but I’m not that skilled to do this yet. I deleted everything again and came back to tutorial 1 which I eventually completed! That’s not the final results I really want to make the snake head a rocket thats collecting fuel, but there are some problems!! Obviously lol, so I have something like this const snakeColor = \"pink\"; and I tried to change pink to class, to var but it didn’t worked, and I really don’t know how can I style this snake further, so I can add the rocket and fuels and many other things. That’s why I liked tutorial 2 more! What’s next? I will try to style the snake and this whole window basically!! The video below is in 2x speed!"}, {"post_id": 49450, "ts": "2026-08-18T09:25:00Z", "hours": 1.2464, "text": "I code my function!! Devlog 14 - animation and design Function I’m sooooooooo happy because yesterday I’ve managed to create my own function!!! someone suggested to make other tab switching. I was looking for some tutorial, but couldn’t find anything so I asked ai what can I search in youtube to find it. For better or worse, the AI gave me a little guidance on how it works (so I’d understand it in the tutorial, NO code ), I didn’t even fully read this because when I noticed “animation” and “adding classes” I noticed, what I can do! Few days ago I mentioned the theme switch tutorial, that helped me with understanding js!! With this knowledge and the pattern I already had from webOS tutorial, I managed to create opening app window animation!! Additional apps I also added left bar for the additional apps (/apps that are not about spacecrafts). For now just the background, but when I will finish every app I will also add some better animations and just style it better Problem At the very end of the video, you can notice such a huge problem with opening windows and theirs z-index. They open randomly, once under particular app once above, trying to catch this video when it’s smooth and they all go on top was really hard!! Please let me know if you know how to fix it And I had also tried to make my windows resizeable but it unfortunally didn’t worked. I will get back to this later What’s next? To perfect it all and fix bugs! And then maybe some games? Thanks for reading and have a nice day!!!"}, {"post_id": 48987, "ts": "2026-08-17T16:00:19Z", "hours": 3.1114, "text": "Feedback and roverS Devlog 13 - Spirit and Opportunity App Feedback So, my project went through ratings: unfortunately, I only got 9.79 multiplier, but I also got an amazing and really valuable feedback!! People pointed out my messy repository, and indeed, it needed to be changed. I created new folders, and now it’s clear and organised! RoverS app? While researching, I noticed that Spirit also deserves to be mentioned! Because it’s the same mission, I decided to add Spirit to Opportunity app, and therefore it’s Rovers/Spirit&Opportunity app now! What’s next? I’m going to focus on improving my app and implementing the advices I received in feedback. I also have a lot of new ideas, so stay tuned!"}, {"post_id": 48045, "ts": "2026-08-16T10:23:51Z", "hours": 4.5292, "text": "Time-consuming animation and problemss Devlog 12 - Opportunity App and animation Problems!!! I messed up positions! 😭😭 I was adjusting this rover so it’s driving perfectly around the Mars for hourss and then I decided to check it with the scroll bar, and bc the rover had position: absolute it went down with the scroll bar idk how to describe it, like, he flew out of mars lol Solutions!!! I’ve watched quick guide on youtube about positions and finally understood everything, because before I was just kindaaa guessing lolll now, having the knowledge, I wrapped my animation into <div style=\"position: relative; border: pink [...]\"> , added position: absolute to my images and adjusted everything completely from scratch!! It took me so long but I think it was worth it bc it looks nice and is something different from the usual. One more change I added border photo to Voyager App. Adjusting also took me a while but the window is way more interesting now! What’s next? Finishing Opportunity App!! Thanks for reading and have a nice day!!"}, {"post_id": 46779, "ts": "2026-08-14T08:51:39Z", "hours": 2.9839, "text": "More colors!!! Devlog #11 - 3 new themes!! I made new themes!!!!!!! I’m so happy to introduce you to my 3 colorful themes: Moon Theme - “Earth set” photo from Artemis II mission, blue-colored Aurora Theme - Earth’s Aurora seen from the ISS, green-colored Sunset Theme - “Cotton Candy Skies”, Falcon 9 rocket, pink-colored No gatekeeping, I’ve been searching for tutorial like this for so long so here’s the link for the tutorial . Hope it will be helpful! I need a feedback!! I’m not sure about the colors tho, please let me know know if everything is readable and if you perhaps would change anything Thanks for reading, hope you like it!"}, {"post_id": 46261, "ts": "2026-08-13T11:38:08Z", "hours": 4.6536, "text": "new app and new ideas! Devlog 10 - Full Voyager App Full Voyager App I finished coding new app!! It’s about Voyager mission, so basically Voyager 1 and Voyager 2. Research took me so long again!! But I’m happy with the results New idea So since I started this project I’ve been thinking about how do I arrange the blank space next to the rating images. Today, I added a brief text that’s describing the photo. Just a little, but now you’ll know what the images shows! You can see it on the 1st screenshoot below. Both screenshots are from the new app What’s next? I would love to make new function in the settings so you can change the background photo!! Wish me luck Thanks for reading and have a nice day!!"}, {"post_id": 45144, "ts": "2026-08-11T13:25:16Z", "hours": 3.765, "text": "New app!! Devlog #9 Voyager Photos App Guys I finished rating other projects and I have to admit that my devlogs are way too long So today let’s keep it brief: Voyager Photos App!!! I’m gonna create another app just about voyager, but this is some sort of gallery of (only) 11 photos from these spacecrafts. I made cool infinite images slider with tutorial - it went really smoothly, and then I’ve been trying to make an information window appear when you place your cursor on the “?”. I don’t feel so comfortable in js yet but I wanted to do it all by myself so I went with css, and I really like the final results! You can see it in the video below What’s next? Full Voyager App, I hope! See you in the next one, thanks for reading!!"}, {"post_id": 43432, "ts": "2026-08-08T17:48:20Z", "hours": 0.2547, "text": "15 min can’t be lost! Devlog 8 - fixed all typos and changed the start text So, what I changed in these 15 min? I changed all the typos in artemis app FORTUNATELY I checked the start window, and changed the description because it was really outdated! And therefore, I needed to change the image in my readme. I also adjusted it to width: 100%; height: auto because when I opened readme on my phone it was really stretched! Below I leave a screenshoot of the app I’ve been adjusting, with the artemis II crew because they’ve been my motivation through this whole process! I can’t wait to work more on SpacecraftOS!! Wish me luck on shipping ^^"}, {"post_id": 43381, "ts": "2026-08-08T16:06:31Z", "hours": 1.5467, "text": "One more devlog! Devlog 7 - title and start animation I wanted to ship already but lo and behold, I’ve added some changes! So, what’s new? I finally designed the header of my site! now it says SpacecraftOS and displays a rocket icon! Updated Artemis App - I’ve added some information about Artemis IV and V WELCOMING ANIMATIONNN!!!!!! - I’m very happy because I’ve managed to add a start animation, like welcoming screen or sth like this, idk how is it called, but now, when you enter my page, you can see an animation with my baner! It’s in the video below What’s next? I’ve also finished writing the README so now I will just read everything top to bottom again and SHIP!!!"}, {"post_id": 42821, "ts": "2026-08-07T18:52:04Z", "hours": 4.8486, "text": "Darkmode!! Devlog 6 - dark mode and more photos on the borders What’s new? Darkmode and settings I’m so happpyyyy I’ve managed today to create new very cool app - settings - where you can switch between lightmode and darkmode! At the beginning I tought that it would be a nightmaree but turns out, when I really focused, it was a smooth process and I really enjoyed it! But one thing is not working.. not so important but when I’m adding this app to the rising on top function everything crashes and I can’t open any app. I’ll try to fix it later. There ofcourse will be more functions soon in this app so stay tuned! More images on borders I added more photos on the borders! ISS NASA astronaut working on Hubble The Golden Record spinning on the Artemis II playlist app (I think it’s a really cool idea) Adjusting the astronaut was really hard, and the background did not removed well but I’ve managed to add some blur and eventually it looks okayy I’ve also changed the position of Artemis astronaut - I wanted to put it on the left but unfortunatelly, it cannot be here because then it covers the scroll bar. Adjusting the rotation helped a little and it looks way better! What’s next? I think I’m gonna ship soon! I’ve already writed the README and I just need to check everything. But don’t worry, it’s not the end of SpacecraftOS! I already have a lot of ideas"}, {"post_id": 42063, "ts": "2026-08-06T16:54:14Z", "hours": 1.3569, "text": "My website is all around Artemis now! Devlog #5 - two new apps fully finished! I finished the image slider I’ve been writing about in the previous devlog and added new app! I tought it will take me so much longer, but here I am! But let’s start from the outset: Finished Artemis Mission App I’ve finally finished it! In my previous devlog I said that I found another tutorial on how to make image slider, and it was a bullseye!! After I adjusted it a little so it fits my images it’s working perfectly!! And looking so so good! I’m so happy!! New app - Artemis II Playlist So, I really wanted to implement some music into my website. But because it’s a SPACECRAFT operating system I knew it cannot be just basic music app. While working on the Artemis App I came up with this amazing idea - I’m pretty sure that you heard about the wake up songs from Artemis II Mission. I decided to do an app with that playlist! Since it’s just embeeding the code from spotify it wasn’t such a big problem. I think that the hardest thing here was to make the app icon, which is the moon listening to music on headphones!! I really like this idea, let me know what you think about it What’s next? I want to add some images on the borders like in the Artemis App. And then another app!! Thanks for reading and have a nice day!"}, {"post_id": 41862, "ts": "2026-08-06T10:36:58Z", "hours": 8.1608, "text": "Such a messs!! Devlog #4 - Artemis App! Your opinion Before we begin, I’d like to know your opinion about the images layout. The 3 first screenshoots below shows different layouts. Screenshoot 1 : This is the first version I coded. But it covers the close button and most importantly - the scroll bar which is so unpractical Screenshoot 2 : this is how I had imagined it when this idea came to my mind. It also covers the close button and the scroll Screenshoot 3 : last version I’ve coded. I did not planned this layout but I think it looks great and is the most practical! Unfortunately the 3rd option covers the move button but by adding some z-index everything works well, and looks better than when adding z-index to the scroll bar bc the rocket/astronaut is either covered by the scroll or too far away. Please let me know what you think! Challange 1 Adjusting these images was such a challange. But I wrote it all down from memory! I added the position: fixed so it can exceed the window and adjusted the position several times! The biggest problem, as I said, was that they were covering the scroll bar and close button and then the move button as well. But I found the solution! I added the appropriate z-index to each of the elements and it worked!! (I’m really surprised tbh it was so easy and didn’t took me that long to figure out! I’m getting good at coding ) So finally, what’s new? I added the Artemis Mission App !! It’s not an app just about the artemis II. It’s an app where you can learn about the whole mission, the SLS rocket, the Orion capsule and get to know some fun-facts! Doing the research on all of these thing took me sooo much time! And then writing it down, deciding what is worth the attention and so on… it was kinda exhausting! But I’m so happy with the (not yet) final results! Yeah, not yet meaning… Challange 2 On the last screenshoot you can see the biggest mess on this app! Few photos totally without rhyme or reason! I was coding with image slider tutorial. Everything was going smoothly, till the creator of the tutorial said that now we shall see our photo aaaand yup I did not see anything. I was checking several times if I writed down everything the right way, I was looking for solution and eventually I created new repository and copied the whole code which he pasted in the comments (just to clarify - in this project I do NOT copied any code, I writed everything by myself). In this repository everything worked. When I saw the final results in the repository I had also noticed that it’s not really what I wanted to have in the Artemis App. Bc the code did not worked (probably because it already was in several divs and not like raw or sth) and bc it didn’t align with my vision I decided to just delete this whole code. I’ve already found another tutorial, with better design so I will keep you updated on how it’ll turn out! What’s next? Fixing the mess and finishing the app New app (it’s going to be music app linked to the Artemis II mission!) Thanks for reading and stay tuned!!"}, {"post_id": 37768, "ts": "2026-07-30T18:02:44Z", "hours": 7.5406, "text": "AYYYY FINAL DEVLOG! Devlog #3 - more apps and final changes Guys I can’t believe I did this!! (It’s such an achievement for me okay ) Let’s break all the changes I’ve made to some points: ( if you don’t want to read it all please skip to the last point because it’s about Poland in space and I love Poland and Space ) APPS! AND MANY MORE PROBLEMS. Let’s start from the problems… If you tought that in the second devlog I’ve finally managed to make working apps - you are so wrong. Barely 2 hours later I realised, that the (window) part was not a problem. Turned out, that when I changed this to the id of my app window, next apps opened the 1st app window, and not theirs window. I’ve been searching for solutions for HOURSS! Eventually I had asked ai for help. I had described my problem really pricesely. It found the problem! In this function function handleIconTap(element) I was supposed to write (element, window) … Fortunately, now it fully works!! I’m so happy because this was sooo frustrating. New apps! So, I’ve made two new apps! One similar to James Webb Space Telescope App, and one for notes and ideas. Let me introduce you toooo: Hubble Space Telescope App! - As I said, this one is similar to JWSTApp but it’s around Hubble! You can rate photos, learn some facts about it and just admire another amazing spaceship. NASCApp also known as Spacecraft Ideas. So from where is the abbreviation “NASCApp”??? Well, previously it was named “Notes About Spacecrafts”, but I decided that it’s so boring. Spacecraft Ideas is not really mind blowing name but it’s way better. I also had few problems with this app but after longer reflections, I decided to keep it simple. You can see these apps on screenshoots below. Starlink Catch Guide and Minor Changes I finished writing about starlink satellites in the Starlink Catch Guide window and added some minor changes to every window on my webOS after reading them all again. It was such a long process, but I like how it all looks together now. POLAND IN SPAAAAAACE AND PIEROGI! I added youtube video to the ISS Catch Guide window about Polish astronaut - Sławosz Uznański, eating delicious polish pierogi, on the ISS! I think that this is the most important part of my webOS. POLSKA GUROM!! (You can watch Sławosz eating pierogi on the ISS here ) What’s next? I’m going to read it all again, write README, complete project info and finally, SHIP!! Don’t worry it’s not the end of the journey because I started to like coding so much and I want to continue with webOS 2! Thank’s for being with me and have a nice day!"}, {"post_id": 35710, "ts": "2026-07-27T09:53:57Z", "hours": 2.9081, "text": "I did itttt!! Devlog #2 - Apps Hi!!! I’m so glad to announce that my apps are finally working! There’re still few problems though. But let’s start from the outset: James Webb Space Telescope App This app provides few basic information and interesting facts about JWST. I had also added some photos which you can rate from 1 to 5 stars! You can see the app in the screenshots below. Problems As you can see, there’s so much space on the right from the images you can rate. I’m considering a lot of options, one of them is to just make two/three photos in one row, what do you think? Would this look better? Double click app opening - the if and else statements made my app open at the second click, and not at the first when it’s selected. It selects with the first click and then, with second click, deselects and opens. Idk if it’s supposed to work this way. I think that now I’m going to leave it because at this point I’m just celebrating it works and I want to focus on other things. Problems fixed 🥳🥳🥳 Yall don’t even know how happy I am because of these apps working!! It indeed was much easier than I tought, guess what stupid mistake I had made this time… in the function I did not changed (window) to my actual window. Lol. It was not the only problem on the way but it was definitely the main mistake. I’m so happy because now I can get creative and continue working on the apps design!! Upcoming changes Next I’m going to add few more apps. Can’t wait! Thanks for reading this devlog. Hope you’ll have and amazing day!!"}, {"post_id": 33605, "ts": "2026-07-23T17:38:32Z", "hours": 5.8403, "text": "I dont know what I’m doing but I hope it will be worth it!! devlog #1 - SpacecraftOS Hi everyone! I detached the WebOS mission from ISS HUNT and created this project - Spacecraft OS. I noticed that it’s not really the way I want ISS hunt to look like, to be like. To be honest - this tutorial is SOOOOO hard to me! The apps get me everytime! And besides it I made a lot of minor mistakes. For example, once I could move the start window alone but the guide window was moving only with the start one. And the blur wasn’t working, I was so frustrated and reallyyy confident that there are NOT any stupid mistakes like wrong id. Until I realised that the top bar only blurs the start window… I haven’t closed the div. Yeah. That is a stupid mistake. Even tho it’s hard to me I’m not giving up! Others have done it so can I! For now, I created the top bar and completed the start window and the ISS catch guide. Currently I’m working on starlink catch guide and then I’m gonna work more on these wretched apps 😭 Wish me luck!"}]...
|
Title: SpacecraftOS by @madzia | Stardance
Devlog Title: SpacecraftOS by @madzia | Stardance
Devlogs:
I dont know what I’m doing but I hope it will be worth it!! devlog #1 - SpacecraftOS Hi everyone! I detached the WebOS mission from ISS HUNT and created this project - Spacecraft OS. I noticed that it’s not really the way I want ISS hunt to look like, to be like. To be honest - this tutorial is SOOOOO hard to me! The apps get me everytime! And besides it I made a lot of minor mistakes. For example, once I could move the start window alone but the guide window was moving only with the start one. And the blur wasn’t working, I was so frustrated and reallyyy confident that there are NOT any stupid mistakes like wrong id. Until I realised that the top bar only blurs the start window… I haven’t closed the div. Yeah. That is a stupid mistake. Even tho it’s hard to me I’m not giving up! Others have done it so can I! For now, I created the top bar and completed the start window and the ISS catch guide. Currently I’m working on starlink catch guide and then I’m gonna work more on these wretched apps 😭 Wish me luck!
I did itttt!! Devlog #2 - Apps Hi!!! I’m so glad to announce that my apps are finally working! There’re still few problems though. But let’s start from the outset: James Webb Space Telescope App This app provides few basic information and interesting facts about JWST. I had also added some photos which you can rate from 1 to 5 stars! You can see the app in the screenshots below. Problems As you can see, there’s so much space on the right from the images you can rate. I’m considering a lot of options, one of them is to just make two/three photos in one row, what do you think? Would this look better? Double click app opening - the if and else statements made my app open at the second click, and not at the first when it’s selected. It selects with the first click and then, with second click, deselects and opens. Idk if it’s supposed to work this way. I think that now I’m going to leave it because at this point I’m just celebrating it works and I want to focus on other things. Problems fixed 🥳🥳🥳 Yall don’t even know how happy I am because of these apps working!! It indeed was much easier than I tought, guess what stupid mistake I had made this time… in the function I did not changed (window) to my actual window. Lol. It was not the only problem on the way but it was definitely the main mistake. I’m so happy because now I can get creative and continue working on the apps design!! Upcoming changes Next I’m going to add few more apps. Can’t wait! Thanks for reading this devlog. Hope you’ll have and amazing day!!
AYYYY FINAL DEVLOG! Devlog #3 - more apps and final changes Guys I can’t believe I did this!! (It’s such an achievement for me okay ) Let’s break all the changes I’ve made to some points: ( if you don’t want to read it all please skip to the last point because it’s about Poland in space and I love Poland and Space ) APPS! AND MANY MORE PROBLEMS. Let’s start from the problems… If you tought that in the second devlog I’ve finally managed to make working apps - you are so wrong. Barely 2 hours later I realised, that the (window) part was not a problem. Turned out, that when I changed this to the id of my app window, next apps opened the 1st app window, and not theirs window. I’ve been searching for solutions for HOURSS! Eventually I had asked ai for help. I had described my problem really pricesely. It found the problem! In this function function handleIconTap(element) I was supposed to write (element, window) … Fortunately, now it fully works!! I’m so happy because this was sooo frustrating. New apps! So, I’ve made two new apps! One similar to James Webb Space Telescope App, and one for notes and ideas. Let me introduce you toooo: Hubble Space Telescope App! - As I said, this one is similar to JWSTApp but it’s around Hubble! You can rate photos, learn some facts about it and just admire another amazing spaceship. NASCApp also known as Spacecraft Ideas. So from where is the abbreviation “NASCApp”??? Well, previously it was named “Notes About Spacecrafts”, but I decided that it’s so boring. Spacecraft Ideas is not really mind blowing name but it’s way better. I also had few problems with this app but after longer reflections, I decided to keep it simple. You can see these apps on screenshoots below. Starlink Catch Guide and Minor Changes I finished writing about starlink satellites in the Starlink Catch Guide window and added some minor changes to every window on my webOS after reading them all again. It was such a long process, but I like how it all looks together now. POLAND IN SPAAAAAACE AND PIEROGI! I added youtube video to the ISS Catch Guide window about Polish astronaut - Sławosz Uznański, eating delicious polish pierogi, on the ISS! I think that this is the most important part of my webOS. POLSKA GUROM!! (You can watch Sławosz eating pierogi on the ISS here ) What’s next? I’m going to read it all again, write README, complete project info and finally, SHIP!! Don’t worry it’s not the end of the journey because I started to like coding so much and I want to continue with webOS 2! Thank’s for being with me and have a nice day!
Such a messs!! Devlog #4 - Artemis App! Your opinion Before we begin, I’d like to know your opinion about the images layout. The 3 first screenshoots below shows different layouts. Screenshoot 1 : This is the first version I coded. But it covers the close button and most importantly - the scroll bar which is so unpractical Screenshoot 2 : this is how I had imagined it when this idea came to my mind. It also covers the close button and the scroll Screenshoot 3 : last version I’ve coded. I did not planned this layout but I think it looks great and is the most practical! Unfortunately the 3rd option covers the move button but by adding some z-index everything works well, and looks better than when adding z-index to the scroll bar bc the rocket/astronaut is either covered by the scroll or too far away. Please let me know what you think! Challange 1 Adjusting these images was such a challange. But I wrote it all down from memory! I added the position: fixed so it can exceed the window and adjusted the position several times! The biggest problem, as I said, was that they were covering the scroll bar and close button and then the move button as well. But I found the solution! I added the appropriate z-index to each of the elements and it worked!! (I’m really surprised tbh it was so easy and didn’t took me that long to figure out! I’m getting good at coding ) So finally, what’s new? I added the Artemis Mission App !! It’s not an app just about the artemis II. It’s an app where you can learn about the whole mission, the SLS rocket, the Orion capsule and get to know some fun-facts! Doing the research on all of these thing took me sooo much time! And then writing it down, deciding what is worth the attention and so on… it was kinda exhausting! But I’m so happy with the (not yet) final results! Yeah, not yet meaning… Challange 2 On the last screenshoot you can see the biggest mess on this app! Few photos totally without rhyme or reason! I was coding with image slider tutorial. Everything was going smoothly, till the creator of the tutorial said that now we shall see our photo aaaand yup I did not see anything. I was checking several times if I writed down everything the right way, I was looking for solution and eventually I created new repository and copied the whole code which he pasted in the comments (just to clarify - in this project I do NOT copied any code, I writed everything by myself). In this repository everything worked. When I saw the final results in the repository I had also noticed that it’s not really what I wanted to have in the Artemis App. Bc the code did not worked (probably because it already was in several divs and not like raw or sth) and bc it didn’t align with my vision I decided to just delete this whole code. I’ve already found another tutorial, with better design so I will keep you updated on how it’ll turn out! What’s next? Fixing the mess and finishing the app New app (it’s going to be music app linked to the Artemis II mission!) Thanks for reading and stay tuned!!
My website is all around Artemis now! Devlog #5 - two new apps fully finished! I finished the image slider I’ve been writing about in the previous devlog and added new app! I tought it will take me so much longer, but here I am! But let’s start from the outset: Finished Artemis Mission App I’ve finally finished it! In my previous devlog I said that I found another tutorial on how to make image slider, and it was a bullseye!! After I adjusted it a little so it fits my images it’s working perfectly!! And looking so so good! I’m so happy!! New app - Artemis II Playlist So, I really wanted to implement some music into my website. But because it’s a SPACECRAFT operating system I knew it cannot be just basic music app. While working on the Artemis App I came up with this amazing idea - I’m pretty sure that you heard about the wake up songs from Artemis II Mission. I decided to do an app with that playlist! Since it’s just embeeding the code from spotify it wasn’t such a big problem. I think that the hardest thing here was to make the app icon, which is the moon listening to music on headphones!! I really like this idea, let me know what you think about it What’s next? I want to add some images on the borders like in the Artemis App. And then another app!! Thanks for reading and have a nice day!
Darkmode!! Devlog 6 - dark mode and more photos on the borders What’s new? Darkmode and settings I’m so happpyyyy I’ve managed today to create new very cool app - settings - where you can switch between lightmode and darkmode! At the beginning I tought that it would be a nightmaree but turns out, when I really focused, it was a smooth process and I really enjoyed it! But one thing is not working.. not so important but when I’m adding this app to the rising on top function everything crashes and I can’t open any app. I’ll try to fix it later. There ofcourse will be more functions soon in this app so stay tuned! More images on borders I added more photos on the borders! ISS NASA astronaut working on Hubble The Golden Record spinning on the Artemis II playlist app (I think it’s a really cool idea) Adjusting the astronaut was really hard, and the background did not removed well but I’ve managed to add some blur and eventually it looks okayy I’ve also changed the position of Artemis astronaut - I wanted to put it on the left but unfortunatelly, it cannot be here because then it covers the scroll bar. Adjusting the rotation helped a little and it looks way better! What’s next? I think I’m gonna ship soon! I’ve already writed the README and I just need to check everything. But don’t worry, it’s not the end of SpacecraftOS! I already have a lot of ideas
One more devlog! Devlog 7 - title and start animation I wanted to ship already but lo and behold, I’ve added some changes! So, what’s new? I finally designed the header of my site! now it says SpacecraftOS and displays a rocket icon! Updated Artemis App - I’ve added some information about Artemis IV and V WELCOMING ANIMATIONNN!!!!!! - I’m very happy because I’ve managed to add a start animation, like welcoming screen or sth like this, idk how is it called, but now, when you enter my page, you can see an animation with my baner! It’s in the video below What’s next? I’ve also finished writing the README so now I will just read everything top to bottom again and SHIP!!!
15 min can’t be lost! Devlog 8 - fixed all typos and changed the start text So, what I changed in these 15 min? I changed all the typos in artemis app FORTUNATELY I checked the start window, and changed the description because it was really outdated! And therefore, I needed to change the image in my readme. I also adjusted it to width: 100%; height: auto because when I opened readme on my phone it was really stretched! Below I leave a screenshoot of the app I’ve been adjusting, with the artemis II crew because they’ve been my motivation through this whole process! I can’t wait to work more on SpacecraftOS!! Wish me luck on shipping ^^
New app!! Devlog #9 Voyager Photos App Guys I finished rating other projects and I have to admit that my devlogs are way too long So today let’s keep it brief: Voyager Photos App!!! I’m gonna create another app just about voyager, but this is some sort of gallery of (only) 11 photos from these spacecrafts. I made cool infinite images slider with tutorial - it went really smoothly, and then I’ve been trying to make an information window appear when you place your cursor on the “?”. I don’t feel so comfortable in js yet but I wanted to do it all by myself so I went with css, and I really like the final results! You can see it in the video below What’s next? Full Voyager App, I hope! See you in the next one, thanks for reading!!
new app and new ideas! Devlog 10 - Full Voyager App Full Voyager App I finished coding new app!! It’s about Voyager mission, so basically Voyager 1 and Voyager 2. Research took me so long again!! But I’m happy with the results New idea So since I started this project I’ve been thinking about how do I arrange the blank space next to the rating images. Today, I added a brief text that’s describing the photo. Just a little, but now you’ll know what the images shows! You can see it on the 1st screenshoot below. Both screenshots are from the new app What’s next? I would love to make new function in the settings so you can change the background photo!! Wish me luck Thanks for reading and have a nice day!!
More colors!!! Devlog #11 - 3 new themes!! I made new themes!!!!!!! I’m so happy to introduce you to my 3 colorful themes: Moon Theme - “Earth set” photo from Artemis II mission, blue-colored Aurora Theme - Earth’s Aurora seen from the ISS, green-colored Sunset Theme - “Cotton Candy Skies”, Falcon 9 rocket, pink-colored No gatekeeping, I’ve been searching for tutorial like this for so long so here’s the link for the tutorial . Hope it will be helpful! I need a feedback!! I’m not sure about the colors tho, please let me know know if everything is readable and if you perhaps would change anything Thanks for reading, hope you like it!
Time-consuming animation and problemss Devlog 12 - Opportunity App and animation Problems!!! I messed up positions! 😭😭 I was adjusting this rover so it’s driving perfectly around the Mars for hourss and then I decided to check it with the scroll bar, and bc the rover had position: absolute it went down with the scroll bar idk how to describe it, like, he flew out of mars lol Solutions!!! I’ve watched quick guide on youtube about positions and finally understood everything, because before I was just kindaaa guessing lolll now, having the knowledge, I wrapped my animation into <div style="position: relative; border: pink [...]"> , added position: absolute to my images and adjusted everything completely from scratch!! It took me so long but I think it was worth it bc it looks nice and is something different from the usual. One more change I added border photo to Voyager App. Adjusting also took me a while but the window is way more interesting now! What’s next? Finishing Opportunity App!! Thanks for reading and have a nice day!!
Feedback and roverS Devlog 13 - Spirit and Opportunity App Feedback So, my project went through ratings: unfortunately, I only got 9.79 multiplier, but I also got an amazing and really valuable feedback!! People pointed out my messy repository, and indeed, it needed to be changed. I created new folders, and now it’s clear and organised! RoverS app? While researching, I noticed that Spirit also deserves to be mentioned! Because it’s the same mission, I decided to add Spirit to Opportunity app, and therefore it’s Rovers/Spirit&Opportunity app now! What’s next? I’m going to focus on improving my app and implementing the advices I received in feedback. I also have a lot of new ideas, so stay tuned!
I code my function!! Devlog 14 - animation and design Function I’m sooooooooo happy because yesterday I’ve managed to create my own function!!! someone suggested to make other tab switching. I was looking for some tutorial, but couldn’t find anything so I asked ai what can I search in youtube to find it. For better or worse, the AI gave me a little guidance on how it works (so I’d understand it in the tutorial, NO code ), I didn’t even fully read this because when I noticed “animation” and “adding classes” I noticed, what I can do! Few days ago I mentioned the theme switch tutorial, that helped me with understanding js!! With this knowledge and the pattern I already had from webOS tutorial, I managed to create opening app window animation!! Additional apps I also added left bar for the additional apps (/apps that are not about spacecrafts). For now just the background, but when I will finish every app I will also add some better animations and just style it better Problem At the very end of the video, you can notice such a huge problem with opening windows and theirs z-index. They open randomly, once under particular app once above, trying to catch this video when it’s smooth and they all go on top was really hard!! Please let me know if you know how to fix it And I had also tried to make my windows resizeable but it unfortunally didn’t worked. I will get back to this later What’s next? To perfect it all and fix bugs! And then maybe some games? Thanks for reading and have a nice day!!!
Such a challange! Devlog 15 - snake game Snake game? Yeah I’m surprised too. But I really wanted to see how it works and just code sth like this (with tutorial ofc). I wanted to make it a little later but I had time today and decided - why not? Okay but, 6 hours?!??!?!?!?!? Yeah 😭 in short, I started with tutorial 1, but it didn’t worked, so I deleted everything and switched to another tutorial, where I realised that I just haven’t connected my snake.js to html lolll but anyways, I even liked tutorial 2 more, I feel like it gave me more styling options, but I needed to quit it because to restart you needed to refresh the site. I tried to just implement some functions, change some things but I’m not that skilled to do this yet. I deleted everything again and came back to tutorial 1 which I eventually completed! That’s not the final results I really want to make the snake head a rocket thats collecting fuel, but there are some problems!! Obviously lol, so I have something like this const snakeColor = "pink"; and I tried to change pink to class, to var but it didn’t worked, and I really don’t know how can I style this snake further, so I can add the rocket and fuels and many other things. That’s why I liked tutorial 2 more! What’s next? I will try to style the snake and this whole window basically!! The video below is in 2x speed!
Random decision (but it was worth it) Devlog #16 - Radio buttons and styles What’s new? Radio buttons In my feedback someone suggested to add radio buttons instead of checkboxes bc then you can just choose one - and today I did it! I also styled it and added cool animation!! Each theme have different stars colors as well - you can check it in the video below. Highscore Somehow, I also added highscore to my snake game! I took a bit of information from tutorial 1 a bit from tutorial 2 and it’s working! Maybe not perfectly, but when you restart, new highscore will be visible, and it’s also in local storage so you can come back after a month and your highscore still will be there!! So, why random? It was a little unexpected bc I was working on the snake game (yeah it’s still not finished) and suddenly I gained a lot of motivation for the radio buttons. I knew I wanted to style them somehow, but I came up with the star design today, and I think it’s perfect!! What yall think about it?? What’s next? Hopefully, I’m going to finish the snake app!
Perfecting Devlog #17 - snake game and organisation What’s new? Snake game As you can see, I’ve styled the snake game a little! I also added start/tutorial/guide window, I added it by creating new window and setting start button as the window close button hihi work smarter not harder. Ai usage I couldn’t figure it out how can I set imgs as the background, food and even for snake, so I asked ai. It’s just creating const with img and adding drawImage instead of fillStyle , and I’m so happy bc now I understand it and know how to implement imgs to js! WHERE’S THE ROCKET? It was too hard!! I really tried, but when I managed to set the rocket as the snake’s head: The rocket was too small It wasn’t rotating It looked so bad and if I wanted to continue with this idea I would need to use ai, so more ai than I would like, so I eventually there’s snake in the snake game. More organisation I created folders in the img folder for each app, bc the img folder was still a little messy. It was such a tedious process, but it’s much clearer now! What’s next? New REALLY COOL APP and snake app icon, which I’m going to edit today while watching F1 sprint
The most spacecraft app on spacecraft os? Devlog #18 - MapApp!!! ALL SPACECRAFTS IN ONE PLACE WHAT AN AMAZING FEATURE!! What’s new? MAAAP AAAPP While doing research on Voyager 1 and 2 I found this “Eyes On The Solar System” from NASA, and noticed that you can embeed it, and that’s what I’ve done! First and foremost, you can check here the position of any spacecraft you want! That’s why I called it Map App. Moreover, that’s a place with a lot of information, and whole spacecraft history! As you can notice, it didn’t take me so long (bc it’s just embeeding), so what I’ve also completed? Fixed some bugs Finished icon for snake game What’s next? NGRST app! (Can someone guess, what does this short stand for? Hint: HST and JWST are already in spacecraftOS!)
More Animatiooons! Devlog #19 Animations on scroll Animations So recently I’ve been working on animations on scroll! Now my Apps about spacecrafts are more interactive and less boring. In the video below you can see all of the scroll animations I’d added till this moment. I feel so confident with css animations, they give me so much fun!! Icon The video is cropped so you can’t see the snake game icon but it finally is here! I added it in the second slide so you guys can see it! Let me know what yall think. I wanted to keep the one real-life, space themed addition (like moon in the music app) so the snake has galaxy eyes. Nancy Grace Roman Space Telescope PROBLEM As you can see I also added an icon for NGRST App but it’s an upcoming mission and I don’t really know what to do with it!! Someone requested it in the feedback, so I really want to implement it but idk, maybe I shall add a countdown? But it will be outdated soon. Many things can be outdated! Thanks for reading and have a nice day!
Reallyyyyyyy time consuming Calendar Devlog #20 - Calendar So I spent this whole day coding this calendar with youtube tutorial. This tutorial was only 17min but it took me 5h Then I needed to fix some typos bc I ofc made a lot and then many many styling!! It’s not the final result! I’m going on a trip tomorow, so I need to take a break from coding. To adjust the width and height, make it all fit to my site, it takes so long, and then I need to change the colors, bc I was just testing with the pinks. Change colors to all of my themes 😭 But it’s okay I got this Disappointing surprise You can see in the video on the second slide that there are 6 columns in the next month instead of 7! I’ve been so happy bc it was working in august, and then I changed months and it was a little disappointing surprise. I’m gonna fix it later! What’s next? When I’ll be back I’m going to work on this app! I didn’t expected it to be that hard Thanks for reading and see you in the next one!
I’m back!! Devlog #21 - new colors Hi everyone! I’m finally back but from hospital… right after my trip I was diagnosed with severe anemia and had to stay in the hospital for four days. I’m feeling good but I’m a little worried bc I lost so much time and I’m leaving on next trip again in few days!! There’s not many things left in SpacecraftOS tho, so let’s summarise it What’s new? In the video below you can see that I adjusted the calendar colors for every theme. It was such a fun process! I like how it looks now. I also managed to fix the days align and now it works perfectly, always in 7 columns. Hope yall like it! What’s next? I’m going to work on dock animation!! I also need to finish NGRSTApp but I think I’m going to keep it simple bc I don’t have so much time and I want to ship by the time I leave Thanks for reading, take care and have a nice day!!
Which one should I choose? Devlog #22 - Timer So I just made a timer with tutorial, but I need your help!! Should I keep miliseconds (slide 2) or keep it simple just with hours/minutes/seconds?? I kinda think that h/m/s looks better but it also seems so boring and less “advanced” than h/m/s/ms!! Also this was such an easy tutorial, fortunately everything went smoothly!! Yall probably know bro code but if someone wants here’s the link What’s next? Dock animation NGRSTApp Thanks for reading and I’m waiting for your comments!
happy and frustrated Devlog 23 - Dock animation, scrollbar and NGRSTApp Dock Animation I really like this animation!! It’s so smooth and cool and I’m so happy bc I learned new thing with the tutorial!! It came out exactly as I wanted NGRSTApp It’s finally finished!! I managed to add some things regardless it’s such a fresh mission. Hope yall like it! Scrollbar Yeah so here’s the frustrating part. I coded really pretty, unique and practical scrollbar in the css but I used webkit and it worked on microsoft but on chrome - not anymore! You can’t even see the scrollbar! I don’t have time anymore - I’m leaving in few hours, I commented it out and I hope I’ll fix it one day Additional changes Rewrited README Added some events to the calendar What’s next? I’m gonna ship now!! Wish me luck and thank you all for your support throughout the whole voyage!!
Scrollbar is working!! Devlog 24 - scrollbar bug Guys I think that this bug was (is) my personal fault, bc the scroll bar is visible in every single browser different than my current one lol I probably have some sort of extension that adds none !important or sth to my code’s head and it ruins everything, but it shall work on every other device, on every other browser. Tbh I also used ai to fix it but it didn’t really helped bc it was my internal problem. So happy that it’s working, just wanted to clarify and log these 16min!! If any problems with scrollbar occur, please use keyboard arrows to scroll through windows Again, thanks for reading and have a nice day!
Ships:
I made an operating system based around spacecrafts! My website provides few apps: two about telescopes where you can learn about them and rate few photos they took from 1 to 5 stars, and one with notes, where you can store your ideas if some spacecrafts inspire you! Besides apps, on the top bar you will find two guides on how to catch the ISS and starlink satellites. In the ISS window you can find short youtube video - it’s about Polish astronaut, Sławosz Uznański, eating pierogi (delicious polish dish) on the ISS! I really recommend watching this The apps were the biggest challange for me. That’s why I had spent so many hours on this project. Firts, I couldn’t even open the first app. It was hard to even make the selected function work. Then, I managed to make this one app working! But, it wasn’t the right solution. When I added new apps, they were opening the 1st app window, and not theirs. I spent a lot hours trying to fix it, I tried a lot of possible solutions and finally, I had asked ai for help. That’s the only ai usage in this project. Eventually, everything works! I’m so happy because I’ve almost gave up. I really like the outcome, and I look forward for the future changes! I came up with a lot of ideas and I realised them the exact way I wanted! My favourite parts are def the Sławosz eating pierogi video and the photo ranking which I find so fun to watch and rate. Hope you’ll enjoy this as much as I do!
I made an Operating System with spacecraft theme! New features Artemis App Artemis II playlist (app) Settings and darkmode Design - few images on the windows borders Start animation with spacecraftOS baner Challenges Compared to my previous ship, this time all functions and styling went smoothly, but the things that took the most time were adjusting photos and writing, researching about Artemis Mission! I tought that making the darkmode switch would be really hard, but when I focused it was really easy and rewarding process! Proud of I really like the starting animation and the images on the borders. I started coding one month ago so doing something cool with the css all by yourself is so fulfilling! I don’t understand js that much yet, so I had also watched few tutorials. The webOS 1 tutorial was really hard for me, so now I’m really happy when the things I wanted to add to my website turns out well! So I’m also really proud of the images slider in the Artemis App, the spotify playlist embedded and the dark/light mode switcher in the settings! Even tho they were made with tutorials I still needed to adjust it so it fits my site, and I’m so happy that I understand it to the point that I could do this all just by myself Notes Don’t forget to check the README, remember to double click to open apps and just enjoy the vojage!!
I made a web Operating System with spacecraft theme! Creating this site was so fun and fulfilling, esp. when a lot of things turned out exactly as I wanted!! I started coding over a month ago, and I’m so happy that I managed to create something like this. I really enjoyed it, especially the css part. SpacecraftOS This OS provides basic app like timer, calendar, maps, gallery, but everything have implemented some spacecraft additions. For example, the map app won’t show you the route to the nearest grocery store, but it will show you where your fav spacecraft is right now. The calendar app will show you astronauts birthdays and the gallery app provides photos humans sent to space on voyager. All these apps you will find on the left and on the bottom there are apps, where you’ll learn about various spacecrafts, and in some of these apps, you can also rate some photos the spacecrafts took! Notes Please start from choosing the most suitable for you theme in the settings (top right corner) Try on laptop/computer for better experience Snake game is only playable with keyboard Remember to double click on apps to open and please leave a toughtful review. Hope you’ll enjoy it!!...
|
1792972168.911196
|
1793058568.911196
|
|
37183
|
OrbitLens by @Mokila | Stardance
|
Mokila
|
1
|
56.0
|
1072
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-29T16:04:32Z", "hours": 56.0, "multiplier": 19.3, "payout": 1072, "blessing": "neutral", "text": "This is Orbit Lens, a real-time 3D satellite tracking website built using vanilla JavaScript and Three.js. It tracks over 16,000 live space objects around earth using real-time data from CelesTrak. It has many features including 3d and 2d orbit tracking, 3d models of select satellites (ISS, Terra, HST, and Aqua). It also includes a filtering feature where you can filter satellites based on specific categories Before testing this project, it is important to know some stuff: You will have the best experience if you access this through a laptop or desktop Sometimes, the api maybe down or is not responding to requests so please keep in mind that if you see an alert saying API not responding, it is out of the website’s hands and it an error outside of my control. That’s it. Thank you for testing this project and hope you like it :)", "repo": "https://github.com/Moksha-0102/orbit-lens", "demo": "https://orbit-lens.vercel.app/"}]...
|
[{"post_id": 37089, "ts": "202 [{"post_id": 37089, "ts": "2026-07-29T15:53:42Z", "hours": 0.5575, "text": "OrbitLens Devlog #13: fixing deployment bugs 😭😭 Before i continue with this devlog, let me start by saying that modern security rules are the worst. Like istg, why do they have to be so strict? Anyway, you’ll see what i mean by that down below. THis session was all about fixing the deployment bugs. I was almost done and then these f bugs ruined it. This devlog has only abt 30 mins logged because i had the help of ai to fix this because this was way way out of my expertise. Here are the changes. I used ai for this devlog though cus i didn’t understand what it did (but i only used it for htis devlog): Problem 1: The [UNSUPPORTED_FEATURE] Vite Crash My very first Vercel build crashed immediately with a “Top-level await is currently not supported with the ‘iife’ output format” error. Apparently, the satellite.js library I use for SGP4 orbital propagation runs heavy calculations using Web Workers and WebAssembly. By default, Vite tries to bundle everything into an older iife format for maximum browser compatibility, which completely choked on the newer await feature inside the worker file. I fixed this (with the help of ai) by explicitly telling Vite’s internal bundler (Rolldown) to output modern ES modules for both the main thread and the background workers. I created a vite.config.js file and updated the configuration (see vite.config.js in the github repo) Problem 2: 404 Missing 3D Models After fixing the build, the site successfully deployed, but my 3D models (like the ISS and Hubble) and Earth textures threw 404 Not Found errors in the console. Because I was loading these assets while the app was running in my Three.js code using string paths (e.g., ‘/models/iss.glb’), Vite didn’t know they existed and simply excluded them from the final production build. I moved my models and textures folders into Vite’s public directory. Anything placed in the public folder gets copied exactly as is to the root of the final build. This bug wasn’t too bad but the next one was absolute hell. Problem 3: API, Cloudflare and CORS block This was the hardest part. Orbit Lens fetches live Two-Line Element (TLE) data for over 16,000 satellites directly from CelesTrak. It worked perfectly when i hosted it locally, but on Vercel, the browser instantly threw a 403 Forbidden error. CelesTrak uses Cloudflare to prevent automated scraping. When Cloudflare saw an Origin header coming from a deployed Vercel frontend instead of an normaly IP like my computer’s, it blocked the connection. Attempts to use public proxies (like allorigins) resulted in 408 Request Timeout errors because the multiple mb big satellite data took too long to transfer. To fix this, I used Vercel’s Native Rewrites (i have no idea how to use this so i asked ai to do it for me). “I” ;) created a vercel.json file in the root directory to act as a silent backend proxy. By fetching from my own local route (/api/celestrak), the browser doesn’t trigger CORS security. Vercel’s backend intercepts the request, strips the frontend Origin header that was triggering the firewall, and routes the raw data back to the application. This worked! And the website is finally live and i am about to ship the project!"}, {"post_id": 37044, "ts": "2026-07-29T14:44:08Z", "hours": 1.4364, "text": "OrbitLens Devlog #12: Added README.md and ARCHITECTURE.md In this session, i added the README and ARCHITECTURE.md. The README.md highlights the basic features of the website, the tech stack used and how to run this project locally. The ARCHITECTURE.md goes deeper into how the code itself works so anyone perusing it can get a better idea on how i built this project."}, {"post_id": 36924, "ts": "2026-07-29T10:12:40Z", "hours": 1.8528, "text": "OrbitLens Devlog #11: Semi-final changes In this session, i focused on finding small aspects that need to be improved and improved them. Change 1: Firstly, i realised that the dropdown i had implemented was the default dropdown and it didn’t rlly fare well when there were 16000 items to choose from. So i made a custom dropdown, which looks much better than the default one, and made a funciton along with it that shows like the first 200 items matching the search query or, if nothing in being searched, the first 200 items in the list that the API gave. This made the entire experiene so much better because the default dropdown looked kinda ugly cus it took the whole length of the screen. Normally, this wouldnt take too long but i accidentally deleted the wrong eventListeners multiple times because satFilter and satSearch were so similar. So i spent like a good amount of time trying ot find the problem, and it turned out that i justmodified or deleted the wrong thing. Change 2: I found a problem with the filtering system, more specifically in filtering the space stations. Previously, i just had all the satellites with ISS or CSS in their names classified as space station because there are only two space statoins in space right now (ISS and Tiangong) so i filtered any satellites with those two names. But i failed to take into account that other satellites might also have ISS or CSS in their names so instead of two satellites showin up, 16 satellites were avaialbe in that filter. And these were not space stations but rather other statellits which had like ISS or CSS in their names (e.g. Swisscube). So i changed the filter to filter the space stations by their respective NoradIDs, which worked. Change 3: This change wasnt too big; i modified the expanded map layout becaues how it was before led to it having a lot of blank space and probalby wouldnt have looked good in differnet devices."}, {"post_id": 36499, "ts": "2026-07-28T17:30:13Z", "hours": 2.8244, "text": "OrbitLens Devlog #10: mobile layout implementation + better loading screen I am nearing the first ship of this project so this session were just about the final aspects that needed to be improved Change 1: I completely changed the loading screen. Firstly, it now displays the loading percentage that accurately shows the real time progress. Secondly, overall it just looks much better. Thirdly, i also implemented an error notification in the main dashboard in case the API doesnt work and so the website doesnt look like it’s broken Change 2: I added a mobile layout option. by that i mean that if the user is accessing this website on a mobile, it won’t be completely botched (hopefully) p.s. i know this devlog isnt that detailed as my previous ones and that’s because there isn’t much to talk about in this session cus the main changes were in the styles.css (and i’m hella tired)"}, {"post_id": 36385, "ts": "2026-07-28T13:42:59Z", "hours": 4.9911, "text": "OrbitLens Devlog #9: implemented satellite filtering + earth connecting line and complete UI overhaul Now that the website has a proper engine and everything was working well, i decided to add some more stuff. I had two goals for this session. One was to add a satellite filtering option where the user can filter categories of satellites. The other is to change the ui because there were many imprefectoins. Here is a breakdown of what i changed and the challenges i faced: Change 1: I added a global filtering system to fiter satellites by categories. To do this i first built a string-matching engine directly into the TLE parsing loop. As the engine downloads the TLE data from the API, it scans the satellite names and tags them each with categories. I didn’t really know what to categorise them so i thought of some categories and i asked ai to think of some categories. These are the categories: Starlink Oneweb Comms Navigation Weather and Other/Miscallaneous (which i impemented later; read below) I then wired the HTML dropdown directly into the WebGL gpu loop. Instead of deleting unselected satellites (which would take up too much gpu memory), the gpu simply multiplies their matrix scale to 0, 0, 0, which would just hide them. But there was a challenge that i faced, though it wasn’t a big one. When i first implemented the filter, I noticed that the total satellite count dropped to around 12,000. It turned out that all the satellites that didnt fit into any cateogry were not shown at all so i expanded the categories to include an OTHER category. I also had to make some changes in the raycaster or the users would accidentally be clicking on the hidden satellites. Change 2: I also added a line connecting the selected satellite directly to its exact spot on the Earth’s surface directly beneath it. I did this by first pre-allocating a THREE.BufferGeometry with exactly two vertices. Inside the animation loop, i then took the satellite’s live 3D coordinates and use a .normalize() math function. Because the Earth has a radius of exactly 1, normalizing the 3d coordinates perfectly attaches the bottom of the line to the planet’s surface. But, i ran into a bug where the line would randomly disappear depending on the camera angle. After some research (ai) i found out that this was caused by Three.js’s “Frustum Culling.” The code calculated the line bounding box once when the websited started up and when the camera moved away from that initial box, the gpu assumed the line was out of sight and stopped rendering it to save memory. So i just added a line of code ( frustumCulled = false ) that just overrode that. Change 3: Lastly, i essentially completely rewrote the styles.css to change how the ui looked cus i didn’t relaly like how it looked before. So this was the third change."}, {"post_id": 35927, "ts": "2026-07-27T18:02:13Z", "hours": 5.8056, "text": "OrbitLens Devlog #8: Scaling the 3d globe and some other stuff In the last update, i finally implemented the 2d map so this time i want to take this website a step further since the foundation is stable enough. I decided to go from tracking 5 hardcoded satellites to over 16,000 space objects. Here is what i changed, how i changed it and the challenges i faced: Change 1: Originally, i just added the starlink satellites to what i already had which was my initial goal. but the thing was, i was requesting the API for thousands of satellites, which did work once and all of them were stored in localStorage but for ‘testing purposes’ (i was just stupif), i cleared the localStorage and re-requested the TLE which it then instantly rejected cus of its ‘anti-bot firewalls’ and i got ip banned for like a couple of hours and it gave a 403 error aswell. To fix this, i read some CelesTrak documentation and i realised that there is a way to ismply request all the satellite (every satellite that it had) data in one request. Apparently there was a special search query (‘active’) that i could’ve used but instead i individually fetched everything. So once i used that query, i got all of the satellitse (a bit more than 16000) rendered on the earth but it was laggy, which leads to my second change. Change 2 To fix this massive lag caused by the 16000+ satellites, I completely replaced the standard 3D mesh pipeline with THREE.InstancedMesh so that instead of creating 16,000 individual sphere objects (which would like instantly crashes the browser), i can feed the GPU a single geometry and material, along with an array of 16,000 matrixes. That means now the gpu like renders everything in one go. But, I hit a massive 5-second freeze whenever a user clicked the ISS (which makes sense cus this was a 4k extremely detailed 3d model). The thing was, WebGL delays uploading heavy 3D textures to the GPU until an object is actually rendered on screen. And because the ISS model was hidden on startup, the compiler skipped it, so the website was stuck trying to render it when i selected the ISS. I solved this by forcing the renderer to draw one “dummy frame” with all models visible during the loading screen, which, in a sense, ‘warmed up’ the GPU. Change 3: The lag was better but it was still there and i realised the problem was that each of the dots representing a satellite were smoothly moving in space. This smooth-moving physics applied to over 16000 dots was what slowed down the website. To fix this, I rewrote the loop that propogates the satellite dots so physics calculations wouldn’t choke the main JavaScript thread. To do this i built a system to process the satellites in batches of 4,000 satellites per frame instead of all 16,000. Second, i scrapped geodetic trigonometry (latitude/longitude conversions; see one of the earlier devlogs) and replaced it with direct Earth-Centered, Earth-Fixed (ECEF) 3D vector rotation. Initially, our batches were too small, causing satellites to visually ‘teleport’ instead of smoothly gliding, which looked really glitchy. But by upgrading to matrix rotation, i managed to get a huge increase in speed. This allowed me to crank the batch size up and get that smooth motion across the entire thing. Change(s) 4: There were still some small bugs in the visual aspects like the dots disappearing or the transition jump (see previous devlog(s) to understand) and stuff but i took care of them."}, {"post_id": 35377, "ts": "2026-07-26T18:42:40Z", "hours": 4.1736, "text": "OrbitLens Devlog #7: Implementing a 2D orbit map To expand the functinality of the website, i wanted to add a 2D world map that has the 3d orbit projected on to it. Here is a breakdown of what i built, how i built it and the challenge i faced. What I Built: I made a 2D projection of the 3d globe using the HTML5 Canvas API that runs at the same time with the WebGL 3D engine. The map automatically appears when a satellite is selected, and fetches live telemetry to draw exactly one full orbital period (half past, half future). The orbit line looks like how it does on the 3d globe with a yellow line representing the past trail and a dotted blue line representing the predicted future track. I also built an “EXPAND” toggle that expands the map to fill most of the screen if the user wants to take a close look. Challenges: If a satellite flies east across the Pacific Ocean (where the International Date Line is), its longitude coordinates suddenly jump from +179deg to -179deg. I originally didnt take this into account and it had like this massive, horizontal glitch streak entirely across the screen cus of the sudden coordinate shift. To fix this, I programmed a strict mathematical distance gate into the drawing loop. If the engine detects that the X-coordinate has jumped by more than half the width of the canvas, it forces the renderer to break the current stroke (mapCtx.stroke()), lift the ‘pen’, and begin a completely new path on the opposite edge of the map (mapCtx.beginPath()). When plotting a full 90-minute orbit, the beginning of the yellow line and the end of the cyan line do not connect perfectly, leaving a massive gap. I originally thought this was a problem and tried for quite a while to fix this and i double checked the math formulas again and again. But i realised this isnt a math error, it’s just physics. While the satellite flies in a continuous circle, the Earth is physically rotating underneath it. By the time the satellite completes one lap, the ground has shifted roughly 22.5 degrees to the east, pushing the satellite’s relative ground track to the west. So i just left it like that to accurately represent the Earth’s rotation. This was the biggest problem and took the most time to fix. Three.js orbital camera controls are incredibly aggressive about capturing mouse events. The 3D engine was always suppressing the HTML ‘click’ events, making the “EXPAND” button not work. Not only that, the standard inline CSS was pushing the 3D canvas down the page, which misaligned everything and didnt allow me to select the satellites at all. To fix this, fisrt, i locked the 3D canvas to a fixed background layer (z-index: -1) to completely isolate it from the UI layout. Second, i bypassed the WebGL event interceptors entirely and connected the code that handles the expansion directly to a global window function (window.toggleMap) and just injected the button with the HTML onclick attribute. This fixed everything and now it works really great."}, {"post_id": 34787, "ts": "2026-07-25T19:42:20Z", "hours": 6.7089, "text": "OrbitLens Devlog #6: Implemented Sun and the day night cycles + camera panning improvements The core engine was working smoothly, so this session was focused on the ui and aesthetics and realism. Here are the changes i made, how i made them, and the challenges i faced: Change 1: Implemented the Sun The first major goal was replacing the static and boring lighting the 3D earth originally had with a Sun. To do this, I wrote a custom Solar Ephemeris algorithm. Using the current Julian date, it calculates the sun’s exact Right Ascension, Declination, and Earth’s Greenwich Mean Sidereal Time (GMST) to pinpoint the real-time subsolar vector. Since this was some complicated math, i had to use some ai for this. But in a WebGL engine, lights are purely mathematical vectors and there is no physical object in the sky. So when i first added a solid white sphere, it literally looked like a flat plastic toy and looked really ugly. To fix this, I abandoned the 3D ball and built a 2D Sprite using the HTML5 Canvas API to generate a radial gradient. By using Additive Blending to the material, I forced it to mathematically layer the light over the space, which created like this blinding, light that looked like the sun, which was good. Change 2: The Day/Night City lights cycle: To make the globe even more realistic, I wanted the night side of the Earth to have like the night time city lights rather than just a dark shadow. To build this, I added an 8k night-map texture (from Solar System Scope) and implemented a WebGL fragment shader into the Three.js’s native MeshPhongMaterial using a compiler hook. But there was a problem, the free night map that i implemented had this blue tint to it, and when i tried to correct it, it literally turned to this muddy, polluted yellow. To fix this, I programmed the shader to intercept the texture data, remove the color tint by calculating luminance, and pass it through a smoothstep noise gate. Anything below a 10% threshold was forced to pitch black, while populated areas were recolored with a warm golden orange hue. And it worked great! Change 3: More camera improvements Despite the previous session having to do with correcting the camera engine, there were still some stuff that i fixed here. The problem was since i removed OrbitControls in the last session (read previous devlog), once i had like hte earth upside, it was very hard to make it upright again. like at one point, i had the entire europe upside down and Africa was at the top of the globe but i couldnt get it back to normal. To fix this I changed the code so that the panning controls thing swaps between OrbitControls (for the 3D globe) and TrackballControls (for the satellites/spacecrafts). But there were some more challenges: When a zoom-in animation (read previous devlogs) finished (after selecting e.g. a satellite), the camera would like glitch backward into a less zoomed in position which was kinds uncomfortable to look at. Because the satellites were moving a static transition speed couldn’t catch them before the animation finished, so the final frame was a bit glitchy and the screen like jumped a bit. To fix all of these problems, I first made sure that disabled camera controls are completely turned off so they can’t fight the active zoom animations. I also made it that instead of moving at a steady speed, I added a speed-up effect as the camera gets closer to the target. This ensures that the camera glides smoothly into place right on time without any jerky jumps."}, {"post_id": 34460, "ts": "2026-07-25T05:56:14Z", "hours": 5.9047, "text": "OrbitLens Devlog #5: Camera panning improvements and performance updates After the changes from Devlog #4, all the math and the 3d models were all working but i faced some problems in other aspects of the website. Here are soe of the changes i made: Change 1: Correct orientation This was a small change, but i noticed that some satellites were a bit too big (like Aqua) and were positioned wrongly, so i just chaged teh scale and the rotation to make it a bit more realistic Changes 2, 3, and 4: The camera improvements I faced a lots of problems with the camera and how it worked. Before, i couldn’t rotated in all directions around the earth or the satellites because they were using OrbitControls so i swapped that out with TrackballControls , which allows for 360deg panninh There was also like a rubber band effect where the camera, when the camera lock was selected as satellite, zoomed in towards a satellite, i couldn’t interact with the satellite at all. THis was because as the satellite’s moving, the camera is also actuvely trying to catch up so it never actually ‘ended’ its animation so i was blocked from interacting with the satellite. To fix this i implemented delta tracking. The engine now calculates the exact mathematical vector the satellite moves every frame and shifts the camera’s physical position by that exact same amount, which worked. Previously, switching targets caused the camera to travel in a straight line, clipping through the Earth, which looked kinda unprofessional so I engineered a custom transition that separates the camera’s direction from its altitude. Now, when you select a new satellite, the camera zooms out, tracels in a an arc over the globe, and zooms in to the destination satellite. The animation still needs a lot of improvement cus some parts are still a bit glitchy, but i’m happy for now. Change 5: I implemented it that the TLEs are now stored in the actual localStorage for like 6 hours and then fetch new TLEs. So the user will always have the latest TLEs cus they update evey 12hrs."}, {"post_id": 33938, "ts": "2026-07-24T08:13:52Z", "hours": 9.5625, "text": "OrbitLens Devlog #4: Adding multiple satellites In my last update, I finally got a 3D model of the ISS rendering on the globe with a basic UI dashboard. It looked cool, but I wanted to scale it up. I wanted to add multiple famous satellites on top of the ISS: The Hubble Space Telescope (HST) NASA’s Aqua NASA’s Terra Tiangong ISS (which already exists) At least for now. Maybe in later stages, I can add Starlink satellites or sth. Here is waht I built, how I built it, and the challenges I faced. Change/Challenge 1: the orbit that looked like a slinky I hardcoded a 90-minute orbit line (the ISS orbit time). But other satellites have different orbital periods, so 90 mins fell short. Increasing it to a 12-hour calculation made the ISS orbit look like a massive slinky wrapping around the Earth cus its orbit is only 90mins. I fixed this by dynamically calculating the exact total orbit time using the satellite’s math: const periodMinutes = Math.ceil((2 * Math.PI) / satrec.no); const halfPeriod = Math.floor(periodMinutes / 2); Change/Challenge 2: IP ban (again) The JS fetch() doesn’t consider a ‘429 too many requests’ (i got this cus vite reloaded the page every time i saved something) response as a network error, so it tried calculating the HTML error page as orbital math and crashed. I fixed this by manually checking the response.ok HTTP status. If the API blocks me, the code redirects to an “Offline Fallback Mode”—loading a hardcoded string of ISS TLE math so the app survives. Change/Challenge 3: improper API request After like 4 hours, I realized I still wasn’t getting a proper API response even though the IP ban would have worn off. I looked at the code and realized I was pulling data for all five satellites in one go by just comma-separating the values in the URL like this: .../gp.php?CATNR=25544,20580,48274&FORMAT=tle (each number references to a satellite) But after CelesTrak’s documentation, it strictly dictated that the CATNR parameter only accepts a single catalog number. The server rejected the request, my code assumed 0 satellites, and the engine crashed. The fix: Writing five separate fetch() blocks is messy, and implementing an await fetch() in a for-loop creates a slow “waterfall” effect (waiting for one to finish before starting the next). I fixed this with JavaScript’s Promise.all. I created an array of the exact NORAD IDs, mapped over it to generate separate, perfectly formatted fetch requests, and Promise.all fires them all at the exact same time. Change/Challenge 4: I wanted 3D models for all of these. I found Aqua and HST easily from NASA. I found Terra, but it was fetching some other incompatible file I didn’t have, so I just scratched the Terra model. Tiangong was the biggest pain—everywhere I looked was either paid or on Sketchfab, and I cant create a Sketchfab account cus of some stupid Epic Games restriction. Implementing the files I did have was the next issue. Hardcoding multiple GLTFLoader blocks would turn the code into spaghetti. Plus, 3D models from the internet aren’t scaled equally—my Hubble was massive, and my Aqua model was tiny. The fix: I built a central Model Registry object. It maps a satellite’s NORAD ID to its file path and a specific scale multiplier. Even better, I implemented a fallback for satellites I done have a model for. If I track a satellite (like Tiangong) but leave the file path as null, the code detects this and dynamically generates a glowing cyan sphere using Three.js math to take its place. Changes 5 and 6: I updated the dashboard to include a dropdown to select the satellite and the telemetry updates accordingly. I also added a camera toggle feature where the user can lock the camera to follow the satellite or stay locked on the Earth. Lastly, I implemented a custom loading screen while the models load. P.S.Lots of info is compressed cus i crossed the 4000 char limit"}, {"post_id": 33396, "ts": "2026-07-23T09:48:44Z", "hours": 4.6533, "text": "OrbitLens Devlog #3: Adding a dashboard + ISS 3d model implementation I had two goals in my mind in this session. One was to add a dashboard which displays some stats of the ISS and the other is to replace the red dot with a 3d model of the ISS. Here is what and how I implemented these stuff and the challenges i faced: Change/Problem 1: Before I even got started on the new stuff i wanted to add, i faced a big problem. While testing the physics code and other stuff, my build tool (Vite) was auto-refreshing the browser every time I hit save. This I spammed CelesTrak’s public API with dozens of requests per minute. This lead to me kinda getting IP blocked temporarily, at least that’s what i think happend because it always returned an HTML error page instead of a TLE string. My engine tried to calculate stuff with that empty TLE and just crashed the engine The fix: It is important to know that a TLE is not like a live GPS broadcast that gets transmitted every second. It’s literally like a mathematical snapshot of a ton of stuff of the ISS like its position and its orbit and NORAD only updates these TLEs like twice a day or sth. So I fixed this api problem by making it such that the localStorage caches the TLE once and uses it for the calculation for the next 12 hours and then updates the TLE after that. Change 2: Dashboard implementation I implemented a dashboard that shows up on the top left of the screen and shows the following stuff abotu the ISS: Longitude: the method i used to calculate this is in one of my previous devlogs (i think my last one). But here is a quick summary: To find coordinates I first calculated the Greenwich Mean Sidereal Time (gmst), which gives me the exact rotational angle of the Earth at that specific millisecond. I passed the ECI position (one of the previosu devlogs) and gmst into satellite.eciToGeodetic(), which projects the point onto the spinning globe in radians. I then multiplied those values by 180/pi to convert the radians into standard degrees latitude: same as longitude -altitude: The eciToGeodetic() function also calculates the distance from the satellite’s coordinates down to the mathematical surface of the Earth (the WGS84 or the ‘World Geodetic System 1984’ ellipsoid which is like a mathematical reference representation of the earth that is used in calculatoin and stuff). It outputs this directly as height in kilometers, which I then simply rounded to two dp. -velocity: The propagate() function outputs the satellite’s speed broken into X, Y, and Z axes (measured in km/s). To get a single speed, I calculated the magnitude of that 3D vector using the 3D Pythagorean theorem: v = squareroot(x^2 + y^2 + z^2) Change 3: To implement a 3d model, i first needed that 3d image. I wanted the highest quality NASA model available (Model D - IGOAL). I downloaded the official .fbx, converted it to a .glb, and ended up with a 255mb file. Which is really bad because shoving a 255mb file into a web browser would just crash the entire thing. So i just ran that through a draco compression and a texture compression (WebP 1024x1024) which brought the size to about 18mb which was much better. To render this, I used Three.js’s GLTFLoader with a dedicated Google WebAssembly DRACOLoader to decode the compressed math. The next couple of changes were just to make it more realistic: i changed the scale from 0.02 (where it was the size of a continent) to 0.001 (which made it a good size) the direction the ISS faced was not accurate at all so I wanted to rotate until its in the correct position. But because the animate() loop was actively using math to point the model forward 60 times a second, it kept overriding my manual rotation. So I wrapped the ISS in a THREE.Group, rotated the mesh 90 degrees inside that container, and then applied the math."}, {"post_id": 31471, "ts": "2026-07-19T21:06:48Z", "hours": 5.8158, "text": "OrbitLens Devlog #2: Adding ISS + Orbit This session was mainly focused on implementing the ISS first to the satellite tracker. Here are the changes I made: Satellite Data Extraction and ISS Positioning To understand what I did in this session, it is important to know how I can get the ‘live’ location of the ISS works: firstly, satellites don’t broadcast live GPS coordinates to the internet. Instead, radars track them and publish Two-Line Element (TLE) sets. A TLE is like a raw string that “acts as a mathematical variable of an orbit’s shape at a specific moment.” I got these TLE from a non-profit API called CelesTrak. these TLEs are kinda useless so I used the satellite.js library to parse te TLEs. This js engine also allows you to run what is known as SGP4 models (Simplified General Perturbations 4) which is a mathematical model used to predict an orbit. Using this, TLEs are then converted to what’s known as Earth-Centered Inertial (ECI) vectors which is a “non-rotating 3D coordinate system anchored to the center of the Earth with its axes fixed relative to the stars, allowing you to calculate a satellite’s absolute mathematical position in space independent of the Earth spinning beneath it.” The ECI is still not useful so I passed it through satellite.eciToGeodetic which converted the eci to geodetic coordinates (longitude, latitude and altitude) But there’s one more step before the data is useful. The thing is Three.js only understands Cartesian coordinates (x, y, z) so the geodetic coordinates need to be converted to catesian. I did that using these mathematical formulas: x = r * cos(lat) * cos(lon) y = r * sin(lat) z = -r * cos(lat) * sin(lon) Orbit Implementation Satellites do not orbit in perfect circles; they follow complex trajectories that shift as the Earth rotates underneath them. The ISS takes roughly 92 minutes to complete one full orbit around the Earth. I captured this entire window by running two separate for loops. For these loops, i created 92 differed Date objects spaced exactly 1 second apart. here are the loops and how they work in a small nutshell: The Past: I looped backward from -46 minutes up to 0 (the current moment) and inputted the X, Y, and Z coordinates in each loop into THREE.BufferGeometry to draw a solid yellow LineBasicMaterial. The Future: I looped forward from 0 to +46 minutes. In every single iteration of those loops, and did the same thing. Challenges: the hemisphere and orbit were originally flipped or were completely false so i had to wrack my brain and dind the cause. I spent more than an hour debugging this. Turns out the formula was wrong and i used sin instaed of cos. In te end, I also double checked my orbit and position with official ISS trackers, and they matched!"}, {"post_id": 31191, "ts": "2026-07-19T12:11:49Z", "hours": 1.4144, "text": "OrbitLens Devlog #1: Rendering the Earth 3D I just kick started this project, Orbit Lens, and my aim is to build a fully free, real-time 3D satellite tracker from scratch using Three.js and maybe some other libraries. Today was all about creating the core 3D arch. You can’t track a satellite without a planet to orbit, so Phase 1 was focused on rendering the Earth and setting up the Three.js environment. What I accomplished in Phase 1: Set up my environment with Vite Built the Three.js scene, camera, and render loop. Rendered a 3D Earth utilizing maps from solar system scope. Enabled OrbitControls to enable camera panning This is just the basic foundations of the project so there’ll be much more development in the future."}]...
|
Title: OrbitLens by @Mokila | Stardance
Devlogs:
Title: OrbitLens by @Mokila | Stardance
Devlogs:
OrbitLens Devlog #1: Rendering the Earth 3D I just kick started this project, Orbit Lens, and my aim is to build a fully free, real-time 3D satellite tracker from scratch using Three.js and maybe some other libraries. Today was all about creating the core 3D arch. You can’t track a satellite without a planet to orbit, so Phase 1 was focused on rendering the Earth and setting up the Three.js environment. What I accomplished in Phase 1: Set up my environment with Vite Built the Three.js scene, camera, and render loop. Rendered a 3D Earth utilizing maps from solar system scope. Enabled OrbitControls to enable camera panning This is just the basic foundations of the project so there’ll be much more development in the future.
OrbitLens Devlog #2: Adding ISS + Orbit This session was mainly focused on implementing the ISS first to the satellite tracker. Here are the changes I made: Satellite Data Extraction and ISS Positioning To understand what I did in this session, it is important to know how I can get the ‘live’ location of the ISS works: firstly, satellites don’t broadcast live GPS coordinates to the internet. Instead, radars track them and publish Two-Line Element (TLE) sets. A TLE is like a raw string that “acts as a mathematical variable of an orbit’s shape at a specific moment.” I got these TLE from a non-profit API called CelesTrak. these TLEs are kinda useless so I used the satellite.js library to parse te TLEs. This js engine also allows you to run what is known as SGP4 models (Simplified General Perturbations 4) which is a mathematical model used to predict an orbit. Using this, TLEs are then converted to what’s known as Earth-Centered Inertial (ECI) vectors which is a “non-rotating 3D coordinate system anchored to the center of the Earth with its axes fixed relative to the stars, allowing you to calculate a satellite’s absolute mathematical position in space independent of the Earth spinning beneath it.” The ECI is still not useful so I passed it through satellite.eciToGeodetic which converted the eci to geodetic coordinates (longitude, latitude and altitude) But there’s one more step before the data is useful. The thing is Three.js only understands Cartesian coordinates (x, y, z) so the geodetic coordinates need to be converted to catesian. I did that using these mathematical formulas: x = r * cos(lat) * cos(lon) y = r * sin(lat) z = -r * cos(lat) * sin(lon) Orbit Implementation Satellites do not orbit in perfect circles; they follow complex trajectories that shift as the Earth rotates underneath them. The ISS takes roughly 92 minutes to complete one full orbit around the Earth. I captured this entire window by running two separate for loops. For these loops, i created 92 differed Date objects spaced exactly 1 second apart. here are the loops and how they work in a small nutshell: The Past: I looped backward from -46 minutes up to 0 (the current moment) and inputted the X, Y, and Z coordinates in each loop into THREE.BufferGeometry to draw a solid yellow LineBasicMaterial. The Future: I looped forward from 0 to +46 minutes. In every single iteration of those loops, and did the same thing. Challenges: the hemisphere and orbit were originally flipped or were completely false so i had to wrack my brain and dind the cause. I spent more than an hour debugging this. Turns out the formula was wrong and i used sin instaed of cos. In te end, I also double checked my orbit and position with official ISS trackers, and they matched!
OrbitLens Devlog #3: Adding a dashboard + ISS 3d model implementation I had two goals in my mind in this session. One was to add a dashboard which displays some stats of the ISS and the other is to replace the red dot with a 3d model of the ISS. Here is what and how I implemented these stuff and the challenges i faced: Change/Problem 1: Before I even got started on the new stuff i wanted to add, i faced a big problem. While testing the physics code and other stuff, my build tool (Vite) was auto-refreshing the browser every time I hit save. This I spammed CelesTrak’s public API with dozens of requests per minute. This lead to me kinda getting IP blocked temporarily, at least that’s what i think happend because it always returned an HTML error page instead of a TLE string. My engine tried to calculate stuff with that empty TLE and just crashed the engine The fix: It is important to know that a TLE is not like a live GPS broadcast that gets transmitted every second. It’s literally like a mathematical snapshot of a ton of stuff of the ISS like its position and its orbit and NORAD only updates these TLEs like twice a day or sth. So I fixed this api problem by making it such that the localStorage caches the TLE once and uses it for the calculation for the next 12 hours and then updates the TLE after that. Change 2: Dashboard implementation I implemented a dashboard that shows up on the top left of the screen and shows the following stuff abotu the ISS: Longitude: the method i used to calculate this is in one of my previous devlogs (i think my last one). But here is a quick summary: To find coordinates I first calculated the Greenwich Mean Sidereal Time (gmst), which gives me the exact rotational angle of the Earth at that specific millisecond. I passed the ECI position (one of the previosu devlogs) and gmst into satellite.eciToGeodetic(), which projects the point onto the spinning globe in radians. I then multiplied those values by 180/pi to convert the radians into standard degrees latitude: same as longitude -altitude: The eciToGeodetic() function also calculates the distance from the satellite’s coordinates down to the mathematical surface of the Earth (the WGS84 or the ‘World Geodetic System 1984’ ellipsoid which is like a mathematical reference representation of the earth that is used in calculatoin and stuff). It outputs this directly as height in kilometers, which I then simply rounded to two dp. -velocity: The propagate() function outputs the satellite’s speed broken into X, Y, and Z axes (measured in km/s). To get a single speed, I calculated the magnitude of that 3D vector using the 3D Pythagorean theorem: v = squareroot(x^2 + y^2 + z^2) Change 3: To implement a 3d model, i first needed that 3d image. I wanted the highest quality NASA model available (Model D - IGOAL). I downloaded the official .fbx, converted it to a .glb, and ended up with a 255mb file. Which is really bad because shoving a 255mb file into a web browser would just crash the entire thing. So i just ran that through a draco compression and a texture compression (WebP 1024x1024) which brought the size to about 18mb which was much better. To render this, I used Three.js’s GLTFLoader with a dedicated Google WebAssembly DRACOLoader to decode the compressed math. The next couple of changes were just to make it more realistic: i changed the scale from 0.02 (where it was the size of a continent) to 0.001 (which made it a good size) the direction the ISS faced was not accurate at all so I wanted to rotate until its in the correct position. But because the animate() loop was actively using math to point the model forward 60 times a second, it kept overriding my manual rotation. So I wrapped the ISS in a THREE.Group, rotated the mesh 90 degrees inside that container, and then applied the math.
OrbitLens Devlog #4: Adding multiple satellites In my last update, I finally got a 3D model of the ISS rendering on the globe with a basic UI dashboard. It looked cool, but I wanted to scale it up. I wanted to add multiple famous satellites on top of the ISS: The Hubble Space Telescope (HST) NASA’s Aqua NASA’s Terra Tiangong ISS (which already exists) At least for now. Maybe in later stages, I can add Starlink satellites or sth. Here is waht I built, how I built it, and the challenges I faced. Change/Challenge 1: the orbit that looked like a slinky I hardcoded a 90-minute orbit line (the ISS orbit time). But other satellites have different orbital periods, so 90 mins fell short. Increasing it to a 12-hour calculation made the ISS orbit look like a massive slinky wrapping around the Earth cus its orbit is only 90mins. I fixed this by dynamically calculating the exact total orbit time using the satellite’s math: const periodMinutes = Math.ceil((2 * Math.PI) / satrec.no); const halfPeriod = Math.floor(periodMinutes / 2); Change/Challenge 2: IP ban (again) The JS fetch() doesn’t consider a ‘429 too many requests’ (i got this cus vite reloaded the page every time i saved something) response as a network error, so it tried calculating the HTML error page as orbital math and crashed. I fixed this by manually checking the response.ok HTTP status. If the API blocks me, the code redirects to an “Offline Fallback Mode”—loading a hardcoded string of ISS TLE math so the app survives. Change/Challenge 3: improper API request After like 4 hours, I realized I still wasn’t getting a proper API response even though the IP ban would have worn off. I looked at the code and realized I was pulling data for all five satellites in one go by just comma-separating the values in the URL like this: .../gp.php?CATNR=25544,20580,48274&FORMAT=tle (each number references to a satellite) But after CelesTrak’s documentation, it strictly dictated that the CATNR parameter only accepts a single catalog number. The server rejected the request, my code assumed 0 satellites, and the engine crashed. The fix: Writing five separate fetch() blocks is messy, and implementing an await fetch() in a for-loop creates a slow “waterfall” effect (waiting for one to finish before starting the next). I fixed this with JavaScript’s Promise.all. I created an array of the exact NORAD IDs, mapped over it to generate separate, perfectly formatted fetch requests, and Promise.all fires them all at the exact same time. Change/Challenge 4: I wanted 3D models for all of these. I found Aqua and HST easily from NASA. I found Terra, but it was fetching some other incompatible file I didn’t have, so I just scratched the Terra model. Tiangong was the biggest pain—everywhere I looked was either paid or on Sketchfab, and I cant create a Sketchfab account cus of some stupid Epic Games restriction. Implementing the files I did have was the next issue. Hardcoding multiple GLTFLoader blocks would turn the code into spaghetti. Plus, 3D models from the internet aren’t scaled equally—my Hubble was massive, and my Aqua model was tiny. The fix: I built a central Model Registry object. It maps a satellite’s NORAD ID to its file path and a specific scale multiplier. Even better, I implemented a fallback for satellites I done have a model for. If I track a satellite (like Tiangong) but leave the file path as null, the code detects this and dynamically generates a glowing cyan sphere using Three.js math to take its place. Changes 5 and 6: I updated the dashboard to include a dropdown to select the satellite and the telemetry updates accordingly. I also added a camera toggle feature where the user can lock the camera to follow the satellite or stay locked on the Earth. Lastly, I implemented a custom loading screen while the models load. P.S.Lots of info is compressed cus i crossed the 4000 char limit
OrbitLens Devlog #5: Camera panning improvements and performance updates After the changes from Devlog #4, all the math and the 3d models were all working but i faced some problems in other aspects of the website. Here are soe of the changes i made: Change 1: Correct orientation This was a small change, but i noticed that some satellites were a bit too big (like Aqua) and were positioned wrongly, so i just chaged teh scale and the rotation to make it a bit more realistic Changes 2, 3, and 4: The camera improvements I faced a lots of problems with the camera and how it worked. Before, i couldn’t rotated in all directions around the earth or the satellites because they were using OrbitControls so i swapped that out with TrackballControls , which allows for 360deg panninh There was also like a rubber band effect where the camera, when the camera lock was selected as satellite, zoomed in towards a satellite, i couldn’t interact with the satellite at all. THis was because as the satellite’s moving, the camera is also actuvely trying to catch up so it never actually ‘ended’ its animation so i was blocked from interacting with the satellite. To fix this i implemented delta tracking. The engine now calculates the exact mathematical vector the satellite moves every frame and shifts the camera’s physical position by that exact same amount, which worked. Previously, switching targets caused the camera to travel in a straight line, clipping through the Earth, which looked kinda unprofessional so I engineered a custom transition that separates the camera’s direction from its altitude. Now, when you select a new satellite, the camera zooms out, tracels in a an arc over the globe, and zooms in to the destination satellite. The animation still needs a lot of improvement cus some parts are still a bit glitchy, but i’m happy for now. Change 5: I implemented it that the TLEs are now stored in the actual localStorage for like 6 hours and then fetch new TLEs. So the user will always have the latest TLEs cus they update evey 12hrs.
OrbitLens Devlog #6: Implemented Sun and the day night cycles + camera panning improvements The core engine was working smoothly, so this session was focused on the ui and aesthetics and realism. Here are the changes i made, how i made them, and the challenges i faced: Change 1: Implemented the Sun The first major goal was replacing the static and boring lighting the 3D earth originally had with a Sun. To do this, I wrote a custom Solar Ephemeris algorithm. Using the current Julian date, it calculates the sun’s exact Right Ascension, Declination, and Earth’s Greenwich Mean Sidereal Time (GMST) to pinpoint the real-time subsolar vector. Since this was some complicated math, i had to use some ai for this. But in a WebGL engine, lights are purely mathematical vectors and there is no physical object in the sky. So when i first added a solid white sphere, it literally looked like a flat plastic toy and looked really ugly. To fix this, I abandoned the 3D ball and built a 2D Sprite using the HTML5 Canvas API to generate a radial gradient. By using Additive Blending to the material, I forced it to mathematically layer the light over the space, which created like this blinding, light that looked like the sun, which was good. Change 2: The Day/Night City lights cycle: To make the globe even more realistic, I wanted the night side of the Earth to have like the night time city lights rather than just a dark shadow. To build this, I added an 8k night-map texture (from Solar System Scope) and implemented a WebGL fragment shader into the Three.js’s native MeshPhongMaterial using a compiler hook. But there was a problem, the free night map that i implemented had this blue tint to it, and when i tried to correct it, it literally turned to this muddy, polluted yellow. To fix this, I programmed the shader to intercept the texture data, remove the color tint by calculating luminance, and pass it through a smoothstep noise gate. Anything below a 10% threshold was forced to pitch black, while populated areas were recolored with a warm golden orange hue. And it worked great! Change 3: More camera improvements Despite the previous session having to do with correcting the camera engine, there were still some stuff that i fixed here. The problem was since i removed OrbitControls in the last session (read previous devlog), once i had like hte earth upside, it was very hard to make it upright again. like at one point, i had the entire europe upside down and Africa was at the top of the globe but i couldnt get it back to normal. To fix this I changed the code so that the panning controls thing swaps between OrbitControls (for the 3D globe) and TrackballControls (for the satellites/spacecrafts). But there were some more challenges: When a zoom-in animation (read previous devlogs) finished (after selecting e.g. a satellite), the camera would like glitch backward into a less zoomed in position which was kinds uncomfortable to look at. Because the satellites were moving a static transition speed couldn’t catch them before the animation finished, so the final frame was a bit glitchy and the screen like jumped a bit. To fix all of these problems, I first made sure that disabled camera controls are completely turned off so they can’t fight the active zoom animations. I also made it that instead of moving at a steady speed, I added a speed-up effect as the camera gets closer to the target. This ensures that the camera glides smoothly into place right on time without any jerky jumps.
OrbitLens Devlog #7: Implementing a 2D orbit map To expand the functinality of the website, i wanted to add a 2D world map that has the 3d orbit projected on to it. Here is a breakdown of what i built, how i built it and the challenge i faced. What I Built: I made a 2D projection of the 3d globe using the HTML5 Canvas API that runs at the same time with the WebGL 3D engine. The map automatically appears when a satellite is selected, and fetches live telemetry to draw exactly one full orbital period (half past, half future). The orbit line looks like how it does on the 3d globe with a yellow line representing the past trail and a dotted blue line representing the predicted future track. I also built an “EXPAND” toggle that expands the map to fill most of the screen if the user wants to take a close look. Challenges: If a satellite flies east across the Pacific Ocean (where the International Date Line is), its longitude coordinates suddenly jump from +179deg to -179deg. I originally didnt take this into account and it had like this massive, horizontal glitch streak entirely across the screen cus of the sudden coordinate shift. To fix this, I programmed a strict mathematical distance gate into the drawing loop. If the engine detects that the X-coordinate has jumped by more than half the width of the canvas, it forces the renderer to break the current stroke (mapCtx.stroke()), lift the ‘pen’, and begin a completely new path on the opposite edge of the map (mapCtx.beginPath()). When plotting a full 90-minute orbit, the beginning of the yellow line and the end of the cyan line do not connect perfectly, leaving a massive gap. I originally thought this was a problem and tried for quite a while to fix this and i double checked the math formulas again and again. But i realised this isnt a math error, it’s just physics. While the satellite flies in a continuous circle, the Earth is physically rotating underneath it. By the time the satellite completes one lap, the ground has shifted roughly 22.5 degrees to the east, pushing the satellite’s relative ground track to the west. So i just left it like that to accurately represent the Earth’s rotation. This was the biggest problem and took the most time to fix. Three.js orbital camera controls are incredibly aggressive about capturing mouse events. The 3D engine was always suppressing the HTML ‘click’ events, making the “EXPAND” button not work. Not only that, the standard inline CSS was pushing the 3D canvas down the page, which misaligned everything and didnt allow me to select the satellites at all. To fix this, fisrt, i locked the 3D canvas to a fixed background layer (z-index: -1) to completely isolate it from the UI layout. Second, i bypassed the WebGL event interceptors entirely and connected the code that handles the expansion directly to a global window function (window.toggleMap) and just injected the button with the HTML onclick attribute. This fixed everything and now it works really great.
OrbitLens Devlog #8: Scaling the 3d globe and some other stuff In the last update, i finally implemented the 2d map so this time i want to take this website a step further since the foundation is stable enough. I decided to go from tracking 5 hardcoded satellites to over 16,000 space objects. Here is what i changed, how i changed it and the challenges i faced: Change 1: Originally, i just added the starlink satellites to what i already had which was my initial goal. but the thing was, i was requesting the API for thousands of satellites, which did work once and all of them were stored in localStorage but for ‘testing purposes’ (i was just stupif), i cleared the localStorage and re-requested the TLE which it then instantly rejected cus of its ‘anti-bot firewalls’ and i got ip banned for like a couple of hours and it gave a 403 error aswell. To fix this, i read some CelesTrak documentation and i realised that there is a way to ismply request all the satellite (every satellite that it had) data in one request. Apparently there was a special search query (‘active’) that i could’ve used but instead i individually fetched everything. So once i used that query, i got all of the satellitse (a bit more than 16000) rendered on the earth but it was laggy, which leads to my second change. Change 2 To fix this massive lag caused by the 16000+ satellites, I completely replaced the standard 3D mesh pipeline with THREE.InstancedMesh so that instead of creating 16,000 individual sphere objects (which would like instantly crashes the browser), i can feed the GPU a single geometry and material, along with an array of 16,000 matrixes. That means now the gpu like renders everything in one go. But, I hit a massive 5-second freeze whenever a user clicked the ISS (which makes sense cus this was a 4k extremely detailed 3d model). The thing was, WebGL delays uploading heavy 3D textures to the GPU until an object is actually rendered on screen. And because the ISS model was hidden on startup, the compiler skipped it, so the website was stuck trying to render it when i selected the ISS. I solved this by forcing the renderer to draw one “dummy frame” with all models visible during the loading screen, which, in a sense, ‘warmed up’ the GPU. Change 3: The lag was better but it was still there and i realised the problem was that each of the dots representing a satellite were smoothly moving in space. This smooth-moving physics applied to over 16000 dots was what slowed down the website. To fix this, I rewrote the loop that propogates the satellite dots so physics calculations wouldn’t choke the main JavaScript thread. To do this i built a system to process the satellites in batches of 4,000 satellites per frame instead of all 16,000. Second, i scrapped geodetic trigonometry (latitude/longitude conversions; see one of the earlier devlogs) and replaced it with direct Earth-Centered, Earth-Fixed (ECEF) 3D vector rotation. Initially, our batches were too small, causing satellites to visually ‘teleport’ instead of smoothly gliding, which looked really glitchy. But by upgrading to matrix rotation, i managed to get a huge increase in speed. This allowed me to crank the batch size up and get that smooth motion across the entire thing. Change(s) 4: There were still some small bugs in the visual aspects like the dots disappearing or the transition jump (see previous devlog(s) to understand) and stuff but i took care of them.
OrbitLens Devlog #9: implemented satellite filtering + earth connecting line and complete UI overhaul Now that the website has a proper engine and everything was working well, i decided to add some more stuff. I had two goals for this session. One was to add a satellite filtering option where the user can filter categories of satellites. The other is to change the ui because there were many imprefectoins. Here is a breakdown of what i changed and the challenges i faced: Change 1: I added a global filtering system to fiter satellites by categories. To do this i first built a string-matching engine directly into the TLE parsing loop. As the engine downloads the TLE data from the API, it scans the satellite names and tags them each with categories. I didn’t really know what to categorise them so i thought of some categories and i asked ai to think of some categories. These are the categories: Starlink Oneweb Comms Navigation Weather and Other/Miscallaneous (which i impemented later; read below) I then wired the HTML dropdown directly into the WebGL gpu loop. Instead of deleting unselected satellites (which would take up too much gpu memory), the gpu simply multiplies their matrix scale to 0, 0, 0, which would just hide them. But there was a challenge that i faced, though it wasn’t a big one. When i first implemented the filter, I noticed that the total satellite count dropped to around 12,000. It turned out that all the satellites that didnt fit into any cateogry were not shown at all so i expanded the categories to include an OTHER category. I also had to make some changes in the raycaster or the users would accidentally be clicking on the hidden satellites. Change 2: I also added a line connecting the selected satellite directly to its exact spot on the Earth’s surface directly beneath it. I did this by first pre-allocating a THREE.BufferGeometry with exactly two vertices. Inside the animation loop, i then took the satellite’s live 3D coordinates and use a .normalize() math function. Because the Earth has a radius of exactly 1, normalizing the 3d coordinates perfectly attaches the bottom of the line to the planet’s surface. But, i ran into a bug where the line would randomly disappear depending on the camera angle. After some research (ai) i found out that this was caused by Three.js’s “Frustum Culling.” The code calculated the line bounding box once when the websited started up and when the camera moved away from that initial box, the gpu assumed the line was out of sight and stopped rendering it to save memory. So i just added a line of code ( frustumCulled = false ) that just overrode that. Change 3: Lastly, i essentially completely rewrote the styles.css to change how the ui looked cus i didn’t relaly like how it looked before. So this was the third change.
OrbitLens Devlog #10: mobile layout implementation + better loading screen I am nearing the first ship of this project so this session were just about the final aspects that needed to be improved Change 1: I completely changed the loading screen. Firstly, it now displays the loading percentage that accurately shows the real time progress. Secondly, overall it just looks much better. Thirdly, i also implemented an error notification in the main dashboard in case the API doesnt work and so the website doesnt look like it’s broken Change 2: I added a mobile layout option. by that i mean that if the user is accessing this website on a mobile, it won’t be completely botched (hopefully) p.s. i know this devlog isnt that detailed as my previous ones and that’s because there isn’t much to talk about in this session cus the main changes were in the styles.css (and i’m hella tired)
OrbitLens Devlog #11: Semi-final changes In this session, i focused on finding small aspects that need to be improved and improved them. Change 1: Firstly, i realised that the dropdown i had implemented was the default dropdown and it didn’t rlly fare well when there were 16000 items to choose from. So i made a custom dropdown, which looks much better than the default one, and made a funciton along with it that shows like the first 200 items matching the search query or, if nothing in being searched, the first 200 items in the list that the API gave. This made the entire experiene so much better because the default dropdown looked kinda ugly cus it took the whole length of the screen. Normally, this wouldnt take too long but i accidentally deleted the wrong eventListeners multiple times because satFilter and satSearch were so similar. So i spent like a good amount of time trying ot find the problem, and it turned out that i justmodified or deleted the wrong thing. Change 2: I found a problem with the filtering system, more specifically in filtering the space stations. Previously, i just had all the satellites with ISS or CSS in their names classified as space station because there are only two space statoins in space right now (ISS and Tiangong) so i filtered any satellites with those two names. But i failed to take into account that other satellites might also have ISS or CSS in their names so instead of two satellites showin up, 16 satellites were avaialbe in that filter. And these were not space stations but rather other statellits which had like ISS or CSS in their names (e.g. Swisscube). So i changed the filter to filter the space stations by their respective NoradIDs, which worked. Change 3: This change wasnt too big; i modified the expanded map layout becaues how it was before led to it having a lot of blank space and probalby wouldnt have looked good in differnet devices.
OrbitLens Devlog #12: Added README.md and ARCHITECTURE.md In this session, i added the README and ARCHITECTURE.md. The README.md highlights the basic features of the website, the tech stack used and how to run this project locally. The ARCHITECTURE.md goes deeper into how the code itself works so anyone perusing it can get a better idea on how i built this project.
OrbitLens Devlog #13: fixing deployment bugs 😭😭 Before i continue with this devlog, let me start by saying that modern security rules are the worst. Like istg, why do they have to be so strict? Anyway, you’ll see what i mean by that down below. THis session was all about fixing the deployment bugs. I was almost done and then these f bugs ruined it. This devlog has only abt 30 mins logged because i had the help of ai to fix this because this was way way out of my expertise. Here are the changes. I used ai for this devlog though cus i didn’t understand what it did (but i only used it for htis devlog): Problem 1: The [UNSUPPORTED_FEATURE] Vite Crash My very first Vercel build crashed immediately with a “Top-level await is currently not supported with the ‘iife’ output format” error. Apparently, the satellite.js library I use for SGP4 orbital propagation runs heavy calculations using Web Workers and WebAssembly. By default, Vite tries to bundle everything into an older iife format for maximum browser compatibility, which completely choked on the newer await feature inside the worker file. I fixed this (with the help of ai) by explicitly telling Vite’s internal bundler (Rolldown) to output modern ES modules for both the main thread and the background workers. I created a vite.config.js file and updated the configuration (see vite.config.js in the github repo) Problem 2: 404 Missing 3D Models After fixing the build, the site successfully deployed, but my 3D models (like the ISS and Hubble) and Earth textures threw 404 Not Found errors in the console. Because I was loading these assets while the app was running in my Three.js code using string paths (e.g., ‘/models/iss.glb’), Vite didn’t know they existed and simply excluded them from the final production build. I moved my models and textures folders into Vite’s public directory. Anything placed in the public folder gets copied exactly as is to the root of the final build. This bug wasn’t too bad but the next one was absolute hell. Problem 3: API, Cloudflare and CORS block This was the hardest part. Orbit Lens fetches live Two-Line Element (TLE) data for over 16,000 satellites directly from CelesTrak. It worked perfectly when i hosted it locally, but on Vercel, the browser instantly threw a 403 Forbidden error. CelesTrak uses Cloudflare to prevent automated scraping. When Cloudflare saw an Origin header coming from a deployed Vercel frontend instead of an normaly IP like my computer’s, it blocked the connection. Attempts to use public proxies (like allorigins) resulted in 408 Request Timeout errors because the multiple mb big satellite data took too long to transfer. To fix this, I used Vercel’s Native Rewrites (i have no idea how to use this so i asked ai to do it for me). “I” ;) created a vercel.json file in the root directory to act as a silent backend proxy. By fetching from my own local route (/api/celestrak), the browser doesn’t trigger CORS security. Vercel’s backend intercepts the request, strips the frontend Origin header that was triggering the firewall, and routes the raw data back to the application. This worked! And the website is finally live and i am about to ship the project!
Ships:
This is Orbit Lens, a real-time 3D satellite tracking website built using vanilla JavaScript and Three.js. It tracks over 16,000 live space objects around earth using real-time data from CelesTrak. It has many features including 3d and 2d orbit tracking, 3d models of select satellites (ISS, Terra, HST, and Aqua). It also includes a filtering feature where you can filter satellites based on specific categories Before testing this project, it is important to know some stuff: You will have the best experience if you access this through a laptop or desktop Sometimes, the api maybe down or is not responding to requests so please keep in mind that if you see an alert saying API not responding, it is out of the website’s hands and it an error outside of my control. That’s it. Thank you for testing this project and hope you like it :)...
|
1792979325.462264
|
1793065725.462264
|
|
1894
|
Boba Cats! by @Jewelia | Stardance
|
Jewelia
|
1
|
63.0
|
1069
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-09T20:19:28Z", "hours": 63.0, "multiplier": 17.55, "payout": 1069, "blessing": "neutral", "text": "Boba Cats! is a 2D adventure game about a cat’s quest to find the fabled brown sugar boba! After an entire summer of working on it, our team ( @graceyd , @kimeowsu , and I) are ready to present the first world of our game! This world takes place under the ocean! What might a cat be doing underwater, you might ask? You’ll see! 😉 The first world is fully playable, but the soundtrack and extra touches will be added in future versions! We hope you all enjoy the cute pixel art, fun platforming challenges, creative storyline, and easter eggs! You can play the game on the [itch app] ( https://itch.io/app ) or download it for Windows!", "repo": "https://github.com/graceyd1/Boba-Cats", "demo": "https://grassinabox.itch.io/boba-cats"}]...
|
[{"post_id": 44198, "ts": "202 [{"post_id": 44198, "ts": "2026-08-09T20:07:52Z", "hours": 3.2164, "text": "Quick devlog before shipping!! @graceyd and I had our sisters test the game, and we’ve been working on fixing some bugs this past week! File saving should be fixed now, as well as some issues with the miniboss and other minor visual bugs! Hope you enjoy the game! Ship coming right up —>"}, {"post_id": 39232, "ts": "2026-08-02T02:02:56Z", "hours": 11.4622, "text": "Today has been a rush to make final touches to our game! We hoped to be able to ship it today, but in favor of more thorough testing, we will probably end up shipping it later this week (hopefully tomorrow or the day after tomorrow or - 🤔 you get the idea right?) I’ve been working on the hidden pearls you can find in-game, as well as name labels to text boxes so it makes it easier for players to remember who is who! As for what the pearls do…I’ve taken a long time to work on that too! But you better come play our game to find out what they actually do 😉 if you can find them in the first place, that is! A couple hours were also spent adding major dialogue changes to one of the major plot points! We’re hoping with the new changes that the story will have more character depth and be more memorable for players! That’s it for now ~"}, {"post_id": 30183, "ts": "2026-07-17T15:31:42Z", "hours": 8.1886, "text": "As we near our final stage of completing the first world of our project, we are smoothing everything out as well as adding final touches and the last major additions such as the plant shop shown below (spoilers: it doesn’t sell you plants). I’ve smoothed out the camera movement in the miniboss arena and added a gate (as shown in the video). I’ve also had fun creating the UI for a multiple file save system and inventory! That’s it for now!! (If we’re not counting some stuff that would be better for you to experience when you actually play the game 😉😉)"}, {"post_id": 28367, "ts": "2026-07-14T16:12:56Z", "hours": 4.3056, "text": "We’ve been wrapping this game’s first level up, with some fixes and tweaks here and there, and adding the final cutscenes such as the one in the video! Aanddd….we might be getting a soundtrack from a special someone 😉"}, {"post_id": 25283, "ts": "2026-07-09T13:51:28Z", "hours": 11.0194, "text": "We’ve made a lot of progress on Boba Cats! Nearly all the rooms are added and we are close to finishing up the dialogue and story line! Thanks to @kimeowsu ’s amazing art and creativity and @graceyd ’s awesome coding and dedication, we hope to be able to ship the first level of our game very soon, so stay tuned!"}, {"post_id": 18439, "ts": "2026-06-29T16:24:00Z", "hours": 5.835, "text": "Dialogue and Story!! We’ve started to add the plot in the form of dialogue to our game, which we have decided to name Boba Cats! In order to get their ship fixed, the player must find brown sugar boba…but at what cost?"}, {"post_id": 14784, "ts": "2026-06-24T00:51:46Z", "hours": 3.7164, "text": "We got the underwater city art in by @kimeowsu !! Doesn’t it look amazing? 😍 I worked on the scene changes, which allow the player to go back and forth between rooms. Tell me why forwards scene changes took like 10 minutes and backwards took 2 and a half hours… at least it finally works!! 🥳 😅 🐈"}, {"post_id": 12215, "ts": "2026-06-19T22:47:01Z", "hours": 4.2386, "text": "We’ve moved on to ✨THE BIG BAD BOSS✨ of our underwater level: The SEA BUNNY. @graceyd and I worked on coding the bunny @kimeowsu drew. It can shoot bullets from its fur and launch a mad dash attack you can try to dodge! Who knew bunnies were so dangerous and…huge? 🫠 🧨 🐰"}, {"post_id": 11029, "ts": "2026-06-18T01:51:21Z", "hours": 3.1744, "text": "Oh yeah, that bomb that’s not supposed to explode and yet yeets you halfway across the screen? It’s not a bug……it’s a feature 😉 😎 😏"}, {"post_id": 7039, "ts": "2026-06-11T19:59:55Z", "hours": 2.1142, "text": "We got art for the cave the player will enter after passing the underwater level!! 🥳 @graceyd and I worked on coding a flashlight that will grow a vine to allow the player to climb it and reach the cliff! Enjoy the video 😊"}, {"post_id": 5996, "ts": "2026-06-10T01:39:28Z", "hours": 3.9172, "text": "Updates: We got some art by @graceyd ’s sister imported in! We’ve a few steps closer to creating an actual 2D scrolling game with the implementation of a camera to follow the player and factors in the environment (like fish and coral tubes!) that damage the player’s health. Video’s a bit laggy because my computer decided to be slow today XD but hope you enjoy!! Will bring more updates soon :D"}, {"post_id": 1637, "ts": "2026-06-03T19:22:49Z", "hours": 2.1739, "text": "@graceyd and I expanded on the coral tubes in our game by adding timers to make them turn off and on! When turned on, the tubes will suck the player in and cause damage in the future :C"}]...
|
Title: Boba Cats! by @Jewelia | Stardance
Devlogs Title: Boba Cats! by @Jewelia | Stardance
Devlogs:
@graceyd and I expanded on the coral tubes in our game by adding timers to make them turn off and on! When turned on, the tubes will suck the player in and cause damage in the future :C
Updates: We got some art by @graceyd ’s sister imported in! We’ve a few steps closer to creating an actual 2D scrolling game with the implementation of a camera to follow the player and factors in the environment (like fish and coral tubes!) that damage the player’s health. Video’s a bit laggy because my computer decided to be slow today XD but hope you enjoy!! Will bring more updates soon :D
We got art for the cave the player will enter after passing the underwater level!! 🥳 @graceyd and I worked on coding a flashlight that will grow a vine to allow the player to climb it and reach the cliff! Enjoy the video 😊
Oh yeah, that bomb that’s not supposed to explode and yet yeets you halfway across the screen? It’s not a bug……it’s a feature 😉 😎 😏
We’ve moved on to ✨THE BIG BAD BOSS✨ of our underwater level: The SEA BUNNY. @graceyd and I worked on coding the bunny @kimeowsu drew. It can shoot bullets from its fur and launch a mad dash attack you can try to dodge! Who knew bunnies were so dangerous and…huge? 🫠 🧨 🐰
We got the underwater city art in by @kimeowsu !! Doesn’t it look amazing? 😍 I worked on the scene changes, which allow the player to go back and forth between rooms. Tell me why forwards scene changes took like 10 minutes and backwards took 2 and a half hours… at least it finally works!! 🥳 😅 🐈
Dialogue and Story!! We’ve started to add the plot in the form of dialogue to our game, which we have decided to name Boba Cats! In order to get their ship fixed, the player must find brown sugar boba…but at what cost?
We’ve made a lot of progress on Boba Cats! Nearly all the rooms are added and we are close to finishing up the dialogue and story line! Thanks to @kimeowsu ’s amazing art and creativity and @graceyd ’s awesome coding and dedication, we hope to be able to ship the first level of our game very soon, so stay tuned!
We’ve been wrapping this game’s first level up, with some fixes and tweaks here and there, and adding the final cutscenes such as the one in the video! Aanddd….we might be getting a soundtrack from a special someone 😉
As we near our final stage of completing the first world of our project, we are smoothing everything out as well as adding final touches and the last major additions such as the plant shop shown below (spoilers: it doesn’t sell you plants). I’ve smoothed out the camera movement in the miniboss arena and added a gate (as shown in the video). I’ve also had fun creating the UI for a multiple file save system and inventory! That’s it for now!! (If we’re not counting some stuff that would be better for you to experience when you actually play the game 😉😉)
Today has been a rush to make final touches to our game! We hoped to be able to ship it today, but in favor of more thorough testing, we will probably end up shipping it later this week (hopefully tomorrow or the day after tomorrow or - 🤔 you get the idea right?) I’ve been working on the hidden pearls you can find in-game, as well as name labels to text boxes so it makes it easier for players to remember who is who! As for what the pearls do…I’ve taken a long time to work on that too! But you better come play our game to find out what they actually do 😉 if you can find them in the first place, that is! A couple hours were also spent adding major dialogue changes to one of the major plot points! We’re hoping with the new changes that the story will have more character depth and be more memorable for players! That’s it for now ~
Quick devlog before shipping!! @graceyd and I had our sisters test the game, and we’ve been working on fixing some bugs this past week! File saving should be fixed now, as well as some issues with the miniboss and other minor visual bugs! Hope you enjoy the game! Ship coming right up —>
Ships:
Boba Cats! is a 2D adventure game about a cat’s quest to find the fabled brown sugar boba! After an entire summer of working on it, our team ( @graceyd , @kimeowsu , and I) are ready to present the first world of our game! This world takes place under the ocean! What might a cat be doing underwater, you might ask? You’ll see! 😉 The first world is fully playable, but the soundtrack and extra touches will be added in future versions! We hope you all enjoy the cute pixel art, fun platforming challenges, creative storyline, and easter eggs! You can play the game on the [itch app] ( https://itch.io/app ) or download it for Windows!...
|
1792983329.0834324
|
1793069729.0834324
|
|
44701
|
StudyBuddy by @Vedant_Daga | Stardance
|
Vedant_Daga
|
2
|
76.0
|
1064
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-12T03:35:26Z", "hours": 23.0, "multiplier": 18.54, "payout": 436, "blessing": "neutral", "text": "StudyBuddy - https://trystudybuddy.vercel.app fyi before u try it: reading runs on a free model with a shared daily cap, and ship day is way more traffic than a normal day. please use the sample worksheets wherever u can (they’re the first thing on the upload page, one click) and upload at most one of ur own pdfs for the next day or two. if the homepage says the free reads are used up, the samples still work. what it does upload a worksheet pdf. it reads every question off the page, tags each one by topic, and works out the answer key. u mark which ones u got wrong and it brings them back on an FSRS schedule (the algo anki uses). across every test u upload it turns “i got 12 wrong” into “ur bad at ratios”. what changed since last time runs on openrouter’s free tier instead of my gpu. not a proof of concept anymore one worksheet is ~4 requests instead of ~42. pages are read in groups the site says when the day’s free reads are running low. clear about the trial: 3 worksheets free, then still free, u just add questions by hand or plug in ur own key. what was hard free models reason before they answer and bill that against the output limit which ends up causing an error, but its really hard to figure out the embedding-only shortcut for sorting looked fine and was wrong a third of the time so fixed it", "repo": "https://github.com/DagaVedant/StudyBuddy", "demo": "https://trystudybuddy.vercel.app/"}, {"ship_num": 2, "ts": "2026-08-19T19:30:17Z", "hours": 53.0, "multiplier": 12.7, "payout": 628, "blessing": "neutral", "text": "StudyBuddy Turn the worksheets you have already done into a record of what you actually know. Try it: https://trystudybuddy.vercel.app Code: https://github.com/DagaVedant/StudyBuddy What I made Upload a worksheet you already finished, as a PDF or photos. A vision model pulls out every question, its options and its answer key. You mark what you got wrong. That is the only input it needs. It sorts questions into 87 topics across SAT and competition maths. Then it ranks your weak areas and schedules revision using FSRS, the algorithm behind Anki. It also writes practice questions on your weak topics and exports misses to Blooket. Built on my own past papers: 387 real questions from 22 worksheets. What was challenging The models can run in four places: my GPU, your API key, your own Ollama, or not at all. A student with a GPU should never send homework to my server. A student with nothing should still get something. Topic tagging needs an embedding model that serverless hosting cannot run. So the shortlist is a pgvector query on the server and the vector is computed anywhere, including in your browser under WebAssembly. Worst bug was three characters: I stored the global fetch on a class field, which passes the object as the receiver. Node allows it, browsers throw Illegal invocation. Every test passed and the only runtime that mattered was broken. What I am proud of It does not lie to you. Weak topics are ranked by a Wilson lower bound, not a raw percentage, so two unlucky answers cannot fake a weakness. Model-written questions are kept out of your accuracy, so the ranking cannot feed the questions it generates. Every model response is schema-checked before it reaches the database. Generated practice is sifted against thirteen specific failure modes. When my GPU is off, the upload screen says so instead of spinning. 1,459 unit tests, 84 end to end, 293 commits. How to test it Sign in with Google, or an email and password. Upload any worksheet you have already done. A past paper works well. Check what it read. Each question sits beside the page image it came from. Mark what you missed, then open the dashboard. The free trial reads three worksheets on my own GPU. If it is off, your upload queues and the app tells you. To skip the wait, settings takes your own API key or connects to Ollama on your machine. guys i wish this was markdown compatible but its not so sorry", "repo": "https://github.com/DagaVedant/StudyBuddy", "demo": "https://trystudybuddy.vercel.app/"}]...
|
[{"post_id": 66334, "ts": "202 [{"post_id": 66334, "ts": "2026-09-12T03:21:31Z", "hours": 3.7986, "text": "Devlog 24: StudyBuddy so a lot of the feedback said “cool but it needs ur gpu on”. that made it seem like a PoC, so now its running on the free tier of openrouter. making the free tier work one request per question was never going to fit a daily cap. extraction now sends up to 10 pages / 25 questions per call, sorting and answer key go 10 questions at a time. ~4 requests per worksheet instead of ~42 the homepage and upload page count the day’s calls. 80% says busy, 100% stops reading and points u at the samples. samples upload page leads with the three samples as one-click cards; ur own pdf is the second option and says how much of the shared allowance is used. removed phone photo uploads (highly innaccurate on the free tier of models i have)"}, {"post_id": 61499, "ts": "2026-09-04T13:23:50Z", "hours": 0.4864, "text": "Devlog 23 - StudyBuddy i just had some minutes left on this so im just making the devlog still waiting for my ship to be approved (been waiting a few days) no big changes at all (waiting for feedback)"}, {"post_id": 57722, "ts": "2026-08-29T23:49:06Z", "hours": 0.3544, "text": "Devlog 22 - StudyBuddy fixed more bugs and rewrote code by hand"}, {"post_id": 56688, "ts": "2026-08-28T15:28:49Z", "hours": 3.3164, "text": "Devlog 21 - StudyBuddy patched even more bugs rewrote tons of my code (ai to human) cleaned up old files (a lot of old features were removed and reupdated) just more QoL fixes"}, {"post_id": 55293, "ts": "2026-08-27T01:04:56Z", "hours": 0.7281, "text": "Devlog 20 - StudyBuddy more bug fixes continous reships (they keep saying its too AI generated even after i rebuilt the UI) started working on the API key integration (like almost there rn) tons of dead code removal and code clean up added support for firefox too (now it works on edge, firefox, chrome, and prolly a ton others i just havent really tested it)"}, {"post_id": 55212, "ts": "2026-08-26T19:29:14Z", "hours": 2.0147, "text": "Devlog 19 - StudyBuddy even more bug fixes so i pushed a change, and that somehow broke the entire pipeline so i patched it no real content just fixes going to add API key integration soon (follow to see it happen)"}, {"post_id": 54267, "ts": "2026-08-25T04:59:03Z", "hours": 1.3939, "text": "Devlog 18 - StudyBuddy lowk not a lot of content in this one but like 1000000 different bugs popped up and reviewers are pointing it out so thank you smmm ( @blowupthenoobs ur the goat) fixed the trials having no limit other fixes just check my commits"}, {"post_id": 53477, "ts": "2026-08-24T01:28:48Z", "hours": 6.445, "text": "Devlog 17 - StudyBuddy (ah im losing track of these devlogs uh my ship keeps getting rejected for look to AI, and ive literally rebuilt everything, removed all teh ai generated thing. (im gonna ship again rn) made a logo cuz i thought it would look cool added a Terms of Services page cuz its risky cuz people could upload worksheets they dont have access for an i could be fried so i made them agree to that cleaned up more code fixed a few more bugs"}, {"post_id": 51966, "ts": "2026-08-21T23:14:31Z", "hours": 0.5383, "text": "Devlog 16 - StudyBuddy added some sample worksheets so you can try it out added the borders back to the buttons because i accidently removed them before"}, {"post_id": 51893, "ts": "2026-08-21T19:51:51Z", "hours": 0.3522, "text": "Devlog 15 more cleaninggggggg cleaned up repo, removed more dead logic and stuff instead of a css wallpaper, i added a image of lined paper to really give that school/learning feel asked ai to help me get the ui to look kinda fresh and add the pencil style heading"}, {"post_id": 51715, "ts": "2026-08-21T15:23:46Z", "hours": 3.1414, "text": "Devlog 14 shipwrights rejected the project so im fixing their things decided to clean up the code, get rid of old functions, and i also cleaned up the UI because no one really needs the heading and then what it means, like i think you know that topics means topics and doesnt need a whole sentence after that. cleaned up the repo, got rid of ai generated code fixed a 500 error when uploading worksheets, cuz something happened and some linux kernel wasnt compaitble with the library i was using wrapped up my last few fixes lowk not a lot of new features, rather like fixes"}, {"post_id": 51288, "ts": "2026-08-20T20:55:12Z", "hours": 0.9239, "text": "Devlog 13 - StudyBuddy update the ui to make it look liek sticky notes and lined paper"}, {"post_id": 50557, "ts": "2026-08-19T19:22:57Z", "hours": 1.2472, "text": "ANYONE RATING THIS PROJECT - THE VIDEO ON THE SHIP IS OUTDATED, THERE IS ALSO ANOTHER FEW DEVLOGS SO CHECK THAT OUT BEFORE JUDGING BECAUSE IT GIVES MORE INFO ABOUT THE BUILDING AND WHY THE CHANGED A LOT SORRYYYY ALSO USE THE SAMPLE WORKSHEETS I ATTACHED OR EASILY PARSEABLE WORKSHEETS. TEMPORAILY IVE CLOSED THE API KEY VERSION AS MOST PEOPLE DONT HAVE THEM. COMPLEX WORKSHEETS ARE TO BE USED ONLY WITH LARGE LLM Devlog 12 - StudyBuddy got everything ready to ship turns out that ollama needed some permissions so fixed that and added it to readme for people to set up, and other stuff like that shipping it in 5 mins 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉"}, {"post_id": 49640, "ts": "2026-08-18T15:06:19Z", "hours": 3.8678, "text": "Devlog 11 - StudyBuddy this is a short one got the google sign in to work added email verification and forgot ur password thing cleaned up the overall UI made the topic tree standardized cleaned up some of the extraction issues added ollama integration for everyone added practice question generation, topic overview, etc tested everything fully the attached image is the app after a ton of testing *"}, {"post_id": 48576, "ts": "2026-08-17T00:58:42Z", "hours": 5.8406, "text": "Devlog 10 - StudyBuddy mostly the same bug wearing different clothes: a screen that exists, that u can get to, that quietly does less than it says tier C was sitting in settings doing nothing save an ollama address and the app resolves u to a browser executor. that executor had nowhere to go, so ur worksheet just sat there looking queued it claims the job now and reads each page against localhost:11434 , posting back through the same queue my gpu posts through has to run in the browser cuz a server cant reach ur localhost, so the tab stays open. checkpointed per page tho, closing it resumes instead of restarting the paper a mark u mis-tapped was permanent tap through 40 of these and ur going to hit the wrong one eventually that one tap feeds the FSRS schedule, the topic accuracy, the weakness ranking and the blooket export only way back was deleting the worksheet and uploading it again, which costs u a trial credit. so the fix for a mistap was paying for it two defences that were never on WORKER_ALLOWED_IPS was optional and empty meant no restriction empty is the state every deployment starts in, so the normal outcome was a defence thats off that nobody ever decided to turn off refused now. * still allows any address but somebody has to type it untagged worksheets looked identical to broken ones tier B cant auto-classify, the embedding model needs a native runtime the serverless host doesnt have so ur questions saved fine and were reviewable fine, they just had no topic and nothing said why. reads exactly like it silently failed every tier that can come back untagged says so now nothing told u when a worksheet finished u uploaded and then u guessed. sat on the status page or came back later and hoped in-app bell that needs zero setup, plus web push for a tab u closed also “Review these now” now reviews those questions. the word had drifted onto three screens meaning three different things dashboard was missing three of its panels, and the trend arrow was specified ages ago and never computed taxonomy had no front door and the subject panel only went one level deep. Math > Geometry > Triangles walks now pagination was capping at the fiftieth worksheet and saying nothing about it the AI setup prompt showed up after ur trial ran out, which is the one moment it cant help u grouped scripts/ by what it does to ur data. inspect/ reads, repair/ writes behind a guard, benchmark/ measures 1285 tests green. playwright hasnt run yet and app/ moved a lot this time, so thats next"}, {"post_id": 47159, "ts": "2026-08-14T20:52:31Z", "hours": 5.0856, "text": "Devlog 9 - StudyBuddy the merge tool could double up a question number renumbering the survivor of a duplicate pair used Math.min of just those two rows, blind to the rest of the paper merging a phantom #5 into a real #9 could hand the paper a second #5, the exact thing the tool exists to prevent zero tests on a function that deletes rows. five now, including the repro $15/hour was losing its sign, not just $5 the math-stripper runs from one $ to the next, so “earns $15/hour and $18/hour” reads the slash as a fraction and eats both signs. same with $40 = $25 + $15 on the = i wrote this down once as “one weird case.” it’s the whole unit-rate and equation category fix checks the char after the closing $ : a digit means it’s opening the next price, not real math figure crops didnt need a new pipeline, just reusing one filed as “never produced,” which reads like crop, store, backfill the verify screen already computes a crop window from the bbox over the stored page image. review got wired to the same math, every old worksheet gets it free the real work was the guards: zero-area, inverted, off-page, or no recorded page size all have to degrade to nothing rather than to the wrong crop a fence i built to be un-escapable, wasnt the comment says a new tag can’t be added without going through the escaping. page-seam work added two by typing them directly a page whose OCR contains the literal closing tag closes the fence early, and everything after reads as instructions instead of data tag list exists once now, every fence built from it every worksheets.status write was a bare UPDATE no guard on the current value, so a stale job retry could drag an already-reviewed worksheet back to failed one transitionWorksheet(from, to) now, every write through it preview deploys were migrating the prod database guard only checked VERCEL_ENV === 'production' , but previews fire on every push against one shared DATABASE_URL two finishing together were racing through the migration folder 9 tests could go quiet and nobody would know one e2e file, 12 tests serial in a single tab, everything past “verify” depending on a question a drag gesture created three tests earlier a drag regression silently skipped 9 unrelated tests instead of failing them api fixture, split the file, broke the drag on purpose to prove it. held the question list rendered all 114 cards for a screen that edits one at a time deferred a while back: virtualizing editable rows risks one unmounting mid-edit only one card can ever be expanded, so the risk surface is exactly one row virtualizes past 40 now, open row pinned into the rendered range wherever scrolling goes. typed into one at 60 questions, scrolled thousands of px away, still there, still focused, still holding the edit also profile save had devlog 4’s router.refresh() remount bug login rate limit skipped Auth.js’s own credentials endpoint ollama worker had no startup timeout and just hung worksheet text leaked into console logs on schema rejections review screen shipped every page’s OCR text on page-1 load admin console got merge, tree edit, queue, usage doc-count drift (third time), and a false-positive LaTeX check flagging real set notation as broken math"}, {"post_id": 46100, "ts": "2026-08-13T02:23:56Z", "hours": 3.2192, "text": "Devlog 8 - StudyBuddy im too lazy to have a full write up for this (watched spiderman tdy IT WAS REALLY GOOD) for each topic that a user gets wrong, a seperate model (gpt-oss:20b, sorry if i miswrote the model) gives a walkthrough of the topic also added missed questions to the csv export added a AI answer key system if the worksheet doesnt have one."}, {"post_id": 45521, "ts": "2026-08-12T02:04:02Z", "hours": 3.0014, "text": "Devlog 7 - StudyBuddy the drag box was broken in the real app. for months u upload a worksheet, u draw a box around question 1, it fills in. thats the whole manual editor, thats the whole free tier. and it didnt work. click through the app to get there and nothing responds. reload and its fine. four previous commits went looking for this. the test had a 24 line comment explaining why it was probably a test problem. it was not. elementFromPoint(100, 28) -> HTML elementsFromPoint(100, 28) -> [HTML] thats the browser saying nothing is at this pixel , for every pixel on the page. the cause was 8 view transition animations, 6 stuck running forever . one that never finishes sits in the top layer and covers everything. and its a pseudo element so it shows up in no ancestor walk and no element stack, which is why every previous investigation contradicted itself. bisected on clean builds: next flag react component result on on broken off on broken on off clean off off clean so its react’s <ViewTransition> , not next. three lines of css. the drag test used to fake the mouse with dispatched events, now it uses a real one, which is the only thing that proves anything. gemini has never completed a single request 4 providers in settings. one says “has a free tier worth starting on”. zero successful calls, ever. every nullable field is anyOf: [{type:'x'}, {type:'null'}] gemini doesnt understand anyOf , so a filter strips keywords it rejects the filter dropped anyOf and left {} behind, while leaving the field in required a required field with no type = rejected request. every time funny part: the allowlist already had nullable in it, gemini’s own word for the same idea. someone knew. nothing connected them. the landing page was lying about 3 of its 4 topics theres a comment above them saying “kept honest on purpose: these are real taxonomy names” . Ratio & proportion - not real Linear equations - not real Reading inference - not real Vocabulary in context - real so the one claim the page made about its own honesty was the false one lol. theres a test now instead of a comment. tests found 2 bugs i wasnt looking for new Date(\"sometime in 2010\") returns jan 1 2010, cuz v8 scrapes a year out of almost anything. and it parses as local midnight while everything next to it is UTC. on a 13th birthday thats the whole question one route answered 404 to someone with no session. the client sends u to sign in on a 401 and brings u back after, so a tab that sat open till the session expired just ate what u typed the rest a reload could cost u a 114 question paper. markup saves nothing till every question is marked, so its a local draft now / , /signin , /signup are static html now. the topbar called auth() from the root layout, which made all 39 routes render per request the 23mb embedding model was getting fetched inside a background task on every cold start, and failing silently one commit recorded 32 renames and none of the code . the git add failed and i’d redirected the error away so i never saw it"}, {"post_id": 44852, "ts": "2026-08-10T21:45:18Z", "hours": 1.3739, "text": "Devlog 6 - StudyBuddy u can throw everything u got wrong into blooket now button on the dashboard for the whole account, and one per worksheet if u only want that paper it gives u a file, u upload it to blooket, u get a set of exactly the questions u missed wrong means ever wrong, not currently wrong. if u got it wrong on paper and then right in review, its still in there. thats the one u actually want to drill and it wouldve been weird to leave out blooket hands u an .xlsx template so everyone calls this an xlsx export, but its uploader only accepts csv. took a while to work out also its importer just silently imports nothing if the file is slightly off. no error, no warning, zero questions. three separate ways to trip that picking a subject barely did anything theres a dropdown on upload for what subject the worksheet is. it offers things like “Algebra 1” only the first bit of that was ever used, so picking Algebra 1 searched all of high school maths. exactly the same as picking “all of high school maths” the one control u have over how ur questions get sorted, doing basically nothing long papers were quietly losing questions to a limit the topic tagger takes questions 100 at a time. fine except it grabbed 100 in no particular order and then removed the ones already done, so on a 114 question paper 14 never got looked at, and which 14 was down to whatever the database felt like that day worse on a second pass: if 100 were already tagged it handed back an empty list, which reads as “nothing left to do”, and the rest never got tagged at all two screens counting the same paper differently the worksheets page filters out page junk like “CONTINUE TO THE NEXT PAGE” before counting. the dashboard didnt so the same worksheet was 25 questions on one screen and 26 on the other, and nothing tells u which one is lying the chart was lying about time the accuracy chart draws a bar per week. it was only making bars for weeks u actually did something in so 12 bars looked like 12 weeks in a row but werent. practise in march and again in june and u see two bars side by side like it was steady every week is a bar now, empty ones included, and it says which weeks its showing scrolling changed my settings without me touching anything the page range and question count boxes were number inputs, and number inputs treat the scroll wheel as a way to change the value so scrolling down the upload page with ur cursor over one of them silently rewrote which pages get read found a pile of other accessibility stuff while i was in there: buttons a bit too small to reliably hit on a phone, cards that vanish in high contrast mode, and a “skip to content” link that didnt actually skip anything also asking to see an explanation u already had was using up ur hourly limit for generating new ones the topic picker was built in a way that made screen readers think the list had nothing in it button labels were half Title Case and half sentence case, sometimes on the same screen"}, {"post_id": 44789, "ts": "2026-08-10T20:01:20Z", "hours": 1.8522, "text": "Devlog 5 - StudyBuddy “accept the remaining 114” checked none of them that button fires one save per question, and on my test paper thats 114 of them at once nothing read the answers back, so a save that failed looked exactly like one that worked the tick stayed on, u moved to the next screen, and it was never stored deleting a question said “Saved” and then didnt delete it delete waits a few seconds so u can undo it. it dropped the question from the list first and threw away whatever came back from the server so if it failed u got told it saved, and the question showed up in ur study queue later like nothing happened also there was no undo button anywhere. it was just a slow delete $5 was being eaten maths sometimes comes wrapped in dollar signs so i strip them off. money also comes wrapped in dollar signs “Sam has $5 and Ana has $12” was being read as “Sam has 5 and Ana has 12” checked a real saved question and yep. paper says $5, database said 5 if my worker died, ur worksheet said “queued” forever the machine that reads the pages runs at my house. if it fell over mid job, nothing anywhere ever marked that job as failed it just sat there, and the free credit it charged u never came back the topic tagging could fail without failing it needs a bit of software thats not always there on the server. when it wasnt, it came back with “no matches” which is a completely normal answer. so the job finished, every question was untagged, ur weak areas page was empty, and nothing anywhere was an error one i was told to do and didnt had a note to cap the page number by how many pages the worksheet has except if u upload pages 10 to 15 of a pdf thats six pages numbered 10 to 15, so that check refuses every single one of them capped the two things separately instead also the screen asking u to check questions against the page never showed the page finishing a review session stopped saying u finished it the AI could print its own error onto ur status page, which sometimes meant quoting ur own worksheet back at u the upload checked the image size by asking the browser instead of opening the image"}, {"post_id": 44684, "ts": "2026-08-10T16:42:14Z", "hours": 2.2806, "text": "Devlog 4 - StudyBuddy no new features today. just went hunting for stuff that was quietly broken, and there was way more of it than i expected the sign-in page could send u to a different website if someone handed u a link like /signin?next=someothersite.com , u would log in and then land on their page immediately after typing ur password, which is about the worst possible moment for that to happen this one went first there was no limit on login attempts i had limits on signing up and on uploading. somehow not on the actual password box so u could sit there and guess forever getting blocked now looks identical to just getting the password wrong. telling someone “too many attempts” quietly confirms the account exists file storage was writing into the void if one setting went missing it silently saved ur page images somewhere that doesnt survive on the server uploads said they worked. returned a success. images just gone nothing errored anywhere, which is why it sat there so long now it refuses to start up at all instead of pretending everything is fine i almost broke my whole test suite fixing something unrelated locked down two internal-only routes with what seemed like the obvious check except my tests run against a production build, so that check wouldve locked the tests out too caught it before it shipped, then wrote a test explaining it so future me doesnt helpfully undo it added security headers and instantly caught myself put them in report-only mode first so nothing could actually break about 40 seconds later it flagged a script that my own analytics loads the strict version wouldve blocked it in prod. i absolutely wouldve shipped that one fix i deleted instead of shipping had a note to add another check to the duplicate-question detector actually tested it against real papers first, and it turns out it can never trigger. the answers on a maths paper are just “4” and “9” and stuff, way too short for it to match on wouldve quietly made things worse all tests green at the end of it. onto the next pile"}, {"post_id": 44340, "ts": "2026-08-10T01:14:54Z", "hours": 6.0992, "text": "Devlog 3 - StudyBuddy wrote a script that reads each papers own answer key out of the source pdf and diffs it against my database. so the paper grades me instead of me grading myself. those 14 sheets scored 1 of 14 the first time i pointed it at them. tonight theyre 14 of 14 . barely any of it was the model. one paper stored 8 of its 15 questions. the model had read all 15 the log said dropped 6 unreadable question(s) . a count. no reason. it said that for two days made it print which field rejected the question and it told me on the first run: choices.0.label: Too big: expected string to have <=8 characters answer labels are capped at 8 chars, but the cap runs before the function that shortens them. that function only exists cuz the model returns A. 60 instead of A so the cap was checked against exactly the thing the transform was written to fix. coordinate geometry paper, every option reads A. (-2, 3) , ten chars, binned a count with no reason cant tell u “model returned garbage” from “ur schema is stricter than the paper” and those have opposite fixes also 44 duplicate-answer flags, every one wrong: -2 and 2 both normalised to 2 lol. on a maths paper the sign IS the question."}, {"post_id": 43025, "ts": "2026-08-08T02:19:09Z", "hours": 0.3111, "text": "if any of you guys wanna try this out here is the link: https://trystudybuddy.vercel.app/ YOOOOO WE GOT OUR FIRST FEW USERS i just checked before sleeping and yo we have 14 worksheets in the processing queue right now i wonder how much we had before THANK YOU GUYS"}, {"post_id": 42970, "ts": "2026-08-07T23:33:19Z", "hours": 5.2603, "text": "Devlog 2 - StudyBuddy HERE IS THE LINK TO TRY IT ( https://trystudybuddy.vercel.app/ ) left a pile of worksheets extracting overnight cuz i was sick of testing every fix against the same two papers. woke up to 9 worksheets, 713 questions, 353 pages everything below only shipped after i swept it over all of that first. rule i have now, after two earlier “fixes” that read perfectly and were wrong on real data a question that shipped reading ?rac{44}{11} i tell the model to write plain text. it writes LaTeX anyway sometimes that fails loudly. \\sqrt isnt a valid JSON escape so the response explodes and i lose a page. thats fine?? at least i know the other half is the problem. \\f is a form feed and \\t is a tab, both totally valid , so \\frac{44}{11} parses perfectly and quietly becomes a form feed followed by rac{44}{11} i had an AMC8 question in my database reading ?rac{44}{11} and nothing anywhere reported a problem fix has to run before the first parse , not in the catch block, cuz the version that actually hurts u never throws it doubles the backslash on letter runs JSON would misread, but only the six that collide (b f n r t u) and only when the run spells a real command. otherwise a real line break stops being a line break, which is a fun way to make things worse questions torn in half by the page break extraction reads one page at a time and never sees the page before or after. so a question ending at the bottom of page 3 with its answer choices at the top of page 4 is never whole in either request . five of them on the AMC8 paper one fix folds the halves back together. the other is for the worse case where the extractor returned nothing at all for the second half, cuz a bare block of answer choices isnt a question so the model just drops it. theyre still sitting in the next pages text layer tho, u just have to go get them sorting questions within a page needed its own module cuz the bounding boxes lie . question 4 came back with a top of 1428 and question 5 with 1379, so pure geometry puts them backwards AMC8 went from 19 of 25 questions having their answer choices to 24 of 25 , zero false positives across 348 SHSAT pages stuff that broke a worksheet told me it had 26 questions when the paper has 25 . the extra one was the axis labels off a diagram, and the SHSAT ones had rows that just said CONTINUE TO THE NEXT PAGE. dropped 23 rows, all page furniture then immediately shipped a followup bug where the card read “Questions 25” next to “Unchecked 26” cuz i filtered one count and forgot the other one lol tried just asking the model to return a carried answer block as half a question. produced zero of them and started relabelling stem-only questions as free response, which hides the damage from every check i have. reverted the landing page every animation was gated behind prefers-reduced-motion , which sounds responsible until u find out some managed windows installs ship with animation effects off by default . so the page whose whole job is showing the product working was showing a static screenshot the hero panel gets dealt onto the page like a card now. needs a perspective on the parent or the rotations collapse into a shear and it just looks like a slide the forgetting curve draws itself left to right. stroke-dashoffset does not work here , pathLength is silently ignored under vector-effect: non-scaling-stroke so the dash tiles across the path instead of spanning it once. and i need non-scaling-stroke or the line renders 9x too thick . used a page-coloured shutter instead next things: that one AMC8 question needs reading off the page image since the text layer doesnt have it. and theres a cheaper reduced-motion compromise i wrote down but havent built."}, {"post_id": 42187, "ts": "2026-08-06T20:02:11Z", "hours": 13.8281, "text": "Devlog 1 - StudyBuddy so ive been doing SHSAT practice tests for a while and the thing that always got me is that after i mark one, i have like 20 wrong answers and no idea what to actually do with that info . like ok i got 12 questions wrong, but am i bad at geometry or did i just misread three questions? no clue. so id end up redoing entire sections i was already fine at. basically what im building is a web app where u upload a worksheet or a practice test (pdf or even just a photo of the page) and it reads every question off it, figures out what topic each one is, and then after u mark which ones u got wrong it schedules them to come back later using FSRS (same spaced repetition algo anki uses). the thing that makes it diff from just writing ur mistakes in a notebook is that it tracks topics across every test u ever upload . one test says nothing. five tests and it can actually tell u “ur bad at ratios” with a straight face. the AI runs on my own laptop i did not want to pay for an api. so the vision model that reads the pages runs on my own rtx 5080 . it sits at home and asks the deployed site for jobs, and it only ever dials outward so theres no port open on my home network. if my laptops off, uploads just queue instead of dying. the part i was most wrong about i picked the model i was using (qwen2.5vl:7b) literally because it was the first one i pulled . thats the whole reason. so i finally benchmarked it properly, 9 models on a real 58 page shsat paper, 114 questions . the one i already had won?? the 27b model is 4x bigger, scored 6 points WORSE , and took 183 seconds per page vs 7.8 . id been assuming for weeks that upgrading would fix my accuracy problems lol. also the grading was free which i was way too happy about. every question number 1-114 shows up exactly once on the paper so the test just grades itself , i never labelled a single page by hand. the bug that was actually my fault so when i looked at WHICH questions got missed they werent random, they came in chunks . one model dropped 17 questions in a row . turns out every single miss on every model was a page that came back completely empty . not a wrong answer. nothing. and that was my bug not the models . an empty reply gives 0 questions and no error, so my checker (which only looked for gaps in question numbering) saw nothing wrong and the upload said success while a whole page just quietly disappeared . fixed with one retry at a slightly higher temperature cuz a model that decided to output nothing will decide that again if u ask it the exact same way. stuff that broke i wrote a check to catch questions that got cut off mid sentence (flag anything not ending in punctuation) and it flagged 25 out of 114 questions on a CLEAN run . all wrong. turns out shsat questions end with like “by” or “through” all the time and the answer choices finish the sentence. fixed it and it changed literally zero outcomes so the rule was doing nothing the whole time. also added rate limiting and instantly locked myself out of my own test suite , which signs up way more than 5 times an hour from localhost. also deleted my entire email system . u need a domain u own to send emails (spf/dkim records) and a free .vercel.app subdomain cant do that. so instead of buying a domain i deleted 274 lines and made google sign in the front door. next things: tier B uploads dont get topic tags yet, and theres one test failing on purpose cuz FSRS says a question u just got wrong is due in 1 minute but i think it should be due immediately. gotta pick one."}]...
|
Title: StudyBuddy by @Vedant_Daga | Stardance
Dev Title: StudyBuddy by @Vedant_Daga | Stardance
Devlogs:
Devlog 1 - StudyBuddy so ive been doing SHSAT practice tests for a while and the thing that always got me is that after i mark one, i have like 20 wrong answers and no idea what to actually do with that info . like ok i got 12 questions wrong, but am i bad at geometry or did i just misread three questions? no clue. so id end up redoing entire sections i was already fine at. basically what im building is a web app where u upload a worksheet or a practice test (pdf or even just a photo of the page) and it reads every question off it, figures out what topic each one is, and then after u mark which ones u got wrong it schedules them to come back later using FSRS (same spaced repetition algo anki uses). the thing that makes it diff from just writing ur mistakes in a notebook is that it tracks topics across every test u ever upload . one test says nothing. five tests and it can actually tell u “ur bad at ratios” with a straight face. the AI runs on my own laptop i did not want to pay for an api. so the vision model that reads the pages runs on my own rtx 5080 . it sits at home and asks the deployed site for jobs, and it only ever dials outward so theres no port open on my home network. if my laptops off, uploads just queue instead of dying. the part i was most wrong about i picked the model i was using (qwen2.5vl:7b) literally because it was the first one i pulled . thats the whole reason. so i finally benchmarked it properly, 9 models on a real 58 page shsat paper, 114 questions . the one i already had won?? the 27b model is 4x bigger, scored 6 points WORSE , and took 183 seconds per page vs 7.8 . id been assuming for weeks that upgrading would fix my accuracy problems lol. also the grading was free which i was way too happy about. every question number 1-114 shows up exactly once on the paper so the test just grades itself , i never labelled a single page by hand. the bug that was actually my fault so when i looked at WHICH questions got missed they werent random, they came in chunks . one model dropped 17 questions in a row . turns out every single miss on every model was a page that came back completely empty . not a wrong answer. nothing. and that was my bug not the models . an empty reply gives 0 questions and no error, so my checker (which only looked for gaps in question numbering) saw nothing wrong and the upload said success while a whole page just quietly disappeared . fixed with one retry at a slightly higher temperature cuz a model that decided to output nothing will decide that again if u ask it the exact same way. stuff that broke i wrote a check to catch questions that got cut off mid sentence (flag anything not ending in punctuation) and it flagged 25 out of 114 questions on a CLEAN run . all wrong. turns out shsat questions end with like “by” or “through” all the time and the answer choices finish the sentence. fixed it and it changed literally zero outcomes so the rule was doing nothing the whole time. also added rate limiting and instantly locked myself out of my own test suite , which signs up way more than 5 times an hour from localhost. also deleted my entire email system . u need a domain u own to send emails (spf/dkim records) and a free .vercel.app subdomain cant do that. so instead of buying a domain i deleted 274 lines and made google sign in the front door. next things: tier B uploads dont get topic tags yet, and theres one test failing on purpose cuz FSRS says a question u just got wrong is due in 1 minute but i think it should be due immediately. gotta pick one.
Devlog 2 - StudyBuddy HERE IS THE LINK TO TRY IT ( https://trystudybuddy.vercel.app/ ) left a pile of worksheets extracting overnight cuz i was sick of testing every fix against the same two papers. woke up to 9 worksheets, 713 questions, 353 pages everything below only shipped after i swept it over all of that first. rule i have now, after two earlier “fixes” that read perfectly and were wrong on real data a question that shipped reading ?rac{44}{11} i tell the model to write plain text. it writes LaTeX anyway sometimes that fails loudly. \sqrt isnt a valid JSON escape so the response explodes and i lose a page. thats fine?? at least i know the other half is the problem. \f is a form feed and \t is a tab, both totally valid , so \frac{44}{11} parses perfectly and quietly becomes a form feed followed by rac{44}{11} i had an AMC8 question in my database reading ?rac{44}{11} and nothing anywhere reported a problem fix has to run before the first parse , not in the catch block, cuz the version that actually hurts u never throws it doubles the backslash on letter runs JSON would misread, but only the six that collide (b f n r t u) and only when the run spells a real command. otherwise a real line break stops being a line break, which is a fun way to make things worse questions torn in half by the page break extraction reads one page at a time and never sees the page before or after. so a question ending at the bottom of page 3 with its answer choices at the top of page 4 is never whole in either request . five of them on the AMC8 paper one fix folds the halves back together. the other is for the worse case where the extractor returned nothing at all for the second half, cuz a bare block of answer choices isnt a question so the model just drops it. theyre still sitting in the next pages text layer tho, u just have to go get them sorting questions within a page needed its own module cuz the bounding boxes lie . question 4 came back with a top of 1428 and question 5 with 1379, so pure geometry puts them backwards AMC8 went from 19 of 25 questions having their answer choices to 24 of 25 , zero false positives across 348 SHSAT pages stuff that broke a worksheet told me it had 26 questions when the paper has 25 . the extra one was the axis labels off a diagram, and the SHSAT ones had rows that just said CONTINUE TO THE NEXT PAGE. dropped 23 rows, all page furniture then immediately shipped a followup bug where the card read “Questions 25” next to “Unchecked 26” cuz i filtered one count and forgot the other one lol tried just asking the model to return a carried answer block as half a question. produced zero of them and started relabelling stem-only questions as free response, which hides the damage from every check i have. reverted the landing page every animation was gated behind prefers-reduced-motion , which sounds responsible until u find out some managed windows installs ship with animation effects off by default . so the page whose whole job is showing the product working was showing a static screenshot the hero panel gets dealt onto the page like a card now. needs a perspective on the parent or the rotations collapse into a shear and it just looks like a slide the forgetting curve draws itself left to right. stroke-dashoffset does not work here , pathLength is silently ignored under vector-effect: non-scaling-stroke so the dash tiles across the path instead of spanning it once. and i need non-scaling-stroke or the line renders 9x too thick . used a page-coloured shutter instead next things: that one AMC8 question needs reading off the page image since the text layer doesnt have it. and theres a cheaper reduced-motion compromise i wrote down but havent built.
if any of you guys wanna try this out here is the link: https://trystudybuddy.vercel.app/ YOOOOO WE GOT OUR FIRST FEW USERS i just checked before sleeping and yo we have 14 worksheets in the processing queue right now i wonder how much we had before THANK YOU GUYS
Devlog 3 - StudyBuddy wrote a script that reads each papers own answer key out of the source pdf and diffs it against my database. so the paper grades me instead of me grading myself. those 14 sheets scored 1 of 14 the first time i pointed it at them. tonight theyre 14 of 14 . barely any of it was the model. one paper stored 8 of its 15 questions. the model had read all 15 the log said dropped 6 unreadable question(s) . a count. no reason. it said that for two days made it print which field rejected the question and it told me on the first run: choices.0.label: Too big: expected string to have <=8 characters answer labels are capped at 8 chars, but the cap runs before the function that shortens them. that function only exists cuz the model returns A. 60 instead of A so the cap was checked against exactly the thing the transform was written to fix. coordinate geometry paper, every option reads A. (-2, 3) , ten chars, binned a count with no reason cant tell u “model returned garbage” from “ur schema is stricter than the paper” and those have opposite fixes also 44 duplicate-answer flags, every one wrong: -2 and 2 both normalised to 2 lol. on a maths paper the sign IS the question.
Devlog 4 - StudyBuddy no new features today. just went hunting for stuff that was quietly broken, and there was way more of it than i expected the sign-in page could send u to a different website if someone handed u a link like /signin?next=someothersite.com , u would log in and then land on their page immediately after typing ur password, which is about the worst possible moment for that to happen this one went first there was no limit on login attempts i had limits on signing up and on uploading. somehow not on the actual password box so u could sit there and guess forever getting blocked now looks identical to just getting the password wrong. telling someone “too many attempts” quietly confirms the account exists file storage was writing into the void if one setting went missing it silently saved ur page images somewhere that doesnt survive on the server uploads said they worked. returned a success. images just gone nothing errored anywhere, which is why it sat there so long now it refuses to start up at all instead of pretending everything is fine i almost broke my whole test suite fixing something unrelated locked down two internal-only routes with what seemed like the obvious check except my tests run against a production build, so that check wouldve locked the tests out too caught it before it shipped, then wrote a test explaining it so future me doesnt helpfully undo it added security headers and instantly caught myself put them in report-only mode first so nothing could actually break about 40 seconds later it flagged a script that my own analytics loads the strict version wouldve blocked it in prod. i absolutely wouldve shipped that one fix i deleted instead of shipping had a note to add another check to the duplicate-question detector actually tested it against real papers first, and it turns out it can never trigger. the answers on a maths paper are just “4” and “9” and stuff, way too short for it to match on wouldve quietly made things worse all tests green at the end of it. onto the next pile
Devlog 5 - StudyBuddy “accept the remaining 114” checked none of them that button fires one save per question, and on my test paper thats 114 of them at once nothing read the answers back, so a save that failed looked exactly like one that worked the tick stayed on, u moved to the next screen, and it was never stored deleting a question said “Saved” and then didnt delete it delete waits a few seconds so u can undo it. it dropped the question from the list first and threw away whatever came back from the server so if it failed u got told it saved, and the question showed up in ur study queue later like nothing happened also there was no undo button anywhere. it was just a slow delete $5 was being eaten maths sometimes comes wrapped in dollar signs so i strip them off. money also comes wrapped in dollar signs “Sam has $5 and Ana has $12” was being read as “Sam has 5 and Ana has 12” checked a real saved question and yep. paper says $5, database said 5 if my worker died, ur worksheet said “queued” forever the machine that reads the pages runs at my house. if it fell over mid job, nothing anywhere ever marked that job as failed it just sat there, and the free credit it charged u never came back the topic tagging could fail without failing it needs a bit of software thats not always there on the server. when it wasnt, it came back with “no matches” which is a completely normal answer. so the job finished, every question was untagged, ur weak areas page was empty, and nothing anywhere was an error one i was told to do and didnt had a note to cap the page number by how many pages the worksheet has except if u upload pages 10 to 15 of a pdf thats six pages numbered 10 to 15, so that check refuses every single one of them capped the two things separately instead also the screen asking u to check questions against the page never showed the page finishing a review session stopped saying u finished it the AI could print its own error onto ur status page, which sometimes meant quoting ur own worksheet back at u the upload checked the image size by asking the browser instead of opening the image
Devlog 6 - StudyBuddy u can throw everything u got wrong into blooket now button on the dashboard for the whole account, and one per worksheet if u only want that paper it gives u a file, u upload it to blooket, u get a set of exactly the questions u missed wrong means ever wrong, not currently wrong. if u got it wrong on paper and then right in review, its still in there. thats the one u actually want to drill and it wouldve been weird to leave out blooket hands u an .xlsx template so everyone calls this an xlsx export, but its uploader only accepts csv. took a while to work out also its importer just silently imports nothing if the file is slightly off. no error, no warning, zero questions. three separate ways to trip that picking a subject barely did anything theres a dropdown on upload for what subject the worksheet is. it offers things like “Algebra 1” only the first bit of that was ever used, so picking Algebra 1 searched all of high school maths. exactly the same as picking “all of high school maths” the one control u have over how ur questions get sorted, doing basically nothing long papers were quietly losing questions to a limit the topic tagger takes questions 100 at a time. fine except it grabbed 100 in no particular order and then removed the ones already done, so on a 114 question paper 14 never got looked at, and which 14 was down to whatever the database felt like that day worse on a second pass: if 100 were already tagged it handed back an empty list, which reads as “nothing left to do”, and the rest never got tagged at all two screens counting the same paper differently the worksheets page filters out page junk like “CONTINUE TO THE NEXT PAGE” before counting. the dashboard didnt so the same worksheet was 25 questions on one screen and 26 on the other, and nothing tells u which one is lying the chart was lying about time the accuracy chart draws a bar per week. it was only making bars for weeks u actually did something in so 12 bars looked like 12 weeks in a row but werent. practise in march and again in june and u see two bars side by side like it was steady every week is a bar now, empty ones included, and it says which weeks its showing scrolling changed my settings without me touching anything the page range and question count boxes were number inputs, and number inputs treat the scroll wheel as a way to change the value so scrolling down the upload page with ur cursor over one of them silently rewrote which pages get read found a pile of other accessibility stuff while i was in there: buttons a bit too small to reliably hit on a phone, cards that vanish in high contrast mode, and a “skip to content” link that didnt actually skip anything also asking to see an explanation u already had was using up ur hourly limit for generating new ones the topic picker was built in a way that made screen readers think the list had nothing in it button labels were half Title Case and half sentence case, sometimes on the same screen
Devlog 7 - StudyBuddy the drag box was broken in the real app. for months u upload a worksheet, u draw a box around question 1, it fills in. thats the whole manual editor, thats the whole free tier. and it didnt work. click through the app to get there and nothing responds. reload and its fine. four previous commits went looking for this. the test had a 24 line comment explaining why it was probably a test problem. it was not. elementFromPoint(100, 28) -> HTML elementsFromPoint(100, 28) -> [HTML] thats the browser saying nothing is at this pixel , for every pixel on the page. the cause was 8 view transition animations, 6 stuck running forever . one that never finishes sits in the top layer and covers everything. and its a pseudo element so it shows up in no ancestor walk and no element stack, which is why every previous investigation contradicted itself. bisected on clean builds: next flag react component result on on broken off on broken on off clean off off clean so its react’s <ViewTransition> , not next. three lines of css. the drag test used to fake the mouse with dispatched events, now it uses a real one, which is the only thing that proves anything. gemini has never completed a single request 4 providers in settings. one says “has a free tier worth starting on”. zero successful calls, ever. every nullable field is anyOf: [{type:'x'}, {type:'null'}] gemini doesnt understand anyOf , so a filter strips keywords it rejects the filter dropped anyOf and left {} behind, while leaving the field in required a required field with no type = rejected request. every time funny part: the allowlist already had nullable in it, gemini’s own word for the same idea. someone knew. nothing connected them. the landing page was lying about 3 of its 4 topics theres a comment above them saying “kept honest on purpose: these are real taxonomy names” . Ratio & proportion - not real Linear equations - not real Reading inference - not real Vocabulary in context - real so the one claim the page made about its own honesty was the false one lol. theres a test now instead of a comment. tests found 2 bugs i wasnt looking for new Date("sometime in 2010") returns jan 1 2010, cuz v8 scrapes a year out of almost anything. and it parses as local midnight while everything next to it is UTC. on a 13th birthday thats the whole question one route answered 404 to someone with no session. the client sends u to sign in on a 401 and brings u back after, so a tab that sat open till the session expired just ate what u typed the rest a reload could cost u a 114 question paper. markup saves nothing till every question is marked, so its a local draft now / , /signin , /signup are static html now. the topbar called auth() from the root layout, which made all 39 routes render per request the 23mb embedding model was getting fetched inside a background task on every cold start, and failing silently one commit recorded 32 renames and none of the code . the git add failed and i’d redirected the error away so i never saw it
Devlog 8 - StudyBuddy im too lazy to have a full write up for this (watched spiderman tdy IT WAS REALLY GOOD) for each topic that a user gets wrong, a seperate model (gpt-oss:20b, sorry if i miswrote the model) gives a walkthrough of the topic also added missed questions to the csv export added a AI answer key system if the worksheet doesnt have one.
Devlog 9 - StudyBuddy the merge tool could double up a question number renumbering the survivor of a duplicate pair used Math.min of just those two rows, blind to the rest of the paper merging a phantom #5 into a real #9 could hand the paper a second #5, the exact thing the tool exists to prevent zero tests on a function that deletes rows. five now, including the repro $15/hour was losing its sign, not just $5 the math-stripper runs from one $ to the next, so “earns $15/hour and $18/hour” reads the slash as a fraction and eats both signs. same with $40 = $25 + $15 on the = i wrote this down once as “one weird case.” it’s the whole unit-rate and equation category fix checks the char after the closing $ : a digit means it’s opening the next price, not real math figure crops didnt need a new pipeline, just reusing one filed as “never produced,” which reads like crop, store, backfill the verify screen already computes a crop window from the bbox over the stored page image. review got wired to the same math, every old worksheet gets it free the real work was the guards: zero-area, inverted, off-page, or no recorded page size all have to degrade to nothing rather than to the wrong crop a fence i built to be un-escapable, wasnt the comment says a new tag can’t be added without going through the escaping. page-seam work added two by typing them directly a page whose OCR contains the literal closing tag closes the fence early, and everything after reads as instructions instead of data tag list exists once now, every fence built from it every worksheets.status write was a bare UPDATE no guard on the current value, so a stale job retry could drag an already-reviewed worksheet back to failed one transitionWorksheet(from, to) now, every write through it preview deploys were migrating the prod database guard only checked VERCEL_ENV === 'production' , but previews fire on every push against one shared DATABASE_URL two finishing together were racing through the migration folder 9 tests could go quiet and nobody would know one e2e file, 12 tests serial in a single tab, everything past “verify” depending on a question a drag gesture created three tests earlier a drag regression silently skipped 9 unrelated tests instead of failing them api fixture, split the file, broke the drag on purpose to prove it. held the question list rendered all 114 cards for a screen that edits one at a time deferred a while back: virtualizing editable rows risks one unmounting mid-edit only one card can ever be expanded, so the risk surface is exactly one row virtualizes past 40 now, open row pinned into the rendered range wherever scrolling goes. typed into one at 60 questions, scrolled thousands of px away, still there, still focused, still holding the edit also profile save had devlog 4’s router.refresh() remount bug login rate limit skipped Auth.js’s own credentials endpoint ollama worker had no startup timeout and just hung worksheet text leaked into console logs on schema rejections review screen shipped every page’s OCR text on page-1 load admin console got merge, tree edit, queue, usage doc-count drift (third time), and a false-positive LaTeX check flagging real set notation as broken math
Devlog 10 - StudyBuddy mostly the same bug wearing different clothes: a screen that exists, that u can get to, that quietly does less than it says tier C was sitting in settings doing nothing save an ollama address and the app resolves u to a browser executor. that executor had nowhere to go, so ur worksheet just sat there looking queued it claims the job now and reads each page against localhost:11434 , posting back through the same queue my gpu posts through has to run in the browser cuz a server cant reach ur localhost, so the tab stays open. checkpointed per page tho, closing it resumes instead of restarting the paper a mark u mis-tapped was permanent tap through 40 of these and ur going to hit the wrong one eventually that one tap feeds the FSRS schedule, the topic accuracy, the weakness ranking and the blooket export only way back was deleting the worksheet and uploading it again, which costs u a trial credit. so the fix for a mistap was paying for it two defences that were never on WORKER_ALLOWED_IPS was optional and empty meant no restriction empty is the state every deployment starts in, so the normal outcome was a defence thats off that nobody ever decided to turn off refused now. * still allows any address but somebody has to type it untagged worksheets looked identical to broken ones tier B cant auto-classify, the embedding model needs a native runtime the serverless host doesnt have so ur questions saved fine and were reviewable fine, they just had no topic and nothing said why. reads exactly like it silently failed every tier that can come back untagged says so now nothing told u when a worksheet finished u uploaded and then u guessed. sat on the status page or came back later and hoped in-app bell that needs zero setup, plus web push for a tab u closed also “Review these now” now reviews those questions. the word had drifted onto three screens meaning three different things dashboard was missing three of its panels, and the trend arrow was specified ages ago and never computed taxonomy had no front door and the subject panel only went one level deep. Math > Geometry > Triangles walks now pagination was capping at the fiftieth worksheet and saying nothing about it the AI setup prompt showed up after ur trial ran out, which is the one moment it cant help u grouped scripts/ by what it does to ur data. inspect/ reads, repair/ writes behind a guard, benchmark/ measures 1285 tests green. playwright hasnt run yet and app/ moved a lot this time, so thats next
Devlog 11 - StudyBuddy this is a short one got the google sign in to work added email verification and forgot ur password thing cleaned up the overall UI made the topic tree standardized cleaned up some of the extraction issues added ollama integration for everyone added practice question generation, topic overview, etc tested everything fully the attached image is the app after a ton of testing *
ANYONE RATING THIS PROJECT - THE VIDEO ON THE SHIP IS OUTDATED, THERE IS ALSO ANOTHER FEW DEVLOGS SO CHECK THAT OUT BEFORE JUDGING BECAUSE IT GIVES MORE INFO ABOUT THE BUILDING AND WHY THE CHANGED A LOT SORRYYYY ALSO USE THE SAMPLE WORKSHEETS I ATTACHED OR EASILY PARSEABLE WORKSHEETS. TEMPORAILY IVE CLOSED THE API KEY VERSION AS MOST PEOPLE DONT HAVE THEM. COMPLEX WORKSHEETS ARE TO BE USED ONLY WITH LARGE LLM Devlog 12 - StudyBuddy got everything ready to ship turns out that ollama needed some permissions so fixed that and added it to readme for people to set up, and other stuff like that shipping it in 5 mins 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉
Devlog 13 - StudyBuddy update the ui to make it look liek sticky notes and lined paper
Devlog 14 shipwrights rejected the project so im fixing their things decided to clean up the code, get rid of old functions, and i also cleaned up the UI because no one really needs the heading and then what it means, like i think you know that topics means topics and doesnt need a whole sentence after that. cleaned up the repo, got rid of ai generated code fixed a 500 error when uploading worksheets, cuz something happened and some linux kernel wasnt compaitble with the library i was using wrapped up my last few fixes lowk not a lot of new features, rather like fixes
Devlog 15 more cleaninggggggg cleaned up repo, removed more dead logic and stuff instead of a css wallpaper, i added a image of lined paper to really give that school/learning feel asked ai to help me get the ui to look kinda fresh and add the pencil style heading
Devlog 16 - StudyBuddy added some sample worksheets so you can try it out added the borders back to the buttons because i accidently removed them before
Devlog 17 - StudyBuddy (ah im losing track of these devlogs uh my ship keeps getting rejected for look to AI, and ive literally rebuilt everything, removed all teh ai generated thing. (im gonna ship again rn) made a logo cuz i thought it would look cool added a Terms of Services page cuz its risky cuz people could upload worksheets they dont have access for an i could be fried so i made them agree to that cleaned up more code fixed a few more bugs
Devlog 18 - StudyBuddy lowk not a lot of content in this one but like 1000000 different bugs popped up and reviewers are pointing it out so thank you smmm ( @blowupthenoobs ur the goat) fixed the trials having no limit other fixes just check my commits
Devlog 19 - StudyBuddy even more bug fixes so i pushed a change, and that somehow broke the entire pipeline so i patched it no real content just fixes going to add API key integration soon (follow to see it happen)
Devlog 20 - StudyBuddy more bug fixes continous reships (they keep saying its too AI generated even after i rebuilt the UI) started working on the API key integration (like almost there rn) tons of dead code removal and code clean up added support for firefox too (now it works on edge, firefox, chrome, and prolly a ton others i just havent really tested it)
Devlog 21 - StudyBuddy patched even more bugs rewrote tons of my code (ai to human) cleaned up old files (a lot of old features were removed and reupdated) just more QoL fixes
Devlog 22 - StudyBuddy fixed more bugs and rewrote code by hand
Devlog 23 - StudyBuddy i just had some minutes left on this so im just making the devlog still waiting for my ship to be approved (been waiting a few days) no big changes at all (waiting for feedback)
Devlog 24: StudyBuddy so a lot of the feedback said “cool but it needs ur gpu on”. that made it seem like a PoC, so now its running on the free tier of openrouter. making the free tier work one request per question was never going to fit a daily cap. extraction now sends up to 10 pages / 25 questions per call, sorting and answer key go 10 questions at a time. ~4 requests per worksheet instead of ~42 the homepage and upload page count the day’s calls. 80% says busy, 100% stops reading and points u at the samples. samples upload page leads with the three samples as one-click cards; ur own pdf is the second option and says how much of the shared allowance is used. removed phone photo uploads (highly innaccurate on the free tier of models i have)
Ships:
StudyBuddy Turn the worksheets you have already done into a record of what you actually know. Try it: https://trystudybuddy.vercel.app Code: https://github.com/DagaVedant/StudyBuddy What I made Upload a worksheet you already finished, as a PDF or photos. A vision model pulls out every question, its options and its answer key. You mark what you got wrong. That is the only input it needs. It sorts questions into 87 topics across SAT and competition maths. Then it ranks your weak areas and schedules revision using FSRS, the algorithm behind Anki. It also writes practice questions on your weak topics and exports misses to Blooket. Built on my own past papers: 387 real questions from 22 worksheets. What was challenging The models can run in four places: my GPU, your API key, your own Ollama, or not at all. A student with a GPU should never send homework to my server. A student with nothing should still get something. Topic tagging needs an embedding model that serverless hosting cannot run. So the shortlist is a pgvector query on the server and the vector is computed anywhere, including in your browser under WebAssembly. Worst bug was three characters: I stored the global fetch on a class field, which passes the object as the receiver. Node allows it, browsers throw Illegal invocation. Every test passed and the only runtime that mattered was broken. What I am proud of It does not lie to you. Weak topics are ranked by a Wilson lower bound, not a raw percentage, so two unlucky answers cannot fake a weakness. Model-written questions are kept out of your accuracy, so the ranking cannot feed the questions it generates. Every model response is schema-checked before it reaches the database. Generated practice is sifted against thirteen specific failure modes. When my GPU is off, the upload screen says so instead of spinning. 1,459 unit tests, 84 end to end, 293 commits. How to test it Sign in with Google, or an email and password. Upload any worksheet you have already done. A past paper works well. Check what it read. Each question sits beside the page image it came from. Mark what you missed, then open the dashboard. The free trial reads three worksheets on my own GPU. If it is off, your upload queues and the app tells you. To skip the wait, settings takes your own API key or connects to Ollama on your machine. guys i wish this was markdown compatible but its not so sorry
StudyBuddy - https://trystudybuddy.vercel.app fyi before u try it: reading runs on a free model with a shared daily cap, and ship day is way more traffic than a normal day. please use the sample worksheets wherever u can (they’re the first thing on the upload page, one click) and upload at most one of ur own pdfs for the next day or two. if the homepage says the free reads are used up, the samples still work. what it does upload a worksheet pdf. it reads every question off the page, tags each one by topic, and works out the answer key. u mark which ones u got wrong and it brings them back on an FSRS schedule (the algo anki uses). across every test u upload it turns “i got 12 wrong” into “ur bad at ratios”. what changed since last time runs on openrouter’s free tier instead of my gpu. not a proof of concept anymore one worksheet is ~4 requests instead of ~42. pages are read in groups the site says when the day’s free reads are running low. clear about the trial: 3 worksheets free, then still free, u just add questions by hand or plug in ur own key. what was hard free models reason before they answer and bill that against the output limit which ends up causing an error, but its really hard to figure out the embedding-only shortcut for sorting looked fine and was wrong a third of the time so fixed it...
|
1792961526.2048538
|
1793047926.2048538
|
|
17270
|
File Compressor in C by @barseghian_daniel | Stard File Compressor in C by @barseghian_daniel | Stardance...
|
barseghian_daniel
|
2
|
81.0
|
1044
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-27T08:05:03Z", "hours": 12.0, "multiplier": 14.9, "payout": 181, "blessing": "neutral", "text": "made a website for my C code! It was really challenging to work with the WASM module since it’s limited to 32 bits (4GB RAM), but I managed to make it work! I also optimized the C code to use much less RAM (see the devlog). Sadly the website is limited to 220MB per file (because of WASM), but you can still process large files with the GitHub release! You can test it via the website or the GitHub release!", "repo": "https://github.com/danielbarseghian/file-compressor", "demo": "https://dancing-hotteok-83ce45.netlify.app/"}, {"ship_num": 2, "ts": "2026-07-17T21:45:09Z", "hours": 69.0, "multiplier": 12.73, "payout": 863, "blessing": "neutral", "text": "I made a file compressor/decompressor written in C! You can use it on Linux, Windows, and macOS. The part that took the most time was DEBUGGING . It took SOOOOO much more time than I expected! I’m really proud of finishing the project. I consider this my first full project, so yeah, it took some time, but I finally finished it! You should know that all the information is in the README (installation, description, etc.). It was really fun working on it, but all good things come to an end!", "repo": "https://github.com/danielbarseghian/file-compressor", "demo": "https://dancing-hotteok-83ce45.netlify.app/"}]...
|
[{"post_id": 55426, "ts": "202 [{"post_id": 55426, "ts": "2026-08-27T07:56:40Z", "hours": 0.3333, "text": "ITS DEPLOYED! i added a small status text to know when its compressing/decompressing. you can try it the website here !"}, {"post_id": 55045, "ts": "2026-08-26T14:03:53Z", "hours": 3.1169, "text": "ITS REALEAAAAASEDD the updated C code is release go check it out here !"}, {"post_id": 54104, "ts": "2026-08-24T22:04:14Z", "hours": 3.4836, "text": "Optimized code for less R*M usage! For a 2.8gb file it was taking 2.8gb of ram but now its taking 42 KB! I was putting the file in the ram but now i stream the file to ram for 99.999% less ram usage!"}, {"post_id": 51584, "ts": "2026-08-21T11:04:04Z", "hours": 0.2833, "text": "Imported decompressor ! well it was super easy to import the decompressor since it was very similar to the compressor code!"}, {"post_id": 51554, "ts": "2026-08-21T10:19:38Z", "hours": 1.0667, "text": "Compressed file directly in the browser ! i compiled the C code into wasm (web assembly) so i can use it inside the browser!"}, {"post_id": 50560, "ts": "2026-08-19T19:27:18Z", "hours": 3.5453, "text": "BACK ON C ! F**K WINDOWS, C# AND UNITY i missed C so much and working on linux too its just so much more fun and fast and, i can’t make game look good… look at my latest project . Im finally back at my roots"}, {"post_id": 30609, "ts": "2026-07-18T10:06:56Z", "hours": 0.3169, "text": "My Ship got rejected… kinda My Ship got requested change because my banner didn’t showcase the project now i changed it, here i compress and decompress a jpeg file and then open it! Hope this next ship will be accepted!"}, {"post_id": 30322, "ts": "2026-07-17T19:42:36Z", "hours": 1.9761, "text": "ITS REALEAAAAAASED You can use it for Windows, macOS, and Linux. The tutorial is mentioned under the README for all three systems. I tested it on Windows and Linux. I don’t have any Apple devices to test it out. :("}, {"post_id": 29790, "ts": "2026-07-16T22:05:17Z", "hours": 2.9333, "text": "about the website… So… I abandoned it I CAN’T MAKE WEBSITES, I CAN’T STAND JAVASCRIPT. I tried to use WebAssembly, but it’s not widely used, so it’s really hard to work with. How can you use it? Well, use it with the CLI like a super nerd Don’t worry, everything is documented in the README. CLI » JAVASCRIPT"}, {"post_id": 29200, "ts": "2026-07-15T22:51:38Z", "hours": 2.3436, "text": "Started website, web assembly and my own extension! Extension I added the .huff extension since it will help me recognize files compressed by my compressor. The format used is .extension.huff (example: image.jpg.huff). Web Assembly I compiled the code to web assembly so it can run directly on the user’s PC and not on servers. Website I’m creating a simple website that just does the j*b (still woking on it, this is just the core). The website will not communicate with other APIs or services, thanks to web assembly. I hate JavaScript."}, {"post_id": 28517, "ts": "2026-07-14T20:28:35Z", "hours": 7.76, "text": "I reached… the end? So i’ve been testing for a while now and i didn’t have much to say…. I successfully compressed, decompressed and burnt a linux iso and booted into one ! It required alot of troubleshooting and waiting ( 5 - 15min PER TRY ) but hey now it works on any file!"}, {"post_id": 26022, "ts": "2026-07-10T16:30:07Z", "hours": 2.9822, "text": "how did it work? i REALLY don’t know how it worked but it worked, a famouse programming therm if it works, don’t touch it! I just changed a char to an unsigned char lol."}, {"post_id": 22897, "ts": "2026-07-05T15:12:46Z", "hours": 1.25, "text": "Learned mmap open …. I did some exercices on mmap , open , fstat and learned thoses, next i have to implemente it in compressor.c"}, {"post_id": 22178, "ts": "2026-07-04T14:41:32Z", "hours": 4.1289, "text": "Found the problem for segmentation error (I’m back) So i had this error for the past 4 days and i coudn’t fix it so i even take a step back for 2 days but still coudn’t find it, the problem was that i had to wait 5 min for every try i did. Fix ? I used claude so he run test on faster machines, and i got the errors i have to fix. (He wanted to script it himself, i obviously said no)."}, {"post_id": 19304, "ts": "2026-06-30T15:58:16Z", "hours": 4.4594, "text": "FINALLYYYYYYYYYYYYY I successfully compressed and decompressed a file other than text files, I used binary to write the files so it supports all the file types now! What was the problem ? So the compressed file were written in text and decompressed with text wich limited the compression for only text files. What was the fix ? I wrote the compressed file and decompressed in binary. (small part of the code i changed)"}, {"post_id": 17826, "ts": "2026-06-28T19:16:21Z", "hours": 2.0475, "text": "IT WORKS but only in text files… Why dosn’t it work? In the metadata, i write it as a text file (a:1|b:5…), it works fine for text files but for other files type, it dosn’t work since its written in binary. Any solutions? i have to write the metadata in binary, yayyy…"}, {"post_id": 17618, "ts": "2026-06-28T14:25:13Z", "hours": 4.9825, "text": "NEVER code something with AI What happened? So i said to myself that i can code this small part with AI since i don’t know the synstaxe and I did it and its the problem now. I learned bitwise operators and logique and then recoded the part, didnt finish yet."}, {"post_id": 16911, "ts": "2026-06-27T13:48:34Z", "hours": 1.3667, "text": "it’s SO HOT in europe There was an issue with compressor.c while doing it with other files than png. I’m still working on decompressor.c it can’t decode normally a file other than png. Text files still works. Heatwave Its so hot in europe, I can’t work normally, the temperatures will go down monday hopefully."}, {"post_id": 16759, "ts": "2026-06-27T06:54:22Z", "hours": 2.5828, "text": "FINALLY FINISHED compressor.c AND decompressor.c THE BUG so the main bug was that the two arrays which contained the frequencies of each letter were reversed so the huffman tree was not the same and the codes too weren’t the same. THE FIX so in decompressor.c i just reversed the codes. this is not a permanent fix will investigate further into compressor.c to see why its reversed!"}, {"post_id": 15823, "ts": "2026-06-25T18:36:34Z", "hours": 2.865, "text": "Finished reading bytes, Almost finished I’m almost finished with my code (this is my longest project yet) i’m so existed ! What am i doing next? pray for no bugs"}, {"post_id": 15143, "ts": "2026-06-24T16:30:30Z", "hours": 3.1906, "text": "Fixed swapping issues, transfer list array into node array, and building codes works Swapping issues i had an issue where i was putting the new node in first in the link list so i fix it, drawing it on a sketch really helped . Transfer list to node So i transfer it into an array since its easier to use it and i coudn’t built it before since an array is a fixed size, thats why I used a linked list to first get the values and the length. Building huffman codes I just imported function i already programmed in compressor.c . image from wikipedia"}, {"post_id": 14259, "ts": "2026-06-23T09:03:36Z", "hours": 5.0258, "text": "Started to code decompresor.c i have alot of problems with decompressor.c notably two nulls caracters at the start."}, {"post_id": 12483, "ts": "2026-06-20T11:51:35Z", "hours": 2.3331, "text": "FREED ALL THE MEMORY All this memory can be reused for other good causes now"}, {"post_id": 12168, "ts": "2026-06-19T21:33:52Z", "hours": 1.2511, "text": "Finally FINISHED compressor.c when you finally finished that code"}, {"post_id": 11891, "ts": "2026-06-19T11:42:29Z", "hours": 1.3531, "text": "C programmer TOUCHING grass for the FIRST TIME I didnt program for 2 days and touched some grass. How was it ? it was weird since it was grass (wich i don’t touch) but it was ok. btw it was fake grass"}, {"post_id": 9454, "ts": "2026-06-15T20:20:27Z", "hours": 0.9128, "text": "why are we only using I in loops? its a real question why only I ? I used f it was so cool. Use other letters for your loops. I’m onto something guys, it’s the next big thing. P.S : I’m going to take a break from coding in C since its pretty anoying and im not really doing anything while working maybe this challenge is really too hard for me. I’m maybe going to start another project then see."}, {"post_id": 8873, "ts": "2026-06-14T19:33:29Z", "hours": 0.6917, "text": "Brain cells aren’t connecting I’m super tired and my brain cells aren’t working right. sticker by fancy void"}, {"post_id": 8756, "ts": "2026-06-14T15:48:50Z", "hours": 2.1778, "text": "FINISHED COMPRESSOR.C Finnaly finished compressor.c after 7 hours on it! How did it did it ? Well i used AI… Yes I’m not proud but hey its finished! I was really tired and I just vibe coded it but now no more AI for decompressor.c ! Did i learn something? Yes i didn’t blindly ask AI do give answers i asked to help debug the code! What do i do next? Probably sleep, I’m so tired."}, {"post_id": 8557, "ts": "2026-06-14T07:01:26Z", "hours": 1.4881, "text": "Building huffman code tree Finally finished coding everything but the tree. I can finally code without AI so for relearning, i authorized myself to use AI but only to debug, now i can finally not use it (since i relearned C) Problems I ran into several problems: Segmentation problems, i was accessing things i normally can’t Future problem, i can’t name something with more than two carrecters so when i’m merging two nodes i can’t rename thoses."}, {"post_id": 8314, "ts": "2026-06-13T20:33:53Z", "hours": 3.7689, "text": "FINALLY FIXED SEGMENTATION PROBLEMS For context i was building the compressor and i had segmentation problems What is a segmentation problem? A segmentation problem is when you try and access memory your don’t have access. What was the problems? First the allocation, i didnt allocate for the array of pointers to my struct. Didnt check for NULL, so my arrays have 256 nodes (for all of the ASCII values) and i was trying to access values that just didnt existed. How did i fix it? I used AI to debug my code, I didnt directly asked for the awnsers, i asked it to help me without giving out awnsers. AI was very useful since i mad alot of small mistakes since i didnt program in C for a long time."}, {"post_id": 7715, "ts": "2026-06-12T21:35:38Z", "hours": 4.4744, "text": "CS50x C Refresher Redid one exercise from CS50x Psets 2, 3, 4, and 5. I wanted to refresh my C programming skills because after Week 5 the course shifts more toward web applications, databases, and other topics. This was a good way to get back into writing C before continuing work on Stardance."}, {"post_id": 7461, "ts": "2026-06-12T13:14:46Z", "hours": 0.2653, "text": "Studying Huffman Coding Huffman Coding is a lossless compression algorithm . Example text: ffffcdabdfdeeebcc First, count how often each character appears: f:4 c:3 d:3 e:3 b:2 a:1 Then repeatedly merge the least frequent characters into a binary tree until one final tree remains. Each character gets a binary code: Left = 0 Right = 1 More frequent characters receive shorter codes , reducing the total file size. A key rule: no code can start with another code . If f = 1 , then 100 cannot be another character, so decoding stays unambiguous. Time complexity: O(n log n) Image: GeeksforGeeks Video: Computerphile – Huffman Coding"}]...
|
Title: File Compressor in C by @barseghian_daniel Title: File Compressor in C by @barseghian_daniel | Stardance
Devlogs:
Studying Huffman Coding Huffman Coding is a lossless compression algorithm . Example text: ffffcdabdfdeeebcc First, count how often each character appears: f:4 c:3 d:3 e:3 b:2 a:1 Then repeatedly merge the least frequent characters into a binary tree until one final tree remains. Each character gets a binary code: Left = 0 Right = 1 More frequent characters receive shorter codes , reducing the total file size. A key rule: no code can start with another code . If f = 1 , then 100 cannot be another character, so decoding stays unambiguous. Time complexity: O(n log n) Image: GeeksforGeeks Video: Computerphile – Huffman Coding
CS50x C Refresher Redid one exercise from CS50x Psets 2, 3, 4, and 5. I wanted to refresh my C programming skills because after Week 5 the course shifts more toward web applications, databases, and other topics. This was a good way to get back into writing C before continuing work on Stardance.
FINALLY FIXED SEGMENTATION PROBLEMS For context i was building the compressor and i had segmentation problems What is a segmentation problem? A segmentation problem is when you try and access memory your don’t have access. What was the problems? First the allocation, i didnt allocate for the array of pointers to my struct. Didnt check for NULL, so my arrays have 256 nodes (for all of the ASCII values) and i was trying to access values that just didnt existed. How did i fix it? I used AI to debug my code, I didnt directly asked for the awnsers, i asked it to help me without giving out awnsers. AI was very useful since i mad alot of small mistakes since i didnt program in C for a long time.
Building huffman code tree Finally finished coding everything but the tree. I can finally code without AI so for relearning, i authorized myself to use AI but only to debug, now i can finally not use it (since i relearned C) Problems I ran into several problems: Segmentation problems, i was accessing things i normally can’t Future problem, i can’t name something with more than two carrecters so when i’m merging two nodes i can’t rename thoses.
FINISHED COMPRESSOR.C Finnaly finished compressor.c after 7 hours on it! How did it did it ? Well i used AI… Yes I’m not proud but hey its finished! I was really tired and I just vibe coded it but now no more AI for decompressor.c ! Did i learn something? Yes i didn’t blindly ask AI do give answers i asked to help debug the code! What do i do next? Probably sleep, I’m so tired.
Brain cells aren’t connecting I’m super tired and my brain cells aren’t working right. sticker by fancy void
why are we only using I in loops? its a real question why only I ? I used f it was so cool. Use other letters for your loops. I’m onto something guys, it’s the next big thing. P.S : I’m going to take a break from coding in C since its pretty anoying and im not really doing anything while working maybe this challenge is really too hard for me. I’m maybe going to start another project then see.
C programmer TOUCHING grass for the FIRST TIME I didnt program for 2 days and touched some grass. How was it ? it was weird since it was grass (wich i don’t touch) but it was ok. btw it was fake grass
Finally FINISHED compressor.c when you finally finished that code
FREED ALL THE MEMORY All this memory can be reused for other good causes now
Started to code decompresor.c i have alot of problems with decompressor.c notably two nulls caracters at the start.
Fixed swapping issues, transfer list array into node array, and building codes works Swapping issues i had an issue where i was putting the new node in first in the link list so i fix it, drawing it on a sketch really helped . Transfer list to node So i transfer it into an array since its easier to use it and i coudn’t built it before since an array is a fixed size, thats why I used a linked list to first get the values and the length. Building huffman codes I just imported function i already programmed in compressor.c . image from wikipedia
Finished reading bytes, Almost finished I’m almost finished with my code (this is my longest project yet) i’m so existed ! What am i doing next? pray for no bugs
FINALLY FINISHED compressor.c AND decompressor.c THE BUG so the main bug was that the two arrays which contained the frequencies of each letter were reversed so the huffman tree was not the same and the codes too weren’t the same. THE FIX so in decompressor.c i just reversed the codes. this is not a permanent fix will investigate further into compressor.c to see why its reversed!
it’s SO HOT in europe There was an issue with compressor.c while doing it with other files than png. I’m still working on decompressor.c it can’t decode normally a file other than png. Text files still works. Heatwave Its so hot in europe, I can’t work normally, the temperatures will go down monday hopefully.
NEVER code something with AI What happened? So i said to myself that i can code this small part with AI since i don’t know the synstaxe and I did it and its the problem now. I learned bitwise operators and logique and then recoded the part, didnt finish yet.
IT WORKS but only in text files… Why dosn’t it work? In the metadata, i write it as a text file (a:1|b:5…), it works fine for text files but for other files type, it dosn’t work since its written in binary. Any solutions? i have to write the metadata in binary, yayyy…
FINALLYYYYYYYYYYYYY I successfully compressed and decompressed a file other than text files, I used binary to write the files so it supports all the file types now! What was the problem ? So the compressed file were written in text and decompressed with text wich limited the compression for only text files. What was the fix ? I wrote the compressed file and decompressed in binary. (small part of the code i changed)
Found the problem for segmentation error (I’m back) So i had this error for the past 4 days and i coudn’t fix it so i even take a step back for 2 days but still coudn’t find it, the problem was that i had to wait 5 min for every try i did. Fix ? I used claude so he run test on faster machines, and i got the errors i have to fix. (He wanted to script it himself, i obviously said no).
Learned mmap open …. I did some exercices on mmap , open , fstat and learned thoses, next i have to implemente it in compressor.c
how did it work? i REALLY don’t know how it worked but it worked, a famouse programming therm if it works, don’t touch it! I just changed a char to an unsigned char lol.
I reached… the end? So i’ve been testing for a while now and i didn’t have much to say…. I successfully compressed, decompressed and burnt a linux iso and booted into one ! It required alot of troubleshooting and waiting ( 5 - 15min PER TRY ) but hey now it works on any file!
Started website, web assembly and my own extension! Extension I added the .huff extension since it will help me recognize files compressed by my compressor. The format used is .extension.huff (example: image.jpg.huff). Web Assembly I compiled the code to web assembly so it can run directly on the user’s PC and not on servers. Website I’m creating a simple website that just does the j*b (still woking on it, this is just the core). The website will not communicate with other APIs or services, thanks to web assembly. I hate JavaScript.
about the website… So… I abandoned it I CAN’T MAKE WEBSITES, I CAN’T STAND JAVASCRIPT. I tried to use WebAssembly, but it’s not widely used, so it’s really hard to work with. How can you use it? Well, use it with the CLI like a super nerd Don’t worry, everything is documented in the README. CLI » JAVASCRIPT
ITS REALEAAAAAASED You can use it for Windows, macOS, and Linux. The tutorial is mentioned under the README for all three systems. I tested it on Windows and Linux. I don’t have any Apple devices to test it out. :(
My Ship got rejected… kinda My Ship got requested change because my banner didn’t showcase the project now i changed it, here i compress and decompress a jpeg file and then open it! Hope this next ship will be accepted!
BACK ON C ! F**K WINDOWS, C# AND UNITY i missed C so much and working on linux too its just so much more fun and fast and, i can’t make game look good… look at my latest project . Im finally back at my roots
Compressed file directly in the browser ! i compiled the C code into wasm (web assembly) so i can use it inside the browser!
Imported decompressor ! well it was super easy to import the decompressor since it was very similar to the compressor code!
Optimized code for less R*M usage! For a 2.8gb file it was taking 2.8gb of ram but now its taking 42 KB! I was putting the file in the ram but now i stream the file to ram for 99.999% less ram usage!
ITS REALEAAAAASEDD the updated C code is release go check it out here !
ITS DEPLOYED! i added a small status text to know when its compressing/decompressing. you can try it the website here !
Ships:
I made a file compressor/decompressor written in C! You can use it on Linux, Windows, and macOS. The part that took the most time was DEBUGGING . It took SOOOOO much more time than I expected! I’m really proud of finishing the project. I consider this my first full project, so yeah, it took some time, but I finally finished it! You should know that all the information is in the README (installation, description, etc.). It was really fun working on it, but all good things come to an end!
made a website for my C code! It was really challenging to work with the WASM module since it’s limited to 32 bits (4GB RAM), but I managed to make it work! I also optimized the C code to use much less RAM (see the devlog). Sadly the website is limited to 220MB per file (because of WASM), but you can still process large files with the GitHub release! You can test it via the website or the GitHub release!...
|
1792850132.8396719
|
1792936532.8396719
|
|
49502
|
smart-reliability-predictor by @Matrix | Stardance
|
Matrix
|
2
|
70.0
|
1044
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-08T11:39:10Z", "hours": 9.0, "multiplier": 17.9, "payout": 159, "blessing": "neutral", "text": "I have made an smart reliability predictor analysis which dedects anomaly in the systems and flags it . I have made it using prob and stats concepts like z-score , poission formula , bayes etc . i wrapped this section in v1_v2 . And than i created another section V3 where i added an official NASA SMAP and MSL dataset . this was an tough job because i spended lots of days studying data , plotting it on graphs , trying to find patterns in the anomlies . Than i tried multuple models like linear regression and random forest but they just didnt perform well( i also added this models section where user can choose and see results) . Than i moved towards implementing an lstm (RNN) which also performed much bettrt than other models . Than i created an calibration system to choose threshold and persistance itself on training on the validation set and than test it on test set . And created a dashbaord for it and changed it a lots of time and finalize the theme of the dashbaord .", "repo": "https://github.com/Matrix-09x/Smart-Reliability-Predictor", "demo": "https://smart-reliability-predictor.vercel.app/"}, {"ship_num": 2, "ts": "2026-09-28T16:48:40Z", "hours": 61.0, "multiplier": 14.5, "payout": 885, "blessing": "neutral", "text": "I have made an smart reliability predictor analysis which dedects anomaly in the systems and flags it . I have made it using prob and stats concepts like z-score , poission formula , bayes etc . i wrapped this section in v1_v2 . And than i created another section V3 where i added an official NASA SMAP and MSL dataset . this was an tough job because i spended lots of days studying data , plotting it on graphs , trying to find patterns in the anomlies . Than i tried multuple models like linear regression and random forest but they just didnt perform well( i also added this models section where user can choose and see results) . Than i moved towards implementing an lstm (RNN) which also performed much bettrt than other models . Than i created an calibration system to choose threshold and persistance itself on training on the validation set and than test it on test set . And than created an dashboard for it", "repo": "https://github.com/Matrix-09x/Smart-Reliability-Predictor", "demo": "https://smart-reliability-predictor.vercel.app/"}]...
|
[{"post_id": 77806, "ts": "202 [{"post_id": 77806, "ts": "2026-10-08T11:35:57Z", "hours": 0.3933, "text": "Like i still have 9 hours left to ship as i logged 9 hours more for satisfying the changes required , so i was going to ship again but like i dont want to ship the project again with no change so instead i changed the theme from plain to this theme , like i played with color wheel for a bit and decide to implement this theme . As i read the ratings a lot of you said my project was exceptional the only thing needed work was the theme as it was plain so i changed it ."}, {"post_id": 76387, "ts": "2026-10-03T11:35:02Z", "hours": 3.7606, "text": "Rewrited and completely changed the frontend by hand ."}, {"post_id": 75891, "ts": "2026-10-01T14:51:56Z", "hours": 1.1089, "text": "Added more cool feature to the dashbaord . Just saw an reel and got an idea , so i implemented it right away ."}, {"post_id": 75587, "ts": "2026-09-30T14:20:19Z", "hours": 1.9786, "text": "i wroted the index.html the frontend part myself this time . I learned html , css and js according the requirement .Like i think html is basically nested boxes it was not that complicated and the documentation was also simple i understood it . Css was also good but js takes time . I think it was pretty similar to the streamlit experience liek the logic was same but this time i was writing it in different langugae i just needed the documenatiton for that . Than i deployed it again . I wanted to make the dashbaord looks like exactly like previous one so i treid to keep the theme same as i liked it ."}, {"post_id": 75268, "ts": "2026-09-29T16:27:32Z", "hours": 1.6183, "text": "I just got to know that we cant use streamlit for dashboard . So i switched to vercel . I wrote the code and everything was fine but in deployment process everytime some problem comes i am working and solving it from past 8 hours continuoulsly . hope it get accepted now . Also one thing to clarify if you open the url intially it will show api offlinne its not an problem or error in code . if you click the run analysis button api will be online and will show you the output so its not the problem . Bye"}, {"post_id": 74928, "ts": "2026-09-28T16:39:18Z", "hours": 0.9422, "text": "I have successfully deployed the app on streamlit . Although i faced many problems but i have finally done it . I also added an killer readme check it out . Thats it bye ."}, {"post_id": 74870, "ts": "2026-09-28T14:08:26Z", "hours": 2.5158, "text": "Final Devlog – this is going to be my last devlog . I have finally compelted the project . I have pretrained the model and save it in models file and used added ‘pretrain’ mode and ‘inference’ mode for my funtions for different model . So basically i used the pretrain model for pretraining the models and save it in the models file and used inference mode in the app.py my dashboard where it take the outputs from the models folder directly so it doesnt need to train again . Only readme is left for my project than i will ship it . Bye"}, {"post_id": 74403, "ts": "2026-09-27T10:13:16Z", "hours": 4.7556, "text": "I have improved and completed the final dashboard for the project . I have added more things like line chart , analysis summary , limitations also improved many other things and polished it . Done same to v1/v2 section improved it more and added more things . I also worked on the thing and added css code for it , as plain white was not up to the mark so i choosed this color .Now deploying it is left . But there is one problem like as it will on free cloud service by streamlit , i think it cant run heavy models like lstm , so i think i am gonna pre train the models save the outputs and than deploy it ."}, {"post_id": 73551, "ts": "2026-09-25T11:42:30Z", "hours": 8.8828, "text": "My research with Nasa dataset has officialy ended today , i tried the things that i can possibly do till now and now the time is almost up and i need the remaining time to focus on different things . so my V3.2 of project the calibration layer has also ended , but i found out that the fixes threshold plus persistance is working better than the calibration layer as it produces more precision and recall compare to others , so i think i am gonna keep it . As the dataset is the official and real dataset from NASA so it was expected . By i learned a lot throught this journey , started with Probability and statistics concepts and ended up making an system with real NASA dataset and implementing lstm (RNN) , and other ml models ."}, {"post_id": 70660, "ts": "2026-09-19T15:22:10Z", "hours": 8.7031, "text": "so i mainly focused on two things from past week . I was adding the calibration layer , in which my system is gonna select the best combination of persistance(continuous anomalies) and threshold my itself . For that first i am generating its threshold combination on the validation dataset , where i myself has injected fake anomalies in it . Than i am gonna test those threshold on the testing dataset(currently in progress) . I also completed adding the linear regression and random forest model to the dahboard so the user can choose it and run the model to see the results for that i created 2 more funtions for linear regressiona and random forest and connected it ."}, {"post_id": 66529, "ts": "2026-09-12T11:29:36Z", "hours": 6.9347, "text": "I was studying the outputs produced by my system across various channels , and was plotting multiple graphs , comparing multiple parameters to understand it .And i found out what i need to do next to increase my model efficiency , i know i cant make it perfect because i am currently working on a real dataset by NASA , also i dont have enough time because of my exams . so my next plan is to add an intelligence layer . Like before i was hardcoding the the thresholds like 2std or 3std and the min_consecutive value logic . so i decided to let my system decide it what is best for it . like i am gonna first train my lstm model on validation set and than like compute threshold with the validation error and also the min_consecutive logic and find the best pair and than test it with the testing dataset . and in past hours i also tried to add the option for user to select the model himself to see the output and result , implemented the random forest one , linear regression is left i think i will do it after the lstm improvement .so stay tuned"}, {"post_id": 63000, "ts": "2026-09-06T15:53:39Z", "hours": 4.4397, "text": "Update – Like i made an basic dashboard for my system .Like i separated it in 2 parts , first my previous stimulator based on my maths concept where i myselft created the random anomlies by inputing the no of request and prob of failures and than used z_Score or poission distirbution accorfing to which conditon it satisdy to conclude the results . Thats was V1 of my project , than added bayes concept like where my system pretend it doesnt know the cause , and it finf the p(cause|evidence) which is finding the prob of cause given evidence , that was v2 . now for v3 i created an different system where i added the nasa dataset and than run the models . So i put both of those to show my actual progress , and like user can play with both ones . now i think i will polish it more and than focus on improving the accuracy of lstm ."}, {"post_id": 61585, "ts": "2026-09-04T15:48:56Z", "hours": 1.8197, "text": "I implemented lstm , but its not that accurate , it works great and precision results are awesome , some channel precision were even 100 , but recall is mostly average i need to improve it like its 26 - 45 % . But heres the problem , my school exams are coming and i need to start prepare for that urgently and cherry on top i have this weekend where i can try to give more hours but next week schedule is gonna be tough but i will still try to code and debug and plan everything and solve the problem . so i have decided first to make a dashboard using streamlit in python . That will include V1+V2 and V3 section where user can choose input like channels from NASA dataset and see the results and found anomalies in the system .So i am working on that and postponding my schedule to improve lstm later , because if i try to improve lstm now i dont know how much time it can take and like time will left for making dashbaord so i need to do this first because we get voting on usability section also and i dont it to be cli ."}, {"post_id": 60760, "ts": "2026-09-03T10:53:43Z", "hours": 5.1192, "text": "Update – i completed my analysis with linear regression and random forest model . I calculated the perdect tuning by changing window size to 10 and found out the best threshold for anomalies , my formula for threshold was x * std + mean , and chosing 0.5 as x gave us the best result and it makes as i realize because prediction errors during anomaly range arent that much bigger compare to errors in normal range . so thats why lowering down the x helped us . Also i created confusion matrix and get result for random forest and linear regression model, catching around 42 percent anomaly though only 12-13 % catched were actually correct . Tested the setup on multiple channels , some channels work perfectly and give some good results but some not and with no cleat pattern i end my case with lienar regression model and random forest here and moved towards implementing LSTM . Currently implemeting it and testing it and trying to improve the results . LSTM update will come in next devlog ."}, {"post_id": 57988, "ts": "2026-08-30T10:08:00Z", "hours": 4.3997, "text": "Update , like i finshed anlayzing the sensors . I plotted multiple sensors on graph and like for point i can observe pattern in the graph for changes like high spike in anomaly zone , but for contextual there was no similarity or pattern . even for point the spikes are not similar for every sensors . Some magintude and std is more compare to other . So i conclude that we cant make an rule based system for this dataset . I have to move towards implementing ml . So i used linear regression model first to train on first 10 input and than predict the 11th ouput , as i am doing time series analysis because my dataset is continuous data , so i have kept my window size 10 . so i am currently analyzing how many errors lie in our anoamly zone . If linear regression model didnt perfectly work i will try differnet model like random forest and if they also didnt work i have to move towards lstm ."}, {"post_id": 55099, "ts": "2026-08-26T15:38:14Z", "hours": 4.1028, "text": "I added real Nasa dataset to my system . Its NASA Anomaly Detection Dataset SMAP MSL . Its vast dataset have different sensors sendsing the telemary and giving the values i have been studying the data from the past 4 hours like across different channels to observe pattern . i currently found that channels of point like p-1 , e-11 have different pattern compared to contextual . like i calculated the changes in their consecutive values , and check the values under anomaly range provided inside the dataset . point sensors have very large amount of change inside their anomaly range and contextual have long runs of zero inside their anomaly range . I am still studying the data to conclude more information and patterns ."}, {"post_id": 52909, "ts": "2026-08-23T09:02:31Z", "hours": 2.0408, "text": "After building Bayes, I added a 3x3 confusion matrix to check its accuracy , it tracks how many predictions were correct versus which causes got mixed up with each other. Then I ran the simulation 10,000 times and saved the accuracy from each run into a list, and the average accuracy came out to about 98% . Next step is adding the NASA dataset to make it an real stimulation system ."}, {"post_id": 51877, "ts": "2026-08-21T19:19:37Z", "hours": 2.525, "text": "So after hours of work i successfully added Bayes logic , it was not an easy task because to find p(cause|evidence) i needed to find p(evidence|cause) and p(cause) and p(evidence) for each possible cause . And i was so confused because i used lots of loops to implement this , and after hours i finally did it . And now for every given evidence i have the most probable cause . The bayes is gonna be more useful in future when i will add real dataset from Nasa and ml concepts also ."}, {"post_id": 51140, "ts": "2026-08-20T17:11:34Z", "hours": 3.8539, "text": "Been learning probability and statistics for my ai engineer roadmap for the past month but it was all theory, no projects, so when i found stardance I figured this was a good chance to actually build something with it instead of just reading. The project stimulates a system getting a bunch of requests with some chance of failing, then uses stats to check if the number of failures is normal or if somethings actually wrong, using binomial and poisson to figure out how many failures we’d expect and comparing that to what we actually got. First version used a z-score for this but while testing with small numbers I noticed the results got weird, turned out z-scores don’t work well when the expected failure count is small because the math assumes a symmetric bell curve and at small numbers the real distribution is skewed, so I ended up building an exact fix using the actual poissonon formula instead of the approximation for those cases. After that I started working on figuring out not just that something’s wrong but why, so now every failure gets assigned a hidden cause like database overload, network issues or server overload along with evidence that actually matches it, like high db load for database issues and high latency for network stuff, but with enough overlap that it’s not too obvious or easy. Next up is bayes theorem, where the program only sees the evidence and has to figure out the probability of each cause itself, which is when it goes from just flagging that something’s off to actually explaining why."}]...
|
Title: smart-reliability-predictor by @Matrix | St Title: smart-reliability-predictor by @Matrix | Stardance
Devlogs:
Been learning probability and statistics for my ai engineer roadmap for the past month but it was all theory, no projects, so when i found stardance I figured this was a good chance to actually build something with it instead of just reading. The project stimulates a system getting a bunch of requests with some chance of failing, then uses stats to check if the number of failures is normal or if somethings actually wrong, using binomial and poisson to figure out how many failures we’d expect and comparing that to what we actually got. First version used a z-score for this but while testing with small numbers I noticed the results got weird, turned out z-scores don’t work well when the expected failure count is small because the math assumes a symmetric bell curve and at small numbers the real distribution is skewed, so I ended up building an exact fix using the actual poissonon formula instead of the approximation for those cases. After that I started working on figuring out not just that something’s wrong but why, so now every failure gets assigned a hidden cause like database overload, network issues or server overload along with evidence that actually matches it, like high db load for database issues and high latency for network stuff, but with enough overlap that it’s not too obvious or easy. Next up is bayes theorem, where the program only sees the evidence and has to figure out the probability of each cause itself, which is when it goes from just flagging that something’s off to actually explaining why.
So after hours of work i successfully added Bayes logic , it was not an easy task because to find p(cause|evidence) i needed to find p(evidence|cause) and p(cause) and p(evidence) for each possible cause . And i was so confused because i used lots of loops to implement this , and after hours i finally did it . And now for every given evidence i have the most probable cause . The bayes is gonna be more useful in future when i will add real dataset from Nasa and ml concepts also .
After building Bayes, I added a 3x3 confusion matrix to check its accuracy , it tracks how many predictions were correct versus which causes got mixed up with each other. Then I ran the simulation 10,000 times and saved the accuracy from each run into a list, and the average accuracy came out to about 98% . Next step is adding the NASA dataset to make it an real stimulation system .
I added real Nasa dataset to my system . Its NASA Anomaly Detection Dataset SMAP MSL . Its vast dataset have different sensors sendsing the telemary and giving the values i have been studying the data from the past 4 hours like across different channels to observe pattern . i currently found that channels of point like p-1 , e-11 have different pattern compared to contextual . like i calculated the changes in their consecutive values , and check the values under anomaly range provided inside the dataset . point sensors have very large amount of change inside their anomaly range and contextual have long runs of zero inside their anomaly range . I am still studying the data to conclude more information and patterns .
Update , like i finshed anlayzing the sensors . I plotted multiple sensors on graph and like for point i can observe pattern in the graph for changes like high spike in anomaly zone , but for contextual there was no similarity or pattern . even for point the spikes are not similar for every sensors . Some magintude and std is more compare to other . So i conclude that we cant make an rule based system for this dataset . I have to move towards implementing ml . So i used linear regression model first to train on first 10 input and than predict the 11th ouput , as i am doing time series analysis because my dataset is continuous data , so i have kept my window size 10 . so i am currently analyzing how many errors lie in our anoamly zone . If linear regression model didnt perfectly work i will try differnet model like random forest and if they also didnt work i have to move towards lstm .
Update – i completed my analysis with linear regression and random forest model . I calculated the perdect tuning by changing window size to 10 and found out the best threshold for anomalies , my formula for threshold was x * std + mean , and chosing 0.5 as x gave us the best result and it makes as i realize because prediction errors during anomaly range arent that much bigger compare to errors in normal range . so thats why lowering down the x helped us . Also i created confusion matrix and get result for random forest and linear regression model, catching around 42 percent anomaly though only 12-13 % catched were actually correct . Tested the setup on multiple channels , some channels work perfectly and give some good results but some not and with no cleat pattern i end my case with lienar regression model and random forest here and moved towards implementing LSTM . Currently implemeting it and testing it and trying to improve the results . LSTM update will come in next devlog .
I implemented lstm , but its not that accurate , it works great and precision results are awesome , some channel precision were even 100 , but recall is mostly average i need to improve it like its 26 - 45 % . But heres the problem , my school exams are coming and i need to start prepare for that urgently and cherry on top i have this weekend where i can try to give more hours but next week schedule is gonna be tough but i will still try to code and debug and plan everything and solve the problem . so i have decided first to make a dashboard using streamlit in python . That will include V1+V2 and V3 section where user can choose input like channels from NASA dataset and see the results and found anomalies in the system .So i am working on that and postponding my schedule to improve lstm later , because if i try to improve lstm now i dont know how much time it can take and like time will left for making dashbaord so i need to do this first because we get voting on usability section also and i dont it to be cli .
Update – Like i made an basic dashboard for my system .Like i separated it in 2 parts , first my previous stimulator based on my maths concept where i myselft created the random anomlies by inputing the no of request and prob of failures and than used z_Score or poission distirbution accorfing to which conditon it satisdy to conclude the results . Thats was V1 of my project , than added bayes concept like where my system pretend it doesnt know the cause , and it finf the p(cause|evidence) which is finding the prob of cause given evidence , that was v2 . now for v3 i created an different system where i added the nasa dataset and than run the models . So i put both of those to show my actual progress , and like user can play with both ones . now i think i will polish it more and than focus on improving the accuracy of lstm .
I was studying the outputs produced by my system across various channels , and was plotting multiple graphs , comparing multiple parameters to understand it .And i found out what i need to do next to increase my model efficiency , i know i cant make it perfect because i am currently working on a real dataset by NASA , also i dont have enough time because of my exams . so my next plan is to add an intelligence layer . Like before i was hardcoding the the thresholds like 2std or 3std and the min_consecutive value logic . so i decided to let my system decide it what is best for it . like i am gonna first train my lstm model on validation set and than like compute threshold with the validation error and also the min_consecutive logic and find the best pair and than test it with the testing dataset . and in past hours i also tried to add the option for user to select the model himself to see the output and result , implemented the random forest one , linear regression is left i think i will do it after the lstm improvement .so stay tuned
so i mainly focused on two things from past week . I was adding the calibration layer , in which my system is gonna select the best combination of persistance(continuous anomalies) and threshold my itself . For that first i am generating its threshold combination on the validation dataset , where i myself has injected fake anomalies in it . Than i am gonna test those threshold on the testing dataset(currently in progress) . I also completed adding the linear regression and random forest model to the dahboard so the user can choose it and run the model to see the results for that i created 2 more funtions for linear regressiona and random forest and connected it .
My research with Nasa dataset has officialy ended today , i tried the things that i can possibly do till now and now the time is almost up and i need the remaining time to focus on different things . so my V3.2 of project the calibration layer has also ended , but i found out that the fixes threshold plus persistance is working better than the calibration layer as it produces more precision and recall compare to others , so i think i am gonna keep it . As the dataset is the official and real dataset from NASA so it was expected . By i learned a lot throught this journey , started with Probability and statistics concepts and ended up making an system with real NASA dataset and implementing lstm (RNN) , and other ml models .
I have improved and completed the final dashboard for the project . I have added more things like line chart , analysis summary , limitations also improved many other things and polished it . Done same to v1/v2 section improved it more and added more things . I also worked on the thing and added css code for it , as plain white was not up to the mark so i choosed this color .Now deploying it is left . But there is one problem like as it will on free cloud service by streamlit , i think it cant run heavy models like lstm , so i think i am gonna pre train the models save the outputs and than deploy it .
Final Devlog – this is going to be my last devlog . I have finally compelted the project . I have pretrained the model and save it in models file and used added ‘pretrain’ mode and ‘inference’ mode for my funtions for different model . So basically i used the pretrain model for pretraining the models and save it in the models file and used inference mode in the app.py my dashboard where it take the outputs from the models folder directly so it doesnt need to train again . Only readme is left for my project than i will ship it . Bye
I have successfully deployed the app on streamlit . Although i faced many problems but i have finally done it . I also added an killer readme check it out . Thats it bye .
I just got to know that we cant use streamlit for dashboard . So i switched to vercel . I wrote the code and everything was fine but in deployment process everytime some problem comes i am working and solving it from past 8 hours continuoulsly . hope it get accepted now . Also one thing to clarify if you open the url intially it will show api offlinne its not an problem or error in code . if you click the run analysis button api will be online and will show you the output so its not the problem . Bye
i wroted the index.html the frontend part myself this time . I learned html , css and js according the requirement .Like i think html is basically nested boxes it was not that complicated and the documentation was also simple i understood it . Css was also good but js takes time . I think it was pretty similar to the streamlit experience liek the logic was same but this time i was writing it in different langugae i just needed the documenatiton for that . Than i deployed it again . I wanted to make the dashbaord looks like exactly like previous one so i treid to keep the theme same as i liked it .
Added more cool feature to the dashbaord . Just saw an reel and got an idea , so i implemented it right away .
Rewrited and completely changed the frontend by hand .
Like i still have 9 hours left to ship as i logged 9 hours more for satisfying the changes required , so i was going to ship again but like i dont want to ship the project again with no change so instead i changed the theme from plain to this theme , like i played with color wheel for a bit and decide to implement this theme . As i read the ratings a lot of you said my project was exceptional the only thing needed work was the theme as it was plain so i changed it .
Ships:
I have made an smart reliability predictor analysis which dedects anomaly in the systems and flags it . I have made it using prob and stats concepts like z-score , poission formula , bayes etc . i wrapped this section in v1_v2 . And than i created another section V3 where i added an official NASA SMAP and MSL dataset . this was an tough job because i spended lots of days studying data , plotting it on graphs , trying to find patterns in the anomlies . Than i tried multuple models like linear regression and random forest but they just didnt perform well( i also added this models section where user can choose and see results) . Than i moved towards implementing an lstm (RNN) which also performed much bettrt than other models . Than i created an calibration system to choose threshold and persistance itself on training on the validation set and than test it on test set . And than created an dashboard for it
I have made an smart reliability predictor analysis which dedects anomaly in the systems and flags it . I have made it using prob and stats concepts like z-score , poission formula , bayes etc . i wrapped this section in v1_v2 . And than i created another section V3 where i added an official NASA SMAP and MSL dataset . this was an tough job because i spended lots of days studying data , plotting it on graphs , trying to find patterns in the anomlies . Than i tried multuple models like linear regression and random forest but they just didnt perform well( i also added this models section where user can choose and see results) . Than i moved towards implementing an lstm (RNN) which also performed much bettrt than other models . Than i created an calibration system to choose threshold and persistance itself on training on the validation set and than test it on test set . And created a dashbaord for it and changed it a lots of time and finalize the theme of the dashbaord ....
|
1792853541.9490304
|
1792939941.9490304
|
|
26917
|
Henkan by @Kaanreal | Stardance
|
Kaanreal
|
5
|
87.0
|
1040
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T06:37:02Z", "hours": 24.0, "multiplier": 17.32, "payout": 173, "blessing": "neutral", "text": "This update is mostly about making Henkan feel a lot more complete on desktop. You can now save conversions directly into your detected osu!stable and Etterna song folders, so there’s way less manual moving files around. I also redesigned the desktop navigation and added proper pages for conversion history and your local osu! skin library. Pack conversion got a pretty big upgrade too. You can select which difficulties you actually want to convert, review the metadata for each song, and packs using multiple audio files are now automatically separated into individual songs. I also fixed metadata handling so every map keeps its own artist, title, subtitle, audio and background instead of accidentally sharing data across the pack. Live map detection can now be controlled separately for osu! and Etterna, and Henkan remembers the background of the last map you opened even after restarting. There are a bunch of smaller fixes too: faster pack conversion, better Etterna timing and current-song detection, preserved audio bitrate when changing rates, cleaner loading states and buttons, fixed navigation, plus some macOS and Linux specific fixes. The docs were also refreshed, and Henkan finally has its new domain: https://henkan.kaan.moe", "repo": "https://github.com/kaanreal/henkan", "demo": "http://henkan.kaan.moe/"}, {"ship_num": 2, "ts": "2026-09-06T21:12:59Z", "hours": 5.0, "multiplier": 15.89, "payout": 83, "blessing": "neutral", "text": "This update is mostly about getting Henkan into more places. Henkan can now be installed through winget, Homebrew, the AUR, Chocolatey and nixpkgs. If you use a normal package manager, you don’t have to hunt down the GitHub releases anymore. The site got some attention too. All pages are usable on phones now, and shared links show a proper preview card. I also changed the app icon and logo to a new emblem, which now shows up everywhere, from the desktop app and favicon to the package managers above. Smaller fixes: the preview receptors now line up with the note art, so the editor and the game agree on how the chart looks. You can try the latest release here: https://github.com/kaanreal/henkan/releases Its really hard to provide screenshots or other things cause it is really niche", "repo": "https://github.com/kaanreal/henkan", "demo": "http://henkan.kaan.moe/"}, {"ship_num": 3, "ts": "2026-08-16T23:31:00Z", "hours": 5.0, "multiplier": 18.03, "payout": 88, "blessing": "neutral", "text": "This update is mostly about making Henkan nicer to actually use. The biggest change is the beatmap preview. It can now autoplay the chart when you leave it idle, with notes falling under the receptors like in osu!mania and the HUD staying centered. It makes it way easier to get a feel for a chart before exporting instead of just staring at static note columns. Henkan is also now available in 8 languages . While adding localization, I ended up replacing i18next with a small custom system since I really didn’t need a whole library for what Henkan uses. It’s simpler, lighter, and still covers the entire app. I also added something I’ve wanted for a while: if you import a random .osu file without its audio or background, Henkan can now try to grab the missing files from an osu! mirror automatically. So incomplete beatmap folders are a lot less annoying to deal with. There are some smaller fixes too. Skin images are handled more reliably, previews should match the actual result better, and the updater now gets the real release notes from GitHub instead of showing a placeholder. You can try the latest release here: https://github.com/kaanreal/henkan/releases Its really hard to provide screenshots or other things cause it is really niche", "repo": "https://github.com/kaanreal/henkan", "demo": "http://henkan.kaan.moe/"}, {"ship_num": 4, "ts": "2026-07-27T14:26:43Z", "hours": 32.0, "multiplier": 19.37, "payout": 387, "blessing": "neutral", "text": "Hello, I’ve continued working on Henkan, my osu!mania ↔ Etterna converter, and released several major updates since my first ship. The biggest addition is full skin conversion. Henkan can now convert osu!mania skins into Etterna noteskins and convert Etterna noteskins back into osu!mania skins. This required handling lane textures, sprite sheets, high-resolution assets, Lua files, metrics, redirects, and the different ways both games structure their skins. I also added customizable difficulty name presets. Exported charts can automatically use information such as the title, artist, creator, original difficulty name, or calculated MSD. Users can also change the column width when exporting to osu!mania. Several conversion issues were fixed, including problems with extreme BPM values, export filenames, media files, and configuration support. The web version now behaves much more like the desktop app, with matching exports and features across Rust, Tauri, and WebAssembly. I also improved the project outside of the main application. Windows builds now use NSIS installers, Henkan is available through the AUR, the documentation has been expanded, the CI workflows have been cleaned up, and I added an end-to-end test for the skin converter. Keeping the desktop and web versions consistent is still one of the hardest parts of the project, since converter changes often need separate implementations for Rust and WebAssembly. My goal is still to make Henkan the most reliable way to move charts and skins between osu!mania and Etterna without losing important data.", "repo": "https://github.com/kaanreal/henkan", "demo": "http://henkan.kaan.moe/"}, {"ship_num": 5, "ts": "2026-07-03T22:04:17Z", "hours": 21.0, "multiplier": 18.3, "payout": 309, "blessing": "neutral", "text": "Hello, I made an osu!mania ↔ Etterna converter called Henkan (変換). I started the project because I noticed that most existing converters didn’t preserve maps correctly. Timing would drift, BPM changes would be lost or simplified, and long notes would often break during conversion. I wanted to build a converter that focused on accuracy instead of quick conversions. Henkan converts beatmaps between osu!mania (.osu / .osz) and Etterna/StepMania (.sm) while preserving the original chart as closely as possible. It keeps millisecond-accurate note timing, supports multiple BPM changes, correctly converts long notes, preserves metadata such as title, artist, creator, difficulty, and preview point, and keeps background references. The application is written as a native desktop app using Rust, Tauri, and React, making it lightweight and fast on Windows, macOS, and Linux. It also supports converting entire packs, allowing users to process many maps at once instead of converting them individually. One limitation is that scroll velocity (SV) is not converted from osu!mania to StepMania because the .sm format does not have an equivalent representation for osu!’s green-line SV changes. My goal with Henkan is to provide a reliable converter that players can trust to preserve their charts accurately instead of introducing timing errors or losing important map information.", "repo": "https://github.com/kaanreal/henkan", "demo": "http://henkan.kaan.moe/"}]...
|
[{"post_id": 72835, "ts": "202 [{"post_id": 72835, "ts": "2026-09-23T20:44:40Z", "hours": 12.7947, "text": "Hello! I worked on Henkan a lot again, mostly on making the desktop app nicer and faster to actually use.One of the biggest changes is that Henkan can now save conversions directly into your detected osu!stable or Etterna song folders. So instead of exporting something and moving it into the game manually, you can just convert it and have it show up where it belongs.I also redesigned the desktop navigation and added pages for your conversion history and local osu! skins. The live map detection settings were improved too, so osu! and Etterna hooks can now be enabled separately.Pack conversion got a lot of work as well. You can select individual difficulties before converting, check the metadata for every song, and packs with different audio files are now split into separate songs automatically. I also fixed a bunch of cases where maps inside a pack could lose their own artist, title, audio or background.The converter now remembers the background of the last map you opened too, even after restarting Henkan. It’s a small thing but makes the home screen feel a lot less empty.There were also a bunch of smaller changes. Loading states and buttons are more consistent, navigation is less messy, pack conversion is faster, Etterna timing and current song detection were improved, and changing song rate now keeps the original audio bitrate.I fixed some platform specific stuff too, mainly the osu!lazer background bridge on macOS and Etterna song detection on Linux.I also refreshed the docs and finally moved Henkan to its new domain https://henkan.kaan.moe registrar might be slow so try https://henkan-chi.vercel.app/"}, {"post_id": 69360, "ts": "2026-09-16T21:49:50Z", "hours": 10.9842, "text": "Hello! I worked on Henkan again and added something I’ve wanted for a while. Henkan can now detect the map you currently have open in osu!stable, osu!lazer, or Etterna and show it directly in the converter. No tosu or any other external tool required.This makes it much faster to open Henkan and immediately work with the chart you’re currently playing or editing.Still working on making the whole workflow between osu!mania and Etterna feel as seamless as possible."}, {"post_id": 63187, "ts": "2026-09-06T21:07:39Z", "hours": 5.2017, "text": "Hello! I’ve kept working on Henkan, and shipped quite a few updates since v1.5.0. The biggest new feature is a playable beatmap preview. The editor can now autoplay charts when you’re not interacting with it, notes render underneath the receptors like they do in osu!mania, and the HUD stays properly centered. It makes it much easier to get a feel for how a chart actually plays before exporting it instead of only looking at the note data.Henkan also supports 8 languages now. While adding localization, I ended up removing i18next and replacing it with a much smaller custom localization system. Henkan doesn’t really need everything i18next provides, so this keeps things simpler and lighter.I also improved importing incomplete osu! beatmaps. If you only have an .osu file and the audio or background is missing, Henkan can now automatically try to fetch the missing files from an osu! mirror.There were also a bunch of smaller conversion fixes. Skin images are handled more reliably, and previews should now be closer to what you actually see in-game. Release notes are fetched properly from GitHub instead of using the old placeholder, and config overrides now work consistently in both conversion directions.osu! exports got some fixes too. Backgrounds are included even when the source chart doesn’t directly reference them, cdtitle files are only copied when they’re actually needed, and hold notes were cleaned up to follow the normal osu!mania format with proper hitsounds and clean samples instead of creating unnecessary or broken sound files.I’ve also been trying to close the gap between the desktop and web versions. The web build now has much closer feature and export parity with the Rust/Tauri version, and CI automatically rebuilds the WebAssembly binaries whenever something is pushed to main.Keeping both versions in sync is still one of the more annoying parts of working on Henkan, since some converter changes have to be implemented separately for Rust and WebAssembly, but it’s getting a lot better.The goal is still the same: make Henkan the most reliable way to move charts and skins between osu!mania and Etterna without randomly losing important data."}, {"post_id": 48540, "ts": "2026-08-16T23:29:21Z", "hours": 4.8736, "text": "Hello! I’ve kept working on Henkan, my osu!mania ↔ Etterna converter, and shipped quite a few updates since v1.5.0.The biggest new feature is a playable beatmap preview. The editor can now autoplay charts when you’re not interacting with it, notes render underneath the receptors like they do in osu!mania, and the HUD stays properly centered. It makes it much easier to get a feel for how a chart actually plays before exporting it instead of only looking at the note data.Henkan also supports 8 languages now. While adding localization, I ended up removing i18next and replacing it with a much smaller custom localization system. Henkan doesn’t really need everything i18next provides, so this keeps things simpler and lighter.I also improved importing incomplete osu! beatmaps. If you only have an .osu file and the audio or background is missing, Henkan can now automatically try to fetch the missing files from an osu! mirror.There were also a bunch of smaller conversion fixes. Skin images are handled more reliably, and previews should now be closer to what you actually see in-game. Release notes are fetched properly from GitHub instead of using the old placeholder, and config overrides now work consistently in both conversion directions.osu! exports got some fixes too. Backgrounds are included even when the source chart doesn’t directly reference them, cdtitle files are only copied when they’re actually needed, and hold notes were cleaned up to follow the normal osu!mania format with proper hitsounds and clean samples instead of creating unnecessary or broken sound files.I’ve also been trying to close the gap between the desktop and web versions. The web build now has much closer feature and export parity with the Rust/Tauri version, and CI automatically rebuilds the WebAssembly binaries whenever something is pushed to main.Keeping both versions in sync is still one of the more annoying parts of working on Henkan, since some converter changes have to be implemented separately for Rust and WebAssembly, but it’s getting a lot better.The goal is still the same: make Henkan the most reliable way to move charts and skins between osu!mania and Etterna without randomly losing important data."}, {"post_id": 35508, "ts": "2026-07-26T23:56:48Z", "hours": 12.4944, "text": "Henkan Devlog (v1.3.1 → v1.5.0) v1.4.0 (July 20-23) This update was mainly about skin conversion. I added support for converting osu!mania skins to Etterna noteskins and back. It ended up being much bigger than I expected, with over 1,600 lines of code just for the converter. I also added difficulty name presets with placeholders like title, artist, creator, difficulty, and MSD, fixed an issue with extreme BPM values, and added a column width setting for osu!mania exports. Outside of the app, I improved CI, switched Windows installers to NSIS, added AUR support, improved the documentation, and wrote a full end-to-end test for skin conversion. v1.5.0 (July 24-26) This update focused on making the web version behave the same as the desktop app. I fixed export names, media handling, and config support so browser exports now match Tauri. I also fixed a spacebar shortcut bug, made update notes render as Markdown, and cleaned up the CI workflows. Keeping the web and desktop versions in sync is still one of the hardest parts since every converter change has to work in both Rust and WASM."}, {"post_id": 31742, "ts": "2026-07-20T11:47:27Z", "hours": 19.8603, "text": "Devlog — Countdown fix + WASM sync Fixed countdown being on by default when converting Etterna to osu. Added Countdown: 0 to the [General] section in the converter, the dummy diff generator, and the TypeScript equivalent. Discovered the web version was using a stale pre-built WASM binary that didn’t have any of the Rust fixes. Created wasm-core/ — a new crate that builds WASM from the same Rust source via #[path] references. No code duplication. Added npm run build:wasm for local rebuilds and a CI job that auto-rebuilds WASM on push to main so it never goes stale again"}, {"post_id": 21788, "ts": "2026-07-03T22:01:33Z", "hours": 1.7431, "text": "Hello, today I polished and finished the newest version of Henkan! This version is now the most stable version that also introduced an web based app."}, {"post_id": 21102, "ts": "2026-07-02T21:55:30Z", "hours": 5.2581, "text": "Hello, today I fully worked on making my project available for the web via Vercel! I had to solve many issues like permission issues , timing issues , upload issues and more , I eventually fixed it and can say that it’s working stable now! Now I have to sleep…"}, {"post_id": 19532, "ts": "2026-06-30T21:09:08Z", "hours": 14.2728, "text": "Hello, this is my first log! I have to admit that my project is kinda niche but it fills the gaps of the rhythm game community. Short introduction : Im making an advanced osu!mania ↔ Etterna beatmap converter to simplify the mapping and playing of maps. I really depend on making it high performance and feature rich, for example: I had to go through many issues like fixing timing issues , conversion logic , or other things, but I learned from it and fixed them in a way that sets other converters in the ground. I started my project a few days before I found out about stardance hack club so im kinda sad that this time doesn’t count :(. Anyways, im happy to share my progress from now on. Today I focused on developing the CLI for my project and polishing some things, I think it turned out great"}]...
|
Title: Henkan by @Kaanreal | Stardance
Devlogs:
H Title: Henkan by @Kaanreal | Stardance
Devlogs:
Hello, this is my first log! I have to admit that my project is kinda niche but it fills the gaps of the rhythm game community. Short introduction : Im making an advanced osu!mania ↔ Etterna beatmap converter to simplify the mapping and playing of maps. I really depend on making it high performance and feature rich, for example: I had to go through many issues like fixing timing issues , conversion logic , or other things, but I learned from it and fixed them in a way that sets other converters in the ground. I started my project a few days before I found out about stardance hack club so im kinda sad that this time doesn’t count :(. Anyways, im happy to share my progress from now on. Today I focused on developing the CLI for my project and polishing some things, I think it turned out great
Hello, today I fully worked on making my project available for the web via Vercel! I had to solve many issues like permission issues , timing issues , upload issues and more , I eventually fixed it and can say that it’s working stable now! Now I have to sleep…
Hello, today I polished and finished the newest version of Henkan! This version is now the most stable version that also introduced an web based app.
Devlog — Countdown fix + WASM sync Fixed countdown being on by default when converting Etterna to osu. Added Countdown: 0 to the [General] section in the converter, the dummy diff generator, and the TypeScript equivalent. Discovered the web version was using a stale pre-built WASM binary that didn’t have any of the Rust fixes. Created wasm-core/ — a new crate that builds WASM from the same Rust source via #[path] references. No code duplication. Added npm run build:wasm for local rebuilds and a CI job that auto-rebuilds WASM on push to main so it never goes stale again
Henkan Devlog (v1.3.1 → v1.5.0) v1.4.0 (July 20-23) This update was mainly about skin conversion. I added support for converting osu!mania skins to Etterna noteskins and back. It ended up being much bigger than I expected, with over 1,600 lines of code just for the converter. I also added difficulty name presets with placeholders like title, artist, creator, difficulty, and MSD, fixed an issue with extreme BPM values, and added a column width setting for osu!mania exports. Outside of the app, I improved CI, switched Windows installers to NSIS, added AUR support, improved the documentation, and wrote a full end-to-end test for skin conversion. v1.5.0 (July 24-26) This update focused on making the web version behave the same as the desktop app. I fixed export names, media handling, and config support so browser exports now match Tauri. I also fixed a spacebar shortcut bug, made update notes render as Markdown, and cleaned up the CI workflows. Keeping the web and desktop versions in sync is still one of the hardest parts since every converter change has to work in both Rust and WASM.
Hello! I’ve kept working on Henkan, my osu!mania ↔ Etterna converter, and shipped quite a few updates since v1.5.0.The biggest new feature is a playable beatmap preview. The editor can now autoplay charts when you’re not interacting with it, notes render underneath the receptors like they do in osu!mania, and the HUD stays properly centered. It makes it much easier to get a feel for how a chart actually plays before exporting it instead of only looking at the note data.Henkan also supports 8 languages now. While adding localization, I ended up removing i18next and replacing it with a much smaller custom localization system. Henkan doesn’t really need everything i18next provides, so this keeps things simpler and lighter.I also improved importing incomplete osu! beatmaps. If you only have an .osu file and the audio or background is missing, Henkan can now automatically try to fetch the missing files from an osu! mirror.There were also a bunch of smaller conversion fixes. Skin images are handled more reliably, and previews should now be closer to what you actually see in-game. Release notes are fetched properly from GitHub instead of using the old placeholder, and config overrides now work consistently in both conversion directions.osu! exports got some fixes too. Backgrounds are included even when the source chart doesn’t directly reference them, cdtitle files are only copied when they’re actually needed, and hold notes were cleaned up to follow the normal osu!mania format with proper hitsounds and clean samples instead of creating unnecessary or broken sound files.I’ve also been trying to close the gap between the desktop and web versions. The web build now has much closer feature and export parity with the Rust/Tauri version, and CI automatically rebuilds the WebAssembly binaries whenever something is pushed to main.Keeping both versions in sync is still one of the more annoying parts of working on Henkan, since some converter changes have to be implemented separately for Rust and WebAssembly, but it’s getting a lot better.The goal is still the same: make Henkan the most reliable way to move charts and skins between osu!mania and Etterna without randomly losing important data.
Hello! I’ve kept working on Henkan, and shipped quite a few updates since v1.5.0. The biggest new feature is a playable beatmap preview. The editor can now autoplay charts when you’re not interacting with it, notes render underneath the receptors like they do in osu!mania, and the HUD stays properly centered. It makes it much easier to get a feel for how a chart actually plays before exporting it instead of only looking at the note data.Henkan also supports 8 languages now. While adding localization, I ended up removing i18next and replacing it with a much smaller custom localization system. Henkan doesn’t really need everything i18next provides, so this keeps things simpler and lighter.I also improved importing incomplete osu! beatmaps. If you only have an .osu file and the audio or background is missing, Henkan can now automatically try to fetch the missing files from an osu! mirror.There were also a bunch of smaller conversion fixes. Skin images are handled more reliably, and previews should now be closer to what you actually see in-game. Release notes are fetched properly from GitHub instead of using the old placeholder, and config overrides now work consistently in both conversion directions.osu! exports got some fixes too. Backgrounds are included even when the source chart doesn’t directly reference them, cdtitle files are only copied when they’re actually needed, and hold notes were cleaned up to follow the normal osu!mania format with proper hitsounds and clean samples instead of creating unnecessary or broken sound files.I’ve also been trying to close the gap between the desktop and web versions. The web build now has much closer feature and export parity with the Rust/Tauri version, and CI automatically rebuilds the WebAssembly binaries whenever something is pushed to main.Keeping both versions in sync is still one of the more annoying parts of working on Henkan, since some converter changes have to be implemented separately for Rust and WebAssembly, but it’s getting a lot better.The goal is still the same: make Henkan the most reliable way to move charts and skins between osu!mania and Etterna without randomly losing important data.
Hello! I worked on Henkan again and added something I’ve wanted for a while. Henkan can now detect the map you currently have open in osu!stable, osu!lazer, or Etterna and show it directly in the converter. No tosu or any other external tool required.This makes it much faster to open Henkan and immediately work with the chart you’re currently playing or editing.Still working on making the whole workflow between osu!mania and Etterna feel as seamless as possible.
Hello! I worked on Henkan a lot again, mostly on making the desktop app nicer and faster to actually use.One of the biggest changes is that Henkan can now save conversions directly into your detected osu!stable or Etterna song folders. So instead of exporting something and moving it into the game manually, you can just convert it and have it show up where it belongs.I also redesigned the desktop navigation and added pages for your conversion history and local osu! skins. The live map detection settings were improved too, so osu! and Etterna hooks can now be enabled separately.Pack conversion got a lot of work as well. You can select individual difficulties before converting, check the metadata for every song, and packs with different audio files are now split into separate songs automatically. I also fixed a bunch of cases where maps inside a pack could lose their own artist, title, audio or background.The converter now remembers the background of the last map you opened too, even after restarting Henkan. It’s a small thing but makes the home screen feel a lot less empty.There were also a bunch of smaller changes. Loading states and buttons are more consistent, navigation is less messy, pack conversion is faster, Etterna timing and current song detection were improved, and changing song rate now keeps the original audio bitrate.I fixed some platform specific stuff too, mainly the osu!lazer background bridge on macOS and Etterna song detection on Linux.I also refreshed the docs and finally moved Henkan to its new domain https://henkan.kaan.moe registrar might be slow so try https://henkan-chi.vercel.app/
Ships:
Hello, I made an osu!mania ↔ Etterna converter called Henkan (変換). I started the project because I noticed that most existing converters didn’t preserve maps correctly. Timing would drift, BPM changes would be lost or simplified, and long notes would often break during conversion. I wanted to build a converter that focused on accuracy instead of quick conversions. Henkan converts beatmaps between osu!mania (.osu / .osz) and Etterna/StepMania (.sm) while preserving the original chart as closely as possible. It keeps millisecond-accurate note timing, supports multiple BPM changes, correctly converts long notes, preserves metadata such as title, artist, creator, difficulty, and preview point, and keeps background references. The application is written as a native desktop app using Rust, Tauri, and React, making it lightweight and fast on Windows, macOS, and Linux. It also supports converting entire packs, allowing users to process many maps at once instead of converting them individually. One limitation is that scroll velocity (SV) is not converted from osu!mania to StepMania because the .sm format does not have an equivalent representation for osu!’s green-line SV changes. My goal with Henkan is to provide a reliable converter that players can trust to preserve their charts accurately instead of introducing timing errors or losing important map information.
Hello, I’ve continued working on Henkan, my osu!mania ↔ Etterna converter, and released several major updates since my first ship. The biggest addition is full skin conversion. Henkan can now convert osu!mania skins into Etterna noteskins and convert Etterna noteskins back into osu!mania skins. This required handling lane textures, sprite sheets, high-resolution assets, Lua files, metrics, redirects, and the different ways both games structure their skins. I also added customizable difficulty name presets. Exported charts can automatically use information such as the title, artist, creator, original difficulty name, or calculated MSD. Users can also change the column width when exporting to osu!mania. Several conversion issues were fixed, including problems with extreme BPM values, export filenames, media files, and configuration support. The web version now behaves much more like the desktop app, with matching exports and features across Rust, Tauri, and WebAssembly. I also improved the project outside of the main application. Windows builds now use NSIS installers, Henkan is available through the AUR, the documentation has been expanded, the CI workflows have been cleaned up, and I added an end-to-end test for the skin converter. Keeping the desktop and web versions consistent is still one of the hardest parts of the project, since converter changes often need separate implementations for Rust and WebAssembly. My goal is still to make Henkan the most reliable way to move charts and skins between osu!mania and Etterna without losing important data.
This update is mostly about making Henkan nicer to actually use. The biggest change is the beatmap preview. It can now autoplay the chart when you leave it idle, with notes falling under the receptors like in osu!mania and the HUD staying centered. It makes it way easier to get a feel for a chart before exporting instead of just staring at static note columns. Henkan is also now available in 8 languages . While adding localization, I ended up replacing i18next with a small custom system since I really didn’t need a whole library for what Henkan uses. It’s simpler, lighter, and still covers the entire app. I also added something I’ve wanted for a while: if you import a random .osu file without its audio or background, Henkan can now try to grab the missing files from an osu! mirror automatically. So incomplete beatmap folders are a lot less annoying to deal with. There are some smaller fixes too. Skin images are handled more reliably, previews should match the actual result better, and the updater now gets the real release notes from GitHub instead of showing a placeholder. You can try the latest release here: https://github.com/kaanreal/henkan/releases Its really hard to provide screenshots or other things cause it is really niche
This update is mostly about getting Henkan into more places. Henkan can now be installed through winget, Homebrew, the AUR, Chocolatey and nixpkgs. If you use a normal package manager, you don’t have to hunt down the GitHub releases anymore. The site got some attention too. All pages are usable on phones now, and shared links show a proper preview card. I also changed the app icon and logo to a new emblem, which now shows up everywhere, from the desktop app and favicon to the package managers above. Smaller fixes: the preview receptors now line up with the note art, so the editor and the game agree on how the chart looks. You can try the latest release here: https://github.com/kaanreal/henkan/releases Its really hard to provide screenshots or other things cause it is really niche
This update is mostly about making Henkan feel a lot more complete on desktop. You can now save conversions directly into your detected osu!stable and Etterna song folders, so there’s way less manual moving files around. I also redesigned the desktop navigation and added proper pages for conversion history and your local osu! skin library. Pack conversion got a pretty big upgrade too. You can select which difficulties you actually want to convert, review the metadata for each song, and packs using multiple audio files are now automatically separated into individual songs. I also fixed metadata handling so every map keeps its own artist, title, subtitle, audio and background instead of accidentally sharing data across the pack. Live map detection can now be controlled separately for osu! and Etterna, and Henkan remembers the background of the last map you opened even after restarting. There are a bunch of smaller fixes too: faster pack conversion, better Etterna timing and current-song detection, preserved audio bitrate when changing rates, cleaner loading states and buttons, fixed navigation, plus some macOS and Linux specific fixes. The docs were also refreshed, and Henkan finally has its new domain: https://henkan.kaan.moe...
|
1792961382.2355194
|
1793047782.2355194
|
|
26037
|
Geomatrix by @muntean_andrew | Stardance
|
muntean_andrew
|
2
|
91.0
|
1037
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-18T09:44:15Z", "hours": 29.0, "multiplier": 13.05, "payout": 462, "blessing": "neutral", "text": "What did you make? What was challenging? What are you proud of? I updated my multiplayer game where interesting geometrical shapes fight each other to dominate the world of maths called Geomatrix. It is built fully in C++ with ENet being used for the client-server communication over UDP and Raylib being used to display graphics on the client side. In Geomatrix different shapes have their own strengths and weaknesses and players have to leverage them in the best way possible so they can win. It was quite challenging trying to stay consistent and not get overwhelmed by the loads of things I could add to the game as my time is limited and I easily ended up in a rabbit-hole about AI models that could play my game, which I didn’t end up making. I am proud that even though I wouldn’t say this is the most sophisticated piece of software, I would say it’s pretty rudimentary compared to other games but I’ve come to expect reliability and modularity from it, which really came in handy when adding the maps and shapes. Even though there were some minor bugs here and there with the new maps and shapes at the beginning, it all ended up working with very small tweaks. What should people know so they can test your project? To test the project follow these steps: Go to releases section of the GitHub repository. Download the Client and Server executables. Download the “maps” folder from the root directory of the repository. Place the Client and Server executables and the “maps” folder inside 1 directory. Start the Server and then the Client. For multiple clients just spin up new instances of the Client.", "repo": "https://github.com/AliendsOG/Geometrical-Brawl-Stars", "demo": "https://github.com/AliendsOG/Geometrical-Brawl-Stars/releases/tag/Pre-alpha"}, {"ship_num": 2, "ts": "2026-07-08T15:02:01Z", "hours": 62.0, "multiplier": 10.25, "payout": 575, "blessing": "neutral", "text": "What did you make? What was challenging? What are you proud of? I made a multiplayer game where interesting geometrical shapes fight each other to dominate the world of maths called Geomatrix. It is built fully in C++ with ENet being used for the client-server communication over UDP and Raylib being used to display graphics on the client side. In Geomatrix different shapes have their own strengths and weaknesses and players have to leverage them in the best way possible so they can win. It was quite challenging getting the client to render and interpolate the packets sent from the server because without taking into account the time difference the players might overshoot, and because the projectiles didn’t have an id at the time, they would flicker in positions where they shouldn’t have been. I am very proud of my server and the client-server communication because were the most reliable and straightforward things during the development of this project, even though I firstly started to build the server, the collision simulation, aiming, map and shape changes were very intuitive which proved to be extremely reliable. This reliability of the server really did come in handy when debugging the numerous bugs of the client, but most of the bugs that I found in the client are now fixed, but if someone finds more, I wouldn’t be surprised and you can contact me and describe the issue. What should people know so they can test your project? To test the project follow these steps: Go to releases section of the GitHub repository. Download the Client and Server executables. Download the “maps” folder from the root directory of the repository. Place the Client and Server executables and the “maps” folder inside 1 directory. Start the Server and then the Client. For multiple clients just spin up new instances of the Client. It is only on Windows at the moment, but in a future update it will be cross platform, even on mobile.", "repo": "https://github.com/AliendsOG/Geometrical-Brawl-Stars", "demo": "https://github.com/AliendsOG/Geometrical-Brawl-Stars/releases/tag/Pre-alpha"}]...
|
[{"post_id": 49424, "ts": "202 [{"post_id": 49424, "ts": "2026-08-18T08:07:01Z", "hours": 2.0125, "text": "I added 2 new shapes that will fight for supremacy in the math world. They are the Astroid and the Reuleaux Triangle. The Astroid is more of a sniper with long range and lots of damage, but smaller ammo. The Reuleaux Triangle is more of a tank with a shorter range and smaller speed but tons of ammo and damage and also loads of health. Also I added 2 new maps, one is a team mode map and another is a PVE map in which each shape has to fight to be the only one standing at the end of the match."}, {"post_id": 49068, "ts": "2026-08-17T17:43:39Z", "hours": 1.975, "text": "I added the aiming line overlay to make it easier for players to see where they are aiming. It was actually a little bit of spaghetti code involved in the making of this as I use a function to draw the match and another function calculates the last point of the line and returns it but I made it work and it does so beautifully and reliably. I am thinking of maybe adding 1 or 2 more shapes and 1 or 2 new maps and I’d say the project is ready for another ship!"}, {"post_id": 45690, "ts": "2026-08-12T10:43:13Z", "hours": 3.9244, "text": "After a bit of a pause on this project because I wanted to clear my mind a little and do the Hackpad hardware project I returned and made the Game Over screen a bit nicer and so everything is beginning to tie together. I wrote Reals and Quanta so that new users will know what those icons mean. In addition I redesigned the map selection screen to show a preview of the map before selecting it. I am also thinking of adding an aim overview and the players just hold the arrow keys or move the right joystick on the controller."}, {"post_id": 35801, "ts": "2026-07-27T13:53:01Z", "hours": 4.3969, "text": "These past days I am trying to figure out how to implement the IPC (inter process communication) between Python (where the AI model will be made) and the C++ “megaclient” that acts as 10 clients that connect to the game server. From what I’ve seen one of the easiest ways to implement it is through binary standard streams because I’ll have to move 14KB of data per frame, and because I will unlock the speed of the server physics simulation, it will be like thousands of frames per second, which will add up pretty fast. But the problem isn’t the actual size of data, but the latency, if I would just save it into a txt file my SSD will be hit with thousands of requests every second, so keeping everything in the RAM is why I chose to try and implement the IPC through binary standard streams. But I didn’t yet get it working and my brain hurts a little cause for the first time since the beginning of this project I have absolutely no idea what to do or how to actually solve this issue and I kinda feel lost and a bit demotivated, that’s why this week I managed a bit over 1hr of coding per day. But at the same time I’ve been watching more and more videos about how to build AI models and for the first version I’ll build a standard Backprop model as I’ve read in a paper that Predictive Coding approximates Backprop. The problem is this will have to come after the IPC is implemented successfully, which currently it is not. If anyone sees and reads this I would happily accept any suggestions on how to implement the IPC between Python and C++."}, {"post_id": 31456, "ts": "2026-07-19T20:32:11Z", "hours": 3.9214, "text": "I’m starting the development of an Predictive Coding AI model that would play my game as a bot. I’ll make it in Python so I can learn a new language and as it is the standard language used in AI development. Currently I’m building a kind of “mega client” which acts as 10 client that connect to the server and it displays the whole map on the screen with all the players. After this I will link the Python project with the “Mega Client” through standard streams as ENet on Python isn’t really a modern supported thing and this will cut down network bandwidth and I think will decrease the CPU overhead while the model trains. When the link between the Python and C++ program is finished then I’ll start the development of the actual AI model, which will involve reading through some scientific papers on the topic. Right now I have 2 of them bookmarked, but you never know when something new may pop up."}, {"post_id": 30359, "ts": "2026-07-17T20:44:31Z", "hours": 3.7181, "text": "I designed kinda a rough sketch of how the icons for the game currencies could look like. The sine waves are drawn in Raylib and they are static, as well as the circle and the border. The “R” and “i” in the reals and imaginaries’ icon are font characters. Initially I thought about drawing everything, but then I saw a video about game optimization and that it’s very inefficient for the GPU to render small triangles, which eliminated the drawing in Raylib option, and also it would have been a hassle and a half. So this left 2 choices, load the R and i as a font or an image. I chose to load them as fonts because this allows better scalability, as a font isn’t made of pixels. But I didn’t know how much time I will spend making the font implementation to work. First I had to find the fonts that had my desired characters, which was a little tedious having to download or scroll through the list of characters for each font. For this I had to install Font Forge so I could view every character in the font. After that I had to create a new font and to replace the i and R characters of the font with my special characters and then hook it up to Raylib. After loading up my special font I had to tell Raylib whicch characters to import, and I had to measure the characters visual height so I could align them properly in the icon. Each icon is drawn using their specific function, but I am thinking of combining them into one function in the future."}, {"post_id": 29455, "ts": "2026-07-16T12:35:42Z", "hours": 7.1175, "text": "Currently I’m focusing on UI refinement, currency introduction and “trophy” road implementation. I introduced to the game: Reals - the basic currency of the game (kinda like coins in any other game), you win them after a match and they can be used to buy shapes and upgrades. If it wasn’t obvious, the name comes from the set of real numbers. Imaginaries - they are the “premium” currency in the game which can be used to buy reals. At the moment the game doesn’t really use them or display them.😅 It’s a work in progress so yeah. Quanta - these are the equivalent of trophies, they would determine the skill of the player. You gain then winning matches and also lose them losing matches. At the end of the match (or when the player is eliminated) the server transmits a packet in which is specified the amount of reals and quanta received by the player. At the moment the amount of currency a player has is stored in a txt file in the game directory for simplicity. In the future I think that maybe it could be encrypted somehow with a key given by the server so the player won’t just be able to modify it. In addition to this, I changed the UI for the main screen, the shape selection screen and introduces the ability to see the shape, it’s level, stats, and to upgrade it. I’ll be honest that I took a bit of “inspiration” from the Brawl Stars layout, but tried to change some things, and my UI is still not in it’s final form. Everything is done in Raylib, I still don’t use any PNG textures because I want everything to be vectors cause they are not limited by resolution (which maybe is worse for optimisation) and frankly because I don’t know how and I’m a little afraid to try. 😅 The settings and map selection menu still remained the same, maybe I’ll work on the map selection menu but idk about the settings menu cause it technically works and as the saying goes “if it works, don’t touch it”, and I’m a little afraid of touching it. Also I’m thinking of introducing a scale variable for text, like the UI elements are defined by the width and height of the window, but the font size of the text is it plain pixels, so I’m thinking of making the text scale based on how it looks at 1080p and if the resolution is lower or higher the font size will multiply with the scale that will be the players resolution height divided by 1080. After the UI layout is “done”, which hopefully will happen till the end of the week, I’m starting the development and training of the Predictive Coding AI model that will play my game as a bot. P.S.: I’m trying to make longer devlogs as that was suggested numerous times in the reviews of the first ship."}, {"post_id": 25822, "ts": "2026-07-10T09:05:29Z", "hours": 2.4131, "text": "Added Linux support!!!"}, {"post_id": 24592, "ts": "2026-07-08T09:25:14Z", "hours": 1.1092, "text": "Finally got the settings to work, but the user has to press Enter twice for the change to happen, but hey, it’s not a bug, it’s a feature. 😅 I’m getting ready to ship this first alpha version of Geomatrix. It has been such a journey managing UDP packet types, the server physics simulations, the client interpolation and the Raylib rendering pipeline. But at the end of the day, it was fun, and I learned a ton about client-server communication and the massive optimizations you can unlock when you find the right architectural abstractions."}, {"post_id": 24359, "ts": "2026-07-07T21:27:49Z", "hours": 4.04, "text": "Trying to get the settings menu to work. Firstly I made a general menu class, then I added to it a submenu vector, and I got it to work when I was only focused on getting the resolution to change. But then I tried to implement the frame rate setting and so the class had to be redesigned and now, let’s say it’s halfway there. PS: the total time across the 2 Hackatime projects (server and client) linked to this Stardance project is 71hrs."}, {"post_id": 23794, "ts": "2026-07-06T22:53:58Z", "hours": 4.8689, "text": "Implemented settings and a save file. Now whenever the user reopens the game it remembers their last used shape and map so they don’t have to reselect them. The settings UI is only partially made. P.S.: Hackatime shows the 2 linked project times to be 31hrs 55min and 35hrs 8 min respectively, but the total somehow is 57hrs 19 min."}, {"post_id": 23073, "ts": "2026-07-05T20:13:55Z", "hours": 6.6294, "text": "Added support for new shapes and levels. Different shapes have different stats and some of them can be upgraded with a leveling up system. Also added a sine wave animation to a tile."}, {"post_id": 22465, "ts": "2026-07-04T22:45:53Z", "hours": 4.1553, "text": "Introduced a new tech inspired design into the game. Now players that are in a “bush” get invisible. Made the game modular and added support for multiple maps on the server side. P.S.: In Hackatime I have 54 hours logged on this project, 8 more than Stardance logged, this discrepancy appeared 2-3 devlogs ago and I asked on the stardance-help chat about it, but I got no response."}, {"post_id": 21790, "ts": "2026-07-03T22:04:37Z", "hours": 5.9508, "text": "Added a title screen, lobby waiting screen and a game over screen"}, {"post_id": 21117, "ts": "2026-07-02T22:17:01Z", "hours": 1.6061, "text": "Now users can resize the window and the game scales perfectly. There is now a main menu and a game over screen is in the works."}, {"post_id": 20365, "ts": "2026-07-01T22:57:07Z", "hours": 10.1514, "text": "I’ve implemented a “fog of war” so the server only sends to the player the data about the other players that they can actually see. I made the camera follow the current player. The game now uses interpolation to smooth out the data packets coming from the server, so players can enjoy smoother gameplay. Also the tick rate was increased to 69Hz. The network packets are now dynamic, they do not have a fixed size, this saves network bandwidth. What I wanna do next: create some basic UI; create a basic game over screen; introduce new shapes as playable “characters”; maybe introduce a trophy system"}, {"post_id": 18320, "ts": "2026-06-29T12:56:54Z", "hours": 16.1739, "text": "I’ve implemented shooting and health in the game. Next I have to add a reload and ammo count. After that I could start to focus onto implementing some interpolation in the player and bullet’s movement to make it move at 144FPS not at the 30Hz tick rate of the server."}, {"post_id": 15942, "ts": "2026-06-25T22:02:49Z", "hours": 7.7833, "text": "Test the server side movement functionality"}]...
|
Title: Geomatrix by @muntean_andrew | Stardance
D Title: Geomatrix by @muntean_andrew | Stardance
Devlogs:
Test the server side movement functionality
I’ve implemented shooting and health in the game. Next I have to add a reload and ammo count. After that I could start to focus onto implementing some interpolation in the player and bullet’s movement to make it move at 144FPS not at the 30Hz tick rate of the server.
I’ve implemented a “fog of war” so the server only sends to the player the data about the other players that they can actually see. I made the camera follow the current player. The game now uses interpolation to smooth out the data packets coming from the server, so players can enjoy smoother gameplay. Also the tick rate was increased to 69Hz. The network packets are now dynamic, they do not have a fixed size, this saves network bandwidth. What I wanna do next: create some basic UI; create a basic game over screen; introduce new shapes as playable “characters”; maybe introduce a trophy system
Now users can resize the window and the game scales perfectly. There is now a main menu and a game over screen is in the works.
Added a title screen, lobby waiting screen and a game over screen
Introduced a new tech inspired design into the game. Now players that are in a “bush” get invisible. Made the game modular and added support for multiple maps on the server side. P.S.: In Hackatime I have 54 hours logged on this project, 8 more than Stardance logged, this discrepancy appeared 2-3 devlogs ago and I asked on the stardance-help chat about it, but I got no response.
Added support for new shapes and levels. Different shapes have different stats and some of them can be upgraded with a leveling up system. Also added a sine wave animation to a tile.
Implemented settings and a save file. Now whenever the user reopens the game it remembers their last used shape and map so they don’t have to reselect them. The settings UI is only partially made. P.S.: Hackatime shows the 2 linked project times to be 31hrs 55min and 35hrs 8 min respectively, but the total somehow is 57hrs 19 min.
Trying to get the settings menu to work. Firstly I made a general menu class, then I added to it a submenu vector, and I got it to work when I was only focused on getting the resolution to change. But then I tried to implement the frame rate setting and so the class had to be redesigned and now, let’s say it’s halfway there. PS: the total time across the 2 Hackatime projects (server and client) linked to this Stardance project is 71hrs.
Finally got the settings to work, but the user has to press Enter twice for the change to happen, but hey, it’s not a bug, it’s a feature. 😅 I’m getting ready to ship this first alpha version of Geomatrix. It has been such a journey managing UDP packet types, the server physics simulations, the client interpolation and the Raylib rendering pipeline. But at the end of the day, it was fun, and I learned a ton about client-server communication and the massive optimizations you can unlock when you find the right architectural abstractions.
Added Linux support!!!
Currently I’m focusing on UI refinement, currency introduction and “trophy” road implementation. I introduced to the game: Reals - the basic currency of the game (kinda like coins in any other game), you win them after a match and they can be used to buy shapes and upgrades. If it wasn’t obvious, the name comes from the set of real numbers. Imaginaries - they are the “premium” currency in the game which can be used to buy reals. At the moment the game doesn’t really use them or display them.😅 It’s a work in progress so yeah. Quanta - these are the equivalent of trophies, they would determine the skill of the player. You gain then winning matches and also lose them losing matches. At the end of the match (or when the player is eliminated) the server transmits a packet in which is specified the amount of reals and quanta received by the player. At the moment the amount of currency a player has is stored in a txt file in the game directory for simplicity. In the future I think that maybe it could be encrypted somehow with a key given by the server so the player won’t just be able to modify it. In addition to this, I changed the UI for the main screen, the shape selection screen and introduces the ability to see the shape, it’s level, stats, and to upgrade it. I’ll be honest that I took a bit of “inspiration” from the Brawl Stars layout, but tried to change some things, and my UI is still not in it’s final form. Everything is done in Raylib, I still don’t use any PNG textures because I want everything to be vectors cause they are not limited by resolution (which maybe is worse for optimisation) and frankly because I don’t know how and I’m a little afraid to try. 😅 The settings and map selection menu still remained the same, maybe I’ll work on the map selection menu but idk about the settings menu cause it technically works and as the saying goes “if it works, don’t touch it”, and I’m a little afraid of touching it. Also I’m thinking of introducing a scale variable for text, like the UI elements are defined by the width and height of the window, but the font size of the text is it plain pixels, so I’m thinking of making the text scale based on how it looks at 1080p and if the resolution is lower or higher the font size will multiply with the scale that will be the players resolution height divided by 1080. After the UI layout is “done”, which hopefully will happen till the end of the week, I’m starting the development and training of the Predictive Coding AI model that will play my game as a bot. P.S.: I’m trying to make longer devlogs as that was suggested numerous times in the reviews of the first ship.
I designed kinda a rough sketch of how the icons for the game currencies could look like. The sine waves are drawn in Raylib and they are static, as well as the circle and the border. The “R” and “i” in the reals and imaginaries’ icon are font characters. Initially I thought about drawing everything, but then I saw a video about game optimization and that it’s very inefficient for the GPU to render small triangles, which eliminated the drawing in Raylib option, and also it would have been a hassle and a half. So this left 2 choices, load the R and i as a font or an image. I chose to load them as fonts because this allows better scalability, as a font isn’t made of pixels. But I didn’t know how much time I will spend making the font implementation to work. First I had to find the fonts that had my desired characters, which was a little tedious having to download or scroll through the list of characters for each font. For this I had to install Font Forge so I could view every character in the font. After that I had to create a new font and to replace the i and R characters of the font with my special characters and then hook it up to Raylib. After loading up my special font I had to tell Raylib whicch characters to import, and I had to measure the characters visual height so I could align them properly in the icon. Each icon is drawn using their specific function, but I am thinking of combining them into one function in the future.
I’m starting the development of an Predictive Coding AI model that would play my game as a bot. I’ll make it in Python so I can learn a new language and as it is the standard language used in AI development. Currently I’m building a kind of “mega client” which acts as 10 client that connect to the server and it displays the whole map on the screen with all the players. After this I will link the Python project with the “Mega Client” through standard streams as ENet on Python isn’t really a modern supported thing and this will cut down network bandwidth and I think will decrease the CPU overhead while the model trains. When the link between the Python and C++ program is finished then I’ll start the development of the actual AI model, which will involve reading through some scientific papers on the topic. Right now I have 2 of them bookmarked, but you never know when something new may pop up.
These past days I am trying to figure out how to implement the IPC (inter process communication) between Python (where the AI model will be made) and the C++ “megaclient” that acts as 10 clients that connect to the game server. From what I’ve seen one of the easiest ways to implement it is through binary standard streams because I’ll have to move 14KB of data per frame, and because I will unlock the speed of the server physics simulation, it will be like thousands of frames per second, which will add up pretty fast. But the problem isn’t the actual size of data, but the latency, if I would just save it into a txt file my SSD will be hit with thousands of requests every second, so keeping everything in the RAM is why I chose to try and implement the IPC through binary standard streams. But I didn’t yet get it working and my brain hurts a little cause for the first time since the beginning of this project I have absolutely no idea what to do or how to actually solve this issue and I kinda feel lost and a bit demotivated, that’s why this week I managed a bit over 1hr of coding per day. But at the same time I’ve been watching more and more videos about how to build AI models and for the first version I’ll build a standard Backprop model as I’ve read in a paper that Predictive Coding approximates Backprop. The problem is this will have to come after the IPC is implemented successfully, which currently it is not. If anyone sees and reads this I would happily accept any suggestions on how to implement the IPC between Python and C++.
After a bit of a pause on this project because I wanted to clear my mind a little and do the Hackpad hardware project I returned and made the Game Over screen a bit nicer and so everything is beginning to tie together. I wrote Reals and Quanta so that new users will know what those icons mean. In addition I redesigned the map selection screen to show a preview of the map before selecting it. I am also thinking of adding an aim overview and the players just hold the arrow keys or move the right joystick on the controller.
I added the aiming line overlay to make it easier for players to see where they are aiming. It was actually a little bit of spaghetti code involved in the making of this as I use a function to draw the match and another function calculates the last point of the line and returns it but I made it work and it does so beautifully and reliably. I am thinking of maybe adding 1 or 2 more shapes and 1 or 2 new maps and I’d say the project is ready for another ship!
I added 2 new shapes that will fight for supremacy in the math world. They are the Astroid and the Reuleaux Triangle. The Astroid is more of a sniper with long range and lots of damage, but smaller ammo. The Reuleaux Triangle is more of a tank with a shorter range and smaller speed but tons of ammo and damage and also loads of health. Also I added 2 new maps, one is a team mode map and another is a PVE map in which each shape has to fight to be the only one standing at the end of the match.
Ships:
What did you make? What was challenging? What are you proud of? I made a multiplayer game where interesting geometrical shapes fight each other to dominate the world of maths called Geomatrix. It is built fully in C++ with ENet being used for the client-server communication over UDP and Raylib being used to display graphics on the client side. In Geomatrix different shapes have their own strengths and weaknesses and players have to leverage them in the best way possible so they can win. It was quite challenging getting the client to render and interpolate the packets sent from the server because without taking into account the time difference the players might overshoot, and because the projectiles didn’t have an id at the time, they would flicker in positions where they shouldn’t have been. I am very proud of my server and the client-server communication because were the most reliable and straightforward things during the development of this project, even though I firstly started to build the server, the collision simulation, aiming, map and shape changes were very intuitive which proved to be extremely reliable. This reliability of the server really did come in handy when debugging the numerous bugs of the client, but most of the bugs that I found in the client are now fixed, but if someone finds more, I wouldn’t be surprised and you can contact me and describe the issue. What should people know so they can test your project? To test the project follow these steps: Go to releases section of the GitHub repository. Download the Client and Server executables. Download the “maps” folder from the root directory of the repository. Place the Client and Server executables and the “maps” folder inside 1 directory. Start the Server and then the Client. For multiple clients just spin up new instances of the Client. It is only on Windows at the moment, but in a future update it will be cross platform, even on mobile.
What did you make? What was challenging? What are you proud of? I updated my multiplayer game where interesting geometrical shapes fight each other to dominate the world of maths called Geomatrix. It is built fully in C++ with ENet being used for the client-server communication over UDP and Raylib being used to display graphics on the client side. In Geomatrix different shapes have their own strengths and weaknesses and players have to leverage them in the best way possible so they can win. It was quite challenging trying to stay consistent and not get overwhelmed by the loads of things I could add to the game as my time is limited and I easily ended up in a rabbit-hole about AI models that could play my game, which I didn’t end up making. I am proud that even though I wouldn’t say this is the most sophisticated piece of software, I would say it’s pretty rudimentary compared to other games but I’ve come to expect reliability and modularity from it, which really came in handy when adding the maps and shapes. Even though there were some minor bugs here and there with the new maps and shapes at the beginning, it all ended up working with very small tweaks. What should people know so they can test your project? To test the project follow these steps: Go to releases section of the GitHub repository. Download the Client and Server executables. Download the “maps” folder from the root directory of the repository. Place the Client and Server executables and the “maps” folder inside 1 directory. Start the Server and then the Client. For multiple clients just spin up new instances of the Client....
|
1792972537.0265381
|
1793058937.0265381
|
|
6494
|
Irongingot by @TheShovel | Stardance
|
TheShovel
|
1
|
60.63
|
1033
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-20T14:59:09Z", "hours": 57.0, "multiplier": 19.31, "payout": 1033, "blessing": "neutral", "text": "Made a Minecraft server can uses like 5% CPU and less than 7mb of ram, because I really wanted to host a Java server on one of my old Raspberry Pis. I found this project called Bareiron, made by PortalRunner, but it was very very very bare bones and simple. So I decided to work on it and make it as close to vanilla as I can until I get tired of it! This is the result of that :)", "repo": "https://github.com/TheShovel/irongingot", "demo": "https://theshovel.rocks/irongingot/"}]...
|
[{"post_id": 25982, "ts": "202 [{"post_id": 25982, "ts": "2026-07-10T15:06:16Z", "hours": 3.6297, "text": "Since i made the first ship, i have gotten A LOT of bug reports, from the same guy. I want to thank this guy for actually using this and reporting all of these bugs! I still have not fixed all of them. there are a few open ones, but ill get to it eventually. The feedback for this project has been phenomenal and it has made me very happy !! I will keep working on it, adding features from time to time and fixing bugs. It wont be my main priority but ill keep working on it as much as i can :) Thank you!"}, {"post_id": 12556, "ts": "2026-06-20T14:43:31Z", "hours": 12.32, "text": "and so… with this last devlog… it ends. I will be honest, I am burnt out! So, i worked on getting a last stable build that makes survival viable on this server. Tons of testing and bug fixes went into this, and i worked constantly on it until burnout. It’s still not perfect. There’s some random bugs. You might get kicked randomly, but you should be able to get right back in every time. Hopefully. Gulp. Since the last devlog, i implemented so much stuff, i will just link the release here so you can read all of it!! https://github.com/TheShovel/irongingot/releases/tag/V1.6.1 I still am missing some features i wish i would have added. stuff like security improvements and a basic anti cheat but sadly, i gotta move on to something else. Thank you for being with me on this journey though! Was really fun! Heres a video to showcase how far i have come since i forked the original project on github :D"}, {"post_id": 9203, "ts": "2026-06-15T13:28:42Z", "hours": 6.5772, "text": "heyyyy!!! lots since last time. got the recipe book working, implemented item durability, underwater breathing, improved trading by making villagers have professions and levels and actually opening up the trading ui, but most importantly, a big change in the packet code that makes multiplayer incredibly smooth now. i am honestly so tired i cant be bothered to type every single thing i had to go through to get here, but oh my is this project getting more and more complex ish. oh also added critical hits forgot to mention that"}, {"post_id": 8298, "ts": "2026-06-13T19:55:12Z", "hours": 6.7508, "text": "well, it sure has been a bit. This took WAY longer than i thought, but… the server can now read and load vanilla buildings from the nbt data!!! Wohoo!!! This opens so many possibilities and its very exciting :D Also, i have implemented a ton of missing blocks, including blocks that connect. Fences, glass panes, hanging lanterns etc now work properly! (hopefully, im still finding bugs with this. its way more complex than it seems). Along with that, to go with the new villages, i have implemented proper trading! You can now trade with villagers, level them up and get more options! They also all have their specific clothing associated with their profession and all that! Besides that, i fixed some bug reports i got on github, improved world generation blending with structures, and other small misc stuff here and there that is not that interesting. This is really taking shape and its getting closer and closer to vanilla every day. Happy about that :)"}, {"post_id": 6795, "ts": "2026-06-11T11:56:18Z", "hours": 6.7319, "text": "back to the grind i went today. Implemented the “combat update” with amazing features like: Spiders Creepers (They actually create explosions!!) Skeletons (They pew pew) Revamped the player combat to reflect newer minecraft versions Shields (as well as other offhand fixes) Along side that, big groundwork changes. We now have SOUND!!! The server can now send sound packets so you are not left with the noise of your own breathing. AAAAAAND i finally dumped the binary format that the original bareiron used for saving. It SUCKED. It was unreliable and hard to work with. So i just went to a json solution. Im concerned how slow saving could get in a big world, but if i get complaints about that, i will launch the saving on a separate thread or something. Anything but using bin files again… This change also fixes a bug with chest data getting corrupted! So ypeeee! Ok see you next time when i add… other things that i feel like adding… mmmm yes"}, {"post_id": 5567, "ts": "2026-06-09T12:11:38Z", "hours": 4.24, "text": "hiii cuties :3 since last time, i added a couple more systems and things!! while still keeping that ridiculously low memory usage and cpu usage. We now have: Bows, with arrows that get shot with proper physics, and also get stuck to the ground if you miss! Ender pearls! They are… ender pearls! They teleport you. The end is now more… not ehttps://music.youtube.com/watch?v=XRTn6sjRHMo&list=OLAK5uy_lZCA6cMyH3cdQEeAs2WNc8q2lud18JX7gmpty! We have endermen in there too!! We also now have dungeons that spawn zombies and stuff and have juicy loot. anywayyyy i also did a lot of other general code stuff and bug fixing and parity and blah blah too tired to type all of it honestly. See you next time in “jodie tries to do basic stuff but struggles because i want to do it as efficient as possible”"}, {"post_id": 4436, "ts": "2026-06-07T19:11:59Z", "hours": 5.5061, "text": "hey! been some time since the last dev log! Added quite a lot of stuff since then! First of all… FISH! Fish mobs now spawn in water, and drop fish that you can cook. They also have fish specific pathfinding that lets them float and stuff. I also worked on nether structures! 2 different type of structures can now spawn in the nether: towers based on fortresses, and those places where the piglings live. Oh, also, piglings! They now spawn in the nether and you can trade with them! Related to structures, i have also worked on strongholds! They can now spawn underground, and they have an end portal, that right now, just sends you to a very buggy and unfinished version of the end. Regarding mechanics, i also added farming! You can now plant seeds and grow wheat and make bread! I also worked on correctly mapping block break speeds to tools, since i wasnt sending the correct tags to the client before. :And… last but not least, i reduced cpu usage by 70%!!!!! CRAZY!!! Yes the ram usage is still under 10mb, and now the cpu usage floats around 0.1 to 5% in intense situations. That is a HUGE deal taking into account that there are so many new features! (also fixed a bunch of bugs and stuff regarding numbers looping on eachother and stuff) AAAAANyway, see you next dev log :D"}, {"post_id": 3651, "ts": "2026-06-06T17:55:43Z", "hours": 1.4258, "text": "THE BOATS. THE BOATS ARE GONNA GET ME. HEEEELP HEEEEEELP"}, {"post_id": 2879, "ts": "2026-06-05T19:28:59Z", "hours": 3.6275, "text": "As i promised, i started working on the nether! Added some basic biomes and stuff. not that crazy the crazy thing i did here though is LIGHT. Now the server properly does lighting! Blocks that do light, now actually do light! Now, its not perfect. for the sake of performance and keeping that 7mb memory usage low i had to make some sacrifices. the light is per chunk, so if you place a light source between 2 chunks, you will see seams. But it wasnt all smooth sailing sadly :( most of the time i spent was fixing a segmentation fault caused by musl. It took me so long. It wasnt happening when just compiling with the system compiler, musl specifically was causing it. Every time a user joined the server id get a seg fault. Turns out, it was just a memory allocation bug. Since i have to be so tight about memory, it does cause issues as i said in my previous dev logs. Well anywayyyyyy! Next thing is gonna be nether mobs and structures! Maybe even trading?!?! no idea we will see if i feel like it lmao"}, {"post_id": 2647, "ts": "2026-06-05T09:30:55Z", "hours": 3.2011, "text": "I know i said id be working on the nether, but i realized that to make the nether cool, i need some more systems in place! so i started working on structures! Villages and little wooden tunnels can spawn around the world. Villages have multiple types based on their biome of origin, and also can spawn chests with items in them! Along with that, as you can see, the tunnels in the caves can be shaped dynamically! You can make structures shape themselves to the surface they spawn on to make them look more “dynamic”. Its gonna help a lot with the nether! This took so damn long because i spent like half of the time fixing bugs with chests and doors. The minecraft client is SO picky about entity data. Anything goes slightly wrong and BOOM you get disconnected!!! with that said im proud of what i have here so far :) next devlog will most likely be with nether world generation, unless i find another game breaking bug and have to rewrite a bunch of stuff. love you gonna go eat lunch now -3-"}, {"post_id": 2357, "ts": "2026-06-04T20:11:28Z", "hours": 1.9572, "text": "You can now craft a nether portal in survival! I implemented buckets, fluids and the interaction that allows for obsidian! Right now as you can see, the fluid interactions are kinda wacky… gonna work on that. Also, unrelated to that, but I reimplemented chests! Which took me WAAAAAY too long. It pissed me off so bad that i just left an LLM to debug stuff till it figured out why my Minecraft client was getting disconnected for a “invalid item id” when opening an empty chest (i was hungry so i wanted to eat but i also got really frustrated and wanted to figure that out. dont judge me i am disappointed in myself as well) Anyway turns out it was getting some garbage data and interpreting it as item data in a chest. Messed up some data types. Happens when you are trying to make something use as little memory as possible. While i was at it, i also added the little opening and closing animation that chests do. Apparently that is server side. Never thought it was but i guess it makes sense"}, {"post_id": 2236, "ts": "2026-06-04T16:57:23Z", "hours": 2.5894, "text": "Added FLINT AND STEEL and THE NETHER, as well as a bunch more tools to make development easier. Started working on a creative mode, even though as you can see you need to rejoin to refresh states and stuff, and also you cant use the creative UI because the server doesnt use the same stuff as a vanilla server to handle items and inventories. Also noclip, so you can woosh around!! Didnt show much of the nether yet because it is still very work in progress. Along with that, you cant make a portal in survival right now because you cant get obsidian and flint yet (flint should be pretty easy). So next up will be implementing all the stuff to make it viable to get there in survival. After that ill refine the nether world generation, add mobs and all that etc. This server still running on 7mb of ram btw B) AND IM DOING MY BEST TO KEEP IT THAT WAY!!!! :3"}, {"post_id": 1646, "ts": "2026-06-03T19:32:45Z", "hours": 2.3775, "text": "where it all starts… this is where the project is as of joining stardance! Been mainly working on making stuff easier to update and improving the build process so far. Next up: THE NETHER"}]...
|
Title: Irongingot by @TheShovel | Stardance
Devlo Title: Irongingot by @TheShovel | Stardance
Devlogs:
where it all starts… this is where the project is as of joining stardance! Been mainly working on making stuff easier to update and improving the build process so far. Next up: THE NETHER
Added FLINT AND STEEL and THE NETHER, as well as a bunch more tools to make development easier. Started working on a creative mode, even though as you can see you need to rejoin to refresh states and stuff, and also you cant use the creative UI because the server doesnt use the same stuff as a vanilla server to handle items and inventories. Also noclip, so you can woosh around!! Didnt show much of the nether yet because it is still very work in progress. Along with that, you cant make a portal in survival right now because you cant get obsidian and flint yet (flint should be pretty easy). So next up will be implementing all the stuff to make it viable to get there in survival. After that ill refine the nether world generation, add mobs and all that etc. This server still running on 7mb of ram btw B) AND IM DOING MY BEST TO KEEP IT THAT WAY!!!! :3
You can now craft a nether portal in survival! I implemented buckets, fluids and the interaction that allows for obsidian! Right now as you can see, the fluid interactions are kinda wacky… gonna work on that. Also, unrelated to that, but I reimplemented chests! Which took me WAAAAAY too long. It pissed me off so bad that i just left an LLM to debug stuff till it figured out why my Minecraft client was getting disconnected for a “invalid item id” when opening an empty chest (i was hungry so i wanted to eat but i also got really frustrated and wanted to figure that out. dont judge me i am disappointed in myself as well) Anyway turns out it was getting some garbage data and interpreting it as item data in a chest. Messed up some data types. Happens when you are trying to make something use as little memory as possible. While i was at it, i also added the little opening and closing animation that chests do. Apparently that is server side. Never thought it was but i guess it makes sense
I know i said id be working on the nether, but i realized that to make the nether cool, i need some more systems in place! so i started working on structures! Villages and little wooden tunnels can spawn around the world. Villages have multiple types based on their biome of origin, and also can spawn chests with items in them! Along with that, as you can see, the tunnels in the caves can be shaped dynamically! You can make structures shape themselves to the surface they spawn on to make them look more “dynamic”. Its gonna help a lot with the nether! This took so damn long because i spent like half of the time fixing bugs with chests and doors. The minecraft client is SO picky about entity data. Anything goes slightly wrong and BOOM you get disconnected!!! with that said im proud of what i have here so far :) next devlog will most likely be with nether world generation, unless i find another game breaking bug and have to rewrite a bunch of stuff. love you gonna go eat lunch now -3-
As i promised, i started working on the nether! Added some basic biomes and stuff. not that crazy the crazy thing i did here though is LIGHT. Now the server properly does lighting! Blocks that do light, now actually do light! Now, its not perfect. for the sake of performance and keeping that 7mb memory usage low i had to make some sacrifices. the light is per chunk, so if you place a light source between 2 chunks, you will see seams. But it wasnt all smooth sailing sadly :( most of the time i spent was fixing a segmentation fault caused by musl. It took me so long. It wasnt happening when just compiling with the system compiler, musl specifically was causing it. Every time a user joined the server id get a seg fault. Turns out, it was just a memory allocation bug. Since i have to be so tight about memory, it does cause issues as i said in my previous dev logs. Well anywayyyyyy! Next thing is gonna be nether mobs and structures! Maybe even trading?!?! no idea we will see if i feel like it lmao
THE BOATS. THE BOATS ARE GONNA GET ME. HEEEELP HEEEEEELP
hey! been some time since the last dev log! Added quite a lot of stuff since then! First of all… FISH! Fish mobs now spawn in water, and drop fish that you can cook. They also have fish specific pathfinding that lets them float and stuff. I also worked on nether structures! 2 different type of structures can now spawn in the nether: towers based on fortresses, and those places where the piglings live. Oh, also, piglings! They now spawn in the nether and you can trade with them! Related to structures, i have also worked on strongholds! They can now spawn underground, and they have an end portal, that right now, just sends you to a very buggy and unfinished version of the end. Regarding mechanics, i also added farming! You can now plant seeds and grow wheat and make bread! I also worked on correctly mapping block break speeds to tools, since i wasnt sending the correct tags to the client before. :And… last but not least, i reduced cpu usage by 70%!!!!! CRAZY!!! Yes the ram usage is still under 10mb, and now the cpu usage floats around 0.1 to 5% in intense situations. That is a HUGE deal taking into account that there are so many new features! (also fixed a bunch of bugs and stuff regarding numbers looping on eachother and stuff) AAAAANyway, see you next dev log :D
hiii cuties :3 since last time, i added a couple more systems and things!! while still keeping that ridiculously low memory usage and cpu usage. We now have: Bows, with arrows that get shot with proper physics, and also get stuck to the ground if you miss! Ender pearls! They are… ender pearls! They teleport you. The end is now more… not ehttps://music.youtube.com/watch?v=XRTn6sjRHMo&list=OLAK5uy_lZCA6cMyH3cdQEeAs2WNc8q2lud18JX7gmpty! We have endermen in there too!! We also now have dungeons that spawn zombies and stuff and have juicy loot. anywayyyy i also did a lot of other general code stuff and bug fixing and parity and blah blah too tired to type all of it honestly. See you next time in “jodie tries to do basic stuff but struggles because i want to do it as efficient as possible”
back to the grind i went today. Implemented the “combat update” with amazing features like: Spiders Creepers (They actually create explosions!!) Skeletons (They pew pew) Revamped the player combat to reflect newer minecraft versions Shields (as well as other offhand fixes) Along side that, big groundwork changes. We now have SOUND!!! The server can now send sound packets so you are not left with the noise of your own breathing. AAAAAAND i finally dumped the binary format that the original bareiron used for saving. It SUCKED. It was unreliable and hard to work with. So i just went to a json solution. Im concerned how slow saving could get in a big world, but if i get complaints about that, i will launch the saving on a separate thread or something. Anything but using bin files again… This change also fixes a bug with chest data getting corrupted! So ypeeee! Ok see you next time when i add… other things that i feel like adding… mmmm yes
well, it sure has been a bit. This took WAY longer than i thought, but… the server can now read and load vanilla buildings from the nbt data!!! Wohoo!!! This opens so many possibilities and its very exciting :D Also, i have implemented a ton of missing blocks, including blocks that connect. Fences, glass panes, hanging lanterns etc now work properly! (hopefully, im still finding bugs with this. its way more complex than it seems). Along with that, to go with the new villages, i have implemented proper trading! You can now trade with villagers, level them up and get more options! They also all have their specific clothing associated with their profession and all that! Besides that, i fixed some bug reports i got on github, improved world generation blending with structures, and other small misc stuff here and there that is not that interesting. This is really taking shape and its getting closer and closer to vanilla every day. Happy about that :)
heyyyy!!! lots since last time. got the recipe book working, implemented item durability, underwater breathing, improved trading by making villagers have professions and levels and actually opening up the trading ui, but most importantly, a big change in the packet code that makes multiplayer incredibly smooth now. i am honestly so tired i cant be bothered to type every single thing i had to go through to get here, but oh my is this project getting more and more complex ish. oh also added critical hits forgot to mention that
and so… with this last devlog… it ends. I will be honest, I am burnt out! So, i worked on getting a last stable build that makes survival viable on this server. Tons of testing and bug fixes went into this, and i worked constantly on it until burnout. It’s still not perfect. There’s some random bugs. You might get kicked randomly, but you should be able to get right back in every time. Hopefully. Gulp. Since the last devlog, i implemented so much stuff, i will just link the release here so you can read all of it!! https://github.com/TheShovel/irongingot/releases/tag/V1.6.1 I still am missing some features i wish i would have added. stuff like security improvements and a basic anti cheat but sadly, i gotta move on to something else. Thank you for being with me on this journey though! Was really fun! Heres a video to showcase how far i have come since i forked the original project on github :D
Since i made the first ship, i have gotten A LOT of bug reports, from the same guy. I want to thank this guy for actually using this and reporting all of these bugs! I still have not fixed all of them. there are a few open ones, but ill get to it eventually. The feedback for this project has been phenomenal and it has made me very happy !! I will keep working on it, adding features from time to time and fixing bugs. It wont be my main priority but ill keep working on it as much as i can :) Thank you!
Ships:
Made a Minecraft server can uses like 5% CPU and less than 7mb of ram, because I really wanted to host a Java server on one of my old Raspberry Pis. I found this project called Bareiron, made by PortalRunner, but it was very very very bare bones and simple. So I decided to work on it and make it as close to vanilla as I can until I get tired of it! This is the result of that :)...
|
1792997713.939837
|
1793084113.939837
|
|
25173
|
Steno by @Gabs | Stardance
|
Gabs
|
1
|
82.49
|
1033
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-13T16:31:17Z", "hours": 62.0, "multiplier": 19.13, "payout": 1033, "blessing": "neutral", "text": "I decided to ship now even if it’s not the stable release because it’s the first time Steno is actually used by some sites, even a few that aren’t mine!! These are: https://gxbs.dev https://steno.gxbs.dev https://aplos.gxbs.dev https://bromb.in https://apx.vanillaos.org (all of these websites have their source code public) The project is ready to be used!!", "repo": "https://github.com/stenopress/steno", "demo": "https://steno.gxbs.dev"}]...
|
[{"post_id": 78840, "ts": "202 [{"post_id": 78840, "ts": "2026-10-11T18:55:08Z", "hours": 3.4686, "text": "Time for Steno 0.14 – Smarter Rebuilds This is a relatively small release, especially compared to 0.13, as the only major changes being: Builds track page dependencies, and steno dev rebuilds only affected pages. Errors include clearer context and recovery guidance. Added incremental-build tests and benchmarks, and removed redundant tests. The whole point of it is to have somewhat “smarter” rebuilds, as mentioned in the title; refreshing dependences only when necessary. Other then that, I have also refreshed Steno’s update to ensure we show all the plugins available. Anyway, that’s all for this version’s devlog, one step closer to RC!!! See ya!"}, {"post_id": 71851, "ts": "2026-09-21T17:30:19Z", "hours": 17.0211, "text": "I’ve decided to release the first version of Steno in over a month. Meet Steno 0.3! This version focuses on the stability of the foundations of Steno. More importantly, the biggest change is the change of modularity inside Steno. I decided to separate the core and tau into two different packages, so we lay the foundation for a future new project that is similar to Steno. At the same time, I have made many different changes across the base, which can include making themes more composable and adding stronger release checks around the packages people actually install. All these changes and many, many more small fixes ensure the stability and maturation of this project. PS: forgot i had to devlog 7 hours ago 😢"}, {"post_id": 46406, "ts": "2026-08-13T16:14:28Z", "hours": 15.1536, "text": "v0.11.0 & 0.12.0 are here!! Since we got 2 releases in this devlog; im not going to include a list like i usually do, I’ll just talk about the highlights. So first of all both of these releases are focused on stabilization; no shiny new features, but on small improvements that improve the quality, and of course bug fixes. We had tau 0.9 where we brought comments, {#let} bindings, {:else} branches for {#each} , component children, whitespace control, and async function/filter calls, we had hashed CSS/JS, dev server improvements FINALLY ** froze and documented the public api fully**, added plugins/themes scaffolding, abd so so so much more of such stuff all across the codebase. Oh and I also made more plugins eheheh and made a post oh hackernews, scary stuff Anyway i should’ve made this devlog about 5 logged hours ago, but it is what it is"}, {"post_id": 40172, "ts": "2026-08-03T16:03:45Z", "hours": 12.3356, "text": "0.10.0 is here! Steno 0.10 improves the development workflow, hardens build reliability, and prepares the public API for the upcoming release candidate Highlights Atomic, deterministic builds with safer recovery Permalinks and secure output-path resolution New production preview command Accessible CLI output, clearer diagnostics, and NO_COLOR Theme selection during project initialization Generated-project and official plugin compatibility tests Transparent benchmarks with enforced performance budgets Refreshed Marketing Minimal design Site is out!! https://steno.gxbs.dev Its still in it’s early stage but, its somewhat out!"}, {"post_id": 33533, "ts": "2026-07-23T15:55:18Z", "hours": 8.2764, "text": "0.9.0 is here!!!!!!!!! Full theme configuration schemas with validation and defaults Per-page configuration overrides through frontmatter Environment-aware development and production configuration Extended head management for scripts, metadata, and Open Graph tags New Marketing Minimal theme Redesigned Docs Minimal with a consistent theme design language Expanded Tau security, unit tests, and real-site integration coverage Bump marked from 18.0.6 to 18.0.7"}, {"post_id": 30585, "ts": "2026-07-18T09:05:01Z", "hours": 10.4642, "text": "v0.7.0 is here! Image Optimisation Plugin (resize, webp, lazy-load) Sitemap + RSS/Atom Generation Plugin Data files (_data/ dir for JSON, YAML, TOML) Draft pages ( draft: true ) Global Vars in config Update default port number to 5735 Add system to change port in case it’s used Redesign the minimalist themes (attached screenshot) Rewrote docs And also this devlog contains bit of the unreleased v0.8.0: .env file support redirects implement support for {@include} directives in templates add schema validation for collection items in templates introduce ‘doctor’ command for project health checks Anyway! That’s all from this times 10 hour review checkmark, see you next time!"}, {"post_id": 27084, "ts": "2026-07-12T10:11:25Z", "hours": 6.9939, "text": "Beta is here!! v0.6.0 bring these new changes: implement incremental builds with caching for unchanged pages implement plugin security configuration to control plugin loading add support for official plugins in onboarding process enhance build performance with concurrent file reading and caching add benchmark scripts and performance budget checks create minimal theme package with basic layout and configuration implement zero-config project resolution and navigation building one step closer to stable :)"}, {"post_id": 18302, "ts": "2026-06-29T12:34:13Z", "hours": 1.8994, "text": "Just released v0.2.0! These are the changes: Lifecycle hooks AST + HTML transform pipeline Plugin system via config.yml (JSR packages) Theme-level plugins Theme config schema with soft defaults Initialize package! Try with deno -Ar jsr@steno/init"}, {"post_id": 16295, "ts": "2026-06-26T14:41:22Z", "hours": 6.8269, "text": "Steno v0.1.0 - Alpha! Worked on many parts of the project, including but not limited to: introducing themes and scribe! new CLI adding test units adding docs a init command All now live on JSR! https://jsr.io/@steno/steno"}]...
|
Title: Steno by @Gabs | Stardance
Devlogs:
Steno Title: Steno by @Gabs | Stardance
Devlogs:
Steno v0.1.0 - Alpha! Worked on many parts of the project, including but not limited to: introducing themes and scribe! new CLI adding test units adding docs a init command All now live on JSR! https://jsr.io/@steno/steno
Just released v0.2.0! These are the changes: Lifecycle hooks AST + HTML transform pipeline Plugin system via config.yml (JSR packages) Theme-level plugins Theme config schema with soft defaults Initialize package! Try with deno -Ar jsr@steno/init
Beta is here!! v0.6.0 bring these new changes: implement incremental builds with caching for unchanged pages implement plugin security configuration to control plugin loading add support for official plugins in onboarding process enhance build performance with concurrent file reading and caching add benchmark scripts and performance budget checks create minimal theme package with basic layout and configuration implement zero-config project resolution and navigation building one step closer to stable :)
v0.7.0 is here! Image Optimisation Plugin (resize, webp, lazy-load) Sitemap + RSS/Atom Generation Plugin Data files (_data/ dir for JSON, YAML, TOML) Draft pages ( draft: true ) Global Vars in config Update default port number to 5735 Add system to change port in case it’s used Redesign the minimalist themes (attached screenshot) Rewrote docs And also this devlog contains bit of the unreleased v0.8.0: .env file support redirects implement support for {@include} directives in templates add schema validation for collection items in templates introduce ‘doctor’ command for project health checks Anyway! That’s all from this times 10 hour review checkmark, see you next time!
0.9.0 is here!!!!!!!!! Full theme configuration schemas with validation and defaults Per-page configuration overrides through frontmatter Environment-aware development and production configuration Extended head management for scripts, metadata, and Open Graph tags New Marketing Minimal theme Redesigned Docs Minimal with a consistent theme design language Expanded Tau security, unit tests, and real-site integration coverage Bump marked from 18.0.6 to 18.0.7
0.10.0 is here! Steno 0.10 improves the development workflow, hardens build reliability, and prepares the public API for the upcoming release candidate Highlights Atomic, deterministic builds with safer recovery Permalinks and secure output-path resolution New production preview command Accessible CLI output, clearer diagnostics, and NO_COLOR Theme selection during project initialization Generated-project and official plugin compatibility tests Transparent benchmarks with enforced performance budgets Refreshed Marketing Minimal design Site is out!! https://steno.gxbs.dev Its still in it’s early stage but, its somewhat out!
v0.11.0 & 0.12.0 are here!! Since we got 2 releases in this devlog; im not going to include a list like i usually do, I’ll just talk about the highlights. So first of all both of these releases are focused on stabilization; no shiny new features, but on small improvements that improve the quality, and of course bug fixes. We had tau 0.9 where we brought comments, {#let} bindings, {:else} branches for {#each} , component children, whitespace control, and async function/filter calls, we had hashed CSS/JS, dev server improvements FINALLY ** froze and documented the public api fully**, added plugins/themes scaffolding, abd so so so much more of such stuff all across the codebase. Oh and I also made more plugins eheheh and made a post oh hackernews, scary stuff Anyway i should’ve made this devlog about 5 logged hours ago, but it is what it is
I’ve decided to release the first version of Steno in over a month. Meet Steno 0.3! This version focuses on the stability of the foundations of Steno. More importantly, the biggest change is the change of modularity inside Steno. I decided to separate the core and tau into two different packages, so we lay the foundation for a future new project that is similar to Steno. At the same time, I have made many different changes across the base, which can include making themes more composable and adding stronger release checks around the packages people actually install. All these changes and many, many more small fixes ensure the stability and maturation of this project. PS: forgot i had to devlog 7 hours ago 😢
Time for Steno 0.14 – Smarter Rebuilds This is a relatively small release, especially compared to 0.13, as the only major changes being: Builds track page dependencies, and steno dev rebuilds only affected pages. Errors include clearer context and recovery guidance. Added incremental-build tests and benchmarks, and removed redundant tests. The whole point of it is to have somewhat “smarter” rebuilds, as mentioned in the title; refreshing dependences only when necessary. Other then that, I have also refreshed Steno’s update to ensure we show all the plugins available. Anyway, that’s all for this version’s devlog, one step closer to RC!!! See ya!
Ships:
I decided to ship now even if it’s not the stable release because it’s the first time Steno is actually used by some sites, even a few that aren’t mine!! These are: https://gxbs.dev https://steno.gxbs.dev https://aplos.gxbs.dev https://bromb.in https://apx.vanillaos.org (all of these websites have their source code public) The project is ready to be used!!...
|
1792975646.8994608
|
1793062046.8994608
|
|
44313
|
Cube Matcher by @LCdev1234 | Stardance
|
LCdev1234
|
1
|
60.0
|
1031
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-27T23:19:21Z", "hours": 60.0, "multiplier": 17.28, "payout": 1031, "blessing": "neutral", "text": "This is Cube Matcher, a strategy puzzle game in wich you need to move a 3x3 cube to match a shown pattern, but the problem is that there are zombies climbing the walls that move toward you each time you take an action!! So you need to be careful about how many actions you take before having to knock them. The most challenging part of my project was making the 3D cube and the player interactions. This was becouse I decided to make the 3D system in my game from scratch, so I had to add projections, and deal with the cube coordinates of each point (that were a lot), and for the player interactions the most difficult part was knowing when the player and the cube needed to perform an interaction becouse I needed to add a fake movement (the animation) for the action not to see so quickly, so i needed to sync the animation with the real position. In the end the project turned out like I imagined from the beggining just changing some small concepts for the game to be fun and fair.", "repo": "https://github.com/LCdev1234/Cube-Matcher", "demo": "https://lcdev1234.itch.io/cube-matcher"}]...
|
[{"post_id": 74659, "ts": "202 [{"post_id": 74659, "ts": "2026-09-27T21:44:20Z", "hours": 4.0744, "text": "Devlog #12: Final devlog Added a in-game tutorial and music and sounds. I finally finished making the game!! For the last modifications I added the tutorial of the game with the instructions and example videos to show how everything works. I also added background music and sound effects, it was difficult finding the ones that fit best my game, but I was able to find some really good ones."}, {"post_id": 74159, "ts": "2026-09-26T19:58:35Z", "hours": 2.6803, "text": "Devlog #11 Finished adding the menus to the game!!"}, {"post_id": 73837, "ts": "2026-09-26T03:59:13Z", "hours": 2.8544, "text": "Devlog #10 I added the zombies actual movement to the game, each times the player makes an action the zombies take a few steps. I also added the death screen and the “Play Again” button alredy works. While adding this, I changed a name of a git commit and it merged with the one i was currently working on - I tried to undo what I had done, but I coudnt fix it, I even through I was going to have to code the last parts of the game again, but I was able to fix it using the integrate Copilot AI integrated in VS code."}, {"post_id": 73753, "ts": "2026-09-25T21:11:48Z", "hours": 8.365, "text": "Devlog #9 Added the zombies to the game. The zombies werent so difficult to code. The only problems I had were some interactions with the player or cube. One of the things that took me the most time was making the zombies follow the player when they were on the top, it turned out that one of my lines of code to keep the zombies in their column when climbing, was the problem."}, {"post_id": 72434, "ts": "2026-09-22T22:58:16Z", "hours": 4.725, "text": "Devlog #8 I added the code to check if the upper face pattern of the cube matches the one shown, and I was finally able to tried solving it myself. When doing so I notice that it is a little hard (at least for me) to solve the cube, and adding zombies as I originally planned would not make a lot of sense, so i decided it to change the idea a little bit, instead of the zombies climbing the wall and stopping them and be able to fitgh them once they were on top (the original idea), I will add the zombies so they slowly move when the player slides or rotates the cube and once the zombie is on top the player is basicly dead."}, {"post_id": 70940, "ts": "2026-09-20T02:34:15Z", "hours": 3.9314, "text": "Devlog #7 Added the sliding stickers cube mechanic. The dificult part wasn’t making the stickers change place, it was the sticker movement animation, witch took took the most hours to code. This was becouse i needed to be show a false player and sticker movement while still having the real position variables and once the animation ended record the new position."}, {"post_id": 68940, "ts": "2026-09-16T02:39:43Z", "hours": 6.1658, "text": "Devlog #6 This time, I mostly just added some small changes and fixes, some of the more important changes are: I changed the player textures to a simple white square with eyes, this was just becouse I am not good drawing and making the animations was too dificult, to make the square a little more alive, I added some squishing to its animation using code I added some invisible walls around the player so it dont fall off the cube, but I made so when the rubik cube is rotating the player could fall if not careful I also made some small fixes to some problems I find along the way while making all of this changes"}, {"post_id": 63633, "ts": "2026-09-07T15:41:05Z", "hours": 9.5733, "text": "Devlog #5 I couldn’t advance as fast with the project because of school but now I was able to make the player be able to interact with the cube (rotating it), it was a little hard specially the parts before actually making the interactions that were upgrading the collision system, because before the collision system was only “not fall down past certain y level” which means it didn’t have to see anything with the cube, with the upgraded collisions now it depends on the cube and even when its rotated it can collide normally, also I changed a little bit the jumping so now it has a little cooldown so it can’t be spammed and for rotating the cube I made it so the player needs to jump twice in less than a certain time for it to rotate. I think that the rotation interaction already works well I will next add a solving system and maybe add a new interaction mechanic with the cube."}, {"post_id": 47221, "ts": "2026-08-15T00:12:05Z", "hours": 5.6078, "text": "Devlog #4 Hi there! I took a little more time on this part of the code mainly because I added something that broke the code, and i coudnt find the evil piece of code, but I finally got it working. I just added the player on top of the cube, added some pretty much basic physics that include jumping and walking. For the walking i made it so the controls always move where the camera is viewing not the actual game coordinates, it just means that the player walks forward, backward, and to the sides no matter how the cube is rotated. I also added basic collision system which I am in the process of upgrading, once I get the collisions working better I will desing the other player animations because right now is just a idle animation replaying no matter what. Those are the main features i added aside from fixing some bugs that my code had, next I will be adding some of the main mechanics of the game (rotating the cube) so that the player can start making some actions. Thanks for reading"}, {"post_id": 44366, "ts": "2026-08-10T02:28:58Z", "hours": 4.1247, "text": "Devlog #3 I alredy added the cube textures, and divided the cube into a 3x3 grid, I also added rubiks cube-style rotations and the different color textures. I decided to give the textures that hand painted style becouse I think it seems cool!!. This ended up being more time consuming than I expected, and still needs some work. For now the code just defines the starting colors and lets me rotate the different parts of the cube freely. However I still need to make the rotation permanent and to stored in the cube colors. With this I finally finished the basics of the cube, so I can alredy start working on the player next. The player will be able to interact with the cube so I can finally start working with the real game mechanics."}, {"post_id": 43476, "ts": "2026-08-08T19:23:15Z", "hours": 4.7336, "text": "Devlog #2 I was alredy able to add textures to the 3d cube!! It was more difficult that i expected, i needed to add texture layering so the faces dont overlap each other, and I had to learn how to use mesh2d to render the image texture in the cube. There is still a little visual problem, but its not ver noticible, so I’ll leave it as is for now. My next steps will be to add the Rubik cube rotations and the real and final textures for the cube."}, {"post_id": 42246, "ts": "2026-08-06T21:18:45Z", "hours": 2.7878, "text": "Devlog #1 Hello there! i finally managed to render a 3d cube for the game i just starting working on. I know its simple for now, but next i’ll add textures and the rubik’s cube movement. The game is basically about completing a cube face with a random generated pattern while some little monsters try to stop you… Its still work in progress, and i’ll show more as the idea becomes clearer and the game takes shape."}]...
|
Title: Cube Matcher by @LCdev1234 | Stardance
Dev Title: Cube Matcher by @LCdev1234 | Stardance
Devlogs:
Devlog #1 Hello there! i finally managed to render a 3d cube for the game i just starting working on. I know its simple for now, but next i’ll add textures and the rubik’s cube movement. The game is basically about completing a cube face with a random generated pattern while some little monsters try to stop you… Its still work in progress, and i’ll show more as the idea becomes clearer and the game takes shape.
Devlog #2 I was alredy able to add textures to the 3d cube!! It was more difficult that i expected, i needed to add texture layering so the faces dont overlap each other, and I had to learn how to use mesh2d to render the image texture in the cube. There is still a little visual problem, but its not ver noticible, so I’ll leave it as is for now. My next steps will be to add the Rubik cube rotations and the real and final textures for the cube.
Devlog #3 I alredy added the cube textures, and divided the cube into a 3x3 grid, I also added rubiks cube-style rotations and the different color textures. I decided to give the textures that hand painted style becouse I think it seems cool!!. This ended up being more time consuming than I expected, and still needs some work. For now the code just defines the starting colors and lets me rotate the different parts of the cube freely. However I still need to make the rotation permanent and to stored in the cube colors. With this I finally finished the basics of the cube, so I can alredy start working on the player next. The player will be able to interact with the cube so I can finally start working with the real game mechanics.
Devlog #4 Hi there! I took a little more time on this part of the code mainly because I added something that broke the code, and i coudnt find the evil piece of code, but I finally got it working. I just added the player on top of the cube, added some pretty much basic physics that include jumping and walking. For the walking i made it so the controls always move where the camera is viewing not the actual game coordinates, it just means that the player walks forward, backward, and to the sides no matter how the cube is rotated. I also added basic collision system which I am in the process of upgrading, once I get the collisions working better I will desing the other player animations because right now is just a idle animation replaying no matter what. Those are the main features i added aside from fixing some bugs that my code had, next I will be adding some of the main mechanics of the game (rotating the cube) so that the player can start making some actions. Thanks for reading
Devlog #5 I couldn’t advance as fast with the project because of school but now I was able to make the player be able to interact with the cube (rotating it), it was a little hard specially the parts before actually making the interactions that were upgrading the collision system, because before the collision system was only “not fall down past certain y level” which means it didn’t have to see anything with the cube, with the upgraded collisions now it depends on the cube and even when its rotated it can collide normally, also I changed a little bit the jumping so now it has a little cooldown so it can’t be spammed and for rotating the cube I made it so the player needs to jump twice in less than a certain time for it to rotate. I think that the rotation interaction already works well I will next add a solving system and maybe add a new interaction mechanic with the cube.
Devlog #6 This time, I mostly just added some small changes and fixes, some of the more important changes are: I changed the player textures to a simple white square with eyes, this was just becouse I am not good drawing and making the animations was too dificult, to make the square a little more alive, I added some squishing to its animation using code I added some invisible walls around the player so it dont fall off the cube, but I made so when the rubik cube is rotating the player could fall if not careful I also made some small fixes to some problems I find along the way while making all of this changes
Devlog #7 Added the sliding stickers cube mechanic. The dificult part wasn’t making the stickers change place, it was the sticker movement animation, witch took took the most hours to code. This was becouse i needed to be show a false player and sticker movement while still having the real position variables and once the animation ended record the new position.
Devlog #8 I added the code to check if the upper face pattern of the cube matches the one shown, and I was finally able to tried solving it myself. When doing so I notice that it is a little hard (at least for me) to solve the cube, and adding zombies as I originally planned would not make a lot of sense, so i decided it to change the idea a little bit, instead of the zombies climbing the wall and stopping them and be able to fitgh them once they were on top (the original idea), I will add the zombies so they slowly move when the player slides or rotates the cube and once the zombie is on top the player is basicly dead.
Devlog #9 Added the zombies to the game. The zombies werent so difficult to code. The only problems I had were some interactions with the player or cube. One of the things that took me the most time was making the zombies follow the player when they were on the top, it turned out that one of my lines of code to keep the zombies in their column when climbing, was the problem.
Devlog #10 I added the zombies actual movement to the game, each times the player makes an action the zombies take a few steps. I also added the death screen and the “Play Again” button alredy works. While adding this, I changed a name of a git commit and it merged with the one i was currently working on - I tried to undo what I had done, but I coudnt fix it, I even through I was going to have to code the last parts of the game again, but I was able to fix it using the integrate Copilot AI integrated in VS code.
Devlog #11 Finished adding the menus to the game!!
Devlog #12: Final devlog Added a in-game tutorial and music and sounds. I finally finished making the game!! For the last modifications I added the tutorial of the game with the instructions and example videos to show how everything works. I also added background music and sound effects, it was difficult finding the ones that fit best my game, but I was able to find some really good ones.
Ships:
This is Cube Matcher, a strategy puzzle game in wich you need to move a 3x3 cube to match a shown pattern, but the problem is that there are zombies climbing the walls that move toward you each time you take an action!! So you need to be careful about how many actions you take before having to knock them. The most challenging part of my project was making the 3D cube and the player interactions. This was becouse I decided to make the 3D system in my game from scratch, so I had to add projections, and deal with the cube coordinates of each point (that were a lot), and for the player interactions the most difficult part was knowing when the player and the cube needed to perform an interaction becouse I needed to add a fake movement (the animation) for the action not to see so quickly, so i needed to sync the animation with the real position. In the end the project turned out like I imagined from the beggining just changing some small concepts for the game to be fun and fair....
|
1792853515.6246896
|
1792939915.6246896
|
|
46752
|
RedeeMOD by @DoMax | Stardance
|
DoMax
|
2
|
62.38
|
1027
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-28T12:19:38Z", "hours": 20.0, "multiplier": 9.77, "payout": 203, "blessing": "neutral", "text": "After quite some time, RedeeMOD development is back! What’s new New adapter! : IOQuake 3 is officially supported on RedeeMOD! The adapter is quite complex due to engine’s hardcoded filepaths and external game loading, thus only one type of content can be loaded at a time (either an IOQuake 3 game or Quake 3 mod). API improvements : Each adapter is equipped with a setup() method that runs after adding a game - useful for first-time initialization instead of prompting user for setup steps. Mod adapters can limit the amount of mods they allow selected at once. Game configurations are isolated now, so every game can work on its own requiring no modifications to unrelated files! Tests! : RedeeMOD has automated integration and unit tests implemented. Layout changes : The layout was tweaked a bit to be more usable. Changes mainly made to card positioning, so Add Game and Add Mod cards are always shown first. I hope that many of you will enjoy this project. Even better if you try to script adapters of games that YOU think are important! Remember, that you can always resort to the Contributing Guide on GitHub ! And, of course, leave a nice review if you think RedeeMOD is worth one ;)", "repo": "https://github.com/domasles/redeemod", "demo": "https://github.com/domasles/redeemod/releases/latest"}, {"ship_num": 2, "ts": "2026-08-23T18:42:23Z", "hours": 38.0, "multiplier": 18.45, "payout": 824, "blessing": "neutral", "text": "Modding (some) games has never been easier! I present to you - RedeeMOD , a mod launcher that lets anyone mod games with ease! RedeeMOD was first created for modding Unreal Tournament games, but due to its expandable nature, anyone who knows Python can write a little script and expand RedeeMOD’s game selection for any game imaginable! What are its core features? Glad you asked! Here’s what you get out of the box: Automatic game discovery - RedeeMOD finds your game installations all by itself! A real mod library - every game gets its own mod collection. Add mods once and toggle them whenever you like Custom path overrides - is your game installed somewhere weird? Just point at it and carry on Cross-platform frontend - built with Python and PySide6 (Qt6), so it runs natively on both Windows and Linux! (macOS should also work, but I can’t test that - I own no apple gear) And here’s my favorite part: mods never mess up the vanilla game! Which games are supported? As of today: Unreal Tournament ’99 - mods are loaded through automatic INI patching Unreal Tournament 2004 - mods are stitched together into a package and loaded using the game’s own -mod mechanism Both games are available to download from OldUnreal page, FOR FREE ! What about other games? Can I add them myself? Absolutely! This is where RedeeMOD shines - every game is just an adapter. It knows three things about a game: What’s it called Where it might live How to launch it with mods I even prepared a guide just for that! If a game can be modded without wrecking its installation, an adapter can be written for it. Cool! How do I get it? Head over to the Releases page and grab the app! Or if you want to Redeem the source: git clone https://github.com/domasles/redeemod.git cd redeemod pip install -e . # Omit -e flag if you are not planning to edit the source files later. Leaving it is recommended though redeemod How to use it? Download Unreal Tournament ’99 or Unreal Tournament 2004 from OldUnreal Open the game, configure your settings, and ONLY THEN add the game to RedeeMOD Download any mod you like. My recommendations: Unreal Tournament ’99 HD textures XVehicles for Unreal Tournament ’99 HaloUT for Unreal Tournament 2004 About any skin mod available (be careful, some depend on others!) Add it to your games’ Mod Library Enable the mods you feel like playing today Launch the game and enjoy ! Honesty is the most important thing A few things to know before diving in: Windows’ Smart App Control might block the unsigned executable. You can either disable it or build the app yourself. On Linux, case-sensitive filenames occasionally bite older mods - usually fixable with some renames. Unreal Tournament 2004 was designed to load one mod at a time, so stacking several can lead to conflicts. In practice? It mostly just works. Some mods might not work properly because: a. They require some GUI classes RedeeMOD can’t handle yet b. They are straight up broken Try it, break it, tell me everything I made RedeeMOD out of the frustration that some games don’t have ways of loading mods while leaving the base intact. If it happened to you before, and RedeeMOD helped, I can feel proud. Found a bug, got an idea, or want to see your favorite game in the lineup? Mind you - contributions are very welcome!", "repo": "https://github.com/domasles/redeemod", "demo": "https://github.com/domasles/redeemod/releases/latest"}]...
|
[{"post_id": 82459, "ts": "202 [{"post_id": 82459, "ts": "2026-10-24T21:33:36Z", "hours": 4.3781, "text": "Server owner? RedeeMOD is now CLI! Honestly, I wouldn’t even have thought about it if not for my other project, UT99 server container . Turns out, this is quite useful! How does it work? Like any other CLI app would. It lets anyone load mods on any game without opening the GUI. It’s useful for 2 audiences: Server owners, that need a tool that could be automated Terminal tinkerers, most likely Linux users :D After the beginning of UT99 server project one of the things I immediately thought about was modding the server, not only the client. Whether it’s a mutator, map or anything else - tinkering with individual directories can be brittle, especially in a server environment. Having a tool manage mods is much simplier and foolproof, since RedeeMOD even handles mods disposably - they don’t override the main installation, leading to a predictable setup at all times. Did anything internally change? Yes! Qt is no longer a dependency of the backend, allowing CLI app to be much smaller. The application data paths are now handled manually. The repo now also has more tests to account for new CLI features."}, {"post_id": 58008, "ts": "2026-08-30T10:53:42Z", "hours": 7.3058, "text": "Tested and working! How (and why) I implemented tests in RedeeMOD The reason behind “why” My dad is a high profile developer, and many new things I try are influenced by him. While I always liked setting up CI/CD pipelines and other automations, one thing my projects lacked was testing. Turns out, many tech jobs require knowledge about tests, because they guarantee several things: They assure that your application works as it should They document your working concept They let you make refactors that don’t hurt the functionality So, after considering these benefits, I started reading how tests are implemented. How did I implement tests for RedeeMOD? There are 3 main types of tests: Unit (where one small component is tested) Integration (where several combined components and their behaviour is tested) End to End (where full system flow from start to finish is tested) (they take a long time, so I didn’t even consider them for RedeeMOD) First thing any testable software should have is clear dependency injection. Dependency injection is a pattern where you don’t call dependencies directly, but pass them externally. I opted for implementing method argument injection that I could later use in tests. Why is DI required? Well, during testing, the external environments must be mocked and created virtually to test different use cases (things like sys.* calls and more). Luckily, RedeeMOD already had a nice and semi-testable architecture where very few things needed to be changed. Writing tests is a tedious and rather boring process, because all the edge cases must be defined. Don’t hate me for this, but I handed over writing tests to AI. My arguments for why AI is appropriate for this are: You can’t test software that hasn’t been previously written (by people) Repetitive work takes away precious time, and AI just performs checks While one could argue that Test-Driven Development exists, after trying it out I can confidently say that I’m not a fan of TDD. However, giving very broad instructions, like “Make me tests for this project” usually doesn’t go well, because AI can’t retain project philosophy and tests what doesn’t need to be tested (things that don’t contain logic, thus can’t really fail). RedeeMOD currently has a test suite based on pytest with integration and unit tests written. How tests could benefit you? With tests, instead of clicking around (and often forgetting) every edge case manually, you can offload it to a machine that does hundreds of calculations extremely fast. Not only is it a well-regarded pattern within the developer community, but also helps with coding efficiency and guards from failed refactors."}, {"post_id": 55616, "ts": "2026-08-27T16:10:59Z", "hours": 12.4111, "text": "Quake fans - I got you! Thought RedeeMOD would only be available for niche titles? Not exactly! Which Quake? Most people would probably agree with me that Quake 3 Arena was the best entry of the series for multiplayer games. After seeing just how many Quake 3 mods there are (some even being standalone games) I had to implement an adapter for it with support for both standalone games and mods! I resorted to the IOQuake 3 engine support due to its extra capabilities and being the modern choice for most, so original Id Tech 3 might not work. How does it work? IOQuake 3 inherits cvar support (and adds more!) from Id Tech 3 engine. Utilizing com_basegame , i could bypass Quake 3 Arena file presence for standalone games. What about Quake 3 MODS that are not standalone? The new adapter follows an interesting edge-case detection logic: If a mod has default.cfg file somewhere within its .pk3 files, it’s considered standalone. Other games are required to have genuine Quake 3 Arena present, about what RedeeMOD will warn. IOQuake 3 requires Quake 3 Arena or Team Arena files to be in baseq3 and missionpack directories. This adapter handles warning users against such restriction. Quake 3 Arena can’t be launched through RedeeMOD as a mod. Everything else works perfectly fine (based on testing). All mods I tested worked fine. If you find one that does not, kindly report it on GitHub issues 😄 The most challenging adapter of all No doubt, the amount of testing that was required to get this working is absurd, and definitely it was the most challenging adapter of all ."}, {"post_id": 53272, "ts": "2026-08-23T18:39:02Z", "hours": 3.8986, "text": "Pre-ship devlog! Maitenance pre-ship revealed 3 more bugs that I couldn’t live with… Bugs? What bugs? Actually, very counter-intuitive! UT99-specific : Turns out, when Unreal Tournament ’99 reads configuration and finds duplicate filenames in different directories, FIRST ENTRY DEFINED WINS , which, from coding perspective, is very unusual! Usually, if you define a variable, it can be redefined later. UT99 does not work like that, so I made the mods override any system files if they do override any. I noticed this by trying to load one of my favorite mods ever - the HD pack, which overrides system textures. Glad this bug got noticed! UT2004 skins not working : Some skin mods would not work due to the correct files not being imported on game runtime. By adding an extra file extension to the list of import files, I was able to fix this! Label truncation fails : Previously I had implemented an ElidedLabel that truncates a string and replaces the ending with ... if it is too long. In some rare instances however it failed and set a boundary on window size instead of truncating. However, it’s not an issue anymore! Error handling is better now I ran into an issue that got me confused - I couldn’t launch a game. I panicked, thought that my launcher was broken again, and only then did I realise that the game wasn’t installed! Launcher did not notify me and I got frustrated. Since I want the UX to be flawless, the best decision was to make a pop-up in case of a critical error. I gotta say - the ship is finally truly 100% ready !"}, {"post_id": 51848, "ts": "2026-08-21T18:29:00Z", "hours": 10.6333, "text": "Code, break, fix, repeat! Here’s what the final 1.0.0 release of RedeeMOD brings: Fully tested and documented! I built RedeeMOD not only as an app to manage Unreal Tournament games exclusively (though at first, that was the plan), but also as a framework to create more games in the future compatible with RedeeMOD! I recently wrote a Contribution guide that lets anyone create adapters and expand RedeeMOD by following a detailed guide! Also, as a standard practice, GitHub actions were added to help with releases. Both Windows and Linux builds work perfectly, but are unsigned, so Windows might throw Smart Screen or Smart App Control warnings. These are safe to ignore, and if they bother you too much, you can always resort to launching RedeeMOD directly through Python! Changes in code The code is formatted with Black formatter . It’s way easier to format the code using a tool than doing so manually. Also, I found some bugs that weren’t immediately noticeable. Things like: An uninitialized variable being still required in code (produces a TypeError ) Image painting events overriding each other Much more They are now fully fixed. Some inconsistencies between files have also been resolved. This latest build now features logos to feel more professional . User interface has been updated with more detailed card subtitles, so the app is easier to navigate. Overall, RedeeMOD is in its stable form for the first time ever. Now it’s just the matter of whether more adapters will be created for other games by the community! Does RedeeMOD lack something? Well, the mod management is very simple - adding, removing and enabling/disabling a mod probably doesn’t sound like the most sophisticated mod manager on the earth, but I am planning to later add a pop up that lets users customize the mods even further, like adding custom launch options, paths, even image customization, but that will require more time and I feel confident enough that the current feature set is good for the first ship. For more info on RedeeMOD, visit its GitHub repository !"}, {"post_id": 49281, "ts": "2026-08-18T00:07:57Z", "hours": 4.3475, "text": "Finally, it feels complete! What I’ve been through and why do I feel relieved So, after a LOT of trial and error, and MANY wrong paths taken, Unreal Tournament 2004 adapter is functioning! Why it took so much effort for such a simple thing UT2004 differs from UT99 in many different areas, even its modding system: It now has a dedicated -mod flag instead of using an overriden .ini file Every mod has its own mandatory structure, and UT2004 doesn’t like multiple mods loaded Mods can load diffs of system .ini files My plan was to replicate what I was doing with UT99 - building a custom mod at runtime that would bundle every enabled mod together. Since this game is quite old, so are its development sources. I resorted to the best source there is - proven to work mods. My top 3 problems with UT2004, ranked: Using empty files or ones that are with LF line endings instead of CRLF produces either a segfault or a Bad Mod error UT2004 creates a LOT of mod-specific runtime files, and they need to be cleared to be regenerated (I hate caching, as going through them all is difficult) I couldn’t get mods with heavy custom GUI usage to work, unless they’re being launched standalone, using UT2004 Community tab (which defeats the point of my launcher) Since I wanted to use the modern -mod flag, I had to make my own mod, which needs such files to function: ModDir/UT2K4Mod.ini (Name and description) ModDir/System/Default (Diffs of what to add/remove) ModDir/System/DefUser (Can be left empty, but requires at least one \\r\\n line) I’m thankful to whatever or whoever made me as patient as I am, because DefUser being absolutely empty causing a segfault or files requiring CRLF even in Linux was very unexpected, and required hours of investigation. On top of said implementation, backend framework also needed changes to ensure stability and flexibility. New methods returning more data to the game adapters were added, as well as improvements in attribute names and path handling. Bugs are always present… After testing with some edge cases, I found bugs that got resolved shortly after. Windows, as of now, works flawlessly, but I’ll be performing more tests when I distribute a full build. What’s that, some new GUI? Yes! I wanted to implement logos since the day 1 of starting this project. Surprisingly, that was one of the easiest modifications to date. Screen state tracking was also improved to provide no visual bugs after adding, removing, selecting and deselecting added material. Finally shipping, finally stable? Again, yes. All the intended functionality is verified to be working, and you can already try it out for yourself! Running python -m frontend.app from the project’s root will open up this GUI for you to play around! Over the next few days I’ll finish making all the necessary branding, README and ensure licensing is correct. Then I’ll push a final devlog and make a ship. Thank you for everyone following RedeeMOD’s journey. Keep rocking, and make the world truly Unreal !"}, {"post_id": 48536, "ts": "2026-08-16T23:19:20Z", "hours": 8.3097, "text": "UI tweaks! This looks better in my opinion After taking a look at the previous design I thought it looked quite ugly and inconsistent when some cards have center-aligned elements and others don’t. This update fixes these issues! You really spent so many hours on simple UI tweaks? Yes and no. While the primary purpose of this devlog IS to describe subtle interface change, under the hood many quality of development improvements hide as I’m trying to implement and fiddle with Unreal Tournament 2004 game adapter, which required a more streamlined API of adapter creation rather than what was previously developed. So, this devlog has hours logged from both a fully developed interface and half-developed new game adapter implementation. Stardance was warning me about getting close to 10h limit, so I must post this before diving deeper into Unreal Tournament 2004, which has way more twisted stuff within its modding system. Stay tuned and wish me luck!"}, {"post_id": 46034, "ts": "2026-08-12T23:13:59Z", "hours": 4.5775, "text": "A fresh look Expanding on the design I like, I decided to add some improvements. What improvements exactly? All these things: The launcher now supports adding multiple games (even though currently the only game supported is Unreal Tournament ’99 (more to come)) A sidebar was introduced for better UX A more user-friendly card design was expanded to become the main component interface relies on Backend experienced a bit of an overhaul too to support game/mod branching Safeguards were implemented to disallow adding multiple copies of the same mod OR directories that do NOT contain Unreal mod content Config is now stored in local paths for saving/loading added material Library tab disappears if no games are detected Wow! This is really awesome! Is it ready to be shipped? I could ship the current version, but there are exactly 3 things stopping me from doing so. I need to: Verify functionality on Windows (so it doesn’t become another Linux-only project of mine) Add verification for game paths and prompt user to enter location for both executable and config (if applicable/not found) Add Unreal Tournament 2004 functionality to leverage multiple game selection and see if it works (as well as possibly other games of the franchise, like Unreal and maybe even Unreal Tournament 2014)"}, {"post_id": 45747, "ts": "2026-08-12T13:16:35Z", "hours": 4.2758, "text": "Interface update A functional UI demo has just been made! Following a design language similar to Unreal Engine 5, I was able to make a functional UI, that can launch the game with selected mods! The UI is written with PySide6, which allows for Qt6 API to be used on Python, giving a modern development workflow, with customizable stylesheets and cross-platform capabilities. What’s next? I want to rewrite the launcher a bit to support more games in the future and be more architecturally correct , at the same time feeling more premium both from the user-facing app, and the source code too."}, {"post_id": 45266, "ts": "2026-08-11T16:50:22Z", "hours": 1.1736, "text": "Discovery - done! With the installation discovery done, I can finally focus on the real provisioning and frontend. How does it work? Utilizing common installation paths of Unreal Tournament, I could build a simple config.json file that has all this information for Windows and Linux. Then, I wrote a simple json parser, and methods to use as a simple interface for the frontend. What else currently exists? The current source tree has this functionality implemented: Filesystem utils for finding and sanitizing paths (required by Unreal Engine to load paths relative to the executable) .ini file editor (because Unreal Engine operates on .ini files for configuration, one of which allows for custom file discovery. Editing it allows injecting custom mod files) Next plans? I will try and build a user-facing application that does exactly 3 things: It discovers the installation directory (so the frontend can also act as a launcher) It lets you add folders with mod files It lets you load one or more mods (and the base game) by constructing a .ini file on the go Maybe something more will come to my mind as time passes."}, {"post_id": 45205, "ts": "2026-08-11T15:03:58Z", "hours": 0.6744, "text": "Never more excited! What am I building now? As a kid, I used to play Unreal Tournament ’99 with my dad. I always thought that game is genius - how it encompasses the soul of classic arena shooters yet still being fun to play! What is this Unreal Tournament? You’ve most likely heard of Unreal Engine. The reason it got this name is due to Epic Games’ first major game - Unreal ! While at first it acted as a competitor to Quake I and II style games with its campaign against various creatures, in a year turned to compete with upcoming genre of Arena Shooters, specifically Quake 3, focusing entirely on multiplayer. Never heard of it. Why? While the game itself was awesome not only the way it was written (with an interpreted UScript language, which lets pure UScript mods run on every platform, as well as GPU utilization), and Epic even released the last installment’s source code available to read with promises of development based on what the community wants, quickly realized the harsh reality of Arena Shooters losing market share and turned to developing Fortnite , finally shutting down official server support on 24th of January, 2023. So can I still play it anyhow? Despite cancellation of the whole series, community has stepped in and is still keeping up with modern games! Epic Games even allowed the Unreal and Unreal Tournament (original as well as 2004 version) ecosystem be maintained by a group called OldUnreal , while the latest game is available on UT4Ever , a self-hosted group of volunteers, who have rewritten Epic’s servers. And, guess what, all of this is available for free! What RedeeMOD aims to provide I am always looking at ways to modularize the software I use for maximum customization. Currently the mods follow a drag-over logic, which mixes mod files with original game’s files, rendering the original, pure and unmodified version unplayable if you ever want it back. After researching how modding architecture of Unreal Tournament ’99 works, I was able to prepare a plan on how to implement a mod loader, and started to work on it! So stay tuned, and join the Unreal Tournament community!"}]...
|
Title: RedeeMOD by @DoMax | Stardance
Devlogs:
Ne Title: RedeeMOD by @DoMax | Stardance
Devlogs:
Never more excited! What am I building now? As a kid, I used to play Unreal Tournament ’99 with my dad. I always thought that game is genius - how it encompasses the soul of classic arena shooters yet still being fun to play! What is this Unreal Tournament? You’ve most likely heard of Unreal Engine. The reason it got this name is due to Epic Games’ first major game - Unreal ! While at first it acted as a competitor to Quake I and II style games with its campaign against various creatures, in a year turned to compete with upcoming genre of Arena Shooters, specifically Quake 3, focusing entirely on multiplayer. Never heard of it. Why? While the game itself was awesome not only the way it was written (with an interpreted UScript language, which lets pure UScript mods run on every platform, as well as GPU utilization), and Epic even released the last installment’s source code available to read with promises of development based on what the community wants, quickly realized the harsh reality of Arena Shooters losing market share and turned to developing Fortnite , finally shutting down official server support on 24th of January, 2023. So can I still play it anyhow? Despite cancellation of the whole series, community has stepped in and is still keeping up with modern games! Epic Games even allowed the Unreal and Unreal Tournament (original as well as 2004 version) ecosystem be maintained by a group called OldUnreal , while the latest game is available on UT4Ever , a self-hosted group of volunteers, who have rewritten Epic’s servers. And, guess what, all of this is available for free! What RedeeMOD aims to provide I am always looking at ways to modularize the software I use for maximum customization. Currently the mods follow a drag-over logic, which mixes mod files with original game’s files, rendering the original, pure and unmodified version unplayable if you ever want it back. After researching how modding architecture of Unreal Tournament ’99 works, I was able to prepare a plan on how to implement a mod loader, and started to work on it! So stay tuned, and join the Unreal Tournament community!
Discovery - done! With the installation discovery done, I can finally focus on the real provisioning and frontend. How does it work? Utilizing common installation paths of Unreal Tournament, I could build a simple config.json file that has all this information for Windows and Linux. Then, I wrote a simple json parser, and methods to use as a simple interface for the frontend. What else currently exists? The current source tree has this functionality implemented: Filesystem utils for finding and sanitizing paths (required by Unreal Engine to load paths relative to the executable) .ini file editor (because Unreal Engine operates on .ini files for configuration, one of which allows for custom file discovery. Editing it allows injecting custom mod files) Next plans? I will try and build a user-facing application that does exactly 3 things: It discovers the installation directory (so the frontend can also act as a launcher) It lets you add folders with mod files It lets you load one or more mods (and the base game) by constructing a .ini file on the go Maybe something more will come to my mind as time passes.
Interface update A functional UI demo has just been made! Following a design language similar to Unreal Engine 5, I was able to make a functional UI, that can launch the game with selected mods! The UI is written with PySide6, which allows for Qt6 API to be used on Python, giving a modern development workflow, with customizable stylesheets and cross-platform capabilities. What’s next? I want to rewrite the launcher a bit to support more games in the future and be more architecturally correct , at the same time feeling more premium both from the user-facing app, and the source code too.
A fresh look Expanding on the design I like, I decided to add some improvements. What improvements exactly? All these things: The launcher now supports adding multiple games (even though currently the only game supported is Unreal Tournament ’99 (more to come)) A sidebar was introduced for better UX A more user-friendly card design was expanded to become the main component interface relies on Backend experienced a bit of an overhaul too to support game/mod branching Safeguards were implemented to disallow adding multiple copies of the same mod OR directories that do NOT contain Unreal mod content Config is now stored in local paths for saving/loading added material Library tab disappears if no games are detected Wow! This is really awesome! Is it ready to be shipped? I could ship the current version, but there are exactly 3 things stopping me from doing so. I need to: Verify functionality on Windows (so it doesn’t become another Linux-only project of mine) Add verification for game paths and prompt user to enter location for both executable and config (if applicable/not found) Add Unreal Tournament 2004 functionality to leverage multiple game selection and see if it works (as well as possibly other games of the franchise, like Unreal and maybe even Unreal Tournament 2014)
UI tweaks! This looks better in my opinion After taking a look at the previous design I thought it looked quite ugly and inconsistent when some cards have center-aligned elements and others don’t. This update fixes these issues! You really spent so many hours on simple UI tweaks? Yes and no. While the primary purpose of this devlog IS to describe subtle interface change, under the hood many quality of development improvements hide as I’m trying to implement and fiddle with Unreal Tournament 2004 game adapter, which required a more streamlined API of adapter creation rather than what was previously developed. So, this devlog has hours logged from both a fully developed interface and half-developed new game adapter implementation. Stardance was warning me about getting close to 10h limit, so I must post this before diving deeper into Unreal Tournament 2004, which has way more twisted stuff within its modding system. Stay tuned and wish me luck!
Finally, it feels complete! What I’ve been through and why do I feel relieved So, after a LOT of trial and error, and MANY wrong paths taken, Unreal Tournament 2004 adapter is functioning! Why it took so much effort for such a simple thing UT2004 differs from UT99 in many different areas, even its modding system: It now has a dedicated -mod flag instead of using an overriden .ini file Every mod has its own mandatory structure, and UT2004 doesn’t like multiple mods loaded Mods can load diffs of system .ini files My plan was to replicate what I was doing with UT99 - building a custom mod at runtime that would bundle every enabled mod together. Since this game is quite old, so are its development sources. I resorted to the best source there is - proven to work mods. My top 3 problems with UT2004, ranked: Using empty files or ones that are with LF line endings instead of CRLF produces either a segfault or a Bad Mod error UT2004 creates a LOT of mod-specific runtime files, and they need to be cleared to be regenerated (I hate caching, as going through them all is difficult) I couldn’t get mods with heavy custom GUI usage to work, unless they’re being launched standalone, using UT2004 Community tab (which defeats the point of my launcher) Since I wanted to use the modern -mod flag, I had to make my own mod, which needs such files to function: ModDir/UT2K4Mod.ini (Name and description) ModDir/System/Default (Diffs of what to add/remove) ModDir/System/DefUser (Can be left empty, but requires at least one \r\n line) I’m thankful to whatever or whoever made me as patient as I am, because DefUser being absolutely empty causing a segfault or files requiring CRLF even in Linux was very unexpected, and required hours of investigation. On top of said implementation, backend framework also needed changes to ensure stability and flexibility. New methods returning more data to the game adapters were added, as well as improvements in attribute names and path handling. Bugs are always present… After testing with some edge cases, I found bugs that got resolved shortly after. Windows, as of now, works flawlessly, but I’ll be performing more tests when I distribute a full build. What’s that, some new GUI? Yes! I wanted to implement logos since the day 1 of starting this project. Surprisingly, that was one of the easiest modifications to date. Screen state tracking was also improved to provide no visual bugs after adding, removing, selecting and deselecting added material. Finally shipping, finally stable? Again, yes. All the intended functionality is verified to be working, and you can already try it out for yourself! Running python -m frontend.app from the project’s root will open up this GUI for you to play around! Over the next few days I’ll finish making all the necessary branding, README and ensure licensing is correct. Then I’ll push a final devlog and make a ship. Thank you for everyone following RedeeMOD’s journey. Keep rocking, and make the world truly Unreal !
Code, break, fix, repeat! Here’s what the final 1.0.0 release of RedeeMOD brings: Fully tested and documented! I built RedeeMOD not only as an app to manage Unreal Tournament games exclusively (though at first, that was the plan), but also as a framework to create more games in the future compatible with RedeeMOD! I recently wrote a Contribution guide that lets anyone create adapters and expand RedeeMOD by following a detailed guide! Also, as a standard practice, GitHub actions were added to help with releases. Both Windows and Linux builds work perfectly, but are unsigned, so Windows might throw Smart Screen or Smart App Control warnings. These are safe to ignore, and if they bother you too much, you can always resort to launching RedeeMOD directly through Python! Changes in code The code is formatted with Black formatter . It’s way easier to format the code using a tool than doing so manually. Also, I found some bugs that weren’t immediately noticeable. Things like: An uninitialized variable being still required in code (produces a TypeError ) Image painting events overriding each other Much more They are now fully fixed. Some inconsistencies between files have also been resolved. This latest build now features logos to feel more professional . User interface has been updated with more detailed card subtitles, so the app is easier to navigate. Overall, RedeeMOD is in its stable form for the first time ever. Now it’s just the matter of whether more adapters will be created for other games by the community! Does RedeeMOD lack something? Well, the mod management is very simple - adding, removing and enabling/disabling a mod probably doesn’t sound like the most sophisticated mod manager on the earth, but I am planning to later add a pop up that lets users customize the mods even further, like adding custom launch options, paths, even image customization, but that will require more time and I feel confident enough that the current feature set is good for the first ship. For more info on RedeeMOD, visit its GitHub repository !
Pre-ship devlog! Maitenance pre-ship revealed 3 more bugs that I couldn’t live with… Bugs? What bugs? Actually, very counter-intuitive! UT99-specific : Turns out, when Unreal Tournament ’99 reads configuration and finds duplicate filenames in different directories, FIRST ENTRY DEFINED WINS , which, from coding perspective, is very unusual! Usually, if you define a variable, it can be redefined later. UT99 does not work like that, so I made the mods override any system files if they do override any. I noticed this by trying to load one of my favorite mods ever - the HD pack, which overrides system textures. Glad this bug got noticed! UT2004 skins not working : Some skin mods would not work due to the correct files not being imported on game runtime. By adding an extra file extension to the list of import files, I was able to fix this! Label truncation fails : Previously I had implemented an ElidedLabel that truncates a string and replaces the ending with ... if it is too long. In some rare instances however it failed and set a boundary on window size instead of truncating. However, it’s not an issue anymore! Error handling is better now I ran into an issue that got me confused - I couldn’t launch a game. I panicked, thought that my launcher was broken again, and only then did I realise that the game wasn’t installed! Launcher did not notify me and I got frustrated. Since I want the UX to be flawless, the best decision was to make a pop-up in case of a critical error. I gotta say - the ship is finally truly 100% ready !
Quake fans - I got you! Thought RedeeMOD would only be available for niche titles? Not exactly! Which Quake? Most people would probably agree with me that Quake 3 Arena was the best entry of the series for multiplayer games. After seeing just how many Quake 3 mods there are (some even being standalone games) I had to implement an adapter for it with support for both standalone games and mods! I resorted to the IOQuake 3 engine support due to its extra capabilities and being the modern choice for most, so original Id Tech 3 might not work. How does it work? IOQuake 3 inherits cvar support (and adds more!) from Id Tech 3 engine. Utilizing com_basegame , i could bypass Quake 3 Arena file presence for standalone games. What about Quake 3 MODS that are not standalone? The new adapter follows an interesting edge-case detection logic: If a mod has default.cfg file somewhere within its .pk3 files, it’s considered standalone. Other games are required to have genuine Quake 3 Arena present, about what RedeeMOD will warn. IOQuake 3 requires Quake 3 Arena or Team Arena files to be in baseq3 and missionpack directories. This adapter handles warning users against such restriction. Quake 3 Arena can’t be launched through RedeeMOD as a mod. Everything else works perfectly fine (based on testing). All mods I tested worked fine. If you find one that does not, kindly report it on GitHub issues 😄 The most challenging adapter of all No doubt, the amount of testing that was required to get this working is absurd, and definitely it was the most challenging adapter of all .
Tested and working! How (and why) I implemented tests in RedeeMOD The reason behind “why” My dad is a high profile developer, and many new things I try are influenced by him. While I always liked setting up CI/CD pipelines and other automations, one thing my projects lacked was testing. Turns out, many tech jobs require knowledge about tests, because they guarantee several things: They assure that your application works as it should They document your working concept They let you make refactors that don’t hurt the functionality So, after considering these benefits, I started reading how tests are implemented. How did I implement tests for RedeeMOD? There are 3 main types of tests: Unit (where one small component is tested) Integration (where several combined components and their behaviour is tested) End to End (where full system flow from start to finish is tested) (they take a long time, so I didn’t even consider them for RedeeMOD) First thing any testable software should have is clear dependency injection. Dependency injection is a pattern where you don’t call dependencies directly, but pass them externally. I opted for implementing method argument injection that I could later use in tests. Why is DI required? Well, during testing, the external environments must be mocked and created virtually to test different use cases (things like sys.* calls and more). Luckily, RedeeMOD already had a nice and semi-testable architecture where very few things needed to be changed. Writing tests is a tedious and rather boring process, because all the edge cases must be defined. Don’t hate me for this, but I handed over writing tests to AI. My arguments for why AI is appropriate for this are: You can’t test software that hasn’t been previously written (by people) Repetitive work takes away precious time, and AI just performs checks While one could argue that Test-Driven Development exists, after trying it out I can confidently say that I’m not a fan of TDD. However, giving very broad instructions, like “Make me tests for this project” usually doesn’t go well, because AI can’t retain project philosophy and tests what doesn’t need to be tested (things that don’t contain logic, thus can’t really fail). RedeeMOD currently has a test suite based on pytest with integration and unit tests written. How tests could benefit you? With tests, instead of clicking around (and often forgetting) every edge case manually, you can offload it to a machine that does hundreds of calculations extremely fast. Not only is it a well-regarded pattern within the developer community, but also helps with coding efficiency and guards from failed refactors.
Server owner? RedeeMOD is now CLI! Honestly, I wouldn’t even have thought about it if not for my other project, UT99 server container . Turns out, this is quite useful! How does it work? Like any other CLI app would. It lets anyone load mods on any game without opening the GUI. It’s useful for 2 audiences: Server owners, that need a tool that could be automated Terminal tinkerers, most likely Linux users :D After the beginning of UT99 server project one of the things I immediately thought about was modding the server, not only the client. Whether it’s a mutator, map or anything else - tinkering with individual directories can be brittle, especially in a server environment. Having a tool manage mods is much simplier and foolproof, since RedeeMOD even handles mods disposably - they don’t override the main installation, leading to a predictable setup at all times. Did anything internally change? Yes! Qt is no longer a dependency of the backend, allowing CLI app to be much smaller. The application data paths are now handled manually. The repo now also has more tests to account for new CLI features.
Ships:
Modding (some) games has never been easier! I present to you - RedeeMOD , a mod launcher that lets anyone mod games with ease! RedeeMOD was first created for modding Unreal Tournament games, but due to its expandable nature, anyone who knows Python can write a little script and expand RedeeMOD’s game selection for any game imaginable! What are its core features? Glad you asked! Here’s what you get out of the box: Automatic game discovery - RedeeMOD finds your game installations all by itself! A real mod library - every game gets its own mod collection. Add mods once and toggle them whenever you like Custom path overrides - is your game installed somewhere weird? Just point at it and carry on Cross-platform frontend - built with Python and PySide6 (Qt6), so it runs natively on both Windows and Linux! (macOS should also work, but I can’t test that - I own no apple gear) And here’s my favorite part: mods never mess up the vanilla game! Which games are supported? As of today: Unreal Tournament ’99 - mods are loaded through automatic INI patching Unreal Tournament 2004 - mods are stitched together into a package and loaded using the game’s own -mod mechanism Both games are available to download from OldUnreal page, FOR FREE ! What about other games? Can I add them myself? Absolutely! This is where RedeeMOD shines - every game is just an adapter. It knows three things about a game: What’s it called Where it might live How to launch it with mods I even prepared a guide just for that! If a game can be modded without wrecking its installation, an adapter can be written for it. Cool! How do I get it? Head over to the Releases page and grab the app! Or if you want to Redeem the source: git clone https://github.com/domasles/redeemod.git cd redeemod pip install -e . # Omit -e flag if you are not planning to edit the source files later. Leaving it is recommended though redeemod How to use it? Download Unreal Tournament ’99 or Unreal Tournament 2004 from OldUnreal Open the game, configure your settings, and ONLY THEN add the game to RedeeMOD Download any mod you like. My recommendations: Unreal Tournament ’99 HD textures XVehicles for Unreal Tournament ’99 HaloUT for Unreal Tournament 2004 About any skin mod available (be careful, some depend on others!) Add it to your games’ Mod Library Enable the mods you feel like playing today Launch the game and enjoy ! Honesty is the most important thing A few things to know before diving in: Windows’ Smart App Control might block the unsigned executable. You can either disable it or build the app yourself. On Linux, case-sensitive filenames occasionally bite older mods - usually fixable with some renames. Unreal Tournament 2004 was designed to load one mod at a time, so stacking several can lead to conflicts. In practice? It mostly just works. Some mods might not work properly because: a. They require some GUI classes RedeeMOD can’t handle yet b. They are straight up broken Try it, break it, tell me everything I made RedeeMOD out of the frustration that some games don’t have ways of loading mods while leaving the base intact. If it happened to you before, and RedeeMOD helped, I can feel proud. Found a bug, got an idea, or want to see your favorite game in the lineup? Mind you - contributions are very welcome!
After quite some time, RedeeMOD development is back! What’s new New adapter! : IOQuake 3 is officially supported on RedeeMOD! The adapter is quite complex due to engine’s hardcoded filepaths and external game loading, thus only one type of content can be loaded at a time (either an IOQuake 3 game or Quake 3 mod). API improvements : Each adapter is equipped with a setup() method that runs after adding a game - useful for first-time initialization instead of prompting user for setup steps. Mod adapters can limit the amount of mods they allow selected at once. Game configurations are isolated now, so every game can work on its own requiring no modifications to unrelated files! Tests! : RedeeMOD has automated integration and unit tests implemented. Layout changes : The layout was tweaked a bit to be more usable. Changes mainly made to card positioning, so Add Game and Add Mod cards are always shown first. I hope that many of you will enjoy this project. Even better if you try to script adapters of games that YOU think are important! Remember, that you can always resort to the Contributing Guide on GitHub ! And, of course, leave a nice review if you think RedeeMOD is worth one ;)...
|
1792979688.178321
|
1793066088.178321
|
|
60118
|
FluidSim by @AbdurRehman | Stardance
|
AbdurRehman
|
1
|
55.0
|
1027
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-22T10:31:19Z", "hours": 55.0, "multiplier": 18.75, "payout": 1027, "blessing": "neutral", "text": "Well I made a fluid simulation that runs completely on the GPU using WebGPU. Since everything happens on the gpu, like from the physics to the rendering, it can handle tens of thousands of particles in real time in the browser without having performance issues. What was challenging for me was moving everything over to WebGPU since before I was just using plain Three.js and stuff. It’s completely different from WebGL and I had to refactor a lot of code, especially how the sim was structured, and then setting up the rendering system. The other big challenge was just making the water actually look convincing. That took quite a while and a lot of tweaking to make it look at least somewhat realistic. Honestly pretty much how the entire thing turned out. The audio reacts to the physics, the water looks good (or acceptable at the very least), objects float and sink, you can sculpt the terrain, then there are wind gusts and you can interact with the water. Every little thing comes together in a way I’m really happy with. Like this project was just a simple particle test I was making just for fun but in the end I actually enjoyed making and playing around with it. Just open the web page. You’ll need a browser with WebGPU support to run it and the controls are pretty much on the screen. You can adjust sliders and stuff and pretty much play around with everything, including adding your own .glb models. Audio might not play immediately since it takes some time to load in the background.", "repo": "https://github.com/RealAbdurRehman/fluid-simulation", "demo": "https://fluid-simulation-sigma.vercel.app"}]...
|
[{"post_id": 72151, "ts": "202 [{"post_id": 72151, "ts": "2026-09-22T10:16:14Z", "hours": 1.7319, "text": "This is the final dev log. Like I said in the last devlog, the sim was basically feature complete so this dev log is mostly the cleanup and little UI improvements. I cleaned up a bunch of code by like removing dead code that had jut been sitting and I improved how the controls panel looks. Other than that I wrote the README and finalized the repo by adding stuff like the license and I also added a cool looking favicon. And with that, the project is now complete."}, {"post_id": 71772, "ts": "2026-09-21T14:41:21Z", "hours": 9.8517, "text": "I have made a ton of progress since the last devlog. First I added a simple but good looking sky shader which has clouds and a sun, and then hooked up textures on the loaded models so they aren’t just basic colors anymore. And I also added support for loading your own .glb models and they’ll work in the sim. Relatively small changes but they made the scene look a whole lot better and more interactive. Audio was the biggest change and took the most time, but it was also the most fun. There are multiple layers to it, like the general ambience is pretty much layered water sounds like water flowing sounds, foam sound, lapping sound, bubbles, etc that crossfade based on how the fluid is moving. External objects also create sounds like you can hear them splash in and out of the water or when heavy stuff sinks there is kind of a low rumble. There’s also sounds for water splashing on itself, objects colliding around with other objects, etc. There is also a cool underwater effect where if the camera is inside the water stuff get’s muffled and stuff which is really cool. What’s good is that everything is driven by the physics so everything is dynamic and nothing is being faked. Like each sound is created for a reason. After that I added wind to the sim. Like wind is created using gusts which are scheduled procedurally, so you get calm stretches and then a burst of air. I also added another interaction too. You can now create vortexes using V + left click which is kind of fun and adds more interactivity. I also added sculpting to the terrain. Now you can change the terrain to your liking by using different brush modes like: raise, lower, smoothen, flatten. I also optimized particles check with the terrain especially after stuff had become more dynamic though that was pretty easy to do. Some other small polishes I did was to clean up the settings panel thing among other small stuff. The sim is basically feature complete at this point, so next up is cleaning up the UI and then creating a good README."}, {"post_id": 70222, "ts": "2026-09-18T18:56:06Z", "hours": 8.7947, "text": "Since my last dev log I’ve mostly been working on the water’s visuals. First thing I did was to rewrite the screen space fluid rendering implementation and tuned it a bit to make it look way better than before and less like a bunch of stacked balls and I also added realistic looking refractions too. Then I added proper shadows to the scene, which made stuff look more alive. This bumped the visuals up a lot. Then I worked on caustics. This was one of those features that instantly made the water look ten times better. This took a bit of time to get right but eventually I got it to work and it looks good. After that, I added foam to make the water look less flat and blobby. The water, in general, waswas too perfect and so I added noise to the water to fix that. With these changes, there was a noticeable loss of performance so I had to work on that. Along the way I also cleaned up some of the code especially the GUI control panel thingy since it was getting too extensive so I cut down a lot of things. Then I finally added model support. Before you could only use basic shapes like squares, spheres etc. Now I can load in model files, and use them in the simulation which is really cool. There was also this weird bug where objects would disappear when you switched them around but after a bunch of changes in my code I finally fixed the bug. I also fixed other bugs like water kind of acting weird with the boat spawned which too took quite a bit of time to fix. Next I want to do some scene polish like better background, etc and then finally audio. I might also work some more on the object collision physics since I intentionally kept them really simple but I might not. Depends on how lazy I am I guess."}, {"post_id": 69606, "ts": "2026-09-17T12:18:15Z", "hours": 9.1133, "text": "Since my last dev log I’ve been working on terrain. I started with simple noise on a grid so the particles had something cool to fall and interact with rather than a boring flat plane. Then I had the idea of making the terrain a planet like fluid flowing on it and stuff like that. Actually got it working. It just wasn’t as good as I thought it would be. It made the project overly complex and kind of shift the focus towards the terrain instead of the fluid and made it harder to play with it. And also the fluid would obviously spread around over the planet so you couldn’t even see most of the cool stuff. And I spent a lot of time on that but well I eventually reverted and added a seabed in a box. That made the fluid the focus instead of the scenery and stuff and how it turned out in the end kind of looks dope. Well with the new terrain I spent time making it look sandy and good. I also switched from rendering some stuff as wireframes to actual meshes Shoudl’ve done this before but back then I guess I got lazy even though most of the stuff for that was already set up Water is really what’s been improved. Particles were just tiny colored spheres before, which I guess is okay for debugging but doesn’t look like water. I’ve been building something called screen space fluid rendering instead which just renders every particle as a billboard that always looks at/faces the camera and does some other cool stuff behind. Mine works I guess but I still have to improve it a lot. Like I guess the fluid looks more like water but still it looks like a bunch of balls so yeah that’s what I want to focus on next. After that, I’ll add proper collisions between objects, then scene polish, then audio. Audio is something I am excited for!"}, {"post_id": 68014, "ts": "2026-09-14T11:35:02Z", "hours": 6.3853, "text": "Since my last dev log, I made a pretty big change by making the fluid interact with actual 3D objects instead of just the bounds. First, I cleaned some stuff up like spawning the particles in a neat cube among other little stuff. Then I decided to refactor how stuff was being rendered. Before, I had two separate canvases, one WebGL canvas for the scene and one WebGPU canvas for the particles, because I was lazy implementing them and so I merged them into one since. That didn’t make too big of a difference visually but it makes it easier to add other stuff later. The main feature was getting the fluid to actually flow around objects. The particles can now collide with not only boxes and spheres but any complex shape I place in the scene. The torus knot is the only complex shape set up so far, but the same system will work for pretty much anything I add later. The other half was making the objects feel realistic. Like at first, they were just static test objects and the fluid could only move around them but not push them so they could move. I added proper physics to the objects so they float and move around realistically in the water and pretty much react to it. Getting this to work took quite a while like objects would spin violently when in contact with the water or bobbing up and down non stop but I eventually got it to work. Next up is pretty much the biggest change yet (at least visually). I want to remove the container and add real terrain over which the fluid can realistically flow over and stuff. Most of the foundation for this change is pretty much setup and the biggest change is to actually generate the terrain. After that I want to improve the physics of the objects. Right now the physics are like deliberately really simple like objects collide with the container only and can’t interact with other objects and the rotations aren’t even handled well. Once there is a terrain, then I’ll work on them pretty much."}, {"post_id": 67166, "ts": "2026-09-13T07:29:00Z", "hours": 9.1594, "text": "Since my last dev log, I’ve made quite a few changes to the fluid simulation which make it look completely different from the last dev log. First, I added interaction with the particles, which makes things a bit fun but its real purpose was to make testing the simulation easier. After that, I spent some time tuning and improving the physics. I added stuff like viscosity and a repulsion force between particles, which made the particles behave more like an actual fluid and add more customisation. While working on the physics, I also optimized the SPH simulation. I combined some of the neighbor searches and reduced unnecessary allocations happening every frame. This was pretty simple and made quite a difference. Once the basic simulation was good enough, I decided to move on to WebGP to really make stuff run smoothly. Both the fluid simulation and particle rendering now run through WebGPU, which gives me a much better foundation for scaling the simulation to larger numbers of particles. Like before the simulation could not run smoothly at around 4000 particles while now I can go up to tens of thousands of particles and still have really good performance (unless the particles are too squished up). After that, I finally started converting the simulation from 2D to 3D. This was relatively simple as I just had to go around the code changing Vector2s into Vector3s and accounting for the z axis but this made some other underlying issues more prominent. Like one of the biggest issues was particles stacking up against the boundaries walls that would repel other particles. I fixed that issue and made several other changes to get the 3D simulation behaving more naturally. At this point, the project has gone quite a bit beyond the small Three.js experiment I originally started with. What I want to do next is to make the particles react to other objects and shapes in the environment. I want to try and make it eventually work with more complex shapes as well, so the fluid can flow around and interact with actual 3D objects rather than being restricted to simple boundaries. After which I’ll make the fluid look like water instead of a bunch of balls flowing around and then work on the environment."}, {"post_id": 65881, "ts": "2026-09-11T10:01:05Z", "hours": 9.7228, "text": "I started working on a small fluid simulation in Three.js just for learning. Originally, this was really just meant to be a test project and something fun to mess around with, but after working on it a bunch I decided I want to keep developing it and eventually turn it into something interesting. So far I’ve built basic SPH simulation and got particles interacting with each other. I also implemented spatial hashing to make everything more efficient which just avoids checking every particle against every other particle. This improved the performance a lot especially with a lot of particles. I also added configurable simulation parameters such as gravity, pressure, particle count, etc to make testing easier. I also worked on the particles like befoe they were just blue circles but right now they change their color based on speed which I implemented by adding a shader. Right now, it still needs a bunch of work. There are bugs I need to fix and generally make the physics better. Next, I want to make the particles interactive something like click to move them type thing for testing. After, I’ll work on improving the physics, fixing bugs, and finally make stuff 3D."}]...
|
Title: FluidSim by @AbdurRehman | Stardance
Devlo Title: FluidSim by @AbdurRehman | Stardance
Devlogs:
I started working on a small fluid simulation in Three.js just for learning. Originally, this was really just meant to be a test project and something fun to mess around with, but after working on it a bunch I decided I want to keep developing it and eventually turn it into something interesting. So far I’ve built basic SPH simulation and got particles interacting with each other. I also implemented spatial hashing to make everything more efficient which just avoids checking every particle against every other particle. This improved the performance a lot especially with a lot of particles. I also added configurable simulation parameters such as gravity, pressure, particle count, etc to make testing easier. I also worked on the particles like befoe they were just blue circles but right now they change their color based on speed which I implemented by adding a shader. Right now, it still needs a bunch of work. There are bugs I need to fix and generally make the physics better. Next, I want to make the particles interactive something like click to move them type thing for testing. After, I’ll work on improving the physics, fixing bugs, and finally make stuff 3D.
Since my last dev log, I’ve made quite a few changes to the fluid simulation which make it look completely different from the last dev log. First, I added interaction with the particles, which makes things a bit fun but its real purpose was to make testing the simulation easier. After that, I spent some time tuning and improving the physics. I added stuff like viscosity and a repulsion force between particles, which made the particles behave more like an actual fluid and add more customisation. While working on the physics, I also optimized the SPH simulation. I combined some of the neighbor searches and reduced unnecessary allocations happening every frame. This was pretty simple and made quite a difference. Once the basic simulation was good enough, I decided to move on to WebGP to really make stuff run smoothly. Both the fluid simulation and particle rendering now run through WebGPU, which gives me a much better foundation for scaling the simulation to larger numbers of particles. Like before the simulation could not run smoothly at around 4000 particles while now I can go up to tens of thousands of particles and still have really good performance (unless the particles are too squished up). After that, I finally started converting the simulation from 2D to 3D. This was relatively simple as I just had to go around the code changing Vector2s into Vector3s and accounting for the z axis but this made some other underlying issues more prominent. Like one of the biggest issues was particles stacking up against the boundaries walls that would repel other particles. I fixed that issue and made several other changes to get the 3D simulation behaving more naturally. At this point, the project has gone quite a bit beyond the small Three.js experiment I originally started with. What I want to do next is to make the particles react to other objects and shapes in the environment. I want to try and make it eventually work with more complex shapes as well, so the fluid can flow around and interact with actual 3D objects rather than being restricted to simple boundaries. After which I’ll make the fluid look like water instead of a bunch of balls flowing around and then work on the environment.
Since my last dev log, I made a pretty big change by making the fluid interact with actual 3D objects instead of just the bounds. First, I cleaned some stuff up like spawning the particles in a neat cube among other little stuff. Then I decided to refactor how stuff was being rendered. Before, I had two separate canvases, one WebGL canvas for the scene and one WebGPU canvas for the particles, because I was lazy implementing them and so I merged them into one since. That didn’t make too big of a difference visually but it makes it easier to add other stuff later. The main feature was getting the fluid to actually flow around objects. The particles can now collide with not only boxes and spheres but any complex shape I place in the scene. The torus knot is the only complex shape set up so far, but the same system will work for pretty much anything I add later. The other half was making the objects feel realistic. Like at first, they were just static test objects and the fluid could only move around them but not push them so they could move. I added proper physics to the objects so they float and move around realistically in the water and pretty much react to it. Getting this to work took quite a while like objects would spin violently when in contact with the water or bobbing up and down non stop but I eventually got it to work. Next up is pretty much the biggest change yet (at least visually). I want to remove the container and add real terrain over which the fluid can realistically flow over and stuff. Most of the foundation for this change is pretty much setup and the biggest change is to actually generate the terrain. After that I want to improve the physics of the objects. Right now the physics are like deliberately really simple like objects collide with the container only and can’t interact with other objects and the rotations aren’t even handled well. Once there is a terrain, then I’ll work on them pretty much.
Since my last dev log I’ve been working on terrain. I started with simple noise on a grid so the particles had something cool to fall and interact with rather than a boring flat plane. Then I had the idea of making the terrain a planet like fluid flowing on it and stuff like that. Actually got it working. It just wasn’t as good as I thought it would be. It made the project overly complex and kind of shift the focus towards the terrain instead of the fluid and made it harder to play with it. And also the fluid would obviously spread around over the planet so you couldn’t even see most of the cool stuff. And I spent a lot of time on that but well I eventually reverted and added a seabed in a box. That made the fluid the focus instead of the scenery and stuff and how it turned out in the end kind of looks dope. Well with the new terrain I spent time making it look sandy and good. I also switched from rendering some stuff as wireframes to actual meshes Shoudl’ve done this before but back then I guess I got lazy even though most of the stuff for that was already set up Water is really what’s been improved. Particles were just tiny colored spheres before, which I guess is okay for debugging but doesn’t look like water. I’ve been building something called screen space fluid rendering instead which just renders every particle as a billboard that always looks at/faces the camera and does some other cool stuff behind. Mine works I guess but I still have to improve it a lot. Like I guess the fluid looks more like water but still it looks like a bunch of balls so yeah that’s what I want to focus on next. After that, I’ll add proper collisions between objects, then scene polish, then audio. Audio is something I am excited for!
Since my last dev log I’ve mostly been working on the water’s visuals. First thing I did was to rewrite the screen space fluid rendering implementation and tuned it a bit to make it look way better than before and less like a bunch of stacked balls and I also added realistic looking refractions too. Then I added proper shadows to the scene, which made stuff look more alive. This bumped the visuals up a lot. Then I worked on caustics. This was one of those features that instantly made the water look ten times better. This took a bit of time to get right but eventually I got it to work and it looks good. After that, I added foam to make the water look less flat and blobby. The water, in general, waswas too perfect and so I added noise to the water to fix that. With these changes, there was a noticeable loss of performance so I had to work on that. Along the way I also cleaned up some of the code especially the GUI control panel thingy since it was getting too extensive so I cut down a lot of things. Then I finally added model support. Before you could only use basic shapes like squares, spheres etc. Now I can load in model files, and use them in the simulation which is really cool. There was also this weird bug where objects would disappear when you switched them around but after a bunch of changes in my code I finally fixed the bug. I also fixed other bugs like water kind of acting weird with the boat spawned which too took quite a bit of time to fix. Next I want to do some scene polish like better background, etc and then finally audio. I might also work some more on the object collision physics since I intentionally kept them really simple but I might not. Depends on how lazy I am I guess.
I have made a ton of progress since the last devlog. First I added a simple but good looking sky shader which has clouds and a sun, and then hooked up textures on the loaded models so they aren’t just basic colors anymore. And I also added support for loading your own .glb models and they’ll work in the sim. Relatively small changes but they made the scene look a whole lot better and more interactive. Audio was the biggest change and took the most time, but it was also the most fun. There are multiple layers to it, like the general ambience is pretty much layered water sounds like water flowing sounds, foam sound, lapping sound, bubbles, etc that crossfade based on how the fluid is moving. External objects also create sounds like you can hear them splash in and out of the water or when heavy stuff sinks there is kind of a low rumble. There’s also sounds for water splashing on itself, objects colliding around with other objects, etc. There is also a cool underwater effect where if the camera is inside the water stuff get’s muffled and stuff which is really cool. What’s good is that everything is driven by the physics so everything is dynamic and nothing is being faked. Like each sound is created for a reason. After that I added wind to the sim. Like wind is created using gusts which are scheduled procedurally, so you get calm stretches and then a burst of air. I also added another interaction too. You can now create vortexes using V + left click which is kind of fun and adds more interactivity. I also added sculpting to the terrain. Now you can change the terrain to your liking by using different brush modes like: raise, lower, smoothen, flatten. I also optimized particles check with the terrain especially after stuff had become more dynamic though that was pretty easy to do. Some other small polishes I did was to clean up the settings panel thing among other small stuff. The sim is basically feature complete at this point, so next up is cleaning up the UI and then creating a good README.
This is the final dev log. Like I said in the last devlog, the sim was basically feature complete so this dev log is mostly the cleanup and little UI improvements. I cleaned up a bunch of code by like removing dead code that had jut been sitting and I improved how the controls panel looks. Other than that I wrote the README and finalized the repo by adding stuff like the license and I also added a cool looking favicon. And with that, the project is now complete.
Ships:
Well I made a fluid simulation that runs completely on the GPU using WebGPU. Since everything happens on the gpu, like from the physics to the rendering, it can handle tens of thousands of particles in real time in the browser without having performance issues. What was challenging for me was moving everything over to WebGPU since before I was just using plain Three.js and stuff. It’s completely different from WebGL and I had to refactor a lot of code, especially how the sim was structured, and then setting up the rendering system. The other big challenge was just making the water actually look convincing. That took quite a while and a lot of tweaking to make it look at least somewhat realistic. Honestly pretty much how the entire thing turned out. The audio reacts to the physics, the water looks good (or acceptable at the very least), objects float and sink, you can sculpt the terrain, then there are wind gusts and you can interact with the water. Every little thing comes together in a way I’m really happy with. Like this project was just a simple particle test I was making just for fun but in the end I actually enjoyed making and playing around with it. Just open the web page. You’ll need a browser with WebGPU support to run it and the controls are pretty much on the screen. You can adjust sliders and stuff and pretty much play around with everything, including adding your own .glb models. Audio might not play immediately since it takes some time to load in the background....
|
1792961629.3139005
|
1793048029.3139005
|
|
29917
|
icanhelp by @TheShovel | Stardance
|
TheShovel
|
1
|
54.0
|
1020
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-22T09:04:44Z", "hours": 54.0, "multiplier": 19.73, "payout": 1020, "blessing": "neutral", "text": "I decided to make an AI chatbot, that runs locally, without burning your computer. It is designed around using a 500mb, 0.8B model and to work even on weak hardware. Compatibility and actually giving you a result eventually was the priority, not speed! I also made a YouTube video about it if you wanna check that out :3 https://www.youtube.com/watch?v=GhmLUcdesqw", "repo": "https://github.com/TheShovel/icanhelp", "demo": "https://theshovel.rocks/icanhelp/"}]...
|
[{"post_id": 32596, "ts": "202 [{"post_id": 32596, "ts": "2026-07-21T21:27:35Z", "hours": 0.2581, "text": "just a small patch related to memory usage, nothing more :) though, the video is ready! im just waiting for it to get approved for the hackclub video thing and then im gonna post it! Heres the thumbnail"}, {"post_id": 31199, "ts": "2026-07-19T12:23:08Z", "hours": 5.2222, "text": "i think i am finally done! I have optimized, refined stuff and tested a bunch of random things on the lowest model possible, that still has some kind of a intelligence. Nothing really too interesting to talk about, but i DID get it working on my 7gb of ram old laptop! This is the first local chat app that actually works on that thing, so thats pretty damn cool me thinks. Working on a youtube video right now, im proud of the project and i want people to find it and contribute to it. In the meantime, until i finish that video, here is icanhelp writing a document about the importance of vitamin C!"}, {"post_id": 29946, "ts": "2026-07-17T04:07:10Z", "hours": 9.3467, "text": "finally a devlog where not everything was a colossal failure! As i said in my previous dev log, whats left to do is tools and refinement, and thats exactly what i did. The search tool has been updated to let the llm browse websites and their contents, which improved the quality a lot. also, i have implemented an addon system that lets you install external smaller llms to do tasks that are then outputed to the bigger llm. llmception. decided to get rid of the rag since with the improved web search its no longer needed. Besides this, all i did was little tweaks, refinement refinement testing refinement. As one smart video once said: “solution problem, problem solution problem.”"}, {"post_id": 28767, "ts": "2026-07-15T07:30:06Z", "hours": 12.7231, "text": "well well well. This project has been the most frustrating back and forth of my life. It felt like 3 steps forward, 2.5 steps back, CONSTANTLY. Well, after hours and hours of testing, refinement and research, i have found the solution… I have decided to change my approach in how i handle responses. Now, instead of having 1 model that does everything, we have 2 super tiny ones. The flow is kinda like: user types prompt -> small llm analyzes prompt -> small llm returns the instructions for how to solve it using the tools it has -> if it decides that the complexity is too high, then it lets the larger llm continue -> system does knowladgebase + web search -> the chosen llm presents the data to you. This is REALLY fast as you can see, and quite reliable as well. Right now the answer quality is not exceptional, but thats just about refinement and gradual improvements. So hopefully in the next devlog i have some really cool stuff to show you, like graphs, visual explanations, letting the user choose a website to summarize and so on. Along side working on the app, i worked on the website for it! Its still a work in progress but im proud of how it turned out :D https://theshovel.rocks/icanhelp/ ok well, anyway, thats it for now. see you next time in “im going crazy because lobotomy ai doesnt want to follow my instructions”"}, {"post_id": 27563, "ts": "2026-07-13T08:01:26Z", "hours": 8.0653, "text": "well, today was a disaster. 8 ours that didnt really account for much to be honest :( I have tried to move from qwen to minicpm 1b, a model that ALLEGEDLY is a lot better at using tools to gather data rather than using its internal baked in weights. Well, apparently thats not true. I have spent hours making the tools, adapting the outputs and everything for that model, just to then realized that “wow people are wrong and im so tired of ai bros hyping stuff up for nothing!”. So, in the end, i reverted to the qwen models, since they are decent enough for this. Even the 0.8b model gives better results than minicpm… Well, at least thats not all i did. After reverting to a older commit, i have re implemented all the improvements that dont have to do with minicpm. You can now see the sources of where the llm fetched data from under the response bubble, and you can click them to open up the pages and double check the information and stuff. Also, i have worked on large file handling. Previously, for large files it would try to read the entire thing at once. That is insanely inefficient for large files, so i have added a new tool that lets it read from line x to line y. Like that it can only retrieve relevant stuff and not flood its context. I have ALSO worked on compatibility. Now you can change between cpu and gpu inference. If you have under 6gb of vram, the gpu option is grayed out. You might say “thats a little overkill”, but you have to take into account that context also eats up vram, and quite a lot as well. So now you can use the cpu, which uses your system ram, to reliably have long conversations. Sadly in the demo it ended up crashing the app and freezing the process with a node api error, but after i killed the process and reopened the app, the cpu inference worked fine. Thats a small oversight i didnt take into account where llamacpp is still doing stuff while im trying to kill the node process. Well, thats it! See you next time in “trying to make lobotomy ai useful so people stop using giant datacenters to ask about how long to boil and egg for”"}, {"post_id": 26597, "ts": "2026-07-11T14:51:17Z", "hours": 6.4203, "text": "well, i am going to sleep for a few days. The last 24 hours have been tough. First of all, i started getting harassed for making an ai project in my friend groups, which just broke my heart. I got actively attacked and called names for just wanting to make something cool. The point of this project is to make a completely local, light and fast ai assistant for your pc. I dont like the big corporations that do harm economically and environmentally. That is exactly why im making this. With that out of the way, i have spent way longer than 6 hours and a half since the last devlog, bug a lot of that time was not coding, it was data stuff. I have started to build a knowledge base by asking local larger ai that run slower, to write information and documentation for different topics (linux, programming, science, health etc). Right now i have 10 categories with a total of 463 files. Then, i run an embedding model to turn those into searchable vectors that the ai can use during conversation. In the video bellow, i asked it how bash commands work in linux, and it found all the knowladge for that, and started telling me about it. Normally, the quality of the response is pretty short, vague and not very precise, since the model is so small, but now, it actually gives some usable output. I have also worked a lot on making this as easy to install as possible. I have made a install script that covers all dependencies you need, registers the app on your system, and also lets you choose what knowledge categories you want to be included in the embedding process, which also happens locally during install. Yes that means all that knowledge if free and open source in the repository. If you want, you could even make your own categories, or improve existing ones! To make this easier to use, i have also worked on the UI. Now theres a built in light and dark mode that you can use, along side whatever themes you ask the assistant to make for you. You can also now open all of the apps data folders. You can change whatever you want in there, and even customize your buddy! Would be cool to see some user made designs with like miku or something. That would be so cool :3 Sadly, in the process, i also broked the vision model stuff and i just realized that when i recorded the video for this devlog. I am too tired after doing data training for an entire day to debug and fix that right now. Also pretty demotivated after the stuff i had to endure lately for making projects based on ai. I want to remind you that most of this project is made by me, and like my other project for stardance, Irongingot, i will make a graph with all of the files that were touched by ai, how many lines it wrote and what % is ai in the readme of the repository, using my opencode history on this project. I am a human being making stuff for human beings. Anyway, pretty grim devlog i know. Hopefully, the next one will be happier and i can show some more cool stuff i have planned, like real time interaction with your desktop and select text and ask and so on. Thank you to everyone who has been kind to me on here <3"}, {"post_id": 25787, "ts": "2026-07-10T07:37:39Z", "hours": 5.8194, "text": "well well well… turns out cloud AIs are expensive and dont work offline. Also not very accessible for everyone to use!!! So, i have decided to make all of this run LOCALLY!!! Thats right, instead of making you put in an api key to whatever provider you wanna use, you instead get to choose from a list of qwen 3.5 models. It auto detects your hardware, and displays all of the models that work on your system. Now, obviously, this is less high quality than the cloud models. In the previous devlogs i used deepseek v4 flash from opencode, and it was way more competent. Here, i used the 2B version of qwen 3.5. With that said, even the 0.8B model is still fairly capable, considering that deepseek v4 flash is over 200b parameters. I worked a lot on optimizing this. I added chat history compression, so instead of it remembering everything in the conversation precisely, it makes a summary within a token budget instead, to keep system requirements low even for the bigger models. More context tokens = more ram, and who the hell has ram nowadays, am i right gamers. Along with that i made a bunch of small tool and ui improvements. Still a work in progress, but at least the UI is not vibe coded slop for the most part anymore. Next up im going to try and work on a theory that i have. What if i give the small 0.8B model, access to a dataset, and a search engine… Could i possibly make this super tiny model really smart? I dont know. Saw a youtube video about it but it was just a theory, not applied practically. But since im here might as well try it out. Oh also i renamed the little guy to Icanhelpy because i think its very cute"}, {"post_id": 24810, "ts": "2026-07-08T16:43:53Z", "hours": 4.9122, "text": "I got a lot done. Added OCR with tesseract and then i realized it sucked so i switched to BLIP. Runs in a child process so it doesnt freeze the app. The buddy icon animates now based on whats happening, pulses tilts shakes spins depending on state. Also i drew some nice little assets for it :3 Moved the effort dropdown and model selector to the top bar. Settings has sub menus, theme panel lets you browse saved themes and apply or delete them. The AI can change css now through a set_theme tool. Colors gradients images whatever. It can save named themes and they persist across restarts in the encrypted config. Had to consolidate the theme tools cuz the llm request got too big. Screenshots took forever. desktopCapturer asked for permission, imagemagick import has broken syntax, mss gave black screens on wayland, grim doesnt work on kde. Finally spectacle works. Falls back through a chain of tools and tries to auto install imagemagick with a sudo popup if nothing is found. The attach button shows a file and screenshot popup, hides after picking, comes back when you send or remove. Attachment label is a clickable pill that opens files. Fixed the llm re analyzing already attached files. Fixed bubble overflow on long lines. Added chat history, cancel stream, sudo password popup, markdown, web search, file tools, right click menu, window position persistence, burger menu navigation blah blah blah this is getting soooo long bro i dont wanna type no more and a readme. Still need to add proper security beyond the sudo prompt and encrypted config. Gonna work on that next maybe, but thats pretty boring stuff so idk… also sorry for the video quality i just realized my settings were wrong right as i uploaded this. woops"}, {"post_id": 20869, "ts": "2026-07-02T16:18:14Z", "hours": 1.6497, "text": "I have started work on this thing! So far, I have implemented some placeholder ui, a way for you to register your LLM provider, cloud or local, and some basic tools! Copy pasted a lot of code from some of my other projects, so this didnt take too long to do. The thing that took me the longest was to find a method to detect when a console command that the llm runs would return a sudo prompt, so i can prompt the user through the UI to enter their password. So far, thats also the only security thing i have in place. Will work on more of that. The UI is very ugly and clunky right now because its just some css i vibe coded. Trust me i know its ugly ill work on making it better myself once i get everything backend related done."}]...
|
Title: icanhelp by @TheShovel | Stardance
Devlogs Title: icanhelp by @TheShovel | Stardance
Devlogs:
I have started work on this thing! So far, I have implemented some placeholder ui, a way for you to register your LLM provider, cloud or local, and some basic tools! Copy pasted a lot of code from some of my other projects, so this didnt take too long to do. The thing that took me the longest was to find a method to detect when a console command that the llm runs would return a sudo prompt, so i can prompt the user through the UI to enter their password. So far, thats also the only security thing i have in place. Will work on more of that. The UI is very ugly and clunky right now because its just some css i vibe coded. Trust me i know its ugly ill work on making it better myself once i get everything backend related done.
I got a lot done. Added OCR with tesseract and then i realized it sucked so i switched to BLIP. Runs in a child process so it doesnt freeze the app. The buddy icon animates now based on whats happening, pulses tilts shakes spins depending on state. Also i drew some nice little assets for it :3 Moved the effort dropdown and model selector to the top bar. Settings has sub menus, theme panel lets you browse saved themes and apply or delete them. The AI can change css now through a set_theme tool. Colors gradients images whatever. It can save named themes and they persist across restarts in the encrypted config. Had to consolidate the theme tools cuz the llm request got too big. Screenshots took forever. desktopCapturer asked for permission, imagemagick import has broken syntax, mss gave black screens on wayland, grim doesnt work on kde. Finally spectacle works. Falls back through a chain of tools and tries to auto install imagemagick with a sudo popup if nothing is found. The attach button shows a file and screenshot popup, hides after picking, comes back when you send or remove. Attachment label is a clickable pill that opens files. Fixed the llm re analyzing already attached files. Fixed bubble overflow on long lines. Added chat history, cancel stream, sudo password popup, markdown, web search, file tools, right click menu, window position persistence, burger menu navigation blah blah blah this is getting soooo long bro i dont wanna type no more and a readme. Still need to add proper security beyond the sudo prompt and encrypted config. Gonna work on that next maybe, but thats pretty boring stuff so idk… also sorry for the video quality i just realized my settings were wrong right as i uploaded this. woops
well well well… turns out cloud AIs are expensive and dont work offline. Also not very accessible for everyone to use!!! So, i have decided to make all of this run LOCALLY!!! Thats right, instead of making you put in an api key to whatever provider you wanna use, you instead get to choose from a list of qwen 3.5 models. It auto detects your hardware, and displays all of the models that work on your system. Now, obviously, this is less high quality than the cloud models. In the previous devlogs i used deepseek v4 flash from opencode, and it was way more competent. Here, i used the 2B version of qwen 3.5. With that said, even the 0.8B model is still fairly capable, considering that deepseek v4 flash is over 200b parameters. I worked a lot on optimizing this. I added chat history compression, so instead of it remembering everything in the conversation precisely, it makes a summary within a token budget instead, to keep system requirements low even for the bigger models. More context tokens = more ram, and who the hell has ram nowadays, am i right gamers. Along with that i made a bunch of small tool and ui improvements. Still a work in progress, but at least the UI is not vibe coded slop for the most part anymore. Next up im going to try and work on a theory that i have. What if i give the small 0.8B model, access to a dataset, and a search engine… Could i possibly make this super tiny model really smart? I dont know. Saw a youtube video about it but it was just a theory, not applied practically. But since im here might as well try it out. Oh also i renamed the little guy to Icanhelpy because i think its very cute
well, i am going to sleep for a few days. The last 24 hours have been tough. First of all, i started getting harassed for making an ai project in my friend groups, which just broke my heart. I got actively attacked and called names for just wanting to make something cool. The point of this project is to make a completely local, light and fast ai assistant for your pc. I dont like the big corporations that do harm economically and environmentally. That is exactly why im making this. With that out of the way, i have spent way longer than 6 hours and a half since the last devlog, bug a lot of that time was not coding, it was data stuff. I have started to build a knowledge base by asking local larger ai that run slower, to write information and documentation for different topics (linux, programming, science, health etc). Right now i have 10 categories with a total of 463 files. Then, i run an embedding model to turn those into searchable vectors that the ai can use during conversation. In the video bellow, i asked it how bash commands work in linux, and it found all the knowladge for that, and started telling me about it. Normally, the quality of the response is pretty short, vague and not very precise, since the model is so small, but now, it actually gives some usable output. I have also worked a lot on making this as easy to install as possible. I have made a install script that covers all dependencies you need, registers the app on your system, and also lets you choose what knowledge categories you want to be included in the embedding process, which also happens locally during install. Yes that means all that knowledge if free and open source in the repository. If you want, you could even make your own categories, or improve existing ones! To make this easier to use, i have also worked on the UI. Now theres a built in light and dark mode that you can use, along side whatever themes you ask the assistant to make for you. You can also now open all of the apps data folders. You can change whatever you want in there, and even customize your buddy! Would be cool to see some user made designs with like miku or something. That would be so cool :3 Sadly, in the process, i also broked the vision model stuff and i just realized that when i recorded the video for this devlog. I am too tired after doing data training for an entire day to debug and fix that right now. Also pretty demotivated after the stuff i had to endure lately for making projects based on ai. I want to remind you that most of this project is made by me, and like my other project for stardance, Irongingot, i will make a graph with all of the files that were touched by ai, how many lines it wrote and what % is ai in the readme of the repository, using my opencode history on this project. I am a human being making stuff for human beings. Anyway, pretty grim devlog i know. Hopefully, the next one will be happier and i can show some more cool stuff i have planned, like real time interaction with your desktop and select text and ask and so on. Thank you to everyone who has been kind to me on here <3
well, today was a disaster. 8 ours that didnt really account for much to be honest :( I have tried to move from qwen to minicpm 1b, a model that ALLEGEDLY is a lot better at using tools to gather data rather than using its internal baked in weights. Well, apparently thats not true. I have spent hours making the tools, adapting the outputs and everything for that model, just to then realized that “wow people are wrong and im so tired of ai bros hyping stuff up for nothing!”. So, in the end, i reverted to the qwen models, since they are decent enough for this. Even the 0.8b model gives better results than minicpm… Well, at least thats not all i did. After reverting to a older commit, i have re implemented all the improvements that dont have to do with minicpm. You can now see the sources of where the llm fetched data from under the response bubble, and you can click them to open up the pages and double check the information and stuff. Also, i have worked on large file handling. Previously, for large files it would try to read the entire thing at once. That is insanely inefficient for large files, so i have added a new tool that lets it read from line x to line y. Like that it can only retrieve relevant stuff and not flood its context. I have ALSO worked on compatibility. Now you can change between cpu and gpu inference. If you have under 6gb of vram, the gpu option is grayed out. You might say “thats a little overkill”, but you have to take into account that context also eats up vram, and quite a lot as well. So now you can use the cpu, which uses your system ram, to reliably have long conversations. Sadly in the demo it ended up crashing the app and freezing the process with a node api error, but after i killed the process and reopened the app, the cpu inference worked fine. Thats a small oversight i didnt take into account where llamacpp is still doing stuff while im trying to kill the node process. Well, thats it! See you next time in “trying to make lobotomy ai useful so people stop using giant datacenters to ask about how long to boil and egg for”
well well well. This project has been the most frustrating back and forth of my life. It felt like 3 steps forward, 2.5 steps back, CONSTANTLY. Well, after hours and hours of testing, refinement and research, i have found the solution… I have decided to change my approach in how i handle responses. Now, instead of having 1 model that does everything, we have 2 super tiny ones. The flow is kinda like: user types prompt -> small llm analyzes prompt -> small llm returns the instructions for how to solve it using the tools it has -> if it decides that the complexity is too high, then it lets the larger llm continue -> system does knowladgebase + web search -> the chosen llm presents the data to you. This is REALLY fast as you can see, and quite reliable as well. Right now the answer quality is not exceptional, but thats just about refinement and gradual improvements. So hopefully in the next devlog i have some really cool stuff to show you, like graphs, visual explanations, letting the user choose a website to summarize and so on. Along side working on the app, i worked on the website for it! Its still a work in progress but im proud of how it turned out :D https://theshovel.rocks/icanhelp/ ok well, anyway, thats it for now. see you next time in “im going crazy because lobotomy ai doesnt want to follow my instructions”
finally a devlog where not everything was a colossal failure! As i said in my previous dev log, whats left to do is tools and refinement, and thats exactly what i did. The search tool has been updated to let the llm browse websites and their contents, which improved the quality a lot. also, i have implemented an addon system that lets you install external smaller llms to do tasks that are then outputed to the bigger llm. llmception. decided to get rid of the rag since with the improved web search its no longer needed. Besides this, all i did was little tweaks, refinement refinement testing refinement. As one smart video once said: “solution problem, problem solution problem.”
i think i am finally done! I have optimized, refined stuff and tested a bunch of random things on the lowest model possible, that still has some kind of a intelligence. Nothing really too interesting to talk about, but i DID get it working on my 7gb of ram old laptop! This is the first local chat app that actually works on that thing, so thats pretty damn cool me thinks. Working on a youtube video right now, im proud of the project and i want people to find it and contribute to it. In the meantime, until i finish that video, here is icanhelp writing a document about the importance of vitamin C!
just a small patch related to memory usage, nothing more :) though, the video is ready! im just waiting for it to get approved for the hackclub video thing and then im gonna post it! Heres the thumbnail
Ships:
I decided to make an AI chatbot, that runs locally, without burning your computer. It is designed around using a 500mb, 0.8B model and to work even on weak hardware. Compatibility and actually giving you a result eventually was the priority, not speed! I also made a YouTube video about it if you wanna check that out :3 https://www.youtube.com/watch?v=GhmLUcdesqw...
|
1792972062.0841866
|
1793058462.0841866
|
|
53836
|
FOU by @SHREX | Stardance
|
SHREX
|
3
|
71.0
|
1016
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-12T20:41:24Z", "hours": 50.0, "multiplier": 13.35, "payout": 664, "blessing": "neutral", "text": "FOU is my first serious programming project, and honestly, I never thought it would come this far. It started as a small Python CLI because I wanted an easy way to track crypto prices without opening an exchange every time. Slowly, I added live prices, coin validation, saving, and my own backend. And now, with v2.5, I’ve finally turned it into a proper desktop app! FOU now has three themes — FOU DEFAULT, THE FOOL, and VOID , each with its own companion and six different reactions. The hardest part was definitely building the GUI, especially getting the characters, decorative frames, and layouts to work properly when resizing the window. I spent way too much time fixing tiny details 😭 I also tried to work on almost every piece of feedback from my previous ships. A lot of people said my README and devlogs weren’t clear enough, so this time I’ve added better explanations, installation instructions, a full demo video, and more details about how I built everything. 💜 Please read this before testing! ⏳ First-time loading: Adding your first coin or loading saved prices might take around 60 seconds because my free hosted backend sometimes goes to sleep. Please give it a little time! 🛡️ Windows: I’ve tested the released app on two Windows laptops, and it worked fine. However, the executable is still unsigned, so Windows might show a security warning. I’ve already applied for code signing. Please don’t disable your security settings just to test it. 🐧 Linux and macOS: Both builds completed successfully, but I couldn’t test them on real Linux or Mac computers. So please treat them as experimental. If something doesn’t work, I’d really appreciate it if you could watch the demo video before rating, rather than judging FOU only by an untested build. 🐛 Bugs: Some recent tests found a few rare issues with saving and unexpected API responses. I’ve started fixing them, but those fixes aren’t in this release yet. If you find anything, please let me know! 🚀 How to try it Download the ZIP for your OS from the GitHub Release. On Windows, extract everything and open FOU.exe . Try adding BTC, ETH, or SOL, refreshing prices, saving your portfolio, and switching themes. FOU isn’t a wallet or trading app. It’s just a watchlist for coins you’re interested in. Release: https://github.com/FOU-SHREX/FOU/releases/tag/v2.5.0 README + Demo Video: https://github.com/FOU-SHREX/FOU I’m still learning Python, and this project taught me so much about coding, APIs, GUI development, and fixing things that randomly stop working. I also used ChatGPT, and AI image tools to help with coding, debugging, and artwork throughout development. I’m really happy with how far FOU has come, even though it’s still not perfect. Thanks to everyone who gave feedback on my earlier versions and helped me improve it. I hope you enjoy trying FOU! 💜 Please give feedback and good rating <(_ _)>", "repo": "https://github.com/FOU-SHREX/FOU", "demo": "https://github.com/FOU-SHREX/FOU/releases/tag/v2.5.0"}, {"ship_num": 2, "ts": "2026-09-22T14:25:57Z", "hours": 20.0, "multiplier": 17.33, "payout": 346, "blessing": "neutral", "text": "FOU is my first serious programming project and I made most of it while I was still learning Python. The idea actually came from a small problem I had myself. There were a lot of crypto coins I wanted to keep an eye on, but I didn’t want to open an exchange or search each coin again and again just to check the price. So I thought, why not make a small program where I can add the coins I care about once and then just open it whenever I want to check them. That’s how FOU started. V1.1 was very simple. It was just a CLI watchlist where you could add, remove, save and load coin symbols. While making V2 I learned a lot more and slowly upgraded it with live prices, valid coin checking, adding multiple coins, better save handling, error handling and builds for Windows, Linux and macOS. One of the hardest parts for me was learning how APIs and backend stuff work. I didn’t want to put the CoinGecko API key inside the app, so I built my own FastAPI backend and deployed it. I also learned caching, rate limiting, GitHub Actions, PyInstaller and a lot of testing while doing this. I also worked on the feedback from my V1.1 ship. A lot of people said the README and devlogs were not explaining the project enough, and some people didn’t even understand what a crypto watchlist was or thought it was related to wallets. So for V2 I added a beginner guide, clearer explanation of what FOU does, why I made it, better installation steps and I’m also adding better screenshots and more detailed devlogs. FOU does not connect to wallets, trade crypto or use real money. It is just a simple personal watchlist to track coins you are interested in. To test it, download the build for your OS from the V2 release, open FOU, add coins like BTC, ETH or SOL, type DONE, then open View Portfolio to see the live prices. Save it, close the app, reopen it and your watchlist should still be there. I’m still a beginner and this project is mainly how I’m learning by actually building something, so feedback really helps me improve it. If you try it and like what I made, I’d really appreciate a good rating and an honest review. And if something feels confusing or broken, please tell me that too so I can work on it in the next update.", "repo": "https://github.com/FOU-SHREX/FOU", "demo": "https://github.com/FOU-SHREX/FOU/releases/tag/v2.5.0"}, {"ship_num": 3, "ts": "2026-09-02T16:11:07Z", "hours": 1.0, "multiplier": 4.25, "payout": 6, "blessing": "neutral", "text": "I made FOU V1.1, a Python command-line cryptocurrency watchlist where users can add, view, remove, save, and reload coin symbols. The most challenging part was making the save system reliable both when running the Python file and when running the packaged Windows .exe . I also learned how to handle missing or corrupted save files and how to package the project with PyInstaller. I’m most proud that I took a simple Python project and turned it into a working standalone Windows release that other people can actually download and run. I also improved the code structure, added better error handling, and learned more about Git, GitHub releases, and project shipping. People should know that FOU V1.1 is still a watchlist-style project, not a full live crypto tracker yet. V2 is planned to add live prices and coin validation.", "repo": "https://github.com/FOU-SHREX/FOU", "demo": "https://github.com/FOU-SHREX/FOU/releases/tag/v2.5.0"}]...
|
[{"post_id": 79151, "ts": "202 [{"post_id": 79151, "ts": "2026-10-12T20:29:06Z", "hours": 4.8217, "text": "DEVLOG- 35: About to ship this here is important thing please read this if you encounter with and security issue please click run anyway as I applied for the authorized ownership but that will take weeks to fulfill so please co-operate and Linux and windows user if you want you can skip as i don’t have any system to test them, Thank you all for this journey will make more and be better if you rating me please rate me good. <(_ _)><(_ _)>"}, {"post_id": 78470, "ts": "2026-10-10T21:32:57Z", "hours": 2.5167, "text": "DEVLOG- 34: Here is the look of second theme the name is THE FOOL and the companion name is Mr. FOOL , the border around the portfolio takes so much time and effort of mine like in the end i need to use codex for calculation part as i learn MATH but the calculation is quiet complex so uses that, Appart from this I think i had done most of the work on feedback : 1st Feedback : Make a UI -> Now my project is shifted from cli to gui and have a proper UI 2nd Feedback : Timestap -> Added that in portfolio frame you can see the time its feacting the prices 3rd Feedback : Help -> Addded a help button at the bottom and that will open a youtube video that explain everything from how to use and what is for what! 4th Feedback : Nothing - > so everything is done so far ╰( °▽° )╯╰( °▽° )╯ BTW, working on the third theme too maybe ship tomorrow so don’t forget to try and Rate good my project ."}, {"post_id": 78181, "ts": "2026-10-09T21:53:47Z", "hours": 3.5731, "text": "DEVLOG- 33: Worked on so many things today, like adding the overall background in the second theme and living the frames that hiding that giving each frame its own border frame as per theme, created cards icon for change theme option using DRAW and also create local saving icon to use. i really think i cover most of the feedback as majorities of feedback were about UI which is done mostly and one feedback was about help option so I created a help button at the right bottom which will have a go through video of FOU explain everything if u needed help! will reveled the final look of second theme so stay tuned. - - () - -"}, {"post_id": 77929, "ts": "2026-10-08T20:20:52Z", "hours": 2.1711, "text": "DEVLOG- 32: After struggling and finding the result of the problem i learned math module and ceil and after learning this its so complicated for me that i need to take help from chat_gpt for the calculation part and then i got the desire result but still raise a another issue like the border of companion frame is not retracking its placement so I think i need to fix that next stay tuned ! ಥ_ಥ ┑( ̄Д  ̄)┍"}, {"post_id": 77643, "ts": "2026-10-07T18:38:28Z", "hours": 2.0833, "text": "DEVLOG - 31: Working on a same problem from yesterday but it didn’t fixed yet learned the new concepts and apply them but nothing happened will keep trying until crack that so stay tuned, if you can help please comment me the problem is i want a png border file to get perfectly fix around my portfolio and that file is not fitting perfectly so if anybody know i am using python only and making UI using coustomTkinter."}, {"post_id": 77375, "ts": "2026-10-06T18:17:46Z", "hours": 3.3803, "text": "DEVLOG - 30: Currently working on the second theme and just fixed done the companion frame and part like the emotion part and struggling in the frame of portfolio so i need to learn and understand some more concepts to fix that stay tuned! ( ̄┰ ̄*) ಥ_ಥ"}, {"post_id": 77134, "ts": "2026-10-05T19:03:05Z", "hours": 2.1525, "text": "DEVLOG- 29: Today I finally completed the FOU default theme UI and this is the locked result done some refinement today as remove button draw the prefect remove button icon and the companion sizing and placement the header of companion given a companion a 3D look ) and make companion fame fits to it as the upcoming theme will use that logic stay tuned may ship this this sunday or monday!)"}, {"post_id": 76822, "ts": "2026-10-04T18:27:03Z", "hours": 4.2847, "text": "DEVLOG- 28: So this is my default theme look today i fixed the style like the text fonts and placement and size worked on the activity section like the tick part take a lot just learned the image draw in python and use that to make the search icon clock and tick and loading so it take a while what do you think about this theme there will be more i give you a hint the second is from anime which is so mysterious! (⊙ (⊙ ⊙)_⊙) ( ̄┰ ̄ )( ̄┰ ̄ )"}, {"post_id": 76487, "ts": "2026-10-03T18:48:30Z", "hours": 4.4256, "text": "DEVLOG- 27: Today I fixed the major issue i am facing the image sizing part like when minimize and maximize done some calculation learn new concepts and do some compromise and apart from that added the logo section so the displayed coin will display there logo too and added the help button later when this finish will create a youtube video to guide it threw. The UI is taking the target set shape need some refinement and clarity the the default theme is done yes there will be more then one theme. ^0^ ^0^╰( °▽° )╯╰( °▽° )╯"}, {"post_id": 76239, "ts": "2026-10-02T20:22:19Z", "hours": 3.3644, "text": "DEVLOG- 26: Today I am working on the companion part of my GUI and from the morning working on the correct size fitting of the .png still didn’t get that like when minimize and maximize the size is getting larger and cropped or smaller then the frame and never fits if anybody know how to fix that issue do comment i am using CustomTkinter for this GUI. <(_ _)><(_ _)>o(TヘTo)o(TヘTo)"}, {"post_id": 75986, "ts": "2026-10-01T20:57:10Z", "hours": 2.2486, "text": "DEVLOG- 25: Today I worked on the enhancing the UI and making the default theme till now done the background part and color and border part screen size issue clear and ore UI fixed now working on the complete look and will update when the FOU Theme done."}, {"post_id": 75670, "ts": "2026-09-30T18:12:55Z", "hours": 3.1133, "text": "DEVLOG- 24: Today worked on the left side panels and activity tracer part and done both the part currently generating images as introducing the companion in the GUI with is image based for now but For V3 will change that too motion one. (❁´◡ ❁)(❁´◡ ❁)"}, {"post_id": 75298, "ts": "2026-09-29T17:46:30Z", "hours": 1.5606, "text": "DEVLOG- 23: ADDED some color and themes too, this V2.1 will have 6 theme to choose and currently working on the 2 of them then others right now leaning color change and multiple theme changer in CustomTkinter and apply them here. So far Done the border and background and button stuff will work on coin selection now see you soon."}, {"post_id": 74949, "ts": "2026-09-28T17:31:46Z", "hours": 1.7661, "text": "DEVLOG-22: Today i worked on adding functions to the buttons and handling the possible errors that could happened till now done the view_portfolio , remove_coin, add_coin part with there respective button now work on selection of coin and coin preview as a 3D image if possible. (〃 ̄︶ ̄)人( ̄︶ ̄〃)"}, {"post_id": 74476, "ts": "2026-09-27T13:48:46Z", "hours": 3.055, "text": "DEVLOG- 21: Currently working on the GUI structure and just done timeout error handling with this as a base structure the whole UI will be amazing and will take a while I am new to coustomTkinter so I need to learn first."}, {"post_id": 74143, "ts": "2026-09-26T19:20:12Z", "hours": 1.9086, "text": "DEVLOG-20: Done the refactor with the main.py and build some core functions so the same function will be used buy both CLI and GUI and now working on GUI skeleton stucture will update when finish do comment and like please."}, {"post_id": 73939, "ts": "2026-09-26T11:28:10Z", "hours": 1.1467, "text": "DEVLOG-19: Done with the test_GUI learned the major concepts and basics too no moving forward to work on actual FOU. (~ ̄▽ ̄)~(~ ̄▽ ̄)~"}, {"post_id": 73475, "ts": "2026-09-25T06:14:15Z", "hours": 1.5586, "text": "DEVLOG-18: Guys currently working on GUI and testing it while learning so this will take time i think. Do share some UI layouts ideas to put that."}, {"post_id": 73218, "ts": "2026-09-24T16:50:55Z", "hours": 0.5897, "text": "DEVLOG-17: Thanks everyone for reviews working on the reviews and fixed some issue too, currenty working on GUI as many suggest a good UI ,testing the GUI and learning it too will ship the V2.1 with GUI and fixed things as per feedback. THANKS EVERYONE! DO SUGGEST ME SOME GUI THEMES FOR UI."}, {"post_id": 71370, "ts": "2026-09-20T18:26:30Z", "hours": 1.005, "text": "DEVLOG-16: Guys, Finally the V2 is done and live check my github and try & test and do give the feedback and reviews its been a great journey I learned a lot while making this do like and follow. I can’t ship it right now my previous ship is still pending its been more then 2 week about 3 week still pending if anyone could help do reply please that’s it thanks for connecting. V3 will be delayed bcz of college stuff but will work on the feedback for sure. ☆ : .。. o(≧▽≦)o .。.: ☆☆ : .。. o(≧▽≦)o .。.: ☆ here is the whole story: FOU started as my first serious Python project and was originally just a simple CLI watchlist where you could add, remove, save and reload coin symbols. V1.1 made that version more stable and usable with better structure, save handling and a standalone Windows build. V2 is the biggest jump so far. I added live prices, coin validation, multiple-coin adding, better formatting, safer save-file handling, and a hosted FastAPI backend so the CoinGecko API key stays off the client. I also added caching, rate limiting, network error handling, and cross-platform builds for Windows, Linux and macOS using GitHub Actions. The V1.1 reviews also showed me that the project explanation was still too technical for beginners. Some people didn’t understand what a crypto watchlist was or thought it involved wallets. So I’m improving that too: clearer README beginner guide screenshots better devlogs simpler explanation of what FOU does and why I built it FOU is still a learning project and my first serious one, so a big part of this has been learning by building. Next I’m focusing on V2 feedback and polish before moving toward V3."}, {"post_id": 70741, "ts": "2026-09-19T17:59:07Z", "hours": 0.7525, "text": "DEVLOG-15: Don’t know why still pending if anyone seeing from the team please check my project the V2 is done and i want to ship that if the V1.1 will stay pending i will not able to ship it please team stardance help. BTW done the package part and multiple OS support too and testing there is still work needed but will finish tomorrow."}, {"post_id": 69844, "ts": "2026-09-17T21:52:56Z", "hours": 0.5375, "text": "DEVLOG-14: Done making the backend now some refactors and packages left to build and then V2 is done. if any shipwrights watching this please review my project so i can ship V2. BTW anyone wants to team up on the new programm by hack club “Third space” please comment on this devlog."}, {"post_id": 68760, "ts": "2026-09-15T18:12:26Z", "hours": 2.0439, "text": "DEVLOG-13: Currently working on Backend Error handling like time limit and request limits and after that will do the final cleanup and touch ups and then work on the package part will release the V2 for all os its currenty limited to window’s but V2 will be for linux and mac too. ^0^"}, {"post_id": 68214, "ts": "2026-09-14T18:21:46Z", "hours": 1.1408, "text": "DEVLOG- 12: Today Done some what robusting and will final this didn’t work much today cause of college but will wrap this V2 in 2 days hopely its going to be best thanks. For me learning backend then Appling it was a headache task but done it and learn about it more. try project and give ideas like what i can add in this next and reviews."}, {"post_id": 67588, "ts": "2026-09-13T18:52:15Z", "hours": 1.9956, "text": "DEVLOG-11: Guy Today worked on the Backend created the backend and test it its working and now the sunday feels worth drop the API robustness before but now work on that hope is that it will finished in 3-4 days. will update when API & Network Robustness done. ☆ : .。. o(≧▽≦)o .。.: ☆"}, {"post_id": 66486, "ts": "2026-09-12T10:16:00Z", "hours": 1.9486, "text": "DEVLOG- 10: Today I Done the view_portfolio part and now it shows the current_price of the coin and also a better UI is there to as I ass separator and anchor too add short part too where the coins with high market rank will appear at the top. Now work on the API handling will update soon. ( /ω\ )"}, {"post_id": 65507, "ts": "2026-09-10T18:18:00Z", "hours": 2.4475, "text": "DEVLOG-9: Today worked on the view_portfolio and add the almost every features, testing it now for a while and fixing the bugs and errors here GLM is useful as it test the code and returning the exact error that I am fixing hopply finish the view part tomorrow and move to something next. btw I take off from college for this still learning and then implementing it make it long (~ ̄▽ ̄)~ . will go college tomorrow hopply this will end. Please do follow me and like my log as i am working hard and who gonna like my log i will like there all log. (〃 ̄︶ ̄)人( ̄︶ ̄〃)"}, {"post_id": 64954, "ts": "2026-09-09T18:07:02Z", "hours": 1.3367, "text": "DEVLOG-8: Finally Fixed the add function part and API errors it take a lot of time and learnings to do so now starts working on view_portfolio function hopefully it get done quickly ( /ω\ )."}, {"post_id": 64386, "ts": "2026-09-08T18:26:31Z", "hours": 1.1236, "text": "DEVLOG-7: Work on the add function still handling API and debugging the problems as per my first project this is going to be crazy and lately getting busy as I had join a college for my BBA degree and classes are long ಥ_ಥಥ_ಥ"}, {"post_id": 63720, "ts": "2026-09-07T17:33:31Z", "hours": 1.8575, "text": "DEVLOG-6: Guys working the the API debugging part and it’s frustrating ಥ_ಥ since its keep failing and i had tried all the things asking AI for diagnosis, btw this hard work will be paid of once it’s made cause its gonna add the exciting components.(❁´◡`❁)"}, {"post_id": 62830, "ts": "2026-09-06T11:12:36Z", "hours": 1.7642, "text": "DEVLOG-5: Guys just completed the API function and working on the sorting , price reflecting , listing , and ranking so the V2 will be a considerable hit ╰( °▽° )╯"}, {"post_id": 62153, "ts": "2026-09-05T12:27:18Z", "hours": 0.9586, "text": "DEVLOG-4: Testing API and learning concepts its really time consuming guys please follow and share your reviews"}, {"post_id": 61750, "ts": "2026-09-04T20:10:07Z", "hours": 0.2939, "text": "DEVLOG-3: The Work on the V2 is going on write now the things are complicated for me cause as a learner and a beginner I have to learn before implementation so this will take the time I don’t know why my ship1 is not rated yet if anybody knows please comment. Do try my project and give feedbacks"}, {"post_id": 61487, "ts": "2026-09-04T13:03:38Z", "hours": 0.4081, "text": "DEVLOG-2: Complete the refactor part and now working on the V2 main comp. the API part will update soon"}, {"post_id": 61327, "ts": "2026-09-04T05:44:52Z", "hours": 0.3233, "text": "DEVLOG-1: Started Working on V2 before major updates just refactoring the code as per feedback adding loops in ADD and REMOVE feature and also making package for macos and linux"}, {"post_id": 60297, "ts": "2026-09-02T15:56:41Z", "hours": 0.6444, "text": "Just completed the packaging part now my project is in .exe and going to ship it now"}, {"post_id": 60097, "ts": "2026-09-02T07:41:35Z", "hours": 0.3394, "text": "Devlog 2 -_- Working on the packaging part making it a .exe for you guys so u could try and share reviews and soon shipping it too"}, {"post_id": 57119, "ts": "2026-08-29T06:50:58Z", "hours": 0.4653, "text": "Devlog:1 -_- Today I refactor my FOU-V1 add the separate function for all the functions and ready to move on the V2 of it.Please try and give reviews"}]...
|
Title: FOU by @SHREX | Stardance
Devlogs:
Devlog: Title: FOU by @SHREX | Stardance
Devlogs:
Devlog:1 -_- Today I refactor my FOU-V1 add the separate function for all the functions and ready to move on the V2 of it.Please try and give reviews
Devlog 2 -_- Working on the packaging part making it a .exe for you guys so u could try and share reviews and soon shipping it too
Just completed the packaging part now my project is in .exe and going to ship it now
DEVLOG-1: Started Working on V2 before major updates just refactoring the code as per feedback adding loops in ADD and REMOVE feature and also making package for macos and linux
DEVLOG-2: Complete the refactor part and now working on the V2 main comp. the API part will update soon
DEVLOG-3: The Work on the V2 is going on write now the things are complicated for me cause as a learner and a beginner I have to learn before implementation so this will take the time I don’t know why my ship1 is not rated yet if anybody knows please comment. Do try my project and give feedbacks
DEVLOG-4: Testing API and learning concepts its really time consuming guys please follow and share your reviews
DEVLOG-5: Guys just completed the API function and working on the sorting , price reflecting , listing , and ranking so the V2 will be a considerable hit ╰( °▽° )╯
DEVLOG-6: Guys working the the API debugging part and it’s frustrating ಥ_ಥ since its keep failing and i had tried all the things asking AI for diagnosis, btw this hard work will be paid of once it’s made cause its gonna add the exciting components.(❁´◡`❁)
DEVLOG-7: Work on the add function still handling API and debugging the problems as per my first project this is going to be crazy and lately getting busy as I had join a college for my BBA degree and classes are long ಥ_ಥಥ_ಥ
DEVLOG-8: Finally Fixed the add function part and API errors it take a lot of time and learnings to do so now starts working on view_portfolio function hopefully it get done quickly ( /ω\ ).
DEVLOG-9: Today worked on the view_portfolio and add the almost every features, testing it now for a while and fixing the bugs and errors here GLM is useful as it test the code and returning the exact error that I am fixing hopply finish the view part tomorrow and move to something next. btw I take off from college for this still learning and then implementing it make it long (~ ̄▽ ̄)~ . will go college tomorrow hopply this will end. Please do follow me and like my log as i am working hard and who gonna like my log i will like there all log. (〃 ̄︶ ̄)人( ̄︶ ̄〃)
DEVLOG- 10: Today I Done the view_portfolio part and now it shows the current_price of the coin and also a better UI is there to as I ass separator and anchor too add short part too where the coins with high market rank will appear at the top. Now work on the API handling will update soon. ( /ω\ )
DEVLOG-11: Guy Today worked on the Backend created the backend and test it its working and now the sunday feels worth drop the API robustness before but now work on that hope is that it will finished in 3-4 days. will update when API & Network Robustness done. ☆ : .。. o(≧▽≦)o .。.: ☆
DEVLOG- 12: Today Done some what robusting and will final this didn’t work much today cause of college but will wrap this V2 in 2 days hopely its going to be best thanks. For me learning backend then Appling it was a headache task but done it and learn about it more. try project and give ideas like what i can add in this next and reviews.
DEVLOG-13: Currently working on Backend Error handling like time limit and request limits and after that will do the final cleanup and touch ups and then work on the package part will release the V2 for all os its currenty limited to window’s but V2 will be for linux and mac too. ^0^
DEVLOG-14: Done making the backend now some refactors and packages left to build and then V2 is done. if any shipwrights watching this please review my project so i can ship V2. BTW anyone wants to team up on the new programm by hack club “Third space” please comment on this devlog.
DEVLOG-15: Don’t know why still pending if anyone seeing from the team please check my project the V2 is done and i want to ship that if the V1.1 will stay pending i will not able to ship it please team stardance help. BTW done the package part and multiple OS support too and testing there is still work needed but will finish tomorrow.
DEVLOG-16: Guys, Finally the V2 is done and live check my github and try & test and do give the feedback and reviews its been a great journey I learned a lot while making this do like and follow. I can’t ship it right now my previous ship is still pending its been more then 2 week about 3 week still pending if anyone could help do reply please that’s it thanks for connecting. V3 will be delayed bcz of college stuff but will work on the feedback for sure. ☆ : .。. o(≧▽≦)o .。.: ☆☆ : .。. o(≧▽≦)o .。.: ☆ here is the whole story: FOU started as my first serious Python project and was originally just a simple CLI watchlist where you could add, remove, save and reload coin symbols. V1.1 made that version more stable and usable with better structure, save handling and a standalone Windows build. V2 is the biggest jump so far. I added live prices, coin validation, multiple-coin adding, better formatting, safer save-file handling, and a hosted FastAPI backend so the CoinGecko API key stays off the client. I also added caching, rate limiting, network error handling, and cross-platform builds for Windows, Linux and macOS using GitHub Actions. The V1.1 reviews also showed me that the project explanation was still too technical for beginners. Some people didn’t understand what a crypto watchlist was or thought it involved wallets. So I’m improving that too: clearer README beginner guide screenshots better devlogs simpler explanation of what FOU does and why I built it FOU is still a learning project and my first serious one, so a big part of this has been learning by building. Next I’m focusing on V2 feedback and polish before moving toward V3.
DEVLOG-17: Thanks everyone for reviews working on the reviews and fixed some issue too, currenty working on GUI as many suggest a good UI ,testing the GUI and learning it too will ship the V2.1 with GUI and fixed things as per feedback. THANKS EVERYONE! DO SUGGEST ME SOME GUI THEMES FOR UI.
DEVLOG-18: Guys currently working on GUI and testing it while learning so this will take time i think. Do share some UI layouts ideas to put that.
DEVLOG-19: Done with the test_GUI learned the major concepts and basics too no moving forward to work on actual FOU. (~ ̄▽ ̄)~(~ ̄▽ ̄)~
DEVLOG-20: Done the refactor with the main.py and build some core functions so the same function will be used buy both CLI and GUI and now working on GUI skeleton stucture will update when finish do comment and like please.
DEVLOG- 21: Currently working on the GUI structure and just done timeout error handling with this as a base structure the whole UI will be amazing and will take a while I am new to coustomTkinter so I need to learn first.
DEVLOG-22: Today i worked on adding functions to the buttons and handling the possible errors that could happened till now done the view_portfolio , remove_coin, add_coin part with there respective button now work on selection of coin and coin preview as a 3D image if possible. (〃 ̄︶ ̄)人( ̄︶ ̄〃)
DEVLOG- 23: ADDED some color and themes too, this V2.1 will have 6 theme to choose and currently working on the 2 of them then others right now leaning color change and multiple theme changer in CustomTkinter and apply them here. So far Done the border and background and button stuff will work on coin selection now see you soon.
DEVLOG- 24: Today worked on the left side panels and activity tracer part and done both the part currently generating images as introducing the companion in the GUI with is image based for now but For V3 will change that too motion one. (❁´◡ ❁)(❁´◡ ❁)
DEVLOG- 25: Today I worked on the enhancing the UI and making the default theme till now done the background part and color and border part screen size issue clear and ore UI fixed now working on the complete look and will update when the FOU Theme done.
DEVLOG- 26: Today I am working on the companion part of my GUI and from the morning working on the correct size fitting of the .png still didn’t get that like when minimize and maximize the size is getting larger and cropped or smaller then the frame and never fits if anybody know how to fix that issue do comment i am using CustomTkinter for this GUI. <(_ _)><(_ _)>o(TヘTo)o(TヘTo)
DEVLOG- 27: Today I fixed the major issue i am facing the image sizing part like when minimize and maximize done some calculation learn new concepts and do some compromise and apart from that added the logo section so the displayed coin will display there logo too and added the help button later when this finish will create a youtube video to guide it threw. The UI is taking the target set shape need some refinement and clarity the the default theme is done yes there will be more then one theme. ^0^ ^0^╰( °▽° )╯╰( °▽° )╯
DEVLOG- 28: So this is my default theme look today i fixed the style like the text fonts and placement and size worked on the activity section like the tick part take a lot just learned the image draw in python and use that to make the search icon clock and tick and loading so it take a while what do you think about this theme there will be more i give you a hint the second is from anime which is so mysterious! (⊙ (⊙ ⊙)_⊙) ( ̄┰ ̄ )( ̄┰ ̄ )
DEVLOG- 29: Today I finally completed the FOU default theme UI and this is the locked result done some refinement today as remove button draw the prefect remove button icon and the companion sizing and placement the header of companion given a companion a 3D look ) and make companion fame fits to it as the upcoming theme will use that logic stay tuned may ship this this sunday or monday!)
DEVLOG - 30: Currently working on the second theme and just fixed done the companion frame and part like the emotion part and struggling in the frame of portfolio so i need to learn and understand some more concepts to fix that stay tuned! ( ̄┰ ̄*) ಥ_ಥ
DEVLOG - 31: Working on a same problem from yesterday but it didn’t fixed yet learned the new concepts and apply them but nothing happened will keep trying until crack that so stay tuned, if you can help please comment me the problem is i want a png border file to get perfectly fix around my portfolio and that file is not fitting perfectly so if anybody know i am using python only and making UI using coustomTkinter.
DEVLOG- 32: After struggling and finding the result of the problem i learned math module and ceil and after learning this its so complicated for me that i need to take help from chat_gpt for the calculation part and then i got the desire result but still raise a another issue like the border of companion frame is not retracking its placement so I think i need to fix that next stay tuned ! ಥ_ಥ ┑( ̄Д  ̄)┍
DEVLOG- 33: Worked on so many things today, like adding the overall background in the second theme and living the frames that hiding that giving each frame its own border frame as per theme, created cards icon for change theme option using DRAW and also create local saving icon to use. i really think i cover most of the feedback as majorities of feedback were about UI which is done mostly and one feedback was about help option so I created a help button at the right bottom which will have a go through video of FOU explain everything if u needed help! will reveled the final look of second theme so stay tuned. - - () - -
DEVLOG- 34: Here is the look of second theme the name is THE FOOL and the companion name is Mr. FOOL , the border around the portfolio takes so much time and effort of mine like in the end i need to use codex for calculation part as i learn MATH but the calculation is quiet complex so uses that, Appart from this I think i had done most of the work on feedback : 1st Feedback : Make a UI -> Now my project is shifted from cli to gui and have a proper UI 2nd Feedback : Timestap -> Added that in portfolio frame you can see the time its feacting the prices 3rd Feedback : Help -> Addded a help button at the bottom and that will open a youtube video that explain everything from how to use and what is for what! 4th Feedback : Nothing - > so everything is done so far ╰( °▽° )╯╰( °▽° )╯ BTW, working on the third theme too maybe ship tomorrow so don’t forget to try and Rate good my project .
DEVLOG- 35: About to ship this here is important thing please read this if you encounter with and security issue please click run anyway as I applied for the authorized ownership but that will take weeks to fulfill so please co-operate and Linux and windows user if you want you can skip as i don’t have any system to test them, Thank you all for this journey will make more and be better if you rating me please rate me good. <(_ _)><(_ _)>
Ships:
I made FOU V1.1, a Python command-line cryptocurrency watchlist where users can add, view, remove, save, and reload coin symbols. The most challenging part was making the save system reliable both when running the Python file and when running the packaged Windows .exe . I also learned how to handle missing or corrupted save files and how to package the project with PyInstaller. I’m most proud that I took a simple Python project and turned it into a working standalone Windows release that other people can actually download and run. I also improved the code structure, added better error handling, and learned more about Git, GitHub releases, and project shipping. People should know that FOU V1.1 is still a watchlist-style project, not a full live crypto tracker yet. V2 is planned to add live prices and coin validation.
FOU is my first serious programming project and I made most of it while I was still learning Python. The idea actually came from a small problem I had myself. There were a lot of crypto coins I wanted to keep an eye on, but I didn’t want to open an exchange or search each coin again and again just to check the price. So I thought, why not make a small program where I can add the coins I care about once and then just open it whenever I want to check them. That’s how FOU started. V1.1 was very simple. It was just a CLI watchlist where you could add, remove, save and load coin symbols. While making V2 I learned a lot more and slowly upgraded it with live prices, valid coin checking, adding multiple coins, better save handling, error handling and builds for Windows, Linux and macOS. One of the hardest parts for me was learning how APIs and backend stuff work. I didn’t want to put the CoinGecko API key inside the app, so I built my own FastAPI backend and deployed it. I also learned caching, rate limiting, GitHub Actions, PyInstaller and a lot of testing while doing this. I also worked on the feedback from my V1.1 ship. A lot of people said the README and devlogs were not explaining the project enough, and some people didn’t even understand what a crypto watchlist was or thought it was related to wallets. So for V2 I added a beginner guide, clearer explanation of what FOU does, why I made it, better installation steps and I’m also adding better screenshots and more detailed devlogs. FOU does not connect to wallets, trade crypto or use real money. It is just a simple personal watchlist to track coins you are interested in. To test it, download the build for your OS from the V2 release, open FOU, add coins like BTC, ETH or SOL, type DONE, then open View Portfolio to see the live prices. Save it, close the app, reopen it and your watchlist should still be there. I’m still a beginner and this project is mainly how I’m learning by actually building something, so feedback really helps me improve it. If you try it and like what I made, I’d really appreciate a good rating and an honest review. And if something feels confusing or broken, please tell me that too so I can work on it in the next update.
FOU is my first serious programming project, and honestly, I never thought it would come this far. It started as a small Python CLI because I wanted an easy way to track crypto prices without opening an exchange every time. Slowly, I added live prices, coin validation, saving, and my own backend. And now, with v2.5, I’ve finally turned it into a proper desktop app! FOU now has three themes — FOU DEFAULT, THE FOOL, and VOID , each with its own companion and six different reactions. The hardest part was definitely building the GUI, especially getting the characters, decorative frames, and layouts to work properly when resizing the window. I spent way too much time fixing tiny details 😭 I also tried to work on almost every piece of feedback from my previous ships. A lot of people said my README and devlogs weren’t clear enough, so this time I’ve added better explanations, installation instructions, a full demo video, and more details about how I built everything. 💜 Please read this before testing! ⏳ First-time loading: Adding your first coin or loading saved prices might take around 60 seconds because my free hosted backend sometimes goes to sleep. Please give it a little time! 🛡️ Windows: I’ve tested the released app on two Windows laptops, and it worked fine. However, the executable is still unsigned, so Windows might show a security warning. I’ve already applied for code signing. Please don’t disable your security settings just to test it. 🐧 Linux and macOS: Both builds completed successfully, but I couldn’t test them on real Linux or Mac computers. So please treat them as experimental. If something doesn’t work, I’d really appreciate it if you could watch the demo video before rating, rather than judging FOU only by an untested build. 🐛 Bugs: Some recent tests found a few rare issues with saving and unexpected API responses. I’ve started fixing them, but those fixes aren’t in this release yet. If you find anything, please let me know! 🚀 How to try it Download the ZIP for your OS from the GitHub Release. On Windows, extract everything and open FOU.exe . Try adding BTC, ETH, or SOL, refreshing prices, saving your portfolio, and switching themes. FOU isn’t a wallet or trading app. It’s just a watchlist for coins you’re interested in. Release: https://github.com/FOU-SHREX/FOU/releases/tag/v2.5.0 README + Demo Video: https://github.com/FOU-SHREX/FOU I’m still learning Python, and this project taught me so much about coding, APIs, GUI development, and fixing things that randomly stop working. I also used ChatGPT, and AI image tools to help with coding, debugging, and artwork throughout development. I’m really happy with how far FOU has come, even though it’s still not perfect. Thanks to everyone who gave feedback on my earlier versions and helped me improve it. I hope you enjoy trying FOU! 💜 Please give feedback and good rating <(_ _)>...
|
1792993728.6464317
|
1793080128.6464317
|
|
20935
|
zod by @AhmedKhaledAhmed | Stardance
|
AhmedKhaledAhmed
|
2
|
88.28
|
1014
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-05T17:40:20Z", "hours": 44.0, "multiplier": 13.43, "payout": 593, "blessing": "neutral", "text": "ZodLang is a small, interpreted, dynamically-typed language implemented in Go and inspired by Thorsten Ball’s Writing an Interpreter in Go and Writing a Compiler in Go. It is designed to be small, simple, and easy to use. It is not a general-purpose replacement for Python or Ruby. Instead, it is built for people who want to enjoy programming and learn at the same time. The initial version was a tree-walk interpreter, but now it is a VM. I created the new version Tetris, a 3D cube simulation, and a minimal version of vim. And you can do more.", "repo": "https://github.com/theawakener0/Zod", "demo": "https://github.com/theawakener0/Zod/releases/latest"}, {"ship_num": 2, "ts": "2026-08-27T20:22:35Z", "hours": 36.0, "multiplier": 11.59, "payout": 421, "blessing": "neutral", "text": "Zod is a small, interpreted, dynamic typed language for joyful programming you can build many things from 2D terminal games to tiny ml experiments and more.", "repo": "https://github.com/theawakener0/Zod", "demo": "https://github.com/theawakener0/Zod/releases/latest"}]...
|
[{"post_id": 80179, "ts": "202 [{"post_id": 80179, "ts": "2026-10-16T15:48:10Z", "hours": 8.2819, "text": "DevLog#19 — Currently, I am testing and seeing what I can built using ZodLang. And I built with ZodLang a minimal Codex-like AI harness. It is cool, but needs more work. Stay tuned…."}, {"post_id": 77108, "ts": "2026-10-05T17:28:26Z", "hours": 3.4997, "text": "DevLog#18 — I created a minimal version of vim using ZodLang. Before submitting, I got the idea to recreate a minimal version of vim using ZodLang to show how the language works. I am ready to ship…"}, {"post_id": 76077, "ts": "2026-10-02T08:26:29Z", "hours": 4.8414, "text": "DevLog#17 — I fixed the term library in the stdlib and added raw mode to it (Made it cross-platform). I am currently on version 0.7.0 , and I think I am ready to ship the new version of ZodLang…"}, {"post_id": 75219, "ts": "2026-09-29T14:40:10Z", "hours": 7.1428, "text": "DevLog#16 — I built a 3D cube simulation, and Tetris using ZodLang. Yeah, the language is currently able to build things, Cool things. And this is just the beginning. ZodLang started as a simple toy language and now it is on the road of becoming a full programming language. Thank you all for helping……."}, {"post_id": 73498, "ts": "2026-09-25T07:42:48Z", "hours": 3.7936, "text": "DevLog#15 — I finished the bytecode compiler and vm!!!!!!!!!!!!!!!!!!!!! Also, I have added a full module system to the language, and made the language a bit clean. I will improve the built-ins function and add a full stdlib . Also, the Demo for the current in developing version will be cool….. Wish me luck…"}, {"post_id": 69739, "ts": "2026-09-17T18:04:39Z", "hours": 3.5044, "text": "DevLog#14 — I have added Closures and I can finally said I finished ZodLang bytecode compiler and vm ( I mean that I just finished the core of the language ). The coming DevLogs will be fire……. Stay tuned………"}, {"post_id": 68021, "ts": "2026-09-14T12:08:53Z", "hours": 8.0092, "text": "DevLog#13 — I have added functions and builtins-functions to the bytecode compiler and the vm. Yeah, I spent like a week on this phase, it was hard, but the results of this phase is unlimited. I have completed 70% of the language. I hope ZodLang really turn to be something great. Wish me luck. And stay tuned for the cool things coming."}, {"post_id": 61366, "ts": "2026-09-04T07:35:36Z", "hours": 2.5022, "text": "DevLog#12 — I have added Strings , Arrays , and Hashes to the bytecode compiler and the vm. I thought at first that it would be hard, but turns out it was smooth and easy. Well, not that easy because the Hashes had an issue that I discovered later when I tested the repl, turns out the Hashes doesn’t appear in the repl, but it worked in the tests, so that was weird, but I solved it by keeping track of the order of Hashes . I must continue the bytecode compiler and the vm by adding functions, and built-in functions. Wish me luck……."}, {"post_id": 60792, "ts": "2026-09-03T11:57:16Z", "hours": 1.7017, "text": "DevLog#11 — I have added variables to the bytecode compiler and the vm. Mostly, it was easy, but the assigning char := was a bit tricky to implement in the bytecode compiler and the vm. I made a global environment for setting and getting the values in the variables. I must now focus on implementing / adding strings, arrays, and hashes. Wish me luck……"}, {"post_id": 60112, "ts": "2026-09-02T08:36:53Z", "hours": 1.7417, "text": "DevLog#11 — Finished adding the other comparison expression. I implemented if conditions to the bytecode compiler and the vm. It worked just fine, but It was tense ordering the instructions to make the compiler compile the if condition in a good way. I must now start by adding else-if, and variables. Wish me luck."}, {"post_id": 59450, "ts": "2026-09-01T09:44:41Z", "hours": 2.9603, "text": "DevLog#10 — Finished adding FLOAT_OBJ to the bytecode compiler and vm. Also, supported the operations +, -, *, / . I Implemented BOOLEAN_OBJ and comparison expression in the bytecode compiler and vm too. I will work now on adding more ways in the comparison expression. Also, adding if conditions."}, {"post_id": 58849, "ts": "2026-08-31T13:02:11Z", "hours": 4.44, "text": "DevLog#9 — Currently, Implementing the bytecode compiler and VM. I managed to to finish the initial part of the compiler and the vm. I was able to add integers, it can’t add float and it can’t do any operation other than addition. What I will do now is to add float to compiler so I can add them, and then I will I will add the other operation. I hope this bytecode compiler phase works good, so I can implement the full compiler so Zod could be like Go, Zig, and Rust in the future."}, {"post_id": 55675, "ts": "2026-08-27T17:14:20Z", "hours": 8.3244, "text": "DevLog#8 — Zod is finally here. I finished building the interpreter phase (Yeah, Zod will be a compiled language soon). I added MATRIX_OBJ and that opens ways to build cool things with the language like this demo of Conway’s game of life built in Zod. Cooool!!!!!!! right."}, {"post_id": 41354, "ts": "2026-08-05T14:45:04Z", "hours": 5.5675, "text": "DevLog #7 — I have added hash map in Zod. Also added hash built-in functions like insert() , remove() , contains() , keys() , vals() . NOTE: The hash map is randomized due to Go maps logic."}, {"post_id": 38285, "ts": "2026-07-31T16:25:59Z", "hours": 3.4467, "text": "DevLog #6 — Zod finally has built-in functions, not many, but still good. Zod has len() , println() , printf() , input() , int() , string() , and type() . Also I have added string datatype, for-loop , and a loop {} statement like in Rust. Zod is becoming better day after day and I hope it become a great small language."}, {"post_id": 36622, "ts": "2026-07-28T21:00:05Z", "hours": 4.0358, "text": "DevLog #5 — Zod is finally functional. After I have built the evaluator and added it to the REPL, Zod became a fully function language, Its not a full language, but its still functional. I still have to add more datatypes and built-in functions since it only has integers and boolean , and no built-in function . Zod is becoming a programming language day after day and I think the of its becoming a programming language is near."}, {"post_id": 35237, "ts": "2026-07-26T15:14:47Z", "hours": 3.3225, "text": "DevLog #4 — I have added FunctionLiteral , CallExpressions , and IfExpressions . Also, updated the REPL with the parser. Now, I will start working on the Evaluation."}, {"post_id": 32218, "ts": "2026-07-21T07:51:01Z", "hours": 7.6453, "text": "DevLog #3 –– Today I made significant progress on Zod’s parser. The parser can now handle: Let statements , Assignment statements , Return statements , Infix expressions , Prefix expressions , and Boolean literals . There’s still plenty of work to do, but the parser is taking shape and the language is starting to feel real. My goal with Zod remains the same: to create a programming language that puts learning first while still being capable of building interesting and practical projects."}, {"post_id": 11573, "ts": "2026-06-18T21:13:14Z", "hours": 1.5856, "text": "Finally, I built the repl foundation, but the AST, parser, and eval are still left. Wish me luck…."}, {"post_id": 10682, "ts": "2026-06-17T15:24:19Z", "hours": 2.4353, "text": "Currently, expanding the lexer of zod. I am planning to make zod have mixed syntax between C, Go, and Rust."}]...
|
Title: zod by @AhmedKhaledAhmed | Stardance
Devlo Title: zod by @AhmedKhaledAhmed | Stardance
Devlogs:
Currently, expanding the lexer of zod. I am planning to make zod have mixed syntax between C, Go, and Rust.
Finally, I built the repl foundation, but the AST, parser, and eval are still left. Wish me luck….
DevLog #3 –– Today I made significant progress on Zod’s parser. The parser can now handle: Let statements , Assignment statements , Return statements , Infix expressions , Prefix expressions , and Boolean literals . There’s still plenty of work to do, but the parser is taking shape and the language is starting to feel real. My goal with Zod remains the same: to create a programming language that puts learning first while still being capable of building interesting and practical projects.
DevLog #4 — I have added FunctionLiteral , CallExpressions , and IfExpressions . Also, updated the REPL with the parser. Now, I will start working on the Evaluation.
DevLog #5 — Zod is finally functional. After I have built the evaluator and added it to the REPL, Zod became a fully function language, Its not a full language, but its still functional. I still have to add more datatypes and built-in functions since it only has integers and boolean , and no built-in function . Zod is becoming a programming language day after day and I think the of its becoming a programming language is near.
DevLog #6 — Zod finally has built-in functions, not many, but still good. Zod has len() , println() , printf() , input() , int() , string() , and type() . Also I have added string datatype, for-loop , and a loop {} statement like in Rust. Zod is becoming better day after day and I hope it become a great small language.
DevLog #7 — I have added hash map in Zod. Also added hash built-in functions like insert() , remove() , contains() , keys() , vals() . NOTE: The hash map is randomized due to Go maps logic.
DevLog#8 — Zod is finally here. I finished building the interpreter phase (Yeah, Zod will be a compiled language soon). I added MATRIX_OBJ and that opens ways to build cool things with the language like this demo of Conway’s game of life built in Zod. Cooool!!!!!!! right.
DevLog#9 — Currently, Implementing the bytecode compiler and VM. I managed to to finish the initial part of the compiler and the vm. I was able to add integers, it can’t add float and it can’t do any operation other than addition. What I will do now is to add float to compiler so I can add them, and then I will I will add the other operation. I hope this bytecode compiler phase works good, so I can implement the full compiler so Zod could be like Go, Zig, and Rust in the future.
DevLog#10 — Finished adding FLOAT_OBJ to the bytecode compiler and vm. Also, supported the operations +, -, *, / . I Implemented BOOLEAN_OBJ and comparison expression in the bytecode compiler and vm too. I will work now on adding more ways in the comparison expression. Also, adding if conditions.
DevLog#11 — Finished adding the other comparison expression. I implemented if conditions to the bytecode compiler and the vm. It worked just fine, but It was tense ordering the instructions to make the compiler compile the if condition in a good way. I must now start by adding else-if, and variables. Wish me luck.
DevLog#11 — I have added variables to the bytecode compiler and the vm. Mostly, it was easy, but the assigning char := was a bit tricky to implement in the bytecode compiler and the vm. I made a global environment for setting and getting the values in the variables. I must now focus on implementing / adding strings, arrays, and hashes. Wish me luck……
DevLog#12 — I have added Strings , Arrays , and Hashes to the bytecode compiler and the vm. I thought at first that it would be hard, but turns out it was smooth and easy. Well, not that easy because the Hashes had an issue that I discovered later when I tested the repl, turns out the Hashes doesn’t appear in the repl, but it worked in the tests, so that was weird, but I solved it by keeping track of the order of Hashes . I must continue the bytecode compiler and the vm by adding functions, and built-in functions. Wish me luck…….
DevLog#13 — I have added functions and builtins-functions to the bytecode compiler and the vm. Yeah, I spent like a week on this phase, it was hard, but the results of this phase is unlimited. I have completed 70% of the language. I hope ZodLang really turn to be something great. Wish me luck. And stay tuned for the cool things coming.
DevLog#14 — I have added Closures and I can finally said I finished ZodLang bytecode compiler and vm ( I mean that I just finished the core of the language ). The coming DevLogs will be fire……. Stay tuned………
DevLog#15 — I finished the bytecode compiler and vm!!!!!!!!!!!!!!!!!!!!! Also, I have added a full module system to the language, and made the language a bit clean. I will improve the built-ins function and add a full stdlib . Also, the Demo for the current in developing version will be cool….. Wish me luck…
DevLog#16 — I built a 3D cube simulation, and Tetris using ZodLang. Yeah, the language is currently able to build things, Cool things. And this is just the beginning. ZodLang started as a simple toy language and now it is on the road of becoming a full programming language. Thank you all for helping…….
DevLog#17 — I fixed the term library in the stdlib and added raw mode to it (Made it cross-platform). I am currently on version 0.7.0 , and I think I am ready to ship the new version of ZodLang…
DevLog#18 — I created a minimal version of vim using ZodLang. Before submitting, I got the idea to recreate a minimal version of vim using ZodLang to show how the language works. I am ready to ship…
DevLog#19 — Currently, I am testing and seeing what I can built using ZodLang. And I built with ZodLang a minimal Codex-like AI harness. It is cool, but needs more work. Stay tuned….
Ships:
Zod is a small, interpreted, dynamic typed language for joyful programming you can build many things from 2D terminal games to tiny ml experiments and more.
ZodLang is a small, interpreted, dynamically-typed language implemented in Go and inspired by Thorsten Ball’s Writing an Interpreter in Go and Writing a Compiler in Go. It is designed to be small, simple, and easy to use. It is not a general-purpose replacement for Python or Ruby. Instead, it is built for people who want to enjoy programming and learn at the same time. The initial version was a tree-walk interpreter, but now it is a VM. I created the new version Tetris, a 3D cube simulation, and a minimal version of vim. And you can do more....
|
1792979744.5228577
|
1793066144.5228577
|
|
26001
|
Project Muniris by @shbebeek | Stardance
|
shbebeek
|
1
|
120.2
|
1013
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-18T05:31:47Z", "hours": 119.0, "multiplier": 8.54, "payout": 1013, "blessing": "neutral", "text": "This is my first ever fully finished Unity game, named Muniris! It is a 2-player action adventure game that combines RPG and shooter-based mechanics to make for dynamic and differentiating playstyles for everyone. Each player has a left and right hand that control different purposes: the left hand performs magic attacks/items, and the right hand shoots whatever gun you have equipped. Each player can choose their own loadout and upgrade their items along the way. To check out the project take a look at the README of my GitHub repo, as it contains info on which version you can play depending on your operating system. Enjoy!", "repo": "https://github.com/shbebeek/Muniris", "demo": "https://gamejolt.com/games/muniris-online/1100476"}]...
|
[{"post_id": 72059, "ts": "202 [{"post_id": 72059, "ts": "2026-09-22T03:03:44Z", "hours": 1.2, "text": "Another quick update, I made another build of the game that is includes compatibility with Windows, where the player starts off with a couple of items and a bit farther ahead in the game. I thought that the browser version would work for non-Mac users but I realize now that the servers really can’t run Muniris very well. Thanks for your patience everyone!"}, {"post_id": 69953, "ts": "2026-09-18T03:55:04Z", "hours": 5.1333, "text": "Hi guys, one last quick log. I’ve been working to ship Munirism over the last couple of days and ran into a bunch of computer issues due to itch.io not being able to take files more than 1 gb in size (and my computer kept crashing every time I tried to build the game). Thankfully, I got a working link to play on a browser and a link to the Mac download of the project for people who would like better frame rate optimizations. Since I can’t submit 2 test links, I’ll give the Mac download here: https://gamejolt.com/games/muniris/1100442 . Thanks everyone!"}, {"post_id": 68963, "ts": "2026-09-16T03:50:51Z", "hours": 9.4, "text": "Good evening fellow coders, this is my final devlog for Project Muniris! I added in all of the mechanics that I wanted to into this final portion of the game and it is finally ready to be shipped. To summarize what I did, I made a bite-size castle area where there is a HUGE enemy gauntlet, which contains a final climb to the top of the hourglass that has been tantalizing the player ever since they entered the game. Since the castle is so high up that you can see past the boundary walls, I added a dense fog at the bottom of the castle that respawns you if you fall just in case the player fails any of the challenges. I created one final enemy type, that being an RPG turret, which essentially can shoot tons of missiles that seek out the players. Additionally, the last gun, the sniper rifle, was a fun time to speed develop since I realized that the mouse sensitivity was WAY too high for the player to reliably shoot when the rifle was zoomed in all the way. Due to this observation, I tweaked the mouse sensitivity via scripting so that when the camera is not zoomed in, it has a greater mouse sensitivity than when it is. Furthermore, I finally added a bunch of musical/sound assets into the game! All of the bullets from enemy and player fire have sound effects added to them. Each area also has a unique track to it, making them stand out from one another. While each track may not be musical, I made sure to find a bunch of immersive sound effects to increase the player’s auditory connection with the game. All in all, it feels very bittersweet writing this devlog, as it is the capstone to one of my longest and most passionate projects ever. I’m really thankful to the Stardance team for creating this program, as the community it developed really helped motivate me along the way. Most of all, thank you to you guys as well! Reading your comments and seeing what other people are doing has been really fun the past couple of months. Best of luck everyone!"}, {"post_id": 67858, "ts": "2026-09-14T04:19:41Z", "hours": 6.0667, "text": "Hey everyone, this is probably going to be one of my last devlogs for this project, as it is nearing completion. For starters, I finished the tundra area today, which combined my original idea of 2 separate mountain and “heavy weather” areas. It is a much more open area that the player is free to explore, but requires the double jump and dash to get into. At this point in time, all I really have left to do is create a quick ending area in the form of a castle, where the player will infiltrate the area and get to a giant hourglass at the end marking the finale of the game. I still have to create a new gun for the ending, and I’m leaning towards a sniper rifle. Since the player will have had tons of experience with the right-hand guns for a while, I’m thinking of making the sniper a bit harder to aim but having lots of damage as a tradeoff. Additionally, I added a bunch of snow particles falling from the sky to simulate a snowstorm, and it actually turned out pretty well! Due to occlusion culling, the framerate can actually survive all the snow being generated, and allowed me to create a lot it. Lastly, I added a tiny script that changed the skybox when you enter the area so that it seems cloudy instead of sunny, just so that the snow doesn’t seem like it’s appearing out of nowhere. As a personal anecdote, this project has been really fun to create the past couple of months, and has seriously boosted my design/programming skills (and time management). There will probably be one more devlog before I ship Project Muniris, but in any case I just wanted to share my thoughts on my journey through Stardance here."}, {"post_id": 67111, "ts": "2026-09-13T05:25:35Z", "hours": 8.3, "text": "Hi again fellow devs, over the course of the week I have been working on a bunch of stuff that I am excited to share. First off, I finished up the mine mini dungeon, where the player has to hit switches in order to unlock gates and progress throughout the area. It isn’t the most complex of puzzles but it gets the job done in a 3d platformer/shooter. Secondly, I added in 2 new abilities: the double jump and the dash. Essentially, via giving each player an extra jump whenever they’re in the air, I can enable them to double jump, and when they dash I simply set the non-vertical movement speed very high for a quick moment. I initially had some problems with the dash where it could send you flying upward if you collided with terrain/obstacles, but I mitigated how far up it can send you when you collide with other objects. Past these abilities, I am currently in the middle of a snowfield area, where the players will have to use both of their new movement abilities to traverse the area and make it to their final destination, the castle. I’ve decided to make it so that any currency you collected along the way in the game will be displayed at the end, and you will be able to see both your completion percentage and your total run time. I don’t think the game should take too long to beat, so I’m trying to make it have some replay value along the way. One last thing I forgot to mention was that I spent a bunch of time fixing the jump, since the coyote time would make your jump seem to blast off in the air super high. I know I said I fixed this problem in my past devlogs, but it seemed to keep coming back for whatever reason. Now though, I am happy to say that I fixed the error via taking a deeper look at when the coyote time should reset back to 0.2 seconds (any time above 0 means you can still jump after you fall off a ledge). In total, this game is almost finished, I just have to add 1 more area and give it a thorough run-through!"}, {"post_id": 65758, "ts": "2026-09-11T03:24:26Z", "hours": 5.7667, "text": "Hi developers, I just finished the base layout for the mine system that I am developing as one of the final areas of the game. At this point in time, I am trying to finish the mine area, create a quick mountain area, and make a short castle segment that acts as the final challenge of the game. Since the game is open world, little hints and clues as to where items might be located are scattered around the world now. Additionally, I worked on some post-processing effects for the mine area, which is why it is so dark on the right side of the screen compared to the left side; I will eventually add post-processing for all areas once I finish all the other parts of the game. In terms of item adjustments, I made it so that the chakram has a point light attached to it that can act as a miniature burst of light in dark areas. My last thing for now is a little issue that I ran into while adjusting the lighting for the game. Essentially, I switched from baking lighting back to generating realtime lighting because I realized that my computer can’t really handle baking lighting for so many objects in the scene, so I wanted to just generate it all in realtime to make things easier. After I tweaked these settings and generated the new lighting, I pressed play and the game totally nuked itself. Every game object had broken out of its hierarchy and 75% of them were straight up missing/deleted (all they left behind were empty transforms). I tried for a while to recover the scene but nothing was working, and eventually I had to force quit Unity due to it having stopped responding to my inputs. After I reopened Unity, the scene was back to normal! All in all, lesson learned to not panic when all seems lost and to not upset grumpy old Unity about lighting anymore."}, {"post_id": 64589, "ts": "2026-09-09T03:06:19Z", "hours": 3.2667, "text": "Hello everyone, today I worked on fixing the player UI and coded the chakram left-hand item I’ve been working on. After seeing that at different screen sizes/resolutions the UI would change shape and position, I adjusted the anchors of each UI element and made sure that they looked nice together no matter the screen size. The chakram ability turned out very nice, as with the additional fire/spark fx it feels pretty cool to throw around. I made it so that the chakram will interact with any physics object, meaning that it can bounce around a bunch before returning to the player. Looking ahead to the next area, I am thinking of a maze-like mine segment where the player will get either a new gun or the dash ability. See you all next time!"}, {"post_id": 63978, "ts": "2026-09-08T02:19:27Z", "hours": 8.8, "text": "Hello fellow devs, writing this now I realize that this game has gotten to a pretty large scale and I might not have time to finish everything I wanted to do with this game before I ship it. HOWEVER, I will be working my hardest to make sure that this game still contains the core aspects of what I wanted it to be. Speaking of, I made a whole new “forest hideout” area where there are a lot of enemies and slight platforming challenges. I coded in moving platforms that essentially just move around using an animation, and when the player jumps on one their parent transform is linked to the platform so that the camera doesn’t fall off. Furthermore, I finally added locked doors to the game, so the player has to first find some keys before they can open certain doors in this area. At the end of the hideout, I am working on a chakram left-hand ability that will be able to return to the player after being thrown, acting sort of like a boomerang. During the middle of the development of this area, the framerate dropped like CRAZY and I had to take a whole bunch of time to fix the parameters of the game so that it could run better. To sum up all the changes I made, I added occlusion culling, baked lighting for static objects, and tweaked the rendering distance for terrain like trees and grass. Lastly, I tuned up the player’s jump because it was getting really random jump heights and I wanted to make it more consistent. All in all, this project is going great and I can’t wait to ship it to all of you!"}, {"post_id": 62548, "ts": "2026-09-06T00:11:13Z", "hours": 8.6, "text": "Hey guys, I just finished up the left-hand healing item that I’ve been hinting at in my recent devlogs. It is a magic bottle that will heal you up at the cost of magic. I used a special visual fx in order to make the heal seem more “magical.” I also heavily tweaked the enemy vision system so that the enemies can see the secondary player and choose to aim at them instead of just the primary player. Currently I am trying to fix a problem where the UI will go crazy if you resize the screen, so I will be working on that from now on. Other than that, I also fixed an error where only the secondary player’s health ui would update, leading to both the primary player’s health and game over screen being stuck on the wrong camera. Best of luck everyone!"}, {"post_id": 58491, "ts": "2026-08-30T22:13:10Z", "hours": 6.2667, "text": "Hey everyone, long time since I posted here. Last week I realized that inside of my areas, there are not a lot of rewards given to the player in terms of their stats. So, instead of developing that new left-hand item I talked about in my last devlog, I decided to make an upgrade system where the player can receive health, magic, or stamina upgrades scattered around chests throughout the world. I also added a little series of clues to get the key and the eventual healing item hidden in the lake of this region through visual cues (ex. a heart-shaped rock formation) and text written on the walls of certain shelters. See you guys next time!"}, {"post_id": 53431, "ts": "2026-08-23T23:40:01Z", "hours": 3.7667, "text": "Hi guys! Today I finished up the code and tuning for both the rpg and mech enemy that I have been designing the past couple of days. I added a cool explosion to the gun whenever the bullet collides with an object, which creates some really cool visual effects. However, the bullet will still explode underwater; since I’m thinking of having a feature of being underwater that your guns misfire anyways, I’ll just keep this effect for now. With the new gun item and enemies all finished up, I am excited to say that I am almost done with this lake area. I am proud to say that it is of a much better quality than the tutorial area and is heavily focused on platforming, which will hopefully generate some fun chaos with 2 people playing at the same time. The last thing I have to do with this area is give it a proper “final upgrade.” I’m thinking of it being a healing item you can use with your left hand that takes a lot of magic but slowly heals you up. See you all later!"}, {"post_id": 51974, "ts": "2026-08-21T23:36:52Z", "hours": 3.3, "text": "Hey guys, quick update here. Lately I’ve been working on a heat-seeking missile, and although I encountered a lot of different bugs today I finished the weapon up (kind of). I’m using a software called Linq to filter out enemies and get the closest one to the missile, but a problem I encountered is that the algorithm doesn’t account for colliders between the missile and the enemy. I’ve tried a bunch of stuff such as raycasting and Physics.linecast, but nothing seems to be working. I’m gonna take a break for today and come back tomorrow with a fresh mindset. Other than that, I also am finishing up a “mech” enemy that has different pieces of it you have to destroy in order to kill it. I’ll give a bigger explanation of this enemy when I finish it. Thanks for reading!"}, {"post_id": 51426, "ts": "2026-08-21T03:53:02Z", "hours": 8.7333, "text": "Greetings fellow developers, as of right now I have been furthering development on the lake area of the game right outside the tutorial. Development is progressing well, and I am just about finished with the overall design of the area. On the programming side, I have been working on “heat-seeking” missiles that will be the reward for the player in the form of a new right-handed weapon at the end of the area. I’m thinking of having a key to a chest being hidden at the top of the area and the player has to dive down to the deepest part of the lake to open the chest in order to make the area loop in on itself. If anybody has any ideas for left-handed items let me know!"}, {"post_id": 47900, "ts": "2026-08-16T05:25:50Z", "hours": 4.7, "text": "What’s up everyone, over the last couple of days I’ve been working towards finishing up the lake area. This area is mainly focusing on platforming and refining the platforming that is seen inside of the tutorial area, as I feel as if that area has some janky features. I will eventually add enemies and some mini-bosses to fight while you are jumping from rock to rock, but as said before this is mainly for the spectacle and the platforming. I am thinking about adding some sort of a movement ability at the end of this area to reward the player, but I do not want to overpower the player too much at the beginning of the game. If you have any ideas please comment them down below, they would be well appreciated!"}, {"post_id": 46897, "ts": "2026-08-14T13:19:17Z", "hours": 5.1, "text": "Hey everyone, quick update here. I’m currently in the process of making a beach area to highlight the water effect that I developed over the past couple of days. I added a bunch of different terrain textures and tree assets, so the area itself should look a little different than the typical forest/grassy area of the tutorial. I hope to add some post-processing for outside of the water eventually as well."}, {"post_id": 45235, "ts": "2026-08-11T16:04:46Z", "hours": 8.5333, "text": "Today I finished up a new ladder system and the water post-processing effects, alongside a much-needed tuning of base speeds, maximum velocities, and the different forces added to the player (for example the jumping force). I noticed that in the vertical platforming sections I did not add shortcuts to get back up in case the player fell all the way back down, so I decided to add a ladder system that will extend down when the player reaches a certain spot. Furthermore, with the water system being finished up, I can now focus on making more unique areas of the map and creating engaging gameplay instead of just tutorial and test areas. See you guys soon!"}, {"post_id": 42060, "ts": "2026-08-06T16:50:40Z", "hours": 4.0333, "text": "Hey everyone, it’s been a while. Currently I am trying to implement a water mechanic inside of the game where players can enter the water and swim freely without the effects of gravity. Mechanics are working well to my surprise, and the only thing left to really work on is the post-processing for when you dive in. Unfortunately, I realized that the jump mechanic has to be kind of reworked due to the fact that the player does not have control over their momentum after they jump, making platforming way harder. All in all, development is trucking along."}, {"post_id": 37917, "ts": "2026-07-30T22:28:39Z", "hours": 3.8667, "text": "At this point in time, I finished fixing up the UI system so that the 2 different players are both able to control their separate canvases, while there remains a large canvas that encompasses the entirety of the screen. This can be utilized through the time slower item, for example, as the entire screen is scene through a blue lens when the item is used. Furthermore, I added a house next to a dry lake (at the moment), and will figure out how to add a water mechanic to the game that will require certain items for the players to swim across. Lastly, in order to enter the first eventual “dungeon” of the game, players will need to get the attention of the big dragon in the sky that was added recently. It currently just roams around from point to point but when the players get to a specific point they will need to utilize its positioning."}, {"post_id": 36110, "ts": "2026-07-28T00:09:04Z", "hours": 2.5, "text": "Currently I am working on making a UI system that can fit both players. I have 3 separate canvases all controlled by a main UI Manager script. Basically, there is 1 canvas for each player and then there is 1 canvas that covers both players’ screens."}, {"post_id": 33509, "ts": "2026-07-23T14:54:08Z", "hours": 1.5667, "text": "I just finished integrating the second player’s movement and UI into the game. I made it so that the 2 players share a common magic meter, which is a circular ring in the center of the screen. I try to make the gameplay require cooperation as much as possible via having both players share certain game mechanics such as their magic. With that, I have also finished the enemy tutorial area!"}, {"post_id": 32678, "ts": "2026-07-22T00:03:43Z", "hours": 2.8, "text": "I am currently working on the 2-player functionality of the code for this game. Since some of Unity’s canvas assets are not built for 2-player unless you update them in a certain way, I have to manually go in and update my scripts to make the world objects function as expected. All in all, development is rocky but progressing."}, {"post_id": 31768, "ts": "2026-07-20T12:38:29Z", "hours": 4.4667, "text": "I just finished the chest system as well as the coin system. Taps are the standard currency and joules are a rare currency that can net you cool items that wouldn’t be available normally."}, {"post_id": 23766, "ts": "2026-07-06T21:56:29Z", "hours": 3.5333, "text": "Just finished the enemy code to track down the player and try to shoot the player, it has been a little rough with the balancing but development is going well on the programming side."}]...
|
Title: Project Muniris by @shbebeek | Stardance
D Title: Project Muniris by @shbebeek | Stardance
Devlogs:
Just finished the enemy code to track down the player and try to shoot the player, it has been a little rough with the balancing but development is going well on the programming side.
I just finished the chest system as well as the coin system. Taps are the standard currency and joules are a rare currency that can net you cool items that wouldn’t be available normally.
I am currently working on the 2-player functionality of the code for this game. Since some of Unity’s canvas assets are not built for 2-player unless you update them in a certain way, I have to manually go in and update my scripts to make the world objects function as expected. All in all, development is rocky but progressing.
I just finished integrating the second player’s movement and UI into the game. I made it so that the 2 players share a common magic meter, which is a circular ring in the center of the screen. I try to make the gameplay require cooperation as much as possible via having both players share certain game mechanics such as their magic. With that, I have also finished the enemy tutorial area!
Currently I am working on making a UI system that can fit both players. I have 3 separate canvases all controlled by a main UI Manager script. Basically, there is 1 canvas for each player and then there is 1 canvas that covers both players’ screens.
At this point in time, I finished fixing up the UI system so that the 2 different players are both able to control their separate canvases, while there remains a large canvas that encompasses the entirety of the screen. This can be utilized through the time slower item, for example, as the entire screen is scene through a blue lens when the item is used. Furthermore, I added a house next to a dry lake (at the moment), and will figure out how to add a water mechanic to the game that will require certain items for the players to swim across. Lastly, in order to enter the first eventual “dungeon” of the game, players will need to get the attention of the big dragon in the sky that was added recently. It currently just roams around from point to point but when the players get to a specific point they will need to utilize its positioning.
Hey everyone, it’s been a while. Currently I am trying to implement a water mechanic inside of the game where players can enter the water and swim freely without the effects of gravity. Mechanics are working well to my surprise, and the only thing left to really work on is the post-processing for when you dive in. Unfortunately, I realized that the jump mechanic has to be kind of reworked due to the fact that the player does not have control over their momentum after they jump, making platforming way harder. All in all, development is trucking along.
Today I finished up a new ladder system and the water post-processing effects, alongside a much-needed tuning of base speeds, maximum velocities, and the different forces added to the player (for example the jumping force). I noticed that in the vertical platforming sections I did not add shortcuts to get back up in case the player fell all the way back down, so I decided to add a ladder system that will extend down when the player reaches a certain spot. Furthermore, with the water system being finished up, I can now focus on making more unique areas of the map and creating engaging gameplay instead of just tutorial and test areas. See you guys soon!
Hey everyone, quick update here. I’m currently in the process of making a beach area to highlight the water effect that I developed over the past couple of days. I added a bunch of different terrain textures and tree assets, so the area itself should look a little different than the typical forest/grassy area of the tutorial. I hope to add some post-processing for outside of the water eventually as well.
What’s up everyone, over the last couple of days I’ve been working towards finishing up the lake area. This area is mainly focusing on platforming and refining the platforming that is seen inside of the tutorial area, as I feel as if that area has some janky features. I will eventually add enemies and some mini-bosses to fight while you are jumping from rock to rock, but as said before this is mainly for the spectacle and the platforming. I am thinking about adding some sort of a movement ability at the end of this area to reward the player, but I do not want to overpower the player too much at the beginning of the game. If you have any ideas please comment them down below, they would be well appreciated!
Greetings fellow developers, as of right now I have been furthering development on the lake area of the game right outside the tutorial. Development is progressing well, and I am just about finished with the overall design of the area. On the programming side, I have been working on “heat-seeking” missiles that will be the reward for the player in the form of a new right-handed weapon at the end of the area. I’m thinking of having a key to a chest being hidden at the top of the area and the player has to dive down to the deepest part of the lake to open the chest in order to make the area loop in on itself. If anybody has any ideas for left-handed items let me know!
Hey guys, quick update here. Lately I’ve been working on a heat-seeking missile, and although I encountered a lot of different bugs today I finished the weapon up (kind of). I’m using a software called Linq to filter out enemies and get the closest one to the missile, but a problem I encountered is that the algorithm doesn’t account for colliders between the missile and the enemy. I’ve tried a bunch of stuff such as raycasting and Physics.linecast, but nothing seems to be working. I’m gonna take a break for today and come back tomorrow with a fresh mindset. Other than that, I also am finishing up a “mech” enemy that has different pieces of it you have to destroy in order to kill it. I’ll give a bigger explanation of this enemy when I finish it. Thanks for reading!
Hi guys! Today I finished up the code and tuning for both the rpg and mech enemy that I have been designing the past couple of days. I added a cool explosion to the gun whenever the bullet collides with an object, which creates some really cool visual effects. However, the bullet will still explode underwater; since I’m thinking of having a feature of being underwater that your guns misfire anyways, I’ll just keep this effect for now. With the new gun item and enemies all finished up, I am excited to say that I am almost done with this lake area. I am proud to say that it is of a much better quality than the tutorial area and is heavily focused on platforming, which will hopefully generate some fun chaos with 2 people playing at the same time. The last thing I have to do with this area is give it a proper “final upgrade.” I’m thinking of it being a healing item you can use with your left hand that takes a lot of magic but slowly heals you up. See you all later!
Hey everyone, long time since I posted here. Last week I realized that inside of my areas, there are not a lot of rewards given to the player in terms of their stats. So, instead of developing that new left-hand item I talked about in my last devlog, I decided to make an upgrade system where the player can receive health, magic, or stamina upgrades scattered around chests throughout the world. I also added a little series of clues to get the key and the eventual healing item hidden in the lake of this region through visual cues (ex. a heart-shaped rock formation) and text written on the walls of certain shelters. See you guys next time!
Hey guys, I just finished up the left-hand healing item that I’ve been hinting at in my recent devlogs. It is a magic bottle that will heal you up at the cost of magic. I used a special visual fx in order to make the heal seem more “magical.” I also heavily tweaked the enemy vision system so that the enemies can see the secondary player and choose to aim at them instead of just the primary player. Currently I am trying to fix a problem where the UI will go crazy if you resize the screen, so I will be working on that from now on. Other than that, I also fixed an error where only the secondary player’s health ui would update, leading to both the primary player’s health and game over screen being stuck on the wrong camera. Best of luck everyone!
Hello fellow devs, writing this now I realize that this game has gotten to a pretty large scale and I might not have time to finish everything I wanted to do with this game before I ship it. HOWEVER, I will be working my hardest to make sure that this game still contains the core aspects of what I wanted it to be. Speaking of, I made a whole new “forest hideout” area where there are a lot of enemies and slight platforming challenges. I coded in moving platforms that essentially just move around using an animation, and when the player jumps on one their parent transform is linked to the platform so that the camera doesn’t fall off. Furthermore, I finally added locked doors to the game, so the player has to first find some keys before they can open certain doors in this area. At the end of the hideout, I am working on a chakram left-hand ability that will be able to return to the player after being thrown, acting sort of like a boomerang. During the middle of the development of this area, the framerate dropped like CRAZY and I had to take a whole bunch of time to fix the parameters of the game so that it could run better. To sum up all the changes I made, I added occlusion culling, baked lighting for static objects, and tweaked the rendering distance for terrain like trees and grass. Lastly, I tuned up the player’s jump because it was getting really random jump heights and I wanted to make it more consistent. All in all, this project is going great and I can’t wait to ship it to all of you!
Hello everyone, today I worked on fixing the player UI and coded the chakram left-hand item I’ve been working on. After seeing that at different screen sizes/resolutions the UI would change shape and position, I adjusted the anchors of each UI element and made sure that they looked nice together no matter the screen size. The chakram ability turned out very nice, as with the additional fire/spark fx it feels pretty cool to throw around. I made it so that the chakram will interact with any physics object, meaning that it can bounce around a bunch before returning to the player. Looking ahead to the next area, I am thinking of a maze-like mine segment where the player will get either a new gun or the dash ability. See you all next time!
Hi developers, I just finished the base layout for the mine system that I am developing as one of the final areas of the game. At this point in time, I am trying to finish the mine area, create a quick mountain area, and make a short castle segment that acts as the final challenge of the game. Since the game is open world, little hints and clues as to where items might be located are scattered around the world now. Additionally, I worked on some post-processing effects for the mine area, which is why it is so dark on the right side of the screen compared to the left side; I will eventually add post-processing for all areas once I finish all the other parts of the game. In terms of item adjustments, I made it so that the chakram has a point light attached to it that can act as a miniature burst of light in dark areas. My last thing for now is a little issue that I ran into while adjusting the lighting for the game. Essentially, I switched from baking lighting back to generating realtime lighting because I realized that my computer can’t really handle baking lighting for so many objects in the scene, so I wanted to just generate it all in realtime to make things easier. After I tweaked these settings and generated the new lighting, I pressed play and the game totally nuked itself. Every game object had broken out of its hierarchy and 75% of them were straight up missing/deleted (all they left behind were empty transforms). I tried for a while to recover the scene but nothing was working, and eventually I had to force quit Unity due to it having stopped responding to my inputs. After I reopened Unity, the scene was back to normal! All in all, lesson learned to not panic when all seems lost and to not upset grumpy old Unity about lighting anymore.
Hi again fellow devs, over the course of the week I have been working on a bunch of stuff that I am excited to share. First off, I finished up the mine mini dungeon, where the player has to hit switches in order to unlock gates and progress throughout the area. It isn’t the most complex of puzzles but it gets the job done in a 3d platformer/shooter. Secondly, I added in 2 new abilities: the double jump and the dash. Essentially, via giving each player an extra jump whenever they’re in the air, I can enable them to double jump, and when they dash I simply set the non-vertical movement speed very high for a quick moment. I initially had some problems with the dash where it could send you flying upward if you collided with terrain/obstacles, but I mitigated how far up it can send you when you collide with other objects. Past these abilities, I am currently in the middle of a snowfield area, where the players will have to use both of their new movement abilities to traverse the area and make it to their final destination, the castle. I’ve decided to make it so that any currency you collected along the way in the game will be displayed at the end, and you will be able to see both your completion percentage and your total run time. I don’t think the game should take too long to beat, so I’m trying to make it have some replay value along the way. One last thing I forgot to mention was that I spent a bunch of time fixing the jump, since the coyote time would make your jump seem to blast off in the air super high. I know I said I fixed this problem in my past devlogs, but it seemed to keep coming back for whatever reason. Now though, I am happy to say that I fixed the error via taking a deeper look at when the coyote time should reset back to 0.2 seconds (any time above 0 means you can still jump after you fall off a ledge). In total, this game is almost finished, I just have to add 1 more area and give it a thorough run-through!
Hey everyone, this is probably going to be one of my last devlogs for this project, as it is nearing completion. For starters, I finished the tundra area today, which combined my original idea of 2 separate mountain and “heavy weather” areas. It is a much more open area that the player is free to explore, but requires the double jump and dash to get into. At this point in time, all I really have left to do is create a quick ending area in the form of a castle, where the player will infiltrate the area and get to a giant hourglass at the end marking the finale of the game. I still have to create a new gun for the ending, and I’m leaning towards a sniper rifle. Since the player will have had tons of experience with the right-hand guns for a while, I’m thinking of making the sniper a bit harder to aim but having lots of damage as a tradeoff. Additionally, I added a bunch of snow particles falling from the sky to simulate a snowstorm, and it actually turned out pretty well! Due to occlusion culling, the framerate can actually survive all the snow being generated, and allowed me to create a lot it. Lastly, I added a tiny script that changed the skybox when you enter the area so that it seems cloudy instead of sunny, just so that the snow doesn’t seem like it’s appearing out of nowhere. As a personal anecdote, this project has been really fun to create the past couple of months, and has seriously boosted my design/programming skills (and time management). There will probably be one more devlog before I ship Project Muniris, but in any case I just wanted to share my thoughts on my journey through Stardance here.
Good evening fellow coders, this is my final devlog for Project Muniris! I added in all of the mechanics that I wanted to into this final portion of the game and it is finally ready to be shipped. To summarize what I did, I made a bite-size castle area where there is a HUGE enemy gauntlet, which contains a final climb to the top of the hourglass that has been tantalizing the player ever since they entered the game. Since the castle is so high up that you can see past the boundary walls, I added a dense fog at the bottom of the castle that respawns you if you fall just in case the player fails any of the challenges. I created one final enemy type, that being an RPG turret, which essentially can shoot tons of missiles that seek out the players. Additionally, the last gun, the sniper rifle, was a fun time to speed develop since I realized that the mouse sensitivity was WAY too high for the player to reliably shoot when the rifle was zoomed in all the way. Due to this observation, I tweaked the mouse sensitivity via scripting so that when the camera is not zoomed in, it has a greater mouse sensitivity than when it is. Furthermore, I finally added a bunch of musical/sound assets into the game! All of the bullets from enemy and player fire have sound effects added to them. Each area also has a unique track to it, making them stand out from one another. While each track may not be musical, I made sure to find a bunch of immersive sound effects to increase the player’s auditory connection with the game. All in all, it feels very bittersweet writing this devlog, as it is the capstone to one of my longest and most passionate projects ever. I’m really thankful to the Stardance team for creating this program, as the community it developed really helped motivate me along the way. Most of all, thank you to you guys as well! Reading your comments and seeing what other people are doing has been really fun the past couple of months. Best of luck everyone!
Hi guys, one last quick log. I’ve been working to ship Munirism over the last couple of days and ran into a bunch of computer issues due to itch.io not being able to take files more than 1 gb in size (and my computer kept crashing every time I tried to build the game). Thankfully, I got a working link to play on a browser and a link to the Mac download of the project for people who would like better frame rate optimizations. Since I can’t submit 2 test links, I’ll give the Mac download here: https://gamejolt.com/games/muniris/1100442 . Thanks everyone!
Another quick update, I made another build of the game that is includes compatibility with Windows, where the player starts off with a couple of items and a bit farther ahead in the game. I thought that the browser version would work for non-Mac users but I realize now that the servers really can’t run Muniris very well. Thanks for your patience everyone!
Ships:
This is my first ever fully finished Unity game, named Muniris! It is a 2-player action adventure game that combines RPG and shooter-based mechanics to make for dynamic and differentiating playstyles for everyone. Each player has a left and right hand that control different purposes: the left hand performs magic attacks/items, and the right hand shoots whatever gun you have equipped. Each player can choose their own loadout and upgrade their items along the way. To check out the project take a look at the README of my GitHub repo, as it contains info on which version you can play depending on your operating system. Enjoy!...
|
1792856977.6275198
|
1792943377.6275198
|
|
57952
|
CodeWare by @tyleruploads | Stardance
|
tyleruploads
|
1
|
51.0
|
1013
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-06T21:03:58Z", "hours": 51.0, "multiplier": 16.45, "payout": 1013, "blessing": "neutral", "text": "I created CodeWare, a WarioWare-style video game where you have to complete various minigames, written in Godot. I originally had it under the WarioWare game mission, but I eventually decided I should detach it from it due to the sheer complexity of this game, which is way above the beginner mission. In the game, players are put through what is currently 12 minigames. Each minigame has a strict timer limit, whether it be losing a life or progressing to the next minigame once it strikes 0. In case you are confused, the way they win a life at the end is if the purpose of the minigame is to survive a certain amount of time against computer-generated obstacles, like arrows or orbs (essentially meteors). The very interesting thing about this game is the two endings: the ending you get when you complete all the minigames with lives to spare, and the one when you lose all of your five lives. These endings, which I will not explain in detail (so it is not spoiled for you!), highlight the eternity of automatically generated code files. The opening scene of the game is the Tyleruploads Mountain Range, which shows many mountains connected via bridges. The suspension for those bridges is the game’s logo turned into a bunch of small links. Metaphysically, the game’s goal is to cross these bridges. Many parts of this project were extremely challenging for me. For one, I had never set foot in Godot at all before embarking on this project. I was also a complete newcomer to any sort of game development. I encountered many errors caused by my being just introduced to GDScript and game development, such as not knowing that scripts continue after changing the scene, the absence of a deferred call causing the game to go completely grey, losing a lot of work in video editing software while making the gameplay trailer video, and many more small and large things. In every ship message for prior Stardance projects, I have said something like “Wow! Before I started, I really didn’t think I could do something this complex. I really just transformed my coding abilities.” But this time, I am not going to repeat that basic fib without any supporting arguments. My previous Stardance projects were nowhere near this length. So, I would like to make a new claim now. That claim is that while I have not become a completely new developer or graphic designer or anything, I have dipped into a new path of development that I will have the choice to either continue to pursue or to reap the benefits of the mindset associated with it as I enter high school. For these reasons, along with the fact that I was able to sit down and write quality code for one project for 51 hours, I am very proud of myself. My viewpoint of “sit down and make a decent project and leave it” has been greatly diminished outside of specific contexts.", "repo": "https://github.com/tyleruploads/code-ware", "demo": "https://tyleruploads.itch.io/codeware"}]...
|
[{"post_id": 77174, "ts": "202 [{"post_id": 77174, "ts": "2026-10-05T22:22:21Z", "hours": 1.2811, "text": "This marks v1.0.0! This is my FINAL devlog for CodeWare (at least the first ship)! It has really been a great project that has significantly pushed what I think about my development capabilities. But I will explain that more in the ship message! The main change made over the time of this devlog was a complete revamp of the README! Here is a summary of the changes made to it: The following shields have been added: Play on GitHub Pages, Made with Godot, GitHub Release (version number), and GitHub Commit Activity The hero image near the top of the README, depicting the title screen, has been replaced with a gameplay video for the game, with a hero of minigame 6 (Unintelligent Arrows) The minigames section has been moved to near the bottom of the README to make the start of the README a better hook. And the minigame descriptions and hero images inside the section have been put inside a spoiler notice, so the game can not be easily spoiled for players. And the hero images in the minigame section have been converted from Markdown tags to HTML tags in order to enforce a specific width."}, {"post_id": 76860, "ts": "2026-10-04T21:10:06Z", "hours": 2.3425, "text": "This will be one of my very last devlogs before I ship CodeWare! I just created the gameplay trailer, which is a huge accomplishment! This is my first time making any sort of video for anything I make in the computer world, and I think it actually turned out very well! The video shows potential players what the game will look like and gives a glimpse of its unexpected win-and-lose endings. I also put the video on the game’s Itch.io page, which will be made public very soon. You can view the video on YouTube here: CodeWare - Official Gameplay Video"}, {"post_id": 75987, "ts": "2026-10-01T21:19:32Z", "hours": 0.7008, "text": "I just created the twelfth mingame of CodeWare, “Catch the Falling Orbs!” In it, you have 45 seconds to catch 35 falling orbs by moving left and right with your keyboard."}, {"post_id": 75387, "ts": "2026-09-29T22:05:18Z", "hours": 1.7511, "text": "In the Newspaper department at my summer sleepaway camp this year, they always said, “If the number is less than 11, spell it out.” CodeWare has officially surpassed this guideline in the number of its minigames. Minigame 11 of CodeWare is titled “Type the Strings,” and players must type 15 five-character strings provided to them in less than one minute. The string is generated from a pool of characters with lookalikes (i.e., Z and 2, S and 5, O and 0, I and l, etc.) removed to ensure it is completely fair for the user. This was definitely one of the easier minigames to code, but it wasn’t the easiest thing ever. I still ran into some issues, like the vertical alignment of a RichTextLabel being a bit too low when dynamically updating its content in GDScript to show a custom notice to the user (I fixed it by changing it to a normal Label, after troubleshooting for way too long)."}, {"post_id": 74691, "ts": "2026-09-28T00:28:50Z", "hours": 3.545, "text": "I just did a lot of asset updating and linting! The part I think would be most interesting to you is obviously the asset updates. I changed the assets in Minigame 1, 3, 4, and 9! I also updated the gallery, accessible in the extras menu, to include new assets I’ve forgotten to put in there for a while now. I’ll just show you how minigame one looks now; no need for a detailed explanation of everything. Now, I have to address the boring part, which took most of the three and a half hours. That would be linting! It’s pretty self-explanatory: I went through and made the scenes and scripts adhere to style guidelines."}, {"post_id": 74561, "ts": "2026-09-27T17:10:27Z", "hours": 2.3617, "text": "I just made the tenth minigame for CodeWare! It is named “RGB Skills.” In the minigame, there are two colors: one generated automatically by the code, and one controlled by manual RGB Sliders. It validates the user’s guess using the GDScript method Vector3.distance_to() . The method uses the 3D Pythagorean theorem to calculate the Euclidean Distance between the RGB values, as if they were plotted in a 3D space. This works because the red value represents the x-axis, the green value represents the y-axis, and the blue value represents the z-axis on a 3D graph. This was very interesting for me to discover, since I only learned the 2D Pythagorean theorem last year (in seventh grade). The game also starts the sliders at the furthest possible points from the target color, which makes the minigame harder. If the player clicks the submit button without making any changes, they will not pass. And yes, I know they could easily invert the colors to find the right one. The only thing is, they probably didn’t read this devlog. So, they’ll have no clue of the fact the sliders were placed at the inversion of the target color."}, {"post_id": 74200, "ts": "2026-09-26T22:13:25Z", "hours": 2.3222, "text": "I just made the ninth minigame for CodeWare, “The Maze!” In the minigame, the user needs to get to the center of the maze in less than 18 seconds! They move a mini tyleruploads texture with arrow keys and WASD to eventually get to the bigger one in the middle! I had a lot of trouble with physics here, hence the 2 hours! And, I’ve never made any sort of maze before, so this is a first!"}, {"post_id": 74111, "ts": "2026-09-26T18:21:01Z", "hours": 1.9775, "text": "I just made version v0.14.0 of CodeWare! In this version, I added the eighth minigame, “Choose the Boxes!” The user has 30 seconds to choose 20 boxes by clicking on the one matching the color of the center box. I also went through and removed unnecessary log statements and unused variables."}, {"post_id": 72912, "ts": "2026-09-24T00:48:33Z", "hours": 2.9286, "text": "I just released version v0.13.0 of CodeWare! In this version, I have completely changed the sound environment of the game! I will explain it with two basic pseudocode (or Python) logic statements! prev_sound = sound in v0.12.0 curr_sound = sound in v0.13.0 print(prev_sound, curr_sound) # False, True What I’m trying to illustrate here is that there was absolutely no sound before, and now there is! There is a background ticking noise playing (forever) through an autoload and sound effects corresponding to in-minigame events. Feel free to test it at https://tyleruploads.itch.io/codeware?secret=CDZUB2MTxYCmNQ70VRagItDLSTg ! Send any feedback in the comments!"}, {"post_id": 71345, "ts": "2026-09-20T17:48:01Z", "hours": 0.7083, "text": "I just made two new assets for CodeWare! They are the players in minigames 4 and 6. Here is a photo of one of them."}, {"post_id": 70807, "ts": "2026-09-19T19:51:11Z", "hours": 0.8956, "text": "After receiving feedback from the Hack Club community, I have made these changes to CodeWare. The icon has been updated to increase contrast and to look better at small resolutions Minigame 6, “Unintelligent Arrows,” has been balanced to be easier for users to complete WASD Movement has been added to all games Support for held jumps has been added to the first minigame, “Orb Collection Platformer” An ambiguity in the README about the objective has been corrected"}, {"post_id": 70237, "ts": "2026-09-18T19:29:20Z", "hours": 0.94, "text": "I just balanced minigame 6, “Unintelligent Arrows,” after feedback from Hack Club members. I made users have more time to react before getting hit by the arrows. I have not released this update yet; once I apply some other suggestions from the community, I will release it as v0.11.0."}, {"post_id": 69877, "ts": "2026-09-17T23:54:31Z", "hours": 2.5408, "text": "I just created the sixth minigame, “Unintelligent Arrows,” in CodeWare! In the minigame, users have to dodge countless arrows that are described as unintelligent purely based on their inability to change paths once shot. If you weren’t already guessing, I am planning on making an intelligent-arrow-themed minigame in the future, possibly inspired by 1948 in some ways. This game is actually getting nice and long, way longer than I thought it would be at the start. When I shared it with people a while ago, it was very short. Now, it’s decently long! Once I add a lot more minigames, I will consider making them go in random order and giving them difficulty tags to determine when they should be shown."}, {"post_id": 69387, "ts": "2026-09-16T23:12:21Z", "hours": 1.0319, "text": "I just completely refactored, everything! I made many new directories in order to organize the entire repository much better! This took an hour because of the debugging and other related changes to the code associated with a complete structural refactor. It definitely was not a calm, easy hour."}, {"post_id": 69337, "ts": "2026-09-16T20:42:37Z", "hours": 2.45, "text": "I just added two minigames to CodeWare! The first minigame I just added, minigame 4, titled “Dodge the Flying Balls,” has users dodge flying balls (referred to as meteors in the code) for 45 seconds. Each hit takes away 10% of the user’s health. It can actually be pretty hard. A good strategy to stay alive is moving from side to side and never stopping, because there are really fast ones that come before you can even react. The second minigame I just added, minigame 5, titled “Click Very Fast,” has the user click on a big circular button in the middle 100 times in less than 20 seconds. I have tested it many times, and it is just the right time (at least for now). You can play the game at https://tyleruploads.github.io/code-ware/"}, {"post_id": 68302, "ts": "2026-09-14T21:48:29Z", "hours": 0.3142, "text": "This is a short one! I just integrated it with the Itch.io Butler API, so it will automatically update its Itch.io game whenever I make a new release! Currently, it is a draft on Itch.io. You can view the draft at https://tyleruploads.itch.io/codeware?secret=CDZUB2MTxYCmNQ70VRagItDLSTg . Sometime before I ship, I will make the Itch.io page public, which may bring in some players."}, {"post_id": 67752, "ts": "2026-09-14T00:02:19Z", "hours": 0.4536, "text": "I just put CodeWare on GitHub pages! You can view it at https://tyleruploads.github.io/code-ware/ ! I also upped the time for a minigame after a web playtest determined the amount of time given was not enough to complete the task at hand."}, {"post_id": 66971, "ts": "2026-09-12T23:32:31Z", "hours": 1.4353, "text": "I just added the third minigame to CodeWare! It is titled “Hit the Circles.” In the minigame, you start with a balance of -15, and each circle you hit, you get +1 balance! It is kindove like Whack-a-Mole (don’t sue me Mattel.) This marks version 0.6.0 of the game!"}, {"post_id": 66187, "ts": "2026-09-11T21:03:31Z", "hours": 1.0183, "text": "I just made some nice changes to CodeWare! I added pause, unpause, and reset functionality. This was in the README as coming soon for a while. I relocated script locations and removed ambiguity from a script named ‘self_timer.gd’ by renaming it ‘minigame_1_timer.gd,’ which makes it not look wrong when next to ‘minigame_2_timer.gd.’ And, I added the version number to the title menu!"}, {"post_id": 65647, "ts": "2026-09-10T22:37:05Z", "hours": 8.2886, "text": "Wow! 8 hours is a lot of time! Here’s what I did! Create all new assets. I made a new icon and background for the title screen and both minigames. The icon features an infinity symbol cut in half but connected with the parts in between them in a bit of a 3D-like arrangement, symbolizing two sides of eternity connected by small paths. The first minigame background and the title scene background contain a mountain range, a sunset, and one or multiple bridges. The second minigame background is two eyes in many perfectly aligned rectangles. Make death scene. Previously, I only had a win screen in the game (a very anticlimactic one at best, in a purposeful way). Now, I added a death scene too! The death scene links with the idea of the two sides of eternity (or infinity) connected by a small path because the user is showed specific text by automatic vertical scrolling, then they click a button to get thrown right back to the first minigame, as if nothing happened. They can do this as many times as they want; the bridges between the two halves of eternity represented by infinity are very strong, the same bridges connecting the mountains. Replace unused settings button with extras. The main menu used to contain a button labeled “Settings,” which would take the user to a blank scene with no way to get back. It has now been replaced with an “Extras” button, which contains an Asset Gallery that allows users to look at the beautiful game assets and obviously, a credits section. Universal back buttons. Now, users can always get back to some point in the game (including the title screen), even if they are in the infinite end scene."}, {"post_id": 63976, "ts": "2026-09-08T02:12:04Z", "hours": 2.1261, "text": "I JUST MADE THE END SCENE! It is very complex. But, I can’t spoil it! Here’s the code. It’s your choice to go line by line and spoil it for yourself."}, {"post_id": 63904, "ts": "2026-09-07T22:50:03Z", "hours": 0.75, "text": "Well, that was very silly. I spent 45 minutes adding automatic cross-compilation via GitHub actions! The main issue was: macOS! I now officially hate macOS. I essentially spent 12 commits trying to fix macOS, and 1 commit removing macOS. The commits mentioning Windows or Linux? They were never the issue. It was only macOS. Heres my commit history for this devlog: Add basic src/export_presets.cfg 1 file changed, 431 insertions(+) Make publishing workflow to compile 1 file changed, 66 insertions(+) Fix Linux export in export_presets.cfg to work with workflow 1 file changed, 2 insertions(+), 2 deletions(-) Set project directory in workflow 1 file changed, 4 insertions(+), 4 deletions(-) Remove export_path for windows in export_presents.cfg to fix CI/CD 1 file changed, 1 insertion(+), 1 deletion(-) Hopefully fixes CI/CD 1 file changed, 6 insertions(+), 9 deletions(-) Make macOS only support x86_64 to fix CI/CD issue 1 file changed, 2 insertions(+), 2 deletions(-) Add bundle identifier for macOS (why does it have to be such a pain?) 1 file changed, 2 insertions(+), 2 deletions(-) The mac strikes back: import ETC2 ASTC compession for macOS 1 file changed, 1 insertion(+) Add initial project import step to CI/CD 1 file changed, 4 insertions(+) Cd into src before initializing godot 2 files changed, 2 insertions(+), 1 deletion(-) Remove cding into src and add export_templates_path 1 file changed, 5 insertions(+), 1 deletion(-) The mac struck back yet again: emancipated 1 file changed, 1 insertion(+), 4 deletions(-) I rebased it to “Add support for every OS; remove support for macOS (it struck back, like starwars)”"}, {"post_id": 63853, "ts": "2026-09-07T20:42:56Z", "hours": 2.5025, "text": "This is going to be my second to last devlog before I ship, assuming everything goes well! In these two and a half hours, I did SO MANY THINGS! The most obvious change has to be how I added the second minigame, the clicker! In the minigame, you have 12 seconds to collect 18 tyleruploads circles! Each circle is randomly placed on the screen, which makes it so you can’t just memorize it! I also added a license to the project. It contains five sections for different types of content. And, I updated the SECURITY.md so it is completed. Another nice thing I added is action and description messages before each minigame. It tells the player what to do, so they aren’t losing any time when it starts! I also fixed the text it shows you when you win, before it takes you to the win screen I am going to make soon. I also revamped the README! It is way better now! Check out the README on GitHub if you want! I also set up and configured GitHub Discussions!"}, {"post_id": 62147, "ts": "2026-09-05T12:25:32Z", "hours": 0.2619, "text": "I just did some play testing, added some comments, and made a basic README! Nothing much!"}, {"post_id": 61866, "ts": "2026-09-05T00:12:04Z", "hours": 6.3597, "text": "I just created the basic blueprint for my very own WarioWare style video game, CodeWare! In CodeWare, you are playing as GitHub, and for the first minigame, you are trying to capture 7 of me (that’s just a nice image I had available—I might consider changing it later). The time constraints are actually pretty balanced, you’ll generally finish right in the nick of time. There is still a lot more remaining. The reason there was so much time in this devlog is because of error correction. This is my first time using Godot—everything’s not meant to be correct the first time around. A lot of the error correction was silly stuff like scaling, timer pixelation, text getting cropped off (without me knowing), and etc. You jump on those little box thingeys to get to the mini-mes in order to collect. In order to get to the one near the big wall barrier, you need to make a big jump from one near it (NOT TO THE RIGHT!!). And, once you go to get the last ones on the very right, there’s no coming out! Hopefully, you got the other ones first!"}]...
|
Title: CodeWare by @tyleruploads | Stardance
Devl Title: CodeWare by @tyleruploads | Stardance
Devlogs:
I just created the basic blueprint for my very own WarioWare style video game, CodeWare! In CodeWare, you are playing as GitHub, and for the first minigame, you are trying to capture 7 of me (that’s just a nice image I had available—I might consider changing it later). The time constraints are actually pretty balanced, you’ll generally finish right in the nick of time. There is still a lot more remaining. The reason there was so much time in this devlog is because of error correction. This is my first time using Godot—everything’s not meant to be correct the first time around. A lot of the error correction was silly stuff like scaling, timer pixelation, text getting cropped off (without me knowing), and etc. You jump on those little box thingeys to get to the mini-mes in order to collect. In order to get to the one near the big wall barrier, you need to make a big jump from one near it (NOT TO THE RIGHT!!). And, once you go to get the last ones on the very right, there’s no coming out! Hopefully, you got the other ones first!
I just did some play testing, added some comments, and made a basic README! Nothing much!
This is going to be my second to last devlog before I ship, assuming everything goes well! In these two and a half hours, I did SO MANY THINGS! The most obvious change has to be how I added the second minigame, the clicker! In the minigame, you have 12 seconds to collect 18 tyleruploads circles! Each circle is randomly placed on the screen, which makes it so you can’t just memorize it! I also added a license to the project. It contains five sections for different types of content. And, I updated the SECURITY.md so it is completed. Another nice thing I added is action and description messages before each minigame. It tells the player what to do, so they aren’t losing any time when it starts! I also fixed the text it shows you when you win, before it takes you to the win screen I am going to make soon. I also revamped the README! It is way better now! Check out the README on GitHub if you want! I also set up and configured GitHub Discussions!
Well, that was very silly. I spent 45 minutes adding automatic cross-compilation via GitHub actions! The main issue was: macOS! I now officially hate macOS. I essentially spent 12 commits trying to fix macOS, and 1 commit removing macOS. The commits mentioning Windows or Linux? They were never the issue. It was only macOS. Heres my commit history for this devlog: Add basic src/export_presets.cfg 1 file changed, 431 insertions(+) Make publishing workflow to compile 1 file changed, 66 insertions(+) Fix Linux export in export_presets.cfg to work with workflow 1 file changed, 2 insertions(+), 2 deletions(-) Set project directory in workflow 1 file changed, 4 insertions(+), 4 deletions(-) Remove export_path for windows in export_presents.cfg to fix CI/CD 1 file changed, 1 insertion(+), 1 deletion(-) Hopefully fixes CI/CD 1 file changed, 6 insertions(+), 9 deletions(-) Make macOS only support x86_64 to fix CI/CD issue 1 file changed, 2 insertions(+), 2 deletions(-) Add bundle identifier for macOS (why does it have to be such a pain?) 1 file changed, 2 insertions(+), 2 deletions(-) The mac strikes back: import ETC2 ASTC compession for macOS 1 file changed, 1 insertion(+) Add initial project import step to CI/CD 1 file changed, 4 insertions(+) Cd into src before initializing godot 2 files changed, 2 insertions(+), 1 deletion(-) Remove cding into src and add export_templates_path 1 file changed, 5 insertions(+), 1 deletion(-) The mac struck back yet again: emancipated 1 file changed, 1 insertion(+), 4 deletions(-) I rebased it to “Add support for every OS; remove support for macOS (it struck back, like starwars)”
I JUST MADE THE END SCENE! It is very complex. But, I can’t spoil it! Here’s the code. It’s your choice to go line by line and spoil it for yourself.
Wow! 8 hours is a lot of time! Here’s what I did! Create all new assets. I made a new icon and background for the title screen and both minigames. The icon features an infinity symbol cut in half but connected with the parts in between them in a bit of a 3D-like arrangement, symbolizing two sides of eternity connected by small paths. The first minigame background and the title scene background contain a mountain range, a sunset, and one or multiple bridges. The second minigame background is two eyes in many perfectly aligned rectangles. Make death scene. Previously, I only had a win screen in the game (a very anticlimactic one at best, in a purposeful way). Now, I added a death scene too! The death scene links with the idea of the two sides of eternity (or infinity) connected by a small path because the user is showed specific text by automatic vertical scrolling, then they click a button to get thrown right back to the first minigame, as if nothing happened. They can do this as many times as they want; the bridges between the two halves of eternity represented by infinity are very strong, the same bridges connecting the mountains. Replace unused settings button with extras. The main menu used to contain a button labeled “Settings,” which would take the user to a blank scene with no way to get back. It has now been replaced with an “Extras” button, which contains an Asset Gallery that allows users to look at the beautiful game assets and obviously, a credits section. Universal back buttons. Now, users can always get back to some point in the game (including the title screen), even if they are in the infinite end scene.
I just made some nice changes to CodeWare! I added pause, unpause, and reset functionality. This was in the README as coming soon for a while. I relocated script locations and removed ambiguity from a script named ‘self_timer.gd’ by renaming it ‘minigame_1_timer.gd,’ which makes it not look wrong when next to ‘minigame_2_timer.gd.’ And, I added the version number to the title menu!
I just added the third minigame to CodeWare! It is titled “Hit the Circles.” In the minigame, you start with a balance of -15, and each circle you hit, you get +1 balance! It is kindove like Whack-a-Mole (don’t sue me Mattel.) This marks version 0.6.0 of the game!
I just put CodeWare on GitHub pages! You can view it at https://tyleruploads.github.io/code-ware/ ! I also upped the time for a minigame after a web playtest determined the amount of time given was not enough to complete the task at hand.
This is a short one! I just integrated it with the Itch.io Butler API, so it will automatically update its Itch.io game whenever I make a new release! Currently, it is a draft on Itch.io. You can view the draft at https://tyleruploads.itch.io/codeware?secret=CDZUB2MTxYCmNQ70VRagItDLSTg . Sometime before I ship, I will make the Itch.io page public, which may bring in some players.
I just added two minigames to CodeWare! The first minigame I just added, minigame 4, titled “Dodge the Flying Balls,” has users dodge flying balls (referred to as meteors in the code) for 45 seconds. Each hit takes away 10% of the user’s health. It can actually be pretty hard. A good strategy to stay alive is moving from side to side and never stopping, because there are really fast ones that come before you can even react. The second minigame I just added, minigame 5, titled “Click Very Fast,” has the user click on a big circular button in the middle 100 times in less than 20 seconds. I have tested it many times, and it is just the right time (at least for now). You can play the game at https://tyleruploads.github.io/code-ware/
I just completely refactored, everything! I made many new directories in order to organize the entire repository much better! This took an hour because of the debugging and other related changes to the code associated with a complete structural refactor. It definitely was not a calm, easy hour.
I just created the sixth minigame, “Unintelligent Arrows,” in CodeWare! In the minigame, users have to dodge countless arrows that are described as unintelligent purely based on their inability to change paths once shot. If you weren’t already guessing, I am planning on making an intelligent-arrow-themed minigame in the future, possibly inspired by 1948 in some ways. This game is actually getting nice and long, way longer than I thought it would be at the start. When I shared it with people a while ago, it was very short. Now, it’s decently long! Once I add a lot more minigames, I will consider making them go in random order and giving them difficulty tags to determine when they should be shown.
I just balanced minigame 6, “Unintelligent Arrows,” after feedback from Hack Club members. I made users have more time to react before getting hit by the arrows. I have not released this update yet; once I apply some other suggestions from the community, I will release it as v0.11.0.
After receiving feedback from the Hack Club community, I have made these changes to CodeWare. The icon has been updated to increase contrast and to look better at small resolutions Minigame 6, “Unintelligent Arrows,” has been balanced to be easier for users to complete WASD Movement has been added to all games Support for held jumps has been added to the first minigame, “Orb Collection Platformer” An ambiguity in the README about the objective has been corrected
I just made two new assets for CodeWare! They are the players in minigames 4 and 6. Here is a photo of one of them.
I just released version v0.13.0 of CodeWare! In this version, I have completely changed the sound environment of the game! I will explain it with two basic pseudocode (or Python) logic statements! prev_sound = sound in v0.12.0 curr_sound = sound in v0.13.0 print(prev_sound, curr_sound) # False, True What I’m trying to illustrate here is that there was absolutely no sound before, and now there is! There is a background ticking noise playing (forever) through an autoload and sound effects corresponding to in-minigame events. Feel free to test it at https://tyleruploads.itch.io/codeware?secret=CDZUB2MTxYCmNQ70VRagItDLSTg ! Send any feedback in the comments!
I just made version v0.14.0 of CodeWare! In this version, I added the eighth minigame, “Choose the Boxes!” The user has 30 seconds to choose 20 boxes by clicking on the one matching the color of the center box. I also went through and removed unnecessary log statements and unused variables.
I just made the ninth minigame for CodeWare, “The Maze!” In the minigame, the user needs to get to the center of the maze in less than 18 seconds! They move a mini tyleruploads texture with arrow keys and WASD to eventually get to the bigger one in the middle! I had a lot of trouble with physics here, hence the 2 hours! And, I’ve never made any sort of maze before, so this is a first!
I just made the tenth minigame for CodeWare! It is named “RGB Skills.” In the minigame, there are two colors: one generated automatically by the code, and one controlled by manual RGB Sliders. It validates the user’s guess using the GDScript method Vector3.distance_to() . The method uses the 3D Pythagorean theorem to calculate the Euclidean Distance between the RGB values, as if they were plotted in a 3D space. This works because the red value represents the x-axis, the green value represents the y-axis, and the blue value represents the z-axis on a 3D graph. This was very interesting for me to discover, since I only learned the 2D Pythagorean theorem last year (in seventh grade). The game also starts the sliders at the furthest possible points from the target color, which makes the minigame harder. If the player clicks the submit button without making any changes, they will not pass. And yes, I know they could easily invert the colors to find the right one. The only thing is, they probably didn’t read this devlog. So, they’ll have no clue of the fact the sliders were placed at the inversion of the target color.
I just did a lot of asset updating and linting! The part I think would be most interesting to you is obviously the asset updates. I changed the assets in Minigame 1, 3, 4, and 9! I also updated the gallery, accessible in the extras menu, to include new assets I’ve forgotten to put in there for a while now. I’ll just show you how minigame one looks now; no need for a detailed explanation of everything. Now, I have to address the boring part, which took most of the three and a half hours. That would be linting! It’s pretty self-explanatory: I went through and made the scenes and scripts adhere to style guidelines.
In the Newspaper department at my summer sleepaway camp this year, they always said, “If the number is less than 11, spell it out.” CodeWare has officially surpassed this guideline in the number of its minigames. Minigame 11 of CodeWare is titled “Type the Strings,” and players must type 15 five-character strings provided to them in less than one minute. The string is generated from a pool of characters with lookalikes (i.e., Z and 2, S and 5, O and 0, I and l, etc.) removed to ensure it is completely fair for the user. This was definitely one of the easier minigames to code, but it wasn’t the easiest thing ever. I still ran into some issues, like the vertical alignment of a RichTextLabel being a bit too low when dynamically updating its content in GDScript to show a custom notice to the user (I fixed it by changing it to a normal Label, after troubleshooting for way too long).
I just created the twelfth mingame of CodeWare, “Catch the Falling Orbs!” In it, you have 45 seconds to catch 35 falling orbs by moving left and right with your keyboard.
This will be one of my very last devlogs before I ship CodeWare! I just created the gameplay trailer, which is a huge accomplishment! This is my first time making any sort of video for anything I make in the computer world, and I think it actually turned out very well! The video shows potential players what the game will look like and gives a glimpse of its unexpected win-and-lose endings. I also put the video on the game’s Itch.io page, which will be made public very soon. You can view the video on YouTube here: CodeWare - Official Gameplay Video
This marks v1.0.0! This is my FINAL devlog for CodeWare (at least the first ship)! It has really been a great project that has significantly pushed what I think about my development capabilities. But I will explain that more in the ship message! The main change made over the time of this devlog was a complete revamp of the README! Here is a summary of the changes made to it: The following shields have been added: Play on GitHub Pages, Made with Godot, GitHub Release (version number), and GitHub Commit Activity The hero image near the top of the README, depicting the title screen, has been replaced with a gameplay video for the game, with a hero of minigame 6 (Unintelligent Arrows) The minigames section has been moved to near the bottom of the README to make the start of the README a better hook. And the minigame descriptions and hero images inside the section have been put inside a spoiler notice, so the game can not be easily spoiled for players. And the hero images in the minigame section have been converted from Markdown tags to HTML tags in order to enforce a specific width.
Ships:
I created CodeWare, a WarioWare-style video game where you have to complete various minigames, written in Godot. I originally had it under the WarioWare game mission, but I eventually decided I should detach it from it due to the sheer complexity of this game, which is way above the beginner mission. In the game, players are put through what is currently 12 minigames. Each minigame has a strict timer limit, whether it be losing a life or progressing to the next minigame once it strikes 0. In case you are confused, the way they win a life at the end is if the purpose of the minigame is to survive a certain amount of time against computer-generated obstacles, like arrows or orbs (essentially meteors). The very interesting thing about this game is the two endings: the ending you get when you complete all the minigames with lives to spare, and the one when you lose all of your five lives. These endings, which I will not explain in detail (so it is not spoiled for you!), highlight the eternity of automatically generated code files. The opening scene of the game is the Tyleruploads Mountain Range, which shows many mountains connected via bridges. The suspension for those bridges is the game’s logo turned into a bunch of small links. Metaphysically, the game’s goal is to cross these bridges. Many parts of this project were extremely challenging for me. For one, I had never set foot in Godot at all before embarking on this project. I was also a complete newcomer to any sort of game development. I encountered many errors caused by my being just introduced to GDScript and game development, such as not knowing that scripts continue after changing the scene, the absence of a deferred call causing the game to go completely grey, losing a lot of work in video editing software while making the gameplay trailer video, and many more small and large things. In every ship message for prior Stardance projects, I have said something like “Wow! Before I started, I really didn’t think I could do something this complex. I really just transformed my coding abilities.” But this time, I am not going to repeat that basic fib without any supporting arguments. My previous Stardance projects were nowhere near this length. So, I would like to make a new claim now. That claim is that while I have not become a completely new developer or graphic designer or anything, I have dipped into a new path of development that I will have the choice to either continue to pursue or to reap the benefits of the mindset associated with it as I enter high school. For these reasons, along with the fact that I was able to sit down and write quality code for one project for 51 hours, I am very proud of myself. My viewpoint of “sit down and make a decent project and leave it” has been greatly diminished outside of specific contexts....
|
1792856843.1844053
|
1792943243.1844053
|
|
8178
|
GVK renderer by @gungu | Stardance
|
gungu
|
2
|
60.0
|
1009
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-07T14:22:35Z", "hours": 13.0, "multiplier": 19.44, "payout": 261, "blessing": "neutral", "text": "This is the second ship of my game engine / renderer. To explain, I like calling it a renderer instead of a game engine, because I purposefully tried to add as few bloat features as I could, I just wanted something that made rendering something that I don’t have to think about. More info on the README page, this isn’t a good explanation. Just know that it isn’t just a basic Vulkan abstraction, this is a full renderer with PBR, many post-processing effects, skyboxes, dynamic lights, rigged and animated meshes and frustrum culling ’cause why not. Changelog since the last ship: 2 new post-processing effects, pixelation and fog I also added a feature where shiny objects reflect the skybox, which isn’t realistic, but it adds a great sense of realism and I like to add it to my games. one of the largest changes was turning this into an actual library instead of an executable, which allows easier integration. I also made a full game as a tech demo for this project, it can be found at this link or under my stardance profile. It turned out really well, and I’m proud of myself, because I finally made a game engine that I can actually make games in easily. (The screenshot is from the game) and the smallest but still a significant change was rewriting the entire 2D rendering part of the engine for 2 reasons: it had a memory leak, and text rendering was buggy, slow and barely worked.", "repo": "https://github.com/gungugugungu/GVK-Engine", "demo": "https://github.com/gungugugungu/GVK-Engine/releases"}, {"ship_num": 2, "ts": "2026-08-17T20:15:46Z", "hours": 47.0, "multiplier": 15.86, "payout": 748, "blessing": "neutral", "text": "GVK (short for gungu vulkan) is my new renderer using the Vulkan graphics api. I miss the times when I worked with pygame and love2d, where rendering an image was one simple line of code, and I intend to bring that experience to 3D with this project. Everything is designed to be as easy as possible for the user, just writes gvk::draw_mesh(mesh, material, position, scale, rotation); and the mesh is where you want it, how you want it. But don’t mistake it, this is not a game engine, this is just a renderer, something you can build an engine on. I made this tool so my later projects have a graphical backbone to build on, but every game needs a different engine. Ever since I started graphics programming last year I knew that one day I had to learn Vulkan if I ever wanted a job in it in the future, and I’m very proud of myself for finally doing it. This was the greatest challenge I faced in programming so far, and I so glad I tackled it. And as for AI: This project was created so I could learn Vulkan, and if I copied everything from AI that would have been to effective. My goal was to use as little AI as I could, while still leaving out the headaches of development. Here’s what I used AI for: Many of the shaders were written by AI, but that’s because I haven’t learned any of the maths I need to know to write any of these shader. When a shader wasn’t too math heavy I wrote it myself, but there weren’t too many of those. The GLTF loading isn’t hard, it’s just a headache to work with it. GLTF is a horrible format for developers, but it’s the best I knew, so I rather had AI write the GLTF loading functions. I’m still glad I did that, I would have learned nothing from writing those.", "repo": "https://github.com/gungugugungu/GVK-Engine", "demo": "https://github.com/gungugugungu/GVK-Engine/releases"}]...
|
[{"post_id": 63563, "ts": "202 [{"post_id": 63563, "ts": "2026-09-07T14:07:41Z", "hours": 0.4622, "text": "I made a few minor tweaks to fog, and I started debugging it, which I ended up completely stopping and reverting, as it was useless. To be honest I’m really trying to find where this 27 minutes appeared, because I don’t remember spending half an hour on this"}, {"post_id": 61085, "ts": "2026-09-03T20:06:12Z", "hours": 0.76, "text": "FOG Yeah I just added fog because I thought it would look cool in my game. Obviously it’s over the top in this image because I wanted to show it off. I’m pretty proud of this one, definitely one of the more complex post-processing effects."}, {"post_id": 60850, "ts": "2026-09-03T14:06:32Z", "hours": 0.2822, "text": "SKYBOX REFLECTIONS This is a neat trick I did in my last engine and I’m happy I recreated it in this one. Every single shiny surface reflects the skybox, which while isn’t realistic, it does make those surfaces look a lot more shiny than what they actually are, which is a great hack. It sure as hell looks better in the environments I make."}, {"post_id": 60834, "ts": "2026-09-03T13:41:51Z", "hours": 0.5078, "text": "Screen-space reflections would be a major challenge, but I learned that making the skybox reflect off of shiny surfaces is a pretty good way of making your renders seem much better. As of right now it technically works, but I came to realize that I wasn’t loading materials right, so if an image didn’t have a roughness texture, then it would end up completely shiny. I’m almost done fixing it."}, {"post_id": 59082, "ts": "2026-08-31T18:07:57Z", "hours": 0.5186, "text": "I also fixed a bug where the bloom’s blur looped around to the other side of the screen."}, {"post_id": 58887, "ts": "2026-08-31T13:42:45Z", "hours": 0.8592, "text": "PIXELATION POST-PROCESSING EFFECT I made my post-processing system so expandable that I just casually added it ‘cause I thought it would look cool in the game I’m making. I’m sure as hell right about that."}, {"post_id": 58002, "ts": "2026-08-30T10:41:46Z", "hours": 3.0525, "text": "I wasted so much time trying to optimize it all to lead to nothing, but I did end up optimizing some stuff with the Surfaces along with actual color blending for them. I did end up optimizing a bit, but that’s basically nothing. This is the most worthless update to this entire project, I don’t even know how I spent 3 hours on this."}, {"post_id": 52632, "ts": "2026-08-22T21:10:39Z", "hours": 1.3003, "text": "I completely rewrote the text rendering in the Surface class and also fixed a giant memory leak. Here’s a picture of it in use in my game."}, {"post_id": 51872, "ts": "2026-08-21T19:11:56Z", "hours": 0.6219, "text": "I rewrote the texture loading part of GLTF loading because it just plain didn’t work since I updated everything to tinygltf3, but I didn’t notice because it was after the demo. Anyways, it’s done now."}, {"post_id": 51319, "ts": "2026-08-20T22:03:59Z", "hours": 0.4669, "text": "I also rewrote the single mesh gltf loading function to return the material and the entire vertex and index arrays, because I’ll need them for a feature I’m making for my game. This is slowly turning into engine development and I kinda like it."}, {"post_id": 50898, "ts": "2026-08-20T11:18:10Z", "hours": 4.5806, "text": "I worked for over 4 hours, but the renderer finally works as a library!!! That’s right, just put it in as a git submodule, add it as a subdirectory to you CMake project, and there it is! Way too much work for something so simple, but I had to debug a whole lot of stuff. I also edited the README to feature usage instructions and also how to try the demo."}, {"post_id": 49166, "ts": "2026-08-17T20:06:43Z", "hours": 1.8336, "text": "THE GREAT DEBUGGING and A DEMO This is the final post as long as everything works as intended. I fixed every single validation layer error that occurred, so this project is officially bug-free (to my knowledge) . I also made a really simple demo that I uploaded to the github releases tab of the repository. I also finalized the readme, so now the project also has a fancy description. What a ride, I love this project."}, {"post_id": 47631, "ts": "2026-08-15T17:22:29Z", "hours": 0.6358, "text": "FINAL POLISHING (mostly just making the API more useable) I genuinely can’t believe this. I did it, I made a renderer in Vulkan. Well, I’m still not in the clear yet, but I’m very close. Changelog: updated Skin struct to include find_joint() function added Pose struct updated existing skinned mesh systems to work with the Pose struct added sample_clip(), compute_global_pose(), compute_skinning_matrices(), pose_set_local(), pose_set_global(), pose_get_global(), update_animation() and finalize_pose(). These are all helpers for making work with animated and rigged meshes a whole lot easier moved all of the functions inside the gvk namespace, because they were about half and half before."}, {"post_id": 47191, "ts": "2026-08-14T22:29:34Z", "hours": 3.0672, "text": "SKINNED MESHES AND RIGGING This renderer is extremely close to done. I just implemented fully rigged (and animated) meshes. They render properly and animations work too (although I didn’t really care enough to show an example) . Now I am at the last 2 steps of this renderer before starting work on a game in it: 1. Polish up all the API commands so it’s more user friendly. For example, skinned meshes work and can be adjusted manually, but I have a really good idea on how to make working with them super easy, so I’ll definitely implement that. 2. Make a demo that includes basically everything I have developed so far. This step also includes writing compatibility for multiple platforms, because so far I’ve only tested this project on Ubuntu, and I’ll definitely need a windows version too. And that’s it, the project is nearing it’s completion. I can’t wait to make a proper game in this, which I’ll document too of course. Also, I’m writing all of this while I’m on a vacation in Denmark, so I’m quite far from home, but I’m extremely motivated to get this project finished."}, {"post_id": 45337, "ts": "2026-08-11T18:43:26Z", "hours": 3.4436, "text": "SSAO (screen-space ambient occlusion) This one was fun. Ambient occlusion is just a little shadow thing at the edge of meshes. It is not realistic, technically it doesn’t exist in the real world, yet it looks so much better with it. To be honest I don’t have a lot to say about this, it’s done and it’s cool."}, {"post_id": 42894, "ts": "2026-08-07T21:01:17Z", "hours": 1.6756, "text": "SCENE LOADING I just got home from a 10 day adventure that’ll never forget, but I’m back to code, and to get myself to shake into the civilized world again I decided to do a simpler feature before shadow mapping, so I implemented full scene loading from GLTF files. It’s a pretty handy feature, I’m glad I finally made it. It doesn’t just load models and materials, but lights too, pretty handy."}, {"post_id": 35091, "ts": "2026-07-26T09:27:19Z", "hours": 0.3281, "text": "NORMAL MAPPING This was a really easy update, most of the shader changes were copied from my last engine, and the CPU side of things was just changing the vertex struct and loading the tangents in the mesh loading function. But it works."}, {"post_id": 34858, "ts": "2026-07-25T22:07:52Z", "hours": 3.8317, "text": "Well well well. Seems like it’s time for LIGHTING !!!!! finally This was not easy, and yet it was made so much easier by having done it once before last year. I added support for a directional light, a dynamic (aka not hard coded, so pratically infinite amount of) point lights and spot lights, full PBR, and I also made a little handy editor to go along with it, although that’s not in the renderer that’s just in the demo project. Anyways, this was an incredible journey filled with pain and suffering like never before, and I’m so glad I’m through it all. And if this was a challenge, I don’t know what shadow mapping is going to be, which is going to be basically right now, I’m going to add tanget space normal mapping and then it’s already shadowmapping. I’m mentally unprepared, but oh well what can I do?"}, {"post_id": 33983, "ts": "2026-07-24T11:18:42Z", "hours": 1.8858, "text": "This change is not too visible, but it is a major change in the engine MATERIALS Everybody who worked in any sort of 3D graphics knows what materials are. And those know, that the next step after this is lighting . This wouldn’t have been that big of a change, if not for one issue. I’m developing on linux, and every once in a while my GPU drivers uninstall themselves, so everything runs on the integrated graphics on the CPU. That happened, but I thought that the code just became really slow because I was sending 6 images to the GPU every single frame, and that slowed it down. So I spent a bunch of time making a large optimization, and it worked like a charm, it ran fast. Then I found out the entire thing was running on the CPU and I didn’t even need to optimize it. Anyway, it’s here, and it’s fast"}, {"post_id": 33448, "ts": "2026-07-23T12:32:42Z", "hours": 2.7142, "text": "POST-PROCESSING STACK and TONEMAPPING AND COLOR GRADING (post-processing effect 5) This is the finale to the post-processing saga, because I’m finished with tonemapping and color grading. Everything will look really good and cool and whatever, altough I’ve been coding non-stop for 2.5 hours and I don’t really care to give an explanation right now. I don’t have to explain color grading everybody knows that, and tonemapping is the process of mapping the internal HDR render image to an LDR (whatever it’s called) image that the display can actually render properly, how cool is that?"}, {"post_id": 32903, "ts": "2026-07-22T11:24:50Z", "hours": 1.3728, "text": "BLOOM (post-processing effect 4) I’m almost done with all of the post-processing effects, and this was by far the hardest of them all, but I managed to push through it. I’m really proud of myself, because I finally understand Vulkan enough where I didn’t need any sort of outside help to debug this error. I think I can finally call myself someone who understands Vulkan now. Anyway, now I just need to make tonemapping and the effects are done. After that I just make the simplest pipeline to composite it all, and I’m done with that as well."}, {"post_id": 32861, "ts": "2026-07-22T09:31:30Z", "hours": 1.115, "text": "VIGNETTE (post-processing effect 3) This was the most fun I’ve had debugging something in a while. This was really simple to implement, although I can’t really say a lot. The initialization was the same as the other effects, the actual logic of it was pretty similar, the shader wasn’t too hard to write too, but added up it was pretty bad. I accidentally left one of the push parameters in the CPU code as an int, but a float in the GPU code, which I ended up having to chase down for quite a while. The values are over the top on the image so it is more visible on the screenshot, of course I won’t leave it like this. Also, I have written a new readme for the github page. I just kinda wanted to, and thought why not?"}, {"post_id": 32630, "ts": "2026-07-21T22:19:26Z", "hours": 0.3061, "text": "BOX BLUR (post-processing effect 2) I have to admit this took 11 minutes, and the rest of the 5 minutes I spent in this devlog was spent debugging 3 new errors so I can make a post about this feature too. It took so little because I literally just copied and renamed the gaussian blur functions, and changed the shader. Still, I have box blur now. Actually, I think there’s quite a difference between the 2 blurs, quite cool. Of course now that I look at it it’s barely visible in the screenshots."}, {"post_id": 32617, "ts": "2026-07-21T22:00:32Z", "hours": 2.6194, "text": "I thought how cool would it be if I just did a whole 10 hour devlog with all of post-processing in it, but I realized I wouldn’t be able to show off all the cool stuff I’ve done, so I’m doing it effect by effect, anyway, GAUSSIAN BLUR (post-processing effect 1) But not just that, I also brainstormed out the entire post-processing system, and “implemented” it. I didn’t exactly implement it yet because I need to finish all the effects, but it’s there. I still have to finish: box blur, bloom, vignette and tonemapping, and I also want support for custom effects, but that’ll be really easy so I don’t want to put it on this list."}, {"post_id": 31844, "ts": "2026-07-20T15:30:20Z", "hours": 1.5975, "text": "MSAA !! (multisampled anti-aliasing) I always viewed anit-aliasing as this mystery thing that can make a game prettier and I’ll never know how it works. I have to say, it was way easier than expected, most of the time I spent was on some stupid bug or general debugging. You can’t really see the difference in a small screenshot, but it looks so much better full screen."}, {"post_id": 31201, "ts": "2026-07-19T12:30:48Z", "hours": 1.5542, "text": "2D rendering!! I have to admit this feature was kinda easy to implement, because most of it was ripped straight from my last game engine, but I did it because I think it is a really smart way of handling how a 2D system should work. Everything relies on the Surface class, the display itself is a surface, the loaded images are surfaces, and those surfaces can draw to eachother. This makes the system easy yet expandable. I think it’s kinda cool. It was heavily inspired by how pygame does things."}, {"post_id": 31151, "ts": "2026-07-19T10:09:03Z", "hours": 1.3306, "text": "And just like that, the next major update is done! SKYBOXES and other stuff Here’s a full changelog of the last 3 posts: I wrote a really handy shader compiler to make this update just a bit easier, now it automatically compiles all shaders at once I don’t have to do it one by one I wrote a compositing pass that finally has a use case as can be seen right now. The skybox and the objects are rendered separately to separate images, and the compositing pass combines them and renders them to the screen together. Might sound simple, and I have to admit if I understood Vulkan a bit better it might have been, but right now I’m really proud of myself for it. Of course the headline feature: The Skybox . This is most of what I’ve been working on for the last 3 updates. It’s done in a really cool way. The easy way of doing a skybox is to just render it as one giant object and then bim bam boom there it is, but sadly that has a couple of issues, the largest one is that this is extremely lazy. So I did it the smart way instead. What you’re seeing there is actually a cube a tad bit smaller than the monkey, but it’s rendered in a separate pass, where I only pass the camera’s rotation and not the position, and I also have the depth disabled. I render that to a separate image, use the compositing pass, and there it is, a beautiful, very stable and very professional skybox. I’m almost done rambling, but I have to mention one last feature, and that is the loading of equirectangular images into a cubemap texture . I think I’ve typed enough for this update, but if you care you can look it up or like look at my code. Next up: 2D rendering and I have some great ideas for it"}, {"post_id": 30908, "ts": "2026-07-18T21:44:56Z", "hours": 1.5617, "text": "This is a change that cannot be seen, but the composite pipeline is actually working. This is a really simple step in the graphics pipeline, it takes the images from the previous passes and combines them to make a final image. This will be useful for future features like 2D drawing, post-processing, the skybox, etc., so I’m happy I managed to implement it. It’s not something that can be seen with the naked eye, but believe me it’s there and I’m so happy for it. As always, this is next to some generic bugfixes here and there, but it’s been 1.5 hours and I forgot what I fixed and what I didn’t so if you happen to care enough this is open-source just like go and check it out."}, {"post_id": 30852, "ts": "2026-07-18T19:58:13Z", "hours": 1.6753, "text": "I’m well into developing the skybox system along with a compositing pass , but since I needed to write so many new shaders for this update, I decided to write a simple shader compiler, and I kinda want to show it off so it’s not lost in the giant list of changes that I’ll push in the next update. That’s it, I rest my case, that’s all I wanted until I’m finished."}, {"post_id": 30103, "ts": "2026-07-17T12:46:44Z", "hours": 2.2475, "text": "I finished frustum culling . You’ve probably seen this feature in some random wannabe gamedevs post on tiktok saying how they “optimized their game” by enabling frustum culling in Unity and calling themselves genius for it. Well it wasn’t as easy as pressing a button for me. Here’s how it works: I generate an axis aligned bounding box (AABB) for every object when loaded. Every frame I generate 6 planes for each boundary of the camera, the left, right, bottom, top, near and far planes. Then I also calculate the world position AABB for each mesh, which is just translating the original AABB and making a new one from that’s boundary. From that, it’s actually quite simple to compare if the box is inside the frustum or not, though it’s kinda hard to explain so I won’t bother, but I just run that for every object, and it basically makes it, so if an object is not inside the camera’s vision, then it just makes it disappear. I attached the majority of the logic in the second picture"}, {"post_id": 28824, "ts": "2026-07-15T10:08:18Z", "hours": 1.3122, "text": "I implemented a fully automatic mipmap system . Basically, mipmaps are lower quality version of a texture that appear the farther you are from an object. The image I attached is of mipmap layer 4, but of course this was set manually to showcase the system working."}, {"post_id": 28331, "ts": "2026-07-14T14:52:20Z", "hours": 0.6636, "text": "I wrote a giant list on what I want to implement into this framework to make it full. I’m pretty sure I’ll be done in about 150-200 hours, which I have about 40 days to make before the end of this thing. That is 3.75 - 5 hours of coding in a day. Anyway, here’s the list: TODO FEATURES: lighting gpu scene data uniform buffer ambient light directional light point lights tangent space normal mapping tangent generation in gltf loading dynamic light count proper api for handling lights shadow mapping depth-only pipeline shadow map image light space matrix shadow pass shadow sampling in the main fragment shader shadow bias PCF filtering material system material struct (albedo map, normal map, roughness map, emissive map, scalar tint and roughness and metallic factors) material descriptor layout default fallback textures gltf material loading draw_mesh api update emissive support in the shader creating and destroying materials for user-made materials mipmaps and proper sample management mipmap generation on upload mip count calculation sampler cache (so samplers are never duplicated) instanced rendering per-instance storage buffer draw_mesh_instanced api write the shader for it (gl_InstanceIndex) move to indirect drawing so the instance count can eventually come from gpu-side data skybox cubemap loading skybox pipeline skybox shader set_skybox api frustrum culling bounding sphere per mesh (compute in loading by finding the disctance from the centroid across all vectires) frustrum plane extraction (gribb-hartmann) cull loop stats readout post processing stack fullscreen traingle pipeline HDR tonemapping guassian blur api box blur api bloom vignette 2D rendering quad mesh 2D pipeline surface class default surface draw_surface draw_rect font atlas rendering MSAA multisample draw image resolve attachment configurable sample count"}, {"post_id": 28166, "ts": "2026-07-14T09:18:04Z", "hours": 0.8786, "text": "I have to admit I’m pretty proud of myself. I implemented the proper transformations for objects , I also made a good camera system , and I fixed the uv mapping of objects, so textures finally work properly. All this in under an hour."}, {"post_id": 19382, "ts": "2026-06-30T17:57:36Z", "hours": 1.0408, "text": "To be completely honest this engine development thing is going a lot more awful than I could have imagined. I tried to implement a proper camera and transformations for the objects, and now nothing works, yet I barely changed anything. I have been staring at this function for like 2 hours, I’ve tried everything, and nothing works."}, {"post_id": 18575, "ts": "2026-06-29T19:26:50Z", "hours": 1.0686, "text": "I finally finished the guide (🥳🥳🥳), so it’s time to make the game engine I want . My first improvement was adding a render queue, which basically means I can render anything in a much user friendly way."}, {"post_id": 18301, "ts": "2026-06-29T12:31:38Z", "hours": 0.8061, "text": "Thanks to the major rework of the allocation of descriptors, I have managed to implemented textures into rendering. I haven’t made texture loading yet, since it’ll be an engine feature and I’m working on project setup , so enjoy the beautiful pink-black checkerboard pattern on Suzie, the Blender monkey."}, {"post_id": 18277, "ts": "2026-06-29T11:27:47Z", "hours": 1.3389, "text": "I did a giant rework of the descriptor allocation to make handling textures a breeze in the future. Yes, I did mostly just follow the guide, but I am really getting the hang of how Vulkan works, and the guide is ending in a couple of chapers, and the rest will be up to me, and I already feel ready for the task. I have to admit it doesn’t exactly work yet, but I’m working on patching it, it shouldn’t be an issue."}, {"post_id": 18218, "ts": "2026-06-29T09:03:15Z", "hours": 0.4683, "text": "Mesh rendering is finally complete. This is a full 3D scene with a little monkey, rendered perfectly in perspective."}, {"post_id": 17917, "ts": "2026-06-28T21:08:40Z", "hours": 1.0294, "text": "So mesh loading and rendering works, although I haven’t gotten the world matrix and transformations quite right😅 The guide I’m using to learn Vulkan actually recommended I use fastgltf, but I ended up going with tinygltf, as I’ve used it before and have a bunch more experience in it, and oh boy is having experience a good feeling when learning VK"}, {"post_id": 17836, "ts": "2026-06-28T19:36:25Z", "hours": 1.1339, "text": "I’m progressing rather fast, I implemented a full mesh buffer system, which allows me to render any mesh. Mesh loading will be the next task, but until then the best display I can do is a colorful rectangle, I hope that’s good enough"}, {"post_id": 16164, "ts": "2026-06-26T08:40:00Z", "hours": 0.4853, "text": "Implementing a proper graphics pipeline was surprisingly easy. I remembered a lot from my experience in sokol and of course the guide was quite helpful as well. Got from a compute shader to a proper pipeline very fast. I’m still very eager to get back to the fun part of graphics programming and not be stuck in setup hell, but the next step is writing the mesh buffers, so that’ll be fun."}, {"post_id": 11826, "ts": "2026-06-19T08:22:42Z", "hours": 1.095, "text": "I finished the ImGui implementation, I’m starting to get the hang of things. I’m still following vkguide.dev for the setup phase, but I’m eager to finally get to the fun part of graphics programming"}, {"post_id": 4078, "ts": "2026-06-07T08:34:21Z", "hours": 1.0794, "text": "After about an hour of following vkguide.dev, I managed to make a little compute shader that display 16×16 cells of a gradient. Great start!"}]...
|
Title: GVK renderer by @gungu | Stardance
Devlogs Title: GVK renderer by @gungu | Stardance
Devlogs:
After about an hour of following vkguide.dev, I managed to make a little compute shader that display 16×16 cells of a gradient. Great start!
I finished the ImGui implementation, I’m starting to get the hang of things. I’m still following vkguide.dev for the setup phase, but I’m eager to finally get to the fun part of graphics programming
Implementing a proper graphics pipeline was surprisingly easy. I remembered a lot from my experience in sokol and of course the guide was quite helpful as well. Got from a compute shader to a proper pipeline very fast. I’m still very eager to get back to the fun part of graphics programming and not be stuck in setup hell, but the next step is writing the mesh buffers, so that’ll be fun.
I’m progressing rather fast, I implemented a full mesh buffer system, which allows me to render any mesh. Mesh loading will be the next task, but until then the best display I can do is a colorful rectangle, I hope that’s good enough
So mesh loading and rendering works, although I haven’t gotten the world matrix and transformations quite right😅 The guide I’m using to learn Vulkan actually recommended I use fastgltf, but I ended up going with tinygltf, as I’ve used it before and have a bunch more experience in it, and oh boy is having experience a good feeling when learning VK
Mesh rendering is finally complete. This is a full 3D scene with a little monkey, rendered perfectly in perspective.
I did a giant rework of the descriptor allocation to make handling textures a breeze in the future. Yes, I did mostly just follow the guide, but I am really getting the hang of how Vulkan works, and the guide is ending in a couple of chapers, and the rest will be up to me, and I already feel ready for the task. I have to admit it doesn’t exactly work yet, but I’m working on patching it, it shouldn’t be an issue.
Thanks to the major rework of the allocation of descriptors, I have managed to implemented textures into rendering. I haven’t made texture loading yet, since it’ll be an engine feature and I’m working on project setup , so enjoy the beautiful pink-black checkerboard pattern on Suzie, the Blender monkey.
I finally finished the guide (🥳🥳🥳), so it’s time to make the game engine I want . My first improvement was adding a render queue, which basically means I can render anything in a much user friendly way.
To be completely honest this engine development thing is going a lot more awful than I could have imagined. I tried to implement a proper camera and transformations for the objects, and now nothing works, yet I barely changed anything. I have been staring at this function for like 2 hours, I’ve tried everything, and nothing works.
I have to admit I’m pretty proud of myself. I implemented the proper transformations for objects , I also made a good camera system , and I fixed the uv mapping of objects, so textures finally work properly. All this in under an hour.
I wrote a giant list on what I want to implement into this framework to make it full. I’m pretty sure I’ll be done in about 150-200 hours, which I have about 40 days to make before the end of this thing. That is 3.75 - 5 hours of coding in a day. Anyway, here’s the list: TODO FEATURES: lighting gpu scene data uniform buffer ambient light directional light point lights tangent space normal mapping tangent generation in gltf loading dynamic light count proper api for handling lights shadow mapping depth-only pipeline shadow map image light space matrix shadow pass shadow sampling in the main fragment shader shadow bias PCF filtering material system material struct (albedo map, normal map, roughness map, emissive map, scalar tint and roughness and metallic factors) material descriptor layout default fallback textures gltf material loading draw_mesh api update emissive support in the shader creating and destroying materials for user-made materials mipmaps and proper sample management mipmap generation on upload mip count calculation sampler cache (so samplers are never duplicated) instanced rendering per-instance storage buffer draw_mesh_instanced api write the shader for it (gl_InstanceIndex) move to indirect drawing so the instance count can eventually come from gpu-side data skybox cubemap loading skybox pipeline skybox shader set_skybox api frustrum culling bounding sphere per mesh (compute in loading by finding the disctance from the centroid across all vectires) frustrum plane extraction (gribb-hartmann) cull loop stats readout post processing stack fullscreen traingle pipeline HDR tonemapping guassian blur api box blur api bloom vignette 2D rendering quad mesh 2D pipeline surface class default surface draw_surface draw_rect font atlas rendering MSAA multisample draw image resolve attachment configurable sample count
I implemented a fully automatic mipmap system . Basically, mipmaps are lower quality version of a texture that appear the farther you are from an object. The image I attached is of mipmap layer 4, but of course this was set manually to showcase the system working.
I finished frustum culling . You’ve probably seen this feature in some random wannabe gamedevs post on tiktok saying how they “optimized their game” by enabling frustum culling in Unity and calling themselves genius for it. Well it wasn’t as easy as pressing a button for me. Here’s how it works: I generate an axis aligned bounding box (AABB) for every object when loaded. Every frame I generate 6 planes for each boundary of the camera, the left, right, bottom, top, near and far planes. Then I also calculate the world position AABB for each mesh, which is just translating the original AABB and making a new one from that’s boundary. From that, it’s actually quite simple to compare if the box is inside the frustum or not, though it’s kinda hard to explain so I won’t bother, but I just run that for every object, and it basically makes it, so if an object is not inside the camera’s vision, then it just makes it disappear. I attached the majority of the logic in the second picture
I’m well into developing the skybox system along with a compositing pass , but since I needed to write so many new shaders for this update, I decided to write a simple shader compiler, and I kinda want to show it off so it’s not lost in the giant list of changes that I’ll push in the next update. That’s it, I rest my case, that’s all I wanted until I’m finished.
This is a change that cannot be seen, but the composite pipeline is actually working. This is a really simple step in the graphics pipeline, it takes the images from the previous passes and combines them to make a final image. This will be useful for future features like 2D drawing, post-processing, the skybox, etc., so I’m happy I managed to implement it. It’s not something that can be seen with the naked eye, but believe me it’s there and I’m so happy for it. As always, this is next to some generic bugfixes here and there, but it’s been 1.5 hours and I forgot what I fixed and what I didn’t so if you happen to care enough this is open-source just like go and check it out.
And just like that, the next major update is done! SKYBOXES and other stuff Here’s a full changelog of the last 3 posts: I wrote a really handy shader compiler to make this update just a bit easier, now it automatically compiles all shaders at once I don’t have to do it one by one I wrote a compositing pass that finally has a use case as can be seen right now. The skybox and the objects are rendered separately to separate images, and the compositing pass combines them and renders them to the screen together. Might sound simple, and I have to admit if I understood Vulkan a bit better it might have been, but right now I’m really proud of myself for it. Of course the headline feature: The Skybox . This is most of what I’ve been working on for the last 3 updates. It’s done in a really cool way. The easy way of doing a skybox is to just render it as one giant object and then bim bam boom there it is, but sadly that has a couple of issues, the largest one is that this is extremely lazy. So I did it the smart way instead. What you’re seeing there is actually a cube a tad bit smaller than the monkey, but it’s rendered in a separate pass, where I only pass the camera’s rotation and not the position, and I also have the depth disabled. I render that to a separate image, use the compositing pass, and there it is, a beautiful, very stable and very professional skybox. I’m almost done rambling, but I have to mention one last feature, and that is the loading of equirectangular images into a cubemap texture . I think I’ve typed enough for this update, but if you care you can look it up or like look at my code. Next up: 2D rendering and I have some great ideas for it
2D rendering!! I have to admit this feature was kinda easy to implement, because most of it was ripped straight from my last game engine, but I did it because I think it is a really smart way of handling how a 2D system should work. Everything relies on the Surface class, the display itself is a surface, the loaded images are surfaces, and those surfaces can draw to eachother. This makes the system easy yet expandable. I think it’s kinda cool. It was heavily inspired by how pygame does things.
MSAA !! (multisampled anti-aliasing) I always viewed anit-aliasing as this mystery thing that can make a game prettier and I’ll never know how it works. I have to say, it was way easier than expected, most of the time I spent was on some stupid bug or general debugging. You can’t really see the difference in a small screenshot, but it looks so much better full screen.
I thought how cool would it be if I just did a whole 10 hour devlog with all of post-processing in it, but I realized I wouldn’t be able to show off all the cool stuff I’ve done, so I’m doing it effect by effect, anyway, GAUSSIAN BLUR (post-processing effect 1) But not just that, I also brainstormed out the entire post-processing system, and “implemented” it. I didn’t exactly implement it yet because I need to finish all the effects, but it’s there. I still have to finish: box blur, bloom, vignette and tonemapping, and I also want support for custom effects, but that’ll be really easy so I don’t want to put it on this list.
BOX BLUR (post-processing effect 2) I have to admit this took 11 minutes, and the rest of the 5 minutes I spent in this devlog was spent debugging 3 new errors so I can make a post about this feature too. It took so little because I literally just copied and renamed the gaussian blur functions, and changed the shader. Still, I have box blur now. Actually, I think there’s quite a difference between the 2 blurs, quite cool. Of course now that I look at it it’s barely visible in the screenshots.
VIGNETTE (post-processing effect 3) This was the most fun I’ve had debugging something in a while. This was really simple to implement, although I can’t really say a lot. The initialization was the same as the other effects, the actual logic of it was pretty similar, the shader wasn’t too hard to write too, but added up it was pretty bad. I accidentally left one of the push parameters in the CPU code as an int, but a float in the GPU code, which I ended up having to chase down for quite a while. The values are over the top on the image so it is more visible on the screenshot, of course I won’t leave it like this. Also, I have written a new readme for the github page. I just kinda wanted to, and thought why not?
BLOOM (post-processing effect 4) I’m almost done with all of the post-processing effects, and this was by far the hardest of them all, but I managed to push through it. I’m really proud of myself, because I finally understand Vulkan enough where I didn’t need any sort of outside help to debug this error. I think I can finally call myself someone who understands Vulkan now. Anyway, now I just need to make tonemapping and the effects are done. After that I just make the simplest pipeline to composite it all, and I’m done with that as well.
POST-PROCESSING STACK and TONEMAPPING AND COLOR GRADING (post-processing effect 5) This is the finale to the post-processing saga, because I’m finished with tonemapping and color grading. Everything will look really good and cool and whatever, altough I’ve been coding non-stop for 2.5 hours and I don’t really care to give an explanation right now. I don’t have to explain color grading everybody knows that, and tonemapping is the process of mapping the internal HDR render image to an LDR (whatever it’s called) image that the display can actually render properly, how cool is that?
This change is not too visible, but it is a major change in the engine MATERIALS Everybody who worked in any sort of 3D graphics knows what materials are. And those know, that the next step after this is lighting . This wouldn’t have been that big of a change, if not for one issue. I’m developing on linux, and every once in a while my GPU drivers uninstall themselves, so everything runs on the integrated graphics on the CPU. That happened, but I thought that the code just became really slow because I was sending 6 images to the GPU every single frame, and that slowed it down. So I spent a bunch of time making a large optimization, and it worked like a charm, it ran fast. Then I found out the entire thing was running on the CPU and I didn’t even need to optimize it. Anyway, it’s here, and it’s fast
Well well well. Seems like it’s time for LIGHTING !!!!! finally This was not easy, and yet it was made so much easier by having done it once before last year. I added support for a directional light, a dynamic (aka not hard coded, so pratically infinite amount of) point lights and spot lights, full PBR, and I also made a little handy editor to go along with it, although that’s not in the renderer that’s just in the demo project. Anyways, this was an incredible journey filled with pain and suffering like never before, and I’m so glad I’m through it all. And if this was a challenge, I don’t know what shadow mapping is going to be, which is going to be basically right now, I’m going to add tanget space normal mapping and then it’s already shadowmapping. I’m mentally unprepared, but oh well what can I do?
NORMAL MAPPING This was a really easy update, most of the shader changes were copied from my last engine, and the CPU side of things was just changing the vertex struct and loading the tangents in the mesh loading function. But it works.
SCENE LOADING I just got home from a 10 day adventure that’ll never forget, but I’m back to code, and to get myself to shake into the civilized world again I decided to do a simpler feature before shadow mapping, so I implemented full scene loading from GLTF files. It’s a pretty handy feature, I’m glad I finally made it. It doesn’t just load models and materials, but lights too, pretty handy.
SSAO (screen-space ambient occlusion) This one was fun. Ambient occlusion is just a little shadow thing at the edge of meshes. It is not realistic, technically it doesn’t exist in the real world, yet it looks so much better with it. To be honest I don’t have a lot to say about this, it’s done and it’s cool.
SKINNED MESHES AND RIGGING This renderer is extremely close to done. I just implemented fully rigged (and animated) meshes. They render properly and animations work too (although I didn’t really care enough to show an example) . Now I am at the last 2 steps of this renderer before starting work on a game in it: 1. Polish up all the API commands so it’s more user friendly. For example, skinned meshes work and can be adjusted manually, but I have a really good idea on how to make working with them super easy, so I’ll definitely implement that. 2. Make a demo that includes basically everything I have developed so far. This step also includes writing compatibility for multiple platforms, because so far I’ve only tested this project on Ubuntu, and I’ll definitely need a windows version too. And that’s it, the project is nearing it’s completion. I can’t wait to make a proper game in this, which I’ll document too of course. Also, I’m writing all of this while I’m on a vacation in Denmark, so I’m quite far from home, but I’m extremely motivated to get this project finished.
FINAL POLISHING (mostly just making the API more useable) I genuinely can’t believe this. I did it, I made a renderer in Vulkan. Well, I’m still not in the clear yet, but I’m very close. Changelog: updated Skin struct to include find_joint() function added Pose struct updated existing skinned mesh systems to work with the Pose struct added sample_clip(), compute_global_pose(), compute_skinning_matrices(), pose_set_local(), pose_set_global(), pose_get_global(), update_animation() and finalize_pose(). These are all helpers for making work with animated and rigged meshes a whole lot easier moved all of the functions inside the gvk namespace, because they were about half and half before.
THE GREAT DEBUGGING and A DEMO This is the final post as long as everything works as intended. I fixed every single validation layer error that occurred, so this project is officially bug-free (to my knowledge) . I also made a really simple demo that I uploaded to the github releases tab of the repository. I also finalized the readme, so now the project also has a fancy description. What a ride, I love this project.
I worked for over 4 hours, but the renderer finally works as a library!!! That’s right, just put it in as a git submodule, add it as a subdirectory to you CMake project, and there it is! Way too much work for something so simple, but I had to debug a whole lot of stuff. I also edited the README to feature usage instructions and also how to try the demo.
I also rewrote the single mesh gltf loading function to return the material and the entire vertex and index arrays, because I’ll need them for a feature I’m making for my game. This is slowly turning into engine development and I kinda like it.
I rewrote the texture loading part of GLTF loading because it just plain didn’t work since I updated everything to tinygltf3, but I didn’t notice because it was after the demo. Anyways, it’s done now.
I completely rewrote the text rendering in the Surface class and also fixed a giant memory leak. Here’s a picture of it in use in my game.
I wasted so much time trying to optimize it all to lead to nothing, but I did end up optimizing some stuff with the Surfaces along with actual color blending for them. I did end up optimizing a bit, but that’s basically nothing. This is the most worthless update to this entire project, I don’t even know how I spent 3 hours on this.
PIXELATION POST-PROCESSING EFFECT I made my post-processing system so expandable that I just casually added it ‘cause I thought it would look cool in the game I’m making. I’m sure as hell right about that.
I also fixed a bug where the bloom’s blur looped around to the other side of the screen.
Screen-space reflections would be a major challenge, but I learned that making the skybox reflect off of shiny surfaces is a pretty good way of making your renders seem much better. As of right now it technically works, but I came to realize that I wasn’t loading materials right, so if an image didn’t have a roughness texture, then it would end up completely shiny. I’m almost done fixing it.
SKYBOX REFLECTIONS This is a neat trick I did in my last engine and I’m happy I recreated it in this one. Every single shiny surface reflects the skybox, which while isn’t realistic, it does make those surfaces look a lot more shiny than what they actually are, which is a great hack. It sure as hell looks better in the environments I make.
FOG Yeah I just added fog because I thought it would look cool in my game. Obviously it’s over the top in this image because I wanted to show it off. I’m pretty proud of this one, definitely one of the more complex post-processing effects.
I made a few minor tweaks to fog, and I started debugging it, which I ended up completely stopping and reverting, as it was useless. To be honest I’m really trying to find where this 27 minutes appeared, because I don’t remember spending half an hour on this
Ships:
GVK (short for gungu vulkan) is my new renderer using the Vulkan graphics api. I miss the times when I worked with pygame and love2d, where rendering an image was one simple line of code, and I intend to bring that experience to 3D with this project. Everything is designed to be as easy as possible for the user, just writes gvk::draw_mesh(mesh, material, position, scale, rotation); and the mesh is where you want it, how you want it. But don’t mistake it, this is not a game engine, this is just a renderer, something you can build an engine on. I made this tool so my later projects have a graphical backbone to build on, but every game needs a different engine. Ever since I started graphics programming last year I knew that one day I had to learn Vulkan if I ever wanted a job in it in the future, and I’m very proud of myself for finally doing it. This was the greatest challenge I faced in programming so far, and I so glad I tackled it. And as for AI: This project was created so I could learn Vulkan, and if I copied everything from AI that would have been to effective. My goal was to use as little AI as I could, while still leaving out the headaches of development. Here’s what I used AI for: Many of the shaders were written by AI, but that’s because I haven’t learned any of the maths I need to know to write any of these shader. When a shader wasn’t too math heavy I wrote it myself, but there weren’t too many of those. The GLTF loading isn’t hard, it’s just a headache to work with it. GLTF is a horrible format for developers, but it’s the best I knew, so I rather had AI write the GLTF loading functions. I’m still glad I did that, I would have learned nothing from writing those.
This is the second ship of my game engine / renderer. To explain, I like calling it a renderer instead of a game engine, because I purposefully tried to add as few bloat features as I could, I just wanted something that made rendering something that I don’t have to think about. More info on the README page, this isn’t a good explanation. Just know that it isn’t just a basic Vulkan abstraction, this is a full renderer with PBR, many post-processing effects, skyboxes, dynamic lights, rigged and animated meshes and frustrum culling ’cause why not. Changelog since the last ship: 2 new post-processing effects, pixelation and fog I also added a feature where shiny objects reflect the skybox, which isn’t realistic, but it adds a great sense of realism and I like to add it to my games. one of the largest changes was turning this into an actual library instead of an executable, which allows easier integration. I also made a full game as a tech demo for this project, it can be found at this link or under my stardance profile. It turned out really well, and I’m proud of myself, because I finally made a game engine that I can actually make games in easily. (The screenshot is from the game) and the smallest but still a significant change was rewriting the entire 2D rendering part of the engine for 2 reasons: it had a memory leak, and text rendering was buggy, slow and barely worked....
|
1792993753.995224
|
1793080153.995224
|
|
50955
|
THE LAST DIG by @MuhammadAayanMirza | Stardance
|
MuhammadAayanMirza
|
1
|
68.0
|
1009
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T11:16:35Z", "hours": 68.0, "multiplier": 12.37, "payout": 1009, "blessing": "neutral", "text": "This Is the first ever 2D Game I made, a digging game where the player’s objective is to dig to the bottom of the world. There is an inbuilt starting Tutorial in the game which explains the basics of it. There is a battery feature for the jetpack which helps you to come up to the base which is the cobble floor, if the battery is completely depleted you die and all the minerals in your inventory get destroyed. Currently the game only goes till the iron mineral layer and after that it is empty so that I can expand on it in the next ship of this game. (This is only the first version and it is not fully complete yet) Have fun playing it!!", "repo": "https://github.com/MuhammadAayanMirza/A-Game-about-digging", "demo": "https://muhammadaayanmirza.itch.io/the-last-dig"}]...
|
[{"post_id": 71141, "ts": "202 [{"post_id": 71141, "ts": "2026-09-20T10:49:22Z", "hours": 1.735, "text": "Added the Readme.md file in the game’s repository and did some final changes including an hour long hunt on why the sounds weren’t working in the itch.io page when publishing the game, that is fixed now. The game is ready to be shipped!! (This is the first version of course)"}, {"post_id": 70998, "ts": "2026-09-20T05:44:54Z", "hours": 1.3831, "text": "Completed adding all the sound effects and running them through code. Also made changes to the colour and positioning of the tutorial text. Now when you dig a tile the background colour is no longer the sky colour it is a solid dark grey so you can distinguish between the dug up area and undug area easily. Also added a story scene so you know what the goal is in the game. The First Version of the game is complete now. I just need to create a readme file and Build the game so that it can uploaded online! See you soon :)"}, {"post_id": 69208, "ts": "2026-09-16T16:27:16Z", "hours": 3.3253, "text": "We are so back!! The Title Screen went through some changes but it is this newish display now. Major thing this session is that I added sound effects!! I had never added sound effects to a game before so this was a huge learning curve especially with linking the sound to the animation and stuff. Also finding a sound you like is very time consuming. I think I’m very close to shipping the firs version of the game. I don’t think I’ll be able to complete this game for Stardance because I have the SAT exam soon so yeah… I hope you guys will still like the completist version of this."}, {"post_id": 67148, "ts": "2026-09-13T06:42:50Z", "hours": 2.7692, "text": "In this session I completed making the interactive tutorial for the starting of the game. It tells you how to move, dig up dirt, collect coal, and use the shop to sell minerals and buy upgrades. Also created the Title Screen for the game."}, {"post_id": 66505, "ts": "2026-09-12T10:42:22Z", "hours": 3.2131, "text": "Alot of stuff happened in this session; I went back and forth on the background alot and settled on this new background with some trees and bushes with no secondary sky colour behind it, I play tested the game to see that all the code is running smoothly, made some bullet points for what I want to add before the first ship and now I’m currently working on an Interactive starting tutorial for the game."}, {"post_id": 63532, "ts": "2026-09-07T13:25:51Z", "hours": 1.3167, "text": "Working on the background art of the game, added some trees which took ages to make them look good. I hope they are unto the standard of the game theme."}, {"post_id": 62921, "ts": "2026-09-06T13:42:40Z", "hours": 1.9444, "text": "Added the Iron tile!!! I know it doesn’t look the best but I think you can cut me some slack as this is still my first 2D Game. the iron tile is worth “15M” coins so you can use it to refill your battery or save up more to consume the coins in the upgrades section. The sell button sells all the minerals (coal and iron) together. Now you can upgrade everything quicker!! yayayayay. What should I add next? Secret dungeon fight under the Iron ores? Sound fx? more Ores? Better Sky? Interactive starting tutorial? Starting Lore Animation?"}, {"post_id": 62720, "ts": "2026-09-06T06:54:26Z", "hours": 2.4569, "text": "Created a Battery Refill button so that you can refill your battery bar when you are running low on it. It is “15M” right now which Is half the price of the first upgrade so you have to contemplate if you wanna dig more for the upgrade or just keep refilling the battery. Also working on a new mineral for the game, the iron tile."}, {"post_id": 62245, "ts": "2026-09-05T14:50:16Z", "hours": 4.2864, "text": "Alot has happened since the last devlog… The upgrades screen now tells you what happens when you upgrade an item to its next form. This took alot of time to figure out the code for but in the end it worked out! :D The Battery drainage icon has been slightly updated and now when you upgrade the battery feature the battery refills to full battery and the inventory now has a “full inventory” pop up screen whenever you mine a mineral and your inventory is already full so it doesn’t count that mineral so it is basically destroyed. Worked on art aswell for the background which I’m still not happy about but at least the upgrades section is complete for the first ship!!"}, {"post_id": 61963, "ts": "2026-09-05T04:45:56Z", "hours": 0.9844, "text": "The Battery feature now has a UI display to visualise how much battery you have left. It is present at the bottom left of the game screen and it is upgradable in the shop as well just like before. Very Fun!! No I think I’ll work on the inventory feature to set a limit to it and then make that upgradable aswell!!"}, {"post_id": 61615, "ts": "2026-09-04T16:27:01Z", "hours": 1.4547, "text": "There is a battery feature now in the game and when you are using the jetpack for too long your battery runs out and you “die” which means you lose all the minerals that were in your inventory but your coins balance remains the same. The Battery is also upgradable in the shop with your coins. A battery ui bar will come soon…"}, {"post_id": 60278, "ts": "2026-09-02T15:30:17Z", "hours": 1.2728, "text": "The jetpack function now has an animation whenever you are using it. Fully upgradable through the shop. Though it doesn’t have separate animations for the jetpack yet. I am trying to leave the less important artwork towards the end of the project now so then I’ll only work on aesthetic like background and polishing sprites for in game animation."}, {"post_id": 59576, "ts": "2026-09-01T14:05:23Z", "hours": 2.5778, "text": "There is an upgradable jetpack feature in the game now!! Which was an extremely hard job to pull off because the initial version of it had a million bugs. Because I want there to be zero gravity on the cobble tiles so it is like the base platform and the jetpack doesn’t work there and when the player gets near the ground/dirt tiles gravity should apply so the player falls downwards after digging but when any up keys (up arrow, W key or Spacebar) are pressed it should drop back to zero gravity so the player can use the jetpack to go back up to the “home” cobble tiles. This took so long to make it usable and I’m quite happy with it. Just have to make the actual jetpack item now."}, {"post_id": 58133, "ts": "2026-08-30T14:20:32Z", "hours": 1.7342, "text": "Still working on the sky, mainly the bottom terrain now. And also adjusting alot of tiles in unity. I also made the camera boundary (the place where the camera stops following the player) a bit smaller because I don’t think I wanna make that big of a game. This is supposed to be a fun game which you can come back to and have a mission to complete."}, {"post_id": 57892, "ts": "2026-08-30T06:48:28Z", "hours": 2.9675, "text": "New Sky in the game now!! Still trying to add more things to it so stay tuned for that. Also fixed a major bug in the upgrades digging script for the shovel as it would only dig up one block instead of four if it is upgraded because it only detected tiles to the right of it and if they were already dug up it would appear as though the upgrade didn’t work and only one block has been dug."}, {"post_id": 57094, "ts": "2026-08-29T05:55:44Z", "hours": 1.9014, "text": "The Shop is now in the game!!! and it is fully functional. Now when you mine a coal tile the newly added GameManager tracks it and updates your total coal count which then you can sell to get 10M per Coal and upgrade your shovel. First upgrade costs 50M and the upgrade button works aswell, first upgrade increases the dig size from 1x1 –> 2x2. Now the game is an actually playable game where your objective could be to get rid of a whole area and make it easier for your self by getting upgrades. But that is not the game I’m making, I’ll make it a bit more fun than that. Your Goal will be to dig to the bottom to find Secret Treasure…more on that later!!"}, {"post_id": 56589, "ts": "2026-08-28T12:25:34Z", "hours": 1.2194, "text": "Coal Mineral is now in the game. Made three different sprite styles of the coal so it doesn’t look repititive I know the placement of coal looks a bit cluttered right now. I’m still experimenting with them. I’m currently going to be working on the script to count how many coal ‘tiles’ have been dug up so you can sell em in the shop. Hope you like this!"}, {"post_id": 55532, "ts": "2026-08-27T13:22:04Z", "hours": 1.6694, "text": "The upgrade button for the Shovel works now!! It has 4 upgrades and the tile dig size increases on each upgrade. Also made the player flip alongside its animation if they dig a tile which is on their opposite side which is pretty cool to me. There is new grass on the intersection of the cobble floor and ground tiles. The game is pretty fun to play if you just like to dig dirt, I know that sounds weird but just getting a rid of an area and upgrading your shovel is pretty fun in itself."}, {"post_id": 55033, "ts": "2026-08-26T13:47:27Z", "hours": 2.6097, "text": "Added the Shovel item finally took way too long for this to finally come even though it’s a digging game. Now when the player is near the dirt/undergroundtiles a shovel item pops up in the hand of the player and when you click the tile you want to dig a nice little animation plays of the player digging the tile!! (Getting this animation to work was very stressful at one point it broke my movements script somehow, but all is well that ends well)"}, {"post_id": 54905, "ts": "2026-08-26T03:59:01Z", "hours": 2.2394, "text": "New Sky!! The sky has a Sun and plenty of clouds to make the game look and feel nice to play. Also worked in the Upgrades Menu a bit to make the buttons working, still working on that. Hopefully its not that hard."}, {"post_id": 54432, "ts": "2026-08-25T13:21:57Z", "hours": 1.5167, "text": "I think the Upgrades Menu is now aesthetically complete with all the essential items I want upgraded for the game and I like the colour combination and layout of it aswell. I’m quite happy with it now, but I’m always open to suggestions! Now time to finally make it functional."}, {"post_id": 53830, "ts": "2026-08-24T15:05:49Z", "hours": 0.8, "text": "Still upgrading the Upgrades Menu. Added a new Font, Spaces between how many times you can upgrade the item and a money “button” next to it to buy the upgrade. Still not functional as I haven’t opened VisualStudio Code yet, I’m not the best with code so I thought getting the visuals down first would be a good idea. Do you guys like it??"}, {"post_id": 53763, "ts": "2026-08-24T13:22:54Z", "hours": 0.8, "text": "New Upgrades Menu!!! I like this design way better, still need to add actual buttons and functionality into this but now I feel better about the game. Hopefully you all like it aswell!"}, {"post_id": 53685, "ts": "2026-08-24T11:14:34Z", "hours": 2.38, "text": "Working on the Upgrades menu at the moment. Also now when you move left the player actually changes direction which is cool and I adjusted the animations and speed of them a bit. I really want this game to feel good and look good as presentation and gameplay both matter alot. Currently I’m not really happy with the Upgrades Menu so, I’m gonna try make it way better."}, {"post_id": 53070, "ts": "2026-08-23T14:02:38Z", "hours": 1.8325, "text": "Learned animation for the first time in unity! And it takes a whole lot of time when you are making all the animation sprites yourself. Added the idle animation and movement animation as of now. I added the movement animation code to the PlayerMovements script so that it only appears when you are moving left or right."}, {"post_id": 52916, "ts": "2026-08-23T09:18:54Z", "hours": 0.9167, "text": "The player sprite is finally a normal player!! Now all the rigid body, collider and scripts are on this new player. Some minor adjustments were also made to the cobble floor. Now I have to make the game actually fun to play and the background look cool aswell. What would you like to see in this game? It is a digging game."}, {"post_id": 52851, "ts": "2026-08-23T06:42:13Z", "hours": 1.5167, "text": "Changed the tile set again because I wasn’t fond of em, if I want to make a good game I need to pay attention to every detail. Also changed the background, I’m gonna make it better soon! I want the game to have a summer vibe, that’s why I changed everything except the house. The house is cool :D"}, {"post_id": 52519, "ts": "2026-08-22T17:43:38Z", "hours": 1.8044, "text": "Made the player sprite finally, I still don’t like it that much but it is a start! I also tweaked the upgrades Canvas a bit. I’m a bit roadblocked for the scripts of the upgrades but I hope I can do that."}, {"post_id": 52265, "ts": "2026-08-22T11:26:13Z", "hours": 1.6456, "text": "Added an Upgrades Canavs UI with two options for now, Shovel and Jetpack upgrades, I’m yet to make the buttons for them. Also made a script so that this Canvas only pops up when you are in contact with the house. The house now serves a functional purpose!! made the shovel and jetpack pixel art myself and I think they look quite good."}, {"post_id": 52158, "ts": "2026-08-22T07:55:31Z", "hours": 1.9897, "text": "Added a whole jump feature in the game after a lot of iterations because I am still new to coding and C# but after everything worked, I decided to remove the whole feature because I want a jetpack which you can upgrade using coins by digging up minerals. So now when you press Spacebar it feels like you are using a very slow jetpack."}, {"post_id": 52091, "ts": "2026-08-22T05:04:11Z", "hours": 1.1686, "text": "Created a script for changing gravity between tiles as I want the player to move freely in the cobble area as it is the base area ‘home camp” If you will and whenever the player goes to dig a block of dirt the gravity changes so that the player falls in the hole they dug. I also messed around with the lighting setting and changes the background colour, It’s not the final colour yet. This session was more about game mechanics than art."}, {"post_id": 52055, "ts": "2026-08-22T03:05:19Z", "hours": 2.0786, "text": "I made a new house because I don’t think the old one fit the theme, I think this looks way cleaner, I also changed the colours of the cobblestone floor to match the ew house’s stone colour. This session was very aesthetic based and I think that is gonna be the theme for the starting few devlogs. The dirt and grass look weird to me now, do you guys think it’s weird too?"}, {"post_id": 51744, "ts": "2026-08-21T15:59:51Z", "hours": 3.1611, "text": "Made the Ground tiles, with alot of iteration because the pixels looked too small in unity. I made separate tilemaps for each layer and added the ground layer to the digging script of the player which is still a basic capsule (Will work on making it a sprite soon). I have to now make ores and make them a separate special tile map which when dug up are counted so they can be used to be sold in the shop that I will make."}, {"post_id": 51077, "ts": "2026-08-20T15:43:04Z", "hours": 2.1114, "text": "In this session I started making the core game concept in unity and used the tile system for the first time as this is my first ever 2D game!! I added the most important C# scripts in the game, the movement script and the tile remover script as this is a digging game. Next up, I’m gonna focus a bit on aesthetics and then back to coding."}, {"post_id": 50353, "ts": "2026-08-19T15:08:37Z", "hours": 1.2167, "text": "New Game Alert 🚨!! This new game Is inspired from the 3D game “A game about digging a hole” but I’m making it 2D with all my own sprites and scripts and I started with the Hut/House where you go upgrade your digging tool, e.t.c. Keep in mind this is my very first time creating a Sprite, Hope you guys like it!"}]...
|
Title: THE LAST DIG by @MuhammadAayanMirza | Stard Title: THE LAST DIG by @MuhammadAayanMirza | Stardance
Devlogs:
New Game Alert 🚨!! This new game Is inspired from the 3D game “A game about digging a hole” but I’m making it 2D with all my own sprites and scripts and I started with the Hut/House where you go upgrade your digging tool, e.t.c. Keep in mind this is my very first time creating a Sprite, Hope you guys like it!
In this session I started making the core game concept in unity and used the tile system for the first time as this is my first ever 2D game!! I added the most important C# scripts in the game, the movement script and the tile remover script as this is a digging game. Next up, I’m gonna focus a bit on aesthetics and then back to coding.
Made the Ground tiles, with alot of iteration because the pixels looked too small in unity. I made separate tilemaps for each layer and added the ground layer to the digging script of the player which is still a basic capsule (Will work on making it a sprite soon). I have to now make ores and make them a separate special tile map which when dug up are counted so they can be used to be sold in the shop that I will make.
I made a new house because I don’t think the old one fit the theme, I think this looks way cleaner, I also changed the colours of the cobblestone floor to match the ew house’s stone colour. This session was very aesthetic based and I think that is gonna be the theme for the starting few devlogs. The dirt and grass look weird to me now, do you guys think it’s weird too?
Created a script for changing gravity between tiles as I want the player to move freely in the cobble area as it is the base area ‘home camp” If you will and whenever the player goes to dig a block of dirt the gravity changes so that the player falls in the hole they dug. I also messed around with the lighting setting and changes the background colour, It’s not the final colour yet. This session was more about game mechanics than art.
Added a whole jump feature in the game after a lot of iterations because I am still new to coding and C# but after everything worked, I decided to remove the whole feature because I want a jetpack which you can upgrade using coins by digging up minerals. So now when you press Spacebar it feels like you are using a very slow jetpack.
Added an Upgrades Canavs UI with two options for now, Shovel and Jetpack upgrades, I’m yet to make the buttons for them. Also made a script so that this Canvas only pops up when you are in contact with the house. The house now serves a functional purpose!! made the shovel and jetpack pixel art myself and I think they look quite good.
Made the player sprite finally, I still don’t like it that much but it is a start! I also tweaked the upgrades Canvas a bit. I’m a bit roadblocked for the scripts of the upgrades but I hope I can do that.
Changed the tile set again because I wasn’t fond of em, if I want to make a good game I need to pay attention to every detail. Also changed the background, I’m gonna make it better soon! I want the game to have a summer vibe, that’s why I changed everything except the house. The house is cool :D
The player sprite is finally a normal player!! Now all the rigid body, collider and scripts are on this new player. Some minor adjustments were also made to the cobble floor. Now I have to make the game actually fun to play and the background look cool aswell. What would you like to see in this game? It is a digging game.
Learned animation for the first time in unity! And it takes a whole lot of time when you are making all the animation sprites yourself. Added the idle animation and movement animation as of now. I added the movement animation code to the PlayerMovements script so that it only appears when you are moving left or right.
Working on the Upgrades menu at the moment. Also now when you move left the player actually changes direction which is cool and I adjusted the animations and speed of them a bit. I really want this game to feel good and look good as presentation and gameplay both matter alot. Currently I’m not really happy with the Upgrades Menu so, I’m gonna try make it way better.
New Upgrades Menu!!! I like this design way better, still need to add actual buttons and functionality into this but now I feel better about the game. Hopefully you all like it aswell!
Still upgrading the Upgrades Menu. Added a new Font, Spaces between how many times you can upgrade the item and a money “button” next to it to buy the upgrade. Still not functional as I haven’t opened VisualStudio Code yet, I’m not the best with code so I thought getting the visuals down first would be a good idea. Do you guys like it??
I think the Upgrades Menu is now aesthetically complete with all the essential items I want upgraded for the game and I like the colour combination and layout of it aswell. I’m quite happy with it now, but I’m always open to suggestions! Now time to finally make it functional.
New Sky!! The sky has a Sun and plenty of clouds to make the game look and feel nice to play. Also worked in the Upgrades Menu a bit to make the buttons working, still working on that. Hopefully its not that hard.
Added the Shovel item finally took way too long for this to finally come even though it’s a digging game. Now when the player is near the dirt/undergroundtiles a shovel item pops up in the hand of the player and when you click the tile you want to dig a nice little animation plays of the player digging the tile!! (Getting this animation to work was very stressful at one point it broke my movements script somehow, but all is well that ends well)
The upgrade button for the Shovel works now!! It has 4 upgrades and the tile dig size increases on each upgrade. Also made the player flip alongside its animation if they dig a tile which is on their opposite side which is pretty cool to me. There is new grass on the intersection of the cobble floor and ground tiles. The game is pretty fun to play if you just like to dig dirt, I know that sounds weird but just getting a rid of an area and upgrading your shovel is pretty fun in itself.
Coal Mineral is now in the game. Made three different sprite styles of the coal so it doesn’t look repititive I know the placement of coal looks a bit cluttered right now. I’m still experimenting with them. I’m currently going to be working on the script to count how many coal ‘tiles’ have been dug up so you can sell em in the shop. Hope you like this!
The Shop is now in the game!!! and it is fully functional. Now when you mine a coal tile the newly added GameManager tracks it and updates your total coal count which then you can sell to get 10M per Coal and upgrade your shovel. First upgrade costs 50M and the upgrade button works aswell, first upgrade increases the dig size from 1x1 –> 2x2. Now the game is an actually playable game where your objective could be to get rid of a whole area and make it easier for your self by getting upgrades. But that is not the game I’m making, I’ll make it a bit more fun than that. Your Goal will be to dig to the bottom to find Secret Treasure…more on that later!!
New Sky in the game now!! Still trying to add more things to it so stay tuned for that. Also fixed a major bug in the upgrades digging script for the shovel as it would only dig up one block instead of four if it is upgraded because it only detected tiles to the right of it and if they were already dug up it would appear as though the upgrade didn’t work and only one block has been dug.
Still working on the sky, mainly the bottom terrain now. And also adjusting alot of tiles in unity. I also made the camera boundary (the place where the camera stops following the player) a bit smaller because I don’t think I wanna make that big of a game. This is supposed to be a fun game which you can come back to and have a mission to complete.
There is an upgradable jetpack feature in the game now!! Which was an extremely hard job to pull off because the initial version of it had a million bugs. Because I want there to be zero gravity on the cobble tiles so it is like the base platform and the jetpack doesn’t work there and when the player gets near the ground/dirt tiles gravity should apply so the player falls downwards after digging but when any up keys (up arrow, W key or Spacebar) are pressed it should drop back to zero gravity so the player can use the jetpack to go back up to the “home” cobble tiles. This took so long to make it usable and I’m quite happy with it. Just have to make the actual jetpack item now.
The jetpack function now has an animation whenever you are using it. Fully upgradable through the shop. Though it doesn’t have separate animations for the jetpack yet. I am trying to leave the less important artwork towards the end of the project now so then I’ll only work on aesthetic like background and polishing sprites for in game animation.
There is a battery feature now in the game and when you are using the jetpack for too long your battery runs out and you “die” which means you lose all the minerals that were in your inventory but your coins balance remains the same. The Battery is also upgradable in the shop with your coins. A battery ui bar will come soon…
The Battery feature now has a UI display to visualise how much battery you have left. It is present at the bottom left of the game screen and it is upgradable in the shop as well just like before. Very Fun!! No I think I’ll work on the inventory feature to set a limit to it and then make that upgradable aswell!!
Alot has happened since the last devlog… The upgrades screen now tells you what happens when you upgrade an item to its next form. This took alot of time to figure out the code for but in the end it worked out! :D The Battery drainage icon has been slightly updated and now when you upgrade the battery feature the battery refills to full battery and the inventory now has a “full inventory” pop up screen whenever you mine a mineral and your inventory is already full so it doesn’t count that mineral so it is basically destroyed. Worked on art aswell for the background which I’m still not happy about but at least the upgrades section is complete for the first ship!!
Created a Battery Refill button so that you can refill your battery bar when you are running low on it. It is “15M” right now which Is half the price of the first upgrade so you have to contemplate if you wanna dig more for the upgrade or just keep refilling the battery. Also working on a new mineral for the game, the iron tile.
Added the Iron tile!!! I know it doesn’t look the best but I think you can cut me some slack as this is still my first 2D Game. the iron tile is worth “15M” coins so you can use it to refill your battery or save up more to consume the coins in the upgrades section. The sell button sells all the minerals (coal and iron) together. Now you can upgrade everything quicker!! yayayayay. What should I add next? Secret dungeon fight under the Iron ores? Sound fx? more Ores? Better Sky? Interactive starting tutorial? Starting Lore Animation?
Working on the background art of the game, added some trees which took ages to make them look good. I hope they are unto the standard of the game theme.
Alot of stuff happened in this session; I went back and forth on the background alot and settled on this new background with some trees and bushes with no secondary sky colour behind it, I play tested the game to see that all the code is running smoothly, made some bullet points for what I want to add before the first ship and now I’m currently working on an Interactive starting tutorial for the game.
In this session I completed making the interactive tutorial for the starting of the game. It tells you how to move, dig up dirt, collect coal, and use the shop to sell minerals and buy upgrades. Also created the Title Screen for the game.
We are so back!! The Title Screen went through some changes but it is this newish display now. Major thing this session is that I added sound effects!! I had never added sound effects to a game before so this was a huge learning curve especially with linking the sound to the animation and stuff. Also finding a sound you like is very time consuming. I think I’m very close to shipping the firs version of the game. I don’t think I’ll be able to complete this game for Stardance because I have the SAT exam soon so yeah… I hope you guys will still like the completist version of this.
Completed adding all the sound effects and running them through code. Also made changes to the colour and positioning of the tutorial text. Now when you dig a tile the background colour is no longer the sky colour it is a solid dark grey so you can distinguish between the dug up area and undug area easily. Also added a story scene so you know what the goal is in the game. The First Version of the game is complete now. I just need to create a readme file and Build the game so that it can uploaded online! See you soon :)
Added the Readme.md file in the game’s repository and did some final changes including an hour long hunt on why the sounds weren’t working in the itch.io page when publishing the game, that is fixed now. The game is ready to be shipped!! (This is the first version of course)
Ships:
This Is the first ever 2D Game I made, a digging game where the player’s objective is to dig to the bottom of the world. There is an inbuilt starting Tutorial in the game which explains the basics of it. There is a battery feature for the jetpack which helps you to come up to the base which is the cobble floor, if the battery is completely depleted you die and all the minerals in your inventory get destroyed. Currently the game only goes till the iron mineral layer and after that it is empty so that I can expand on it in the next ship of this game. (This is only the first version and it is not fully complete yet) Have fun playing it!!...
|
1792853674.3154643
|
1792940074.3154643
|
|
1236
|
Fuddi AI by @unonown97 | Stardance
|
unonown97
|
1
|
64.0
|
1003
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-13T16:30:40Z", "hours": 64.0, "multiplier": 16.63, "payout": 1003, "blessing": "neutral", "text": "A sleek, privacy-first multi-model chat interface that runs entirely in your browser. Connects to dozens of AI models through a lightweight local proxy your API keys never leave your machine. so while deploying i encountered multiple issues and but the web helped me thankfully and also the costing doesnt work at all as of now and is something i will be fixing in the future :). g’day", "repo": "https://github.com/Miroredrpo/ai-chat-app", "demo": "https://fuddigai.vercel.app/"}]...
|
[{"post_id": 8139, "ts": "2026 [{"post_id": 8139, "ts": "2026-06-13T16:10:05Z", "hours": 0.7906, "text": "tried deploying to vercel but it didnt work tweaked some things in the server.js but reading online i foundout that i will need to make another folder for it to function properly so am doing that rn :)"}, {"post_id": 8102, "ts": "2026-06-13T14:58:43Z", "hours": 5.0, "text": "added an option to export and import all the things into a JSON, also an option to clear all the conversations, and remove all the API keys as now it has option to add multiple API keys, all the things are pretty much done so i think i will just do some finishing changes and ship it for the first time"}, {"post_id": 7843, "ts": "2026-06-13T02:35:10Z", "hours": 3.5333, "text": "added the prompting tab where specific instructions can be written and also completed the interface tab where one can toggle things like auto title generation and stuff am goging to add support for multiple api keys next and also an export/import chats and settings feutesrs that exports everthing, so when the local storage is full one can export and save there chat and import thhem later on"}, {"post_id": 6831, "ts": "2026-06-11T13:40:44Z", "hours": 5.4056, "text": "added option to pin the chat, edit the title manually, duplicate the chat and delete it also added fast delete which when shift is held while deletion it doesnt ask for conformation and directly deletes the chat, also added all the paraments accepted as far as i am aware of, added a default system prompt and i will also be making another tab specifically for prompts, also added dynamic size of the chat where the font size can be changed from the setting menu it self"}, {"post_id": 6076, "ts": "2026-06-10T06:43:41Z", "hours": 0.6, "text": "So… i tried using AI to do some visual changes only for it to completely messup the layout and populate the root directory with random js and css files saying these are the new ones and have the same logic and makes the app better but it did not do any of that, i reverted it to how it was i dont know if that counts to AI useage but i will still be putting the incident in the details of the project"}, {"post_id": 5753, "ts": "2026-06-09T17:31:13Z", "hours": 0.9672, "text": "when an API is enterd made a test endpoint so it tests if the API is correct or not and tells it also initialized the js logic for the thinking mode max tokens, temperature, max tokens (entire chat), and a default system prompt, also am thinking about adding a dedicated tab in the settings panel for prompts and all"}, {"post_id": 5606, "ts": "2026-06-09T13:51:25Z", "hours": 8.4333, "text": "completed the toasts, added web search functionality, added chat deletion, also populated the empty state with some prompts, added an option to choose if one wants to generate the title automatically or not in a new settings tab “interface” where the size of fonts, theme, etc can me changed, am goging to add things like temperature , maxtokens, thinking budget and all next"}, {"post_id": 5329, "ts": "2026-06-09T02:01:33Z", "hours": 1.2681, "text": "added a shortcuts tab that tells the users about the keybinds, also made the initial frame for toasts, also added a last refreshed time on the models tab and reload again button that again fetches it from the HCAI API"}, {"post_id": 4902, "ts": "2026-06-08T14:08:23Z", "hours": 10.1728, "text": "added empty state also added thinking mode where it sends the api with an extra parameter and enables the thinking mode if the model has the ability to do it, i also added some keybinds such as when ctrl + Shift + T is pressed thinkning mode is enabled, Ctrl+N opens new chat etc it is also confiured for mac instead of ctrl in mac we can use cmd, in the settings tab i have also added a dropdown menu to select a separate title generation model"}, {"post_id": 4073, "ts": "2026-06-07T08:25:09Z", "hours": 8.1322, "text": "i made it so that the model can be changed and accessed from the chat it self and change it as per the user intent, i also added a details panel showing thw models capabilities and its pricing and its abilities like if it can web search or not or if it has thinking mode etc. also now in the settings panel you can select the default model to be used when a new chant is opened and it is stored in the local storage similar to how the chat is stored"}, {"post_id": 3276, "ts": "2026-06-06T04:04:02Z", "hours": 12.3142, "text": "I have added a model selector now which pulls the models from https://ai.hackclub.com/proxy/v1/models although it has not been properly configures i will be making it so that there will be an option for a title generation model in the settings as well i have also added a side bar where previos chats can be accessed, up next: i will be adding a details panel that will allow one to veiw the context cost and provider, modelname, etc of the selected model, i will also be adding the feature to attach images and all, i have also made it responsive in this past time frame not entirely but i have made it fairly useable i will also be making it more mobile friendly"}, {"post_id": 1933, "ts": "2026-06-04T05:33:12Z", "hours": 2.745, "text": "implemented dark mode made layout cleaner added option to set base url, also made it so that the API gets saved in the local storage for future reload"}, {"post_id": 1603, "ts": "2026-06-03T18:49:52Z", "hours": 2.9808, "text": "made the layout better with buttons outlins and made a floating settings panel to input the HCAI API key into so that AI models can be accessed later, next changes: shift layout, figureout server calls and add more functionality also add dark mode :)"}, {"post_id": 269, "ts": "2026-06-01T14:20:29Z", "hours": 1.355, "text": "i am making an custom interface where one can bring their HCAI API key and talk to various LLM’s"}]...
|
Title: Fuddi AI by @unonown97 | Stardance
Devlogs Title: Fuddi AI by @unonown97 | Stardance
Devlogs:
i am making an custom interface where one can bring their HCAI API key and talk to various LLM’s
made the layout better with buttons outlins and made a floating settings panel to input the HCAI API key into so that AI models can be accessed later, next changes: shift layout, figureout server calls and add more functionality also add dark mode :)
implemented dark mode made layout cleaner added option to set base url, also made it so that the API gets saved in the local storage for future reload
I have added a model selector now which pulls the models from https://ai.hackclub.com/proxy/v1/models although it has not been properly configures i will be making it so that there will be an option for a title generation model in the settings as well i have also added a side bar where previos chats can be accessed, up next: i will be adding a details panel that will allow one to veiw the context cost and provider, modelname, etc of the selected model, i will also be adding the feature to attach images and all, i have also made it responsive in this past time frame not entirely but i have made it fairly useable i will also be making it more mobile friendly
i made it so that the model can be changed and accessed from the chat it self and change it as per the user intent, i also added a details panel showing thw models capabilities and its pricing and its abilities like if it can web search or not or if it has thinking mode etc. also now in the settings panel you can select the default model to be used when a new chant is opened and it is stored in the local storage similar to how the chat is stored
added empty state also added thinking mode where it sends the api with an extra parameter and enables the thinking mode if the model has the ability to do it, i also added some keybinds such as when ctrl + Shift + T is pressed thinkning mode is enabled, Ctrl+N opens new chat etc it is also confiured for mac instead of ctrl in mac we can use cmd, in the settings tab i have also added a dropdown menu to select a separate title generation model
added a shortcuts tab that tells the users about the keybinds, also made the initial frame for toasts, also added a last refreshed time on the models tab and reload again button that again fetches it from the HCAI API
completed the toasts, added web search functionality, added chat deletion, also populated the empty state with some prompts, added an option to choose if one wants to generate the title automatically or not in a new settings tab “interface” where the size of fonts, theme, etc can me changed, am goging to add things like temperature , maxtokens, thinking budget and all next
when an API is enterd made a test endpoint so it tests if the API is correct or not and tells it also initialized the js logic for the thinking mode max tokens, temperature, max tokens (entire chat), and a default system prompt, also am thinking about adding a dedicated tab in the settings panel for prompts and all
So… i tried using AI to do some visual changes only for it to completely messup the layout and populate the root directory with random js and css files saying these are the new ones and have the same logic and makes the app better but it did not do any of that, i reverted it to how it was i dont know if that counts to AI useage but i will still be putting the incident in the details of the project
added option to pin the chat, edit the title manually, duplicate the chat and delete it also added fast delete which when shift is held while deletion it doesnt ask for conformation and directly deletes the chat, also added all the paraments accepted as far as i am aware of, added a default system prompt and i will also be making another tab specifically for prompts, also added dynamic size of the chat where the font size can be changed from the setting menu it self
added the prompting tab where specific instructions can be written and also completed the interface tab where one can toggle things like auto title generation and stuff am goging to add support for multiple api keys next and also an export/import chats and settings feutesrs that exports everthing, so when the local storage is full one can export and save there chat and import thhem later on
added an option to export and import all the things into a JSON, also an option to clear all the conversations, and remove all the API keys as now it has option to add multiple API keys, all the things are pretty much done so i think i will just do some finishing changes and ship it for the first time
tried deploying to vercel but it didnt work tweaked some things in the server.js but reading online i foundout that i will need to make another folder for it to function properly so am doing that rn :)
Ships:
A sleek, privacy-first multi-model chat interface that runs entirely in your browser. Connects to dozens of AI models through a lightweight local proxy your API keys never leave your machine. so while deploying i encountered multiple issues and but the web helped me thankfully and also the costing doesnt work at all as of now and is something i will be fixing in the future :). g’day...
|
1792878545.9104006
|
1793742545.9104006
|
|
41201
|
IsaacOS by @slecesama | Stardance
|
slecesama
|
2
|
64.0
|
1003
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T15:42:20Z", "hours": 58.0, "multiplier": 17.35, "payout": 1003, "blessing": "neutral", "text": "i made the webOS actually functional, with apps that have some utility or functionality (such as the compendium app, my beloved wiki app) and not just the same old stuff such as calculators and notes. tbh i maybe made so many apps that there are 3 columns and covers a part of the desktop, so for that reason i made folders! for the new apps that i made, some of them were actually out of my reach of skills of programming so i had to learn some stuff or use AI for the most complicated stuff, but other than that i would say this project has actually made me re-gain the will of coding that i lost. there are a lot of features that tbh i were to list them all it would take a lot but the thing i focused the most on this project were: making the compendium app an actual useful app that i use regularly when playing the game, and the customization of the os using the themes app. i rlly liked building those two and were the most fun and also challenging part of the whole project. so please try changing stuff in the themes app and make it cool ;) and also use the blue map on the topbar to change the layour of the desktop and tell me which one u like more! i hope u’ll have fun using it and for isaac players, tell me what u would like to change and try the compendium app", "repo": "https://github.com/pickledroided/webbandola", "demo": "https://pickledroided.github.io/webbandola/"}, {"ship_num": 2, "ts": "2026-08-03T13:50:28Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Welcome to IsaacOS! this is a very cool OS based on the binding of isaac (i am playing it so much rn) which has minimal but essential apps right now but will have many and many more in the future. i made it using only html, css and js and honestly i think it looks great! i rlly like the colors i used, even tho when i will probably re-ship it when it has more apps i will change them so it looks new/updated, but other than that i am very satisfied! it has only a note app, website that is very limited, simple calculator and a find me on socials app, but i have many more that i am currently developing but i thought that i’d like to ship it now so i can see the progress im making. hope u like it! >:3 play the saac, u won’t regret it (T⌓T)", "repo": "https://github.com/pickledroided/webbandola", "demo": "https://pickledroided.github.io/webbandola/"}]...
|
[{"post_id": 71787, "ts": "202 [{"post_id": 71787, "ts": "2026-09-21T15:31:58Z", "hours": 0.7106, "text": "**DEVLOG #12 made some fixes and changed readme + demo png. ready to ship"}, {"post_id": 70657, "ts": "2026-09-19T15:17:02Z", "hours": 5.6183, "text": "**DEVLOG #11 i think its ready to ship! i kinda lost my will to update it etc lately so i kinda rushed it at the end, but im still happy with how it turned out!"}, {"post_id": 67441, "ts": "2026-09-13T15:31:41Z", "hours": 9.5967, "text": "**DEVLOG #10 helloo since i have a dopamine addiction i made a doomscroll app where u can doomscroll (rn there are only like 10 videos, but ill add more) between these videos that i chose about isaac, made a demo app thats just an iframe of the binding of isaac flash version demo gotten from crazy games and a terminal with various commands. also made some new options in the settings app and added it to the topbar, made the hour and date clickable so that they open lil widgets of a clock and a calendar"}, {"post_id": 61224, "ts": "2026-09-04T01:44:43Z", "hours": 9.9403, "text": "**DEVLOG #09 HELLOO i made a select layout on the topbar (blue map) where u can change the dekstop layout and just have a dock with all the apps instead of the normal desktop app icons. also made a tetris (the code is really messed up and doesnt work properly rn, will try to debug) and also made a spotlight to search apps with ctrl + space. also made a lot of tweaks etc but i made them days ago and dont remember them anymore :| this devlog is gonna be shorter because im getting tired of ts so i will try to rush the last things i wanna do and just ship it. it already has a lot of things it doesnt need more tbh"}, {"post_id": 55496, "ts": "2026-08-27T11:49:37Z", "hours": 10.0392, "text": "**DEVLOG #08 i made widgets! they are draggable, customizable with the themes app and all of em work perfectly! the isaac exclusives are the mom’s voicelines and item of the day widget (where u can reroll once per day using D6). i’ve spent most of the time optimizing and fixing bugs, but the thing that stole most of my time was the themes (i got bored of the black and red colors with that background) so i started making some presets with both backgrounds and icon colors. most of them aren’t still finished but yeah i’ll be getting into it shortly. also made some tweaks in the settings, gallery and compendium app aaand i think that’s all. rn im trying to make a domino/infinity effect using the browser where i can open the webOS multiple times inside the webOS but it starts showing white screen after 2 times so idk how to fix."}, {"post_id": 49571, "ts": "2026-08-18T13:35:52Z", "hours": 9.3731, "text": "**DEVLOG #07 helloooo! i made a lot of progress since last time, i made an intro (for some reason i cant upload the video here in the devlog :( but i will ship soon and u’ll be able to see it there) of isaac descending into the floor, idk what to add there but i will try to make it prettier! then i made the settings app and a music player that plays my favorite isaac OSTs (i have no idea if they are copyrighted, i hope not) i also made a paint app (peep the tools, all the icons are isaac items as always) and that’s about it i think, made the topbar prettier and idk i feel tired rn so goodbye"}, {"post_id": 46313, "ts": "2026-08-13T13:38:47Z", "hours": 9.0636, "text": "**DEVLOG #06 ok so it’s been a long journey updating this compendium app, there are a lot of things i wanted to add and it’s still not complete rn, but it’s 99% finished! i added various sections inside the app where u can see all of the unlocks and they are based on what characters u are playing or bosses u are about to kill. other than that i also added a gallery app where i just put a lot of images of isaac and friends, and a themes app where u can change the main colors of the whole OS."}, {"post_id": 43201, "ts": "2026-08-08T10:26:08Z", "hours": 3.4817, "text": "**DEVLOG #05 hello! i put a lot of my time in here for making the app that i think will be the most useful one here (or at least for us isaac players), which is the Compendium app! What is Compendium ? Compendium is this app i made that shows every item, trinket, challenge and character of The Binding of Isaac. it works like a little wiki (not so little since there are more than 720 items and trinkets) and shows every item sorting them by the ID ingame, shows their quality and if they have to be unlocked ingame, it shows you how to unlock them. You can also sort it based on what DLCs u have, default is having all of them (steam sale saved a lot of players). same thing even for trinkets but they don’t have quality in game so the only sorting is DLCs and then the last section of the app is the Unlocks where u can choose and see either how to unlock characters, how to unlock challenges and what reward they give u or all the items that have to be unlocked. What i will add in the future (today or tomorrow probably) the app is 90% done and i wanna add a boss section with tips on how to fight them and a reccomended unlock icon on all of the unlocks that are fundamental for progressing in the game. How did i develop it ok so i thought scraping the web for data was easier, turns out it wasnt and i crashed out multiple times. there are SO MANY items, trinkets and things to get data from and getting all of them was not easy, i tried getting them myself but i gave up halfway through, had to use ai for all the scraping. the worst thing is that it was causing problems and forgetting things and i was always adding them later on, like first i got all the items and that’s it, then i remembered to sort the things, then that not all of them are unlocked, then how to unlock etc etc and thankfully i wasn’t the one that had to scrape all of that data."}, {"post_id": 40078, "ts": "2026-08-03T13:41:49Z", "hours": 1.5744, "text": "**DEVLOG #04 ok so i kinda got lost in my thoughts today so i didn’t do too much but i made it so u can move around icons on the os and added animations when u close/minimize windows, also u can now resize the windows as u like by pulling the window in the corner . i think it’s ready now to ship and i will re-ship with the next mission when i will add more things such as background settings, themes, paint app, actual games etc"}, {"post_id": 39632, "ts": "2026-08-02T19:11:06Z", "hours": 1.3294, "text": "**DEVLOG #03 i made a calculator app using old code from another project and made it match with the whole theme, made the notes app use localStorage so it saves the notes between sessions (there’s a default one tho) and made a lil dock for the open windows rn, also made a lil animations for when there are no windows open but i can’t record rn so u can’t see it, but i will add some micro animations later on to the dock. making this screenshot and being unable to get the browser window in the screen made me realize that i should make it so the windows size can be changed by pulling it on the corner"}, {"post_id": 38831, "ts": "2026-08-01T12:09:00Z", "hours": 2.0381, "text": "**DEVLOG #02 hi humans i changed a lot of the colors and added a background directly from isaac (unused Sheol floor). i added the notes app (which rn only shows a pre-written note, still cant add a new one) a find me app where u can find all of my socials and the browser. the browser was the hard part where i gave up half-way thru because i cant figure out how to search things online that dont block the browser using iframes, so it only shows wikipedia and the website on github pages cuz i wanted to create an infinity effect where u could open the webOS in the browser and do it a lot of times but i cant figure out the resolution etc so u can do it only once rn. also all of the icons are isaac items"}, {"post_id": 38305, "ts": "2026-07-31T16:57:45Z", "hours": 0.8522, "text": "**DEVLOG #01 helo i am making the binding of isaac os. rn it is just very basic since i am following the guide (rn nothing works, i made the windows draggable and closable but they don’t work) and i have 0 ideas on what apps to add, but i will try to make it work and add some cool features"}]...
|
Title: IsaacOS by @slecesama | Stardance
Devlogs: Title: IsaacOS by @slecesama | Stardance
Devlogs:
**DEVLOG #01 helo i am making the binding of isaac os. rn it is just very basic since i am following the guide (rn nothing works, i made the windows draggable and closable but they don’t work) and i have 0 ideas on what apps to add, but i will try to make it work and add some cool features
**DEVLOG #02 hi humans i changed a lot of the colors and added a background directly from isaac (unused Sheol floor). i added the notes app (which rn only shows a pre-written note, still cant add a new one) a find me app where u can find all of my socials and the browser. the browser was the hard part where i gave up half-way thru because i cant figure out how to search things online that dont block the browser using iframes, so it only shows wikipedia and the website on github pages cuz i wanted to create an infinity effect where u could open the webOS in the browser and do it a lot of times but i cant figure out the resolution etc so u can do it only once rn. also all of the icons are isaac items
**DEVLOG #03 i made a calculator app using old code from another project and made it match with the whole theme, made the notes app use localStorage so it saves the notes between sessions (there’s a default one tho) and made a lil dock for the open windows rn, also made a lil animations for when there are no windows open but i can’t record rn so u can’t see it, but i will add some micro animations later on to the dock. making this screenshot and being unable to get the browser window in the screen made me realize that i should make it so the windows size can be changed by pulling it on the corner
**DEVLOG #04 ok so i kinda got lost in my thoughts today so i didn’t do too much but i made it so u can move around icons on the os and added animations when u close/minimize windows, also u can now resize the windows as u like by pulling the window in the corner . i think it’s ready now to ship and i will re-ship with the next mission when i will add more things such as background settings, themes, paint app, actual games etc
**DEVLOG #05 hello! i put a lot of my time in here for making the app that i think will be the most useful one here (or at least for us isaac players), which is the Compendium app! What is Compendium ? Compendium is this app i made that shows every item, trinket, challenge and character of The Binding of Isaac. it works like a little wiki (not so little since there are more than 720 items and trinkets) and shows every item sorting them by the ID ingame, shows their quality and if they have to be unlocked ingame, it shows you how to unlock them. You can also sort it based on what DLCs u have, default is having all of them (steam sale saved a lot of players). same thing even for trinkets but they don’t have quality in game so the only sorting is DLCs and then the last section of the app is the Unlocks where u can choose and see either how to unlock characters, how to unlock challenges and what reward they give u or all the items that have to be unlocked. What i will add in the future (today or tomorrow probably) the app is 90% done and i wanna add a boss section with tips on how to fight them and a reccomended unlock icon on all of the unlocks that are fundamental for progressing in the game. How did i develop it ok so i thought scraping the web for data was easier, turns out it wasnt and i crashed out multiple times. there are SO MANY items, trinkets and things to get data from and getting all of them was not easy, i tried getting them myself but i gave up halfway through, had to use ai for all the scraping. the worst thing is that it was causing problems and forgetting things and i was always adding them later on, like first i got all the items and that’s it, then i remembered to sort the things, then that not all of them are unlocked, then how to unlock etc etc and thankfully i wasn’t the one that had to scrape all of that data.
**DEVLOG #06 ok so it’s been a long journey updating this compendium app, there are a lot of things i wanted to add and it’s still not complete rn, but it’s 99% finished! i added various sections inside the app where u can see all of the unlocks and they are based on what characters u are playing or bosses u are about to kill. other than that i also added a gallery app where i just put a lot of images of isaac and friends, and a themes app where u can change the main colors of the whole OS.
**DEVLOG #07 helloooo! i made a lot of progress since last time, i made an intro (for some reason i cant upload the video here in the devlog :( but i will ship soon and u’ll be able to see it there) of isaac descending into the floor, idk what to add there but i will try to make it prettier! then i made the settings app and a music player that plays my favorite isaac OSTs (i have no idea if they are copyrighted, i hope not) i also made a paint app (peep the tools, all the icons are isaac items as always) and that’s about it i think, made the topbar prettier and idk i feel tired rn so goodbye
**DEVLOG #08 i made widgets! they are draggable, customizable with the themes app and all of em work perfectly! the isaac exclusives are the mom’s voicelines and item of the day widget (where u can reroll once per day using D6). i’ve spent most of the time optimizing and fixing bugs, but the thing that stole most of my time was the themes (i got bored of the black and red colors with that background) so i started making some presets with both backgrounds and icon colors. most of them aren’t still finished but yeah i’ll be getting into it shortly. also made some tweaks in the settings, gallery and compendium app aaand i think that’s all. rn im trying to make a domino/infinity effect using the browser where i can open the webOS multiple times inside the webOS but it starts showing white screen after 2 times so idk how to fix.
**DEVLOG #09 HELLOO i made a select layout on the topbar (blue map) where u can change the dekstop layout and just have a dock with all the apps instead of the normal desktop app icons. also made a tetris (the code is really messed up and doesnt work properly rn, will try to debug) and also made a spotlight to search apps with ctrl + space. also made a lot of tweaks etc but i made them days ago and dont remember them anymore :| this devlog is gonna be shorter because im getting tired of ts so i will try to rush the last things i wanna do and just ship it. it already has a lot of things it doesnt need more tbh
**DEVLOG #10 helloo since i have a dopamine addiction i made a doomscroll app where u can doomscroll (rn there are only like 10 videos, but ill add more) between these videos that i chose about isaac, made a demo app thats just an iframe of the binding of isaac flash version demo gotten from crazy games and a terminal with various commands. also made some new options in the settings app and added it to the topbar, made the hour and date clickable so that they open lil widgets of a clock and a calendar
**DEVLOG #11 i think its ready to ship! i kinda lost my will to update it etc lately so i kinda rushed it at the end, but im still happy with how it turned out!
**DEVLOG #12 made some fixes and changed readme + demo png. ready to ship
Ships:
Welcome to IsaacOS! this is a very cool OS based on the binding of isaac (i am playing it so much rn) which has minimal but essential apps right now but will have many and many more in the future. i made it using only html, css and js and honestly i think it looks great! i rlly like the colors i used, even tho when i will probably re-ship it when it has more apps i will change them so it looks new/updated, but other than that i am very satisfied! it has only a note app, website that is very limited, simple calculator and a find me on socials app, but i have many more that i am currently developing but i thought that i’d like to ship it now so i can see the progress im making. hope u like it! >:3 play the saac, u won’t regret it (T⌓T)
i made the webOS actually functional, with apps that have some utility or functionality (such as the compendium app, my beloved wiki app) and not just the same old stuff such as calculators and notes. tbh i maybe made so many apps that there are 3 columns and covers a part of the desktop, so for that reason i made folders! for the new apps that i made, some of them were actually out of my reach of skills of programming so i had to learn some stuff or use AI for the most complicated stuff, but other than that i would say this project has actually made me re-gain the will of coding that i lost. there are a lot of features that tbh i were to list them all it would take a lot but the thing i focused the most on this project were: making the compendium app an actual useful app that i use regularly when playing the game, and the customization of the os using the themes app. i rlly liked building those two and were the most fun and also challenging part of the whole project. so please try changing stuff in the themes app and make it cool ;) and also use the blue map on the topbar to change the layour of the desktop and tell me which one u like more! i hope u’ll have fun using it and for isaac players, tell me what u would like to change and try the compendium app...
|
1792990623.6729932
|
1793077023.6729932
|
|
8245
|
BetterQR by @Dragon | Stardance
|
Dragon
|
1
|
65.93
|
1000
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-16T15:07:34Z", "hours": 64.0, "multiplier": 15.59, "payout": 1000, "blessing": "neutral", "text": "(check the bottom of the ship msg before voting pls) BetterQR v2.0.0 Release Hey Everyone! I am super excited to announce BetterQR v2.0.0 . This release brings a ton of cool new stuff and makes BetterQR even better for your projects. What’s New & Awesome: Micro QR Codes! 🎉 Now you can generate tiny, super-efficient Micro QR codes (M1-M4) for when space is tight. Perfect for small labels or embedded projects. PDF & EPS Output: Need high-quality QR codes for print? You can now export your QR codes as professional PDF and EPS files! Structured Append: Got a huge message? Split it across up to 16 linked QR codes that can be scanned one after another to get the full data. Super powerful for big data! Faster Than Ever: We’ve made PNG generation about 40% faster ! Your QR codes will render quicker, leaving you more time for hacking. Rock-Solid Reliability: We’ve fixed some tricky bugs that could cause QR codes to break, especially for really big ones. Plus, our testing is way better now, so everything is super stable. Better International Support: New Kanji mode and UTF-8 declarations for global projects. Why this matters for your projects: BetterQR v2.0.0 means you can create more advanced, more reliable, and more visually stunning QR codes for whatever you’re building. Whether it’s a game, a website, or a physical project, BetterQR has your back. Get the Update! It’s easy to upgrade: pip install betterqr --upgrade Information for the voters The Logo isn’t AI generated. This was made fully in Canva. No, This is not a vibecoded project. There are some big devlogs that are around ~9h, I wasn’t able to devlog them as where I live there were serveral power outages, making me not able to use the internet and not to devlog them. This has been tested by more than 100 people now. Was only tested on Windows unfortunately. The “zero qr dependencies” mean there are no dependencies that generate the QR code. The generation logic is fully made by me. Pillow is used for PNG outputs and other small export options. The landing page is half-ai.", "repo": "https://github.com/DevX-Dragon/betterqr", "demo": "https://github.com/DevX-Dragon/betterqr/releases/tag/v2.0.0"}]...
|
[{"post_id": 30235, "ts": "202 [{"post_id": 30235, "ts": "2026-07-17T17:32:38Z", "hours": 1.9294, "text": "Fixing Changes Got a review saying the readme is too Ai. So I just wrote a readme from scratch. Cut down the Ai stuff and followed the guide and made this. Also changed the project banner to the terminal preview command cause the reviewer said so."}, {"post_id": 29531, "ts": "2026-07-16T14:56:39Z", "hours": 2.3836, "text": "Final Devlog of v2.0.0 (hopefully) This is the final devlog that I’ll be posting for v2.0.0 of betterqr. Hopefully you guys will give me some more ideas and features for a future version. What I did. Repository Cleanup Did a clean full push to the /src and have no uncommited changes. Pushed the webiste thats going be hosted on Github Pages. Ran some tests. Merged the feat/v2.0.0 into main branch. PyPi Configs Changes some paths in links to adjust with the branch merge. Modified some automations. Docs Cooked up a release log. Did some changes to the README.md and DOCUMENTATION.md Whats Next? This what I have been working for around 50 hours. Lets See what happens. Im plannning to maintain this as much as I can."}, {"post_id": 28300, "ts": "2026-07-14T13:49:36Z", "hours": 5.1056, "text": "Grinding I forgot to devlog so this will be a big one lol. Im currently doing exams so I dont really have alot of time to think through new stuff. I mostly did some bug fixes , optimisation and working on the landing page. Bug Fixes Fixed some bugs related to the PDF output where sometime QR codes overlap and make an error. Fixed some bugs related to the command line. The frame generation does not work. Im actively working on it but Im not able to fix it yet. Optimisation Have been cutting down extra generation time with unnecssary checks. Have imporved alot in the generation time. This took the longest. Docs Edited the documentation.md with the new data. Edited the readme.md with new stuff. Working on a landing page for BetterQR. I also researched a little bit and asked for peoples opinion on this. Selected around 20 people to test this and give their honest review. Most feedbacks were great. Some requested for features and some found bugs."}, {"post_id": 27127, "ts": "2026-07-12T12:17:36Z", "hours": 3.2736, "text": "Session 5 More Benchmarking I have benchmarked more and repeatedly to get the accurate data. I used automated and manual tests. I found some people online who were down to help me benchmark it. For now the data isnt fully presentable. Will include in the next devlog or in the readme itself. New Brand I have decided on updating our logo. I designed a logo on Canva. I’ll probably use it as the official logo. I went for the purplish theme cause why not. The logo has a futuristic vibe to it ig. Better Landing Pages. Im currently working on a landing page for betterQR. The old one is fine but I didnt update it accordingly. So Im going to make a entirely new one. I have been looking for some inspo as well. Bug Fixing Did some little bug fixes and code cleanup"}, {"post_id": 26102, "ts": "2026-07-10T18:06:05Z", "hours": 2.0942, "text": "The tables does not work on the stardance devlogs, idk why look at the attached image for the formatted table Benchmarking This session focuses on benchmarking BetterQR with other popular libraries like segno and qrcode . How it Compares This is a rough comparison between BetterQR , qrcode , and segno . Feature BetterQR qrcode segno Micro QR ✅ M1–M4 ❌ ✅ Kanji Mode ✅ ❌ ✅ Structured Append ✅ ❌ ✅ Logo Embedding ✅ Built-in ❌ (Manual PIL) ❌ (Manual) Module Shapes ✅ 8 Shapes ⚠️ Limited ❌ Gradients ✅ ❌ ❌ Animated GIF ✅ 10 Effects ❌ ❌ Frames & Labels ✅ Built-in ❌ ❌ Structured Data Helpers (WiFi, vCard, …) ✅ ❌ ⚠️ Via plugin BetterQR ’s primary aim is not to aggressively beat other libraries, but to provide a highly capable, reliable, and user-friendly alternative packed with creative options out of the box. Performance Metrics Payload Performance Benchmarks (2.0.0-rc) All times are in milliseconds (ms). Lower is better. | Payload Category | Size / Type | BetterQR | Segno | Standard qrcode | BetterQR Status | | :— | :— | :—: | :—: | :—: | :— | | URL | Tiny / Short | 6.88 | 7.19 | 5.90 | 🟢 Beats Segno / Competitive | | Medium | Standard | 22.44 | 21.89 | 20.03 | 🟡 Ties Segno (~2.5% diff) | | Large | V40 / Dense | 106.63 | 98.94 | 98.96 | 🔴 Behind by ~8% | | Very Large | Max Capacity | 209.00 | 197.00 | 204.00 | 🟡 Highly Competitive (~6% diff) | | SVG (Large) | Vector | 86.63 | ~0.56 | — | 🟡 Meaningful fix (was 104.66) | | SVG (Very Large) | Vector | 174.19 | ~1.50 | — | 🟡 Meaningful fix (was 211.84) | Known Limitations / Project Honesty To build clear engineering trust, here are the current structural limitations of BetterQR compared to older ecosystem veterans: Dependency Overhead: Depends heavily on Pillow for its extensive visual layouts and shapes, unlike segno , which is zero-dependency. Large Matrix Vectorization: Pure PNG generation lags behind by ~6-8% on maximum matrix dimensions (like V40) due to mask scoring loops running entirely in pure Python. Vector Vectorization Limits: While our SVG generation times dropped significantly in the latest release, pure string-building layout engines like segno still massively outperform us on massive vector layouts. Format Boundaries: The legacy EPS writer does not support logo embedding. Spec Edge Cases: Kanji mode and Structured Append are fully validated for standard QR codes, but are not yet implemented for Micro QR variants. rMQR (Rectangular Micro QR) is currently unsupported."}, {"post_id": 25388, "ts": "2026-07-09T17:29:11Z", "hours": 2.5597, "text": "SES-3 This session focuses on bug fixing , CI/CD improvement and some research about new features. New Features Research I realized for the past 2 weeks I have not implemented new features, and only fixed bugs and did improvements. I researched a little and looked into other QR libraries and looked for the stuff that the other libraries lack. I decided on some new features like Kanji Mode, there are few but I wont mention them here. (research time isnt logged cause I forgot but it was like an hour) Bug Fixing Did some bug fixing with the logo embedding QR code again. Its the only QR code type that fails the most. This time I guarantee it wont fail again. CI/CD Improvements Finally I realized for my test workflows I use pyzbar which is a qr code decoding library. But it does not support microqr decoding. So I had to switch to another libray called zxingcpp which does support what pyzbar has with microqr decoding support as well. I took some help from some people online regarding the tests and they help me make some test scripts. I broke down the main test script into smaller parts so Its easier for me and the readers. Conclusion Thats it for this session. Its like 95% completed for shipping and logged 50 hours as well. Just some final new features (mentioned above) and some documentation work and It v2 will be released. Thank you for reading the entire thing. I hope you’ll like it and find BetterQR useful. New features / suggestions / complaints are accepted in the replies via a DM on slack. I need some honest feedback."}, {"post_id": 24825, "ts": "2026-07-08T17:11:15Z", "hours": 1.1514, "text": "Bug Patching (SES-2.1) This will be my last patch of the day. Bug Styled Micro QR codes render wrong: Both the PNG and SVG renderers assume the standard 3-finder layout when deciding what counts as a “finder square” (for shape/color overrides). Micro QR only has one finder (top-left), so modules near the top-right and bottom-left corners get incorrectly forced into squares / finder-color under custom styling. This isnt fully fixed, Im having some hard time figuring out whats the main core issue. It is somewhat fixed."}, {"post_id": 24778, "ts": "2026-07-08T15:58:08Z", "hours": 4.5525, "text": "Bug Patching (SES-1) Ran more tests and got feedback from ~15 people. Made them test the commands and try to find bugs. There were many bugs people were available to find. This is session focuses on fixing some of them Bugs that were fixed Micro QR silently corrupts data near capacity limits: In encoder.py , the capacity check treats every Micro QR data codeword as a full 8 bits — but for M1 and M3 symbols, the last data codeword is only a 4-bit nibble per spec. The checker accepts data that’s 4 bits too big, and the extra bits get silently truncated at render time. .logo() crashes every time: core.py builds a logo_info dict with a key \"padding\" , but matrix.py leads logo_info[\"padding_px\"] , instant KeyError the moment anyone calls .logo(...). Terminal --terminal-style compact output has padding bugs asymmetric left/right padding and a stray extra row, so piping it anywhere that cares about exact dimensions breaks. There are some more bugs that will be fixed in the next session."}, {"post_id": 23583, "ts": "2026-07-06T16:56:25Z", "hours": 9.6575, "text": "Mega Lock-In The 9 hours was logged in span of the last week. Didn`t get to devlog due to internet outage here in Sri Lanka. Bugs Fixed in core.py _hex_to_rgb 3-char hex crash :#000, #FFF, #F00 etc. caused invalid literal for int() with base 16: '' . Added expansion of 3-char to 6-char before parsing .logo() crash: 'QR' object has no attribute '_version_size'``logo() tried to compute size_px = int(self._version_size * ratio) but _version_size doesn’t exist on the QR object at call time (the matrix hasn’t been built yet). Fixed to compute size_px lazily inside _get_logo_info() from module_count × box_size × ratio. logo(border=True) crash: invalid literal for int() with base 16: 'Tr' The _logo_border attribute stores a bool, but was passed directly as border_color to embed_image() which called _hex_to_rgb(True) → _hex_to_rgb(\"True\") → crash. Fixed to pass \"#000000\" if self._logo_border else None. image_ops.py + animation.py — _hex_to_rgb None guard Added if not c: return (0, 0, 0) guard so passing None as a color never crashes. The _color() validator didn’t strip surrounding shell-added quotes from color strings like “#FF0000”, causing # to be split off the hex digits. Fixed to strip \" and ' before processing. Changes Corrected Micro QR capacity table (all 8 version/ECC combos with accurate numeric/alpha/byte limits) Fixed logo() parameter docs (border is bool, not int)- Fixed double ```bash` in installation section Corrected SMS encoding protocol note (sms: not smsto:) Docs Added a more detailed info about MicroQR codes to README.md and DOCUMENTATION.md - Made a landing site with help of Claude."}, {"post_id": 17661, "ts": "2026-06-28T15:25:06Z", "hours": 5.1989, "text": "Locking in Bug hunting has started. I have been looking for any bugs in the hidden corners and have found many of them. Like the embedded logo QR codes throw an error , microQR m4 type just crashes everything,etc. I also have used the library in actual code to test as well. Landing Page Used my front-end skills to to the best and locked in and designed a good looking website for BetterQR. Looks fine for now. Will do some changes later. Made it a single page website cause easier load for Github Pages. (v2 is not out, expect it earlier this week)"}, {"post_id": 16341, "ts": "2026-06-26T16:14:36Z", "hours": 1.6294, "text": "Prepping for shipping I initially planned to release this today, but realized something. The embedded logo thing and microqr is now failing on me. and Im lazy to fix this now so I’ll be fixingit tomorrow. Making a website So I thought why not make a website. So Im have been working on a small landing website with vanilla html and probably host it on GitHub Pages as well."}, {"post_id": 15743, "ts": "2026-06-25T16:49:22Z", "hours": 2.0969, "text": "Prepping to ship Doing stuff related to publishing the new version. Im noy going to be going in details cause Im at school"}, {"post_id": 13715, "ts": "2026-06-22T14:13:14Z", "hours": 2.4611, "text": "Fixing failed tests I have ran multiple CI/CD tests and have noted that most animations and data type qr codes fail. I think its mostly from wrong placements. CLI Redirect : Redirect data -> output when a helper flag is active. SMS Protocol : Use sms: not smsto: . _write_format_info function bugs The _write_format_info function as two major bugs. Top-Right : uses bit_idx=i in write_bit (which applies 14-i ) but should write ( fmt >> i ) & 1 (vbit). The bit indices are swapped. Bottom Left : Only writes 7 rows (missing row size-8 ) ad uses wrong bit indices. These are only like 1/4 of the bugs. These were the easiest to document so listed them here."}, {"post_id": 13175, "ts": "2026-06-21T15:42:56Z", "hours": 1.8564, "text": "Testing and Fixing After running the new CI/CD Tests most pass but some fail. I traced back the issues and fixed half of them. Some issues I found 1, Micro QR auto-version: _min_version doesn’t enforce mode compatibility (M1=numeric only, M2=no byte, etc.) and uses wrong mode-indicator bit count in the needed formula. 2. WiFi/Geo/SMS/Phone/Email/VCard: The helper objects need to be passed as str() to QR() — the test is likely calling them directly. The __str__ methods need to produce correct strings, and some may have format issues. 3. Animations: GIF decode — need to verify each frame. 4. small_border: border=1 means only 4px quiet zone which may confuse decoders. (i have been fixing them but not produce a result yet)"}, {"post_id": 12592, "ts": "2026-06-20T15:49:34Z", "hours": 1.1111, "text": "CI/CD Writing the test scripts from scratch cause the last CI/CD pipelines are kind of glitched. Used claude a little this time to structure it. More Debugging Trying to fix some bugs, scrolling through stack overlay rn (yes stack overflow and not ai, IM NOT A BOOMER trust)"}, {"post_id": 12544, "ts": "2026-06-20T14:27:13Z", "hours": 1.3228, "text": "Fixing time I have identified all of the bugs (hopefully) and marked everything that has to be fixed. Fixed Stuff Current bit-stream builder in build_matrix writes all bits including the full 8-bit last data CW, then starts ECC. For M1/M3, the correct order is: 10 data CW (80 bits) + 4-bit partial + 6 ECC CW (48 bits). The current code writes all 17 CW as bits sequentially which gives the WRONG bit order.So I fixed the bit placement in build_matrix for M1/M3 fixed encode_data to use zero padding for Micro QR and handle the M1/M3 last-4-bit rule. Need to be fixed I need to fix _apply_mask to use Micro QR mask conditions (indices 1,4,6,7 of standard) for micro QR, and add a separate _MICRO_MASK_CONDITIONS list. Need to fix the _min_version capacity checker, which has the same wrong cc_bits values"}, {"post_id": 11994, "ts": "2026-06-19T15:54:15Z", "hours": 2.2208, "text": "Debugging 2 Finding errors in tables.py As my last devlog I identified that there is some errors in matrix and table files. I started looking through the table data and found some errors. bs.append(mode, 4) — always writes a 4-bit mode indicator. But for Micro QR, mode indicators are 1–4 bits depending on the version, not always 4 bits The _data_placement_order function skips col 6 (standard QR timing column). For Micro QR, col 0 is the timing column that should be skipped. But since col 0 and row 0 are already marked as reserved via timing pattern placement, the i f not reserved[row][c] check already handles it. The col == 6 skip is only needed because in standard QR col 6 is a function column that isn’t individually reserved — but since we now properly reserve col 0 for Micro QR, it’s already handled. The issue is the function always skips col 6, which in Micro QR is a valid data column. The Micro QR format info table has duplicate dict keys, so versions M1-M3 silently get clobbered by M4’s values. I’m still going through the code to find the errors first, Then I’ll start to fix them one-by-one cause I’m tired of fixing one and get another 2 bugs out of nowhere."}, {"post_id": 11318, "ts": "2026-06-18T14:58:53Z", "hours": 0.8781, "text": "Debugging After introducing CI/CD Integrations and Test Scripts I have noticed all the generated QR codes fail or unreadable. Im currently tracking the issue behind this. And the main assumption is to something with the src/matrix.py or src/tables.py cause thats the main logic behind the validity. So im curretly digging through the code to find the bugs. I have fixed some of them but when i fix one bug two bug appears. 😭"}, {"post_id": 10678, "ts": "2026-06-17T15:17:02Z", "hours": 2.5147, "text": "Alot of progress today CI/CD Intergration. Implemented few tests that gets triggered during a push / pull request that tests if the generated QR codes are valid and working as intented. Results are sent to a private discord server via a webhook. ISO Complying Working on making the generated QR Codes fully compliant with the ISO Standards. (attached is a fail qr code LOL)"}, {"post_id": 9264, "ts": "2026-06-15T15:38:08Z", "hours": 1.4681, "text": "Made some main changes and reorganization. Made a separate file for all the helper classes Secure algorithm for sensitive data. Researched some more stuff"}, {"post_id": 9211, "ts": "2026-06-15T13:52:01Z", "hours": 2.0236, "text": "Working for the V2.0.0 I have successfully released the first version of it. So I have been working on adding some more features for the next version. MicroQR Support This is one of the most requested feature here. It is little tricky to make it work. But most logic for this has been programmed. SVG Optimization Drastically reduced SVG file size by merging modules into a single element. Security Added HMAC-SHA256 signing and bitwise XOR obfuscation to protect sensitive QR data. Safety Automatically detects low contrast between foreground and background. Includes auto_fix_contrast to force scannable colors."}, {"post_id": 7488, "ts": "2026-06-12T14:29:27Z", "hours": 2.3697, "text": "First Beta Release I did my first beta release to PyPI and tested out. It worked pretty well. Got some suggestions from Reddit as well. Writing Documentation , readme.md and improving the repo structure Wrote the entire documentation , reamd.md , changelog and contribution.md to improve the repo. First public release Release the first official version with some improvements. Currently working on adding microQR codes and security warnings for Crypto qr codes"}, {"post_id": 5720, "ts": "2026-06-09T16:52:32Z", "hours": 1.3011, "text": "First version release on pypi, run pip install betterqr to install. Gotta work on the readme and website now"}, {"post_id": 4947, "ts": "2026-06-08T16:03:47Z", "hours": 3.3081, "text": "Completed the base qr engine finally after hours of coding and debugging. Now it can generate basic qr codes with texts and links."}, {"post_id": 3592, "ts": "2026-06-06T16:20:00Z", "hours": 1.4939, "text": "Currently worked on the QR code engine that generates the QR code. Also did some CLI work to make it work. Created some GH workflows as well"}, {"post_id": 2795, "ts": "2026-06-05T16:42:30Z", "hours": 0.3283, "text": "Currently writing the core for the package. I have added the basic starter classes like the Wifi QR and contact QR"}]...
|
Title: BetterQR by @Dragon | Stardance
Devlogs:
C Title: BetterQR by @Dragon | Stardance
Devlogs:
Currently writing the core for the package. I have added the basic starter classes like the Wifi QR and contact QR
Currently worked on the QR code engine that generates the QR code. Also did some CLI work to make it work. Created some GH workflows as well
Completed the base qr engine finally after hours of coding and debugging. Now it can generate basic qr codes with texts and links.
First version release on pypi, run pip install betterqr to install. Gotta work on the readme and website now
First Beta Release I did my first beta release to PyPI and tested out. It worked pretty well. Got some suggestions from Reddit as well. Writing Documentation , readme.md and improving the repo structure Wrote the entire documentation , reamd.md , changelog and contribution.md to improve the repo. First public release Release the first official version with some improvements. Currently working on adding microQR codes and security warnings for Crypto qr codes
Working for the V2.0.0 I have successfully released the first version of it. So I have been working on adding some more features for the next version. MicroQR Support This is one of the most requested feature here. It is little tricky to make it work. But most logic for this has been programmed. SVG Optimization Drastically reduced SVG file size by merging modules into a single element. Security Added HMAC-SHA256 signing and bitwise XOR obfuscation to protect sensitive QR data. Safety Automatically detects low contrast between foreground and background. Includes auto_fix_contrast to force scannable colors.
Made some main changes and reorganization. Made a separate file for all the helper classes Secure algorithm for sensitive data. Researched some more stuff
Alot of progress today CI/CD Intergration. Implemented few tests that gets triggered during a push / pull request that tests if the generated QR codes are valid and working as intented. Results are sent to a private discord server via a webhook. ISO Complying Working on making the generated QR Codes fully compliant with the ISO Standards. (attached is a fail qr code LOL)
Debugging After introducing CI/CD Integrations and Test Scripts I have noticed all the generated QR codes fail or unreadable. Im currently tracking the issue behind this. And the main assumption is to something with the src/matrix.py or src/tables.py cause thats the main logic behind the validity. So im curretly digging through the code to find the bugs. I have fixed some of them but when i fix one bug two bug appears. 😭
Debugging 2 Finding errors in tables.py As my last devlog I identified that there is some errors in matrix and table files. I started looking through the table data and found some errors. bs.append(mode, 4) — always writes a 4-bit mode indicator. But for Micro QR, mode indicators are 1–4 bits depending on the version, not always 4 bits The _data_placement_order function skips col 6 (standard QR timing column). For Micro QR, col 0 is the timing column that should be skipped. But since col 0 and row 0 are already marked as reserved via timing pattern placement, the i f not reserved[row][c] check already handles it. The col == 6 skip is only needed because in standard QR col 6 is a function column that isn’t individually reserved — but since we now properly reserve col 0 for Micro QR, it’s already handled. The issue is the function always skips col 6, which in Micro QR is a valid data column. The Micro QR format info table has duplicate dict keys, so versions M1-M3 silently get clobbered by M4’s values. I’m still going through the code to find the errors first, Then I’ll start to fix them one-by-one cause I’m tired of fixing one and get another 2 bugs out of nowhere.
Fixing time I have identified all of the bugs (hopefully) and marked everything that has to be fixed. Fixed Stuff Current bit-stream builder in build_matrix writes all bits including the full 8-bit last data CW, then starts ECC. For M1/M3, the correct order is: 10 data CW (80 bits) + 4-bit partial + 6 ECC CW (48 bits). The current code writes all 17 CW as bits sequentially which gives the WRONG bit order.So I fixed the bit placement in build_matrix for M1/M3 fixed encode_data to use zero padding for Micro QR and handle the M1/M3 last-4-bit rule. Need to be fixed I need to fix _apply_mask to use Micro QR mask conditions (indices 1,4,6,7 of standard) for micro QR, and add a separate _MICRO_MASK_CONDITIONS list. Need to fix the _min_version capacity checker, which has the same wrong cc_bits values
CI/CD Writing the test scripts from scratch cause the last CI/CD pipelines are kind of glitched. Used claude a little this time to structure it. More Debugging Trying to fix some bugs, scrolling through stack overlay rn (yes stack overflow and not ai, IM NOT A BOOMER trust)
Testing and Fixing After running the new CI/CD Tests most pass but some fail. I traced back the issues and fixed half of them. Some issues I found 1, Micro QR auto-version: _min_version doesn’t enforce mode compatibility (M1=numeric only, M2=no byte, etc.) and uses wrong mode-indicator bit count in the needed formula. 2. WiFi/Geo/SMS/Phone/Email/VCard: The helper objects need to be passed as str() to QR() — the test is likely calling them directly. The __str__ methods need to produce correct strings, and some may have format issues. 3. Animations: GIF decode — need to verify each frame. 4. small_border: border=1 means only 4px quiet zone which may confuse decoders. (i have been fixing them but not produce a result yet)
Fixing failed tests I have ran multiple CI/CD tests and have noted that most animations and data type qr codes fail. I think its mostly from wrong placements. CLI Redirect : Redirect data -> output when a helper flag is active. SMS Protocol : Use sms: not smsto: . _write_format_info function bugs The _write_format_info function as two major bugs. Top-Right : uses bit_idx=i in write_bit (which applies 14-i ) but should write ( fmt >> i ) & 1 (vbit). The bit indices are swapped. Bottom Left : Only writes 7 rows (missing row size-8 ) ad uses wrong bit indices. These are only like 1/4 of the bugs. These were the easiest to document so listed them here.
Prepping to ship Doing stuff related to publishing the new version. Im noy going to be going in details cause Im at school
Prepping for shipping I initially planned to release this today, but realized something. The embedded logo thing and microqr is now failing on me. and Im lazy to fix this now so I’ll be fixingit tomorrow. Making a website So I thought why not make a website. So Im have been working on a small landing website with vanilla html and probably host it on GitHub Pages as well.
Locking in Bug hunting has started. I have been looking for any bugs in the hidden corners and have found many of them. Like the embedded logo QR codes throw an error , microQR m4 type just crashes everything,etc. I also have used the library in actual code to test as well. Landing Page Used my front-end skills to to the best and locked in and designed a good looking website for BetterQR. Looks fine for now. Will do some changes later. Made it a single page website cause easier load for Github Pages. (v2 is not out, expect it earlier this week)
Mega Lock-In The 9 hours was logged in span of the last week. Didn`t get to devlog due to internet outage here in Sri Lanka. Bugs Fixed in core.py _hex_to_rgb 3-char hex crash :#000, #FFF, #F00 etc. caused invalid literal for int() with base 16: '' . Added expansion of 3-char to 6-char before parsing .logo() crash: 'QR' object has no attribute '_version_size'``logo() tried to compute size_px = int(self._version_size * ratio) but _version_size doesn’t exist on the QR object at call time (the matrix hasn’t been built yet). Fixed to compute size_px lazily inside _get_logo_info() from module_count × box_size × ratio. logo(border=True) crash: invalid literal for int() with base 16: 'Tr' The _logo_border attribute stores a bool, but was passed directly as border_color to embed_image() which called _hex_to_rgb(True) → _hex_to_rgb("True") → crash. Fixed to pass "#000000" if self._logo_border else None. image_ops.py + animation.py — _hex_to_rgb None guard Added if not c: return (0, 0, 0) guard so passing None as a color never crashes. The _color() validator didn’t strip surrounding shell-added quotes from color strings like “#FF0000”, causing # to be split off the hex digits. Fixed to strip " and ' before processing. Changes Corrected Micro QR capacity table (all 8 version/ECC combos with accurate numeric/alpha/byte limits) Fixed logo() parameter docs (border is bool, not int)- Fixed double ```bash` in installation section Corrected SMS encoding protocol note (sms: not smsto:) Docs Added a more detailed info about MicroQR codes to README.md and DOCUMENTATION.md - Made a landing site with help of Claude.
Bug Patching (SES-1) Ran more tests and got feedback from ~15 people. Made them test the commands and try to find bugs. There were many bugs people were available to find. This is session focuses on fixing some of them Bugs that were fixed Micro QR silently corrupts data near capacity limits: In encoder.py , the capacity check treats every Micro QR data codeword as a full 8 bits — but for M1 and M3 symbols, the last data codeword is only a 4-bit nibble per spec. The checker accepts data that’s 4 bits too big, and the extra bits get silently truncated at render time. .logo() crashes every time: core.py builds a logo_info dict with a key "padding" , but matrix.py leads logo_info["padding_px"] , instant KeyError the moment anyone calls .logo(...). Terminal --terminal-style compact output has padding bugs asymmetric left/right padding and a stray extra row, so piping it anywhere that cares about exact dimensions breaks. There are some more bugs that will be fixed in the next session.
Bug Patching (SES-2.1) This will be my last patch of the day. Bug Styled Micro QR codes render wrong: Both the PNG and SVG renderers assume the standard 3-finder layout when deciding what counts as a “finder square” (for shape/color overrides). Micro QR only has one finder (top-left), so modules near the top-right and bottom-left corners get incorrectly forced into squares / finder-color under custom styling. This isnt fully fixed, Im having some hard time figuring out whats the main core issue. It is somewhat fixed.
SES-3 This session focuses on bug fixing , CI/CD improvement and some research about new features. New Features Research I realized for the past 2 weeks I have not implemented new features, and only fixed bugs and did improvements. I researched a little and looked into other QR libraries and looked for the stuff that the other libraries lack. I decided on some new features like Kanji Mode, there are few but I wont mention them here. (research time isnt logged cause I forgot but it was like an hour) Bug Fixing Did some bug fixing with the logo embedding QR code again. Its the only QR code type that fails the most. This time I guarantee it wont fail again. CI/CD Improvements Finally I realized for my test workflows I use pyzbar which is a qr code decoding library. But it does not support microqr decoding. So I had to switch to another libray called zxingcpp which does support what pyzbar has with microqr decoding support as well. I took some help from some people online regarding the tests and they help me make some test scripts. I broke down the main test script into smaller parts so Its easier for me and the readers. Conclusion Thats it for this session. Its like 95% completed for shipping and logged 50 hours as well. Just some final new features (mentioned above) and some documentation work and It v2 will be released. Thank you for reading the entire thing. I hope you’ll like it and find BetterQR useful. New features / suggestions / complaints are accepted in the replies via a DM on slack. I need some honest feedback.
The tables does not work on the stardance devlogs, idk why look at the attached image for the formatted table Benchmarking This session focuses on benchmarking BetterQR with other popular libraries like segno and qrcode . How it Compares This is a rough comparison between BetterQR , qrcode , and segno . Feature BetterQR qrcode segno Micro QR ✅ M1–M4 ❌ ✅ Kanji Mode ✅ ❌ ✅ Structured Append ✅ ❌ ✅ Logo Embedding ✅ Built-in ❌ (Manual PIL) ❌ (Manual) Module Shapes ✅ 8 Shapes ⚠️ Limited ❌ Gradients ✅ ❌ ❌ Animated GIF ✅ 10 Effects ❌ ❌ Frames & Labels ✅ Built-in ❌ ❌ Structured Data Helpers (WiFi, vCard, …) ✅ ❌ ⚠️ Via plugin BetterQR ’s primary aim is not to aggressively beat other libraries, but to provide a highly capable, reliable, and user-friendly alternative packed with creative options out of the box. Performance Metrics Payload Performance Benchmarks (2.0.0-rc) All times are in milliseconds (ms). Lower is better. | Payload Category | Size / Type | BetterQR | Segno | Standard qrcode | BetterQR Status | | :— | :— | :—: | :—: | :—: | :— | | URL | Tiny / Short | 6.88 | 7.19 | 5.90 | 🟢 Beats Segno / Competitive | | Medium | Standard | 22.44 | 21.89 | 20.03 | 🟡 Ties Segno (~2.5% diff) | | Large | V40 / Dense | 106.63 | 98.94 | 98.96 | 🔴 Behind by ~8% | | Very Large | Max Capacity | 209.00 | 197.00 | 204.00 | 🟡 Highly Competitive (~6% diff) | | SVG (Large) | Vector | 86.63 | ~0.56 | — | 🟡 Meaningful fix (was 104.66) | | SVG (Very Large) | Vector | 174.19 | ~1.50 | — | 🟡 Meaningful fix (was 211.84) | Known Limitations / Project Honesty To build clear engineering trust, here are the current structural limitations of BetterQR compared to older ecosystem veterans: Dependency Overhead: Depends heavily on Pillow for its extensive visual layouts and shapes, unlike segno , which is zero-dependency. Large Matrix Vectorization: Pure PNG generation lags behind by ~6-8% on maximum matrix dimensions (like V40) due to mask scoring loops running entirely in pure Python. Vector Vectorization Limits: While our SVG generation times dropped significantly in the latest release, pure string-building layout engines like segno still massively outperform us on massive vector layouts. Format Boundaries: The legacy EPS writer does not support logo embedding. Spec Edge Cases: Kanji mode and Structured Append are fully validated for standard QR codes, but are not yet implemented for Micro QR variants. rMQR (Rectangular Micro QR) is currently unsupported.
Session 5 More Benchmarking I have benchmarked more and repeatedly to get the accurate data. I used automated and manual tests. I found some people online who were down to help me benchmark it. For now the data isnt fully presentable. Will include in the next devlog or in the readme itself. New Brand I have decided on updating our logo. I designed a logo on Canva. I’ll probably use it as the official logo. I went for the purplish theme cause why not. The logo has a futuristic vibe to it ig. Better Landing Pages. Im currently working on a landing page for betterQR. The old one is fine but I didnt update it accordingly. So Im going to make a entirely new one. I have been looking for some inspo as well. Bug Fixing Did some little bug fixes and code cleanup
Grinding I forgot to devlog so this will be a big one lol. Im currently doing exams so I dont really have alot of time to think through new stuff. I mostly did some bug fixes , optimisation and working on the landing page. Bug Fixes Fixed some bugs related to the PDF output where sometime QR codes overlap and make an error. Fixed some bugs related to the command line. The frame generation does not work. Im actively working on it but Im not able to fix it yet. Optimisation Have been cutting down extra generation time with unnecssary checks. Have imporved alot in the generation time. This took the longest. Docs Edited the documentation.md with the new data. Edited the readme.md with new stuff. Working on a landing page for BetterQR. I also researched a little bit and asked for peoples opinion on this. Selected around 20 people to test this and give their honest review. Most feedbacks were great. Some requested for features and some found bugs.
Final Devlog of v2.0.0 (hopefully) This is the final devlog that I’ll be posting for v2.0.0 of betterqr. Hopefully you guys will give me some more ideas and features for a future version. What I did. Repository Cleanup Did a clean full push to the /src and have no uncommited changes. Pushed the webiste thats going be hosted on Github Pages. Ran some tests. Merged the feat/v2.0.0 into main branch. PyPi Configs Changes some paths in links to adjust with the branch merge. Modified some automations. Docs Cooked up a release log. Did some changes to the README.md and DOCUMENTATION.md Whats Next? This what I have been working for around 50 hours. Lets See what happens. Im plannning to maintain this as much as I can.
Fixing Changes Got a review saying the readme is too Ai. So I just wrote a readme from scratch. Cut down the Ai stuff and followed the guide and made this. Also changed the project banner to the terminal preview command cause the reviewer said so.
Ships:
(check the bottom of the ship msg before voting pls) BetterQR v2.0.0 Release Hey Everyone! I am super excited to announce BetterQR v2.0.0 . This release brings a ton of cool new stuff and makes BetterQR even better for your projects. What’s New & Awesome: Micro QR Codes! 🎉 Now you can generate tiny, super-efficient Micro QR codes (M1-M4) for when space is tight. Perfect for small labels or embedded projects. PDF & EPS Output: Need high-quality QR codes for print? You can now export your QR codes as professional PDF and EPS files! Structured Append: Got a huge message? Split it across up to 16 linked QR codes that can be scanned one after another to get the full data. Super powerful for big data! Faster Than Ever: We’ve made PNG generation about 40% faster ! Your QR codes will render quicker, leaving you more time for hacking. Rock-Solid Reliability: We’ve fixed some tricky bugs that could cause QR codes to break, especially for really big ones. Plus, our testing is way better now, so everything is super stable. Better International Support: New Kanji mode and UTF-8 declarations for global projects. Why this matters for your projects: BetterQR v2.0.0 means you can create more advanced, more reliable, and more visually stunning QR codes for whatever you’re building. Whether it’s a game, a website, or a physical project, BetterQR has your back. Get the Update! It’s easy to upgrade: pip install betterqr --upgrade Information for the voters The Logo isn’t AI generated. This was made fully in Canva. No, This is not a vibecoded project. There are some big devlogs that are around ~9h, I wasn’t able to devlog them as where I live there were serveral power outages, making me not able to use the internet and not to devlog them. This has been tested by more than 100 people now. Was only tested on Windows unfortunately. The “zero qr dependencies” mean there are no dependencies that generate the QR code. The generation logic is fully made by me. Pillow is used for PNG outputs and other small export options. The landing page is half-ai....
|
1792882136.3204722
|
1793746136.3204722
|
|
6376
|
Soundboword by @Axwabo | Stardance
|
Axwabo
|
1
|
69.0
|
995
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-05T23:05:38Z", "hours": 69.0, "multiplier": 14.42, "payout": 995, "blessing": "neutral", "text": "Soundboword is an actually usable desktop soundboard for (primarily) Linux and (with apparent support for) windows tired of other soundboards paywalling slots? not anymore! [insert Phil Swift Flex Tape meme, not sponsored] this is a .NET app built with Avalonia, SoundFlow, and YoutubeExplode you don’t need to install .NET, it’s compiled into a native binary the SoundFlow backend in use is based on miniaudio, so the app only supports mp3 and wav files download audio from YouTube (paste a link or search) for Linux, there is additional PipeWire support use the PipeWire wizard to create a virtual device named “Soundboword Microphone” which you can select in apps (e.g. Discord) after setting up the microphone, you can use the toggles in the bottom left to manage some node links (connect/disconnect audio nodes) Hear Sounds: plays the soundboard to your headphones Mic Sounds: plays the soundboard into the virtual microphone Mic Passthrough: connects the selected physical microphone to the virtual mic Hear Myself: connects your physical mic to your headphones, echoing what you say windows support is partial, macos support will not be provided global hotkeys should work out of the box on losedows the Linux version uses xdg-desktop-portal for global shortcuts if you have a Launchpad Mini MKII lying around, you can use it with this program :3", "repo": "https://github.com/Axwabo/Soundboword", "demo": "https://github.com/Axwabo/Soundboword/releases/tag/v1.0.0"}]...
|
[{"post_id": 62313, "ts": "202 [{"post_id": 62313, "ts": "2026-09-05T16:50:40Z", "hours": 3.6683, "text": "most likely the last devlog before i outgrow hackclub :’3 finalized the project, improved the CI workflow to bundle the program properly and include 3rd party licenses completed the README added a simple sound “editor” that lets you specify the following: start time: where to begin playback loop start: where to jump when restarting on loop (start of file by default) loop end: the point where loop triggers (end of file by default) made the sidebar (Sounds and Inputs views) consistent added icons to almost every window (Linux crashed because the PipeWire icon wasn’t in that project lol) message to future self: you need the leading slash in the Icon property (e.g. /Assets/sus.ico works but not Assets/sus.ico ) the video shows the new configure sound on trigger click feature, resembling the behavior of Voicemod implemented the missing “Auto Mic Passthrough” (as described in the README) the physical microphone preference is now saved fixed the hidden toggles taking up space on slopdows RowDefinitions don’t support binding, not even OnPlatform :( hopefully i don’t gotta fix anything, and it’s ready to ship"}, {"post_id": 60689, "ts": "2026-09-03T07:25:41Z", "hours": 9.5664, "text": "I’M GONNA TWEAK OUT 9 hours on slopdows bullshit… IT FINALLY WORKS (except not really because removing keybinds doesn’t..?) okay so i restored some of the styling, 0 padding in the Inputs listbox looked bad not sure what else i did that isn’t losedows suffering lmao sooooooo “win”dows is special if you hold Ctrl, it doesn’t call the TextInput event, meaning that i have to translate the Key enum the TextInput event isn’t flawless either, it can be ambiguous (e.g. hungarian layout: AltGr+J = í, AltGr+I = Í, Soundboword makes them uppercase) should i remove the automatic uppercase conversion? i spent a lot of time “debugging” (as in, having the CI build it, download the zip, transfer it to a slopdows machine, since native cross-compilation is not supported) the biggest headache was the shortcut list update handler… i negated the TryAdd call, which meant that the global hotkey would only get registered if the same gesture has been added to the dictionary already (therefore it would only work on subsequent binds) i spent way too much time figuring this out another oversight was the lack of Target assignment when you clicked ⚙️ on an input method, meaning that binding shortcuts did nothing idk why the entire panel is bold, gotta fix that hotkeys are temporarily removed while you’re assigning a shortcut however, as mentioned before, this doesn’t work xd i tried it on a slopdows laptop, and removing the A hotkey made the A key unusable until i closed Soundboword setting up CI wasn’t difficult, gotta make sure to separate rm commands and use -f so files not found don’t error using || doesn’t run the latter command if the first one succeeds, i should’ve known that"}, {"post_id": 41841, "ts": "2026-08-06T09:41:33Z", "hours": 2.6206, "text": "i did mostly polishing work during this time, now i can torture myself with windows global shortcuts gotta crash out first though cuz this wonderful website has 3 different markdown renderers somehow, and i’ve been using --- to make sections actually separate changed the TabControl to a TabStrip so i can use my on page switching logic most views are only created once now, which gives a slight performance boost i’d noticed that quickly switching between tabs while using TabControl lead to slight crackles in audio, that’s taken care of now oh and you can use the Tab key to navigate, cuz TabStrip can magically do that getting the lazy-ish loading was pretty funky though, UserControls are lazy by default so i had to hack around it to preload the views by setting IsVisible to false after the control loads (i think that’s what i did, i kinda forgor) fixed the YouTube stream loader, and added a local error display so you can immediately see if something went wrong made it so non-bound XDG-Desktop-Portal shortcuts are no longer detected removed the sound edit button for now, i would like to ship without having to figure all that out made StackPanel spacing mostly uniform using a style selector, though it looks pretty bad in device selectors general settings & logging settings are now saved and loaded added Rescan and Relink All buttons Rescan checks not found files again to locate them Relink All lets you pick directories to look for not found sounds by their filenames in the video, i unmounted the disk that had some files, then relinked sounds to locate it elsewhere"}, {"post_id": 36680, "ts": "2026-07-28T21:57:59Z", "hours": 4.8294, "text": "dev log about logging, crazy added logging in-app and also to files you can configure log levels, None disables file logging altogether i was looking around to find a simple file logger for Microsoft.Extensions.Logging, but i didn’t like it so i made my own, even simpler version took a bunch of attempts to make the architecture bearable, but it’s still kinda jank with the existence of LogPreferences.Instance (instead of using the service provider… but whatever, i make the rules :3) turns out that MultiBinding doesn’t work for a bool that hides the bottom bar (idk why), so i did some wiring by subscribing to PropertyChanged in the preferences and the log list only at the time of recording did i realize that the initial value isn’t set properly, so i gotta fix that tried to set PublishAot to true for all projects (so i don’t have to specify it in dotnet publish ), but that breaks the preview, so i had to revert the change unhandled UI exceptions are now written to the file the unobserved task exception event just… doesn’t seem to fire… i got rid of that tried to use SemaphoreSlim to make the exiting thread block until an in-progress write operation completes, but that probably caused a deadlock because the app wouldn’t close if a log entry happens to be in the middle of being written while you’re quitting, it gets cut in half, oh well fun fact: the ItemsRepeater Avalonia control exists on GitHub, even the docs describe how to use it, but it just didn’t show up for me despite using the latest Avalonia version this made me use a ListBox, which has selection (although you can’t see it because of the background of each log entry)"}, {"post_id": 34591, "ts": "2026-07-25T13:27:50Z", "hours": 4.0242, "text": "made settings sections with a whole lot of unnecessary abstractions for the funny [FromKeyedServices] when i could just access a static instance? absolutely yes!! i couldn’t figure out how to style the children of an ItemsControl externally, so i had to give it an ItemTemplate with a class (which would be unnecessary if i could style the thing) all that for a separator line… and padding… and margin… what if i just nuke this idea and simply have some spacing between the sections? i tried organizing classes into vertical slices architecture, but i gave up and only did it for the Linux project instead the using updates would’ve been funky + some global usings would become useless PipeWire the toggle list now no longer “flickers” on/off when refreshing devices, as i only set the link manager after PipeWire objects have been queried device lists and link toggles are now disabled when switching devices so the user doesn’t accidentally break the linking process added a button that refreshes links (in case things go wrong somehow) you can now select the physical microphone from the PipeWire list, and it will update links this preference isn’t saved to disk just yet in my last devlog i mentioned some issues, which have now been fixed: upon startup, the first two switches don’t work sometimes (race condition maybe?) turns out that i had forgotten to add a potentially valid node to the list after looping through all lines, so it just discarded the last entry certain links might not reconnect properly when switching the output device what did i do to fix that? i’m not sure anymore maybe it was a bit of delay? this one might be linked related to the former issue"}, {"post_id": 34223, "ts": "2026-07-24T19:01:37Z", "hours": 8.9867, "text": "PIPEWIRE WORKS!!1!1! spent almost all day adding PipeWire node linking support i was genuinely tweaking when i found out that the pw-cli create-link command doesn’t create a link… it does NOTHING wishful thinking to assume that i can simply tell PipeWire to connect nodes automatically now i have to query the ports, too, and connect those automatically; make sure to sort them, otherwise the channels might be mixed up ahaha (a0b498e7 khm khm) i spent plenty of the time debugging, the parser i wrote had some funky stuff how to use it there are 4 toggles you can activate, as shown in the video: sounds to primary output: this will play the soundboard’s audio in your headphones/primary speakers sounds to virtual mic: forwards soundboard audio to the virtual microphone, letting others (e.g. in a call or in a game) hear the sounds mic passthrough: connects your “real” microphone to the virtual microphone, allowing others to hear your voice when using the virtual mic hear myself: connects your real microphone to your primary output device more issues upon startup, the first two switches don’t work sometimes (race condition maybe?) certain links might not reconnect properly when switching the output device (it used to be worse when i queried links every time; it would connect only one port to the destination because the port ID was now assigned to something else) some miscellaneous fixes: fixed certain issues with xdg-desktop-portal shortcut assignments removed the upload date from YouTube video views fixed the NativeAOT build (an attribute was missing that let the ServiceProvider know not to strip view & viewmodel constructors) added a DataToggle control that inherits from ToggleSwitch : clicking on it doesn’t toggle it automatically, the binding controls the state"}, {"post_id": 32372, "ts": "2026-07-21T14:38:36Z", "hours": 6.5217, "text": "FINALLY figured out how to interface with xdg-desktop-portal, global shortcuts now work on Linux!!! (with a caveat ofc) subsequent bind requests to the same action will just be ignored by the portal, even if you closed the dialog without binding any shortcuts you should still be abe to bind them in System Settings props to Pinta for the example on how to do this (the DBus flow kinda sucks ngl) making this was partially possible because Avalonia updated to the latest Tmds.DBus version adjusted the YouTube downloader layout: removed the description in favor of a stream selector that also got rid of the upload date, oops added a dummy ✏️ button to sounds (basic editor coming soon) i don’t even want to think about how i’ll render waveforms without making the system go kaboom also added a number input for volume, letting users type in the desired percentage Avalonia magically handles the percentage conversion, i didn’t have to make a converter that multiplies the input by 0.01 made pages dynamic, fixing the inconsistent layout this will make it easier to add platform-specific tabs instead of having to dump everything into settings TabStrip just didn’t work properly, so i’ll stick with the TabControl (which doesn’t have… tab… focus…) OtherSoundInteraction now lets you mute, pause or stop other sounds when a new playback is triggered adopted Injectio so i can slap a [RegisterSingleton] attribute on each class i want in dependency injection without having to go to a different place to add a statement the “Stop All Instances” button is now replaced by the “Relink” button for files that were not found you can now drag-and-drop sounds into the board from the file manager"}, {"post_id": 9155, "ts": "2026-06-15T10:26:57Z", "hours": 6.5614, "text": "Did a bit of refactoring to accomodate for later NativeAOT support: Each view & viewmodel has to be registered as a service Moved to source-generated JSON handling Hopefully, NativeAOT will make the app noticeably faster when I publish the project Added global usings, and split up the project for better platform-specific service organization Fixed the delete button not stopping the sound (how did I manage to fail that??) Replaced the loop toggle with an Assign Shortcut button for quick access I think the latter will be used more often, but having the loop toggle update two buttons at once was really cool Sounds can now be added from YouTube; they are cached for fast access (how else would it work xd) The window is not a dialog, so you can still interact with the soundboard while waiting for download(s) (Idk if dialogs prevent interactions on some desktop environments tbh) This is not the final layout, but it looks decent for now: clicking on a video (left side) takes you to the details page (right side) in the same window Fun fact: pasting a youtube link automatically opens the video view, letting you download it even while the details are loading (will have to fix that up a little)"}, {"post_id": 7556, "ts": "2026-06-12T17:03:41Z", "hours": 5.6711, "text": "More (almost zero) progress on global shortcuts: I’ve figured out the object path & destination from the Kotlin library zugaldia/stargate , but xdg-desktop-portal just crashes now upon calling CreateSession Nothing usable yet Added a devices page to select the output device I tried to implement device switching by creating a separate Mixer, but SoundFlow already has functionality for that, so it became much simpler Refactored code to use the new SoundFlowDeviceManager A “Stop All Sounds” shortcut can now be assigned to each input when clicking the gear icon next to it Fixed shortcut assignment not working after switching pages Editing context is reopened on page change The SelectionChanged event fired for every child control, not just the TabControl -> I now check for the source of the event Attempted to add consistent text alignment in tab headers, that turned out to be stupid, so I just added a space after the Playbacks emoji Removed the “Raise Maximum Volume” (a 0-150% range makes more sense imo) Adjusted buttons in the sound editing view, this is not yet final On the image you can see a pipewire graph I created, this is similar to how I want it to work A sink for soundboard output which can be forwarded to the primary output device (e.g. headphones) A mixer virtual device (discord doesn’t support sinks) that combines the microphone input and the soundboard sink, acting as a virtual mic which can be selected in apps From a bit of testing, it turns out that connecting a sink to the primary output device produces some annoying popping, so I’ll probably just link/unlink the app’s playback to/from the primary output device, too"}, {"post_id": 6330, "ts": "2026-06-10T17:29:02Z", "hours": 4.1664, "text": "Added pages & tabs to better separate UI Activated inputs are now saved and loaded Sound state is now displayed better, it includes missing file detection (exceptions are not yet handled) Using a MultiBinding and an IMultiValueConverter with an enum didn’t work for some reason New page: playbacks It shows all sounds, their current time Will need a redesign Pro tip: don’t call Dispatcher.Post in a method you called Dispatcher.Post in (it will keep updating the UI but prevents user input, you can’t even close the window normally) Did a bit of refactoring: AudioManager is now a service Removed the Host service, the desktop lifetime and the TopLevel will be injected Added an overlay when a file dialog is open (because unlike windows, not all OSes/desktop environments prevent interactions in this situation)"}, {"post_id": 5129, "ts": "2026-06-08T20:23:24Z", "hours": 5.0069, "text": "Implemented input handling for the Launchpad Mini, now I’ll be able to press pads to play sounds Creating the shortcuts system took a few iterations, I wasn’t happy with the code I wrote Shortcuts can be removed even when the input method isn’t active, which wasn’t possible in an earlier iteration Also implemented settings saving when the app exits"}, {"post_id": 2246, "ts": "2026-06-04T17:06:50Z", "hours": 5.5297, "text": "Added a proper UI for triggering sounds with modes similar to that of voicemod (start -> stop, start -> restart, play -> pause, duplicate) I played around with 2 rows below the big button but that seemed to take up too much space, so I moved them to the sound editor (which isn’t fully functional yet) On the right side you can see input methods, which will include global shortcuts later (DBus is confusing af, the win32 api might actually be easier to work with 💀) (Yes, I’ve half-made a global keyboard handler for windows previously) Emojis are fairly expressive imo, but there are tooltips that describe what each button does The layout definitely needs improvements, but it’s something ig Also implemented loading sounds on startup, as well as saving when a new sound is added"}, {"post_id": 1536, "ts": "2026-06-03T16:49:22Z", "hours": 1.8456, "text": "Created the very base of the project with Avalonia and SoundFlow, sound playback works Spent a bunch of time trying to figure out the DBus interface for XDG global shortcuts (Linux part of keybinds): Somehow I grabbed the impl xml, not the one i needed It still doesn’t work, gonna need to debug it later I was trying to write abysmal code based on what Avalonia has: https://github.com/AvaloniaUI/Avalonia/blob/12.0.4/src/Avalonia.FreeDesktop/DBusSystemDialog.cs The source generator used in the latest Avalonia release is a different source generator from what i saw on master, that caused a bit of a headache"}]...
|
Title: Soundboword by @Axwabo | Stardance
Devlogs Title: Soundboword by @Axwabo | Stardance
Devlogs:
Created the very base of the project with Avalonia and SoundFlow, sound playback works Spent a bunch of time trying to figure out the DBus interface for XDG global shortcuts (Linux part of keybinds): Somehow I grabbed the impl xml, not the one i needed It still doesn’t work, gonna need to debug it later I was trying to write abysmal code based on what Avalonia has: https://github.com/AvaloniaUI/Avalonia/blob/12.0.4/src/Avalonia.FreeDesktop/DBusSystemDialog.cs The source generator used in the latest Avalonia release is a different source generator from what i saw on master, that caused a bit of a headache
Added a proper UI for triggering sounds with modes similar to that of voicemod (start -> stop, start -> restart, play -> pause, duplicate) I played around with 2 rows below the big button but that seemed to take up too much space, so I moved them to the sound editor (which isn’t fully functional yet) On the right side you can see input methods, which will include global shortcuts later (DBus is confusing af, the win32 api might actually be easier to work with 💀) (Yes, I’ve half-made a global keyboard handler for windows previously) Emojis are fairly expressive imo, but there are tooltips that describe what each button does The layout definitely needs improvements, but it’s something ig Also implemented loading sounds on startup, as well as saving when a new sound is added
Implemented input handling for the Launchpad Mini, now I’ll be able to press pads to play sounds Creating the shortcuts system took a few iterations, I wasn’t happy with the code I wrote Shortcuts can be removed even when the input method isn’t active, which wasn’t possible in an earlier iteration Also implemented settings saving when the app exits
Added pages & tabs to better separate UI Activated inputs are now saved and loaded Sound state is now displayed better, it includes missing file detection (exceptions are not yet handled) Using a MultiBinding and an IMultiValueConverter with an enum didn’t work for some reason New page: playbacks It shows all sounds, their current time Will need a redesign Pro tip: don’t call Dispatcher.Post in a method you called Dispatcher.Post in (it will keep updating the UI but prevents user input, you can’t even close the window normally) Did a bit of refactoring: AudioManager is now a service Removed the Host service, the desktop lifetime and the TopLevel will be injected Added an overlay when a file dialog is open (because unlike windows, not all OSes/desktop environments prevent interactions in this situation)
More (almost zero) progress on global shortcuts: I’ve figured out the object path & destination from the Kotlin library zugaldia/stargate , but xdg-desktop-portal just crashes now upon calling CreateSession Nothing usable yet Added a devices page to select the output device I tried to implement device switching by creating a separate Mixer, but SoundFlow already has functionality for that, so it became much simpler Refactored code to use the new SoundFlowDeviceManager A “Stop All Sounds” shortcut can now be assigned to each input when clicking the gear icon next to it Fixed shortcut assignment not working after switching pages Editing context is reopened on page change The SelectionChanged event fired for every child control, not just the TabControl -> I now check for the source of the event Attempted to add consistent text alignment in tab headers, that turned out to be stupid, so I just added a space after the Playbacks emoji Removed the “Raise Maximum Volume” (a 0-150% range makes more sense imo) Adjusted buttons in the sound editing view, this is not yet final On the image you can see a pipewire graph I created, this is similar to how I want it to work A sink for soundboard output which can be forwarded to the primary output device (e.g. headphones) A mixer virtual device (discord doesn’t support sinks) that combines the microphone input and the soundboard sink, acting as a virtual mic which can be selected in apps From a bit of testing, it turns out that connecting a sink to the primary output device produces some annoying popping, so I’ll probably just link/unlink the app’s playback to/from the primary output device, too
Did a bit of refactoring to accomodate for later NativeAOT support: Each view & viewmodel has to be registered as a service Moved to source-generated JSON handling Hopefully, NativeAOT will make the app noticeably faster when I publish the project Added global usings, and split up the project for better platform-specific service organization Fixed the delete button not stopping the sound (how did I manage to fail that??) Replaced the loop toggle with an Assign Shortcut button for quick access I think the latter will be used more often, but having the loop toggle update two buttons at once was really cool Sounds can now be added from YouTube; they are cached for fast access (how else would it work xd) The window is not a dialog, so you can still interact with the soundboard while waiting for download(s) (Idk if dialogs prevent interactions on some desktop environments tbh) This is not the final layout, but it looks decent for now: clicking on a video (left side) takes you to the details page (right side) in the same window Fun fact: pasting a youtube link automatically opens the video view, letting you download it even while the details are loading (will have to fix that up a little)
FINALLY figured out how to interface with xdg-desktop-portal, global shortcuts now work on Linux!!! (with a caveat ofc) subsequent bind requests to the same action will just be ignored by the portal, even if you closed the dialog without binding any shortcuts you should still be abe to bind them in System Settings props to Pinta for the example on how to do this (the DBus flow kinda sucks ngl) making this was partially possible because Avalonia updated to the latest Tmds.DBus version adjusted the YouTube downloader layout: removed the description in favor of a stream selector that also got rid of the upload date, oops added a dummy ✏️ button to sounds (basic editor coming soon) i don’t even want to think about how i’ll render waveforms without making the system go kaboom also added a number input for volume, letting users type in the desired percentage Avalonia magically handles the percentage conversion, i didn’t have to make a converter that multiplies the input by 0.01 made pages dynamic, fixing the inconsistent layout this will make it easier to add platform-specific tabs instead of having to dump everything into settings TabStrip just didn’t work properly, so i’ll stick with the TabControl (which doesn’t have… tab… focus…) OtherSoundInteraction now lets you mute, pause or stop other sounds when a new playback is triggered adopted Injectio so i can slap a [RegisterSingleton] attribute on each class i want in dependency injection without having to go to a different place to add a statement the “Stop All Instances” button is now replaced by the “Relink” button for files that were not found you can now drag-and-drop sounds into the board from the file manager
PIPEWIRE WORKS!!1!1! spent almost all day adding PipeWire node linking support i was genuinely tweaking when i found out that the pw-cli create-link command doesn’t create a link… it does NOTHING wishful thinking to assume that i can simply tell PipeWire to connect nodes automatically now i have to query the ports, too, and connect those automatically; make sure to sort them, otherwise the channels might be mixed up ahaha (a0b498e7 khm khm) i spent plenty of the time debugging, the parser i wrote had some funky stuff how to use it there are 4 toggles you can activate, as shown in the video: sounds to primary output: this will play the soundboard’s audio in your headphones/primary speakers sounds to virtual mic: forwards soundboard audio to the virtual microphone, letting others (e.g. in a call or in a game) hear the sounds mic passthrough: connects your “real” microphone to the virtual microphone, allowing others to hear your voice when using the virtual mic hear myself: connects your real microphone to your primary output device more issues upon startup, the first two switches don’t work sometimes (race condition maybe?) certain links might not reconnect properly when switching the output device (it used to be worse when i queried links every time; it would connect only one port to the destination because the port ID was now assigned to something else) some miscellaneous fixes: fixed certain issues with xdg-desktop-portal shortcut assignments removed the upload date from YouTube video views fixed the NativeAOT build (an attribute was missing that let the ServiceProvider know not to strip view & viewmodel constructors) added a DataToggle control that inherits from ToggleSwitch : clicking on it doesn’t toggle it automatically, the binding controls the state
made settings sections with a whole lot of unnecessary abstractions for the funny [FromKeyedServices] when i could just access a static instance? absolutely yes!! i couldn’t figure out how to style the children of an ItemsControl externally, so i had to give it an ItemTemplate with a class (which would be unnecessary if i could style the thing) all that for a separator line… and padding… and margin… what if i just nuke this idea and simply have some spacing between the sections? i tried organizing classes into vertical slices architecture, but i gave up and only did it for the Linux project instead the using updates would’ve been funky + some global usings would become useless PipeWire the toggle list now no longer “flickers” on/off when refreshing devices, as i only set the link manager after PipeWire objects have been queried device lists and link toggles are now disabled when switching devices so the user doesn’t accidentally break the linking process added a button that refreshes links (in case things go wrong somehow) you can now select the physical microphone from the PipeWire list, and it will update links this preference isn’t saved to disk just yet in my last devlog i mentioned some issues, which have now been fixed: upon startup, the first two switches don’t work sometimes (race condition maybe?) turns out that i had forgotten to add a potentially valid node to the list after looping through all lines, so it just discarded the last entry certain links might not reconnect properly when switching the output device what did i do to fix that? i’m not sure anymore maybe it was a bit of delay? this one might be linked related to the former issue
dev log about logging, crazy added logging in-app and also to files you can configure log levels, None disables file logging altogether i was looking around to find a simple file logger for Microsoft.Extensions.Logging, but i didn’t like it so i made my own, even simpler version took a bunch of attempts to make the architecture bearable, but it’s still kinda jank with the existence of LogPreferences.Instance (instead of using the service provider… but whatever, i make the rules :3) turns out that MultiBinding doesn’t work for a bool that hides the bottom bar (idk why), so i did some wiring by subscribing to PropertyChanged in the preferences and the log list only at the time of recording did i realize that the initial value isn’t set properly, so i gotta fix that tried to set PublishAot to true for all projects (so i don’t have to specify it in dotnet publish ), but that breaks the preview, so i had to revert the change unhandled UI exceptions are now written to the file the unobserved task exception event just… doesn’t seem to fire… i got rid of that tried to use SemaphoreSlim to make the exiting thread block until an in-progress write operation completes, but that probably caused a deadlock because the app wouldn’t close if a log entry happens to be in the middle of being written while you’re quitting, it gets cut in half, oh well fun fact: the ItemsRepeater Avalonia control exists on GitHub, even the docs describe how to use it, but it just didn’t show up for me despite using the latest Avalonia version this made me use a ListBox, which has selection (although you can’t see it because of the background of each log entry)
i did mostly polishing work during this time, now i can torture myself with windows global shortcuts gotta crash out first though cuz this wonderful website has 3 different markdown renderers somehow, and i’ve been using --- to make sections actually separate changed the TabControl to a TabStrip so i can use my on page switching logic most views are only created once now, which gives a slight performance boost i’d noticed that quickly switching between tabs while using TabControl lead to slight crackles in audio, that’s taken care of now oh and you can use the Tab key to navigate, cuz TabStrip can magically do that getting the lazy-ish loading was pretty funky though, UserControls are lazy by default so i had to hack around it to preload the views by setting IsVisible to false after the control loads (i think that’s what i did, i kinda forgor) fixed the YouTube stream loader, and added a local error display so you can immediately see if something went wrong made it so non-bound XDG-Desktop-Portal shortcuts are no longer detected removed the sound edit button for now, i would like to ship without having to figure all that out made StackPanel spacing mostly uniform using a style selector, though it looks pretty bad in device selectors general settings & logging settings are now saved and loaded added Rescan and Relink All buttons Rescan checks not found files again to locate them Relink All lets you pick directories to look for not found sounds by their filenames in the video, i unmounted the disk that had some files, then relinked sounds to locate it elsewhere
I’M GONNA TWEAK OUT 9 hours on slopdows bullshit… IT FINALLY WORKS (except not really because removing keybinds doesn’t..?) okay so i restored some of the styling, 0 padding in the Inputs listbox looked bad not sure what else i did that isn’t losedows suffering lmao sooooooo “win”dows is special if you hold Ctrl, it doesn’t call the TextInput event, meaning that i have to translate the Key enum the TextInput event isn’t flawless either, it can be ambiguous (e.g. hungarian layout: AltGr+J = í, AltGr+I = Í, Soundboword makes them uppercase) should i remove the automatic uppercase conversion? i spent a lot of time “debugging” (as in, having the CI build it, download the zip, transfer it to a slopdows machine, since native cross-compilation is not supported) the biggest headache was the shortcut list update handler… i negated the TryAdd call, which meant that the global hotkey would only get registered if the same gesture has been added to the dictionary already (therefore it would only work on subsequent binds) i spent way too much time figuring this out another oversight was the lack of Target assignment when you clicked ⚙️ on an input method, meaning that binding shortcuts did nothing idk why the entire panel is bold, gotta fix that hotkeys are temporarily removed while you’re assigning a shortcut however, as mentioned before, this doesn’t work xd i tried it on a slopdows laptop, and removing the A hotkey made the A key unusable until i closed Soundboword setting up CI wasn’t difficult, gotta make sure to separate rm commands and use -f so files not found don’t error using || doesn’t run the latter command if the first one succeeds, i should’ve known that
most likely the last devlog before i outgrow hackclub :’3 finalized the project, improved the CI workflow to bundle the program properly and include 3rd party licenses completed the README added a simple sound “editor” that lets you specify the following: start time: where to begin playback loop start: where to jump when restarting on loop (start of file by default) loop end: the point where loop triggers (end of file by default) made the sidebar (Sounds and Inputs views) consistent added icons to almost every window (Linux crashed because the PipeWire icon wasn’t in that project lol) message to future self: you need the leading slash in the Icon property (e.g. /Assets/sus.ico works but not Assets/sus.ico ) the video shows the new configure sound on trigger click feature, resembling the behavior of Voicemod implemented the missing “Auto Mic Passthrough” (as described in the README) the physical microphone preference is now saved fixed the hidden toggles taking up space on slopdows RowDefinitions don’t support binding, not even OnPlatform :( hopefully i don’t gotta fix anything, and it’s ready to ship
Ships:
Soundboword is an actually usable desktop soundboard for (primarily) Linux and (with apparent support for) windows tired of other soundboards paywalling slots? not anymore! [insert Phil Swift Flex Tape meme, not sponsored] this is a .NET app built with Avalonia, SoundFlow, and YoutubeExplode you don’t need to install .NET, it’s compiled into a native binary the SoundFlow backend in use is based on miniaudio, so the app only supports mp3 and wav files download audio from YouTube (paste a link or search) for Linux, there is additional PipeWire support use the PipeWire wizard to create a virtual device named “Soundboword Microphone” which you can select in apps (e.g. Discord) after setting up the microphone, you can use the toggles in the bottom left to manage some node links (connect/disconnect audio nodes) Hear Sounds: plays the soundboard to your headphones Mic Sounds: plays the soundboard into the virtual microphone Mic Passthrough: connects the selected physical microphone to the virtual mic Hear Myself: connects your physical mic to your headphones, echoing what you say windows support is partial, macos support will not be provided global hotkeys should work out of the box on losedows the Linux version uses xdg-desktop-portal for global shortcuts if you have a Launchpad Mini MKII lying around, you can use it with this program :3...
|
1792853371.276656
|
1792939771.276656
|
|
406
|
MemeBoard by @tonymac129 | Stardance
|
tonymac129
|
1
|
55.0
|
994
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-06T22:02:36Z", "hours": 55.0, "multiplier": 18.15, "payout": 994, "blessing": "neutral", "text": "I finally finished making MemeBoard after periodically working on it over the past 3 months! MemeBoard is an accessible and easy to use fullstack online social platform for posting, sharing, and exploring all kinds of memes. There are many different post interaction features such as voting, commenting, saving, reacting, and sharing, it’s essentially a simple Reddit clone that’s exclusively for memes. You can browse, filter, and search through memes easily by choosing different sorting options and exploring the different tags and collections. It also has social features like following users and customizing your profile, as well as a full-featured realtime chat (mini Discord clone) where you can send content and chat with your friends or interact with MemeBot (which is not an LLM, it’s just a random thing I thought was fun to implement)! The entire website is also fully responsive and functional on all screen sizes with smooth loading and transition animations, and you can toggle between dark and light modes. I got bored of the project halfway through it to work on other stuff, but I ended up coming back more than a month later to finally finish everything and polish it to ship, and the final result is definitely very satisfying and rewarding for me, hopefully you’ll like it :)", "repo": "https://github.com/tonymac129/memeboard", "demo": "https://memeboard-app.vercel.app"}]...
|
[{"post_id": 63210, "ts": "202 [{"post_id": 63210, "ts": "2026-09-06T21:49:05Z", "hours": 1.5575, "text": "Final MemeBoard devlog! I finally finished MemeBoard after working on it over the past 3 months! I’ve implemented all the features I originally planned to make, as well as added a ton of other stuff to make the project interesting and fun to use I mostly just polished the project in this update, so there isn’t actually anything new other than the simple “m” logo/favicon I added to the nav bar and footer Added a top loading bar indicator to show the page is responsive and is actively loading since some pages take a bit of time to fetch data, and I’m too lazy to implement suspense/loading skeleton and all that Clicking on things that require the user to be signed in now redirects you to the sign in page so it’s more user friendly and not confusing Updated the README to document detailed information, all the features, setup instructions, and everything else about the project Fixed an annoying issue where MemeBot didn’t respond at all or took a long time by simply deleting an intentional timeout and the bug was somehow fixed Updated styling and layout components"}, {"post_id": 62607, "ts": "2026-09-06T02:31:58Z", "hours": 3.0308, "text": "Meme reactions, animations, and polishing Added reactions to memes (kind of similar to Reddit awards) so you can now choose an emoji to express what you think about the meme! There is a new React button on the meme bar that opens an emoji selection menu that lets you choose your reaction. You can see all the meme’s reactions sorted by number of users listed below the bar and can click on them to switch your reaction or unreact (since you can only react once) Reactions are anonymous, so you can only see the number of reactions with your own reaction highlighted Added subtle page transition animations to the layout and individual components to make navigation and user interactions a lot smoother and more aesthetically pleasing Added a 404 not found page with an occasional stylized glitching effect and buttons to go home or go back Added more detailed and dynamically generated OpenGraph metadata to improve SEO Updated backend Prisma schema and migrated database Updated types and styling Fixed a few display, light mode, and responsive design bugs MemeBoard is almost finished, it’ll probably be ready to ship after one final devlog and some polishing touches!!!"}, {"post_id": 61608, "ts": "2026-09-04T16:23:00Z", "hours": 1.9592, "text": "Light mode toggle Added a button on the nav bar that toggles the site’s entire appearance between dark and light mode to improve its customizability and accessibility Because every component has a default color transition, switching between the 2 modes has a smooth UI transition instead of flashing to the other color instantly I had to set up the theme provider and manually add the light mode Tailwind classes and the dark mode prefix for all the colors in every page and component, so this took quite a long time but the result was worth it, both modes look pretty consistent and visually appealing"}, {"post_id": 59928, "ts": "2026-09-01T23:23:11Z", "hours": 3.3867, "text": "MemeBoard is back!!! I’ve been a lazy bum this entire summer and didn’t finish a single one of my more serious projects on Stardance before losing interest and moving on to a new idea, but now that the event is ending in a month (nooo ) I finally forced myself to come back and finish up/ship my old projects one by one School just started so I’ll hopefully still have enough time to ship most of my projects before October. Since no one has used MemeBoard at all in over 2 months, I had to upgrade some packages, resetup some deployment stuff, and reactivate the databases for everything to function normally I also spent some time getting familiar with the codebase again, so I didn’t make a lot of changes this update. I added a few quality of life features like sharing/reporting comments, homepage meme and chat sections, and user search for finding people to follow When you click on share for a comment, the share modal pops up listing all your friends that you can select to send the comment and a message to, as well as options to copy the link and to report it Comments show up as embedded text with the user and like count displayed, and clicking on it takes you to its location on the original meme page for easy viewing (definitely not stolen from TikTok ) When you click on add user on the chat page, it shows a modal where you can use the API to search for people to add as friends, making chatting and sharing memes more convenient Added recent, top, all time, friend memes, and recent chat sections to the homepage to make navigating the platform and browsing memes easier Added call to action buttons on the homepage hero to make using the site more intuitive Updated content and styling Updated MemeBot behavior Updated README Fixed chat deployment issue Did some miscellaneous stuff/improvements/fixes that I forgot"}, {"post_id": 19564, "ts": "2026-06-30T21:50:01Z", "hours": 2.1125, "text": "More collections features You can now search, sort, and filter collections on the collections page to browse and explore public collections other people created! You can filter your friends’ and your own collections to make managing them easier You can now add an optional description describing what your collection is about, either on the add or edit collection modal You can now change the visibility of your collection to be either public or private, where public collections are displayed on your profile and the collections page for everyone to see, and only you can see your own private collections Added a new private collections section on your profile that only you can see it Added a create collection modal that shows up when you click on the button on the collections page to make creating collections easier Added a create tag modal that shows up when you click on the button on the tags page, but unlike collections you can only put the name of the tag since that’s the only thing a tag has Updated schema and types Updated styling and SEO"}, {"post_id": 17714, "ts": "2026-06-28T17:01:30Z", "hours": 2.5683, "text": "MemeBot & bug fixes Added MemeBot to everyone’s chat, so even if you haven’t friended someone on the platform you can still try out all the chat features since MemeBot also sends messages in realtime MemeBot isn’t actually another AI chatbot or anything, it just responds with a random hardcoded string message (very intelligent, i know) from the backend whenever a user sends it a message after a certain delay to simulate realtime chatting Since MemeBot isn’t actually a user, I had to modify the chatting system quite a bit and put a lot of extra conditionals and logic to ensure it works properly for both MemeBot and real users, and that was quite annoying to figure out Fixed an annoying caching bug where you had to refresh the entire chat page for realtime interactions to work properly when chatting with someone for the first time, otherwise the chat just froze. This took a long time to fix, but the UX is finally smooth and works well Fixed some issues of the chat related to auth and not being logged in Updated styling"}, {"post_id": 17111, "ts": "2026-06-27T19:43:00Z", "hours": 1.7958, "text": "Random quality of life features I think I’m almost finished with MemeBoard, so now I’m just making random small features that I skipped over earlier Added realtime chat message previews for each of your chats that shows the last message and who sent it on the left sidebar so it feels more like Discord and Slack Added a tag filtering dropdown on the Memes page where you can see all the tags, search for them, and choose one to see all the memes labeled with that tag. This makes it a lot easier to browse, filter, and find similar memes Added an options menu button to the tag page (that only shows if you’re the one who made the tag) similar to the button I added to a bunch of other pages. When clicked, it shows a menu with just a delete option that deletes the tag and removes its label from all the memes after a confirmation modal Added both dynamically generated SEO and static SEO to some pages that didn’t have it Updated styling and navigation"}, {"post_id": 16679, "ts": "2026-06-27T03:33:33Z", "hours": 2.7094, "text": "Collection features & cleanup Similar to the meme page, when you view the page of a collection you created, there is an options icon that when clicked, opens a menu where you can edit or delete the collection If you press on edit, an edit modal pops up where you can edit the name and select which memes should be in the collection If you press on delete, a warning modal shows up, and if you press delete the collection will be permanently deleted Added a search bar on the main collections page where you can search for your own or other people’s collections Added the collections tab to the main nav bar and the footer to improve navigation You can now add a short public about me bio on your profile by clicking on the edit profile button that shows an input edit modal When you hover over your own messages, a delete button now shows up that lets you delete the message for both of you after a confirmation modal just like all the other delete functionalities You can undo the deletion by pressing on the undo button that shows up, which restores the message for both of you I spent most of my time on MemeBoard developing while logged in, so I wasn’t aware most of my pages were completely broken and returning errors if someone visited them while not being logged in, so I implemented a ton of conditionals and permission stuff for auth to make sure every page works properly or redirects to the login page When you’re not logged in, you can still use the app and browse memes, it’s just that a lot of features are unavailable Updated backend schema and types Updated styling Fixed a few bugs and issues caused by auth"}, {"post_id": 15440, "ts": "2026-06-25T03:01:05Z", "hours": 1.8839, "text": "Responsive design Finally added responsive design to all pages on the platform so MemeBoard works properly and the layout stays organized and visually appealing for all screen sizes! Added a menu button that shows up when the screen size is smaller than a certain width, which when clicked opens a sidebar that slides in from the left containing all the links. This declutters the layout while improving the UX of the app Added a search bar to the tags page where you can search all the tags people created and browse memes more easily Refactored code for some UI elements to make everything more optimized and clean Fixed chat layout UI breaking with excessively long messages Added some minor styling adjustments"}, {"post_id": 13355, "ts": "2026-06-21T21:30:32Z", "hours": 4.0244, "text": "Editing/deleting posts & more chat features! Added an option button on the top right of the meme pages you posted which when clicked displays a menu that lets you edit or delete the post Clicking on the edit option takes you to a dedicated post editing page where you can edit the title, tags, description, and source link and reupload the image of the meme (metadata, comments, and everything else remains unchanged), and clicking save takes you back to the newly edited page Clicking on the delete option shows a confirmation modal/dialog warning you, and if you press delete all the meme’s data will be permanently deleted and you get redirected back to the memes pages A similar option menu button is also added to the top right corner of your comment, where you can edit (a modal with an edit input field and buttons shows up) or delete (also has a confirmation dialog) the comment You can now also edit your own messages (only the text and not what you’re replying or the embedded meme), when you click on the edit message button a modal with an edit input pops up, and the edited message is updated in realtime You can now react to both yours or your friends messages to express what you think! When you click on the react button an emoji menu shows up where you can browse for the emoji you want Reactions and their counters update in realtime and you can remove the reaction by clicking on it again (the feature works exactly how all messaging apps’ reactions work) After you press on the share meme button when sharing to a friend, the button now becomes a link that takes you to the chat where you can see the message Updated schema and types Updated styling I kinda forgot to make more devlogs again, so this one is another massive wall of text covering a ton of different features. The video is also 2 minutes so I had to compress it to upload 😭 I promise I’ll try to keep future devlogs shorter and more focused :)"}, {"post_id": 12330, "ts": "2026-06-20T03:35:53Z", "hours": 3.5969, "text": "Meme sharing and more chat features! I sort of got carried away with this chat feature thing so MemeBoard is now a weird combination of Reddit and Discord instead of the original meme platform I planned it to be When you click on the share button on a meme page and open the sharing modal, you can now see all your friends listed and you can select who to send the meme to, as well as an optional message This actually sends a message to the chat with your friend, and it shows up as an embedded preview meme with its creator, title, image, and number of likes/comments/shares displayed Clicking on the embed preview takes you to the actual meme page Added chat replies so when you click on the reply button next to your friend’s message, a box shows up above the input field showing the message you’re currently replying to When you send the message, a reply bar/message preview similar to Discord’s shows up above the message, and clicking on it scrolls the page to the original message and briefly highlights it, similar to Discord’s Messages are grouped together so message header info (sender, time, profile image…) only shows under certain circumstances (similar to Discord) for a cleaner and better UI Refactored how messages and their components are rendered/structured for better optimization and performance Added an API route for client components to fetch meme data from the database Updated schema and types Updated the styling of different chat pages I forgot to make devlogs, so this devlog is pretty long Sorry again for the terrible layout in the video, my lazy bum hasn’t started on responsive styling yet, so the windows are compressed"}, {"post_id": 9670, "ts": "2026-06-16T02:34:11Z", "hours": 3.5231, "text": "Massive update: chat Added realtime chat where you can send and receive text messages with almost no latency to/from your friends on MemeBoard! The base layout of all the chat pages has a sidebar of the left that displays all your friends, and clicking on them takes you to the different direct message channels On each chat channel page, you can see your friend’s profile picture, username, and number of followers/following at the top, similar to TikTok’s chat Your friend’s messages show up on the left while yours are highlighted and on the right, similar to texts, and each message has a timestamp Integrated a Redis database for quick message retrieval, caching, and ease of use for the Upstash realtime library that uses Web Socket under the hood to push realtime updates/events to send and update messages in realtime I already made a much simpler chat app but with a slightly different backend stack a while ago, so it wasn’t that difficult rewriting everything in Next.js and adding additional features There are actually a lot of considerations and logic that go into making a chat app that you normally wouldn’t think of unless building your own chat, so this was an interesting and fun experience coming up with solutions for unexpected problems Updated schema and types I’ll actually optimize the site and implement responsive design after the main app is finished, so the current layout looks terrible on small screens and I apologize for the terrible layout in the video"}, {"post_id": 8477, "ts": "2026-06-14T03:08:02Z", "hours": 2.3269, "text": "Searching, sorting, and filtering memes Added a search bar, a sorting dropdown, a filtering by time and creator dropdown, a tag dropdown (doesn’t work yet, coming soon), and a number of items dropdown on the explore memes page to make finding and browsing new memes a lot more easier The search bar searches by the meme’s title and only searches when you submit the form to improve performance You can sort by best, which sorts by positive/negative vote ratio, top, which sorts by raw upvote count, and new, which sorts by recency You can filter by time range (now, day, week, and all), memes your friends posted, and memes you posted You can choose to show 5, 10, 25, or 50 memes at a time Added a custom dropdown component for the dropdowns with nice UX MemeBoard is now even closer to being a Reddit clone, I took a lot of inspiration from its features except my sorting/filtering is mainly frontend, which is not good practice but I’m too lazy to implement API endpoints for fetching memes Refactored the upvoting/downvoting component and logic so it directly communicates with the backend rather than using a hook to make it more modular and performant Meme cards now show the voting component and vote count I’m almost finished with the meme aspect of this project, the next big part is the realtime chat and sharing with friends and MemeBoard will be finished! I should probably stop using aura monster as the test meme, it’s starting to become corny :("}, {"post_id": 7915, "ts": "2026-06-13T06:13:24Z", "hours": 2.0725, "text": "Comment likes and replies You can now like meme comments (and comment replies since they’re counted as normal comments) by clicking on the heart icon on each comment You can also see how many people liked the comment When you click on the reply option on a comment, an input field for your reply and post/cancel buttons show up for you to post your reply The replies show up as nested inside their parent comments to show the discussion flow, and you can technically thread replies infinite levels deep Spent a ton of time trying to figure out how to generate the threaded tree structure, tried recursion and loops and ended up using hashmaps and pointers to nest parent/child comments (I was not locked in while making the algorithm because of the finals I was going to have the next day) Updated schema and styling"}, {"post_id": 7104, "ts": "2026-06-11T21:33:21Z", "hours": 2.1169, "text": "Collection pages, sharing, and reporting Added a main collection tab that displays all the meme collections users created (not just yours), and you can access the page with a header link on the profile page Each collection card either shows a gray rectangle if there’s no meme or a stack of images with a preview image on top if there’s multiple memes When you click on a collection, it takes you to its own page where its name, creator, and all the memes are displayed Collections a user created are also displayed on their profile page in a new section The share button shows a sharing modal where you can either share the meme to your friends (doesn’t work yet, will be integrated with chat), copy the link and send it somewhere else, or report it If you choose report or click on the report option, another modal shows up where you can select report reasons and provide additional feedback Added new schemas and types Updated navigation and styling"}, {"post_id": 6006, "ts": "2026-06-10T02:14:13Z", "hours": 1.4364, "text": "Additions & Changes Added saving memes to collections so other than voting you can curate, organize, and categorize your own custom lists of memes! When you click on the save option, a modal pops up showing collections you created and a button that lets you add new collections, as well as a search bar for the collections You can also see how many memes are currently saved in the selections When you click save, the option shows the saved state and displays how many collections the meme is saved in You can only save memes to collections you created Added a new user profile section for collections, but it currently doesn’t show anything yet Updated schema and types and learned some new relational database and Prisma concepts"}, {"post_id": 5957, "ts": "2026-06-09T23:41:13Z", "hours": 1.2425, "text": "Additions & Changes Added a voting system for memes (sort of like a rip off Reddit) where you can upvote, downvote, or remove your vote by clicking on the arrows You can also see the total vote count of the meme in real time to see its popularity The upvote/downvote buttons are displayed below the meme, along with the save and share buttons that will work soon Added an optional original source field for posting a meme to link where you got the original image from A link icon now shows up on the meme page if you provided the source link so people can see the original post and author Updated styling and navigation Updated schema and types"}, {"post_id": 5253, "ts": "2026-06-08T23:28:07Z", "hours": 0.9344, "text": "Additions & Changes When you click on a user’s followers and following on their profile page, a new modal pops up with 2 tabs, followers and following, that shows the accounts they’re currently following/being followed There’s also a search bar that lets you search through the listed users to find people more easily and makes it feel a lot more like Instagram If you are following someone who follows you back (mutual follows), you are automatically added as friends, which shows up as a section on the main profile display area You will be able to send messages through a real-time chat with friends in the future! Added the chat tab that’s just a placeholder page for now Added dynamic SEO Updated navigation and styling"}, {"post_id": 4630, "ts": "2026-06-08T00:46:10Z", "hours": 1.3575, "text": "Additions & Changes You can now edit your account information and customize your own profile by clicking on the edit profile button on the page, which shows a edit form modal! You can change your display name to anything you want, your username to anything that’s not already taken (since it’s used as the param account identifier), and upload a custom profile image (PNG, JPG, and GIF are all accepted) You can also follow and unfollow other users by clicking on the follow button on their profile page, making the platform feel more like a social media/community If you and another account are following each other mutually, you will become friends and unlock additional features (coming soon!) Refactored some code to make everything more modular and optimized"}, {"post_id": 4558, "ts": "2026-06-07T22:03:14Z", "hours": 1.5661, "text": "Additions and Changes Added the tags tab which displays all the tags created on the platform, and each tag has a number showing the number of memes it has and takes you to its own page with its memes displayed Added individual tag pages that shows all the memes categorized under a tag and the user that created it Added the meme card component that shows the meme’s title, author, upload date, and image, and clicking on it takes you to the meme page Features like filtering, sorting, and searching for memes for a specific tag are coming soon! Added user pages that takes in a user’s username as the param and displays the account’s memes and other data If you’re viewing your own profile, you can see options for signing out, deleting the account (with a confirmation dialog), and editing the profile Username is used as param instead of user id to be more human friendly Added static and dynamically generated SEO for the new pages Updated the navigation bar and footer links Removed the profile page since it got replaced by the user page"}, {"post_id": 3298, "ts": "2026-06-06T04:56:02Z", "hours": 2.5442, "text": "Additions & Changes This is a pretty big update, so a lot of stuff has been added and improved :) Added comments so signed in users can post plaintext comments using the comment field under every meme Comment threading and liking will be added soon to milk more hours improve community engagement features You can also see other people’s comments, see when it’s posted, and go to their profile A signin button is shown instead of the comment box if you’re not signed in Improved tags a lot, you can now add custom tags and use either the main ones (marked by a star icon) or custom tags other people or you created to make categorization easier Added input validation and required fields for posting memes to prevent errors Added and updated a lot of models and types to make everything more type safe and complete Updated navigation and styling This is my 5th time trying to post this devlog, I had to compress the video hopefully it works this time"}, {"post_id": 2545, "ts": "2026-06-05T02:49:37Z", "hours": 1.635, "text": "Additions & Changes Added file storage/upload and made the backend for posting a meme work so you can now actually upload an image, give it a name and description, assign it tags, and post it as its own public page! Learned how to work with UploadThing and used it as MemeBoard’s file storage service Added the meme page that fetches and shows all the meme’s data as well as who posted it, with a link to their profile (to be implemented) The meme page also generates SEO dynamically Added the memes page that’s just a placeholder for now where you will be able to browse through and explore all the memes Added a meme Prisma model with a user relation as well as custom types Improved navigation, redirects, and overall user experience Happy birthday daniel (I’m not a larper I watched the entirety of Peak:Zero)"}, {"post_id": 2457, "ts": "2026-06-04T23:08:36Z", "hours": 1.9033, "text": "Additions & Changes Added a post page with a beautiful form where you can input a title, select tags, upload PNG, JPG, or GIF, and provide a description for your meme You can search for tags in the custom tag selection modal that pops up when you click on the select tags button or one of the tags Added the meme type and updated some other types and auth stuff Added a simple footer with credits, navigation links, and the GitHub link The post page doesn’t work yet, it’s just a pretty frontend component (for now) Updated styling My future devlogs will all follow this bullet list format (hopefully the markdown layout turns out alright) to improve readability and storytelling :)"}, {"post_id": 1743, "ts": "2026-06-03T22:36:02Z", "hours": 2.0625, "text": "Basically finished the entire auth system with the Better Auth library, and users can now both sign in and sign up with credentials (email, username, display name, and password) or from a social provider using OAuth (Google and GitHub). I haven’t set up this library or the OAuth services in quite a while so I had to spend some time refiguring everything out and configuring all the different stuff. A username is also automatically assigned if you sign up with email. Added a backend and connected the Neon Postgres database as well."}, {"post_id": 1150, "ts": "2026-06-03T00:12:57Z", "hours": 1.4411, "text": "My first devlog on Stardance!!! Time to work my butt off this entire summer :) I’m making this meme exploring/sharing platform where you can browse the most popular memes or upload them yourself. I set up the basic Next.js project and the dependencies, added some pages and components, and made a pretty nice login/signup form (nothing works right now). Also deployed the site on Vercel."}]...
|
Title: MemeBoard by @tonymac129 | Stardance
Devlo Title: MemeBoard by @tonymac129 | Stardance
Devlogs:
My first devlog on Stardance!!! Time to work my butt off this entire summer :) I’m making this meme exploring/sharing platform where you can browse the most popular memes or upload them yourself. I set up the basic Next.js project and the dependencies, added some pages and components, and made a pretty nice login/signup form (nothing works right now). Also deployed the site on Vercel.
Basically finished the entire auth system with the Better Auth library, and users can now both sign in and sign up with credentials (email, username, display name, and password) or from a social provider using OAuth (Google and GitHub). I haven’t set up this library or the OAuth services in quite a while so I had to spend some time refiguring everything out and configuring all the different stuff. A username is also automatically assigned if you sign up with email. Added a backend and connected the Neon Postgres database as well.
Additions & Changes Added a post page with a beautiful form where you can input a title, select tags, upload PNG, JPG, or GIF, and provide a description for your meme You can search for tags in the custom tag selection modal that pops up when you click on the select tags button or one of the tags Added the meme type and updated some other types and auth stuff Added a simple footer with credits, navigation links, and the GitHub link The post page doesn’t work yet, it’s just a pretty frontend component (for now) Updated styling My future devlogs will all follow this bullet list format (hopefully the markdown layout turns out alright) to improve readability and storytelling :)
Additions & Changes Added file storage/upload and made the backend for posting a meme work so you can now actually upload an image, give it a name and description, assign it tags, and post it as its own public page! Learned how to work with UploadThing and used it as MemeBoard’s file storage service Added the meme page that fetches and shows all the meme’s data as well as who posted it, with a link to their profile (to be implemented) The meme page also generates SEO dynamically Added the memes page that’s just a placeholder for now where you will be able to browse through and explore all the memes Added a meme Prisma model with a user relation as well as custom types Improved navigation, redirects, and overall user experience Happy birthday daniel (I’m not a larper I watched the entirety of Peak:Zero)
Additions & Changes This is a pretty big update, so a lot of stuff has been added and improved :) Added comments so signed in users can post plaintext comments using the comment field under every meme Comment threading and liking will be added soon to milk more hours improve community engagement features You can also see other people’s comments, see when it’s posted, and go to their profile A signin button is shown instead of the comment box if you’re not signed in Improved tags a lot, you can now add custom tags and use either the main ones (marked by a star icon) or custom tags other people or you created to make categorization easier Added input validation and required fields for posting memes to prevent errors Added and updated a lot of models and types to make everything more type safe and complete Updated navigation and styling This is my 5th time trying to post this devlog, I had to compress the video hopefully it works this time
Additions and Changes Added the tags tab which displays all the tags created on the platform, and each tag has a number showing the number of memes it has and takes you to its own page with its memes displayed Added individual tag pages that shows all the memes categorized under a tag and the user that created it Added the meme card component that shows the meme’s title, author, upload date, and image, and clicking on it takes you to the meme page Features like filtering, sorting, and searching for memes for a specific tag are coming soon! Added user pages that takes in a user’s username as the param and displays the account’s memes and other data If you’re viewing your own profile, you can see options for signing out, deleting the account (with a confirmation dialog), and editing the profile Username is used as param instead of user id to be more human friendly Added static and dynamically generated SEO for the new pages Updated the navigation bar and footer links Removed the profile page since it got replaced by the user page
Additions & Changes You can now edit your account information and customize your own profile by clicking on the edit profile button on the page, which shows a edit form modal! You can change your display name to anything you want, your username to anything that’s not already taken (since it’s used as the param account identifier), and upload a custom profile image (PNG, JPG, and GIF are all accepted) You can also follow and unfollow other users by clicking on the follow button on their profile page, making the platform feel more like a social media/community If you and another account are following each other mutually, you will become friends and unlock additional features (coming soon!) Refactored some code to make everything more modular and optimized
Additions & Changes When you click on a user’s followers and following on their profile page, a new modal pops up with 2 tabs, followers and following, that shows the accounts they’re currently following/being followed There’s also a search bar that lets you search through the listed users to find people more easily and makes it feel a lot more like Instagram If you are following someone who follows you back (mutual follows), you are automatically added as friends, which shows up as a section on the main profile display area You will be able to send messages through a real-time chat with friends in the future! Added the chat tab that’s just a placeholder page for now Added dynamic SEO Updated navigation and styling
Additions & Changes Added a voting system for memes (sort of like a rip off Reddit) where you can upvote, downvote, or remove your vote by clicking on the arrows You can also see the total vote count of the meme in real time to see its popularity The upvote/downvote buttons are displayed below the meme, along with the save and share buttons that will work soon Added an optional original source field for posting a meme to link where you got the original image from A link icon now shows up on the meme page if you provided the source link so people can see the original post and author Updated styling and navigation Updated schema and types
Additions & Changes Added saving memes to collections so other than voting you can curate, organize, and categorize your own custom lists of memes! When you click on the save option, a modal pops up showing collections you created and a button that lets you add new collections, as well as a search bar for the collections You can also see how many memes are currently saved in the selections When you click save, the option shows the saved state and displays how many collections the meme is saved in You can only save memes to collections you created Added a new user profile section for collections, but it currently doesn’t show anything yet Updated schema and types and learned some new relational database and Prisma concepts
Collection pages, sharing, and reporting Added a main collection tab that displays all the meme collections users created (not just yours), and you can access the page with a header link on the profile page Each collection card either shows a gray rectangle if there’s no meme or a stack of images with a preview image on top if there’s multiple memes When you click on a collection, it takes you to its own page where its name, creator, and all the memes are displayed Collections a user created are also displayed on their profile page in a new section The share button shows a sharing modal where you can either share the meme to your friends (doesn’t work yet, will be integrated with chat), copy the link and send it somewhere else, or report it If you choose report or click on the report option, another modal shows up where you can select report reasons and provide additional feedback Added new schemas and types Updated navigation and styling
Comment likes and replies You can now like meme comments (and comment replies since they’re counted as normal comments) by clicking on the heart icon on each comment You can also see how many people liked the comment When you click on the reply option on a comment, an input field for your reply and post/cancel buttons show up for you to post your reply The replies show up as nested inside their parent comments to show the discussion flow, and you can technically thread replies infinite levels deep Spent a ton of time trying to figure out how to generate the threaded tree structure, tried recursion and loops and ended up using hashmaps and pointers to nest parent/child comments (I was not locked in while making the algorithm because of the finals I was going to have the next day) Updated schema and styling
Searching, sorting, and filtering memes Added a search bar, a sorting dropdown, a filtering by time and creator dropdown, a tag dropdown (doesn’t work yet, coming soon), and a number of items dropdown on the explore memes page to make finding and browsing new memes a lot more easier The search bar searches by the meme’s title and only searches when you submit the form to improve performance You can sort by best, which sorts by positive/negative vote ratio, top, which sorts by raw upvote count, and new, which sorts by recency You can filter by time range (now, day, week, and all), memes your friends posted, and memes you posted You can choose to show 5, 10, 25, or 50 memes at a time Added a custom dropdown component for the dropdowns with nice UX MemeBoard is now even closer to being a Reddit clone, I took a lot of inspiration from its features except my sorting/filtering is mainly frontend, which is not good practice but I’m too lazy to implement API endpoints for fetching memes Refactored the upvoting/downvoting component and logic so it directly communicates with the backend rather than using a hook to make it more modular and performant Meme cards now show the voting component and vote count I’m almost finished with the meme aspect of this project, the next big part is the realtime chat and sharing with friends and MemeBoard will be finished! I should probably stop using aura monster as the test meme, it’s starting to become corny :(
Massive update: chat Added realtime chat where you can send and receive text messages with almost no latency to/from your friends on MemeBoard! The base layout of all the chat pages has a sidebar of the left that displays all your friends, and clicking on them takes you to the different direct message channels On each chat channel page, you can see your friend’s profile picture, username, and number of followers/following at the top, similar to TikTok’s chat Your friend’s messages show up on the left while yours are highlighted and on the right, similar to texts, and each message has a timestamp Integrated a Redis database for quick message retrieval, caching, and ease of use for the Upstash realtime library that uses Web Socket under the hood to push realtime updates/events to send and update messages in realtime I already made a much simpler chat app but with a slightly different backend stack a while ago, so it wasn’t that difficult rewriting everything in Next.js and adding additional features There are actually a lot of considerations and logic that go into making a chat app that you normally wouldn’t think of unless building your own chat, so this was an interesting and fun experience coming up with solutions for unexpected problems Updated schema and types I’ll actually optimize the site and implement responsive design after the main app is finished, so the current layout looks terrible on small screens and I apologize for the terrible layout in the video
Meme sharing and more chat features! I sort of got carried away with this chat feature thing so MemeBoard is now a weird combination of Reddit and Discord instead of the original meme platform I planned it to be When you click on the share button on a meme page and open the sharing modal, you can now see all your friends listed and you can select who to send the meme to, as well as an optional message This actually sends a message to the chat with your friend, and it shows up as an embedded preview meme with its creator, title, image, and number of likes/comments/shares displayed Clicking on the embed preview takes you to the actual meme page Added chat replies so when you click on the reply button next to your friend’s message, a box shows up above the input field showing the message you’re currently replying to When you send the message, a reply bar/message preview similar to Discord’s shows up above the message, and clicking on it scrolls the page to the original message and briefly highlights it, similar to Discord’s Messages are grouped together so message header info (sender, time, profile image…) only shows under certain circumstances (similar to Discord) for a cleaner and better UI Refactored how messages and their components are rendered/structured for better optimization and performance Added an API route for client components to fetch meme data from the database Updated schema and types Updated the styling of different chat pages I forgot to make devlogs, so this devlog is pretty long Sorry again for the terrible layout in the video, my lazy bum hasn’t started on responsive styling yet, so the windows are compressed
Editing/deleting posts & more chat features! Added an option button on the top right of the meme pages you posted which when clicked displays a menu that lets you edit or delete the post Clicking on the edit option takes you to a dedicated post editing page where you can edit the title, tags, description, and source link and reupload the image of the meme (metadata, comments, and everything else remains unchanged), and clicking save takes you back to the newly edited page Clicking on the delete option shows a confirmation modal/dialog warning you, and if you press delete all the meme’s data will be permanently deleted and you get redirected back to the memes pages A similar option menu button is also added to the top right corner of your comment, where you can edit (a modal with an edit input field and buttons shows up) or delete (also has a confirmation dialog) the comment You can now also edit your own messages (only the text and not what you’re replying or the embedded meme), when you click on the edit message button a modal with an edit input pops up, and the edited message is updated in realtime You can now react to both yours or your friends messages to express what you think! When you click on the react button an emoji menu shows up where you can browse for the emoji you want Reactions and their counters update in realtime and you can remove the reaction by clicking on it again (the feature works exactly how all messaging apps’ reactions work) After you press on the share meme button when sharing to a friend, the button now becomes a link that takes you to the chat where you can see the message Updated schema and types Updated styling I kinda forgot to make more devlogs again, so this one is another massive wall of text covering a ton of different features. The video is also 2 minutes so I had to compress it to upload 😭 I promise I’ll try to keep future devlogs shorter and more focused :)
Responsive design Finally added responsive design to all pages on the platform so MemeBoard works properly and the layout stays organized and visually appealing for all screen sizes! Added a menu button that shows up when the screen size is smaller than a certain width, which when clicked opens a sidebar that slides in from the left containing all the links. This declutters the layout while improving the UX of the app Added a search bar to the tags page where you can search all the tags people created and browse memes more easily Refactored code for some UI elements to make everything more optimized and clean Fixed chat layout UI breaking with excessively long messages Added some minor styling adjustments
Collection features & cleanup Similar to the meme page, when you view the page of a collection you created, there is an options icon that when clicked, opens a menu where you can edit or delete the collection If you press on edit, an edit modal pops up where you can edit the name and select which memes should be in the collection If you press on delete, a warning modal shows up, and if you press delete the collection will be permanently deleted Added a search bar on the main collections page where you can search for your own or other people’s collections Added the collections tab to the main nav bar and the footer to improve navigation You can now add a short public about me bio on your profile by clicking on the edit profile button that shows an input edit modal When you hover over your own messages, a delete button now shows up that lets you delete the message for both of you after a confirmation modal just like all the other delete functionalities You can undo the deletion by pressing on the undo button that shows up, which restores the message for both of you I spent most of my time on MemeBoard developing while logged in, so I wasn’t aware most of my pages were completely broken and returning errors if someone visited them while not being logged in, so I implemented a ton of conditionals and permission stuff for auth to make sure every page works properly or redirects to the login page When you’re not logged in, you can still use the app and browse memes, it’s just that a lot of features are unavailable Updated backend schema and types Updated styling Fixed a few bugs and issues caused by auth
Random quality of life features I think I’m almost finished with MemeBoard, so now I’m just making random small features that I skipped over earlier Added realtime chat message previews for each of your chats that shows the last message and who sent it on the left sidebar so it feels more like Discord and Slack Added a tag filtering dropdown on the Memes page where you can see all the tags, search for them, and choose one to see all the memes labeled with that tag. This makes it a lot easier to browse, filter, and find similar memes Added an options menu button to the tag page (that only shows if you’re the one who made the tag) similar to the button I added to a bunch of other pages. When clicked, it shows a menu with just a delete option that deletes the tag and removes its label from all the memes after a confirmation modal Added both dynamically generated SEO and static SEO to some pages that didn’t have it Updated styling and navigation
MemeBot & bug fixes Added MemeBot to everyone’s chat, so even if you haven’t friended someone on the platform you can still try out all the chat features since MemeBot also sends messages in realtime MemeBot isn’t actually another AI chatbot or anything, it just responds with a random hardcoded string message (very intelligent, i know) from the backend whenever a user sends it a message after a certain delay to simulate realtime chatting Since MemeBot isn’t actually a user, I had to modify the chatting system quite a bit and put a lot of extra conditionals and logic to ensure it works properly for both MemeBot and real users, and that was quite annoying to figure out Fixed an annoying caching bug where you had to refresh the entire chat page for realtime interactions to work properly when chatting with someone for the first time, otherwise the chat just froze. This took a long time to fix, but the UX is finally smooth and works well Fixed some issues of the chat related to auth and not being logged in Updated styling
More collections features You can now search, sort, and filter collections on the collections page to browse and explore public collections other people created! You can filter your friends’ and your own collections to make managing them easier You can now add an optional description describing what your collection is about, either on the add or edit collection modal You can now change the visibility of your collection to be either public or private, where public collections are displayed on your profile and the collections page for everyone to see, and only you can see your own private collections Added a new private collections section on your profile that only you can see it Added a create collection modal that shows up when you click on the button on the collections page to make creating collections easier Added a create tag modal that shows up when you click on the button on the tags page, but unlike collections you can only put the name of the tag since that’s the only thing a tag has Updated schema and types Updated styling and SEO
MemeBoard is back!!! I’ve been a lazy bum this entire summer and didn’t finish a single one of my more serious projects on Stardance before losing interest and moving on to a new idea, but now that the event is ending in a month (nooo ) I finally forced myself to come back and finish up/ship my old projects one by one School just started so I’ll hopefully still have enough time to ship most of my projects before October. Since no one has used MemeBoard at all in over 2 months, I had to upgrade some packages, resetup some deployment stuff, and reactivate the databases for everything to function normally I also spent some time getting familiar with the codebase again, so I didn’t make a lot of changes this update. I added a few quality of life features like sharing/reporting comments, homepage meme and chat sections, and user search for finding people to follow When you click on share for a comment, the share modal pops up listing all your friends that you can select to send the comment and a message to, as well as options to copy the link and to report it Comments show up as embedded text with the user and like count displayed, and clicking on it takes you to its location on the original meme page for easy viewing (definitely not stolen from TikTok ) When you click on add user on the chat page, it shows a modal where you can use the API to search for people to add as friends, making chatting and sharing memes more convenient Added recent, top, all time, friend memes, and recent chat sections to the homepage to make navigating the platform and browsing memes easier Added call to action buttons on the homepage hero to make using the site more intuitive Updated content and styling Updated MemeBot behavior Updated README Fixed chat deployment issue Did some miscellaneous stuff/improvements/fixes that I forgot
Light mode toggle Added a button on the nav bar that toggles the site’s entire appearance between dark and light mode to improve its customizability and accessibility Because every component has a default color transition, switching between the 2 modes has a smooth UI transition instead of flashing to the other color instantly I had to set up the theme provider and manually add the light mode Tailwind classes and the dark mode prefix for all the colors in every page and component, so this took quite a long time but the result was worth it, both modes look pretty consistent and visually appealing
Meme reactions, animations, and polishing Added reactions to memes (kind of similar to Reddit awards) so you can now choose an emoji to express what you think about the meme! There is a new React button on the meme bar that opens an emoji selection menu that lets you choose your reaction. You can see all the meme’s reactions sorted by number of users listed below the bar and can click on them to switch your reaction or unreact (since you can only react once) Reactions are anonymous, so you can only see the number of reactions with your own reaction highlighted Added subtle page transition animations to the layout and individual components to make navigation and user interactions a lot smoother and more aesthetically pleasing Added a 404 not found page with an occasional stylized glitching effect and buttons to go home or go back Added more detailed and dynamically generated OpenGraph metadata to improve SEO Updated backend Prisma schema and migrated database Updated types and styling Fixed a few display, light mode, and responsive design bugs MemeBoard is almost finished, it’ll probably be ready to ship after one final devlog and some polishing touches!!!
Final MemeBoard devlog! I finally finished MemeBoard after working on it over the past 3 months! I’ve implemented all the features I originally planned to make, as well as added a ton of other stuff to make the project interesting and fun to use I mostly just polished the project in this update, so there isn’t actually anything new other than the simple “m” logo/favicon I added to the nav bar and footer Added a top loading bar indicator to show the page is responsive and is actively loading since some pages take a bit of time to fetch data, and I’m too lazy to implement suspense/loading skeleton and all that Clicking on things that require the user to be signed in now redirects you to the sign in page so it’s more user friendly and not confusing Updated the README to document detailed information, all the features, setup instructions, and everything else about the project Fixed an annoying issue where MemeBot didn’t respond at all or took a long time by simply deleting an intentional timeout and the bug was somehow fixed Updated styling and layout components
Ships:
I finally finished making MemeBoard after periodically working on it over the past 3 months! MemeBoard is an accessible and easy to use fullstack online social platform for posting, sharing, and exploring all kinds of memes. There are many different post interaction features such as voting, commenting, saving, reacting, and sharing, it’s essentially a simple Reddit clone that’s exclusively for memes. You can browse, filter, and search through memes easily by choosing different sorting options and exploring the different tags and collections. It also has social features like following users and customizing your profile, as well as a full-featured realtime chat (mini Discord clone) where you can send content and chat with your friends or interact with MemeBot (which is not an LLM, it’s just a random thing I thought was fun to implement)! The entire website is also fully responsive and functional on all screen sizes with smooth loading and transition animations, and you can toggle between dark and light modes. I got bored of the project halfway through it to work on other stuff, but I ended up coming back more than a month later to finally finish everything and polish it to ship, and the final result is definitely very satisfying and rewarding for me, hopefully you’ll like it :)...
|
1792853299.0866485
|
1792939699.0866485
|
|
449
|
MYLO by @Mihai | Stardance
|
Mihai
|
1
|
62.0
|
994
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-04T19:58:57Z", "hours": 62.0, "multiplier": 16.0, "payout": 994, "blessing": "neutral", "text": "MYLO is a portable integrated neural network development IDE. Currently, building neural networks for your projects is a hassle, you have to write code, change apps for different tools and they are resource hungry. MYLO is here to change that! MYLO is split between 3 components, all with a different purpose: The Web interface It handles the entire user experience, it’s made to be lightweight, as no actual ML processing is happening on it, thus making it easy to host and usable on many low end devices. Its made using Next.js, and its the gateway to using the powerful tools MYLO provides, tools like: Visual neural network editor, just like any other visual editor, inspired by unreal engine blueprints, you right click to add new nodes and connect them in order to build your own neural network. Model Optimization, it uses a custom Neural-Genetic algorithm that applies mutations to the model, retrains it and then, the better performing models get their attributes passed on to the next generation and so on… Model diagnosis, can either be run using a dummy input or have your model retrained on the dataset itself for better info Dataset analasys tools, to see data distribution and outliers, together with per column information and encoding suggestions Neural network visualization, with in depth info about each node Ai assistant with a BYOK system, that can use tool calling to actually modify the model itself Customizable interface, with window system similar to visual studio code Model catalog where people can upload and share their models/projects Agent connection system, that allows you to use agents running in your local network/machine Now while these are the enabled and visible tools, also implemented are cloud tools that are currently disabled because it’s costly to host them: An agent orchestrator that using docker spins up agent instances on demand and routes them to your app Cloud storage system for projects and models Behind the scenes there is a lot more going on, there is a full documentation document linked in the repo readMe, which I encourage you to read, even tho its in romanian, you can easily translate it. The only thing is it that it doesn’t include more info about the BYOK system and security updates that where made after the documentation was written. The processing Agent It handles all of the ML processing Because of the way it’s implemented, it allows it to run on dedicated machines while the interface just connects to it It features the implementation of the descriptor system, a way to represent models while allowing them to be easily editable, while also having transferable weights and parameters. It sits at the base of the entire editor and optimization system. all of the features mentioned in the interface are run on the agent itself and not on the interface. For a more in depth analasys consult the documentation Orchestrator It handles the creation and destruction of the cloud instances, using a custom docker image and container handling, nothing fancy The biggest challenge… was the descriptor system, as an app made only by me and my friend, it was very hard to implement a robust system, and for the moment it’s quite unfeasable to extend the system further, as currently for each high level node its necessary to create connection templates manually, so thats why the node selection is currently smaller. Also it has to be easily compiled and almost ready for runtime while still being maleable enough for editing. Thankfully all of these hard systems I was able to build with help of a friend who is much more informed when it comes to AI. For any issues please write on my email ( [email protected] ) or on slack (altough im not so active)", "repo": "https://github.com/M-Y-L-O/docs/", "demo": "https://mylo-web-deployument.vercel.app/"}]...
|
[{"post_id": 40847, "ts": "202 [{"post_id": 40847, "ts": "2026-08-04T17:08:31Z", "hours": 3.2742, "text": "The app is now in a state ready for shipment, small UI tweaks and the possibility to easily enable and disable cloud features has been added. I borrowed an powerful AI agent from a friend to run a security audit on my website and also used it to fix them, as to assure the app is secure."}, {"post_id": 39967, "ts": "2026-08-03T09:36:09Z", "hours": 2.4158, "text": "In order to prepare my app for the ship, I decided to add some documentation and instructions about how to use the app, so there is now a docs page. Also necessary for the ship and publication, I made a Bring Your Own Key system for the AI Assistant, this way I don’t have to maintain and risk any of my own API keys. The keys are encrypted and stored in a Database, and once in said database, they only ever reach the Next.js server, no browser. The last few things I have to do for the ship are the following: -Make it easy to enable/disable cloud features (For the initial ship there will be no cloud features as I can’t pay for any uptime) -Consistent styling for the entire UI, fix any UI quirks I find, and/or redesign sections of the app. -Compile and make a release version of the desktop agent."}, {"post_id": 38340, "ts": "2026-07-31T17:52:37Z", "hours": 4.9881, "text": "I’ve made some polishing and steps towards the ship, that I want to make it happen this week. There have been a lot of bugs fixes and the addition of a new tool: The model diagnostic and retrain tool, which as it says, it helps you get metrics about a model on a specific dataset or, using a dummy input, get characteristics about the model itself. Besides that I got started on a landing page and added some flare to the login page."}, {"post_id": 34688, "ts": "2026-07-25T16:43:00Z", "hours": 2.0772, "text": "AI agent guyz!!! It uses gemini and I gave it some tools to edit and understand the model. I also added a markdown visualiser to have nice and pretty outputs from the model. It wasnt hard to implement and it’s a great addition to the app I feel."}, {"post_id": 34579, "ts": "2026-07-25T13:01:01Z", "hours": 3.2614, "text": "I’ve added cloud project saving and a project catalog! You can publish your projects/models for other to see, train and use in their own projects. It uses a simple s3 bucket for storage and handling the models, nothing too complex. The catalog has some filters and search function."}, {"post_id": 33014, "ts": "2026-07-22T15:52:39Z", "hours": 2.6136, "text": "I have added what I call an orchestrator system, you can now create a new client instance in the cloud, that can then be used for processing and editing your models, this comes as an automatic substitution to hosting your own local client. From the home page you can now click on the add new configuration button and choose the cloud option and a automatic connection will be established. The system uses docker to spin up and manage the instances, there is a service for cleanup and deleting orphan containers. The orchestrator itself doesn’t act like a proxy, all of the request go directly between the next.js server of the interface and instance."}, {"post_id": 31864, "ts": "2026-07-20T16:25:17Z", "hours": 3.5153, "text": "Okk, so there are now more tools to help you analyse your datasets, that includes charts, data quality, correlation and target analysys. Another change is to the optimization, more specifically to the optimization results. You can now clearly see what changes where made to the model, and what mutations the network suffered over time."}, {"post_id": 29086, "ts": "2026-07-15T18:59:26Z", "hours": 5.1808, "text": "What is there more to say, than the fact that there is now a working visual editor for creating your own neural networks!!!! It’s literally unreal engine blueprints but for NN’s, there is a library of nodes, from which you can choose to add, and then you connect those using handles. There is still some stuff to iron out, but this is looking good!"}, {"post_id": 26744, "ts": "2026-07-11T18:27:15Z", "hours": 4.4428, "text": "Ok you guys, we have working neural network optimization! For the moment there is only the option to optimize using a neuroevulution algorithm, but more will come in the future. You can select the input features, target one, change some settings, lay back and get back an optimized version of your neural network. This happens using pytorch models, i’m kind of moving away from .onnx, as they represent an “imovable” final version of a model to say so, and using the descriptor model me and my friend made will allow us to make visually editing models easier. Now, optimizing spits out both a .pt2 and a .onnx file, as the onnx file is directly usable. These changes required some modifications to the .mylo project file structure, but it’s not hard to add new stuff to it. Next, I will have to polish the UI, add some more animations and also handle the posibility to upload both a .pt2 for working and a .onnx for visualisation only in the same project. Besides that I also want to make like a “git” where people will be able to publish their models and stuff for you to use. I have plenty planned, i really like how this project is coming along."}, {"post_id": 24148, "ts": "2026-07-07T15:04:08Z", "hours": 2.2681, "text": "I got a friend that is more talented in working with AI to help me with this project, together, we developed a optimization tool. It’s currently not implemented in the UI, but it follows. Optimization is a huge step in the development of this app, as it incorporates, building new models, training and testing them all in one flow, so by getting this working we opened the doors to training and infering tools for the models you build using MYLO. Also, for this, my friend made a way to describe models in a json format, with the weights held in a seperate files, then, on runtime when needed, using the json, a new pytorch model will be built and the weights loaded, having it ready for any operations needed. I had also been working a lot on design in figma and from my friends computer, so sadly I am only able to count up 2 hours of work for something close to 10. Anyways, hopefully, next devlog ill have a working optimization window to show."}, {"post_id": 15694, "ts": "2026-06-25T14:50:36Z", "hours": 3.1078, "text": "Ok, we got dataset analysis tools! These first tools include a simple table viewer and a check for one-hot encoding, as in certain types of data it can cause excessive memory usage. Next I want to add graphs for data distribution, missing values, etc."}, {"post_id": 14464, "ts": "2026-06-23T16:26:14Z", "hours": 3.0642, "text": "I’ve worked on polishing what I got until now. I remade the home page to be more clean and to help you understand better what’s going on and what you have to do, basically some UX work. In the attached screenshot is the final version of the home page for now, implemented and fully reactive to the possible states."}, {"post_id": 13625, "ts": "2026-06-22T10:51:16Z", "hours": 3.5586, "text": "I got working project files. While there are still some edge cases to iron out, you can save and load projects into the interface. There is also a system, in case the connection between the client and the interface fails, the data won’t be lost, as there is a copy of the entire project stored on the client, so when the connection is reinstated all of the data can be retrieved. This project appears on a dedicated card when in the interface. Here is a small demo of the app:"}, {"post_id": 13072, "ts": "2026-06-21T11:46:57Z", "hours": 4.6014, "text": "I have spent this time integrating authentication into the app and making a small home page from which to manage client connections and projects. There has also been a structural change. Until now when loading a file into the client, on request, the client would open a file picker window using tkinter, but this caused a lot of bugs, as tkinter has to run on the main thread, and in general, blocking the entire server until you picked a file was not good, so instead I made it work more traditionally, by having a file picker open on the web interface and uploading a file there before sending it to the client, and its really much better, the client server isn’t stuck waiting for you to pick a file and also it allows for the client to be on another machine, like a powerful server and you just sending the relevant model files to it. It was still a slow crawl, I had to chew trough a lot of bugs with the authentication, as I implemented a middleware protection system, that blocks any requests that come from an unauthorized user, both for the client and webInterface, making the app fiarly secure, atleast by my standards. Now that I have client connections done with a nice UI to add new clients and stuff, I will occupy myself with loading, exporting and managing project files."}, {"post_id": 11793, "ts": "2026-06-19T05:59:06Z", "hours": 3.5428, "text": "Ok, so I started integrating the authentication into the app, this meant that now I had to make a way to tie projects and sessions to the user. To do this, I created my own project file, which is basically a disguised .zip file. When you save the project, it bundles all the necessary files into the zip, making it easy to send projects but also “tying” a project to a user is now very simple. Besides that, i began working on the Client system, basically, in the app, you will be able to have multiple clients/workers. Some may be in the local network, right on your device or there will be the option to rent out a server and use that for creating and training your neural networks. Now that there can be multiple clients, that means that can be many more errors, so I also decided to add a notification system. It was made using sonner."}, {"post_id": 9373, "ts": "2026-06-15T18:28:29Z", "hours": 4.8778, "text": "This devlog I bring you: - Authentication , made with Auth.js, it has the options to log in using github and google. For now its just the code itself for logging in, retrieving user data and checking if the user is logged in, but it doesnt serve any function. - Properties panel , now you have the option to open the properties panel. When clicking on a node it shows info about that node, like the inputs, outputs and any attributes it has. - Data processing , for now only in the API, the panel is coming too! It takes a csv file and checks it’s compatibility with One-Shot encoding, and other basic information about the data, like missing values, encoding size, etc."}, {"post_id": 7588, "ts": "2026-06-12T18:08:09Z", "hours": 4.0706, "text": "Sooo, I have been pretty efficient. We got the basic UI layout done, with the windows and tabs and everything, which have been customized. We also have a logo (sadly I couldn’t log the time working on it) and most importantly we have the first tool! The visualization tool! (now I realized I’ve misspelled visualize in the app) Which also means I got the communication between the web interface and api working. For now the visualization only works with ONNX files, but I hope to get this expanded to other formats like pytorch files. The tool works this way. You “point” to the file on your computer, the client on your laptop processes it and generates a list of edges and nodes, where each node carries specific information about itself. Then in the UI I post-process them a bit, as the names are pretty ugly like “/lstm/LSTM|/” and I just trim it. Then based on the category of node, I color it a specific color. The constant nodes are removed for clarity (although I will add a way to re-enable them). Then using ELKjs I order the nodes and then display them using react-flow. I really like how it all turned out. Some other notable things are about the meubar, it’s very easy to add buttons, and for those buttons to have nested ones, its just basically a JSON, where each button has a label, an onClick function and children. All of this setup will help me in the future. This is all for now."}, {"post_id": 6388, "ts": "2026-06-10T19:02:42Z", "hours": 1.2836, "text": "I’ve started with the scaffolding of this project. I want the UI to be IDE like, so I created a window management system using Dockview. I also made a Client class. The idea is for there to be two ways to process your neural networks, either locally or in the cloud, thus I made this client class that should make it very easy to switch between the two on the Frontend side. In the client itself, where all the processing happens, I made a very basic fastapi server and some endpoints for testing, as well as laid the brickwork to “load” local files into the client, without having them uploaded to the Website UI and then sent over to the MYLO client on the PC, basically creating a duplicate just to read from it. It works by instead of opening a file dialog in the browser, opening one from the python client installed on the computer, thus allowing me to access information such as the absolute file path, which would otherwise not be possible trough the webinterface."}]...
|
Title: MYLO by @Mihai | Stardance
Devlogs:
I’ve s Title: MYLO by @Mihai | Stardance
Devlogs:
I’ve started with the scaffolding of this project. I want the UI to be IDE like, so I created a window management system using Dockview. I also made a Client class. The idea is for there to be two ways to process your neural networks, either locally or in the cloud, thus I made this client class that should make it very easy to switch between the two on the Frontend side. In the client itself, where all the processing happens, I made a very basic fastapi server and some endpoints for testing, as well as laid the brickwork to “load” local files into the client, without having them uploaded to the Website UI and then sent over to the MYLO client on the PC, basically creating a duplicate just to read from it. It works by instead of opening a file dialog in the browser, opening one from the python client installed on the computer, thus allowing me to access information such as the absolute file path, which would otherwise not be possible trough the webinterface.
Sooo, I have been pretty efficient. We got the basic UI layout done, with the windows and tabs and everything, which have been customized. We also have a logo (sadly I couldn’t log the time working on it) and most importantly we have the first tool! The visualization tool! (now I realized I’ve misspelled visualize in the app) Which also means I got the communication between the web interface and api working. For now the visualization only works with ONNX files, but I hope to get this expanded to other formats like pytorch files. The tool works this way. You “point” to the file on your computer, the client on your laptop processes it and generates a list of edges and nodes, where each node carries specific information about itself. Then in the UI I post-process them a bit, as the names are pretty ugly like “/lstm/LSTM|/” and I just trim it. Then based on the category of node, I color it a specific color. The constant nodes are removed for clarity (although I will add a way to re-enable them). Then using ELKjs I order the nodes and then display them using react-flow. I really like how it all turned out. Some other notable things are about the meubar, it’s very easy to add buttons, and for those buttons to have nested ones, its just basically a JSON, where each button has a label, an onClick function and children. All of this setup will help me in the future. This is all for now.
This devlog I bring you: - Authentication , made with Auth.js, it has the options to log in using github and google. For now its just the code itself for logging in, retrieving user data and checking if the user is logged in, but it doesnt serve any function. - Properties panel , now you have the option to open the properties panel. When clicking on a node it shows info about that node, like the inputs, outputs and any attributes it has. - Data processing , for now only in the API, the panel is coming too! It takes a csv file and checks it’s compatibility with One-Shot encoding, and other basic information about the data, like missing values, encoding size, etc.
Ok, so I started integrating the authentication into the app, this meant that now I had to make a way to tie projects and sessions to the user. To do this, I created my own project file, which is basically a disguised .zip file. When you save the project, it bundles all the necessary files into the zip, making it easy to send projects but also “tying” a project to a user is now very simple. Besides that, i began working on the Client system, basically, in the app, you will be able to have multiple clients/workers. Some may be in the local network, right on your device or there will be the option to rent out a server and use that for creating and training your neural networks. Now that there can be multiple clients, that means that can be many more errors, so I also decided to add a notification system. It was made using sonner.
I have spent this time integrating authentication into the app and making a small home page from which to manage client connections and projects. There has also been a structural change. Until now when loading a file into the client, on request, the client would open a file picker window using tkinter, but this caused a lot of bugs, as tkinter has to run on the main thread, and in general, blocking the entire server until you picked a file was not good, so instead I made it work more traditionally, by having a file picker open on the web interface and uploading a file there before sending it to the client, and its really much better, the client server isn’t stuck waiting for you to pick a file and also it allows for the client to be on another machine, like a powerful server and you just sending the relevant model files to it. It was still a slow crawl, I had to chew trough a lot of bugs with the authentication, as I implemented a middleware protection system, that blocks any requests that come from an unauthorized user, both for the client and webInterface, making the app fiarly secure, atleast by my standards. Now that I have client connections done with a nice UI to add new clients and stuff, I will occupy myself with loading, exporting and managing project files.
I got working project files. While there are still some edge cases to iron out, you can save and load projects into the interface. There is also a system, in case the connection between the client and the interface fails, the data won’t be lost, as there is a copy of the entire project stored on the client, so when the connection is reinstated all of the data can be retrieved. This project appears on a dedicated card when in the interface. Here is a small demo of the app:
I’ve worked on polishing what I got until now. I remade the home page to be more clean and to help you understand better what’s going on and what you have to do, basically some UX work. In the attached screenshot is the final version of the home page for now, implemented and fully reactive to the possible states.
Ok, we got dataset analysis tools! These first tools include a simple table viewer and a check for one-hot encoding, as in certain types of data it can cause excessive memory usage. Next I want to add graphs for data distribution, missing values, etc.
I got a friend that is more talented in working with AI to help me with this project, together, we developed a optimization tool. It’s currently not implemented in the UI, but it follows. Optimization is a huge step in the development of this app, as it incorporates, building new models, training and testing them all in one flow, so by getting this working we opened the doors to training and infering tools for the models you build using MYLO. Also, for this, my friend made a way to describe models in a json format, with the weights held in a seperate files, then, on runtime when needed, using the json, a new pytorch model will be built and the weights loaded, having it ready for any operations needed. I had also been working a lot on design in figma and from my friends computer, so sadly I am only able to count up 2 hours of work for something close to 10. Anyways, hopefully, next devlog ill have a working optimization window to show.
Ok you guys, we have working neural network optimization! For the moment there is only the option to optimize using a neuroevulution algorithm, but more will come in the future. You can select the input features, target one, change some settings, lay back and get back an optimized version of your neural network. This happens using pytorch models, i’m kind of moving away from .onnx, as they represent an “imovable” final version of a model to say so, and using the descriptor model me and my friend made will allow us to make visually editing models easier. Now, optimizing spits out both a .pt2 and a .onnx file, as the onnx file is directly usable. These changes required some modifications to the .mylo project file structure, but it’s not hard to add new stuff to it. Next, I will have to polish the UI, add some more animations and also handle the posibility to upload both a .pt2 for working and a .onnx for visualisation only in the same project. Besides that I also want to make like a “git” where people will be able to publish their models and stuff for you to use. I have plenty planned, i really like how this project is coming along.
What is there more to say, than the fact that there is now a working visual editor for creating your own neural networks!!!! It’s literally unreal engine blueprints but for NN’s, there is a library of nodes, from which you can choose to add, and then you connect those using handles. There is still some stuff to iron out, but this is looking good!
Okk, so there are now more tools to help you analyse your datasets, that includes charts, data quality, correlation and target analysys. Another change is to the optimization, more specifically to the optimization results. You can now clearly see what changes where made to the model, and what mutations the network suffered over time.
I have added what I call an orchestrator system, you can now create a new client instance in the cloud, that can then be used for processing and editing your models, this comes as an automatic substitution to hosting your own local client. From the home page you can now click on the add new configuration button and choose the cloud option and a automatic connection will be established. The system uses docker to spin up and manage the instances, there is a service for cleanup and deleting orphan containers. The orchestrator itself doesn’t act like a proxy, all of the request go directly between the next.js server of the interface and instance.
I’ve added cloud project saving and a project catalog! You can publish your projects/models for other to see, train and use in their own projects. It uses a simple s3 bucket for storage and handling the models, nothing too complex. The catalog has some filters and search function.
AI agent guyz!!! It uses gemini and I gave it some tools to edit and understand the model. I also added a markdown visualiser to have nice and pretty outputs from the model. It wasnt hard to implement and it’s a great addition to the app I feel.
I’ve made some polishing and steps towards the ship, that I want to make it happen this week. There have been a lot of bugs fixes and the addition of a new tool: The model diagnostic and retrain tool, which as it says, it helps you get metrics about a model on a specific dataset or, using a dummy input, get characteristics about the model itself. Besides that I got started on a landing page and added some flare to the login page.
In order to prepare my app for the ship, I decided to add some documentation and instructions about how to use the app, so there is now a docs page. Also necessary for the ship and publication, I made a Bring Your Own Key system for the AI Assistant, this way I don’t have to maintain and risk any of my own API keys. The keys are encrypted and stored in a Database, and once in said database, they only ever reach the Next.js server, no browser. The last few things I have to do for the ship are the following: -Make it easy to enable/disable cloud features (For the initial ship there will be no cloud features as I can’t pay for any uptime) -Consistent styling for the entire UI, fix any UI quirks I find, and/or redesign sections of the app. -Compile and make a release version of the desktop agent.
The app is now in a state ready for shipment, small UI tweaks and the possibility to easily enable and disable cloud features has been added. I borrowed an powerful AI agent from a friend to run a security audit on my website and also used it to fix them, as to assure the app is secure.
Ships:
MYLO is a portable integrated neural network development IDE. Currently, building neural networks for your projects is a hassle, you have to write code, change apps for different tools and they are resource hungry. MYLO is here to change that! MYLO is split between 3 components, all with a different purpose: The Web interface It handles the entire user experience, it’s made to be lightweight, as no actual ML processing is happening on it, thus making it easy to host and usable on many low end devices. Its made using Next.js, and its the gateway to using the powerful tools MYLO provides, tools like: Visual neural network editor, just like any other visual editor, inspired by unreal engine blueprints, you right click to add new nodes and connect them in order to build your own neural network. Model Optimization, it uses a custom Neural-Genetic algorithm that applies mutations to the model, retrains it and then, the better performing models get their attributes passed on to the next generation and so on… Model diagnosis, can either be run using a dummy input or have your model retrained on the dataset itself for better info Dataset analasys tools, to see data distribution and outliers, together with per column information and encoding suggestions Neural network visualization, with in depth info about each node Ai assistant with a BYOK system, that can use tool calling to actually modify the model itself Customizable interface, with window system similar to visual studio code Model catalog where people can upload and share their models/projects Agent connection system, that allows you to use agents running in your local network/machine Now while these are the enabled and visible tools, also implemented are cloud tools that are currently disabled because it’s costly to host them: An agent orchestrator that using docker spins up agent instances on demand and routes them to your app Cloud storage system for projects and models Behind the scenes there is a lot more going on, there is a full documentation document linked in the repo readMe, which I encourage you to read, even tho its in romanian, you can easily translate it. The only thing is it that it doesn’t include more info about the BYOK system and security updates that where made after the documentation was written. The processing Agent It handles all of the ML processing Because of the way it’s implemented, it allows it to run on dedicated machines while the interface just connects to it It features the implementation of the descriptor system, a way to represent models while allowing them to be easily editable, while also having transferable weights and parameters. It sits at the base of the entire editor and optimization system. all of the features mentioned in the interface are run on the agent itself and not on the interface. For a more in depth analasys consult the documentation Orchestrator It handles the creation and destruction of the cloud instances, using a custom docker image and container handling, nothing fancy The biggest challenge… was the descriptor system, as an app made only by me and my friend, it was very hard to implement a robust system, and for the moment it’s quite unfeasable to extend the system further, as currently for each high level node its necessary to create connection templates manually, so thats why the node selection is currently smaller. Also it has to be easily compiled and almost ready for runtime while still being maleable enough for editing. Thankfully all of these hard systems I was able to build with help of a friend who is much more informed when it comes to AI. For any issues please write on my email ( [email protected] ) or on slack (altough im not so active)...
|
1792968718.0097
|
1793055118.0097
|