|
46752
|
RedeeMOD by @DoMax | Stardance
|
DoMax
|
2
|
58.0
|
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": 58008, "ts": "202 [{"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.
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 ;)...
|
1792831760.0720088
|
1792918160.0720088
|
|
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....
|
1792813704.1281924
|
1792900104.1281924
|
|
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
|
|
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 :)...
|
1792849790.4445844
|
1792936190.4445844
|
|
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!!...
|
1792824706.1461544
|
1792911106.1461544
|
|
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....
|
1792824621.388316
|
1792911021.388316
|
|
26917
|
Henkan by @Kaanreal | Stardance
|
Kaanreal
|
5
|
87.0
|
1040
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T06:37:02Z", "hours": 24.0, "multiplier": 17.32, "payout": 173, "blessing": "neutral", "text": "This update is mostly about making Henkan feel a lot more complete on desktop. You can now save conversions directly into your detected osu!stable and Etterna song folders, so there’s way less manual moving files around. I also redesigned the desktop navigation and added proper pages for conversion history and your local osu! skin library. Pack conversion got a pretty big upgrade too. You can select which difficulties you actually want to convert, review the metadata for each song, and packs using multiple audio files are now automatically separated into individual songs. I also fixed metadata handling so every map keeps its own artist, title, subtitle, audio and background instead of accidentally sharing data across the pack. Live map detection can now be controlled separately for osu! and Etterna, and Henkan remembers the background of the last map you opened even after restarting. There are a bunch of smaller fixes too: faster pack conversion, better Etterna timing and current-song detection, preserved audio bitrate when changing rates, cleaner loading states and buttons, fixed navigation, plus some macOS and Linux specific fixes. The docs were also refreshed, and Henkan finally has its new domain: https://henkan.kaan.moe", "repo": "https://github.com/kaanreal/henkan", "demo": "http://henkan.kaan.moe/"}, {"ship_num": 2, "ts": "2026-09-06T21:12:59Z", "hours": 5.0, "multiplier": 15.89, "payout": 83, "blessing": "neutral", "text": "This update is mostly about getting Henkan into more places. Henkan can now be installed through winget, Homebrew, the AUR, Chocolatey and nixpkgs. If you use a normal package manager, you don’t have to hunt down the GitHub releases anymore. The site got some attention too. All pages are usable on phones now, and shared links show a proper preview card. I also changed the app icon and logo to a new emblem, which now shows up everywhere, from the desktop app and favicon to the package managers above. Smaller fixes: the preview receptors now line up with the note art, so the editor and the game agree on how the chart looks. You can try the latest release here: https://github.com/kaanreal/henkan/releases Its really hard to provide screenshots or other things cause it is really niche", "repo": "https://github.com/kaanreal/henkan", "demo": "http://henkan.kaan.moe/"}, {"ship_num": 3, "ts": "2026-08-16T23:31:00Z", "hours": 5.0, "multiplier": 18.03, "payout": 88, "blessing": "neutral", "text": "This update is mostly about making Henkan nicer to actually use. The biggest change is the beatmap preview. It can now autoplay the chart when you leave it idle, with notes falling under the receptors like in osu!mania and the HUD staying centered. It makes it way easier to get a feel for a chart before exporting instead of just staring at static note columns. Henkan is also now available in 8 languages . While adding localization, I ended up replacing i18next with a small custom system since I really didn’t need a whole library for what Henkan uses. It’s simpler, lighter, and still covers the entire app. I also added something I’ve wanted for a while: if you import a random .osu file without its audio or background, Henkan can now try to grab the missing files from an osu! mirror automatically. So incomplete beatmap folders are a lot less annoying to deal with. There are some smaller fixes too. Skin images are handled more reliably, previews should match the actual result better, and the updater now gets the real release notes from GitHub instead of showing a placeholder. You can try the latest release here: https://github.com/kaanreal/henkan/releases Its really hard to provide screenshots or other things cause it is really niche", "repo": "https://github.com/kaanreal/henkan", "demo": "http://henkan.kaan.moe/"}, {"ship_num": 4, "ts": "2026-07-27T14:26:43Z", "hours": 32.0, "multiplier": 19.37, "payout": 387, "blessing": "neutral", "text": "Hello, I’ve continued working on Henkan, my osu!mania ↔ Etterna converter, and released several major updates since my first ship. The biggest addition is full skin conversion. Henkan can now convert osu!mania skins into Etterna noteskins and convert Etterna noteskins back into osu!mania skins. This required handling lane textures, sprite sheets, high-resolution assets, Lua files, metrics, redirects, and the different ways both games structure their skins. I also added customizable difficulty name presets. Exported charts can automatically use information such as the title, artist, creator, original difficulty name, or calculated MSD. Users can also change the column width when exporting to osu!mania. Several conversion issues were fixed, including problems with extreme BPM values, export filenames, media files, and configuration support. The web version now behaves much more like the desktop app, with matching exports and features across Rust, Tauri, and WebAssembly. I also improved the project outside of the main application. Windows builds now use NSIS installers, Henkan is available through the AUR, the documentation has been expanded, the CI workflows have been cleaned up, and I added an end-to-end test for the skin converter. Keeping the desktop and web versions consistent is still one of the hardest parts of the project, since converter changes often need separate implementations for Rust and WebAssembly. My goal is still to make Henkan the most reliable way to move charts and skins between osu!mania and Etterna without losing important data.", "repo": "https://github.com/kaanreal/henkan", "demo": "http://henkan.kaan.moe/"}, {"ship_num": 5, "ts": "2026-07-03T22:04:17Z", "hours": 21.0, "multiplier": 18.3, "payout": 309, "blessing": "neutral", "text": "Hello, I made an osu!mania ↔ Etterna converter called Henkan (変換). I started the project because I noticed that most existing converters didn’t preserve maps correctly. Timing would drift, BPM changes would be lost or simplified, and long notes would often break during conversion. I wanted to build a converter that focused on accuracy instead of quick conversions. Henkan converts beatmaps between osu!mania (.osu / .osz) and Etterna/StepMania (.sm) while preserving the original chart as closely as possible. It keeps millisecond-accurate note timing, supports multiple BPM changes, correctly converts long notes, preserves metadata such as title, artist, creator, difficulty, and preview point, and keeps background references. The application is written as a native desktop app using Rust, Tauri, and React, making it lightweight and fast on Windows, macOS, and Linux. It also supports converting entire packs, allowing users to process many maps at once instead of converting them individually. One limitation is that scroll velocity (SV) is not converted from osu!mania to StepMania because the .sm format does not have an equivalent representation for osu!’s green-line SV changes. My goal with Henkan is to provide a reliable converter that players can trust to preserve their charts accurately instead of introducing timing errors or losing important map information.", "repo": "https://github.com/kaanreal/henkan", "demo": "http://henkan.kaan.moe/"}]...
|
[{"post_id": 72835, "ts": "202 [{"post_id": 72835, "ts": "2026-09-23T20:44:40Z", "hours": 12.7947, "text": "Hello! I worked on Henkan a lot again, mostly on making the desktop app nicer and faster to actually use.One of the biggest changes is that Henkan can now save conversions directly into your detected osu!stable or Etterna song folders. So instead of exporting something and moving it into the game manually, you can just convert it and have it show up where it belongs.I also redesigned the desktop navigation and added pages for your conversion history and local osu! skins. The live map detection settings were improved too, so osu! and Etterna hooks can now be enabled separately.Pack conversion got a lot of work as well. You can select individual difficulties before converting, check the metadata for every song, and packs with different audio files are now split into separate songs automatically. I also fixed a bunch of cases where maps inside a pack could lose their own artist, title, audio or background.The converter now remembers the background of the last map you opened too, even after restarting Henkan. It’s a small thing but makes the home screen feel a lot less empty.There were also a bunch of smaller changes. Loading states and buttons are more consistent, navigation is less messy, pack conversion is faster, Etterna timing and current song detection were improved, and changing song rate now keeps the original audio bitrate.I fixed some platform specific stuff too, mainly the osu!lazer background bridge on macOS and Etterna song detection on Linux.I also refreshed the docs and finally moved Henkan to its new domain https://henkan.kaan.moe registrar might be slow so try https://henkan-chi.vercel.app/"}, {"post_id": 69360, "ts": "2026-09-16T21:49:50Z", "hours": 10.9842, "text": "Hello! I worked on Henkan again and added something I’ve wanted for a while. Henkan can now detect the map you currently have open in osu!stable, osu!lazer, or Etterna and show it directly in the converter. No tosu or any other external tool required.This makes it much faster to open Henkan and immediately work with the chart you’re currently playing or editing.Still working on making the whole workflow between osu!mania and Etterna feel as seamless as possible."}, {"post_id": 63187, "ts": "2026-09-06T21:07:39Z", "hours": 5.2017, "text": "Hello! I’ve kept working on Henkan, and shipped quite a few updates since v1.5.0. The biggest new feature is a playable beatmap preview. The editor can now autoplay charts when you’re not interacting with it, notes render underneath the receptors like they do in osu!mania, and the HUD stays properly centered. It makes it much easier to get a feel for how a chart actually plays before exporting it instead of only looking at the note data.Henkan also supports 8 languages now. While adding localization, I ended up removing i18next and replacing it with a much smaller custom localization system. Henkan doesn’t really need everything i18next provides, so this keeps things simpler and lighter.I also improved importing incomplete osu! beatmaps. If you only have an .osu file and the audio or background is missing, Henkan can now automatically try to fetch the missing files from an osu! mirror.There were also a bunch of smaller conversion fixes. Skin images are handled more reliably, and previews should now be closer to what you actually see in-game. Release notes are fetched properly from GitHub instead of using the old placeholder, and config overrides now work consistently in both conversion directions.osu! exports got some fixes too. Backgrounds are included even when the source chart doesn’t directly reference them, cdtitle files are only copied when they’re actually needed, and hold notes were cleaned up to follow the normal osu!mania format with proper hitsounds and clean samples instead of creating unnecessary or broken sound files.I’ve also been trying to close the gap between the desktop and web versions. The web build now has much closer feature and export parity with the Rust/Tauri version, and CI automatically rebuilds the WebAssembly binaries whenever something is pushed to main.Keeping both versions in sync is still one of the more annoying parts of working on Henkan, since some converter changes have to be implemented separately for Rust and WebAssembly, but it’s getting a lot better.The goal is still the same: make Henkan the most reliable way to move charts and skins between osu!mania and Etterna without randomly losing important data."}, {"post_id": 48540, "ts": "2026-08-16T23:29:21Z", "hours": 4.8736, "text": "Hello! I’ve kept working on Henkan, my osu!mania ↔ Etterna converter, and shipped quite a few updates since v1.5.0.The biggest new feature is a playable beatmap preview. The editor can now autoplay charts when you’re not interacting with it, notes render underneath the receptors like they do in osu!mania, and the HUD stays properly centered. It makes it much easier to get a feel for how a chart actually plays before exporting it instead of only looking at the note data.Henkan also supports 8 languages now. While adding localization, I ended up removing i18next and replacing it with a much smaller custom localization system. Henkan doesn’t really need everything i18next provides, so this keeps things simpler and lighter.I also improved importing incomplete osu! beatmaps. If you only have an .osu file and the audio or background is missing, Henkan can now automatically try to fetch the missing files from an osu! mirror.There were also a bunch of smaller conversion fixes. Skin images are handled more reliably, and previews should now be closer to what you actually see in-game. Release notes are fetched properly from GitHub instead of using the old placeholder, and config overrides now work consistently in both conversion directions.osu! exports got some fixes too. Backgrounds are included even when the source chart doesn’t directly reference them, cdtitle files are only copied when they’re actually needed, and hold notes were cleaned up to follow the normal osu!mania format with proper hitsounds and clean samples instead of creating unnecessary or broken sound files.I’ve also been trying to close the gap between the desktop and web versions. The web build now has much closer feature and export parity with the Rust/Tauri version, and CI automatically rebuilds the WebAssembly binaries whenever something is pushed to main.Keeping both versions in sync is still one of the more annoying parts of working on Henkan, since some converter changes have to be implemented separately for Rust and WebAssembly, but it’s getting a lot better.The goal is still the same: make Henkan the most reliable way to move charts and skins between osu!mania and Etterna without randomly losing important data."}, {"post_id": 35508, "ts": "2026-07-26T23:56:48Z", "hours": 12.4944, "text": "Henkan Devlog (v1.3.1 → v1.5.0) v1.4.0 (July 20-23) This update was mainly about skin conversion. I added support for converting osu!mania skins to Etterna noteskins and back. It ended up being much bigger than I expected, with over 1,600 lines of code just for the converter. I also added difficulty name presets with placeholders like title, artist, creator, difficulty, and MSD, fixed an issue with extreme BPM values, and added a column width setting for osu!mania exports. Outside of the app, I improved CI, switched Windows installers to NSIS, added AUR support, improved the documentation, and wrote a full end-to-end test for skin conversion. v1.5.0 (July 24-26) This update focused on making the web version behave the same as the desktop app. I fixed export names, media handling, and config support so browser exports now match Tauri. I also fixed a spacebar shortcut bug, made update notes render as Markdown, and cleaned up the CI workflows. Keeping the web and desktop versions in sync is still one of the hardest parts since every converter change has to work in both Rust and WASM."}, {"post_id": 31742, "ts": "2026-07-20T11:47:27Z", "hours": 19.8603, "text": "Devlog — Countdown fix + WASM sync Fixed countdown being on by default when converting Etterna to osu. Added Countdown: 0 to the [General] section in the converter, the dummy diff generator, and the TypeScript equivalent. Discovered the web version was using a stale pre-built WASM binary that didn’t have any of the Rust fixes. Created wasm-core/ — a new crate that builds WASM from the same Rust source via #[path] references. No code duplication. Added npm run build:wasm for local rebuilds and a CI job that auto-rebuilds WASM on push to main so it never goes stale again"}, {"post_id": 21788, "ts": "2026-07-03T22:01:33Z", "hours": 1.7431, "text": "Hello, today I polished and finished the newest version of Henkan! This version is now the most stable version that also introduced an web based app."}, {"post_id": 21102, "ts": "2026-07-02T21:55:30Z", "hours": 5.2581, "text": "Hello, today I fully worked on making my project available for the web via Vercel! I had to solve many issues like permission issues , timing issues , upload issues and more , I eventually fixed it and can say that it’s working stable now! Now I have to sleep…"}, {"post_id": 19532, "ts": "2026-06-30T21:09:08Z", "hours": 14.2728, "text": "Hello, this is my first log! I have to admit that my project is kinda niche but it fills the gaps of the rhythm game community. Short introduction : Im making an advanced osu!mania ↔ Etterna beatmap converter to simplify the mapping and playing of maps. I really depend on making it high performance and feature rich, for example: I had to go through many issues like fixing timing issues , conversion logic , or other things, but I learned from it and fixed them in a way that sets other converters in the ground. I started my project a few days before I found out about stardance hack club so im kinda sad that this time doesn’t count :(. Anyways, im happy to share my progress from now on. Today I focused on developing the CLI for my project and polishing some things, I think it turned out great"}]...
|
Title: Henkan by @Kaanreal | Stardance
Devlogs:
H Title: Henkan by @Kaanreal | Stardance
Devlogs:
Hello, this is my first log! I have to admit that my project is kinda niche but it fills the gaps of the rhythm game community. Short introduction : Im making an advanced osu!mania ↔ Etterna beatmap converter to simplify the mapping and playing of maps. I really depend on making it high performance and feature rich, for example: I had to go through many issues like fixing timing issues , conversion logic , or other things, but I learned from it and fixed them in a way that sets other converters in the ground. I started my project a few days before I found out about stardance hack club so im kinda sad that this time doesn’t count :(. Anyways, im happy to share my progress from now on. Today I focused on developing the CLI for my project and polishing some things, I think it turned out great
Hello, today I fully worked on making my project available for the web via Vercel! I had to solve many issues like permission issues , timing issues , upload issues and more , I eventually fixed it and can say that it’s working stable now! Now I have to sleep…
Hello, today I polished and finished the newest version of Henkan! This version is now the most stable version that also introduced an web based app.
Devlog — Countdown fix + WASM sync Fixed countdown being on by default when converting Etterna to osu. Added Countdown: 0 to the [General] section in the converter, the dummy diff generator, and the TypeScript equivalent. Discovered the web version was using a stale pre-built WASM binary that didn’t have any of the Rust fixes. Created wasm-core/ — a new crate that builds WASM from the same Rust source via #[path] references. No code duplication. Added npm run build:wasm for local rebuilds and a CI job that auto-rebuilds WASM on push to main so it never goes stale again
Henkan Devlog (v1.3.1 → v1.5.0) v1.4.0 (July 20-23) This update was mainly about skin conversion. I added support for converting osu!mania skins to Etterna noteskins and back. It ended up being much bigger than I expected, with over 1,600 lines of code just for the converter. I also added difficulty name presets with placeholders like title, artist, creator, difficulty, and MSD, fixed an issue with extreme BPM values, and added a column width setting for osu!mania exports. Outside of the app, I improved CI, switched Windows installers to NSIS, added AUR support, improved the documentation, and wrote a full end-to-end test for skin conversion. v1.5.0 (July 24-26) This update focused on making the web version behave the same as the desktop app. I fixed export names, media handling, and config support so browser exports now match Tauri. I also fixed a spacebar shortcut bug, made update notes render as Markdown, and cleaned up the CI workflows. Keeping the web and desktop versions in sync is still one of the hardest parts since every converter change has to work in both Rust and WASM.
Hello! I’ve kept working on Henkan, my osu!mania ↔ Etterna converter, and shipped quite a few updates since v1.5.0.The biggest new feature is a playable beatmap preview. The editor can now autoplay charts when you’re not interacting with it, notes render underneath the receptors like they do in osu!mania, and the HUD stays properly centered. It makes it much easier to get a feel for how a chart actually plays before exporting it instead of only looking at the note data.Henkan also supports 8 languages now. While adding localization, I ended up removing i18next and replacing it with a much smaller custom localization system. Henkan doesn’t really need everything i18next provides, so this keeps things simpler and lighter.I also improved importing incomplete osu! beatmaps. If you only have an .osu file and the audio or background is missing, Henkan can now automatically try to fetch the missing files from an osu! mirror.There were also a bunch of smaller conversion fixes. Skin images are handled more reliably, and previews should now be closer to what you actually see in-game. Release notes are fetched properly from GitHub instead of using the old placeholder, and config overrides now work consistently in both conversion directions.osu! exports got some fixes too. Backgrounds are included even when the source chart doesn’t directly reference them, cdtitle files are only copied when they’re actually needed, and hold notes were cleaned up to follow the normal osu!mania format with proper hitsounds and clean samples instead of creating unnecessary or broken sound files.I’ve also been trying to close the gap between the desktop and web versions. The web build now has much closer feature and export parity with the Rust/Tauri version, and CI automatically rebuilds the WebAssembly binaries whenever something is pushed to main.Keeping both versions in sync is still one of the more annoying parts of working on Henkan, since some converter changes have to be implemented separately for Rust and WebAssembly, but it’s getting a lot better.The goal is still the same: make Henkan the most reliable way to move charts and skins between osu!mania and Etterna without randomly losing important data.
Hello! I’ve kept working on Henkan, and shipped quite a few updates since v1.5.0. The biggest new feature is a playable beatmap preview. The editor can now autoplay charts when you’re not interacting with it, notes render underneath the receptors like they do in osu!mania, and the HUD stays properly centered. It makes it much easier to get a feel for how a chart actually plays before exporting it instead of only looking at the note data.Henkan also supports 8 languages now. While adding localization, I ended up removing i18next and replacing it with a much smaller custom localization system. Henkan doesn’t really need everything i18next provides, so this keeps things simpler and lighter.I also improved importing incomplete osu! beatmaps. If you only have an .osu file and the audio or background is missing, Henkan can now automatically try to fetch the missing files from an osu! mirror.There were also a bunch of smaller conversion fixes. Skin images are handled more reliably, and previews should now be closer to what you actually see in-game. Release notes are fetched properly from GitHub instead of using the old placeholder, and config overrides now work consistently in both conversion directions.osu! exports got some fixes too. Backgrounds are included even when the source chart doesn’t directly reference them, cdtitle files are only copied when they’re actually needed, and hold notes were cleaned up to follow the normal osu!mania format with proper hitsounds and clean samples instead of creating unnecessary or broken sound files.I’ve also been trying to close the gap between the desktop and web versions. The web build now has much closer feature and export parity with the Rust/Tauri version, and CI automatically rebuilds the WebAssembly binaries whenever something is pushed to main.Keeping both versions in sync is still one of the more annoying parts of working on Henkan, since some converter changes have to be implemented separately for Rust and WebAssembly, but it’s getting a lot better.The goal is still the same: make Henkan the most reliable way to move charts and skins between osu!mania and Etterna without randomly losing important data.
Hello! I worked on Henkan again and added something I’ve wanted for a while. Henkan can now detect the map you currently have open in osu!stable, osu!lazer, or Etterna and show it directly in the converter. No tosu or any other external tool required.This makes it much faster to open Henkan and immediately work with the chart you’re currently playing or editing.Still working on making the whole workflow between osu!mania and Etterna feel as seamless as possible.
Hello! I worked on Henkan a lot again, mostly on making the desktop app nicer and faster to actually use.One of the biggest changes is that Henkan can now save conversions directly into your detected osu!stable or Etterna song folders. So instead of exporting something and moving it into the game manually, you can just convert it and have it show up where it belongs.I also redesigned the desktop navigation and added pages for your conversion history and local osu! skins. The live map detection settings were improved too, so osu! and Etterna hooks can now be enabled separately.Pack conversion got a lot of work as well. You can select individual difficulties before converting, check the metadata for every song, and packs with different audio files are now split into separate songs automatically. I also fixed a bunch of cases where maps inside a pack could lose their own artist, title, audio or background.The converter now remembers the background of the last map you opened too, even after restarting Henkan. It’s a small thing but makes the home screen feel a lot less empty.There were also a bunch of smaller changes. Loading states and buttons are more consistent, navigation is less messy, pack conversion is faster, Etterna timing and current song detection were improved, and changing song rate now keeps the original audio bitrate.I fixed some platform specific stuff too, mainly the osu!lazer background bridge on macOS and Etterna song detection on Linux.I also refreshed the docs and finally moved Henkan to its new domain https://henkan.kaan.moe registrar might be slow so try https://henkan-chi.vercel.app/
Ships:
Hello, I made an osu!mania ↔ Etterna converter called Henkan (変換). I started the project because I noticed that most existing converters didn’t preserve maps correctly. Timing would drift, BPM changes would be lost or simplified, and long notes would often break during conversion. I wanted to build a converter that focused on accuracy instead of quick conversions. Henkan converts beatmaps between osu!mania (.osu / .osz) and Etterna/StepMania (.sm) while preserving the original chart as closely as possible. It keeps millisecond-accurate note timing, supports multiple BPM changes, correctly converts long notes, preserves metadata such as title, artist, creator, difficulty, and preview point, and keeps background references. The application is written as a native desktop app using Rust, Tauri, and React, making it lightweight and fast on Windows, macOS, and Linux. It also supports converting entire packs, allowing users to process many maps at once instead of converting them individually. One limitation is that scroll velocity (SV) is not converted from osu!mania to StepMania because the .sm format does not have an equivalent representation for osu!’s green-line SV changes. My goal with Henkan is to provide a reliable converter that players can trust to preserve their charts accurately instead of introducing timing errors or losing important map information.
Hello, I’ve continued working on Henkan, my osu!mania ↔ Etterna converter, and released several major updates since my first ship. The biggest addition is full skin conversion. Henkan can now convert osu!mania skins into Etterna noteskins and convert Etterna noteskins back into osu!mania skins. This required handling lane textures, sprite sheets, high-resolution assets, Lua files, metrics, redirects, and the different ways both games structure their skins. I also added customizable difficulty name presets. Exported charts can automatically use information such as the title, artist, creator, original difficulty name, or calculated MSD. Users can also change the column width when exporting to osu!mania. Several conversion issues were fixed, including problems with extreme BPM values, export filenames, media files, and configuration support. The web version now behaves much more like the desktop app, with matching exports and features across Rust, Tauri, and WebAssembly. I also improved the project outside of the main application. Windows builds now use NSIS installers, Henkan is available through the AUR, the documentation has been expanded, the CI workflows have been cleaned up, and I added an end-to-end test for the skin converter. Keeping the desktop and web versions consistent is still one of the hardest parts of the project, since converter changes often need separate implementations for Rust and WebAssembly. My goal is still to make Henkan the most reliable way to move charts and skins between osu!mania and Etterna without losing important data.
This update is mostly about making Henkan nicer to actually use. The biggest change is the beatmap preview. It can now autoplay the chart when you leave it idle, with notes falling under the receptors like in osu!mania and the HUD staying centered. It makes it way easier to get a feel for a chart before exporting instead of just staring at static note columns. Henkan is also now available in 8 languages . While adding localization, I ended up replacing i18next with a small custom system since I really didn’t need a whole library for what Henkan uses. It’s simpler, lighter, and still covers the entire app. I also added something I’ve wanted for a while: if you import a random .osu file without its audio or background, Henkan can now try to grab the missing files from an osu! mirror automatically. So incomplete beatmap folders are a lot less annoying to deal with. There are some smaller fixes too. Skin images are handled more reliably, previews should match the actual result better, and the updater now gets the real release notes from GitHub instead of showing a placeholder. You can try the latest release here: https://github.com/kaanreal/henkan/releases Its really hard to provide screenshots or other things cause it is really niche
This update is mostly about getting Henkan into more places. Henkan can now be installed through winget, Homebrew, the AUR, Chocolatey and nixpkgs. If you use a normal package manager, you don’t have to hunt down the GitHub releases anymore. The site got some attention too. All pages are usable on phones now, and shared links show a proper preview card. I also changed the app icon and logo to a new emblem, which now shows up everywhere, from the desktop app and favicon to the package managers above. Smaller fixes: the preview receptors now line up with the note art, so the editor and the game agree on how the chart looks. You can try the latest release here: https://github.com/kaanreal/henkan/releases Its really hard to provide screenshots or other things cause it is really niche
This update is mostly about making Henkan feel a lot more complete on desktop. You can now save conversions directly into your detected osu!stable and Etterna song folders, so there’s way less manual moving files around. I also redesigned the desktop navigation and added proper pages for conversion history and your local osu! skin library. Pack conversion got a pretty big upgrade too. You can select which difficulties you actually want to convert, review the metadata for each song, and packs using multiple audio files are now automatically separated into individual songs. I also fixed metadata handling so every map keeps its own artist, title, subtitle, audio and background instead of accidentally sharing data across the pack. Live map detection can now be controlled separately for osu! and Etterna, and Henkan remembers the background of the last map you opened even after restarting. There are a bunch of smaller fixes too: faster pack conversion, better Etterna timing and current-song detection, preserved audio bitrate when changing rates, cleaner loading states and buttons, fixed navigation, plus some macOS and Linux specific fixes. The docs were also refreshed, and Henkan finally has its new domain: https://henkan.kaan.moe...
|
1792810350.6755803
|
1792896750.6755803
|
|
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
|
|
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...
|
1792810498.542455
|
1792896898.542455
|
|
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!...
|
1792835399.8101332
|
1792921799.8101332
|
|
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!!...
|
1792821212.6440418
|
1792907612.6440418
|
|
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 :)...
|
1792828383.216767
|
1792914783.216767
|
|
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)....
|
1792842889.7456021
|
1792929289.7456021
|
|
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....
|
1792849662.7546916
|
1792936062.7546916
|
|
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....
|
1792825013.1318076
|
1792911413.1318076
|
|
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....
|
1792846146.3479602
|
1792932546.3479602
|
|
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
|
|
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
|
|
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
|
|
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...
|
1792832184.6255665
|
1792918584.6255665
|
|
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
|
|
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....
|
1792839351.7604694
|
1792925751.7604694
|
|
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
|
|
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
|
|
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
|
|
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...
|
1792842974.0866675
|
1792929374.0866675
|
|
6590
|
Flower by @IvyMycelia | Stardance
|
IvyMycelia
|
2
|
104.2
|
1193
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-07T02:27:02Z", "hours": 27.0, "multiplier": 19.07, "payout": 503, "blessing": "neutral", "text": "The compiler is written in Flower itself and currently targets C, so this release was mostly geared towards making the type system have actual Flower semantics instead of a thin little blanket over whatever the backend happened to be doing. The big additions in v1.4 were: transparent type aliases real null nullable types as ?T == T | null semantic unions like int | string explicit narrowing with is explicit extraction with as That support now works across locals, parameters, return types, struct fields, and stable field-expression chains. The work had to touch parser logic, typecheck, narrowing, lowering, codegen, bootstrap, and then all the weird regressions those changes politely dragged into the room. It was.. a process for sure What I’m most proud of is that v1.4 pushed Flower toward a clearer identity that wasn’t defined by C as much anymore. This release also brought the docs back in line with the compiler, which was LONGGGGG overdue. If you want to test it, the main things to look at are the Better Types examples and the self-hosting flow. The compiler should bootstrap cleanly, the test suite should pass, and the examples now cover aliases, nullable values, semantic unions, inference, and struct/field narrowing behavior. For those who will be testing it, DO NOTE that I develop exclusively on my MacBook which is a UNIX system! I do not have the ability to properly develop and provide releases for Linux-specificalities or non-POSIX systems. I’m extremely sorry for this, but alternatively watch the provided video to see Flower in action :) If you’re not able to test it, watch this short (crappy) video instead: https://youtube.com/shorts/DyPtIru6cjY?feature=share", "repo": "https://github.com/IvyMycelia/flower", "demo": "https://github.com/IvyMycelia/flower/releases"}, {"ship_num": 2, "ts": "2026-06-18T16:00:30Z", "hours": 38.0, "multiplier": 18.19, "payout": 690, "blessing": "neutral", "text": "Flower is a self-hosted programming language for writing simple, explicit systems code without the abstraction bloat and OOP-heavy direction a lot of modern languages have. The compiler is written in Flower itself, currently targets C, and follows a straightforward pipeline: lexing, parsing, module loading, typechecking, and code generation. Over the past few months, Flower grew from a small lexer/parser/codegen experiment in C into a way bigger language project than I couldv’e imagined. This wasn’t my first attempt at a language, but it has been my favorite! I implemented compiler-enforced module semantics, stronger type-aware codegen, real boolean support, real string support, and a small standard library foundation. Strings now have equality, .length, indexing, and explicit casts to and from @char , while modules support exported prop declarations, aliases as namespaces, and private-by-default top-level declarations. The hardest part was bootstrap stability. I ran into idempotency failures, parser edge cases, compiler corruption scares, and plenty of my own bad logic. A lot of the challenge was getting new features to work not just once, but consistently enough for the compiler to rebuild itself cleanly. One bootstrap it succeeds, and then the next I’m scrambling to figure out why the new binary executable has a corrupted parser despite just working (Still haven’t fixed that yet! It.. was really confusing and I’ve got no clue why it happened lol). I’m proud that I kept pushing through that and ended up with something much more fun to use than where I started — I mean, I don’t even have to write that much C anymore!! If people want to test Flower, the important thing to know is that it is self-hosted and still experimental, but it does work. The repo includes a bootstrap path, a test suite, and example programs covering types, control flow, memory, imports, strings, and bools. The current release is focused on making the core language feel real and usable before moving on to a larger standard library and a future non-C backend, so don’t be surprised if a C file is shoved in your face!", "repo": "https://github.com/IvyMycelia/flower", "demo": "https://github.com/IvyMycelia/flower/releases"}]...
|
[{"post_id": 79537, "ts": "202 [{"post_id": 79537, "ts": "2026-10-14T14:44:10Z", "hours": 10.3042, "text": "Integers, Integers, Integers Hello!! Been a while :) Lately I have been working on v1.6. I call it the “Usefullness” update — rhymes with Grug — because it adds a ton of long awaited features and various convenience implementations Flower DESPERATELY needs. For example, currently the progress has to do with v1.6.1, or Fixed-Width Integers . When it comes to systems programming and in-general efficiency, having various integer sizes is important as it provides an additional layer of manual control over memory and sizes. I know I would have to add them eventualy, so why not put them at the start of the Usefulness update?? I’m sure they’ll come in handy later on. What Actually Changed? Well, for starters, there’s now fixed-width integers (yay)! They’re built in types, so you declare them as you would with any other atom / primitive: type Byte = u8 type Choice = Byte | u16 type OptionalByte = ?Byte struct Packet { pair: Byte[2], size: Choice, owner: OptionalByte } A whole bunch of commits and integer-specific changes regarding indices, arity, unions, nullables, etc etc etc have been made, and they all won’t fit here so instead, take a look at the current branch ! What’s In Store? Plenty more features, you can assure yourself! There’s maybe 6 or 7 — I swear — or so commits left for this specific addition, and after that a lot more features laid out in the roadmap for 1.6! As always, thanks for sticking around and watching the fiasco that is this project become more and more estranged with every hour. Love y’all!! Ivy <3"}, {"post_id": 75225, "ts": "2026-09-29T15:04:00Z", "hours": 9.9331, "text": "Integer Types, Parser Fixes, and Segfaults! Phew — this one was biiiiiggg. Flower is pretty much just a glorified C transpiler, which is NOT what I want for it! In order to move on, the data has to be handled explicitly by the FloC. So essentially, I implemented i8 , u8 , i16 , u16 , i32 , u32 , i64 , and u64 . For now, int canonically refers to an i32 value. A New Era? With these new literals, the old hoist-sized representation had to go. The decimal source text is preserved, meaning values such as 18446744073709551615 remain after parsing without causing any overflow. Types are picked up from declarations, assignments, function arguments, return values, field writes, array-element writes, * breath in * and binary expressions! Oof, that was a mouthful. That, of course, resulted in proper errors for things like: 256 assigned to u8 −1 assigned to an unsigned type values beyond u64 unconstrained literals outside the default i32 range I Hate Memory During printing, every width is handled. Integer conditions retain existing zero / nonzero behavior, and literal types print their values rather than a character. Halfway through, I ran into sudden segfaults and memory leaks. I was taken aback, because I didn’t even change anything parser related yet. Turns out, I forgot an assignment in a declaration, which apparently the parser wasn’t able to handle (whoops!). Anyways, I fixed it by propagating errors through the compilation process, so the compiler doesn’t try to typecheck or code gen if the parser reports back errors, and instead will print them out. And that’s it! Not that’s it, but that’s all I’m going to explain for now. More specifics available on the GitHub, of course. Speaking of GitHub thank you so much to S1monr3dst0ne07 on GitHub for fixing some memory leaks in the previous version of Flower — I forgot to prune allocations before returning from a function :p Love y’all!! <3 P.S.: So glad I gave up on documentation, I was genuinely dreading workong on the project and that’s why I’ve been ianctive for a long time :c"}, {"post_id": 53525, "ts": "2026-08-24T03:18:35Z", "hours": 9.7706, "text": "Hey, it’s been a while! I’ve been finding it difficult to stay motivated for this project, especially with how the new payout system works and just my in-general inability to keep commitment despite having a lot of passion. That said, I am going back to working on this diligently, and I think to start I’m going to cut down on the documentation by making perhaps one or two changes, and then going right back to the compiler work. Documentation writing has not been the most fun for me, especially with how long it takes and how it’s so difficult to not only write language reference that works, but also keeping the same whimsy Flower should have. Thank you to everyone who’s been following this journey, and I can’t wait to see y’all later!!! With Love, - Ivy <3"}, {"post_id": 26743, "ts": "2026-07-11T18:25:46Z", "hours": 9.1964, "text": "Devlog: v1.5.1 – v1.5.5 Following all of the changes Flower has undergone, I felt it was time for some much-needed documentation. On paper this was supposed to be fairly quick, simple, and not require much brain power. Unfortunately for me I got a bit too over-zealous, and included things I thought should work, but in reality hadn’t. For example, in a lot of the code snippets I’d have something like: for i in range 0..10: print(i) end Printing non-string values was not yet supported in Flower. To fix this, I took a small detour back to v1.4 and implemented support for it — mostly in a single codegen case: if ast.data._print.value_type.base == TOKEN_FLOAT or ast.data._print.value_type.base == TOKEN_DOUBLE: fprintf(out, \"printf(\\\"%%f\\\", \") gen_expr(ast.data._print.value, out, src) fprintf(out, \");\\n\") end Afterwards I added more smoke-tests in examples/io/print.flo . Every few runs, however, I’d get a segfault. This was especially odd because it wasn’t simply an error but rather a silent memory bug. Eventually I found out where it was originating — thanks, ASan! Turns out after the new type system changes, I had forgotten to initialize some values to null / 0 in for loop handlers and a few other places. I just added typeInfo.data = null / 0 where applicable and it fixed the issue! What is v1.5, and why is this devlog so long? To answer the latter first.. I lowkey just forgot to post a devlog for the first two docs I made. That’s it. For the former question, v1.5 is supposed to be explicitly a documentation pass. First thing I worked on was structure. I cleaned up the docs layout, moved things toward a more consistent lowercase docs/ tree — I had been trying for so long to do that and I just finally got it to work — and wrote down the documentation process itself so new pages aren’t just floating about. The point was to try and make the docs feel like a book instead of a folder full of unrelated notes. I wrote and checked the language pages for types, functions, and control flow by reading the compiler itself, not by trusting my (poor) memory. That meant checking parser rules, typecheck behavior, codegen boundaries, and example files before writing anything solid. Types especially needed this, given how Flower now has enough real type machinery that the docs can quickly go from being coherent to completely incorrect: nullable sugar, semantic unions, explicit casts after narrowing, alias behavior, current member limits, and the difference between what the language wants to become and what the compiler supports currently. Functions and control flow had a similar issue. I had to document prop , return rules, direct call forms, logical conditions, range-based for , and the rough edges like break and continue not yet being enforced cleanly as loop-only. That kind of thing is small until someone learns the language from the docs and hits the edge head-first (been there, done that). What Now? I’m just going to keep writing docs. Maybe do one devlog for every new doc, or a batch of docs, who knows! I certainly don’t :p"}, {"post_id": 23761, "ts": "2026-07-06T21:49:25Z", "hours": 0.6008, "text": "Devlog: Syncing Flower’s Docs Back to Reality Just a doc cleanup lol. No code change or compiler updates. Probably did more than needed for now but oh well! The mismatch was REALLY bad. The old docs preserve old assumptions, and someone reading them could walk away with a version of Flower that no longer really exists (or, in some cases, doesn’t exist yet or never ever existed)! What changed I updated the docs that had drifted the most from reality (relatable): README.md now reflects the current type-system shape ROADMAP.md treats v1.4 as accomplished the v1.4.0 milestone doc now includes more of the outcome, not just the original plan contributor docs no longer have stale semantics structure.md is more accurate to what Flower currently is, and what still needs a fuller rewrite later Yea, that’s it."}, {"post_id": 23618, "ts": "2026-07-06T18:01:45Z", "hours": 1.6556, "text": "Devlog: Finishing Nullable Field Narrowing At this point, Flower could already narrow semantic unions through field access in the is / as case, and nullable field checks were supposed to be the obvious follow-through: if maybe_box.value != null: label: string = maybe_box.value as string end Instead, I had forgotten to remove a LOT of stale code, and thus part of it was still behaving like only plain local variables could ever be narrowed. There was also a second, smaller mismatch hiding, where null in type position was not lining up with the compiler’s actual internal null representation. ?string and string | null weren’t leading to a congruent output and at times were wobblier than they should be. So the fix was mostly cleanup, but the meaningful kind: make null in type syntax lower the same way the compiler expects remove the stale var-only branches in nullable narrowing let stable field paths like maybe_box.value and holder.box.value narrow properly The funny part is that this felt bigger initially than it actually was once fixed. Nothing fundamentally new had to be invented, I just had to stop the old code from interfering with the newer code, which once I figured out how to do so it was quite quick. I spent an embarrassingly long time figuring it out…"}, {"post_id": 22284, "ts": "2026-07-04T17:48:44Z", "hours": 1.8161, "text": "Devlog: Letting Union Narrowing Follow Field Access Before v1.4.13 , union narrowing only really worked when the thing being narrowed had a variable name due to almost every similarity check relying on name_start and name_length . This was dumb, because semantic unions already knew how to test tags and extract members. Codegen was not the issue, but rather the annoying part was that the typechecker could remember this: if value is int: n: int = value as int end but not this: if box.value is int: n: int = box.value as int end So I still had to do a little temp-variable ritual: tmp: Value = box.value if tmp is int: n: int = tmp as int end Which was gross. Not necessarily catastrophic, just gross and annoying. I wanted needed convenience What changed The compiler was remembering narrowings by variable name, not by expression shape, so box.value looked obvious in source (to me, at least), but to the typechecker it was basically some random expression and not something it could reliably recognize again later. A variable name already had a stable identity, whereas field access chain did not. So the change was to let narrowable expressions represent more than just AST_VAR_REF . For now, that only means stable dot-access chains. The typechecker can record a narrowing for an expression like: box.value and then recognize the same expression later when a cast shows up. So this works directly now: if box.value is int: n: int = box.value as int end Same for the other union members, like string . The detour My first example accidentally wandered into a different feature: if maybe_box.value != null: That exposed a real nullable-field-guard gap, but that is not what this was supposed to be about. Very rude of the test case to have ambition hmph >:( Where this leaves it Semantic union narrowing now persists past field access — at least for stable dot-access chains — and the temp-local is no longer needed. Butttt now I gotta work on nullable-field-guards, ugh (hehe)"}, {"post_id": 21926, "ts": "2026-07-04T03:34:19Z", "hours": 0.4592, "text": "Devlog: Direct Semantic Union Parameters Now instead of having to do this workaround: type Value = int | string func accept(value: Value): bool You can just pass semantic unions directly: func accept(value: int | string): bool That was it. All I had to do was remove a stale type_error clause in register_params and allow binding variables. Then I updated the two relevant accept functions in /examples."}, {"post_id": 21751, "ts": "2026-07-03T20:51:30Z", "hours": 4.9086, "text": "Devlog: Making ?T Actually Mean T | null Before v1.4.10 , ?T was treated as its own nullable system and not really integrated with the rest of the semantic unions. This was unideal, because it created a separation of logic which was cumbersome to maintain. The idea was to make the following be the default: ?int == int | null ?string == string | null ?@int == @int | null Prior to the refactor, nullable types were still mostly pointer-oriented. That worked when ?T basically meant “maybe this pointer is null,” but it did not really fit anymore once semantic unions became actual runtime values. If Flower has T | null , then ?T should use that instead of being its own special thing. This is a more pragmatic choice, as it keeps the compiler easier to manage and update later on. What changed Typecheck now lowers ?T into the same semantic-union machinery used by normal unions. That means nullable values now go through the same general path as union values: null checks use union-aware narrowing narrowed nullable values can be extracted with as codegen emits tagged union storage assignments pack into the right union member So this now works as an actual nullable flow: maybe: ?@int = raw if maybe == null: return false end real: @int = maybe as @int The annoying part is that Flower has to track two things at once: the type the programmer is allowed to see after narrowing, and the actual union shape that remains underneath it. After the guard, maybe behaves like an @int . But codegen still has to remember it came from @int | null , because apparently the compiler cannot simply “vibe” its way through storage layout. Tragic! The bugs that annoyed the heck out of me Most of the work was not surface syntax. The syntax was just standing nearby looking innocent. The actual bugs were in the places where Flower knew “this is non-null now,” but then forgot how to lower, such as: narrowed nullable values falling back to raw C casts like (int*)(maybe) false branches of == null / != null narrowing to the wrong side (this was my fault lol) null getting packed into the wrong union member That last one was the rude one. For ?@int , generated C could end up doing something like: . tag = 1 , . m0 = NULL instead of packing into the actual null member. So the value looked almost right, but the tag/member pairing was wrong. Then later null checks would fail, because the compiler had technically put null somewhere. Just not the correct somewhere. Very helpful. The fix was separating two questions I had accidentally merged: is this type compatible with this union? which exact union member should this value occupy? Those look related, but they are not the same question. Flower was using the first answer for the second problem, and then acting surprised when everything became soup. Where this leaves Better Types ?T now lowers through the same path as T | null , which means null checks, narrowing, extraction, and storage all line up with the semantic union model. This should make later work cleaner, such as nullable inference, nicer union ergonomics, maybe pattern-like narrowing eventually. Not easy. I am not saying easy near a compiler. That is how they hear you. You do not want them to hear you .."}, {"post_id": 19626, "ts": "2026-07-01T00:18:08Z", "hours": 0.4472, "text": "Devlog: Teaching Flower to Understand Guard Clauses gave Flower branch-local inference. Last update, I added support for branch-local inference, so the compiler could understand things like: if maybe == null: return false else: real: @int = maybe end and: if value is int: return false else: s: string = value as string end That was an improvement, but it still meant narrowing stopped at the end of the branch. That meant stuff like returninging in some conditions still did not really work as naturally as it should: if maybe == null: return false end real: @int = maybe or: if value is string: return false end n: int = value as int In v1.4.9 I fixed that. What changed Now narrowing propagates past very obvious guard clauses. If one branch definitely returns and the other falls through, the compiler now carries the interpretation forward after the if . This means that the compiler can now understand: after if x == null: return ... , x is non-null after if x is string: return ... , a two-member semantic union can narrow to its remaining member I kept this intentionally conservative for now. The compiler is not doing full control-flow analysis yet. It is only recognizing the simplest and most explicit early-exit shape. How it works The main addition was a small semantic check for “does this branch definitely return?” Right now that means: direct return if where both branches definitely return Once the compiler knows one side exits and the other survives, it applies the branch’s narrowing to the following statements. Yea.. that’s it lol."}, {"post_id": 19014, "ts": "2026-06-30T05:39:45Z", "hours": 1.2028, "text": "Devlog: Adding Obvious Branch-Local Inference to Flower Before this, narrowing mostly worked in the obvious “true branch” cases: if maybe != null: real: @int = maybe end and: if value is string: s: string = value as string end But the else branch was still kind of standing there empty-headed, even when the meaning was extremely obvious. Like, if this happens: if maybe == null: return false else: real: @int = maybe end then inside the else , maybe is clearly not null. So now it doesn’t!! What changed Flower now does branch-local narrowing in else for small, explicit cases. That means these now work: if maybe == null: return false else: real: @int = maybe end and: if value is int: return false else: s: string = value as string end It is only applying inference when the condition says something directly and the opposite branch has one obvious meaning. Nullable narrowing For nullable pointer-like values, Flower now understands both sides of simple null checks: if x != null narrows x to non-null in the if body if x == null narrows x to non-null in the else body the opposite side can narrow to null when that is the only meaning left Semantic union narrowing The same idea applies to semantic unions, but a bit more ‘held back.’ Essentially, if Flower sees: if value is int: then the if branch narrows to int , like before. Now, if the union only has one other possible member, the else branch can narrow too. So for: int | string the else after if value is int can be treated as string . This is not full control-flow wizardry, since it doesn’t reason across deep boolean chains, early-returns, or giant branches yet. It is deliberately small and local, because I do not want Flower “helping” so much that I need a detective board to figure out what type something is."}, {"post_id": 18478, "ts": "2026-06-29T17:18:49Z", "hours": 0.8039, "text": "Devlog: Letting Semantic Unions Work In Functions After getting semantic unions working in local declarations, the next problem was fairly obvious (and in my roadmap hehe). This did not work before: func make_value(): int | string return 7 end func accept_value(value: int | string): bool return value is int end Which was annoying, because int | string was already a real union type at this point. Flower could use it in locals, it could pack assigned values, it could check variants. But if I returned 7 from a function declared as int | string , or passed 7 into a parameter expecting int | string , the compiler did not know how to carry that union-lowering information across the boundary. This has been one of the easier changes I’ve made in a long while. It compiled properly first try (if you ignore a tiny misspell I made which I fixed really quickly), and there were no prior hidden bugs that surfaced. This.. is too suspicious. What changed The compiler now carries semantic union info through: function parameters function returns imported alias calls If a function expects: int | string and I call: accept_value(7) typecheck records that 7 needs to be packed as the int member of that union. Same for returns: func make_value(): int | string return 7 end That matters because codegen cannot guess later due to the separation of responsibilities I’ve laid out. By the time Flower is emitting C, it needs to know which tag to set and which member to write. Lowering it properly Codegen already knew how to pack union values for declarations and assignments. The missing part was doing the same thing for call arguments and return statements. So now a value can be packed into a tagged union when it is: stored locally passed into a function returned from a function Alias calls got handled too, so things like: remote.accept(11) remote.make_string() do not become their own weird little cursed island. Why this mattered Without this, semantic unions only worked as long as I never organized my code. They worked in local tests, but not in helper functions, imported providers, or normal inputs and outputs. Now union values can actually move around the program instead of being trapped in the one scope where they were declared — and for me, forgotten! Very exciting, the union can leave the house. They grow up so fast ⁎⁍̴̛ ₃ ⁍̴̛⁎"}, {"post_id": 18151, "ts": "2026-06-29T05:17:03Z", "hours": 3.3186, "text": "Devlog: Semantic Unions Become Actual Values (Part I) In v1.4.6 , I made semantic unions actual runtime values instead of just parsed/typechecked shapes. Before this, Flower could understand: type Value = int | string as a type. It could point at it and say, “yes, that is a union,” but that was mostly theoretical. The goal was to make this work-work for realsies: type Value = int | string value: Value = 7 if value is int: n: int = value as int end value = \"Ivy\" if value is string: s: string = value as string end That meant Flower needed more than TypeInfo.is_union = true . It needed a full path from syntax, to type proof, to lowered storage, to runtime extraction. Otherwise unions would just be fancy typechecker thingy-ma-bobbies, which is not very useful when the backend still emits C. What changed Instead of treating a union as a vague “one of these types, probably,” Flower now lowers it into a tagged structure. Conceptually, this: type Value = int | string becomes something like: struct Value { int tag ; union { int as_int ; flower_string as_string ; } data ; }; Not the final sacred form forever, but that is the shape of it: a tag saying which variant is active, plus storage for the possible members. Since Flower emits C right now, the lowering is C-shaped. I am not fully sure how I want this to look in ASM yet, but I do know it would be way more technical, and uglier. This required a few things to play nicely with one another: if value is int creates a union proof the guarded branch stores narrowing information value as int is only allowed after proof assignments pack values into the right tagged member explicit casts extract the right member from storage Otherwise the compiler is just writing checks its own backend cannot cash. The part that makes it ACTUALLY semantic For pointer narrowing, if value is T mostly refines how the compiler treats an existing value. For semantic unions, the check also becomes a runtime tag test. So this: if value is int: means: check the active tag of value , then inside this branch, treat it as the int variant. Then this becomes valid: n: int = value as int because the branch already proved the active variant. Without that proof, value as int should not be casually allowed. Flower is supposed to be explicit, not psychic, and I am not confident enough yet to implement a proper intuitive implicit checker without summoning something cursed. Assignment and extraction This: value: Value = 7 now packs 7 into the int member and sets the tag to the int variant. Then this: value = \"Ivy\" does the same thing, but for the string member. So a semantic union is not just some bytes, but rather a tagged runtime object where Flower knows which member is active. Then explicit casts like: value as string can lower into extracting the string member, but only when the typechecker has accepted that the operation is safe in that control-flow path. Why this checkpoint matters Flower can now store variant values, prove which variant is active, and require explicit extraction instead of relying on random magic I threw together. The flower has grown another concerning little organ."}, {"post_id": 16395, "ts": "2026-06-26T17:55:41Z", "hours": 2.0825, "text": "Devlog: is Checks v1.4.5 added is checks, mostly so code like this can work: if maybe_ptr is @int: real_ptr: @int = maybe_ptr end The idea is (fairly) simple: if the condition proves maybe_ptr is an @int , the inside of the branch should be allowed to treat it like one. Flower did not know how to do that before. It knew what a variable was declared as, but it did not really learn anything from control flow yet. Now it can, at least for the pointer/nullable-ish cases I care about first. This touched the parser, AST, typechecker, narrowing logic, and codegen. So, naturally, the “small feature” went everywhere. I’d actually consider this one of the bigger refactors so far, mostly because it added a new TypeAtom structure. Before this, types were still a bit too attached to the places they appeared, and all fell under the TypeInfo . That worked for simpler declarations, but is checks needed type syntax to have something the compiler could pass around to use for comparisons, validations, and narrowing. The parser had to recognize the new expression shape. The AST had to store the left side and the tested type. The typechecker had to make sure the test was allowed and not totally garbage. Then the narrowing logic had to say, “inside this branch, this variable has the proven type of x and therefore we won’t flag you for being an idiot.” That last part was where the bug goblin lived. I’m calling them a goblin because they were sneaky (and I also think it’s quite a funny and cute name). For a while, Flower had applied narrowing from the if body instead of the if condition, which meant the compiler saw this: if maybe_ptr is @int: real_ptr: @int = maybe_ptr end and somehow still failed on the assignment inside the branch. Very helpful. Thank you, compiler. EVen though it’s obviously 100% my fault, I made the compiler, but oh well!! Once I changed the narrowing step to inspect the actual condition expression, it started behaving like it should. The typechecker could see maybe_ptr is @int , attach that narrowed type to the branch scope, and allow maybe_ptr to be used as @int inside the guarded block. For now this explicitness is how I want it. There may come a time in the near future where I decide some implicity is ok, but we’ll see ;) is checks are the first real step towards control-flow-aware typing in Flower. Not full union support yet, but definitely the beginning of that road soon to come. Right now it mostly helps with nullable and pointer-like cases. Later, the same idea can support richer unions, better narrowing, and more type-driven control flow without making the programmer manually restate everything the compiler should already know. Also, it bootstrapped cleanly twice — which.. is obviously the bare minimum, but still!!"}, {"post_id": 15458, "ts": "2026-06-25T04:05:50Z", "hours": 2.4619, "text": "v1.4.4 Devlog: Giving Flower Real Semantic Union Types I made it so that semantic unions are now in Flower’s parser and type system — but not yet its codegen. The goal was to support types like: value: int | string next: @Node | null type Result = int | string What’s new The parser now understands | inside type positions and builds semantic union type information instead of relying on those old plain aliases or backend-shaped hacks. On the typecheck side, unions are now carried through normal type copying and alias resolution. That means named aliases like: type MaybeName = string | null make sense after resolution, instead of collapsing into nonsense. The typechecker also now accepts union-compatible usage in the places that matter for a foundation: variable initialization assignment parameter passing return checking alias resolution So if a value matches one union member, it is accepted. This is sorta implicit behavior, but I think it gets a pass due to its somewhat explicit nature? What it does not do yet This version was intentionally strict about using unions as values. You cannot yet directly: index a semantic union access a field on a semantic union use arithmetic / comparison operators on one print one directly Instead, Flower now requires an explicit cast before using a union value that way. That may sound harsh, but it is the right restriction.. for now. There is not any narrowing yet, so pretending unions were fully usable would just make the language lie and spit out 2,000 errors. Where this leaves v1.4 Flower now has: transparent type aliases null as a real type-system concept pointer-first nullable types semantic union type representation The next step is the part that will make unions actually usable rather than merely legal: narrowing with is better explicit extraction with as eventually making ?T truly become T | null instead of remaining pointer-first for now No fun screenshot this time :p just frontend work for now… Ivy, signing off <3"}, {"post_id": 14511, "ts": "2026-06-23T17:31:39Z", "hours": 1.8206, "text": "Devlog: Adding Pointer-First Nullable Types to Flower I worked on giving Flower its first real nullable type surface without being overambitious and pretending the compiler is ready for full optional-everything semantics yet. The new syntax now works like this: ptr: ?@int = null text: ?@char = null That means there is now an explicit way to say “this pointer-like value may be absent,” instead of relying entirely on raw pointer habits from C (If you couldn’t tell by now, I despise C). What changed The main work was split across lexer, parser, and typecheck. I added: ? as a type marker in type positions is_nullable tracking in TypeInfo type rules for nullable pointer/reference values explicit compatibility for: assigning null into nullable pointer-like types comparing nullable values against null casting between @T and ?@T I also kept the scope intentionally narrow: this implementation is pointer-first nullable support , not full nullable scalars. So ?@int makes sense right now, but ?int is still deferred until I make a better semantic union / optional representation for plain values. Why this matters It would have been easy to overreach here and claim “nullable types are done,” but that would have been a big phat lie. Pointer-like nullability lowers naturally enough with the current backend and current compiler model. Scalar nullability, however, does not. Once you let int or bool become nullable, you need a more real representation for “has value / no value,” and that belongs in the later union work, not here. Result explicit absence compiler-owned semantics better future unions stronger type meaning without hidden magic The next real step after this is not more patching around null — I consider that done for now — but instead giving Flower the deeper machinery needed for nullable non-pointer values and semantic unions later in v1.4 so it doesn’t come back to bite me in my butt."}, {"post_id": 13935, "ts": "2026-06-22T21:20:58Z", "hours": 0.355, "text": "Devlog: Formalizing Flower’s Null Foundation Flower already had some of the pieces for null , but they were a bit scattered. The goal here was to make it explicit, consistent, and safe before moving on to nullable syntax like ?T or full union-based nullability later in v1.4 . Another shorter devlog, but still important and distinct enough for me to think “Hmm devlog time? Yes, devlog time!” What changed The main work was in typechecking. I added to the compiler’s idea of what null is, how it is represented internally, and what kinds of values are actually allowed to accept it. Rather than letting null-related behavior stay implicit across a few checks, null now follows a clearer rule set: null has one centralized internal type representation pointer-like values can explicitly accept null null comparisons and assignments now go through the same semantic path Why this matters This isn’t all that important on its own, but it matters a lot for where Flower is going next. If null is not defined well, then later features like: ?T better unions smarter narrowing more expressive type flow all become more error-prone (or so I assume given my track record) than I want need them to be. Validation I also expanded the example coverage so null : it now has dedicated behavior checks around assignment, passing values around, and comparison behavior."}, {"post_id": 13918, "ts": "2026-06-22T20:30:15Z", "hours": 1.0089, "text": "Devlog: Fixing Flower’s Compiler Process So It Stops Fighting the Host This wasn’t really about language design at all buttttt it is much more embarrassing , AND more important: Flower’s compiler process itself was too fragile. The immediate issue showed up on Linux, specifically NixOS (thanks shipwrights <3). The build flow was assuming too much: a previously existing bin/Flower could be reused safely bash would exist at the expected path clang would always be available the checked-in compiler binary would be runnable on whatever machine the repo landed on That worked well enough on my machine until it didn’t. On NixOS — and by extension probably any other machine without the prexisting binaries I had — it broke: make targets were inconsistent, the shell script failed on interpreter assumptions, and the compiler binary itself could be the wrong format for the host. What changed The fix was to separate “the compiler source exists” from “the current compiler binary is usable on this machine.” The build process now starts by compiling a fresh host-native bootstrap compiler from bin/Flower.c , instead of trusting whatever happens to already exist in bin/Flower . That means the flow is now: bin/Flower.c -> host-native bootstrap compiler -> new Flower compiler -> self-check instead of: maybe existing bin/Flower -> hopefully works -> maybe bootstrap Ok well that’s kinda a lie; it still relies on hopes and dreams to bootstrap sometimes. BUT it’s MUCH safer! And now everyone gets to experience crippling bootstrap anxiety, instead of being met with a failure before the actual compiler gets to.. well, do its thign! I also cleaned up the surrounding tooling: switched the bootstrap script to portable sh restored a clearer build / bootstrap / rebuild / test / clean structure made the compiler use CC and CFLAGS from the environment instead of hardcoding clang What this actually improves Flower is still not universally cross-platform yet. The compiler driver still has POSIX-shaped assumptions in places, and the emitted C can still depend on host APIs depending on what the program uses. I’m not yet at the point of wanting to make it completely universal, especially given how I’m only one person and with v2.0 coming up soon it’d — in my humblest of opinions — be a waste of time. I am honestly grateful for people reviewing my code and otherwise viewing it catching onto details I have overlooked. My goal is to not make a ‘just-barely working on my machine’ project; I enjoy sharing development with others, and it hurts knowing people can’t appreciate code, whether it be mine or others’, due to something as simple as hard-coded sh flags."}, {"post_id": 13822, "ts": "2026-06-22T17:23:16Z", "hours": 3.7814, "text": "Devlog: Making Flower’s Type Aliases Transparent This version was simple to develop on paper (and even in practice it wasn’t too bad, only around 4 or so hours!): type Count = int type Total = Count type Name = string and then have those aliases behave like the real type everywhere: n: Count = 12 total: Total = identity(n) name: Name = \"Ivy\" if name != \"Ivy\": return false end if name.length != 3: return false end That meant aliases could not just be parsed and stored, but rather had to be transparent to the compiler’s semantic checks. What changed I added type alias declarations to the AST, parser, and type environment, then added the ability to resolve aliases in typechecking before comparing types. That included: return type checks variable initializers function call arguments binary comparisons string-specific comparison logic struct field access The important rule here is that aliases are semantic, not codegen-facing. Count should behave as int , Name should behave as string , and chained aliases like Total -> Count -> int should collapse correctly. In the future, especially post v2.0 , this could change and custom types might become real — but for now, they’re just aliases. The bug that exploded bootstrap The first real failure was not in aliases themselves, but in function argument checking. Inside check_call_args(...) , the compiler was resolving the argument expression into expected_type instead of arg_type . That overwrote the parameter type, left the actual argument type uninitialized, and caused the second bootstrap stage to explode into over a thousand misleading errors. This was not a pre-existing issue, it was instead from human error (my error) during the initial implementation where I accidentally put the wrong variable. Once that was fixed, the remaining failures were much more helpful than the bright flash of red and “Typecheck failed with 1224 error(s)” message! Where this leaves v1.4 With the first step toward “better types” done, aliases are no longer just syntax. That gives v1.4 a solid base for whatever comes next in the type system without having to fake around raw names. During this whole dev session, I did discover that a whole lot more of the source code was left using legacy work-arounds: int instead of bool , name_start; name_length and @char instead of string . In all fairness, some of these aren’t exactly the easiest to refactor. However, I will probably hold off on refactoring the codebase until either right before v2.0 , or right after. Just know it’s on my radar ;)"}, {"post_id": 11351, "ts": "2026-06-18T15:46:42Z", "hours": 1.4231, "text": "Devlog: Cleaning Up v1.3 For Release After many hours of work, bool and `string finally became real, and it was time to cleanup the mess I left behind from the version’s development. Mainly the only thing worked on was some cleanup: roadmap now reflects actual v1.3 features and implementations updated README and contribution documents to match the current compiler pipeline cleaned up string examples so they have the full intended v1.3 style instead of some leftover testing usage pushed the compiler’s version to 1.3.0 updated help / usage text so it matches the new output-path and auto-run behavior Prior to this, if I had just merged and shipped, the release wouldv’e been messy: README, Contributing, example files, and guidance commands were all mixing older details which made it confusing — even for me — when trying to explore the language and what it has to offer. For a bootstrapped compiler especially, making sure everything is cleaned up and polished is something that should not be ignored. I’m definitely guilty of overlooking this, but I’ve outlayed a whole plan for v1.3 unlike past versions, and part of it was setting up a proper versioning system and polishing its release as it goes. This format will be adopted in future versions, since it’s just way cleaner and nicer to look at. Future work At this point, v1.3 is done and has implemented, at minimum, a concrete foundation for post-v2 bools and strings. Next will likely be more subtle improvements, and features that are currently reliant explicitly on C rather than Flower-hosted code. In order for v2.0 , Flower will have to be effectively independent from C if it wants to emit machine code. Currently I am planning on adding features such as Type Aliases and maybe a stdlib prior to that, but anything can change!! Thanks for being here for all of v1.3 <3"}, {"post_id": 11116, "ts": "2026-06-18T05:51:28Z", "hours": 1.7269, "text": "Devlog: Giving Flower an Internal cstr Foundation Even after Flower got a real string type, the compiler itself was still leaning directly on C-style string helpers for its own internal work. That meant a lot of Flower source was still semantically depending on libc behavior: !strncmp(...) strcmp(...) strlen(...) strcpy(...) strncpy(...) strdup(...) strrchr(...) That is not where I want the language to stay. What changed I added a new internal module: import \"src/stdlib/cstr.flo\" as cstr and gave it compiler-facing helpers like: prop func len(s: @char): int prop func eq(a: @char, b: @char): bool prop func eq_n(a: @char, b: @char, n: int): bool prop func copy(dst: @char, src: @char): @char prop func copy_n(dst: @char, src: @char, n: int): @char prop func dup(src: @char): @char prop func find_last(src: @char, ch: char): @char This helper module is essentially the precursor to a future strings.flo library that can be distributed. But for now, it uses a basic API layer purely meant for in-house usage. Then I migrated compiler internals over to that module across: src/parser.flo src/module.flo src/lexer.flo src/typecheck.flo src/codegen.flo src/globals.flo src/main.flo So instead of using C-string behavior directly everywhere, the compiler now goes through Flower-owned helpers first. The Compiler Strikes Back This was one of those changes that sounds mechanical until it absolutely is not. A big trap was that old code often relied on C comparison functions returning 0 on equality, so patterns looked like this: not strncmp(...) But cstr.eq_n(...) returns an actual bool , which means blindly rewriting those calls gives inverted logic. So this: if ps.alias_lengths[i] == tok.length and not cstr.eq_n(...): was completely wrong. It had to become: if ps.alias_lengths[i] == tok.length and cstr.eq_n(...): That bug showed up in alias parsing first, which made it especially cursed, because it caused normal namespace-style calls like cstr.eq(...) to stop parsing correctly and crash the bootstrap path in confusing ways. I spent way longer than I wish to admit on trying to figure out why it wasn’t playing nice. But, once I figured it out, it was a really quick fix (I literally just cmd + f ’d not cstr and replaced it with cstr lol). Are we done yet..? This does not mean Flower is free from the C backend yet. It does mean something important, though: compiler logic is starting to depend on Flower-defined helper semantics instead of scattered raw libc calls. That is a much better stage for the future backend story, because when C eventually stops being the primary lowering target, the compiler will already have more of its own vocabulary. In other words, this was less about “remove C” and more about “stop letting C define the language’s internal habits.” Nah just kidding, I really wanted that bloated “builtin_c_call” stuff gone. Unfortunately I only managed to skim it, but that’s closer than before! Result After fixing the migration mistakes and the alias/parser fallout, the compiler bootstrapped successfully again. Flower now has an internal cstr layer, and compiler string handling is a little more its own."}, {"post_id": 11068, "ts": "2026-06-18T03:16:30Z", "hours": 1.2611, "text": "Devlog: Fixing Flower’s Output Driver and Starting the String Stdlib This checkpoint was really two different kinds of progress that ended up helping each other a lot. The first part was not glamorous, but it was necessary: Flower’s compile driver was tripping over its own default output naming. This was a known issue that I had been putting off, but for some reason it really annoyed me this time so I decided enough and to fix it. If no explicit output path was provided, the compiler would generate output.c , then strip the .c and try to emit a binary named output . That worked fine right up until the repo itself already had an output/ directory. At that point, linking failed because the compiler was trying to create a file where a directory already existed. Worse — because it annoyed me more — the driver logic was also mixing up “the generated program exited non-zero” with “compilation failed.” That became especially annoying during bootstrap, because the generated compiler binary would run without CLI arguments, print its own usage error, and then cause bootstrap to report failure even though codegen and C compilation had both succeeded. So I finally got off my butt and cleaned that up. Driver Cleanup The default output path now goes to: output/out.c which naturally produces: output/out as the binary. That avoids the old output filename collision. I also separated compile success from auto-run behavior: explicit output path: compile only default output path: compile, then auto-run if appropriate That means bootstrap no longer “fails” just because the compiled compiler exits non-zero with missing arguments, and demo/test files can still run automatically when that is actually useful. This sounds like a small driver fix, but honestly it removed a lot of noise from string work — and more — immediately. String Stdlib Beginnings Once that output weirdness was under control, I could finish doing what I just started and actually wanted: making string behavior live in Flower instead of endlessly leaning on ad hoc C calls (Call back to last devlog, absolute ball knowledge!!). So I added the first real reusable helpers in src/stdlib/string.flo : is_empty(s) starts_with(s, prefix) ends_with(s, suffix) find_char(s, ch) These are intentionally simple. They mostly exist to prove that the current string support is now strong enough for normal library code to be written on top of it. Not incredibly useful, at least at the level the compiler needs, but at least I could translate some AP Comp Sci A into Flower hehe A string feature does not really feel “real” until I can build helpers with the language itself instead of only teaching the compiler more special cases. The day I remove the builtin C handlers is the day I’m at peace… Validation To exercise that new library surface, I changed string_pass.flo to now act as a small pass file for the experimental library. Its job is not to be impressive. Its job is to answer a more important question: can I import string helpers, call them from normal Flower code, and get expected results through the full compile pipeline? At this point, yes. Where this leaves things This checkpoint did not remove all C string dependencies from the compiler. In fact, it removed essentially none! That is still a separate step, one that may even be in v1.3.7 ;) But it did establish two important things: Flower’s output/driver behavior is now much less annoying. We can start growing a real string library in Flower itself. That is a good place to be, because the next string work can build outward from a stable driver and an actual library surface instead of piling more special behavior into the compiler."}, {"post_id": 11013, "ts": "2026-06-18T01:18:51Z", "hours": 1.0825, "text": "Devlog: Adding String Indexing to Flower This one was fairly quick, and was about making one very normal-looking thing actually work: name: string = \"Ivy\" as string first: char = name[0] That sounds small, but once string became a real Flower type, indexing could no longer piggyback on the old “arrays and pointers only” behavior. The compiler needed to understand that string[index] is its own case. What changed I taught the typechecker to treat string subscripts as char . That means: string[index] now resolves to char the index expression must be an integer string indexing is readonly for now So this is valid: first: char = name[0] but this is not: name[0] = 'X' I wanted reads first, writes later. That keeps the rules simple while the string representation is still compiler-owned. I’m not sure how writes would work with a C backend, due to how ‘strings’ are allocated. Perhaps a feature for post-v2.0? Lowering it to C Since Flower strings currently lower to a struct with .data and .length , codegen needed a special path for string subscripts. Normal arrays and pointers still lower like: arr [ index ] but strings now lower like: name . data [ index ] That keeps the generated C valid without changing how regular subscripts work elsewhere in the language. So something conceptually like: This checkpoint also forced one strict-but-correct rule that required me to update a WHOLE SINGLE LINE (hehe): arg[i] = tolower(arg[i] as char) to arg[i] = tolower(arg[i] as char) as char Because tolower(...) is effectively treated as returning int , assigning it back into a char subscript needs an explicit cast. I kept that strictness on purpose. I do not want Flower silently narrowing values just because C would let it. Validation I expanded the string example coverage to check: string indexing returns the expected chars string[index] works alongside string <-> @char casts bootstrap still succeeds repeated bootstrap succeeds tests still pass Which, after all the recent bootstrap chaos, was very nice to see. Where this leaves v1.3 Now we can: store strings compare strings print strings inspect length index into them as char This should make it much easier to replace the builtin C functions with a Flower library in the near-near future."}, {"post_id": 10953, "ts": "2026-06-17T23:26:21Z", "hours": 3.3353, "text": "Devlog: Finishing Flower’s String Interop Bridge The last round got string into Flower as a real type. This round was about making that foundation actually work lol. The big problem was that once string became real, plain string literals started living in an in-between state: Flower wanted them to mean “Flower string,” but the compiler’s own source still has plenty of places that really mean “raw C string,” like: RED: @char = \"\\033[0;31m\" if not strcmp(arg, \"help\") or not strcmp(arg, \"h\"): ... end Those cases worked before only because everything was basically pretending string literals were already @char . Once that stopped being true, bootstrap started throwing a fit (my spoiled child). What changed The main fix was to make string literal lowering contextual instead of all-or-nothing. If a literal is being used as a real Flower string , it stays a string . If a literal is being used in a C interop position, it gets lowered as a C string instead. That meant tightening a few compiler rules so this kind of thing works cleanly again: name: string = \"Ivy\" as string raw: @char = name as @char if strcmp(raw, \"Ivy\") == 0: print(name) end I also fixed top-level declarations so globals like: RED: @char = \"\\033[0;31m\" no longer generate nonsense like: char * RED = (( flower_string ){ ... }); which, unsurprisingly, C does not appreciate. The subtle compiler bug The nastiest issue wasn’t even the globals. It was that builtin C calls like strcmp , strncmp , printf , snprintf , and friends are not real Flower functions. That meant the typechecker could hit one of them inside a larger expression, fail early, and stop walking the rest of the tree. So something like: if not strcmp(arg, \"help\") or not strcmp(arg, \"h\"): could partially resolve one side, then leave the other side unprocessed. Very cool. Very stable. Definitely what I wanted. The fix was to add a temporary builtin C-call bridge so the compiler can recognize these calls well enough to keep type resolution and literal lowering consistent during bootstrap. I’m not happy with this fix by any means, but due to the limitations of emitting C, it was the only solution I found that made sense at the time. Tests and examples Once that stopped exploding, I finally wired string testing into the normal types suite instead of leaving it commented out and pretending I’d “get back to it later.” The string tests now cover: string <-> @char casts string equality / inequality .length empty strings printing strings literal use in current interop cases And the full test suite passed with string included as a first-class part of Types on its first try . Now that’s what I like to see :D What this means This does not mean Flower’s long-term answer is “hardcode libc into the compiler forever.” It means Flower now has a temporary interop bridge that keeps self-hosting stable while string is worked on. The actual language semantics stay in Flower; the backend-specific weirdness is just being tolerated for now so progress does not stall. In the near, I’ll probably replace all of the necessary C libs with minimal Flower-equivalents. Where this leaves v1.3 At this point, the string foundation feels much sturdier. Not “done forever,” not backend-agnostic, and definitely not free of cursed bootstrap energy — but it works. The next work is no longer rescue work. It is actual forward work: string operations, stdlib basics, and eventually replacing this temporary C bridge with something cleaner when Flower grows past the C backend."}, {"post_id": 9012, "ts": "2026-06-15T01:03:21Z", "hours": 2.7858, "text": "Devlog: Building Flower’s String Type Foundation The core goal was to make this work in a meaningful, compiler-owned way: name: string = \"Ivy\" as string raw: @char = name as @char other: string = raw as string if name == other: print(\"same\\n\") end print(name.length) That meant Flower needed more than a typedef in generated C. It needed actual type rules, actual lowering rules, and I needed enough hairs on my head to not be bald after the amount of scares that occurred. What changed The first step was giving string real compiler support without going too far too fast. I added support for: explicit casts between string and @char string equality / inequality string.length runtime helpers in generated C for: flower_string_from_cstr(...) flower_string_eq(...) flower_print_string(...) That gave Flower a usable string foundation while still keeping literals conservative for self-hosting. Right now, string literals are not fully “native string values everywhere” yet; the compiler still uses explicit casts like \"Ivy\" as string as the safe bridge. The reason for this “safe bridge” is because when I got too ambitious, the compiler would break since everywhere @char was used with a string literal it’d break due to no implicity being allowed. I had to comment out the following new changes and keep the legacy support so it’d compile: else if ast.kind == AST_STRING_LIT: // fprintf(out, \"flowe_string_from_cst(\") // fprintf(out, \"%.*s\", ast.data._string.str_length, src + ast.data._string.str_start) // fprintf(out, \")\") // LEGACY CODE HERE and else if expr.kind == AST_STRING_LIT: // set_plain_type(out, TOKEN_STRING) // LEGACY CODE HERE return 1 The part that broke The most annoying issue was not string equality or .length . It was print . Originally, non-string print(...) was basically lowered like this: printf ( expr ); That only works when expr is already a C format string. So something like: print(name.length) generated invalid C: printf ( name . length ); The fix was to make print(...) type-aware. Typecheck now records the operand type, and codegen lowers print differently for string , @char , char , floats/doubles, and integer-like values. That sounds small, but it matters a lot: once string became real, print could no longer get away with pretending every printable value was already a C string. An Unsolved Bootstrap Mystery Somehow Flower’s bootstrap process was breaking, and it will probably break again. Despite the bootstrap requiring it to compile itself, somehow afterwords the binary could become corrupted. l-2: ~/Documents/GitHub/FloC % make bootstrap === Building new version === Compiled ./bin/Flower_new.c → ./bin/Flower_new === Testing new compiler === Compiled ./bin/Flower_test.c → ./bin/Flower_test Verified bootstrap build complete l-2: ~/Documents/GitHub/FloC % make bootstrap === Building new version === Luckily, I always make sure to keep a backup Flower bin stored under /bin/Flower_backup so I used that to compile the new binary and then it worked. Where this leaves v1.3 What still remains is the bigger ergonomic question: how fully native string literals should behave, and how to migrate the compiler’s own source to that world without setting bootstrap on fire again. I’m not sure yet how I want to approach this question, or what the goals for it should even be, but I guess I’ll have to find out soon enough! That is the next fight. But at least now, it is a fight on solid ground."}, {"post_id": 8529, "ts": "2026-06-14T05:55:45Z", "hours": 3.8414, "text": "Devlog: Making Bool Real Without Breaking Bootstrap The original goal, asper usual, was straightforward: before moving on to string , Flower needed bool to actually mean something semantically. Up to this point, boolean-ish behavior mostly worked by accident. Comparisons, conditions, returns, and general expression checking were still loose enough that the compiler could get away with treating a lot of things as “close enough,” especially since the C backend ultimately lowers bool to int anyway. That was not going to hold once v1.3 started leaning on richer typing. So this was about drawing a clean line between Flower semantics and C lowering. The Goal In Flower: bool should be its own real type comparisons and logical operators should produce bool arithmetic should not quietly accept bool implicit conversion should stay narrow and predictable explicit casting should remain available through as In C: bool can still lower to int That distinction ended up being the easy part. What Changed The typechecker now treats bool as a proper language type instead of an int-shaped placeholder. Condition checks were tightened so if , while , and not use condition-compatible rules. Arithmetic paths now reject boolean operands, and return / initializer / argument checking now runs through more explicit conversion rules. I also kept implicit widening one-directional: int -> float -> double while leaving narrowing conversions as explicit casts. The actual implementation of booleans and their typing, enforcement, and semantics was a breeze. It’s what came after that got me. What Actually Broke As usual, bootstrap had opinions. The stricter type work exposed older weaknesses that were easy to miss before (This is my coping): function argument checks needed array-to-pointer decay alias and module call lookup paths were too narrow unresolved calls could prevent nested expressions from being fully type-resolved that, in turn, broke some dot-access lowering and caused bad . vs -> emission in generated C So part of this checkpoint turned into compiler stabilization work rather than just bool semantics due to my crappy ‘temporary’ logic, error handling — or lack thereof, and impeccable ability to miss very important details. I’m an amazing programmer, if you couldn’t tell :p Result Flower now has a much firmer semantic base for bool, and the compiler is back to bootstrapping cleanly with those rules in place. That matters because this was really the floor for the next part of v1.3: string . And.. maybe I’ll fix the bootstrap process so it doesn’t blow up in my face again. Oh yea, forgot to mention that. The bootstrapper bootstrapped itself into this very broken parser state that refused to go away so I had to stash my changes, checkout the prior merge (detached), and then recompile manually and fix the parser. Toodles!"}, {"post_id": 6924, "ts": "2026-06-11T16:28:33Z", "hours": 1.3047, "text": "Devlog: Fixing the Typechecker After Bool Enforcement Getting bool into Flower exposed a reallyyyy annoying problem: the typechecker had a couple of tiny logic mistakes (I’m so good at this) which caused the bootstrap to blow up in my face and I ahd no idea why. At first the errors looked unrelated. The compiler started reporting huge numbers of mismatches across main.flo , lexer.flo , module.flo , typecheck.flo , and codegen.flo . I was so confused as to why out of nowhere 903 lines were reporting various typechecking errors when they shouldn’t be. As it turns out, types_match() was the culprit. The function had been inverted in a few places: Mismatched base types and pointer depths were returning success, while normal matching primitive types were falling through to failure. That made the new compiler think ordinary initializers, assignments, comparisons, and returns were all invalid. Once that was fixed, the remaining failures turned out to be a second real compiler bug: pointer arithmetic over arrays was decaying in the wrong direction. Expressions like: mods.modules + j env.structs + env.struct_count arr + 1 should produce pointer types. Instead, the typechecker was reducing pointer depth when arrays decayed, which made perfectly normal indexed access and table walking look type-invalid. So this dev session ended up doing three important things: fixed types_match(...) so actual matches succeed and actual mismatches fail preserved decimal compatibility for float / double matching fixed array-to-pointer decay in pointer arithmetic so compiler internals and examples resolve correctly again What made this especially annoying is that the symptoms looked much larger than the cause. A couple of bad returns in the typechecker created hundreds of downstream errors, and because Flower is self-hosting, that meant the compiler started rejecting its own source. After correcting those core issues, both bootstrap and the example test suite started working again. That is the real value of issues like this: not just “fewer errors,” but restoring (MY) trust in the compiler and its ability to enforce Flower’s rules and report issues. With that stable again, the path forward is much clearer: continue bool work from a solid base, then move on to the remaining numeric and string improvements without the whole compiler collapsing under one bad predicate."}, {"post_id": 6207, "ts": "2026-06-10T12:52:51Z", "hours": 4.0928, "text": "Devlog: Making Flower’s Bool Support Real Enough to Survive Bootstrap The goal sounded small at first: add proper boolean support, while still lowering booleans to integers in C. In practice, this turned into an overarching type-system problem (typical!). Flower had reached a point where bool could not just be a naming trick over 1 and 0 . The compiler itself needed to understand when an expression was semantically boolean, when it was integer, and when older bootstrap-era shortcuts were no longer valid. A lot of those shortcuts had survived because the backend lowers bool to int anyway. But self-hosting exposed a major issue: source-level typing and C lowering are not the same thing. Things like these started breaking: val: int = parser_peek(ps).kind == TOKEN_TRUE and helper predicates that returned comparison expressions from int -typed functions. So the checkpoint became: keep C lowering simple, but make Flower’s typechecker treat booleans as a real source-level type. The main changes were: parser -> typecheck -> codegen true / false now parse into AST_BOOL_LIT bool literals are still emitted as 0 / 1 in C logical and comparison expressions now resolve to bool arithmetic rejects bool operands if , while , and not now validate condition-compatible expressions variable initializers, assignments, and returns now check types more strictly One of the more annoying bugs turned out not to be “about bools” at all. When code like this failed inside the compiler: defined_structs[i].length emitted_imports[i].path the real problem was that for i in 0..count was never registering i in the type environment, so indexed access looked broken when really the loop variable itself had no known type. Once loop indices were typed as int , those field-access failures disappeared (yay!!). The result is a much better place to build from: bool is now semantically distinct in Flower it still lowers cleanly to integer values in generated C bootstrap works again the compiler is stricter without collapsing under its own source That makes the next step much easier: real string support, instead of trying to build strings on top of a type system that still half-thinks everything is an int ."}, {"post_id": 5369, "ts": "2026-06-09T03:37:15Z", "hours": 5.4503, "text": "Devlog: Giving Flower Real Module Support v1.2.x was the point where Flower’s impors had to stop being “you can import stuff.. and there’s a fake layer of security” to a prop er (get it?) module system. Before this work, imports and aliases mostly behaved like naming conveniences. You could write: import \"math.flo\" as math math.add(1, 2) but the compiler was still too loose about what that really meant . Alias names were in emitted C symbol names, top-level declarations were not private, and prop existed more as syntax than as a real feature. That was fine for early bootstrap work, but it was not strong enough for the next stage of the language. So the main goal of v1.2.x became: make imported aliases act like real namespaces make prop define the public interface of a module make top-level declarations private by default lay groundwork for field visibility rules like hidden and readonly Module Semantics Instead of Alias Tricks One of the biggest changes was separating Flower semantics from C lowering. Previously, imported aliases were drifting toward becoming part of emitted symbol identity. A local alias should just be a source-level name bound to a module, not the backend symbol. So now each module has its own lowered symbol prefix, and alias lookup happens semantically during compilation. That means: import \"math.flo\" as math math.add(1, 2) is resolved as “look up exported add in module math.flo ,” not “invent a C symbol from the local alias text as math_add() .” That change also forced a cleanup of emitted names so they stopped leaking absolute filesystem paths. Generated symbols now use project-relative module prefixes instead of machine-specific paths. prop Became Real Another major part of this was making prop actually do something. Instead of treating it as a thin wrapper around only functions, the compiler now recognizes prop as a real top-level export marker. That means the module’s public interface is defined by what it explicitly exports, while non- prop declarations remain internal. This moved Flower closer to the model I wanted all along: explicit modules, explicit public APIs, no heavy object system (OOP), no fake privacy delegated to the C backend. Dot Access, Pointers, and the Annoying Middle Part This work also exposed a weakness in the compiler’s dot-access resolution. Flower source always uses . , while the C backend must decide whether a given access becomes . or -> . That mostly worked already, but nested pointer-heavy field chains exposed cases where the type tracker was not propagating enough information, which caused bad fallback behavior during self-hosting. So before field visibility could be trusted, I had to harden nested dot-access resolution. Not fun, but necessary. As it turns out, I was missing several AST kinds which caused the logic to fall through. Very tedious work, but it was well-worth it in the end! Field Flags Groundwork With module ownership and access resolution in better shape, I added the first field visibility modifiers: hidden readonly frozen Originally I debated having these as bitwise operations, but I decided it’d be best to stay within the current update’s scope, so sometime in the future I’ll refactor. Right now, hidden and readonly are the meaningful additions: hidden blocks external field access readonly blocks external assignment frozen is groundwork for later. It is parsed, stored, and carried through the compiler, but full assignment-once enforcement is still deferred. Unsure how I’ll go about it, but that’s an issue for future me :p"}, {"post_id": 4525, "ts": "2026-06-07T21:22:43Z", "hours": 3.6428, "text": "Devlog: Replacing Flower’s Old Function Syntax with func name(...): type This feature started out as what I thought would be a straightforward syntax cleanup. Flower’s old function syntax looked like this: int add(a: int, b: int): return a + b end and exported functions looked like this: prop int test(): return 1 end It worked, technically, but it had started to annoy me more. The biggest issue was that function declarations did not visually match the direction Flower was already heading in, and instead felt much more C-like than I wanted. prop func create(...): Person func main(): int This style says “this is a function” up front, gives a clean place for modifiers like prop , and keeps the return type attached to the signature rather than awkwardly leading it. The goal was simple: func name(...): type instead of: type name(...): Simple in theory. not so much when the compiler is written in the language being refactored. The Problem Flower’s parser assumes top-level function definitions start with a type. Old parser logic was built around that: int main(): means: parse a type, an identifier, params, and a body That assumption was scattered through a few different places: normal function definitions prop function declarations forward declarations examples and docs the compiler’s own source Now, in retrospect, this was actually one of the easier changes. It didn’t take a whole lot of planning nor brain power, and I was able to change it pretty quickly. Luckily for me, I’ve built codegen to rely purely on ast values rather than shaping. The New Shape The new syntax is: func add(a: int, b: int): int return a + b end and exported functions now look like: prop func test(): int return 1 end This is nicer because: func makes declarations immediately recognizable prop composes more cleanly with func return types now live where people expect them to future syntax has more room to grow without feeling backwards It also feels more in line with Flower’s broader goals: explicit, readable, and not complex. The Refactor Previously, parse_func_def looked for a return type first: type name(...): Now it expects: func name(...): type So the order changed to: expect func parse function name parse parameter list expect : parse return type parse body until end That part was conceptually easy. The more annoying part was updating all the places that assumed if it isn’t a var decl and it looks like a func, it’s a func. That fallback had to go (Good riddance!). Instead, top-level parsing needed to become more explicit: prop func → exported function func → normal function forward func → forward declaration The old one worked, but it relied on vague “anything else is probably a function” rules. The Bootstrap Mistake At one point, I made a bootstrap build so I could use a Flower_new binary to compile the refactored compiler. Unfortunately, I had made a mistake in parse_forward : advancing before peek checks. Feel free to check out the bootstrapper to see why this was an issue ;) This meant my “new compiler to compile the new compiler” was built from a broken parser. The workaround was cursed, but it worked : check out the commit before the refactor fix the bug compile a new binary switch to the refactor branch use the binary to compile the new version Since the compiled binary was ignored by Git, this was actually fairly simple. Not the most elegant bootstrap story, but it got the compiler to, well, compile."}, {"post_id": 3962, "ts": "2026-06-07T03:08:31Z", "hours": 8.2967, "text": "Devlog: Making Flower’s Type Tracking “Enough” for Stdlib / String Work The original motivation was simple and — supposedly — quick; I wanted to move on to v1.1.1 , “stdlib basics,” especially string utilities. But Flower’s current compiler did not really know what types expressions had. It mostly had pointer_depth on declarations, which was enough to generate * in C types and sometimes guess whether field access should become . or -> . That worked for very simple cases: p: @Vector2 = new Vector2 p.x = 5 But it broke down for nested access: outer.inner.value outer.inner_ptr.value The compiler could see the syntax chain, but it did not know whether inner was a value field or pointer field. Since Flower source only uses . , the C backend needs to decide whether each hop becomes . or -> . That meant stdlib work was blocked. If I want something like: if strings.equal(string_a, string_b): print(\"same\\n\") end then Flower needs to understand that string_a.length , string_a.data , etc. are real typed fields, not just random syntax to dump into C. Originally I thought I could just simply create a Symbol Table to get that to work. Unfortunately, that plan soon failed as it introduced a mariad of issues relating to the import system. At the time, this frustrated me because I knew the import system sucked, but I didn’t want to fix it until a later version. Eventually, I settled on a specific plan which did actually end up changing how imports are handled.. kinda. The Plan The design I landed on was to add a typecheck/type-tracking stage between parsing and codegen: lexer -> parser -> typecheck -> codegen The parser should stay mostly syntax-only. It builds AST nodes like “dot access,” so I didn’t really change it. The typecheck pass now collects declarations into a TypeEnv : struct TypeEnv { structs: StructInfo[1024], struct_count: int, vars: VarInfo[8192], var_count: int, funcs: FuncInfo[8192], func_count: int, error_count: int } Then it walks expressions and annotates dot access nodes with an access kind: ACCESS_UNKNOWN: int = 0 ACCESS_DOT: int = 1 ACCESS_ARROW: int = 2 So codegen no longer has to fully guess. It can do: if ast.data._dot_access.access_kind == ACCESS_ARROW: fprintf(out, \"->%.*s\", ...) else if ast.data._dot_access.access_kind == ACCESS_DOT: fprintf(out, \".%.*s\", ...) else: // fallback end That fallback is important because Flower is self-hosted-ish right now. The compiler is written in Flower, and the compiler’s own source code is full of field access. If the new typechecker is too strict too early, it breaks the compiler while trying to compile the compiler. Very elegant. Very cursed. Just how I like it ;) Import-Aware Type Tracking At first, typechecking only saw the main file, so I added a module loading pass. Instead of codegen discovering and parsing imports late, the compiler now loads modules earlier: load main module load imports recursively collect declarations from all modules typecheck all modules codegen all modules That required a new module structure: struct Module { path: @char, src: @char, tokens: @TokenStream, ast: @AST } struct ModuleSet { modules: Module[128], count: int } Unfortunately, it didn’t go as smoothly as I wanted. Near the end when I was sure everything would work, I ran into an Idempotency failure due to the new handling of system imports. I.. just manually passed it :p"}]...
|
Title: Flower by @IvyMycelia | Stardance
Devlogs: Title: Flower by @IvyMycelia | Stardance
Devlogs:
Devlog: Making Flower’s Type Tracking “Enough” for Stdlib / String Work The original motivation was simple and — supposedly — quick; I wanted to move on to v1.1.1 , “stdlib basics,” especially string utilities. But Flower’s current compiler did not really know what types expressions had. It mostly had pointer_depth on declarations, which was enough to generate * in C types and sometimes guess whether field access should become . or -> . That worked for very simple cases: p: @Vector2 = new Vector2 p.x = 5 But it broke down for nested access: outer.inner.value outer.inner_ptr.value The compiler could see the syntax chain, but it did not know whether inner was a value field or pointer field. Since Flower source only uses . , the C backend needs to decide whether each hop becomes . or -> . That meant stdlib work was blocked. If I want something like: if strings.equal(string_a, string_b): print("same\n") end then Flower needs to understand that string_a.length , string_a.data , etc. are real typed fields, not just random syntax to dump into C. Originally I thought I could just simply create a Symbol Table to get that to work. Unfortunately, that plan soon failed as it introduced a mariad of issues relating to the import system. At the time, this frustrated me because I knew the import system sucked, but I didn’t want to fix it until a later version. Eventually, I settled on a specific plan which did actually end up changing how imports are handled.. kinda. The Plan The design I landed on was to add a typecheck/type-tracking stage between parsing and codegen: lexer -> parser -> typecheck -> codegen The parser should stay mostly syntax-only. It builds AST nodes like “dot access,” so I didn’t really change it. The typecheck pass now collects declarations into a TypeEnv : struct TypeEnv { structs: StructInfo[1024], struct_count: int, vars: VarInfo[8192], var_count: int, funcs: FuncInfo[8192], func_count: int, error_count: int } Then it walks expressions and annotates dot access nodes with an access kind: ACCESS_UNKNOWN: int = 0 ACCESS_DOT: int = 1 ACCESS_ARROW: int = 2 So codegen no longer has to fully guess. It can do: if ast.data._dot_access.access_kind == ACCESS_ARROW: fprintf(out, "->%.*s", ...) else if ast.data._dot_access.access_kind == ACCESS_DOT: fprintf(out, ".%.*s", ...) else: // fallback end That fallback is important because Flower is self-hosted-ish right now. The compiler is written in Flower, and the compiler’s own source code is full of field access. If the new typechecker is too strict too early, it breaks the compiler while trying to compile the compiler. Very elegant. Very cursed. Just how I like it ;) Import-Aware Type Tracking At first, typechecking only saw the main file, so I added a module loading pass. Instead of codegen discovering and parsing imports late, the compiler now loads modules earlier: load main module load imports recursively collect declarations from all modules typecheck all modules codegen all modules That required a new module structure: struct Module { path: @char, src: @char, tokens: @TokenStream, ast: @AST } struct ModuleSet { modules: Module[128], count: int } Unfortunately, it didn’t go as smoothly as I wanted. Near the end when I was sure everything would work, I ran into an Idempotency failure due to the new handling of system imports. I.. just manually passed it :p
Devlog: Replacing Flower’s Old Function Syntax with func name(...): type This feature started out as what I thought would be a straightforward syntax cleanup. Flower’s old function syntax looked like this: int add(a: int, b: int): return a + b end and exported functions looked like this: prop int test(): return 1 end It worked, technically, but it had started to annoy me more. The biggest issue was that function declarations did not visually match the direction Flower was already heading in, and instead felt much more C-like than I wanted. prop func create(...): Person func main(): int This style says “this is a function” up front, gives a clean place for modifiers like prop , and keeps the return type attached to the signature rather than awkwardly leading it. The goal was simple: func name(...): type instead of: type name(...): Simple in theory. not so much when the compiler is written in the language being refactored. The Problem Flower’s parser assumes top-level function definitions start with a type. Old parser logic was built around that: int main(): means: parse a type, an identifier, params, and a body That assumption was scattered through a few different places: normal function definitions prop function declarations forward declarations examples and docs the compiler’s own source Now, in retrospect, this was actually one of the easier changes. It didn’t take a whole lot of planning nor brain power, and I was able to change it pretty quickly. Luckily for me, I’ve built codegen to rely purely on ast values rather than shaping. The New Shape The new syntax is: func add(a: int, b: int): int return a + b end and exported functions now look like: prop func test(): int return 1 end This is nicer because: func makes declarations immediately recognizable prop composes more cleanly with func return types now live where people expect them to future syntax has more room to grow without feeling backwards It also feels more in line with Flower’s broader goals: explicit, readable, and not complex. The Refactor Previously, parse_func_def looked for a return type first: type name(...): Now it expects: func name(...): type So the order changed to: expect func parse function name parse parameter list expect : parse return type parse body until end That part was conceptually easy. The more annoying part was updating all the places that assumed if it isn’t a var decl and it looks like a func, it’s a func. That fallback had to go (Good riddance!). Instead, top-level parsing needed to become more explicit: prop func → exported function func → normal function forward func → forward declaration The old one worked, but it relied on vague “anything else is probably a function” rules. The Bootstrap Mistake At one point, I made a bootstrap build so I could use a Flower_new binary to compile the refactored compiler. Unfortunately, I had made a mistake in parse_forward : advancing before peek checks. Feel free to check out the bootstrapper to see why this was an issue ;) This meant my “new compiler to compile the new compiler” was built from a broken parser. The workaround was cursed, but it worked : check out the commit before the refactor fix the bug compile a new binary switch to the refactor branch use the binary to compile the new version Since the compiled binary was ignored by Git, this was actually fairly simple. Not the most elegant bootstrap story, but it got the compiler to, well, compile.
Devlog: Giving Flower Real Module Support v1.2.x was the point where Flower’s impors had to stop being “you can import stuff.. and there’s a fake layer of security” to a prop er (get it?) module system. Before this work, imports and aliases mostly behaved like naming conveniences. You could write: import "math.flo" as math math.add(1, 2) but the compiler was still too loose about what that really meant . Alias names were in emitted C symbol names, top-level declarations were not private, and prop existed more as syntax than as a real feature. That was fine for early bootstrap work, but it was not strong enough for the next stage of the language. So the main goal of v1.2.x became: make imported aliases act like real namespaces make prop define the public interface of a module make top-level declarations private by default lay groundwork for field visibility rules like hidden and readonly Module Semantics Instead of Alias Tricks One of the biggest changes was separating Flower semantics from C lowering. Previously, imported aliases were drifting toward becoming part of emitted symbol identity. A local alias should just be a source-level name bound to a module, not the backend symbol. So now each module has its own lowered symbol prefix, and alias lookup happens semantically during compilation. That means: import "math.flo" as math math.add(1, 2) is resolved as “look up exported add in module math.flo ,” not “invent a C symbol from the local alias text as math_add() .” That change also forced a cleanup of emitted names so they stopped leaking absolute filesystem paths. Generated symbols now use project-relative module prefixes instead of machine-specific paths. prop Became Real Another major part of this was making prop actually do something. Instead of treating it as a thin wrapper around only functions, the compiler now recognizes prop as a real top-level export marker. That means the module’s public interface is defined by what it explicitly exports, while non- prop declarations remain internal. This moved Flower closer to the model I wanted all along: explicit modules, explicit public APIs, no heavy object system (OOP), no fake privacy delegated to the C backend. Dot Access, Pointers, and the Annoying Middle Part This work also exposed a weakness in the compiler’s dot-access resolution. Flower source always uses . , while the C backend must decide whether a given access becomes . or -> . That mostly worked already, but nested pointer-heavy field chains exposed cases where the type tracker was not propagating enough information, which caused bad fallback behavior during self-hosting. So before field visibility could be trusted, I had to harden nested dot-access resolution. Not fun, but necessary. As it turns out, I was missing several AST kinds which caused the logic to fall through. Very tedious work, but it was well-worth it in the end! Field Flags Groundwork With module ownership and access resolution in better shape, I added the first field visibility modifiers: hidden readonly frozen Originally I debated having these as bitwise operations, but I decided it’d be best to stay within the current update’s scope, so sometime in the future I’ll refactor. Right now, hidden and readonly are the meaningful additions: hidden blocks external field access readonly blocks external assignment frozen is groundwork for later. It is parsed, stored, and carried through the compiler, but full assignment-once enforcement is still deferred. Unsure how I’ll go about it, but that’s an issue for future me :p
Devlog: Making Flower’s Bool Support Real Enough to Survive Bootstrap The goal sounded small at first: add proper boolean support, while still lowering booleans to integers in C. In practice, this turned into an overarching type-system problem (typical!). Flower had reached a point where bool could not just be a naming trick over 1 and 0 . The compiler itself needed to understand when an expression was semantically boolean, when it was integer, and when older bootstrap-era shortcuts were no longer valid. A lot of those shortcuts had survived because the backend lowers bool to int anyway. But self-hosting exposed a major issue: source-level typing and C lowering are not the same thing. Things like these started breaking: val: int = parser_peek(ps).kind == TOKEN_TRUE and helper predicates that returned comparison expressions from int -typed functions. So the checkpoint became: keep C lowering simple, but make Flower’s typechecker treat booleans as a real source-level type. The main changes were: parser -> typecheck -> codegen true / false now parse into AST_BOOL_LIT bool literals are still emitted as 0 / 1 in C logical and comparison expressions now resolve to bool arithmetic rejects bool operands if , while , and not now validate condition-compatible expressions variable initializers, assignments, and returns now check types more strictly One of the more annoying bugs turned out not to be “about bools” at all. When code like this failed inside the compiler: defined_structs[i].length emitted_imports[i].path the real problem was that for i in 0..count was never registering i in the type environment, so indexed access looked broken when really the loop variable itself had no known type. Once loop indices were typed as int , those field-access failures disappeared (yay!!). The result is a much better place to build from: bool is now semantically distinct in Flower it still lowers cleanly to integer values in generated C bootstrap works again the compiler is stricter without collapsing under its own source That makes the next step much easier: real string support, instead of trying to build strings on top of a type system that still half-thinks everything is an int .
Devlog: Fixing the Typechecker After Bool Enforcement Getting bool into Flower exposed a reallyyyy annoying problem: the typechecker had a couple of tiny logic mistakes (I’m so good at this) which caused the bootstrap to blow up in my face and I ahd no idea why. At first the errors looked unrelated. The compiler started reporting huge numbers of mismatches across main.flo , lexer.flo , module.flo , typecheck.flo , and codegen.flo . I was so confused as to why out of nowhere 903 lines were reporting various typechecking errors when they shouldn’t be. As it turns out, types_match() was the culprit. The function had been inverted in a few places: Mismatched base types and pointer depths were returning success, while normal matching primitive types were falling through to failure. That made the new compiler think ordinary initializers, assignments, comparisons, and returns were all invalid. Once that was fixed, the remaining failures turned out to be a second real compiler bug: pointer arithmetic over arrays was decaying in the wrong direction. Expressions like: mods.modules + j env.structs + env.struct_count arr + 1 should produce pointer types. Instead, the typechecker was reducing pointer depth when arrays decayed, which made perfectly normal indexed access and table walking look type-invalid. So this dev session ended up doing three important things: fixed types_match(...) so actual matches succeed and actual mismatches fail preserved decimal compatibility for float / double matching fixed array-to-pointer decay in pointer arithmetic so compiler internals and examples resolve correctly again What made this especially annoying is that the symptoms looked much larger than the cause. A couple of bad returns in the typechecker created hundreds of downstream errors, and because Flower is self-hosting, that meant the compiler started rejecting its own source. After correcting those core issues, both bootstrap and the example test suite started working again. That is the real value of issues like this: not just “fewer errors,” but restoring (MY) trust in the compiler and its ability to enforce Flower’s rules and report issues. With that stable again, the path forward is much clearer: continue bool work from a solid base, then move on to the remaining numeric and string improvements without the whole compiler collapsing under one bad predicate.
Devlog: Making Bool Real Without Breaking Bootstrap The original goal, asper usual, was straightforward: before moving on to string , Flower needed bool to actually mean something semantically. Up to this point, boolean-ish behavior mostly worked by accident. Comparisons, conditions, returns, and general expression checking were still loose enough that the compiler could get away with treating a lot of things as “close enough,” especially since the C backend ultimately lowers bool to int anyway. That was not going to hold once v1.3 started leaning on richer typing. So this was about drawing a clean line between Flower semantics and C lowering. The Goal In Flower: bool should be its own real type comparisons and logical operators should produce bool arithmetic should not quietly accept bool implicit conversion should stay narrow and predictable explicit casting should remain available through as In C: bool can still lower to int That distinction ended up being the easy part. What Changed The typechecker now treats bool as a proper language type instead of an int-shaped placeholder. Condition checks were tightened so if , while , and not use condition-compatible rules. Arithmetic paths now reject boolean operands, and return / initializer / argument checking now runs through more explicit conversion rules. I also kept implicit widening one-directional: int -> float -> double while leaving narrowing conversions as explicit casts. The actual implementation of booleans and their typing, enforcement, and semantics was a breeze. It’s what came after that got me. What Actually Broke As usual, bootstrap had opinions. The stricter type work exposed older weaknesses that were easy to miss before (This is my coping): function argument checks needed array-to-pointer decay alias and module call lookup paths were too narrow unresolved calls could prevent nested expressions from being fully type-resolved that, in turn, broke some dot-access lowering and caused bad . vs -> emission in generated C So part of this checkpoint turned into compiler stabilization work rather than just bool semantics due to my crappy ‘temporary’ logic, error handling — or lack thereof, and impeccable ability to miss very important details. I’m an amazing programmer, if you couldn’t tell :p Result Flower now has a much firmer semantic base for bool, and the compiler is back to bootstrapping cleanly with those rules in place. That matters because this was really the floor for the next part of v1.3: string . And.. maybe I’ll fix the bootstrap process so it doesn’t blow up in my face again. Oh yea, forgot to mention that. The bootstrapper bootstrapped itself into this very broken parser state that refused to go away so I had to stash my changes, checkout the prior merge (detached), and then recompile manually and fix the parser. Toodles!
Devlog: Building Flower’s String Type Foundation The core goal was to make this work in a meaningful, compiler-owned way: name: string = "Ivy" as string raw: @char = name as @char other: string = raw as string if name == other: print("same\n") end print(name.length) That meant Flower needed more than a typedef in generated C. It needed actual type rules, actual lowering rules, and I needed enough hairs on my head to not be bald after the amount of scares that occurred. What changed The first step was giving string real compiler support without going too far too fast. I added support for: explicit casts between string and @char string equality / inequality string.length runtime helpers in generated C for: flower_string_from_cstr(...) flower_string_eq(...) flower_print_string(...) That gave Flower a usable string foundation while still keeping literals conservative for self-hosting. Right now, string literals are not fully “native string values everywhere” yet; the compiler still uses explicit casts like "Ivy" as string as the safe bridge. The reason for this “safe bridge” is because when I got too ambitious, the compiler would break since everywhere @char was used with a string literal it’d break due to no implicity being allowed. I had to comment out the following new changes and keep the legacy support so it’d compile: else if ast.kind == AST_STRING_LIT: // fprintf(out, "flowe_string_from_cst(") // fprintf(out, "%.*s", ast.data._string.str_length, src + ast.data._string.str_start) // fprintf(out, ")") // LEGACY CODE HERE and else if expr.kind == AST_STRING_LIT: // set_plain_type(out, TOKEN_STRING) // LEGACY CODE HERE return 1 The part that broke The most annoying issue was not string equality or .length . It was print . Originally, non-string print(...) was basically lowered like this: printf ( expr ); That only works when expr is already a C format string. So something like: print(name.length) generated invalid C: printf ( name . length ); The fix was to make print(...) type-aware. Typecheck now records the operand type, and codegen lowers print differently for string , @char , char , floats/doubles, and integer-like values. That sounds small, but it matters a lot: once string became real, print could no longer get away with pretending every printable value was already a C string. An Unsolved Bootstrap Mystery Somehow Flower’s bootstrap process was breaking, and it will probably break again. Despite the bootstrap requiring it to compile itself, somehow afterwords the binary could become corrupted. l-2: ~/Documents/GitHub/FloC % make bootstrap === Building new version === Compiled ./bin/Flower_new.c → ./bin/Flower_new === Testing new compiler === Compiled ./bin/Flower_test.c → ./bin/Flower_test Verified bootstrap build complete l-2: ~/Documents/GitHub/FloC % make bootstrap === Building new version === Luckily, I always make sure to keep a backup Flower bin stored under /bin/Flower_backup so I used that to compile the new binary and then it worked. Where this leaves v1.3 What still remains is the bigger ergonomic question: how fully native string literals should behave, and how to migrate the compiler’s own source to that world without setting bootstrap on fire again. I’m not sure yet how I want to approach this question, or what the goals for it should even be, but I guess I’ll have to find out soon enough! That is the next fight. But at least now, it is a fight on solid ground.
Devlog: Finishing Flower’s String Interop Bridge The last round got string into Flower as a real type. This round was about making that foundation actually work lol. The big problem was that once string became real, plain string literals started living in an in-between state: Flower wanted them to mean “Flower string,” but the compiler’s own source still has plenty of places that really mean “raw C string,” like: RED: @char = "\033[0;31m" if not strcmp(arg, "help") or not strcmp(arg, "h"): ... end Those cases worked before only because everything was basically pretending string literals were already @char . Once that stopped being true, bootstrap started throwing a fit (my spoiled child). What changed The main fix was to make string literal lowering contextual instead of all-or-nothing. If a literal is being used as a real Flower string , it stays a string . If a literal is being used in a C interop position, it gets lowered as a C string instead. That meant tightening a few compiler rules so this kind of thing works cleanly again: name: string = "Ivy" as string raw: @char = name as @char if strcmp(raw, "Ivy") == 0: print(name) end I also fixed top-level declarations so globals like: RED: @char = "\033[0;31m" no longer generate nonsense like: char * RED = (( flower_string ){ ... }); which, unsurprisingly, C does not appreciate. The subtle compiler bug The nastiest issue wasn’t even the globals. It was that builtin C calls like strcmp , strncmp , printf , snprintf , and friends are not real Flower functions. That meant the typechecker could hit one of them inside a larger expression, fail early, and stop walking the rest of the tree. So something like: if not strcmp(arg, "help") or not strcmp(arg, "h"): could partially resolve one side, then leave the other side unprocessed. Very cool. Very stable. Definitely what I wanted. The fix was to add a temporary builtin C-call bridge so the compiler can recognize these calls well enough to keep type resolution and literal lowering consistent during bootstrap. I’m not happy with this fix by any means, but due to the limitations of emitting C, it was the only solution I found that made sense at the time. Tests and examples Once that stopped exploding, I finally wired string testing into the normal types suite instead of leaving it commented out and pretending I’d “get back to it later.” The string tests now cover: string <-> @char casts string equality / inequality .length empty strings printing strings literal use in current interop cases And the full test suite passed with string included as a first-class part of Types on its first try . Now that’s what I like to see :D What this means This does not mean Flower’s long-term answer is “hardcode libc into the compiler forever.” It means Flower now has a temporary interop bridge that keeps self-hosting stable while string is worked on. The actual language semantics stay in Flower; the backend-specific weirdness is just being tolerated for now so progress does not stall. In the near, I’ll probably replace all of the necessary C libs with minimal Flower-equivalents. Where this leaves v1.3 At this point, the string foundation feels much sturdier. Not “done forever,” not backend-agnostic, and definitely not free of cursed bootstrap energy — but it works. The next work is no longer rescue work. It is actual forward work: string operations, stdlib basics, and eventually replacing this temporary C bridge with something cleaner when Flower grows past the C backend.
Devlog: Adding String Indexing to Flower This one was fairly quick, and was about making one very normal-looking thing actually work: name: string = "Ivy" as string first: char = name[0] That sounds small, but once string became a real Flower type, indexing could no longer piggyback on the old “arrays and pointers only” behavior. The compiler needed to understand that string[index] is its own case. What changed I taught the typechecker to treat string subscripts as char . That means: string[index] now resolves to char the index expression must be an integer string indexing is readonly for now So this is valid: first: char = name[0] but this is not: name[0] = 'X' I wanted reads first, writes later. That keeps the rules simple while the string representation is still compiler-owned. I’m not sure how writes would work with a C backend, due to how ‘strings’ are allocated. Perhaps a feature for post-v2.0? Lowering it to C Since Flower strings currently lower to a struct with .data and .length , codegen needed a special path for string subscripts. Normal arrays and pointers still lower like: arr [ index ] but strings now lower like: name . data [ index ] That keeps the generated C valid without changing how regular subscripts work elsewhere in the language. So something conceptually like: This checkpoint also forced one strict-but-correct rule that required me to update a WHOLE SINGLE LINE (hehe): arg[i] = tolower(arg[i] as char) to arg[i] = tolower(arg[i] as char) as char Because tolower(...) is effectively treated as returning int , assigning it back into a char subscript needs an explicit cast. I kept that strictness on purpose. I do not want Flower silently narrowing values just because C would let it. Validation I expanded the string example coverage to check: string indexing returns the expected chars string[index] works alongside string <-> @char casts bootstrap still succeeds repeated bootstrap succeeds tests still pass Which, after all the recent bootstrap chaos, was very nice to see. Where this leaves v1.3 Now we can: store strings compare strings print strings inspect length index into them as char This should make it much easier to replace the builtin C functions with a Flower library in the near-near future.
Devlog: Fixing Flower’s Output Driver and Starting the String Stdlib This checkpoint was really two different kinds of progress that ended up helping each other a lot. The first part was not glamorous, but it was necessary: Flower’s compile driver was tripping over its own default output naming. This was a known issue that I had been putting off, but for some reason it really annoyed me this time so I decided enough and to fix it. If no explicit output path was provided, the compiler would generate output.c , then strip the .c and try to emit a binary named output . That worked fine right up until the repo itself already had an output/ directory. At that point, linking failed because the compiler was trying to create a file where a directory already existed. Worse — because it annoyed me more — the driver logic was also mixing up “the generated program exited non-zero” with “compilation failed.” That became especially annoying during bootstrap, because the generated compiler binary would run without CLI arguments, print its own usage error, and then cause bootstrap to report failure even though codegen and C compilation had both succeeded. So I finally got off my butt and cleaned that up. Driver Cleanup The default output path now goes to: output/out.c which naturally produces: output/out as the binary. That avoids the old output filename collision. I also separated compile success from auto-run behavior: explicit output path: compile only default output path: compile, then auto-run if appropriate That means bootstrap no longer “fails” just because the compiled compiler exits non-zero with missing arguments, and demo/test files can still run automatically when that is actually useful. This sounds like a small driver fix, but honestly it removed a lot of noise from string work — and more — immediately. String Stdlib Beginnings Once that output weirdness was under control, I could finish doing what I just started and actually wanted: making string behavior live in Flower instead of endlessly leaning on ad hoc C calls (Call back to last devlog, absolute ball knowledge!!). So I added the first real reusable helpers in src/stdlib/string.flo : is_empty(s) starts_with(s, prefix) ends_with(s, suffix) find_char(s, ch) These are intentionally simple. They mostly exist to prove that the current string support is now strong enough for normal library code to be written on top of it. Not incredibly useful, at least at the level the compiler needs, but at least I could translate some AP Comp Sci A into Flower hehe A string feature does not really feel “real” until I can build helpers with the language itself instead of only teaching the compiler more special cases. The day I remove the builtin C handlers is the day I’m at peace… Validation To exercise that new library surface, I changed string_pass.flo to now act as a small pass file for the experimental library. Its job is not to be impressive. Its job is to answer a more important question: can I import string helpers, call them from normal Flower code, and get expected results through the full compile pipeline? At this point, yes. Where this leaves things This checkpoint did not remove all C string dependencies from the compiler. In fact, it removed essentially none! That is still a separate step, one that may even be in v1.3.7 ;) But it did establish two important things: Flower’s output/driver behavior is now much less annoying. We can start growing a real string library in Flower itself. That is a good place to be, because the next string work can build outward from a stable driver and an actual library surface instead of piling more special behavior into the compiler.
Devlog: Giving Flower an Internal cstr Foundation Even after Flower got a real string type, the compiler itself was still leaning directly on C-style string helpers for its own internal work. That meant a lot of Flower source was still semantically depending on libc behavior: !strncmp(...) strcmp(...) strlen(...) strcpy(...) strncpy(...) strdup(...) strrchr(...) That is not where I want the language to stay. What changed I added a new internal module: import "src/stdlib/cstr.flo" as cstr and gave it compiler-facing helpers like: prop func len(s: @char): int prop func eq(a: @char, b: @char): bool prop func eq_n(a: @char, b: @char, n: int): bool prop func copy(dst: @char, src: @char): @char prop func copy_n(dst: @char, src: @char, n: int): @char prop func dup(src: @char): @char prop func find_last(src: @char, ch: char): @char This helper module is essentially the precursor to a future strings.flo library that can be distributed. But for now, it uses a basic API layer purely meant for in-house usage. Then I migrated compiler internals over to that module across: src/parser.flo src/module.flo src/lexer.flo src/typecheck.flo src/codegen.flo src/globals.flo src/main.flo So instead of using C-string behavior directly everywhere, the compiler now goes through Flower-owned helpers first. The Compiler Strikes Back This was one of those changes that sounds mechanical until it absolutely is not. A big trap was that old code often relied on C comparison functions returning 0 on equality, so patterns looked like this: not strncmp(...) But cstr.eq_n(...) returns an actual bool , which means blindly rewriting those calls gives inverted logic. So this: if ps.alias_lengths[i] == tok.length and not cstr.eq_n(...): was completely wrong. It had to become: if ps.alias_lengths[i] == tok.length and cstr.eq_n(...): That bug showed up in alias parsing first, which made it especially cursed, because it caused normal namespace-style calls like cstr.eq(...) to stop parsing correctly and crash the bootstrap path in confusing ways. I spent way longer than I wish to admit on trying to figure out why it wasn’t playing nice. But, once I figured it out, it was a really quick fix (I literally just cmd + f ’d not cstr and replaced it with cstr lol). Are we done yet..? This does not mean Flower is free from the C backend yet. It does mean something important, though: compiler logic is starting to depend on Flower-defined helper semantics instead of scattered raw libc calls. That is a much better stage for the future backend story, because when C eventually stops being the primary lowering target, the compiler will already have more of its own vocabulary. In other words, this was less about “remove C” and more about “stop letting C define the language’s internal habits.” Nah just kidding, I really wanted that bloated “builtin_c_call” stuff gone. Unfortunately I only managed to skim it, but that’s closer than before! Result After fixing the migration mistakes and the alias/parser fallout, the compiler bootstrapped successfully again. Flower now has an internal cstr layer, and compiler string handling is a little more its own.
Devlog: Cleaning Up v1.3 For Release After many hours of work, bool and `string finally became real, and it was time to cleanup the mess I left behind from the version’s development. Mainly the only thing worked on was some cleanup: roadmap now reflects actual v1.3 features and implementations updated README and contribution documents to match the current compiler pipeline cleaned up string examples so they have the full intended v1.3 style instead of some leftover testing usage pushed the compiler’s version to 1.3.0 updated help / usage text so it matches the new output-path and auto-run behavior Prior to this, if I had just merged and shipped, the release wouldv’e been messy: README, Contributing, example files, and guidance commands were all mixing older details which made it confusing — even for me — when trying to explore the language and what it has to offer. For a bootstrapped compiler especially, making sure everything is cleaned up and polished is something that should not be ignored. I’m definitely guilty of overlooking this, but I’ve outlayed a whole plan for v1.3 unlike past versions, and part of it was setting up a proper versioning system and polishing its release as it goes. This format will be adopted in future versions, since it’s just way cleaner and nicer to look at. Future work At this point, v1.3 is done and has implemented, at minimum, a concrete foundation for post-v2 bools and strings. Next will likely be more subtle improvements, and features that are currently reliant explicitly on C rather than Flower-hosted code. In order for v2.0 , Flower will have to be effectively independent from C if it wants to emit machine code. Currently I am planning on adding features such as Type Aliases and maybe a stdlib prior to that, but anything can change!! Thanks for being here for all of v1.3 <3
Devlog: Making Flower’s Type Aliases Transparent This version was simple to develop on paper (and even in practice it wasn’t too bad, only around 4 or so hours!): type Count = int type Total = Count type Name = string and then have those aliases behave like the real type everywhere: n: Count = 12 total: Total = identity(n) name: Name = "Ivy" if name != "Ivy": return false end if name.length != 3: return false end That meant aliases could not just be parsed and stored, but rather had to be transparent to the compiler’s semantic checks. What changed I added type alias declarations to the AST, parser, and type environment, then added the ability to resolve aliases in typechecking before comparing types. That included: return type checks variable initializers function call arguments binary comparisons string-specific comparison logic struct field access The important rule here is that aliases are semantic, not codegen-facing. Count should behave as int , Name should behave as string , and chained aliases like Total -> Count -> int should collapse correctly. In the future, especially post v2.0 , this could change and custom types might become real — but for now, they’re just aliases. The bug that exploded bootstrap The first real failure was not in aliases themselves, but in function argument checking. Inside check_call_args(...) , the compiler was resolving the argument expression into expected_type instead of arg_type . That overwrote the parameter type, left the actual argument type uninitialized, and caused the second bootstrap stage to explode into over a thousand misleading errors. This was not a pre-existing issue, it was instead from human error (my error) during the initial implementation where I accidentally put the wrong variable. Once that was fixed, the remaining failures were much more helpful than the bright flash of red and “Typecheck failed with 1224 error(s)” message! Where this leaves v1.4 With the first step toward “better types” done, aliases are no longer just syntax. That gives v1.4 a solid base for whatever comes next in the type system without having to fake around raw names. During this whole dev session, I did discover that a whole lot more of the source code was left using legacy work-arounds: int instead of bool , name_start; name_length and @char instead of string . In all fairness, some of these aren’t exactly the easiest to refactor. However, I will probably hold off on refactoring the codebase until either right before v2.0 , or right after. Just know it’s on my radar ;)
Devlog: Fixing Flower’s Compiler Process So It Stops Fighting the Host This wasn’t really about language design at all buttttt it is much more embarrassing , AND more important: Flower’s compiler process itself was too fragile. The immediate issue showed up on Linux, specifically NixOS (thanks shipwrights <3). The build flow was assuming too much: a previously existing bin/Flower could be reused safely bash would exist at the expected path clang would always be available the checked-in compiler binary would be runnable on whatever machine the repo landed on That worked well enough on my machine until it didn’t. On NixOS — and by extension probably any other machine without the prexisting binaries I had — it broke: make targets were inconsistent, the shell script failed on interpreter assumptions, and the compiler binary itself could be the wrong format for the host. What changed The fix was to separate “the compiler source exists” from “the current compiler binary is usable on this machine.” The build process now starts by compiling a fresh host-native bootstrap compiler from bin/Flower.c , instead of trusting whatever happens to already exist in bin/Flower . That means the flow is now: bin/Flower.c -> host-native bootstrap compiler -> new Flower compiler -> self-check instead of: maybe existing bin/Flower -> hopefully works -> maybe bootstrap Ok well that’s kinda a lie; it still relies on hopes and dreams to bootstrap sometimes. BUT it’s MUCH safer! And now everyone gets to experience crippling bootstrap anxiety, instead of being met with a failure before the actual compiler gets to.. well, do its thign! I also cleaned up the surrounding tooling: switched the bootstrap script to portable sh restored a clearer build / bootstrap / rebuild / test / clean structure made the compiler use CC and CFLAGS from the environment instead of hardcoding clang What this actually improves Flower is still not universally cross-platform yet. The compiler driver still has POSIX-shaped assumptions in places, and the emitted C can still depend on host APIs depending on what the program uses. I’m not yet at the point of wanting to make it completely universal, especially given how I’m only one person and with v2.0 coming up soon it’d — in my humblest of opinions — be a waste of time. I am honestly grateful for people reviewing my code and otherwise viewing it catching onto details I have overlooked. My goal is to not make a ‘just-barely working on my machine’ project; I enjoy sharing development with others, and it hurts knowing people can’t appreciate code, whether it be mine or others’, due to something as simple as hard-coded sh flags.
Devlog: Formalizing Flower’s Null Foundation Flower already had some of the pieces for null , but they were a bit scattered. The goal here was to make it explicit, consistent, and safe before moving on to nullable syntax like ?T or full union-based nullability later in v1.4 . Another shorter devlog, but still important and distinct enough for me to think “Hmm devlog time? Yes, devlog time!” What changed The main work was in typechecking. I added to the compiler’s idea of what null is, how it is represented internally, and what kinds of values are actually allowed to accept it. Rather than letting null-related behavior stay implicit across a few checks, null now follows a clearer rule set: null has one centralized internal type representation pointer-like values can explicitly accept null null comparisons and assignments now go through the same semantic path Why this matters This isn’t all that important on its own, but it matters a lot for where Flower is going next. If null is not defined well, then later features like: ?T better unions smarter narrowing more expressive type flow all become more error-prone (or so I assume given my track record) than I want need them to be. Validation I also expanded the example coverage so null : it now has dedicated behavior checks around assignment, passing values around, and comparison behavior.
Devlog: Adding Pointer-First Nullable Types to Flower I worked on giving Flower its first real nullable type surface without being overambitious and pretending the compiler is ready for full optional-everything semantics yet. The new syntax now works like this: ptr: ?@int = null text: ?@char = null That means there is now an explicit way to say “this pointer-like value may be absent,” instead of relying entirely on raw pointer habits from C (If you couldn’t tell by now, I despise C). What changed The main work was split across lexer, parser, and typecheck. I added: ? as a type marker in type positions is_nullable tracking in TypeInfo type rules for nullable pointer/reference values explicit compatibility for: assigning null into nullable pointer-like types comparing nullable values against null casting between @T and ?@T I also kept the scope intentionally narrow: this implementation is pointer-first nullable support , not full nullable scalars. So ?@int makes sense right now, but ?int is still deferred until I make a better semantic union / optional representation for plain values. Why this matters It would have been easy to overreach here and claim “nullable types are done,” but that would have been a big phat lie. Pointer-like nullability lowers naturally enough with the current backend and current compiler model. Scalar nullability, however, does not. Once you let int or bool become nullable, you need a more real representation for “has value / no value,” and that belongs in the later union work, not here. Result explicit absence compiler-owned semantics better future unions stronger type meaning without hidden magic The next real step after this is not more patching around null — I consider that done for now — but instead giving Flower the deeper machinery needed for nullable non-pointer values and semantic unions later in v1.4 so it doesn’t come back to bite me in my butt.
v1.4.4 Devlog: Giving Flower Real Semantic Union Types I made it so that semantic unions are now in Flower’s parser and type system — but not yet its codegen. The goal was to support types like: value: int | string next: @Node | null type Result = int | string What’s new The parser now understands | inside type positions and builds semantic union type information instead of relying on those old plain aliases or backend-shaped hacks. On the typecheck side, unions are now carried through normal type copying and alias resolution. That means named aliases like: type MaybeName = string | null make sense after resolution, instead of collapsing into nonsense. The typechecker also now accepts union-compatible usage in the places that matter for a foundation: variable initialization assignment parameter passing return checking alias resolution So if a value matches one union member, it is accepted. This is sorta implicit behavior, but I think it gets a pass due to its somewhat explicit nature? What it does not do yet This version was intentionally strict about using unions as values. You cannot yet directly: index a semantic union access a field on a semantic union use arithmetic / comparison operators on one print one directly Instead, Flower now requires an explicit cast before using a union value that way. That may sound harsh, but it is the right restriction.. for now. There is not any narrowing yet, so pretending unions were fully usable would just make the language lie and spit out 2,000 errors. Where this leaves v1.4 Flower now has: transparent type aliases null as a real type-system concept pointer-first nullable types semantic union type representation The next step is the part that will make unions actually usable rather than merely legal: narrowing with is better explicit extraction with as eventually making ?T truly become T | null instead of remaining pointer-first for now No fun screenshot this time :p just frontend work for now… Ivy, signing off <3
Devlog: is Checks v1.4.5 added is checks, mostly so code like this can work: if maybe_ptr is @int: real_ptr: @int = maybe_ptr end The idea is (fairly) simple: if the condition proves maybe_ptr is an @int , the inside of the branch should be allowed to treat it like one. Flower did not know how to do that before. It knew what a variable was declared as, but it did not really learn anything from control flow yet. Now it can, at least for the pointer/nullable-ish cases I care about first. This touched the parser, AST, typechecker, narrowing logic, and codegen. So, naturally, the “small feature” went everywhere. I’d actually consider this one of the bigger refactors so far, mostly because it added a new TypeAtom structure. Before this, types were still a bit too attached to the places they appeared, and all fell under the TypeInfo . That worked for simpler declarations, but is checks needed type syntax to have something the compiler could pass around to use for comparisons, validations, and narrowing. The parser had to recognize the new expression shape. The AST had to store the left side and the tested type. The typechecker had to make sure the test was allowed and not totally garbage. Then the narrowing logic had to say, “inside this branch, this variable has the proven type of x and therefore we won’t flag you for being an idiot.” That last part was where the bug goblin lived. I’m calling them a goblin because they were sneaky (and I also think it’s quite a funny and cute name). For a while, Flower had applied narrowing from the if body instead of the if condition, which meant the compiler saw this: if maybe_ptr is @int: real_ptr: @int = maybe_ptr end and somehow still failed on the assignment inside the branch. Very helpful. Thank you, compiler. EVen though it’s obviously 100% my fault, I made the compiler, but oh well!! Once I changed the narrowing step to inspect the actual condition expression, it started behaving like it should. The typechecker could see maybe_ptr is @int , attach that narrowed type to the branch scope, and allow maybe_ptr to be used as @int inside the guarded block. For now this explicitness is how I want it. There may come a time in the near future where I decide some implicity is ok, but we’ll see ;) is checks are the first real step towards control-flow-aware typing in Flower. Not full union support yet, but definitely the beginning of that road soon to come. Right now it mostly helps with nullable and pointer-like cases. Later, the same idea can support richer unions, better narrowing, and more type-driven control flow without making the programmer manually restate everything the compiler should already know. Also, it bootstrapped cleanly twice — which.. is obviously the bare minimum, but still!!
Devlog: Semantic Unions Become Actual Values (Part I) In v1.4.6 , I made semantic unions actual runtime values instead of just parsed/typechecked shapes. Before this, Flower could understand: type Value = int | string as a type. It could point at it and say, “yes, that is a union,” but that was mostly theoretical. The goal was to make this work-work for realsies: type Value = int | string value: Value = 7 if value is int: n: int = value as int end value = "Ivy" if value is string: s: string = value as string end That meant Flower needed more than TypeInfo.is_union = true . It needed a full path from syntax, to type proof, to lowered storage, to runtime extraction. Otherwise unions would just be fancy typechecker thingy-ma-bobbies, which is not very useful when the backend still emits C. What changed Instead of treating a union as a vague “one of these types, probably,” Flower now lowers it into a tagged structure. Conceptually, this: type Value = int | string becomes something like: struct Value { int tag ; union { int as_int ; flower_string as_string ; } data ; }; Not the final sacred form forever, but that is the shape of it: a tag saying which variant is active, plus storage for the possible members. Since Flower emits C right now, the lowering is C-shaped. I am not fully sure how I want this to look in ASM yet, but I do know it would be way more technical, and uglier. This required a few things to play nicely with one another: if value is int creates a union proof the guarded branch stores narrowing information value as int is only allowed after proof assignments pack values into the right tagged member explicit casts extract the right member from storage Otherwise the compiler is just writing checks its own backend cannot cash. The part that makes it ACTUALLY semantic For pointer narrowing, if value is T mostly refines how the compiler treats an existing value. For semantic unions, the check also becomes a runtime tag test. So this: if value is int: means: check the active tag of value , then inside this branch, treat it as the int variant. Then this becomes valid: n: int = value as int because the branch already proved the active variant. Without that proof, value as int should not be casually allowed. Flower is supposed to be explicit, not psychic, and I am not confident enough yet to implement a proper intuitive implicit checker without summoning something cursed. Assignment and extraction This: value: Value = 7 now packs 7 into the int member and sets the tag to the int variant. Then this: value = "Ivy" does the same thing, but for the string member. So a semantic union is not just some bytes, but rather a tagged runtime object where Flower knows which member is active. Then explicit casts like: value as string can lower into extracting the string member, but only when the typechecker has accepted that the operation is safe in that control-flow path. Why this checkpoint matters Flower can now store variant values, prove which variant is active, and require explicit extraction instead of relying on random magic I threw together. The flower has grown another concerning little organ.
Devlog: Letting Semantic Unions Work In Functions After getting semantic unions working in local declarations, the next problem was fairly obvious (and in my roadmap hehe). This did not work before: func make_value(): int | string return 7 end func accept_value(value: int | string): bool return value is int end Which was annoying, because int | string was already a real union type at this point. Flower could use it in locals, it could pack assigned values, it could check variants. But if I returned 7 from a function declared as int | string , or passed 7 into a parameter expecting int | string , the compiler did not know how to carry that union-lowering information across the boundary. This has been one of the easier changes I’ve made in a long while. It compiled properly first try (if you ignore a tiny misspell I made which I fixed really quickly), and there were no prior hidden bugs that surfaced. This.. is too suspicious. What changed The compiler now carries semantic union info through: function parameters function returns imported alias calls If a function expects: int | string and I call: accept_value(7) typecheck records that 7 needs to be packed as the int member of that union. Same for returns: func make_value(): int | string return 7 end That matters because codegen cannot guess later due to the separation of responsibilities I’ve laid out. By the time Flower is emitting C, it needs to know which tag to set and which member to write. Lowering it properly Codegen already knew how to pack union values for declarations and assignments. The missing part was doing the same thing for call arguments and return statements. So now a value can be packed into a tagged union when it is: stored locally passed into a function returned from a function Alias calls got handled too, so things like: remote.accept(11) remote.make_string() do not become their own weird little cursed island. Why this mattered Without this, semantic unions only worked as long as I never organized my code. They worked in local tests, but not in helper functions, imported providers, or normal inputs and outputs. Now union values can actually move around the program instead of being trapped in the one scope where they were declared — and for me, forgotten! Very exciting, the union can leave the house. They grow up so fast ⁎⁍̴̛ ₃ ⁍̴̛⁎
Devlog: Adding Obvious Branch-Local Inference to Flower Before this, narrowing mostly worked in the obvious “true branch” cases: if maybe != null: real: @int = maybe end and: if value is string: s: string = value as string end But the else branch was still kind of standing there empty-headed, even when the meaning was extremely obvious. Like, if this happens: if maybe == null: return false else: real: @int = maybe end then inside the else , maybe is clearly not null. So now it doesn’t!! What changed Flower now does branch-local narrowing in else for small, explicit cases. That means these now work: if maybe == null: return false else: real: @int = maybe end and: if value is int: return false else: s: string = value as string end It is only applying inference when the condition says something directly and the opposite branch has one obvious meaning. Nullable narrowing For nullable pointer-like values, Flower now understands both sides of simple null checks: if x != null narrows x to non-null in the if body if x == null narrows x to non-null in the else body the opposite side can narrow to null when that is the only meaning left Semantic union narrowing The same idea applies to semantic unions, but a bit more ‘held back.’ Essentially, if Flower sees: if value is int: then the if branch narrows to int , like before. Now, if the union only has one other possible member, the else branch can narrow too. So for: int | string the else after if value is int can be treated as string . This is not full control-flow wizardry, since it doesn’t reason across deep boolean chains, early-returns, or giant branches yet. It is deliberately small and local, because I do not want Flower “helping” so much that I need a detective board to figure out what type something is.
Devlog: Teaching Flower to Understand Guard Clauses gave Flower branch-local inference. Last update, I added support for branch-local inference, so the compiler could understand things like: if maybe == null: return false else: real: @int = maybe end and: if value is int: return false else: s: string = value as string end That was an improvement, but it still meant narrowing stopped at the end of the branch. That meant stuff like returninging in some conditions still did not really work as naturally as it should: if maybe == null: return false end real: @int = maybe or: if value is string: return false end n: int = value as int In v1.4.9 I fixed that. What changed Now narrowing propagates past very obvious guard clauses. If one branch definitely returns and the other falls through, the compiler now carries the interpretation forward after the if . This means that the compiler can now understand: after if x == null: return ... , x is non-null after if x is string: return ... , a two-member semantic union can narrow to its remaining member I kept this intentionally conservative for now. The compiler is not doing full control-flow analysis yet. It is only recognizing the simplest and most explicit early-exit shape. How it works The main addition was a small semantic check for “does this branch definitely return?” Right now that means: direct return if where both branches definitely return Once the compiler knows one side exits and the other survives, it applies the branch’s narrowing to the following statements. Yea.. that’s it lol.
Devlog: Making ?T Actually Mean T | null Before v1.4.10 , ?T was treated as its own nullable system and not really integrated with the rest of the semantic unions. This was unideal, because it created a separation of logic which was cumbersome to maintain. The idea was to make the following be the default: ?int == int | null ?string == string | null ?@int == @int | null Prior to the refactor, nullable types were still mostly pointer-oriented. That worked when ?T basically meant “maybe this pointer is null,” but it did not really fit anymore once semantic unions became actual runtime values. If Flower has T | null , then ?T should use that instead of being its own special thing. This is a more pragmatic choice, as it keeps the compiler easier to manage and update later on. What changed Typecheck now lowers ?T into the same semantic-union machinery used by normal unions. That means nullable values now go through the same general path as union values: null checks use union-aware narrowing narrowed nullable values can be extracted with as codegen emits tagged union storage assignments pack into the right union member So this now works as an actual nullable flow: maybe: ?@int = raw if maybe == null: return false end real: @int = maybe as @int The annoying part is that Flower has to track two things at once: the type the programmer is allowed to see after narrowing, and the actual union shape that remains underneath it. After the guard, maybe behaves like an @int . But codegen still has to remember it came from @int | null , because apparently the compiler cannot simply “vibe” its way through storage layout. Tragic! The bugs that annoyed the heck out of me Most of the work was not surface syntax. The syntax was just standing nearby looking innocent. The actual bugs were in the places where Flower knew “this is non-null now,” but then forgot how to lower, such as: narrowed nullable values falling back to raw C casts like (int*)(maybe) false branches of == null / != null narrowing to the wrong side (this was my fault lol) null getting packed into the wrong union member That last one was the rude one. For ?@int , generated C could end up doing something like: . tag = 1 , . m0 = NULL instead of packing into the actual null member. So the value looked almost right, but the tag/member pairing was wrong. Then later null checks would fail, because the compiler had technically put null somewhere. Just not the correct somewhere. Very helpful. The fix was separating two questions I had accidentally merged: is this type compatible with this union? which exact union member should this value occupy? Those look related, but they are not the same question. Flower was using the first answer for the second problem, and then acting surprised when everything became soup. Where this leaves Better Types ?T now lowers through the same path as T | null , which means null checks, narrowing, extraction, and storage all line up with the semantic union model. This should make later work cleaner, such as nullable inference, nicer union ergonomics, maybe pattern-like narrowing eventually. Not easy. I am not saying easy near a compiler. That is how they hear you. You do not want them to hear you ..
Devlog: Direct Semantic Union Parameters Now instead of having to do this workaround: type Value = int | string func accept(value: Value): bool You can just pass semantic unions directly: func accept(value: int | string): bool That was it. All I had to do was remove a stale type_error clause in register_params and allow binding variables. Then I updated the two relevant accept functions in /examples.
Devlog: Letting Union Narrowing Follow Field Access Before v1.4.13 , union narrowing only really worked when the thing being narrowed had a variable name due to almost every similarity check relying on name_start and name_length . This was dumb, because semantic unions already knew how to test tags and extract members. Codegen was not the issue, but rather the annoying part was that the typechecker could remember this: if value is int: n: int = value as int end but not this: if box.value is int: n: int = box.value as int end So I still had to do a little temp-variable ritual: tmp: Value = box.value if tmp is int: n: int = tmp as int end Which was gross. Not necessarily catastrophic, just gross and annoying. I wanted needed convenience What changed The compiler was remembering narrowings by variable name, not by expression shape, so box.value looked obvious in source (to me, at least), but to the typechecker it was basically some random expression and not something it could reliably recognize again later. A variable name already had a stable identity, whereas field access chain did not. So the change was to let narrowable expressions represent more than just AST_VAR_REF . For now, that only means stable dot-access chains. The typechecker can record a narrowing for an expression like: box.value and then recognize the same expression later when a cast shows up. So this works directly now: if box.value is int: n: int = box.value as int end Same for the other union members, like string . The detour My first example accidentally wandered into a different feature: if maybe_box.value != null: That exposed a real nullable-field-guard gap, but that is not what this was supposed to be about. Very rude of the test case to have ambition hmph >:( Where this leaves it Semantic union narrowing now persists past field access — at least for stable dot-access chains — and the temp-local is no longer needed. Butttt now I gotta work on nullable-field-guards, ugh (hehe)
Devlog: Finishing Nullable Field Narrowing At this point, Flower could already narrow semantic unions through field access in the is / as case, and nullable field checks were supposed to be the obvious follow-through: if maybe_box.value != null: label: string = maybe_box.value as string end Instead, I had forgotten to remove a LOT of stale code, and thus part of it was still behaving like only plain local variables could ever be narrowed. There was also a second, smaller mismatch hiding, where null in type position was not lining up with the compiler’s actual internal null representation. ?string and string | null weren’t leading to a congruent output and at times were wobblier than they should be. So the fix was mostly cleanup, but the meaningful kind: make null in type syntax lower the same way the compiler expects remove the stale var-only branches in nullable narrowing let stable field paths like maybe_box.value and holder.box.value narrow properly The funny part is that this felt bigger initially than it actually was once fixed. Nothing fundamentally new had to be invented, I just had to stop the old code from interfering with the newer code, which once I figured out how to do so it was quite quick. I spent an embarrassingly long time figuring it out…
Devlog: Syncing Flower’s Docs Back to Reality Just a doc cleanup lol. No code change or compiler updates. Probably did more than needed for now but oh well! The mismatch was REALLY bad. The old docs preserve old assumptions, and someone reading them could walk away with a version of Flower that no longer really exists (or, in some cases, doesn’t exist yet or never ever existed)! What changed I updated the docs that had drifted the most from reality (relatable): README.md now reflects the current type-system shape ROADMAP.md treats v1.4 as accomplished the v1.4.0 milestone doc now includes more of the outcome, not just the original plan contributor docs no longer have stale semantics structure.md is more accurate to what Flower currently is, and what still needs a fuller rewrite later Yea, that’s it.
Devlog: v1.5.1 – v1.5.5 Following all of the changes Flower has undergone, I felt it was time for some much-needed documentation. On paper this was supposed to be fairly quick, simple, and not require much brain power. Unfortunately for me I got a bit too over-zealous, and included things I thought should work, but in reality hadn’t. For example, in a lot of the code snippets I’d have something like: for i in range 0..10: print(i) end Printing non-string values was not yet supported in Flower. To fix this, I took a small detour back to v1.4 and implemented support for it — mostly in a single codegen case: if ast.data._print.value_type.base == TOKEN_FLOAT or ast.data._print.value_type.base == TOKEN_DOUBLE: fprintf(out, "printf(\"%%f\", ") gen_expr(ast.data._print.value, out, src) fprintf(out, ");\n") end Afterwards I added more smoke-tests in examples/io/print.flo . Every few runs, however, I’d get a segfault. This was especially odd because it wasn’t simply an error but rather a silent memory bug. Eventually I found out where it was originating — thanks, ASan! Turns out after the new type system changes, I had forgotten to initialize some values to null / 0 in for loop handlers and a few other places. I just added typeInfo.data = null / 0 where applicable and it fixed the issue! What is v1.5, and why is this devlog so long? To answer the latter first.. I lowkey just forgot to post a devlog for the first two docs I made. That’s it. For the former question, v1.5 is supposed to be explicitly a documentation pass. First thing I worked on was structure. I cleaned up the docs layout, moved things toward a more consistent lowercase docs/ tree — I had been trying for so long to do that and I just finally got it to work — and wrote down the documentation process itself so new pages aren’t just floating about. The point was to try and make the docs feel like a book instead of a folder full of unrelated notes. I wrote and checked the language pages for types, functions, and control flow by reading the compiler itself, not by trusting my (poor) memory. That meant checking parser rules, typecheck behavior, codegen boundaries, and example files before writing anything solid. Types especially needed this, given how Flower now has enough real type machinery that the docs can quickly go from being coherent to completely incorrect: nullable sugar, semantic unions, explicit casts after narrowing, alias behavior, current member limits, and the difference between what the language wants to become and what the compiler supports currently. Functions and control flow had a similar issue. I had to document prop , return rules, direct call forms, logical conditions, range-based for , and the rough edges like break and continue not yet being enforced cleanly as loop-only. That kind of thing is small until someone learns the language from the docs and hits the edge head-first (been there, done that). What Now? I’m just going to keep writing docs. Maybe do one devlog for every new doc, or a batch of docs, who knows! I certainly don’t :p
Hey, it’s been a while! I’ve been finding it difficult to stay motivated for this project, especially with how the new payout system works and just my in-general inability to keep commitment despite having a lot of passion. That said, I am going back to working on this diligently, and I think to start I’m going to cut down on the documentation by making perhaps one or two changes, and then going right back to the compiler work. Documentation writing has not been the most fun for me, especially with how long it takes and how it’s so difficult to not only write language reference that works, but also keeping the same whimsy Flower should have. Thank you to everyone who’s been following this journey, and I can’t wait to see y’all later!!! With Love, - Ivy <3
Integer Types, Parser Fixes, and Segfaults! Phew — this one was biiiiiggg. Flower is pretty much just a glorified C transpiler, which is NOT what I want for it! In order to move on, the data has to be handled explicitly by the FloC. So essentially, I implemented i8 , u8 , i16 , u16 , i32 , u32 , i64 , and u64 . For now, int canonically refers to an i32 value. A New Era? With these new literals, the old hoist-sized representation had to go. The decimal source text is preserved, meaning values such as 18446744073709551615 remain after parsing without causing any overflow. Types are picked up from declarations, assignments, function arguments, return values, field writes, array-element writes, * breath in * and binary expressions! Oof, that was a mouthful. That, of course, resulted in proper errors for things like: 256 assigned to u8 −1 assigned to an unsigned type values beyond u64 unconstrained literals outside the default i32 range I Hate Memory During printing, every width is handled. Integer conditions retain existing zero / nonzero behavior, and literal types print their values rather than a character. Halfway through, I ran into sudden segfaults and memory leaks. I was taken aback, because I didn’t even change anything parser related yet. Turns out, I forgot an assignment in a declaration, which apparently the parser wasn’t able to handle (whoops!). Anyways, I fixed it by propagating errors through the compilation process, so the compiler doesn’t try to typecheck or code gen if the parser reports back errors, and instead will print them out. And that’s it! Not that’s it, but that’s all I’m going to explain for now. More specifics available on the GitHub, of course. Speaking of GitHub thank you so much to S1monr3dst0ne07 on GitHub for fixing some memory leaks in the previous version of Flower — I forgot to prune allocations before returning from a function :p Love y’all!! <3 P.S.: So glad I gave up on documentation, I was genuinely dreading workong on the project and that’s why I’ve been ianctive for a long time :c
Integers, Integers, Integers Hello!! Been a while :) Lately I have been working on v1.6. I call it the “Usefullness” update — rhymes with Grug — because it adds a ton of long awaited features and various convenience implementations Flower DESPERATELY needs. For example, currently the progress has to do with v1.6.1, or Fixed-Width Integers . When it comes to systems programming and in-general efficiency, having various integer sizes is important as it provides an additional layer of manual control over memory and sizes. I know I would have to add them eventualy, so why not put them at the start of the Usefulness update?? I’m sure they’ll come in handy later on. What Actually Changed? Well, for starters, there’s now fixed-width integers (yay)! They’re built in types, so you declare them as you would with any other atom / primitive: type Byte = u8 type Choice = Byte | u16 type OptionalByte = ?Byte struct Packet { pair: Byte[2], size: Choice, owner: OptionalByte } A whole bunch of commits and integer-specific changes regarding indices, arity, unions, nullables, etc etc etc have been made, and they all won’t fit here so instead, take a look at the current branch ! What’s In Store? Plenty more features, you can assure yourself! There’s maybe 6 or 7 — I swear — or so commits left for this specific addition, and after that a lot more features laid out in the roadmap for 1.6! As always, thanks for sticking around and watching the fiasco that is this project become more and more estranged with every hour. Love y’all!! Ivy <3
Ships:
Flower is a self-hosted programming language for writing simple, explicit systems code without the abstraction bloat and OOP-heavy direction a lot of modern languages have. The compiler is written in Flower itself, currently targets C, and follows a straightforward pipeline: lexing, parsing, module loading, typechecking, and code generation. Over the past few months, Flower grew from a small lexer/parser/codegen experiment in C into a way bigger language project than I couldv’e imagined. This wasn’t my first attempt at a language, but it has been my favorite! I implemented compiler-enforced module semantics, stronger type-aware codegen, real boolean support, real string support, and a small standard library foundation. Strings now have equality, .length, indexing, and explicit casts to and from @char , while modules support exported prop declarations, aliases as namespaces, and private-by-default top-level declarations. The hardest part was bootstrap stability. I ran into idempotency failures, parser edge cases, compiler corruption scares, and plenty of my own bad logic. A lot of the challenge was getting new features to work not just once, but consistently enough for the compiler to rebuild itself cleanly. One bootstrap it succeeds, and then the next I’m scrambling to figure out why the new binary executable has a corrupted parser despite just working (Still haven’t fixed that yet! It.. was really confusing and I’ve got no clue why it happened lol). I’m proud that I kept pushing through that and ended up with something much more fun to use than where I started — I mean, I don’t even have to write that much C anymore!! If people want to test Flower, the important thing to know is that it is self-hosted and still experimental, but it does work. The repo includes a bootstrap path, a test suite, and example programs covering types, control flow, memory, imports, strings, and bools. The current release is focused on making the core language feel real and usable before moving on to a larger standard library and a future non-C backend, so don’t be surprised if a C file is shoved in your face!
The compiler is written in Flower itself and currently targets C, so this release was mostly geared towards making the type system have actual Flower semantics instead of a thin little blanket over whatever the backend happened to be doing. The big additions in v1.4 were: transparent type aliases real null nullable types as ?T == T | null semantic unions like int | string explicit narrowing with is explicit extraction with as That support now works across locals, parameters, return types, struct fields, and stable field-expression chains. The work had to touch parser logic, typecheck, narrowing, lowering, codegen, bootstrap, and then all the weird regressions those changes politely dragged into the room. It was.. a process for sure What I’m most proud of is that v1.4 pushed Flower toward a clearer identity that wasn’t defined by C as much anymore. This release also brought the docs back in line with the compiler, which was LONGGGGG overdue. If you want to test it, the main things to look at are the Better Types examples and the self-hosting flow. The compiler should bootstrap cleanly, the test suite should pass, and the examples now cover aliases, nullable values, semantic unions, inference, and struct/field narrowing behavior. For those who will be testing it, DO NOTE that I develop exclusively on my MacBook which is a UNIX system! I do not have the ability to properly develop and provide releases for Linux-specificalities or non-POSIX systems. I’m extremely sorry for this, but alternatively watch the provided video to see Flower in action :) If you’re not able to test it, watch this short (crappy) video instead: https://youtube.com/shorts/DyPtIru6cjY?feature=share...
|
1792832116.6829321
|
1792918516.6829321
|
|
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
|
|
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....
|
1792835706.1611588
|
1792922106.1611588
|
|
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
|
|
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!...
|
1792846379.0298817
|
1792932779.0298817
|
|
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
|
|
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/...
|
1792839021.0312526
|
1792925421.0312526
|
|
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!!!...
|
1792820991.2575514
|
1792907391.2575514
|
|
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
|
|
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
|
|
31437
|
Neverland OS by @253_Mathilde_IYKYK | Stardance
|
253_Mathilde_IYKYK
|
2
|
87.0
|
1295
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-17T15:36:45Z", "hours": 68.0, "multiplier": 18.97, "payout": 1295, "blessing": "neutral", "text": "Neverland OS is a web-based OS with a Peter Pan/Tinkerbell theme. Unlike other operating systems, Neverland OS doesn’t prioritize either design or performance. It tries to be good at both. It has a Notes app, a Music app, a Gallery app, a Game, a Video app, a NASA app, a Wikipedia app, a Hubble app, and a User Manual app. It also has mini apps like a search bar, a timer, weather, and more. My goal was to create something that looks unique. Because when we program, we often have other operating systems in our head. So we automatically put things where we are used to seeing them. But who said that window controls need to be on the right side of a window? And who said that all apps need to look like the ones we use every day? Don’t get me wrong. Those operating systems work great. But they already exist. So why not try something new? Neverland has a lot of hidden features (aka Easter eggs) and was built to have everything you need. Sometimes you don’t need a lot of apps. Just a music app to keep your focus up, a timer to motivate you, and something to write in. Of course, my OS can do way more than that. But when you are honest with yourself: you don’t really need much more than that. But who said that just because we don’t need that much, we have to work with ugly minimalistic stuff? Exactly. No one! So I gave my best to make it look cute. I hope you like it. And if you don’t, let me know! I often struggled with JS because I basically started from 0 knowledge. The Music app was especially difficult because it is so unique (yk so finding help online was impossible). I deleted stuff, made mistakes, broke things, and redid the graphics many times. There are way more hours in this project than you can see ( because I builded this thing on my old laptop in my holidays and that laptop breaks down everytime you use lapse). I took this project everywhere and spent almost every bit of free time I had on it.I worked on Neverland for 42 days. During that time I made over 500 deployments on GitHub, over 600 commits on GitHub, uploaded things millions of times because of GitHub issues, and wrote around 3,500 lines of code. I also tried my best to be transparent about the whole process. I wrote a Devlog about roughly every 2 hours. All instructions are in the OS or in the README. I gave my best with everything: the code, the graphics, the storytelling , the Easter eggs, and all the little details. I hope you like Neverland OS and have fun trying everything out. Sorry for my grammar or language mistakes. English isn’t my first language.", "repo": "https://github.com/253-Mathilde/My-first-OS", "demo": "https://253-mathilde.github.io/My-first-OS/"}, {"ship_num": 2, "ts": "2026-07-15T14:49:28Z", "hours": 19.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a Peter Pan and Tinkerbell-themed OS. At the beginning, the JavaScript was really hard because I had only worked with blocks of code, not actual code (maybe you know code.org — that’s what I mean). The graphics took me quite some time, as did all the brainstorming and planning, because I did my best to create a good structure. I explained the whole idea and the thought behind the theme in my README. On my site, you have two draggable windows (the Welcome window and the Journal app window), and you can write stuff in your little journals and create islands. (I also explained that in my README, but if you don’t want to read it: an island is a note, and I called it that because of the site’s theme.) My site also has a little slideshow in the Journal app that explains how to use everything. My Stardance profile is linked too, so you can check out my other project. The site also includes a timer at the top. I hope you like it, and I’m already collecting ideas for Mission Two. This text was corrected with AI.", "repo": "https://github.com/253-Mathilde/My-first-OS", "demo": "https://253-mathilde.github.io/My-first-OS/"}]...
|
[{"post_id": 48968, "ts": "202 [{"post_id": 48968, "ts": "2026-08-17T15:31:53Z", "hours": 0.9764, "text": "Okay so I think I ship now ,just made some small changes (so my code is better to understand by others) and somehow they turned out to be an hour so yeah time to ship.Thanks for all your support and figers crossed that the first ship works!"}, {"post_id": 48896, "ts": "2026-08-17T13:41:36Z", "hours": 3.7464, "text": "Last Devlog (hopefully). Okay so before you judge me because I promised that I would ship yesterday: This README is massive and I gave my best to make it short but still well explained and yeah this was just so much work.Hope you like it. The TV should also work now.Finally, so maybe try it! https://253-mathilde.github.io/My-first-OS/ . I think that I’ll ship today. I really hope that everything works so pleaseeeeee I need some feedback. This project is just crazy and so many already like it.Can’t wait to see what you say to my next projetc idea. Thanks for your support and can’t wait to hear all the feedback. SO many hours of work.Hope they pay of.Thanks for reading <3."}, {"post_id": 47635, "ts": "2026-08-15T17:38:45Z", "hours": 3.1572, "text": "Okay so I never want to see a link in a HTML project again for at least the next 2 weeks because I now added the image sources to the manual, and that was just some crazy work. I myself always keep every source throughout the whole project but that meant that I had 15 pages full of links and I only needed the ones for the images And some were even unnecessary because those images were deleted from the site through the whole project. I know this site is probably the ugliest one in this whole project but also one of the most important ones. I also worked on the grammar. There might be some little mistakes but I wrote it. English is not my mother tongue, and I typed far more than just a prompt into an AI. I also checked the mistake with the YT video but couldn’t find one. It would really help if others also checked if the vd in the TV does not work. Tomorrow is README day. We are really there. I still can’t believe it. And someone wrote me on slack that you can review your own project with any AI, and the AI really liked mine so fingers crossed that the first ship will get approved And my work paid off. Thanks for all your support, and I would really appreciate your help with the TV app. Thanks for reading <3 Here is the link: https://253-mathilde.github.io/My-first-OS/"}, {"post_id": 47128, "ts": "2026-08-14T19:52:28Z", "hours": 1.8492, "text": "Check it out https://253-mathilde.github.io/My-first-OS/ Okay so today I added the last song to the music app.I also changed the font in the welcome window and wrote more text/changed some stuff. I also added better img to the galerie so now everything looks clean and everything is so close to being finished. I know I say that every day but you get a different point of view when you have over a month of work in your head VS just 3 or 4 more days. I am soooo happy with the font in the welcome window because the other one was more tech and this is more fairy-like. If you have a different opinion or absolutly hate it : say something! As you can see in the last DEVLOG I changed a lot based on feedback so yeah. I also changed the songs that are mine (not the ones from my base code) to github so now the img may load a little bit slow, but the sound should work great.I also made all the img links in the galerie app to github links( I downloaded everything from catbox and uploaded it to github and then change dthe file name and then re-run every job). I love how the music app turned out and looks when other windows are opened. Hope you like it tomorrow is going to be grammar and manual day because these things are just as importent as the coding.And when I work in my schedule, the day after that is README day and correcting graphic days.That would mean we ship in 2 days. I’ll give my best to find enough time for that.Thanks for reading <3"}, {"post_id": 46417, "ts": "2026-08-13T16:40:50Z", "hours": 2.2708, "text": "Concept Devlog Okay so I know it looks like I haven’t worked on this project for the last two days but Actually, I have worked non-stop for the last two days. I got some feedback for my site, and I am still open for some feedback. I really struggled with GitHub and ended up renaming every file in my project, and yes, I needed to do that individually and wait every time for about 10 minutes. Now more and more images are getting changed from Catbox to GitHub because someone said that I should reduce the loading time. I myself don’t like using GitHub for images and stuff because it is sooo much work with the folders and stuff, but you wanted it so, so I changed it. I also changed the manual because I also got some feedback for that. I also will upload the Pixabay songs to GitHub but not the ones from the tutorial I used because I don’t know where this music is from… That should reduce the loading time from the music app. I also found a lot of details that are not perfect so I also will change these but these are mostly little things in the user interface. I really gave my best the last days even though I can’t use Lapse for time tracking because it does not work with my laptop. Oh, and I almost forgot: the OS is made for smaller screens with a browser window width from 1400 px (I don’t mean the width of your screen), so I would Be really happy to know how bad it looks on other screens. I am really sorry for that but can’t change that because my CSS is 1600 lines of code and I often used position: absolute;. I am a beginner and will work with the percentage the next time! I promise. Thanks for reading and your patience with me. Check out the site at the moment, but please respect that the manual is not quite finished and the text can look a little bit misplaced sometimes. https://253-mathilde.github.io/My-first-OS/ Thanks for reading <3"}, {"post_id": 44832, "ts": "2026-08-10T21:08:40Z", "hours": 1.5083, "text": "That is just the first page.I’m waiting for two hours.I can’t even cancel them.Why always meeeeeee.I just made a folder to make it organized localy and when I uploaded it from the app ( yk the push and pull ) this happend.Yeah that takes sooooo long and btw I added more songs and made some things a little bit cleaner.As you may can see I can’t show you anything right now.Thanks’s for reading <3"}, {"post_id": 44075, "ts": "2026-08-09T16:26:52Z", "hours": 2.9811, "text": "Ahhh, I’m freaking out. The music app is finished!! Finally. It took me so long. Yes, I still need to add more songs (we only have the 3 from the base I used), but the whole layout is finished. Everything that comes now is only details and grammar and such stuff, but that was actually the last line of code for this project (yk, I now only need to repeat or fix things, not write something from scratch). In the app we have a slideshow at the beginning, a moving CD (spins), a menu that comes up front if your mouse touches it, a back button for the previous song, a next button for the next song, and a play and pause button that changes (yk, if the music plays it is ‘stop’ and if not it is ‘play’), changing song names and, of course, changing artists names. That app was the most challenging of all. Hope you like the design and everything! It would really help if you tried the site https://253-mathilde.github.io/My-first-OS/ and looked if everything works, but please respect that I am working on the grammar. Now we are finally getting to the last part!!! Thanks for reading <3."}, {"post_id": 43826, "ts": "2026-08-09T08:08:51Z", "hours": 1.7783, "text": "I think the manual is now finished. I know the CD site is not finished, but neither is the app. When I am finished with that, I’ll update the manual. I also added that star effect that shows when you click on the star thing on the last page. I also made some Easter eggs, like hidden sounds (for example, the first audio that was taken on Mars plays if you click on the green heart in the map window, which is also hidden), and I made the tab name of the OS a little game (I don’t know how to call it; it basically just moves and looks pretty). Hope you like the app; I’m always happy to hear some feedback, and now I finally start working on the music app. Thanks for reading <3."}, {"post_id": 42751, "ts": "2026-08-07T17:00:35Z", "hours": 4.0733, "text": "Okay, I worked on the manual app more, and you now can slowly see where we are going. That took me super long because I also did all the graphics and the effect where the image turns and gets bigger the second your cursor touches the image. Hope you like the graphics and the little tinkerbell on the cover. I know it is not perfect because the book is already open when you open the app, but I think it looks okay, and I can’t change it because of the symbols (they would look pretty bad on the next pages then). I also need to change the back site, text and next buttons. Btw, I now have over 300 commits on GitHub and 69 hours on Hackatime, and the project has been active for 32 days (started on 7/7/26). Literally, over a month and one devlog got over 2000 views 🥹. Thanks for reading and always helping me out <3"}, {"post_id": 42274, "ts": "2026-08-06T22:06:50Z", "hours": 1.2061, "text": "Okay, so GitHub is still broken, so text will have to do it. I added the Wikipedia and manual apps. And I also wrote the whole manual. That was quite some work, and I also fixed parts of the JS that were not really stable. I am so happy that it works now because I almost deleted everything today. In the end the problem, why everything did not work, was a missing close div thing. I spent the whole afternoon till now searching for that. It is midnight. I started in the afternoon. I feel really dead right now. Tomorrow I really need to do the music app. Thanks for reading <3"}, {"post_id": 41927, "ts": "2026-08-06T13:30:02Z", "hours": 2.9661, "text": "Okay, so like, I started on an app, and I can’t try it at the moment because GitHub is testing my patience, but yeah, the app is the manual app, and it looks like a book, and you can actually flip pages. It is just annoying that I can’t work correctly because of GitHub, but I don’t have another chance; I just need to try again and again and again: And because I do not know if my code even works, I can’t even continue with another app like the music app. Thanks for reading <3"}, {"post_id": 41535, "ts": "2026-08-05T20:07:14Z", "hours": 3.6178, "text": "Here we finally are: It works. With sound. And autoplay. And the alert. And I am soooooo happy. It took me the whole day, and I needed to do stuff that I had never even heard of, but thanks to the internet and my ability to read, I finally got it. So you can understand that better: I started at 8 am in the morning and finished at 4 pm in the afternoon. As you may understand, my patience for the music app was not enough, so I built 2 new apps instead. That sounds a little bit crazy, but because these are based on a webpage, it only took about 3 hours each. I still added a little window that explains everything, and I hope you like the result. I got so much kind feedback for the pre-loader and in general; I am getting so many nice comments. Thank you for that, and I hope you like the result and see where we are going! Thanks for reading. <3 The vd is pretty bad because I had to compromise it, so maybe check it out in real life or wait for a DEVLOG with a better VD."}, {"post_id": 40956, "ts": "2026-08-04T20:19:33Z", "hours": 1.0911, "text": "I worked on the preloader for the last 7 hours, but because of the browser update in 2025, an alert does not count for autoplay with the audio, and I still need a solution for that. Here is the MP4 of the preloader with the audio. I hope I will get that with the audio tomorrow. At least the video is working with the alert. Hope you like the graphics (they took soooo long, and yes, everything is self-made, so no Google copy and paste). Thanks for reading <3"}, {"post_id": 40737, "ts": "2026-08-04T13:45:55Z", "hours": 1.7208, "text": "I NEED YOUR HELP!!!! Okay so I started working on the menu. It works already but needs some better styling. So you can see the vision: The red circles are going to be little CDs like the one already existing. But I need your help because I do not know how to make the control buttons (the styling), so here are like 3 versions of it. Hope you can see the vision and may help me choose (and of course the buttons will be buttons, not words, but yk it is just so you can see what my vision is). Thanks for reading <3"}, {"post_id": 40328, "ts": "2026-08-03T19:25:43Z", "hours": 2.0278, "text": "Okay so here is what we have now: I added the final things for the apps, and I also changed the layout so that the backgrounds only repeat horizontally and not vertically. I also worked on the screens for the app and, of course, on the music app. I need to pull myself together so I do not start with any other app before I finish the music app. I also worked on the graphics as always, and we now finally have better vd, and everything is just better. Yayyyy.Thanks for reading <3"}, {"post_id": 39650, "ts": "2026-08-02T19:31:46Z", "hours": 0.7467, "text": "#Concept Devlog ( infos about the planning and the vision I will mark them now so you can choose yourself if your interests are only in the progress or also in everything behind the finished page )Okay so today was a planning day. Again.But you need to trust me because if you don’t have a plan than you won’t have a good project because I have multiple apps and I want everyone to be perfect. So over the time more and more little mistakes or things that just feel false appear.And I mean I already used so much effort so why should I throw that away and make it unperfect? A lot of new problems also appeared because I now saw the site on a bigger screen (yk laptop VS PC) and it just looked terrible! And the music app is not finished and because that DEVLOG is already really long: there will be 3 more apps.Yayyy.They won’t be too complicated because they will base on already existing sites so it should be done in about 10 hours but before that everything needs to be done and as you can see that is a long list and every task will take about an hour at least.We have round about 28 tasks btw.It will be a long journey and I think that we are not even close to half of that so if you really read all of that: A really big thank you because you have true interests! Thanks for reading<3"}, {"post_id": 38844, "ts": "2026-08-01T12:26:28Z", "hours": 1.2656, "text": "Okay so we now have a working thing ( the play and stop button needs some work because right now it only works if you do not use the back and forward buttons) and as you can see I changed the graphics and what you cannot see is that it rotates like a real CD! I started planning the menu cause it will have the shape of a half circle so I do not have quite an idea how I will do that but we will see.Thanks for reading and right now I only have the example music from the code I used so if you have music wishes:leave a comment.Thanks for reading <3"}, {"post_id": 38250, "ts": "2026-07-31T15:32:45Z", "hours": 1.2331, "text": "#concept Devlog AND SR FOR LIKE THE LOOKS AND THE GRAMMAR OKAY WE HAVE 37 DEGREES AND THIS IS JUST A VISION IT IS NOT SUPPOSED TO LOOK PERFECT!! Okay so I now started working on the music app and yeah it looks sooo funny right now(yk to see the switch from all the clean and perfect things to THAT)but I mean everything works for now so we just need the styling and the menu.That is such an easy thing to say because actually:The graphics take me sooo long.There are about 20 hours that you do not see and thanks to the universe catbox is not working right now and that means I have to use postimages and it works but like the pictures load sooo long.Hope it works soon and if you have like song wishes for the app:leave a comment!Thanks for reading and here is my vision:"}, {"post_id": 38102, "ts": "2026-07-31T09:57:54Z", "hours": 1.4106, "text": "Okay so the game is kinda finished! I now have a game over screen and a finished screen and a like maual or pre-loader.Everything is explained and I myself think that it is like the right level of easy but still a little bit tricky.You would help me a lot with trying it out and giving me a short feedback. ( https://253-mathilde.github.io/My-first-OS/ )Thanks for reading and here are the picture of the game app:"}, {"post_id": 37862, "ts": "2026-07-30T20:44:36Z", "hours": 0.4675, "text": "I added something like a pre-loader-thing that shows the info for the game everytime you open the game window for 30 sec.I now that it is kinda annoying that I only log such short times but I just squeze in every tiny bit of time I have and the graphics also take pretty long.Thanks for reading <3"}, {"post_id": 37765, "ts": "2026-07-30T17:59:45Z", "hours": 0.8992, "text": "So I did some JS and spent way too much time on the graphics.It now shows a message and hides everything when you reach a score from 100.I still need to do something for the like game over part.Hope you like the design because that will stay the same I think.Thanks for reading <3"}, {"post_id": 37038, "ts": "2026-07-29T14:41:02Z", "hours": 1.1483, "text": "Okay so I started doing some CSS and made some graphics.Right now the background is too full (yk the focus point from the game should not be the background) but like the keyframes work and I added that frame.I will chnage the elements from the game but I will not change like the frame because I think that the frame looks pretty cool.We still need to do the JS and to change some stuff but I think that I will get that done in about 6-8 hours.Unfortunatly I do not have 6-8 hours the next days.I will give my best to squeze in some time but yeah: Sr for the bad vd but like I do not even use that other tracking tool because my laptop is just soooo slow with it and like recording and all the animations and windows that are open-it almost collapsed so srrrr Thanks for reading and if you have styling ideas for the game:leave a comment or write me on Slack <3"}, {"post_id": 36942, "ts": "2026-07-29T10:55:56Z", "hours": 1.1881, "text": "Okay so here we are: We have a WORKING mini game that looks like trash! And I am sooo happy.As you can see there is an object that you can control with the arrow up key (hope that is the right english word for that).And we also have like blocks that are generated and have a random height.Yayyy.So we only need to do the styling and add some JS that ends the game when you have a score from xxx (I already have a score in my JS so that should not be so complicated).I am so happy right now and I think it was the right decision to start over.Thanks for reading and sr for all these bad vd’s,they will get better soon.<3"}, {"post_id": 35909, "ts": "2026-07-27T17:23:26Z", "hours": 0.3122, "text": "Okay so I hope that I do not dissapoint s.o now.I deleted the whole thing that I had so basically a whole day of work because there is always way more time behind everything that you think.I did that because I could not find the mistake and I did not really get the code.I never really did JS before this project and I am learning JS while doing this project.And I mean really learning because I kinda eat the whole W3 school site but yeah.I want to give my best in this project and if I cannot find the mistake in my own coding:I would need AI.And do not get me wrong but help from AI okayyyy but a whole app made with AI.No.No.And no.That is MY opinion so yeah if you do not think so or use AI a lot then do so (it is okay but not for me).I give my best to be transparent and always say when I used AI.The plan is now to build like a flappy bird game but without the top part and to make it look cool.I hope you can understand me and stay with me on this project because we are now getting to the hardest part.This will take some time but I will not quit.Thank you for reading(I do not think that s.o will read all of this but yeah)."}, {"post_id": 35832, "ts": "2026-07-27T14:55:32Z", "hours": 2.8108, "text": "Okay so I just started with the game.Actually just started is a huge lie because I am struggeling since 10:00 and we now have 17:00.I used a tutorial and tried to just start basic with making a little jumping game but the objects …They do not exist because the whole generating thing does not work .I first need to get everything working before upgrading the graphics and stuff.I really would like some help! CSS: #background { position: absolute; background-image: url('https://files.catbox.moe/xqsbzm.png'); height: 200px; width: 100%; animation: slideright 600s infinite linear; bottom: 0;}.wendy { background-image: url('https://files.catbox.moe/u52u37.png'); height: 60px; width: 60px; position: absolute; bottom: 0;}.obstacle { background-image: url('https://files.catbox.moe/n5f03w.png'); width: 60px; height: 60px; position: absolute; bottom: 0;}@keyframes slideright { from { background-position: 0 0; } to { background-position: -10000px 0; }} HTML: <div id=\"gameWindow\"> <div class=\"base5\"> <div class=\"symbolegame\"> <p id=\"galerieWindowheader\"> <img src=\"https://i.imgur.com/Y4OL1On.gif\"></p> <p style=\"cursor: pointer\" id=\"gameclose\"><img src=\"https://i.imgur.com/q5TmYNg.gif\"></p> <p style=\"cursor: pointer\" id=\"gameopen\"><img src=\"https://i.imgur.com/3nBda2J.gif\"></p> </div> <div id=\"background\"> <h6 id=\"alert\"></h6> <div class=\"wendy\"></div> <div class=\"grid\"></div> </div> </div> </div> </div> JS: document.addEventListener('DOMContentLoaded', () => { const wendy = document.querySelector('.wendy') const grid = document.querySelector('.grid') const alert = document.getElementById('alert') let gravity = 0.9 let isJumping = false let isGameOver = false function control(e) { if (e.code === \"Space\") { if (!isJumping) { jump() } } } document.addEventListener('keydown', control) let position = 0 function jump() { isJumping = true let count = 0 let timerId = setInterval(function () { //move down if (count === 15) { clearInterval(timerId) let downTimerId = setInterval(function () { if (count === 0) { clearInterval(downTimerId) isJumping = false } position -= 5 count-- position = position * gravity wendy.style.bottom = position + 'px' }, 20) } //move up position += 20 count++ position = position * gravity wendy.style.bottom = position + 'px' }, 20) } function generateObstacles() { if (!isGameOver) { let randomTime = Math.random() * 4000 let obstaclePosition = 1000 const obstacle = document.createElement('div') obstacle.classList.add('obstacle') grid.appendChild(obstacle) obstacle.style.left = obstaclePosition + 'px' let timerId = setInterval(function () { if (obstaclePosition > 0 && obstaclePosition < 60 && position < 60) { clearInterval(timerId) alert.innerHTML = 'Game Over' isGameOver = true //remove all children while (grid.firstChild) { grid.removeChild(grid.lastChild) } } obstaclePosition -= 10 obstacle.style.left = obstaclePosition + 'px' }, 20) setTimeout(generateObstacles, randomTime) } } generateObstacles()}) Thanks for reading<3"}, {"post_id": 35185, "ts": "2026-07-26T13:27:10Z", "hours": 1.725, "text": "So here is the camera app! As you may can see there are two little buttons that look like real camera buttons. I added little arrows but I think they still look real.Right now we have like 22 photos on our digi cam.And well if you scroll through these screens you may see the TV app because I also finished that.I think it also looks pretty cool ,tell me what you think about it in the comments!! It only has one vd right now(yk matching to the theme if you are interested check out the real site).I may add more in the future but not until this project is finished.So these 2 apps are now ready and the next thing on my list is the music app.Happy to hear or see some feedback (If you all really hate it I am going to change it tho but I really gave my best).Thanks for reading <3 🔗 253-mathilde.github.io/My-first-OS/"}, {"post_id": 34192, "ts": "2026-07-24T18:28:48Z", "hours": 1.5156, "text": "#concept Devlog All I can say:The galerie app is finished ! You can check it out or wait until I post a DEVLOG which shows more details.It was squite some work and now it is time for the next point on my todo-list:the TV.I am so happy and grateful for all these people watching my DEVLOGS and for all these kind souls who are staying with this project since minute one.Thank you you all and I really hope you like it!!Thanks for reading <3"}, {"post_id": 33433, "ts": "2026-07-23T11:36:14Z", "hours": 0.8769, "text": "So I added the base for the galerie.I just need to add a slideshow thing which is going to be a little hard because I already have 2 and I need to add the 2 buttons to switch between the images.I am giving my best to squeze in coding time but the graphics themselves take a lot of time.Thanks for reading!!!"}, {"post_id": 33405, "ts": "2026-07-23T10:08:02Z", "hours": 0.9244, "text": "So I pulled myself together and changed the welcome window.I will work on the camera app now but what do we think about the desing from the welcome window ? Should I leave it as it is or should I change it ? Yk it is the first impression you get when you go on my site.Thanks for reading and your interests in this project."}, {"post_id": 32570, "ts": "2026-07-21T20:40:51Z", "hours": 1.7686, "text": "So I changed the welcome window.It is not perfect and not finished do not worry but it is enough for the moment.It was quite hard-yk with the grid and everything because I had never done that.I need a little break from the grid thing so that goes on the list for the things to do in the end.Hope you like the styling idea.Thanks for reading!!!"}, {"post_id": 32381, "ts": "2026-07-21T14:58:33Z", "hours": 1.4383, "text": "Well, that looks like an OS! I got the little weather application for the top. Yayyyy. And I also added the icons for the apps and also connected them to their own windows, so now only the app content is missing. I am so happy right now that everything works! The complicated part is not even close (yk the game and the music app), but I am going to change the design from the welcome window (check the drawing for the vision). The apps are in a div container where you can scroll, and I really hope you like it! Maybe check it out in real life when you are interested. Thanks for reading!!!"}, {"post_id": 32272, "ts": "2026-07-21T10:39:47Z", "hours": 1.2842, "text": "So I added the little star map thing (same here,if you do not know what I mean or what the plan for this project are : check the DEVLOG with the drawing) and fixed some little mistakes.I think I am going to start working on the hardest part in the info-top-bar-thing :The little weather widget.The problem is that it is supposed to get you location and to show the weather in the right number thing ( yk F and C ).Let’s see how long this will take! Wish me luck and thanks for reading this DEVLOG!!! Sr again for the vd my situation has not changed :( and I also showed all the other features in this vd"}, {"post_id": 31781, "ts": "2026-07-20T13:27:42Z", "hours": 2.3606, "text": "I added a little timer. It’s a simple one — it only counts minutes, not seconds or hours — but it’s enough if you want to have a short learning session or keep track of a small task. It’s not an app; I wanted to keep it simple. I also added the divs for the other tools in the top bar, and I included a small GIF for the map feature (check my DEVLOG with the brainstorming if you don’t know what I mean). Maybe I’ll start building that today, maybe not. Thanks for reading this DEVLOG ❤❤"}, {"post_id": 31297, "ts": "2026-07-19T16:17:14Z", "hours": 1.5781, "text": "So I started working on the top bar.It now has quotes that change every 10 sec and that move so the text is animated.My plan is it to finish the top bar and all these details and then start working on the apps.I am pretty sure I will change the graphics when I am done with the app but that is really easy to do and I first need the code for these elements."}, {"post_id": 31164, "ts": "2026-07-19T10:35:50Z", "hours": 1.0581, "text": "So I added a Pre-Loader.I know right now it does not match the vibe from the site but I am going to change that at the end.Changing it is pretty easy ,making it was a little bit harder.I am going to work on the music app today but right now I need a little break.When you have ideas how I should style the Pre-Loader: Leave a comment!! Thanks for reading <3"}, {"post_id": 30673, "ts": "2026-07-18T13:24:10Z", "hours": 2.0797, "text": "So I started changing the window for the music app and I also started making all the graphics.That took about 6 hours so these 2 hours of code time are such a tiny bit of my actual work.Hope you like the style and see the vision for the app. Sr for the bad vd my Internet is still veeeeeery slow and it is just sucks :)"}, {"post_id": 30353, "ts": "2026-07-17T20:38:07Z", "hours": 1.4083, "text": "#concept Devlog So as promised here is the brainstorming for the whole site. I also have the brainstorming for the apps but you need a little bit of patience because I am only going to share these when making the actual app.I also started on the music app and it looks really cool.Everything is coming together slowly and even when I am not even at half of the time I am going to spend I am soo happy.Hope you like the brainstorming-and yesss it is BRAINSTORMING you guys so please it is not supposed to look like the Mona Lisa.Thanks for reading all of this !!!"}, {"post_id": 30175, "ts": "2026-07-17T15:19:52Z", "hours": 2.0125, "text": "So I now improved the search bar and the dragging thing because now you cannot drag a window into the top bar. I also changed the icons and added a new app with a matching app window.The window is a mix from the Journal app and the welcome window but I am going to change that soon.I also changed the color of the clock and added a background to the apps.I finally made my CSS a own file so now the HTML is a little bit shorter and more organized.I am going to work on the window from the CD’s app later today and I am also going to share my brainstorming for the site.Thanks for reading!!!"}, {"post_id": 30067, "ts": "2026-07-17T10:59:39Z", "hours": 1.5111, "text": "So I now changed the CSS for the icons and started adding a search bar connected to ecosia. Ecosia is like google but it plants trees every time you use it.Because I do not know if I can change the index also in my GITHUB (yk I am still waiting for the mission thing) you can only see the changes on a screen. It works right now but I still need some changes to make it look better.I made the whole brainstorming for the site yesterday so I think I am going to share that today too.Thanks for reading this DEVLOG."}, {"post_id": 29710, "ts": "2026-07-16T20:00:25Z", "hours": 0.2914, "text": "Hey so I do not know if it only works on my laptop but you should be able to drag the window when you click and hold the yellow heart.Could someone please try it???"}, {"post_id": 28895, "ts": "2026-07-15T14:25:36Z", "hours": 2.6283, "text": "#concept devlog Hey. So I just finished my README and my site. The time you see here only reflects the hours I spent coding. The README took way longer than the code, but to me, the README is just as important as the code itself. I’m going to ship everything in the next few minutes. Hope you like my work! If you want to know how I did everything, check out my README — it’ll make all the effort worth it. Thanks for reading this DEVLOG, and keep in mind: this is just Mission One. This project will get better and bigger in Mission Two. If you want to know my plans or first ideas for Mission Two, read my README. This DEVLOG was corrected and improved with AI"}, {"post_id": 28322, "ts": "2026-07-14T14:34:58Z", "hours": 3.2475, "text": "Hey, so I now upgraded graphics and stuff from the Journal app. I still need to change some details like the heading of a note you wrote (currently it is blue and really tech-like) or the text in the starting window. I also changed the font from the app name under the app icon. I also upgraded my JS, so now you can write a note and refresh the site, and it will still be there. You can also edit or delete that existing note with only one click. When you refresh the page and there is already a note, you will not see the introduction to the app again. I am going to do the graphics for the README now (the graphics for the Journal app were about 3-4 hours, so I really locked in today), and I will also add some more links to it. I am also going to try to change some details today. But the final steps and the final written README are coming tomorrow. So if everything works: Tomorrow is shipping day!!! Thanks for reading all of that and having interests in my OS. And again: Really sorry for the bad video…"}, {"post_id": 27740, "ts": "2026-07-13T15:49:59Z", "hours": 4.4794, "text": "So today I could finally finish my journal app (in the tutorial it is a notes app). Unfortunately, I did not understand the tutorial so well with the app, so I decided to find a tutorial myself and use that. It took me longer than expected, but here I am now. I already started working on the graphics (Yesss, they are all made by ME). That took me about 3 hours. These hours unfortunately do not count, but I want to give my best and really make that project cute.The plot twist is that the apps do not look like the apps that everybody knows. They are supposed to look like the real thing, and I want to combine that with the whole Peter Pan/Tinkerbell theme. So yeah, I am going to do the README now, and tomorrow I am going to read the last guide even. I do not know if I am going to use that guide or what even is in that guide. I am also going to change the graphics in the notes app. I really hope that that journal app of mine has the same functions as the app from the guide and that it is okay that I did my own one. Does somebody know that?? Thanks for reading this entire thing. Sorry for the start and the quality of the video.My Internet Connection is at the moment really bad"}, {"post_id": 27251, "ts": "2026-07-12T17:16:06Z", "hours": 0.3075, "text": "Thanks to the help from @nokira , it now finally works. Unfortunately, I cannot code any further today, but we are hopefully going to finish the app tomorrow."}, {"post_id": 27108, "ts": "2026-07-12T11:33:27Z", "hours": 1.4481, "text": "So, here is finally a DEVLOG that logs over an hour of work. I did my best today, but unfortunately I’m typing only with my left hand as a right‑handed person because of a small accident. Yaayyyy (the universe is really not on my side).I can now finally drag the two windows separately (that didn’t work yesterday), and I can close them. I’m not sure if it’s supposed to do nothing when I click the “Open” button.For better understanding: Yellow is for dragging, red for closing, and green for opening.I think I have another bug, because when I click on the app icon, nothing happens. If you have any idea what might be wrong, please help me in the comments or on Slack.I also wanted to work on the README today, but I’m not sure how long I can keep typing with my left hand. We’ll see. I’m trying my best here — thanks for reading all of this."}, {"post_id": 26780, "ts": "2026-07-11T19:33:38Z", "hours": 1.1739, "text": "So, I added the three little symbols at the top, and I started working on my app. Right now it looks the same as the welcome screen, but I’m going to change that tomorrow.My plan for tomorrow is to finish my first app and maybe even start working on the final README (you know — the banner and everything)."}, {"post_id": 26478, "ts": "2026-07-11T09:19:42Z", "hours": 0.6758, "text": "So, I did the JS and the HTML for the close and open feature. I also changed the graphic of the handle. I’m really sorry that I only log such short sessions, but I currently don’t have much time for coding and can only squeeze in short amounts of time."}, {"post_id": 25937, "ts": "2026-07-10T13:14:16Z", "hours": 0.5867, "text": "Guys, I finally got it! A big thank you to @nokira . I needed a bit more time to fix everything, but yeah — there were some more mistakes that I finally started to correct. I still need to fix a few things, like the graphics and the z-index, but I’m sooo happy that it finally works!!!!"}, {"post_id": 25259, "ts": "2026-07-09T12:40:32Z", "hours": 0.6822, "text": "So I started the third tutorial.I am at the part where you should be able to drag your window.The code is from the tutorial ,so it should work but I think that I have done something wrong because as you can see nothing happens.I am on the go right now and maybe I can squeze some time for programming in later.I have my code updated in my github thing ( it is linked in the project I think) .Could someone help me please.I am really new with JS and I do not have enough time right now to start from the starting point.Because I am in a rush I do not have time to correct this text .I am really sorry for my grammar and all this stuff."}, {"post_id": 24804, "ts": "2026-07-08T16:38:54Z", "hours": 0.2833, "text": "Okay, so I just coded a bit more and made a temporary README. I’m going to create a new picture for my project and improve my profile a little, but that’s it for today.✨ BYE ✨"}, {"post_id": 24789, "ts": "2026-07-08T16:13:44Z", "hours": 1.1456, "text": "So, what have I changed? First, I changed the heading because the “S” looked like an “f,” which would completely change the purpose of the website — I just noticed that, hahaha! Imagine if I had shipped it like that in the final version. Anyway, I also added that cute cursor (it’s a tiny Tinkerbell). I loved this idea the most because it lets me make my website both modern and whimsical.If you don’t know who Tinkerbell is: she’s a cartoon character from a kids’ series who lives with other fairies and struggles to find her powers. I thought it would be fun to combine her with Peter Pan — also a children’s story about a dream world where Peter Pan secretly visits kids at night and they all fly through the sky to a magical place . I didn’t watch the Peter Pan series as a child, but I read the books, so I chose Tinkerbell because I could picture her better in my head. Maybe we just pretend they got married.Why am I talking so much about these characters? Because my whole OS is meant to match that vibe — so you can understand why there’s a random fairy on a modern site. I’ll make it easier to get what this OS is about as I go further with the project (you know, adding features like a calculator, etc.).I also added my favorite feature again: a new highlight color! That ugly blue is finally gone from this beautiful site. I linked my profile at the top too, so you can click on my name now. I mean, if you’re going to include info on a site, you might as well do it right and add a bit more about yourself than just your name.So yeah, that’s my desktop for now. I’m going to work on the README today too. I wanted to get further today, but I think it’s okay — you know how much time I spent on this.Thank you for reading all of that and for your interest in my project!"}, {"post_id": 24685, "ts": "2026-07-08T13:10:59Z", "hours": 1.6353, "text": "Hi! So I already had the code in my last update here, but I finally changed the graphics and the design. I’m not finished with the desktop yet (don’t worry, I know how it looks!), but I just wanted to give you a quick update."}, {"post_id": 24622, "ts": "2026-07-08T10:33:51Z", "hours": 0.4072, "text": "Okay, soo. I just read the second tutorial and literally made it the same as in the tutorial. I knew I wasn’t supposed to do that. Yes, I’m changing it in a second. I’m just brainstorming a bit and sorting out my ideas for the design because my last project had that Y2K vibe (iykyk), but now I want something cleaner — not like those old, ugly operating systems back in the day. Still, it should keep some of those nostalgic vibes, you know? I can’t really explain it better.So yeah, I think I’ll need about an hour or two — let’s see if the universe is on my side and I find the graphics I want quickly! And guys, I’m suffering — I miss my Windows 11 from home, but I think I just need a little more time to get used to Windows 10 on this laptop. I don’t really have a choice since it’s just me and my laptop for the next month.Also, I registered for this chat thing (I forgot the name) and got nothing. Like, how many chats exist on this planet? But I think I’ll get through it tonight. :)"}, {"post_id": 24293, "ts": "2026-07-07T19:22:28Z", "hours": 0.2756, "text": "Guys, this has been so hard. And I don’t mean the project — I mean the file. I know that no one is going to read this, but I want to share my struggle so that my hard work has a reason.I just finished my first project, which I did with the VS app. But now I needed to open a new project — after half an hour, I somehow managed it (still don’t know how). Could somebody explain that to me?Then the Hackatime tool stopped working, and Stardance couldn’t find my file. So I decided to switch to my laptop because I hadn’t installed the app there yet, and I already knew what to do from my first project. I needed everything on my laptop anyway because of the holidays, etc.My laptop only runs Windows 10, so everything took ten times longer. After that, I had to delete some apps because of storage issues. As you can see, it just kept getting more complicated.I finally did it — after six hours, without appreciation (you know, from Stardust…) and actually crying twice because I already had code, but it was gone.I don’t want to annoy you with my problems. That’s my site for now. Please don’t judge — I’m following the tutorial, and I’m going to add beauty to it at the end when the code is finished. I already have so many ideas.I’m giving my best and forcing myself to keep going. In my country, there’s a saying: „Wo ein Wille ist, ist auch ein Weg“, which basically means if you truly want something, there’s a way to get it.I’m so exhausted because I find all this installing, updating, and setup stuff just so boring.A devlog with my to-dos is coming tomorrow or on Friday because I’m getting my school report card tomorrow — wish me luck!And here’s a screenshot of my really ugly site at the moment. If you read this whole thing: thanks for listening to all my yapping .💗💗💗💗"}]...
|
Title: Neverland OS by @253_Mathilde_IYKYK | Stard Title: Neverland OS by @253_Mathilde_IYKYK | Stardance
Devlogs:
Guys, this has been so hard. And I don’t mean the project — I mean the file. I know that no one is going to read this, but I want to share my struggle so that my hard work has a reason.I just finished my first project, which I did with the VS app. But now I needed to open a new project — after half an hour, I somehow managed it (still don’t know how). Could somebody explain that to me?Then the Hackatime tool stopped working, and Stardance couldn’t find my file. So I decided to switch to my laptop because I hadn’t installed the app there yet, and I already knew what to do from my first project. I needed everything on my laptop anyway because of the holidays, etc.My laptop only runs Windows 10, so everything took ten times longer. After that, I had to delete some apps because of storage issues. As you can see, it just kept getting more complicated.I finally did it — after six hours, without appreciation (you know, from Stardust…) and actually crying twice because I already had code, but it was gone.I don’t want to annoy you with my problems. That’s my site for now. Please don’t judge — I’m following the tutorial, and I’m going to add beauty to it at the end when the code is finished. I already have so many ideas.I’m giving my best and forcing myself to keep going. In my country, there’s a saying: „Wo ein Wille ist, ist auch ein Weg“, which basically means if you truly want something, there’s a way to get it.I’m so exhausted because I find all this installing, updating, and setup stuff just so boring.A devlog with my to-dos is coming tomorrow or on Friday because I’m getting my school report card tomorrow — wish me luck!And here’s a screenshot of my really ugly site at the moment. If you read this whole thing: thanks for listening to all my yapping .💗💗💗💗
Okay, soo. I just read the second tutorial and literally made it the same as in the tutorial. I knew I wasn’t supposed to do that. Yes, I’m changing it in a second. I’m just brainstorming a bit and sorting out my ideas for the design because my last project had that Y2K vibe (iykyk), but now I want something cleaner — not like those old, ugly operating systems back in the day. Still, it should keep some of those nostalgic vibes, you know? I can’t really explain it better.So yeah, I think I’ll need about an hour or two — let’s see if the universe is on my side and I find the graphics I want quickly! And guys, I’m suffering — I miss my Windows 11 from home, but I think I just need a little more time to get used to Windows 10 on this laptop. I don’t really have a choice since it’s just me and my laptop for the next month.Also, I registered for this chat thing (I forgot the name) and got nothing. Like, how many chats exist on this planet? But I think I’ll get through it tonight. :)
Hi! So I already had the code in my last update here, but I finally changed the graphics and the design. I’m not finished with the desktop yet (don’t worry, I know how it looks!), but I just wanted to give you a quick update.
So, what have I changed? First, I changed the heading because the “S” looked like an “f,” which would completely change the purpose of the website — I just noticed that, hahaha! Imagine if I had shipped it like that in the final version. Anyway, I also added that cute cursor (it’s a tiny Tinkerbell). I loved this idea the most because it lets me make my website both modern and whimsical.If you don’t know who Tinkerbell is: she’s a cartoon character from a kids’ series who lives with other fairies and struggles to find her powers. I thought it would be fun to combine her with Peter Pan — also a children’s story about a dream world where Peter Pan secretly visits kids at night and they all fly through the sky to a magical place . I didn’t watch the Peter Pan series as a child, but I read the books, so I chose Tinkerbell because I could picture her better in my head. Maybe we just pretend they got married.Why am I talking so much about these characters? Because my whole OS is meant to match that vibe — so you can understand why there’s a random fairy on a modern site. I’ll make it easier to get what this OS is about as I go further with the project (you know, adding features like a calculator, etc.).I also added my favorite feature again: a new highlight color! That ugly blue is finally gone from this beautiful site. I linked my profile at the top too, so you can click on my name now. I mean, if you’re going to include info on a site, you might as well do it right and add a bit more about yourself than just your name.So yeah, that’s my desktop for now. I’m going to work on the README today too. I wanted to get further today, but I think it’s okay — you know how much time I spent on this.Thank you for reading all of that and for your interest in my project!
Okay, so I just coded a bit more and made a temporary README. I’m going to create a new picture for my project and improve my profile a little, but that’s it for today.✨ BYE ✨
So I started the third tutorial.I am at the part where you should be able to drag your window.The code is from the tutorial ,so it should work but I think that I have done something wrong because as you can see nothing happens.I am on the go right now and maybe I can squeze some time for programming in later.I have my code updated in my github thing ( it is linked in the project I think) .Could someone help me please.I am really new with JS and I do not have enough time right now to start from the starting point.Because I am in a rush I do not have time to correct this text .I am really sorry for my grammar and all this stuff.
Guys, I finally got it! A big thank you to @nokira . I needed a bit more time to fix everything, but yeah — there were some more mistakes that I finally started to correct. I still need to fix a few things, like the graphics and the z-index, but I’m sooo happy that it finally works!!!!
So, I did the JS and the HTML for the close and open feature. I also changed the graphic of the handle. I’m really sorry that I only log such short sessions, but I currently don’t have much time for coding and can only squeeze in short amounts of time.
So, I added the three little symbols at the top, and I started working on my app. Right now it looks the same as the welcome screen, but I’m going to change that tomorrow.My plan for tomorrow is to finish my first app and maybe even start working on the final README (you know — the banner and everything).
So, here is finally a DEVLOG that logs over an hour of work. I did my best today, but unfortunately I’m typing only with my left hand as a right‑handed person because of a small accident. Yaayyyy (the universe is really not on my side).I can now finally drag the two windows separately (that didn’t work yesterday), and I can close them. I’m not sure if it’s supposed to do nothing when I click the “Open” button.For better understanding: Yellow is for dragging, red for closing, and green for opening.I think I have another bug, because when I click on the app icon, nothing happens. If you have any idea what might be wrong, please help me in the comments or on Slack.I also wanted to work on the README today, but I’m not sure how long I can keep typing with my left hand. We’ll see. I’m trying my best here — thanks for reading all of this.
Thanks to the help from @nokira , it now finally works. Unfortunately, I cannot code any further today, but we are hopefully going to finish the app tomorrow.
So today I could finally finish my journal app (in the tutorial it is a notes app). Unfortunately, I did not understand the tutorial so well with the app, so I decided to find a tutorial myself and use that. It took me longer than expected, but here I am now. I already started working on the graphics (Yesss, they are all made by ME). That took me about 3 hours. These hours unfortunately do not count, but I want to give my best and really make that project cute.The plot twist is that the apps do not look like the apps that everybody knows. They are supposed to look like the real thing, and I want to combine that with the whole Peter Pan/Tinkerbell theme. So yeah, I am going to do the README now, and tomorrow I am going to read the last guide even. I do not know if I am going to use that guide or what even is in that guide. I am also going to change the graphics in the notes app. I really hope that that journal app of mine has the same functions as the app from the guide and that it is okay that I did my own one. Does somebody know that?? Thanks for reading this entire thing. Sorry for the start and the quality of the video.My Internet Connection is at the moment really bad
Hey, so I now upgraded graphics and stuff from the Journal app. I still need to change some details like the heading of a note you wrote (currently it is blue and really tech-like) or the text in the starting window. I also changed the font from the app name under the app icon. I also upgraded my JS, so now you can write a note and refresh the site, and it will still be there. You can also edit or delete that existing note with only one click. When you refresh the page and there is already a note, you will not see the introduction to the app again. I am going to do the graphics for the README now (the graphics for the Journal app were about 3-4 hours, so I really locked in today), and I will also add some more links to it. I am also going to try to change some details today. But the final steps and the final written README are coming tomorrow. So if everything works: Tomorrow is shipping day!!! Thanks for reading all of that and having interests in my OS. And again: Really sorry for the bad video…
#concept devlog Hey. So I just finished my README and my site. The time you see here only reflects the hours I spent coding. The README took way longer than the code, but to me, the README is just as important as the code itself. I’m going to ship everything in the next few minutes. Hope you like my work! If you want to know how I did everything, check out my README — it’ll make all the effort worth it. Thanks for reading this DEVLOG, and keep in mind: this is just Mission One. This project will get better and bigger in Mission Two. If you want to know my plans or first ideas for Mission Two, read my README. This DEVLOG was corrected and improved with AI
Hey so I do not know if it only works on my laptop but you should be able to drag the window when you click and hold the yellow heart.Could someone please try it???
So I now changed the CSS for the icons and started adding a search bar connected to ecosia. Ecosia is like google but it plants trees every time you use it.Because I do not know if I can change the index also in my GITHUB (yk I am still waiting for the mission thing) you can only see the changes on a screen. It works right now but I still need some changes to make it look better.I made the whole brainstorming for the site yesterday so I think I am going to share that today too.Thanks for reading this DEVLOG.
So I now improved the search bar and the dragging thing because now you cannot drag a window into the top bar. I also changed the icons and added a new app with a matching app window.The window is a mix from the Journal app and the welcome window but I am going to change that soon.I also changed the color of the clock and added a background to the apps.I finally made my CSS a own file so now the HTML is a little bit shorter and more organized.I am going to work on the window from the CD’s app later today and I am also going to share my brainstorming for the site.Thanks for reading!!!
#concept Devlog So as promised here is the brainstorming for the whole site. I also have the brainstorming for the apps but you need a little bit of patience because I am only going to share these when making the actual app.I also started on the music app and it looks really cool.Everything is coming together slowly and even when I am not even at half of the time I am going to spend I am soo happy.Hope you like the brainstorming-and yesss it is BRAINSTORMING you guys so please it is not supposed to look like the Mona Lisa.Thanks for reading all of this !!!
So I started changing the window for the music app and I also started making all the graphics.That took about 6 hours so these 2 hours of code time are such a tiny bit of my actual work.Hope you like the style and see the vision for the app. Sr for the bad vd my Internet is still veeeeeery slow and it is just sucks :)
So I added a Pre-Loader.I know right now it does not match the vibe from the site but I am going to change that at the end.Changing it is pretty easy ,making it was a little bit harder.I am going to work on the music app today but right now I need a little break.When you have ideas how I should style the Pre-Loader: Leave a comment!! Thanks for reading <3
So I started working on the top bar.It now has quotes that change every 10 sec and that move so the text is animated.My plan is it to finish the top bar and all these details and then start working on the apps.I am pretty sure I will change the graphics when I am done with the app but that is really easy to do and I first need the code for these elements.
I added a little timer. It’s a simple one — it only counts minutes, not seconds or hours — but it’s enough if you want to have a short learning session or keep track of a small task. It’s not an app; I wanted to keep it simple. I also added the divs for the other tools in the top bar, and I included a small GIF for the map feature (check my DEVLOG with the brainstorming if you don’t know what I mean). Maybe I’ll start building that today, maybe not. Thanks for reading this DEVLOG ❤❤
So I added the little star map thing (same here,if you do not know what I mean or what the plan for this project are : check the DEVLOG with the drawing) and fixed some little mistakes.I think I am going to start working on the hardest part in the info-top-bar-thing :The little weather widget.The problem is that it is supposed to get you location and to show the weather in the right number thing ( yk F and C ).Let’s see how long this will take! Wish me luck and thanks for reading this DEVLOG!!! Sr again for the vd my situation has not changed :( and I also showed all the other features in this vd
Well, that looks like an OS! I got the little weather application for the top. Yayyyy. And I also added the icons for the apps and also connected them to their own windows, so now only the app content is missing. I am so happy right now that everything works! The complicated part is not even close (yk the game and the music app), but I am going to change the design from the welcome window (check the drawing for the vision). The apps are in a div container where you can scroll, and I really hope you like it! Maybe check it out in real life when you are interested. Thanks for reading!!!
So I changed the welcome window.It is not perfect and not finished do not worry but it is enough for the moment.It was quite hard-yk with the grid and everything because I had never done that.I need a little break from the grid thing so that goes on the list for the things to do in the end.Hope you like the styling idea.Thanks for reading!!!
So I pulled myself together and changed the welcome window.I will work on the camera app now but what do we think about the desing from the welcome window ? Should I leave it as it is or should I change it ? Yk it is the first impression you get when you go on my site.Thanks for reading and your interests in this project.
So I added the base for the galerie.I just need to add a slideshow thing which is going to be a little hard because I already have 2 and I need to add the 2 buttons to switch between the images.I am giving my best to squeze in coding time but the graphics themselves take a lot of time.Thanks for reading!!!
#concept Devlog All I can say:The galerie app is finished ! You can check it out or wait until I post a DEVLOG which shows more details.It was squite some work and now it is time for the next point on my todo-list:the TV.I am so happy and grateful for all these people watching my DEVLOGS and for all these kind souls who are staying with this project since minute one.Thank you you all and I really hope you like it!!Thanks for reading <3
So here is the camera app! As you may can see there are two little buttons that look like real camera buttons. I added little arrows but I think they still look real.Right now we have like 22 photos on our digi cam.And well if you scroll through these screens you may see the TV app because I also finished that.I think it also looks pretty cool ,tell me what you think about it in the comments!! It only has one vd right now(yk matching to the theme if you are interested check out the real site).I may add more in the future but not until this project is finished.So these 2 apps are now ready and the next thing on my list is the music app.Happy to hear or see some feedback (If you all really hate it I am going to change it tho but I really gave my best).Thanks for reading <3 🔗 253-mathilde.github.io/My-first-OS/
Okay so I just started with the game.Actually just started is a huge lie because I am struggeling since 10:00 and we now have 17:00.I used a tutorial and tried to just start basic with making a little jumping game but the objects …They do not exist because the whole generating thing does not work .I first need to get everything working before upgrading the graphics and stuff.I really would like some help! CSS: #background { position: absolute; background-image: url('https://files.catbox.moe/xqsbzm.png'); height: 200px; width: 100%; animation: slideright 600s infinite linear; bottom: 0;}.wendy { background-image: url('https://files.catbox.moe/u52u37.png'); height: 60px; width: 60px; position: absolute; bottom: 0;}.obstacle { background-image: url('https://files.catbox.moe/n5f03w.png'); width: 60px; height: 60px; position: absolute; bottom: 0;}@keyframes slideright { from { background-position: 0 0; } to { background-position: -10000px 0; }} HTML: <div id="gameWindow"> <div class="base5"> <div class="symbolegame"> <p id="galerieWindowheader"> <img src="https://i.imgur.com/Y4OL1On.gif"></p> <p style="cursor: pointer" id="gameclose"><img src="https://i.imgur.com/q5TmYNg.gif"></p> <p style="cursor: pointer" id="gameopen"><img src="https://i.imgur.com/3nBda2J.gif"></p> </div> <div id="background"> <h6 id="alert"></h6> <div class="wendy"></div> <div class="grid"></div> </div> </div> </div> </div> JS: document.addEventListener('DOMContentLoaded', () => { const wendy = document.querySelector('.wendy') const grid = document.querySelector('.grid') const alert = document.getElementById('alert') let gravity = 0.9 let isJumping = false let isGameOver = false function control(e) { if (e.code === "Space") { if (!isJumping) { jump() } } } document.addEventListener('keydown', control) let position = 0 function jump() { isJumping = true let count = 0 let timerId = setInterval(function () { //move down if (count === 15) { clearInterval(timerId) let downTimerId = setInterval(function () { if (count === 0) { clearInterval(downTimerId) isJumping = false } position -= 5 count-- position = position * gravity wendy.style.bottom = position + 'px' }, 20) } //move up position += 20 count++ position = position * gravity wendy.style.bottom = position + 'px' }, 20) } function generateObstacles() { if (!isGameOver) { let randomTime = Math.random() * 4000 let obstaclePosition = 1000 const obstacle = document.createElement('div') obstacle.classList.add('obstacle') grid.appendChild(obstacle) obstacle.style.left = obstaclePosition + 'px' let timerId = setInterval(function () { if (obstaclePosition > 0 && obstaclePosition < 60 && position < 60) { clearInterval(timerId) alert.innerHTML = 'Game Over' isGameOver = true //remove all children while (grid.firstChild) { grid.removeChild(grid.lastChild) } } obstaclePosition -= 10 obstacle.style.left = obstaclePosition + 'px' }, 20) setTimeout(generateObstacles, randomTime) } } generateObstacles()}) Thanks for reading<3
Okay so I hope that I do not dissapoint s.o now.I deleted the whole thing that I had so basically a whole day of work because there is always way more time behind everything that you think.I did that because I could not find the mistake and I did not really get the code.I never really did JS before this project and I am learning JS while doing this project.And I mean really learning because I kinda eat the whole W3 school site but yeah.I want to give my best in this project and if I cannot find the mistake in my own coding:I would need AI.And do not get me wrong but help from AI okayyyy but a whole app made with AI.No.No.And no.That is MY opinion so yeah if you do not think so or use AI a lot then do so (it is okay but not for me).I give my best to be transparent and always say when I used AI.The plan is now to build like a flappy bird game but without the top part and to make it look cool.I hope you can understand me and stay with me on this project because we are now getting to the hardest part.This will take some time but I will not quit.Thank you for reading(I do not think that s.o will read all of this but yeah).
Okay so here we are: We have a WORKING mini game that looks like trash! And I am sooo happy.As you can see there is an object that you can control with the arrow up key (hope that is the right english word for that).And we also have like blocks that are generated and have a random height.Yayyy.So we only need to do the styling and add some JS that ends the game when you have a score from xxx (I already have a score in my JS so that should not be so complicated).I am so happy right now and I think it was the right decision to start over.Thanks for reading and sr for all these bad vd’s,they will get better soon.<3
Okay so I started doing some CSS and made some graphics.Right now the background is too full (yk the focus point from the game should not be the background) but like the keyframes work and I added that frame.I will chnage the elements from the game but I will not change like the frame because I think that the frame looks pretty cool.We still need to do the JS and to change some stuff but I think that I will get that done in about 6-8 hours.Unfortunatly I do not have 6-8 hours the next days.I will give my best to squeze in some time but yeah: Sr for the bad vd but like I do not even use that other tracking tool because my laptop is just soooo slow with it and like recording and all the animations and windows that are open-it almost collapsed so srrrr Thanks for reading and if you have styling ideas for the game:leave a comment or write me on Slack <3
So I did some JS and spent way too much time on the graphics.It now shows a message and hides everything when you reach a score from 100.I still need to do something for the like game over part.Hope you like the design because that will stay the same I think.Thanks for reading <3
I added something like a pre-loader-thing that shows the info for the game everytime you open the game window for 30 sec.I now that it is kinda annoying that I only log such short times but I just squeze in every tiny bit of time I have and the graphics also take pretty long.Thanks for reading <3
Okay so the game is kinda finished! I now have a game over screen and a finished screen and a like maual or pre-loader.Everything is explained and I myself think that it is like the right level of easy but still a little bit tricky.You would help me a lot with trying it out and giving me a short feedback. ( https://253-mathilde.github.io/My-first-OS/ )Thanks for reading and here are the picture of the game app:
#concept Devlog AND SR FOR LIKE THE LOOKS AND THE GRAMMAR OKAY WE HAVE 37 DEGREES AND THIS IS JUST A VISION IT IS NOT SUPPOSED TO LOOK PERFECT!! Okay so I now started working on the music app and yeah it looks sooo funny right now(yk to see the switch from all the clean and perfect things to THAT)but I mean everything works for now so we just need the styling and the menu.That is such an easy thing to say because actually:The graphics take me sooo long.There are about 20 hours that you do not see and thanks to the universe catbox is not working right now and that means I have to use postimages and it works but like the pictures load sooo long.Hope it works soon and if you have like song wishes for the app:leave a comment!Thanks for reading and here is my vision:
Okay so we now have a working thing ( the play and stop button needs some work because right now it only works if you do not use the back and forward buttons) and as you can see I changed the graphics and what you cannot see is that it rotates like a real CD! I started planning the menu cause it will have the shape of a half circle so I do not have quite an idea how I will do that but we will see.Thanks for reading and right now I only have the example music from the code I used so if you have music wishes:leave a comment.Thanks for reading <3
#Concept Devlog ( infos about the planning and the vision I will mark them now so you can choose yourself if your interests are only in the progress or also in everything behind the finished page )Okay so today was a planning day. Again.But you need to trust me because if you don’t have a plan than you won’t have a good project because I have multiple apps and I want everyone to be perfect. So over the time more and more little mistakes or things that just feel false appear.And I mean I already used so much effort so why should I throw that away and make it unperfect? A lot of new problems also appeared because I now saw the site on a bigger screen (yk laptop VS PC) and it just looked terrible! And the music app is not finished and because that DEVLOG is already really long: there will be 3 more apps.Yayyy.They won’t be too complicated because they will base on already existing sites so it should be done in about 10 hours but before that everything needs to be done and as you can see that is a long list and every task will take about an hour at least.We have round about 28 tasks btw.It will be a long journey and I think that we are not even close to half of that so if you really read all of that: A really big thank you because you have true interests! Thanks for reading<3
Okay so here is what we have now: I added the final things for the apps, and I also changed the layout so that the backgrounds only repeat horizontally and not vertically. I also worked on the screens for the app and, of course, on the music app. I need to pull myself together so I do not start with any other app before I finish the music app. I also worked on the graphics as always, and we now finally have better vd, and everything is just better. Yayyyy.Thanks for reading <3
I NEED YOUR HELP!!!! Okay so I started working on the menu. It works already but needs some better styling. So you can see the vision: The red circles are going to be little CDs like the one already existing. But I need your help because I do not know how to make the control buttons (the styling), so here are like 3 versions of it. Hope you can see the vision and may help me choose (and of course the buttons will be buttons, not words, but yk it is just so you can see what my vision is). Thanks for reading <3
I worked on the preloader for the last 7 hours, but because of the browser update in 2025, an alert does not count for autoplay with the audio, and I still need a solution for that. Here is the MP4 of the preloader with the audio. I hope I will get that with the audio tomorrow. At least the video is working with the alert. Hope you like the graphics (they took soooo long, and yes, everything is self-made, so no Google copy and paste). Thanks for reading <3
Here we finally are: It works. With sound. And autoplay. And the alert. And I am soooooo happy. It took me the whole day, and I needed to do stuff that I had never even heard of, but thanks to the internet and my ability to read, I finally got it. So you can understand that better: I started at 8 am in the morning and finished at 4 pm in the afternoon. As you may understand, my patience for the music app was not enough, so I built 2 new apps instead. That sounds a little bit crazy, but because these are based on a webpage, it only took about 3 hours each. I still added a little window that explains everything, and I hope you like the result. I got so much kind feedback for the pre-loader and in general; I am getting so many nice comments. Thank you for that, and I hope you like the result and see where we are going! Thanks for reading. <3 The vd is pretty bad because I had to compromise it, so maybe check it out in real life or wait for a DEVLOG with a better VD.
Okay, so like, I started on an app, and I can’t try it at the moment because GitHub is testing my patience, but yeah, the app is the manual app, and it looks like a book, and you can actually flip pages. It is just annoying that I can’t work correctly because of GitHub, but I don’t have another chance; I just need to try again and again and again: And because I do not know if my code even works, I can’t even continue with another app like the music app. Thanks for reading <3
Okay, so GitHub is still broken, so text will have to do it. I added the Wikipedia and manual apps. And I also wrote the whole manual. That was quite some work, and I also fixed parts of the JS that were not really stable. I am so happy that it works now because I almost deleted everything today. In the end the problem, why everything did not work, was a missing close div thing. I spent the whole afternoon till now searching for that. It is midnight. I started in the afternoon. I feel really dead right now. Tomorrow I really need to do the music app. Thanks for reading <3
Okay, I worked on the manual app more, and you now can slowly see where we are going. That took me super long because I also did all the graphics and the effect where the image turns and gets bigger the second your cursor touches the image. Hope you like the graphics and the little tinkerbell on the cover. I know it is not perfect because the book is already open when you open the app, but I think it looks okay, and I can’t change it because of the symbols (they would look pretty bad on the next pages then). I also need to change the back site, text and next buttons. Btw, I now have over 300 commits on GitHub and 69 hours on Hackatime, and the project has been active for 32 days (started on 7/7/26). Literally, over a month and one devlog got over 2000 views 🥹. Thanks for reading and always helping me out <3
I think the manual is now finished. I know the CD site is not finished, but neither is the app. When I am finished with that, I’ll update the manual. I also added that star effect that shows when you click on the star thing on the last page. I also made some Easter eggs, like hidden sounds (for example, the first audio that was taken on Mars plays if you click on the green heart in the map window, which is also hidden), and I made the tab name of the OS a little game (I don’t know how to call it; it basically just moves and looks pretty). Hope you like the app; I’m always happy to hear some feedback, and now I finally start working on the music app. Thanks for reading <3.
Ahhh, I’m freaking out. The music app is finished!! Finally. It took me so long. Yes, I still need to add more songs (we only have the 3 from the base I used), but the whole layout is finished. Everything that comes now is only details and grammar and such stuff, but that was actually the last line of code for this project (yk, I now only need to repeat or fix things, not write something from scratch). In the app we have a slideshow at the beginning, a moving CD (spins), a menu that comes up front if your mouse touches it, a back button for the previous song, a next button for the next song, and a play and pause button that changes (yk, if the music plays it is ‘stop’ and if not it is ‘play’), changing song names and, of course, changing artists names. That app was the most challenging of all. Hope you like the design and everything! It would really help if you tried the site https://253-mathilde.github.io/My-first-OS/ and looked if everything works, but please respect that I am working on the grammar. Now we are finally getting to the last part!!! Thanks for reading <3.
That is just the first page.I’m waiting for two hours.I can’t even cancel them.Why always meeeeeee.I just made a folder to make it organized localy and when I uploaded it from the app ( yk the push and pull ) this happend.Yeah that takes sooooo long and btw I added more songs and made some things a little bit cleaner.As you may can see I can’t show you anything right now.Thanks’s for reading <3
Concept Devlog Okay so I know it looks like I haven’t worked on this project for the last two days but Actually, I have worked non-stop for the last two days. I got some feedback for my site, and I am still open for some feedback. I really struggled with GitHub and ended up renaming every file in my project, and yes, I needed to do that individually and wait every time for about 10 minutes. Now more and more images are getting changed from Catbox to GitHub because someone said that I should reduce the loading time. I myself don’t like using GitHub for images and stuff because it is sooo much work with the folders and stuff, but you wanted it so, so I changed it. I also changed the manual because I also got some feedback for that. I also will upload the Pixabay songs to GitHub but not the ones from the tutorial I used because I don’t know where this music is from… That should reduce the loading time from the music app. I also found a lot of details that are not perfect so I also will change these but these are mostly little things in the user interface. I really gave my best the last days even though I can’t use Lapse for time tracking because it does not work with my laptop. Oh, and I almost forgot: the OS is made for smaller screens with a browser window width from 1400 px (I don’t mean the width of your screen), so I would Be really happy to know how bad it looks on other screens. I am really sorry for that but can’t change that because my CSS is 1600 lines of code and I often used position: absolute;. I am a beginner and will work with the percentage the next time! I promise. Thanks for reading and your patience with me. Check out the site at the moment, but please respect that the manual is not quite finished and the text can look a little bit misplaced sometimes. https://253-mathilde.github.io/My-first-OS/ Thanks for reading <3
Check it out https://253-mathilde.github.io/My-first-OS/ Okay so today I added the last song to the music app.I also changed the font in the welcome window and wrote more text/changed some stuff. I also added better img to the galerie so now everything looks clean and everything is so close to being finished. I know I say that every day but you get a different point of view when you have over a month of work in your head VS just 3 or 4 more days. I am soooo happy with the font in the welcome window because the other one was more tech and this is more fairy-like. If you have a different opinion or absolutly hate it : say something! As you can see in the last DEVLOG I changed a lot based on feedback so yeah. I also changed the songs that are mine (not the ones from my base code) to github so now the img may load a little bit slow, but the sound should work great.I also made all the img links in the galerie app to github links( I downloaded everything from catbox and uploaded it to github and then change dthe file name and then re-run every job). I love how the music app turned out and looks when other windows are opened. Hope you like it tomorrow is going to be grammar and manual day because these things are just as importent as the coding.And when I work in my schedule, the day after that is README day and correcting graphic days.That would mean we ship in 2 days. I’ll give my best to find enough time for that.Thanks for reading <3
Okay so I never want to see a link in a HTML project again for at least the next 2 weeks because I now added the image sources to the manual, and that was just some crazy work. I myself always keep every source throughout the whole project but that meant that I had 15 pages full of links and I only needed the ones for the images And some were even unnecessary because those images were deleted from the site through the whole project. I know this site is probably the ugliest one in this whole project but also one of the most important ones. I also worked on the grammar. There might be some little mistakes but I wrote it. English is not my mother tongue, and I typed far more than just a prompt into an AI. I also checked the mistake with the YT video but couldn’t find one. It would really help if others also checked if the vd in the TV does not work. Tomorrow is README day. We are really there. I still can’t believe it. And someone wrote me on slack that you can review your own project with any AI, and the AI really liked mine so fingers crossed that the first ship will get approved And my work paid off. Thanks for all your support, and I would really appreciate your help with the TV app. Thanks for reading <3 Here is the link: https://253-mathilde.github.io/My-first-OS/
Last Devlog (hopefully). Okay so before you judge me because I promised that I would ship yesterday: This README is massive and I gave my best to make it short but still well explained and yeah this was just so much work.Hope you like it. The TV should also work now.Finally, so maybe try it! https://253-mathilde.github.io/My-first-OS/ . I think that I’ll ship today. I really hope that everything works so pleaseeeeee I need some feedback. This project is just crazy and so many already like it.Can’t wait to see what you say to my next projetc idea. Thanks for your support and can’t wait to hear all the feedback. SO many hours of work.Hope they pay of.Thanks for reading <3.
Okay so I think I ship now ,just made some small changes (so my code is better to understand by others) and somehow they turned out to be an hour so yeah time to ship.Thanks for all your support and figers crossed that the first ship works!
Ships:
I made a Peter Pan and Tinkerbell-themed OS. At the beginning, the JavaScript was really hard because I had only worked with blocks of code, not actual code (maybe you know code.org — that’s what I mean). The graphics took me quite some time, as did all the brainstorming and planning, because I did my best to create a good structure. I explained the whole idea and the thought behind the theme in my README. On my site, you have two draggable windows (the Welcome window and the Journal app window), and you can write stuff in your little journals and create islands. (I also explained that in my README, but if you don’t want to read it: an island is a note, and I called it that because of the site’s theme.) My site also has a little slideshow in the Journal app that explains how to use everything. My Stardance profile is linked too, so you can check out my other project. The site also includes a timer at the top. I hope you like it, and I’m already collecting ideas for Mission Two. This text was corrected with AI.
Neverland OS is a web-based OS with a Peter Pan/Tinkerbell theme. Unlike other operating systems, Neverland OS doesn’t prioritize either design or performance. It tries to be good at both. It has a Notes app, a Music app, a Gallery app, a Game, a Video app, a NASA app, a Wikipedia app, a Hubble app, and a User Manual app. It also has mini apps like a search bar, a timer, weather, and more. My goal was to create something that looks unique. Because when we program, we often have other operating systems in our head. So we automatically put things where we are used to seeing them. But who said that window controls need to be on the right side of a window? And who said that all apps need to look like the ones we use every day? Don’t get me wrong. Those operating systems work great. But they already exist. So why not try something new? Neverland has a lot of hidden features (aka Easter eggs) and was built to have everything you need. Sometimes you don’t need a lot of apps. Just a music app to keep your focus up, a timer to motivate you, and something to write in. Of course, my OS can do way more than that. But when you are honest with yourself: you don’t really need much more than that. But who said that just because we don’t need that much, we have to work with ugly minimalistic stuff? Exactly. No one! So I gave my best to make it look cute. I hope you like it. And if you don’t, let me know! I often struggled with JS because I basically started from 0 knowledge. The Music app was especially difficult because it is so unique (yk so finding help online was impossible). I deleted stuff, made mistakes, broke things, and redid the graphics many times. There are way more hours in this project than you can see ( because I builded this thing on my old laptop in my holidays and that laptop breaks down everytime you use lapse). I took this project everywhere and spent almost every bit of free time I had on it.I worked on Neverland for 42 days. During that time I made over 500 deployments on GitHub, over 600 commits on GitHub, uploaded things millions of times because of GitHub issues, and wrote around 3,500 lines of code. I also tried my best to be transparent about the whole process. I wrote a Devlog about roughly every 2 hours. All instructions are in the OS or in the README. I gave my best with everything: the code, the graphics, the storytelling , the Easter eggs, and all the little details. I hope you like Neverland OS and have fun trying everything out. Sorry for my grammar or language mistakes. English isn’t my first language....
|
1792824509.4238722
|
1792910909.4238722
|
|
3794
|
RTX Minecraft Shader by @DubbsPi | Stardance
|
DubbsPi
|
1
|
77.0
|
1308
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-08T16:35:23Z", "hours": 77.0, "multiplier": 16.95, "payout": 1308, "blessing": "neutral", "text": "This is a custom minecraft shader I made. I first started with the Iris tutorial, but this project quickly expanded with a bunch of high end features, such as raytraced reflections! I’ve always kinda been annoyed with screen space reflections, so I thought, how hard could it be to just make them world space? Turns out it was way harder than I expected and took way longer as well. Overall, the result of my shader turned out pretty good, but it is not gameplay focused/to be used outside of demos in the overworld. I hope others may even build off of my progress to start integrating advanced reflection features like I have. This project greatly helped me improve my shader skills/taught me how to use the vertex and compute shaders (my only prior shader experience is on shadertoy) to produce nice results. The hardest part for me was probably setting up the BVH for RT acceleration and actually starting the project. Apparently minecraft has a lot of little overlapping transparent textures setup to perfectly rasterize, but to trace them causes a lot of precision related bugs, hence the reason I was forced to cheap out a little on grass blocks/tall grass. Also, the BVH resolution is limited due to performance constraints, causing overlapping triangles to clip infront of each other constantly, but that issue is mostly nonexistent for non transparent triangles, like buildings and such. In the end, I’m happy with the result and couldn’t have asked for a better long-term coding project!", "repo": "https://github.com/DubbsPi/My-Minecraft-Shaderpack", "demo": "https://www.curseforge.com/minecraft/shaders/basic-rtx-shader"}]...
|
[{"post_id": 43388, "ts": "202 [{"post_id": 43388, "ts": "2026-08-08T16:27:45Z", "hours": 7.6336, "text": "Finished fixing up a bunch of small bugs/issues. Also added waves to the water. I deleted my .git files by accident so that took a while to fix. Added a bunch of options to the settings to help reduce the render scale of reflections, which allows this to actually run halfway decently. Couldn’t figure out how to get the reflections to work properly on water, so there will be none there."}, {"post_id": 31865, "ts": "2026-07-20T16:26:32Z", "hours": 3.2281, "text": "We now have some of the most complex handheld lighting in minecraft! I setup a quick light tracing function and inputted the light values for it for each hand, so as you can see there are two shadows being cast. I will add an option in the future to upscale the RTX features since this was taken at 27 fps. I also added bloom and a bunch of settings for it and fixed up the sky ground issues. Now it truly scatters the ground until you hit y ≈ 200 million, then the lowest part breaks ¯ ( ツ)/¯"}, {"post_id": 31520, "ts": "2026-07-20T00:14:26Z", "hours": 3.8397, "text": "you know what, its 98% working. I call that good enough for tonight! I will continue fixing up the various tracing bugs and add entities, but so far this is pretty good! I plan on also raytracing shadows and lights if possible, although I will keep the standard shadow pass for nearby to get cheaper shadow filtering than with multiple rays. A lot of little issues plagued the final BVH build, mostly with me not clearing buffers :)"}, {"post_id": 30981, "ts": "2026-07-19T00:18:09Z", "hours": 6.6114, "text": "Finally!!! I got the radix sort working! The screen shot doesn’t look like much, but if you notice the bar on the bottom, the colors are generally grouped together and are perfectly stable. I had really struggled with getting this to work correctly as I’m not exactly the most experienced with compute shaders (or I should say was, now I know more about them than I need to). I had reached out to the shader labs discord even (thanks to them btw, they helped with a workgroup dispatching bug I had) and ran about every test possible to eliminate any possible race conditions/out of bounds errors. Then comes gemini to save the day. Apparently, I really should have done some more research into atomics in the past since even though they are meant to be stable, they are not perfect in the slightest, so I was basically attempting to do a radix sort without stable ranking (which is what it needs to achieve its insane parallelism and speed) and yeah it works now. BVH time (which should not take long to setup, the radix is normally the hard part), then true RTX features (not just voxelizations) like raytraced reflections and idk I might add a path tracing option since I’ve made a PT on shadertoy before and it was super enjoyable to do."}, {"post_id": 27699, "ts": "2026-07-13T14:19:43Z", "hours": 5.9664, "text": "All I can say I got done in this long session is I optimized the rendering slightly. Not the tracing, just the regular lighting by catching the light colors (since they are from the scattered sky) in a tiny 2x2 texture, but it did give me 80+ fps back when I look at the ground at least. I will also have to redo all the BVH setup and actually learn how to do it all since I was leaning a bit heavy on AI use and something broke somewhere and I couldn’t figure out where. Time to actually code it all QwQ (not really sad, probably a good idea to actually learn it fully)"}, {"post_id": 26101, "ts": "2026-07-10T18:06:01Z", "hours": 0.9642, "text": "Haha I feel evil for being mean to my gpu. I got the full world space reflections working (along with a second bar to show how full my triangle buffer is), although I still have to tweak the entities combining with the terrain, but I mean it runs horribly (better than not at all!). You can’t see it in the screen shot really, but I installed a resolution changer mod that puts me at 1/4 resolution, so 1/16 of the pixels and perf is worse than full res with the entities. Definitely will need to get that BVH/acceleration running soon because or else my GPU is going to blow a fuse :D"}, {"post_id": 25300, "ts": "2026-07-09T14:40:44Z", "hours": 1.5022, "text": "Fixed up performance and small bugs!! I removed the combining of vertices into tris and just did that during the trace. Thanks to less memory pressure I got back around 20 idle fps and fixed the jitter bug (hehe)"}, {"post_id": 24178, "ts": "2026-07-07T16:06:28Z", "hours": 3.9919, "text": "(mostly) Finished a major performance win. I figured out a way to use the vertex shader instead of the geometry shader for everything. The geometry shader is notoriously slow (5-10x) compared to everything else, so by not using, my idle performance has went up several times due to no longer having to slowly process so many triangles. I still have some room for improvement (iron golems are black and some weird new backface visual bugs, nothing severe though) but this is much better than before!"}, {"post_id": 22943, "ts": "2026-07-05T16:32:52Z", "hours": 3.3131, "text": "Got FXAA working! Haven’t finished the acceleration for the RT yet, but thought some minor AA wouldn’t be too hard and look nice! Thanks to Simon Rodriguez for his wonderful tutorial on how to add in FXAA!"}, {"post_id": 21433, "ts": "2026-07-03T11:48:09Z", "hours": 5.2997, "text": "The wonderful world space reflections!! Right now they are only setup for entities and are still unaccelerated (that is why its running 25fps). This one was a real challenge to pull off since I learned the hard way entities don’t have texture atlases. That means for each entity on the screen, I had to manually bake their texture to a custom atlas. I will say, I found a pretty smart way to do it that only runs the bake once and caches the texture. If I ever notice overwriting issues, I can change it up, but it should be good. Also, I made it index based off the texture’s color, so modded entities should be supported :)"}, {"post_id": 20766, "ts": "2026-07-02T13:44:05Z", "hours": 2.1428, "text": "We are starting to get fancy!! I finally got just an entity triangle buffer setup. The reason my framerate is so bad so far is I haven’t setup acceleration yet, but that is going to be next. Its surprising how its actually cheaper (so far) to store triangles than storing the block faces I had earlier since info can be omitted pretty easily. The hardest part about doing this was the fact I forgot to put a vertex output in the gbuffers_entities.gsh so it was erring a ton because I forgot two lines 😁"}, {"post_id": 20450, "ts": "2026-07-02T01:31:07Z", "hours": 1.3664, "text": "After optimizing the voxel buffer some more and the DDA march, I have decided to make my life harder. I plan on moving from voxel marches to actual raytracing with acceleration structures due to the fact as of now, block only marches is limited visually, doesn’t have entities, and breaks very quickly when a block uses a 3d model instead of a standard block. My hope will be to use compute shaders for the BVH building so that should be fast. I plan on doing entities first, terrain later just because then I’m not deleting stuff and for once entities are simpler. Plus once this works its basically infinite quality and actually might be faster."}, {"post_id": 19507, "ts": "2026-06-30T20:37:39Z", "hours": 1.7464, "text": "Got all the shadows in the reflections wired up as well! I also added screen space shadows to stop floating shadows on the foliage, but I set it to not run on blocks since those shadows are normally not floating and this way the most noticeable shadows are soft and without artifacts. I merged a lot of code this time so then WSR and SSR can be used at the same time for more detail (for now, hopefully the WSR will be full detail on its own in the near future). I’m going to ignore the 1.6gb of vram in the one buffer alone issue for now and address extra compression later :D"}, {"post_id": 19290, "ts": "2026-06-30T15:41:18Z", "hours": 3.3058, "text": "Moved world space reflections to a SSBO!! Now they have all the details of the world, but the only issue (which I suppose I couldn’t notice with the lower quality ones before), is 3D models for blocks, since they cannot be voxelized. By moving the reflections to a SSBO in gbuffers_terrain, I was able to get normal shadow mapping back as well! Also I made VRAM storage more efficient - nvm just did the math and using 8 4k textures in RGBA16F was actually more efficient at 1.06gb while the current SSBO requires 1.6gb, but also the 8 4k textures could only store one block face, while the SSBO stores all 6, so if anything, the new SSBO method if I only gave it the same rigor as my setup before, is around 0.27gb of VRAM, way more compressed."}, {"post_id": 18749, "ts": "2026-06-29T22:48:27Z", "hours": 6.0992, "text": "Got these colored world space reflections working. The only thing I’m running into the issues of voxelizing with the shadow pass, so I am going to do a big refactor and move everything into the regular geometry pass, just that may either require the entire scene be rendered or cleaver caching."}, {"post_id": 17365, "ts": "2026-06-28T03:42:47Z", "hours": 0.8519, "text": "Got the DDA reflector going! Its actually running faster than screen space reflections were, and obviously has the world within the radius (which is 128 blocks, pretty good actually since 126/16 is 8 chunks). Just need to add texturing and lighting to the blocks. Actually I need lighting everywhere in the shader lol"}, {"post_id": 17105, "ts": "2026-06-27T19:32:56Z", "hours": 3.4997, "text": "Finally got the voxel buffer setup!! I did it at the cost of shadows, so I might try to add shadows back, or just use the voxel buffer for them. My hope is to be able to use the buffer for world space reflections since not many shaders have that."}, {"post_id": 16356, "ts": "2026-06-26T16:40:20Z", "hours": 3.5428, "text": "Improved SSR and the sky a little bit. Also got LabPBR’s specular mapping working but couldn’t get the normal map yet. Wasted like two hours trying to use AI to help me seutp a voxel buffer for world space reflections. Ended up deleting all the AI’s stuff due to the fact it didn’t really work right and halved my framerate."}, {"post_id": 15941, "ts": "2026-06-25T22:01:37Z", "hours": 2.5308, "text": "Added atmospheric scattering. Honestly it looks pretty good and runs really well so far. Had to have AI help explain a couple of the functions, but other than that I hand wrote it all. Took a while to figure out how to replace the fog, but once I did it turned out really nice!"}, {"post_id": 15811, "ts": "2026-06-25T18:08:53Z", "hours": 3.2617, "text": "Got much better looking reflections setup with screen space reflections. Trying to use DDA before wasn’t really a bad move, it basically gives a ton of free perf, until you put it with something that isn’t a cube or have to march through 300 blocks. I will try to add world space reflections in the future, but for now the SSR is pretty performant and looks nice!"}, {"post_id": 15343, "ts": "2026-06-24T22:51:45Z", "hours": 1.3783, "text": "Got these really nice looking dda reflections going that are basically free, just walking too far away or looking at them wrong or doing literally anything that isn’t his photo looks kinda bad. Also non solid blocks are very warped, but in this ideal situation they looks really nice!"}, {"post_id": 15154, "ts": "2026-06-24T16:55:26Z", "hours": 1.6878, "text": "Got a lot of stuff done - kidding. Just imported a sky function from a old shader I made. Sadly, I could not get waving vertices working yet. No clue how to do those and everything I try either breaks when you move or when you rotate so yea."}, {"post_id": 15097, "ts": "2026-06-24T15:08:22Z", "hours": 1.4875, "text": "Finally finished the tutorial. Honestly its looking pretty good so far for just a tutorial. I think it a few hours I will have quite a bit down to make this look fantastic and run well!"}, {"post_id": 15050, "ts": "2026-06-24T13:24:37Z", "hours": 1.9417, "text": "Getting near the end of the iris shader tutorial. I had zero clue how to actually format minecraft shaders to start, but the tutorial was super helpful. Hopefully using my experience on shadertoy I will be able to apply optimization and beauty to a game of blocks (either that or I’ll be at 2fps and spinning fish quality)"}]...
|
Title: RTX Minecraft Shader by @DubbsPi | Stardanc Title: RTX Minecraft Shader by @DubbsPi | Stardance
Devlogs:
Getting near the end of the iris shader tutorial. I had zero clue how to actually format minecraft shaders to start, but the tutorial was super helpful. Hopefully using my experience on shadertoy I will be able to apply optimization and beauty to a game of blocks (either that or I’ll be at 2fps and spinning fish quality)
Finally finished the tutorial. Honestly its looking pretty good so far for just a tutorial. I think it a few hours I will have quite a bit down to make this look fantastic and run well!
Got a lot of stuff done - kidding. Just imported a sky function from a old shader I made. Sadly, I could not get waving vertices working yet. No clue how to do those and everything I try either breaks when you move or when you rotate so yea.
Got these really nice looking dda reflections going that are basically free, just walking too far away or looking at them wrong or doing literally anything that isn’t his photo looks kinda bad. Also non solid blocks are very warped, but in this ideal situation they looks really nice!
Got much better looking reflections setup with screen space reflections. Trying to use DDA before wasn’t really a bad move, it basically gives a ton of free perf, until you put it with something that isn’t a cube or have to march through 300 blocks. I will try to add world space reflections in the future, but for now the SSR is pretty performant and looks nice!
Added atmospheric scattering. Honestly it looks pretty good and runs really well so far. Had to have AI help explain a couple of the functions, but other than that I hand wrote it all. Took a while to figure out how to replace the fog, but once I did it turned out really nice!
Improved SSR and the sky a little bit. Also got LabPBR’s specular mapping working but couldn’t get the normal map yet. Wasted like two hours trying to use AI to help me seutp a voxel buffer for world space reflections. Ended up deleting all the AI’s stuff due to the fact it didn’t really work right and halved my framerate.
Finally got the voxel buffer setup!! I did it at the cost of shadows, so I might try to add shadows back, or just use the voxel buffer for them. My hope is to be able to use the buffer for world space reflections since not many shaders have that.
Got the DDA reflector going! Its actually running faster than screen space reflections were, and obviously has the world within the radius (which is 128 blocks, pretty good actually since 126/16 is 8 chunks). Just need to add texturing and lighting to the blocks. Actually I need lighting everywhere in the shader lol
Got these colored world space reflections working. The only thing I’m running into the issues of voxelizing with the shadow pass, so I am going to do a big refactor and move everything into the regular geometry pass, just that may either require the entire scene be rendered or cleaver caching.
Moved world space reflections to a SSBO!! Now they have all the details of the world, but the only issue (which I suppose I couldn’t notice with the lower quality ones before), is 3D models for blocks, since they cannot be voxelized. By moving the reflections to a SSBO in gbuffers_terrain, I was able to get normal shadow mapping back as well! Also I made VRAM storage more efficient - nvm just did the math and using 8 4k textures in RGBA16F was actually more efficient at 1.06gb while the current SSBO requires 1.6gb, but also the 8 4k textures could only store one block face, while the SSBO stores all 6, so if anything, the new SSBO method if I only gave it the same rigor as my setup before, is around 0.27gb of VRAM, way more compressed.
Got all the shadows in the reflections wired up as well! I also added screen space shadows to stop floating shadows on the foliage, but I set it to not run on blocks since those shadows are normally not floating and this way the most noticeable shadows are soft and without artifacts. I merged a lot of code this time so then WSR and SSR can be used at the same time for more detail (for now, hopefully the WSR will be full detail on its own in the near future). I’m going to ignore the 1.6gb of vram in the one buffer alone issue for now and address extra compression later :D
After optimizing the voxel buffer some more and the DDA march, I have decided to make my life harder. I plan on moving from voxel marches to actual raytracing with acceleration structures due to the fact as of now, block only marches is limited visually, doesn’t have entities, and breaks very quickly when a block uses a 3d model instead of a standard block. My hope will be to use compute shaders for the BVH building so that should be fast. I plan on doing entities first, terrain later just because then I’m not deleting stuff and for once entities are simpler. Plus once this works its basically infinite quality and actually might be faster.
We are starting to get fancy!! I finally got just an entity triangle buffer setup. The reason my framerate is so bad so far is I haven’t setup acceleration yet, but that is going to be next. Its surprising how its actually cheaper (so far) to store triangles than storing the block faces I had earlier since info can be omitted pretty easily. The hardest part about doing this was the fact I forgot to put a vertex output in the gbuffers_entities.gsh so it was erring a ton because I forgot two lines 😁
The wonderful world space reflections!! Right now they are only setup for entities and are still unaccelerated (that is why its running 25fps). This one was a real challenge to pull off since I learned the hard way entities don’t have texture atlases. That means for each entity on the screen, I had to manually bake their texture to a custom atlas. I will say, I found a pretty smart way to do it that only runs the bake once and caches the texture. If I ever notice overwriting issues, I can change it up, but it should be good. Also, I made it index based off the texture’s color, so modded entities should be supported :)
Got FXAA working! Haven’t finished the acceleration for the RT yet, but thought some minor AA wouldn’t be too hard and look nice! Thanks to Simon Rodriguez for his wonderful tutorial on how to add in FXAA!
(mostly) Finished a major performance win. I figured out a way to use the vertex shader instead of the geometry shader for everything. The geometry shader is notoriously slow (5-10x) compared to everything else, so by not using, my idle performance has went up several times due to no longer having to slowly process so many triangles. I still have some room for improvement (iron golems are black and some weird new backface visual bugs, nothing severe though) but this is much better than before!
Fixed up performance and small bugs!! I removed the combining of vertices into tris and just did that during the trace. Thanks to less memory pressure I got back around 20 idle fps and fixed the jitter bug (hehe)
Haha I feel evil for being mean to my gpu. I got the full world space reflections working (along with a second bar to show how full my triangle buffer is), although I still have to tweak the entities combining with the terrain, but I mean it runs horribly (better than not at all!). You can’t see it in the screen shot really, but I installed a resolution changer mod that puts me at 1/4 resolution, so 1/16 of the pixels and perf is worse than full res with the entities. Definitely will need to get that BVH/acceleration running soon because or else my GPU is going to blow a fuse :D
All I can say I got done in this long session is I optimized the rendering slightly. Not the tracing, just the regular lighting by catching the light colors (since they are from the scattered sky) in a tiny 2x2 texture, but it did give me 80+ fps back when I look at the ground at least. I will also have to redo all the BVH setup and actually learn how to do it all since I was leaning a bit heavy on AI use and something broke somewhere and I couldn’t figure out where. Time to actually code it all QwQ (not really sad, probably a good idea to actually learn it fully)
Finally!!! I got the radix sort working! The screen shot doesn’t look like much, but if you notice the bar on the bottom, the colors are generally grouped together and are perfectly stable. I had really struggled with getting this to work correctly as I’m not exactly the most experienced with compute shaders (or I should say was, now I know more about them than I need to). I had reached out to the shader labs discord even (thanks to them btw, they helped with a workgroup dispatching bug I had) and ran about every test possible to eliminate any possible race conditions/out of bounds errors. Then comes gemini to save the day. Apparently, I really should have done some more research into atomics in the past since even though they are meant to be stable, they are not perfect in the slightest, so I was basically attempting to do a radix sort without stable ranking (which is what it needs to achieve its insane parallelism and speed) and yeah it works now. BVH time (which should not take long to setup, the radix is normally the hard part), then true RTX features (not just voxelizations) like raytraced reflections and idk I might add a path tracing option since I’ve made a PT on shadertoy before and it was super enjoyable to do.
you know what, its 98% working. I call that good enough for tonight! I will continue fixing up the various tracing bugs and add entities, but so far this is pretty good! I plan on also raytracing shadows and lights if possible, although I will keep the standard shadow pass for nearby to get cheaper shadow filtering than with multiple rays. A lot of little issues plagued the final BVH build, mostly with me not clearing buffers :)
We now have some of the most complex handheld lighting in minecraft! I setup a quick light tracing function and inputted the light values for it for each hand, so as you can see there are two shadows being cast. I will add an option in the future to upscale the RTX features since this was taken at 27 fps. I also added bloom and a bunch of settings for it and fixed up the sky ground issues. Now it truly scatters the ground until you hit y ≈ 200 million, then the lowest part breaks ¯ ( ツ)/¯
Finished fixing up a bunch of small bugs/issues. Also added waves to the water. I deleted my .git files by accident so that took a while to fix. Added a bunch of options to the settings to help reduce the render scale of reflections, which allows this to actually run halfway decently. Couldn’t figure out how to get the reflections to work properly on water, so there will be none there.
Ships:
This is a custom minecraft shader I made. I first started with the Iris tutorial, but this project quickly expanded with a bunch of high end features, such as raytraced reflections! I’ve always kinda been annoyed with screen space reflections, so I thought, how hard could it be to just make them world space? Turns out it was way harder than I expected and took way longer as well. Overall, the result of my shader turned out pretty good, but it is not gameplay focused/to be used outside of demos in the overworld. I hope others may even build off of my progress to start integrating advanced reflection features like I have. This project greatly helped me improve my shader skills/taught me how to use the vertex and compute shaders (my only prior shader experience is on shadertoy) to produce nice results. The hardest part for me was probably setting up the BVH for RT acceleration and actually starting the project. Apparently minecraft has a lot of little overlapping transparent textures setup to perfectly rasterize, but to trace them causes a lot of precision related bugs, hence the reason I was forced to cheap out a little on grass blocks/tall grass. Also, the BVH resolution is limited due to performance constraints, causing overlapping triangles to clip infront of each other constantly, but that issue is mostly nonexistent for non transparent triangles, like buildings and such. In the end, I’m happy with the result and couldn’t have asked for a better long-term coding project!...
|
1792821218.2097282
|
1792907618.2097282
|
|
14492
|
Tides simulation by @kuba_ch101 | Stardance
|
kuba_ch101
|
1
|
69.32
|
1308
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-09T18:13:23Z", "hours": 67.0, "multiplier": 19.43, "payout": 1308, "blessing": "neutral", "text": "I made a simualation of tides generated on a planet by a satelite. I made it in C and OpenGL which I compiled(using emscriptem) to WebAssembly and WebGL. Then I added controls to make it interractive. I am verry proud that I menaged to compute the shape of the water almost entirely on a GPU shader. I also made a custom camera system which enables rotating along vectors other than the 3 main axes. The simulation isnt super accurate but it can serve for eg. educational purposes.", "repo": "https://github.com/kubach101/tides-symulation", "demo": "https://kubach101.github.io/tides-symulation/"}]...
|
[{"post_id": 71044, "ts": "202 [{"post_id": 71044, "ts": "2026-09-20T07:39:59Z", "hours": 1.6219, "text": "I added the tutorial, I wrote it by myself so there might be some uncought mistakes left, since English is not my native language. I think I explained it well and now the what some simulation parameters doshould be clear. Drawing is also made by me."}, {"post_id": 66249, "ts": "2026-09-11T23:31:02Z", "hours": 0.7003, "text": "Hello everyone It is my first devlog after the ship. People who rated my project had a great suggestion to make a tutorial, so I got to work. It will be in a form of a toggled window with instructions and explanations."}, {"post_id": 64810, "ts": "2026-09-09T14:19:19Z", "hours": 3.5808, "text": "I added different screen size support and a mobile layout. I also chaneged the UI SO now the whole canvas is likę a trackpad and you can zoom with scroll/fingers"}, {"post_id": 40430, "ts": "2026-08-03T22:52:15Z", "hours": 1.4511, "text": "I wrote the readme and I am almost ready to ship! Photos of progress:"}, {"post_id": 39663, "ts": "2026-08-02T19:50:11Z", "hours": 2.835, "text": "I improved the camera movement by making the rotation not based on the 3 main axes and instead based on the new ones created by the movement on the touchpad. It was quite hard to integrate everything but now the camera moves verry smooth. I also fixed a bug in the fragment shader which was breaking the alpha value of the oceanand now it looks much better."}, {"post_id": 38164, "ts": "2026-07-31T12:42:44Z", "hours": 9.9228, "text": "I added a UI to the web page! It features: -camera controls: rotating, zooming and home position -simulation parameters which you can change with sliders. Everything is conected to the simulation via “cwrap”, which makes you able to use some of your functions, from the c program, in java script. I went through multiple layout and I am still not shure if I will keep this one. This was my first time building something like this so I took some help from the AI while making the trackpad and the sliders."}, {"post_id": 30380, "ts": "2026-07-17T21:15:25Z", "hours": 3.7669, "text": "I added a trail behind the satelite to make this more interesting and a direction indicator(which you can turn off) so you know where the satelite is when you zoom in. I also started working on the shell file which basically grabs the render and ads html features. All the info and other thing will be in this grey area(for now, maybe I will change them later)."}, {"post_id": 29838, "ts": "2026-07-16T23:55:00Z", "hours": 2.7969, "text": "BIG NEWS! I was finally able to convert my C code to WASM using emscripten. I run it on local hosted server but I still cant make it work on github pages. I also moved part of physics calculations to a specified shader which should significantly boost the performace."}, {"post_id": 29122, "ts": "2026-07-15T19:47:38Z", "hours": 6.1136, "text": "I optimized my simulation and added a camera orientation indicator(top-right corner). It was much harder than I expected but It looks cool."}, {"post_id": 16529, "ts": "2026-06-26T21:50:43Z", "hours": 2.1425, "text": "I am now working on rewriting may program so I can later convert it to WASM using emscriptem. I also made the satelite distance modifiable."}, {"post_id": 15170, "ts": "2026-06-24T17:22:23Z", "hours": 1.9231, "text": "Added an option for user input. Now I will focus on adding friction to the moving ocean."}, {"post_id": 14889, "ts": "2026-06-24T05:27:16Z", "hours": 3.1589, "text": "I fixed some scaling bugs, but there still some left and i cant figure how to fix them. I also need to add friction soon. View after fixing radious bug:"}, {"post_id": 13728, "ts": "2026-06-22T14:36:56Z", "hours": 1.1089, "text": "I replaced some floats with doubles for better precision and improved the information tab."}, {"post_id": 13324, "ts": "2026-06-21T20:22:08Z", "hours": 6.9411, "text": "Made a huge rework today: -Reworked the entire pipeline and data structures to make code cleaner and more efficient. -Fixed some physics mistakes with scales I made before. -Fixed rendering bug which appeared when I chaned rendering order to a propper one."}, {"post_id": 12781, "ts": "2026-06-20T21:58:28Z", "hours": 1.9731, "text": "Made a custom Information tab, It shows simulation data. This took me some time, but I am happy with the results."}, {"post_id": 12635, "ts": "2026-06-20T17:10:22Z", "hours": 2.8864, "text": "I added camera movement, for now the camera is centered on the planet but I might change it in the future. I neede to add and rework few functions to make this work. There was also a major problem, which I learnt is called “gimbal lock”. Before I fixed It the camera was getting flipped when It rotated 90 degrees. There is also a zoom option(2’nd picture)."}, {"post_id": 12466, "ts": "2026-06-20T11:04:40Z", "hours": 3.9556, "text": "I scaled everything to real proportions of earth and moon. Improved pipeline by adding rendering functions and reducing the number of shaders. Made the moon orbit, to see it move I added a second time scale(not based on SI) to make the orbits fast without affecting other scales. I still need to correct the water based on updated moon position."}, {"post_id": 11516, "ts": "2026-06-18T20:13:46Z", "hours": 3.4372, "text": "Finaly the geometry is calculated by the satelite’s gravity. In a normal scenario the wouldn’t be visible in that scale so I needed to bring the moon verry close to the planet(It is now invisible) and increese its mass. I am planning to make a zoom options so the deformations will be vissible even with the real data"}, {"post_id": 7363, "ts": "2026-06-12T08:29:15Z", "hours": 0.3783, "text": "I tested the fluid deformation in real time(made a small menu to debug it). It wasnt calculated based on physics, i was just incrementing position(this is position of the right peak, the rest is calculated based on that). Of course i needed to scale it a bit, so you can see the water deformation. It looks realy cool when the water is “streched” too much:"}, {"post_id": 7128, "ts": "2026-06-11T22:11:05Z", "hours": 2.5839, "text": "Fixed a huge geometry bug, made a shader for the water layer. The hardest part was configuring the pipeline so that the water layer and core don’t interfere whith themselfs and break. Current view:"}, {"post_id": 6862, "ts": "2026-06-11T14:49:20Z", "hours": 1.865, "text": "I improved my shader for solid bodies: -shading responds to motion(previously it looked like the light sorce was moving with the object) -now the shading is done per pixel(not per vertex) -a bit of color is added to the opposite side Here you can see before and after:"}, {"post_id": 6373, "ts": "2026-06-10T18:47:00Z", "hours": 2.5058, "text": "Today i focused on the physics part of the fluid shape. I used quadrupolar tidal bulge approximation via P₂ Legendre polynomial. In terms of physics it sounds complicated, but was easier than i exepected. However I spend a lot of time trying to get the geometry right, becaose my sphere generating algorithm is pretty weird."}, {"post_id": 5897, "ts": "2026-06-09T21:18:17Z", "hours": 1.9833, "text": "Made basic pipeline for my symulation, improved shader use by creating helpful functions. This will be the core of the planet(it wont change geometry) so that was the easier part."}]...
|
Title: Tides simulation by @kuba_ch101 | Stardance Title: Tides simulation by @kuba_ch101 | Stardance
Devlogs:
Made basic pipeline for my symulation, improved shader use by creating helpful functions. This will be the core of the planet(it wont change geometry) so that was the easier part.
Today i focused on the physics part of the fluid shape. I used quadrupolar tidal bulge approximation via P₂ Legendre polynomial. In terms of physics it sounds complicated, but was easier than i exepected. However I spend a lot of time trying to get the geometry right, becaose my sphere generating algorithm is pretty weird.
I improved my shader for solid bodies: -shading responds to motion(previously it looked like the light sorce was moving with the object) -now the shading is done per pixel(not per vertex) -a bit of color is added to the opposite side Here you can see before and after:
Fixed a huge geometry bug, made a shader for the water layer. The hardest part was configuring the pipeline so that the water layer and core don’t interfere whith themselfs and break. Current view:
I tested the fluid deformation in real time(made a small menu to debug it). It wasnt calculated based on physics, i was just incrementing position(this is position of the right peak, the rest is calculated based on that). Of course i needed to scale it a bit, so you can see the water deformation. It looks realy cool when the water is “streched” too much:
Finaly the geometry is calculated by the satelite’s gravity. In a normal scenario the wouldn’t be visible in that scale so I needed to bring the moon verry close to the planet(It is now invisible) and increese its mass. I am planning to make a zoom options so the deformations will be vissible even with the real data
I scaled everything to real proportions of earth and moon. Improved pipeline by adding rendering functions and reducing the number of shaders. Made the moon orbit, to see it move I added a second time scale(not based on SI) to make the orbits fast without affecting other scales. I still need to correct the water based on updated moon position.
I added camera movement, for now the camera is centered on the planet but I might change it in the future. I neede to add and rework few functions to make this work. There was also a major problem, which I learnt is called “gimbal lock”. Before I fixed It the camera was getting flipped when It rotated 90 degrees. There is also a zoom option(2’nd picture).
Made a custom Information tab, It shows simulation data. This took me some time, but I am happy with the results.
Made a huge rework today: -Reworked the entire pipeline and data structures to make code cleaner and more efficient. -Fixed some physics mistakes with scales I made before. -Fixed rendering bug which appeared when I chaned rendering order to a propper one.
I replaced some floats with doubles for better precision and improved the information tab.
I fixed some scaling bugs, but there still some left and i cant figure how to fix them. I also need to add friction soon. View after fixing radious bug:
Added an option for user input. Now I will focus on adding friction to the moving ocean.
I am now working on rewriting may program so I can later convert it to WASM using emscriptem. I also made the satelite distance modifiable.
I optimized my simulation and added a camera orientation indicator(top-right corner). It was much harder than I expected but It looks cool.
BIG NEWS! I was finally able to convert my C code to WASM using emscripten. I run it on local hosted server but I still cant make it work on github pages. I also moved part of physics calculations to a specified shader which should significantly boost the performace.
I added a trail behind the satelite to make this more interesting and a direction indicator(which you can turn off) so you know where the satelite is when you zoom in. I also started working on the shell file which basically grabs the render and ads html features. All the info and other thing will be in this grey area(for now, maybe I will change them later).
I added a UI to the web page! It features: -camera controls: rotating, zooming and home position -simulation parameters which you can change with sliders. Everything is conected to the simulation via “cwrap”, which makes you able to use some of your functions, from the c program, in java script. I went through multiple layout and I am still not shure if I will keep this one. This was my first time building something like this so I took some help from the AI while making the trackpad and the sliders.
I improved the camera movement by making the rotation not based on the 3 main axes and instead based on the new ones created by the movement on the touchpad. It was quite hard to integrate everything but now the camera moves verry smooth. I also fixed a bug in the fragment shader which was breaking the alpha value of the oceanand now it looks much better.
I wrote the readme and I am almost ready to ship! Photos of progress:
I added different screen size support and a mobile layout. I also chaneged the UI SO now the whole canvas is likę a trackpad and you can zoom with scroll/fingers
Hello everyone It is my first devlog after the ship. People who rated my project had a great suggestion to make a tutorial, so I got to work. It will be in a form of a toggled window with instructions and explanations.
I added the tutorial, I wrote it by myself so there might be some uncought mistakes left, since English is not my native language. I think I explained it well and now the what some simulation parameters doshould be clear. Drawing is also made by me.
Ships:
I made a simualation of tides generated on a planet by a satelite. I made it in C and OpenGL which I compiled(using emscriptem) to WebAssembly and WebGL. Then I added controls to make it interractive. I am verry proud that I menaged to compute the shape of the water almost entirely on a GPU shader. I also made a custom camera system which enables rotating along vectors other than the 3 main axes. The simulation isnt super accurate but it can serve for eg. educational purposes....
|
1792853748.4064953
|
1792940148.4064953
|
|
21869
|
Create: Stealth & Security (MC Mod) by @xFN10x Create: Stealth & Security (MC Mod) by @xFN10x | Stardance...
|
xFN10x
|
1
|
89.0
|
1317
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-30T21:23:49Z", "hours": 89.0, "multiplier": 18.49, "payout": 1317, "blessing": "neutral", "text": "Create: Stealth & Security is a Minecraft mod for 1.21.1 Neoforge that I decided to make because I like being able to spy on people… This is the first neoforge mod I’ve developed & published. I would reccomend playing this with the modrinth app if you already have it, with JEI and Jade .", "repo": "https://github.com/xFN10x/Create-Security", "demo": "https://modrinth.com/mod/create-security"}]...
|
[{"post_id": 37800, "ts": "202 [{"post_id": 37800, "ts": "2026-07-30T18:53:36Z", "hours": 3.5239, "text": "devlog 20, normal time now vid link: https://youtu.be/H_7fsU2BupI alright, im probably gonna ship soon. so i focaused on some touch up features. recipes everything has recipes now, even adding the finiranium sensor recipe that i forgot last update. summaries everything also has shift summaries, so now people can actually learn how to use the mod I also added Nether Glass, right now it’s only used for the chunk detector recipe, but it will be able to block end sickness later on. I’ll be mainly prioritizing my other project https://stardance.hackclub.com/projects/336 after this ship, but ill probably work on this a bit more."}, {"post_id": 37241, "ts": "2026-07-29T19:56:10Z", "hours": 7.4528, "text": "devlog 19… these features are quite difficult to fine tune video cause stardance doesn’t work alright so 8 hours again… this time i only did one feature, (and maybe some bug fixes…) The chunk detector is finally done! Now you can drop a log in, and try to catch that person stealing your diamonds every night! formatting and other things aswell I also fixed some formatting for things like tooltips, so they are much nicer to look at now. I also made the log screen bigger. devlog 18… these features are quite difficult to fine tune alright so 8 hours again… this time i only did one feature, (and maybe some bug fixes…) The chunk detector is finally done! Now you can drop a log in, and try to catch that person stealing your diamonds every night! formatting and other things aswell I also fixed some formatting for things like tooltips, so they are much nicer to look at now. I also made the log screen bigger. oh yea stress The two kinetic blocks; the Laser Diode, and Chunk detector also actually consume stress units now, actually the laser diode doesn’t yet… but it will… and ill increase the speed req of it. oh yea stress The two kinetic blocks; the Laser Diode, and Chunk detector also actually consume stress units now, actually the laser diode doesn’t yet… but it will… and ill increase the speed req of it. now ill add a feature to obfuscate a players skin if they are invis."}, {"post_id": 34939, "ts": "2026-07-26T01:48:46Z", "hours": 8.9261, "text": "devlog 18… 9 hours 😅 ok so i normally would have devlogged after i got the ui done… but this ended up taking more time than i thought… I finished the ui of the log, it took most of the time, and i also kinda did everything… ui is done, i added some helpful utilities for loggable blocks, you can log things, omg this took so long, but there is really nothing else to say 😔..yet there are still a bunch of random things i need to fix"}, {"post_id": 33841, "ts": "2026-07-24T02:38:37Z", "hours": 2.9106, "text": "devlog 17 or 16, im tired alright, i put the chunk detector aside, and ive done a bunch of work on logs. Mostly just me trying to figure out how the hell Create’s menus work because they have no dev wiki 😔… anyways, the log now has a texture ive done twice trying to figure out how to make it look like a piece of paper, and i also make a screen; (ignore how its using the old texture.) The log is gonna be usable between different blocks as i said, and each entry is gonna have a target player or entity, message, and timestamp. And i might also add the source block. I also forgot that i forgot to add a recipe to the finiranium detector…"}, {"post_id": 33047, "ts": "2026-07-22T16:51:27Z", "hours": 1.8803, "text": "starting to work on the Chunk Detector. I’ve started adding the new block, the Chunk Detector, which will log entries and exits of each entity in a chunk. It will log these in a new item, the Log. You will be able to use it to see different timed events of different blocks, like the Advanced Sight Sensor when i add it."}, {"post_id": 27906, "ts": "2026-07-13T20:38:41Z", "hours": 0.8375, "text": "Finished the finiranium sensor, and added some config values about username obfuscation when invisible. (Got the idea from seeing it in a lifesteal video) Ill release version 0.1.1 now."}, {"post_id": 27770, "ts": "2026-07-13T16:49:07Z", "hours": 4.0006, "text": "i swear ive made this devlog 3 times already… The mod is now on modrinth , and curseforge . I would reccomend trying it out, as i want to make sure its balenced enough for its beta. Now that its on modrinth, I’ve been working on some updates. Currently im adding the Finiranium Sensor, whichs shows you when Finiranium is nearby; (ignore the debug outline in the screenshot.) Im also planning on adding the next blocks & items before the beta: Chunk Detector : Detects when Players/Entities enter a chunk Advanced Sight Sensor/Laser Diode Keycard stuff Smarter Observer (wip name) : Logs players’ interactions with a block"}, {"post_id": 21712, "ts": "2026-07-03T20:07:05Z", "hours": 0.5264, "text": "I’ve finished setting up my modrinth page, (and curseforge page,) and now im waiting for review. Ill pause development while i wait for it to be put up on at least modrinth. https://modrinth.com/mod/create-security https://www.curseforge.com/minecraft/mc-mods/create-stealth-security/preview"}, {"post_id": 20920, "ts": "2026-07-02T17:15:26Z", "hours": 1.5025, "text": "con-figured i should make some more configs before first version I’ve made a bunch of configurable options, there are definity more i could add, but this is good enough for the first alpha version. Now i just need to finish the modrinth page, and add a readme."}, {"post_id": 20492, "ts": "2026-07-02T03:00:10Z", "hours": 3.5531, "text": "recipes, recipes, come get your recipes here now everything has a recipe! ive also added some more items to make these recipes more intuitive. Ill try to show some recipes in the attachments. Next im gonna make a server config for stuff like end sickness, and then im gonna raise the default for end sickness to make it a bit easier to avoid. ill release an alpha version for testing soon, its not gonna be my ship though. (also, the missing texture thing are the empty finiranium goggles, idk why they dont work)"}, {"post_id": 19629, "ts": "2026-07-01T00:26:20Z", "hours": 2.8147, "text": "I’ve added some QoL stuff, I added a feature where you can adjust the eye offset of the finiranium goggles, its a bit glitchly right now, but its fine. I’ve also added a config, for now only for the client. So far there is only one setting for the flicker of a laser. (you can see it at its default in the gif)"}, {"post_id": 19376, "ts": "2026-06-30T17:44:36Z", "hours": 5.0992, "text": "now the laser works on contraptions. The laser diode now visually work on contraptions… but due to create limitations, they don’t actually function… anyways, im gonna make a ponder now, then ill probably make a config. Ive also fixed a bunch of issues with the rendering of the lasers. And i also fixed an issue with me not knowing that the block entity renderers where shared across all of them, therefore the lasers would change length weridly from other lasers…"}, {"post_id": 18747, "ts": "2026-06-29T22:47:43Z", "hours": 3.5692, "text": "the laser renders properly. Now the laser sensor can actually shoot a proper laser. Also I learned how to actually spell laser. Now, I just need to do i bit more fine tuning, and then i need to make the thing actually function. And then i need to add the contraption behaviour… which hopefully wont be to hard… yay the video upload wont work again! heres a link to it instead https://file.garden/ZPu7YidXf2vX5nJR/Screen%20Recording%202026-06-29%20192129.mp4 (i was trying hackclub cdn, but i think thats the issue)"}, {"post_id": 18022, "ts": "2026-06-29T00:10:21Z", "hours": 5.8306, "text": "im starting to add lazer diodes, they will let you detect when something is blocking a lazer. Kinda like a sight sensor, but no sight. Ive been trying to figure out how to make the lazer, and ive got a good start as you can see. In the second image you can see the lazer, (left,) and the receiver you get from wrenching it, (right.) With the advanced versions you will only need one lazer."}, {"post_id": 15055, "ts": "2026-06-24T13:34:42Z", "hours": 2.795, "text": "Ive added a new liquid: Liquid Finiranium. Its going to be used to refil electric camo. Also, since liquid finiranium is so extremely deadly, im gonna raise the threshold for getting end sickness, and im also gonna add ways to prevent end sickness"}, {"post_id": 13437, "ts": "2026-06-22T00:39:18Z", "hours": 4.0725, "text": "End sickness is now implemented, you get it from being near finiranium, or having it in your inventory. In the attached video, (recorded before i added the inventory sickening,) You can see how it works, you can actually barely survive it if you have low hunger, but if you heal to a certain point, depending on the level, it hurts you, also depending on the level. Next features coming up: Electric Camo & Entity Sensors Also, this video is a bit old, so some of the other things i added will be in future devlogs. OK I SWEAR THIS VIDEO WILL NOT WORK, YOU DONT GET IT, SORRY"}, {"post_id": 12070, "ts": "2026-06-19T18:06:28Z", "hours": 0.3258, "text": "now you can see invis entities! im imagining a really cool stealth mission being done with this mod… especially since you can see people wearing them in darkness"}, {"post_id": 11975, "ts": "2026-06-19T15:32:56Z", "hours": 0.6133, "text": "i updated the goggles model, and made them glow in the dark. I also finished the post processing effects that happen when you put them on. I still need to make invisible entities visible with them on."}, {"post_id": 11945, "ts": "2026-06-19T14:12:31Z", "hours": 1.0397, "text": "I’ve actually added the finigoggles item, and i made a custom model for them too. right now im working on making a custom renderer to recreate kinda what the metal gear solid 1 goggles look like."}, {"post_id": 11596, "ts": "2026-06-18T21:41:56Z", "hours": 27.3147, "text": "alright, i was not planning to put this on stardance, but ive decided to. (ughh..) time to start writing about the past 3 days day 1: I started working on setup, i have never actually make a create addon, or a neoforge addon (well, ive kinda experimented with neoforge) so it took me a bit I created the model for the first block; (1st attach,) The Sight Sensor. It outputs a redstone signal depending on the distance an entity is at when looking at it. (2nd attach is the ponder, that i made later) day 2: I actually implemented the sight sensor, and finished it up. I added a keycard item aswell (planned for something,) and i made the creative tab (attach 3) day 3: i added the functionality for sight sensors on contraptions, and i added functionality to make them activate when looking at each other, so you can basically make wireless redstone. I also added Finiranium & Finiranium Ore. Finiranium is a new material im adding to the mod, it can give you end sickness if you are around it to much, and you will be able to use it to make devices like entity detection goggles. (lets you see invis entities.) day 4: I did more work on finiranium, and i gave it a cool name. It can also generate in the end now. (attach 4 & 5) I also added End Sickness, which changes your hunger bar, and heart icons. It will split your hunger, and health bars by a certain amount depending on the level. day 5 & 6 (today) I’ve been doing a lot of work looking at minecraft’s rendering, trying to make some sort of effects for the goggles. I did a lot of work with post processing, and other rendering. However, i think i figured something out. Since it appears that I’ve hit my attachment cap, ill post images of me working on this soon."}]...
|
Title: Create: Stealth & Security (MC Mod) by Title: Create: Stealth & Security (MC Mod) by @xFN10x | Stardance
Devlogs:
alright, i was not planning to put this on stardance, but ive decided to. (ughh..) time to start writing about the past 3 days day 1: I started working on setup, i have never actually make a create addon, or a neoforge addon (well, ive kinda experimented with neoforge) so it took me a bit I created the model for the first block; (1st attach,) The Sight Sensor. It outputs a redstone signal depending on the distance an entity is at when looking at it. (2nd attach is the ponder, that i made later) day 2: I actually implemented the sight sensor, and finished it up. I added a keycard item aswell (planned for something,) and i made the creative tab (attach 3) day 3: i added the functionality for sight sensors on contraptions, and i added functionality to make them activate when looking at each other, so you can basically make wireless redstone. I also added Finiranium & Finiranium Ore. Finiranium is a new material im adding to the mod, it can give you end sickness if you are around it to much, and you will be able to use it to make devices like entity detection goggles. (lets you see invis entities.) day 4: I did more work on finiranium, and i gave it a cool name. It can also generate in the end now. (attach 4 & 5) I also added End Sickness, which changes your hunger bar, and heart icons. It will split your hunger, and health bars by a certain amount depending on the level. day 5 & 6 (today) I’ve been doing a lot of work looking at minecraft’s rendering, trying to make some sort of effects for the goggles. I did a lot of work with post processing, and other rendering. However, i think i figured something out. Since it appears that I’ve hit my attachment cap, ill post images of me working on this soon.
I’ve actually added the finigoggles item, and i made a custom model for them too. right now im working on making a custom renderer to recreate kinda what the metal gear solid 1 goggles look like.
i updated the goggles model, and made them glow in the dark. I also finished the post processing effects that happen when you put them on. I still need to make invisible entities visible with them on.
now you can see invis entities! im imagining a really cool stealth mission being done with this mod… especially since you can see people wearing them in darkness
End sickness is now implemented, you get it from being near finiranium, or having it in your inventory. In the attached video, (recorded before i added the inventory sickening,) You can see how it works, you can actually barely survive it if you have low hunger, but if you heal to a certain point, depending on the level, it hurts you, also depending on the level. Next features coming up: Electric Camo & Entity Sensors Also, this video is a bit old, so some of the other things i added will be in future devlogs. OK I SWEAR THIS VIDEO WILL NOT WORK, YOU DONT GET IT, SORRY
Ive added a new liquid: Liquid Finiranium. Its going to be used to refil electric camo. Also, since liquid finiranium is so extremely deadly, im gonna raise the threshold for getting end sickness, and im also gonna add ways to prevent end sickness
im starting to add lazer diodes, they will let you detect when something is blocking a lazer. Kinda like a sight sensor, but no sight. Ive been trying to figure out how to make the lazer, and ive got a good start as you can see. In the second image you can see the lazer, (left,) and the receiver you get from wrenching it, (right.) With the advanced versions you will only need one lazer.
the laser renders properly. Now the laser sensor can actually shoot a proper laser. Also I learned how to actually spell laser. Now, I just need to do i bit more fine tuning, and then i need to make the thing actually function. And then i need to add the contraption behaviour… which hopefully wont be to hard… yay the video upload wont work again! heres a link to it instead https://file.garden/ZPu7YidXf2vX5nJR/Screen%20Recording%202026-06-29%20192129.mp4 (i was trying hackclub cdn, but i think thats the issue)
now the laser works on contraptions. The laser diode now visually work on contraptions… but due to create limitations, they don’t actually function… anyways, im gonna make a ponder now, then ill probably make a config. Ive also fixed a bunch of issues with the rendering of the lasers. And i also fixed an issue with me not knowing that the block entity renderers where shared across all of them, therefore the lasers would change length weridly from other lasers…
I’ve added some QoL stuff, I added a feature where you can adjust the eye offset of the finiranium goggles, its a bit glitchly right now, but its fine. I’ve also added a config, for now only for the client. So far there is only one setting for the flicker of a laser. (you can see it at its default in the gif)
recipes, recipes, come get your recipes here now everything has a recipe! ive also added some more items to make these recipes more intuitive. Ill try to show some recipes in the attachments. Next im gonna make a server config for stuff like end sickness, and then im gonna raise the default for end sickness to make it a bit easier to avoid. ill release an alpha version for testing soon, its not gonna be my ship though. (also, the missing texture thing are the empty finiranium goggles, idk why they dont work)
con-figured i should make some more configs before first version I’ve made a bunch of configurable options, there are definity more i could add, but this is good enough for the first alpha version. Now i just need to finish the modrinth page, and add a readme.
I’ve finished setting up my modrinth page, (and curseforge page,) and now im waiting for review. Ill pause development while i wait for it to be put up on at least modrinth. https://modrinth.com/mod/create-security https://www.curseforge.com/minecraft/mc-mods/create-stealth-security/preview
i swear ive made this devlog 3 times already… The mod is now on modrinth , and curseforge . I would reccomend trying it out, as i want to make sure its balenced enough for its beta. Now that its on modrinth, I’ve been working on some updates. Currently im adding the Finiranium Sensor, whichs shows you when Finiranium is nearby; (ignore the debug outline in the screenshot.) Im also planning on adding the next blocks & items before the beta: Chunk Detector : Detects when Players/Entities enter a chunk Advanced Sight Sensor/Laser Diode Keycard stuff Smarter Observer (wip name) : Logs players’ interactions with a block
Finished the finiranium sensor, and added some config values about username obfuscation when invisible. (Got the idea from seeing it in a lifesteal video) Ill release version 0.1.1 now.
starting to work on the Chunk Detector. I’ve started adding the new block, the Chunk Detector, which will log entries and exits of each entity in a chunk. It will log these in a new item, the Log. You will be able to use it to see different timed events of different blocks, like the Advanced Sight Sensor when i add it.
devlog 17 or 16, im tired alright, i put the chunk detector aside, and ive done a bunch of work on logs. Mostly just me trying to figure out how the hell Create’s menus work because they have no dev wiki 😔… anyways, the log now has a texture ive done twice trying to figure out how to make it look like a piece of paper, and i also make a screen; (ignore how its using the old texture.) The log is gonna be usable between different blocks as i said, and each entry is gonna have a target player or entity, message, and timestamp. And i might also add the source block. I also forgot that i forgot to add a recipe to the finiranium detector…
devlog 18… 9 hours 😅 ok so i normally would have devlogged after i got the ui done… but this ended up taking more time than i thought… I finished the ui of the log, it took most of the time, and i also kinda did everything… ui is done, i added some helpful utilities for loggable blocks, you can log things, omg this took so long, but there is really nothing else to say 😔..yet there are still a bunch of random things i need to fix
devlog 19… these features are quite difficult to fine tune video cause stardance doesn’t work alright so 8 hours again… this time i only did one feature, (and maybe some bug fixes…) The chunk detector is finally done! Now you can drop a log in, and try to catch that person stealing your diamonds every night! formatting and other things aswell I also fixed some formatting for things like tooltips, so they are much nicer to look at now. I also made the log screen bigger. devlog 18… these features are quite difficult to fine tune alright so 8 hours again… this time i only did one feature, (and maybe some bug fixes…) The chunk detector is finally done! Now you can drop a log in, and try to catch that person stealing your diamonds every night! formatting and other things aswell I also fixed some formatting for things like tooltips, so they are much nicer to look at now. I also made the log screen bigger. oh yea stress The two kinetic blocks; the Laser Diode, and Chunk detector also actually consume stress units now, actually the laser diode doesn’t yet… but it will… and ill increase the speed req of it. oh yea stress The two kinetic blocks; the Laser Diode, and Chunk detector also actually consume stress units now, actually the laser diode doesn’t yet… but it will… and ill increase the speed req of it. now ill add a feature to obfuscate a players skin if they are invis.
devlog 20, normal time now vid link: https://youtu.be/H_7fsU2BupI alright, im probably gonna ship soon. so i focaused on some touch up features. recipes everything has recipes now, even adding the finiranium sensor recipe that i forgot last update. summaries everything also has shift summaries, so now people can actually learn how to use the mod I also added Nether Glass, right now it’s only used for the chunk detector recipe, but it will be able to block end sickness later on. I’ll be mainly prioritizing my other project https://stardance.hackclub.com/projects/336 after this ship, but ill probably work on this a bit more.
Ships:
Create: Stealth & Security is a Minecraft mod for 1.21.1 Neoforge that I decided to make because I like being able to spy on people… This is the first neoforge mod I’ve developed & published. I would reccomend playing this with the modrinth app if you already have it, with JEI and Jade ....
|
1792849885.3845427
|
1792936285.3845427
|
|
28027
|
LARPARDY! by @purpld | Stardance
|
purpld
|
1
|
73.0
|
1320
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-27T16:36:45Z", "hours": 73.0, "multiplier": 18.16, "payout": 1320, "blessing": "neutral", "text": "I made a Discord activity trivia game inspired by the Jeopardy game show called LARPARDY! that you can easily play with your friends without leaving Discord! I am very proud of how far this project has come because it was very challenging for me. The frontend is based on Vue.js, which before this, I had never used before. I wanted to try something non-React and I’ve come to REALLY love Vue. I had to write multiplayer netcode entirely by myself! I used Socket.IO to handle the networking itself, but I had to write ALL of the state management and syncing code. There were certainly some difficulties in doing so! I also have not worked with Redis before, which was my database of choice for state management. It is… quite different from other databases, so writing code to interact with it was a learning experience.", "repo": "https://github.com/hpenney2/larpardy", "demo": "https://discord.com/discovery/applications/1521015095738499083"}]...
|
[{"post_id": 55618, "ts": "202 [{"post_id": 55618, "ts": "2026-08-27T16:13:45Z", "hours": 0.9681, "text": "Last devlog before ship (proper this time!) Discovery I set up a Discord server for the game, so LARPARDY! is now on Discord’s discovery (App Directory)! This is now used for the demo link for the game. README (please) Just spent some time redoing the (ancient) README and making it look pretty and detailed. I took some screenshots and added them here. They also show up on Discord! :D"}, {"post_id": 55384, "ts": "2026-08-27T05:50:58Z", "hours": 1.6658, "text": "SHIP IT! LARPARDY! is now verified on Discord! I spent a short while writing a basic Terms of Service and Privacy Policy (as required by Discord) and verifying all the details. Live deployment I’ve also deployed a production version of the game server to my home lab! It’s exposed through a Cloudflare Tunnel, because I’m behind CGNAT (i.e., I don’t have my own public IP). Spending all that time setting up Docker for this project all that time ago made this VERY easy, which was the entire point. I’m glad nothing broke in the process… lol Discovery The last thing I want to do is set up Discovery on Discord, so reviewers (and anybody, for that matter!) can just search up LARPARDY! in Discord, and it should come up. I pretty much just need to make a support server and write the details, and then… LET’S SHIP IT! I dunno if anybody reads these things, but if you do, thank you. :D"}, {"post_id": 55338, "ts": "2026-08-27T02:45:01Z", "hours": 10.4778, "text": "IT’S READY! I am very happy to say that I’m done with the main game! I wanted to split this into a couple of devlogs, but Stardance was having some issues syncing time earlier so I kept working. (I think it’s actually been up for a little bit… oops) Buzzing -> Judging Judging now is fully functional! Either someone gets the clue right, everyone gets it wrong, or not everybody buzzes in and we move on. I’ve also introduced something called Hostless Mode , which allows the game host to play (where normally they could not). This plays more like most online versions of the gameshow, where you can buzz in, reveal the answer, and then that’s that (instead of everyone getting a chance to buzz in if the first person is wrong). This also gives a way to play singleplayer, which should make it more accessible. All of this took a lot of careful logic work to make sure that everything works as expected (hence the VERY long log time, plus several other things), no matter how you’re playing! End of Line The game, also, can finally end, now that clues get marked off. I made a simple leaderboard that shows when the game is over, and then you can return to the lobby! See the photo below. GAMEPLAY! You can watch a short gameplay example with a host (right) + 2 players (left) below! You’re expected to play with voice (or a text channel, if you wish), so this demo just showcases the flow of the game. I logged a lot of time on this one because there was also a lot of testing and fixing small bugs, especially when making the judging system. A lot can get weird when managing so much state!"}, {"post_id": 54560, "ts": "2026-08-25T16:07:03Z", "hours": 7.4739, "text": "Questions, and MORE boring serverside stuffs Oof, sorry, it’s been a while since I’ve been able to work on this project, and the clock is ticking! Clues! Clues can now actually be selected and that will be reflected to the server and all players. You can also see a bit of the buzzer work I started, which is actually much more of a pain than it would seem. Why? Well that’s because we now have to talk about: SYNCING TIME OVER THE NETWORK The server running the game has a system time. Your computer, phone, or whatever, also has its own system time which could vary entirely from the server’s. If the server wants to schedule an event (say, when you should be allowed to buzz in), how does it tell the client when that is without an offset? Using Unix timestamps is common, but without knowing how offset the client is from the server, we don’t actually really know when that timestamp is in reality (since EITHER could be offset from reality, if not both), and we don’t want mismatched times to cause weird problems. The solution that I went with is that the client will periodically (every 1 second for now) send a “ping” message to the server with its current timestamp. The server will reply with that time as well as it’s own timestamp. Upon receiving that reply, it can then do three things: Calculate the round trip time (i.e., ping!) from the original time we sent and the time it is now. Estimate the server time as we’re processing this by adding the server time + half of the ping Calculate our time offset from the server by subtracting our time from that estimate I admit that I did NOT figure this out on my own. Google is nice. But this does actually kind of serve as the basis for how things like the Network Time Protocol (NTP) work. Reminder that all of that is just so we can show when the buzzer is allowed to be pressed accurately. Spectating Also, I added a fix so late players aren’t actually awkwardly added in the middle of a game and are instead in a kind of “spectator” state; since they’re still connected, they receive all the game state events and so on. If all actual players leave, the game will reset (which also means I now have a function to reset the state, and for showing alerts!)."}, {"post_id": 32606, "ts": "2026-07-21T21:45:43Z", "hours": 6.9744, "text": "A REAL BOARD! A trickier task than it sounds like, but I needed some clues finally! The default testing board was uh… not exactly “production ready” in my opinion (lol). This was tricky particularly because, well, where am I going to get clues from? You kinda need a LOT of clues for a good Jeopardy game, and while UGC is something I want to make, I would like a default mode, too, and there is certainly no way that I was going to try to make a bunch of clues by myself. (respectfully, I don’t think I am also smart enough to do that lol) Jepp I found a little project called jepp which exposes a LOT of existing Jeopardy clues through an API. I didn’t want to bother that API too much though, and there is an SQLite DB dump publicly available, so LARPARDY now uses that instead. With a little bit of SQL later (and, uh, remembering how to use SQL lol)… we have many, many clues! The only thing is that the database does not store the value of clues, so it’ll be a bit random. A $1000 clue might end up being super easy lol, but I think that’s some jank I’m okay with. Player list Ooh also, I made a proper player list now! I did want literal podiums, which I may still do at some point, but I’m happy with this for the time being. This can now also react to changes in the game like points or who’s turn it is!"}, {"post_id": 30376, "ts": "2026-07-17T21:09:53Z", "hours": 9.8342, "text": "BEEEG DEVLOG Wowwee! I’ve gotta remember to make devlogs more often. Seriously. Here’s a list of changes that I’ve made since my last devlog! The basics of the board are implemented! You can’t interact with it yet, but the template to do so is there, and it now exists on the server-side too and the client reads from that state. The board is also animated now. When someone selects a clue, it will highlight the category and the clue, you can hover clues, and, my favorite bit, the categories get revealed one by one when the game starts! That last part actually kind of sucked to implement lol. I prepared for this when making the lobby’s ready up system and made the state that it uses to work a bit dynamic because I knew that I would need it! The state stores readyForNextState , which for some states (like when we’re in the lobby) allow unreadying, but for others, simply act as a marker of whether a specific client is ready to move on. This is probably actually really important because if we just ran a timer on the server, a NUMBER of things could go wrong, most importantly being that a laggy client could get desynced VERY quickly and have a bad time. Alongside this, there is an intro now! I spent a good bit of time in Aseprite and messing with FL Studio to make some art and an intro track, both for the logo and so I finally have some artwork to add in the Discord Developer Portal, so there aren’t anymore blank assets. It’s not perfect (i am NOT an artist lol) See pictures below! psst , I also made a “think” music track for if the final round is enabled! It’s not in the game yet, though. I made a number of styling fixes. The board in particular looks much better on different screen sizes now, even on my phone. Reminder to use relative sizes when able, not px ! The server now registers the activity entry point command as having an APP_HANDLER handler, which means that the server must respond to interactions now, rather than Discord autolaunching the activity. The benefit of this is that we have control over whether a message gets sent to the channel it was started in (and when), or if we even launch the activity at all (disallow banned users? anything is possible…)! The rich presence actually has meaningful details now lol, rather than placeholder text. NOWWW what? I am going to, FINALLY, FOR REAL THIS TIME, (lol) actually start making the game logic. (It’s about time!) More updates sooooon!"}, {"post_id": 29136, "ts": "2026-07-15T20:22:28Z", "hours": 2.0267, "text": "I prototyped the game board last night! This took a while to get the styling right as I want this to work well on all screen sizes, hopefully including mobile devices. It’s still a little rough on very small sizes (e.g., my phone), but one step at a time! I still want to add little “podiums” at the bottom for our players. After that, I’m going to be working on getting the board working on the serverside, so that actually becomes part of the game state."}, {"post_id": 28080, "ts": "2026-07-14T03:29:38Z", "hours": 8.6656, "text": "socket.io is cool, BUT So. 8 hour devlog, my bad, but I’m going to start by talking about the thing that I’ve been mostly fighting with today. The networking backend that I’m using for LARPARDY is Socket.IO , which works similarly to (and usually on top of) WebSockets, but with a lot more quality of life features and ease of use for specifically these kinds of situations. I have been fighting for a few hours today trying to figure out why I could not, for the life of me, get socket.emit to work on the client. It was, in fact, one setting, retries , in the client config, stopping it from working, for SOME reason. Oops. Anyways… PROGRESS! (GAME!) Progress has been steady! Most of the changes that I’ve been making have been making the client more workable as I make new components, and actually more planning out the infrastructure. I’ve designed some new UI elements, moved where some state is stored, and so on. I have a bad habit of overplanning, or rather, being too worried about planning big projects like these, because I like to avoid having to do cleanup work later (like the cleanup that I’m doing on the client right now). It’s not strictly a bad habit, but sometimes it’s better to just write the code rather than spend hours deliberating about micro-optimizations with yourself. I believe I am now ACTUALLY at the point where I can begin properly building the UI for the game board and the frontend & backend aspects around that. This was more hidden work (and… fighting with the socket.io client, apparently) so I don’t have too much to show this time either, sadly. BUT, I did finally design and prototype the lobby! So you do get something fun to look at while I work on everything lol"}, {"post_id": 23977, "ts": "2026-07-07T07:00:57Z", "hours": 8.9547, "text": "it’s REDISin’ time! wait is that… not the line from the movie? (also SORRY this should have been at least a couple devlogs lol, please forgive me) I’ve finally been working on the state management for LARPARDY! This turns out to be a MUCH harder task than I originally thought it would be, particularly because I’m trying to make sure that this will be safe and work well in a real environment. Redis First of all, instead of keeping state in the server’s memory, I have added a Redis DB to the project. This is part of why I wanted Docker set up, as this is now just in the docker-compose.yml ! I have NEVER personally used Redis before, so some time of the time from this devlog was admittedly stumbling my way through figuring out how to use Redis correctly. CORRECTLY is the key word, to be clear. I’m building basically a wrapper class around the Redis database, StateManager , which abstracts away the nasty database stuff so the main code doesn’t have to worry about actually interacting with Redis. It was, kind of a pain to write actually (lol?), because I was worried about race conditions basically the entire time, since this code needs to run async (i.e., something else might do something to a thing while we’re also trying to do something with that thing). I HOPE that the state management code is bug free for now, but we’ll see. (please…) Client The client has now also been updated to listen for new game states. I also finally figured out how to set up Rich Presence, so it will show that you’re playing LARPARDY on your profile! In addition, I made it so in-game avatars will highlight green when someone is speaking (like Discord), and I added waiting UI for when a player has joined but hasn’t fully connected yet, AND for when you are still connectin#. so NOWW can we start to make the actual game? yyyyyYES! I think so. I hope, anyway (lol). I believe my next step will be making a basic lobby/waiting UI that lets you start the game, and then finally start to implement the actual game. I AM EXCITEEEEDD (there’s not a ton to look at since this was mostly backend work. sorry! i’ll have more next time :3)"}, {"post_id": 21340, "ts": "2026-07-03T07:04:15Z", "hours": 1.2911, "text": "oops… I wasted some time on accident, woops. I thought Discord’s proxy verification meant that the discordsays.com proxy would send these headers to verify that an actual Discord client had connected with them, but uh, I checked the flowchart again and I got that wrong. Hm. Thankfully, I didn’t get too far into implementing that. Regardless, trying to implement that still encouraged me to do a small bit of cleanup, which was properly declaring the environment variable. A certified moment. (YES I am going to abuse the fact that I figured out that you can use custom emotes here. i am so sorry) smol devlog"}, {"post_id": 21309, "ts": "2026-07-03T05:10:37Z", "hours": 7.3028, "text": "I HATE DOCKER i love Docker!! So, I didn’t even write a devlog yesterday because I spent the entirety of the time that I did have setting up a Dockerfile and docker-compose.yml for LARPARDY. …why did it take that long Because I’ve never used Docker before! Well, I have, to run services on my PC and my homelab server, but I’ve never used it for my own projects before. Specifically, I want to go ahead and set up Docker because I know that I’m going to need a database (or possibly two! SQL + Redis), and running everything together in a container will make both development AND deployment much easier for me. I’ve never used it before, so this is, uh, a learning experience, to say the least. oh also, pnpm Oh. Also. pnpm has a bug. Apparently. I’m using pnpm as the package manager for both the server and the client (since they’re both TypeScript projects). Both projects are stored in a monorepo (literally meaning just a repo with multiple projects, basically), which makes it easy to manage for me and keeps my commits together. Nicely, pnpm recommends a Dockerfile for this exact scenario ! I reconfigured the project to use pnpm ‘s workspaces feature (which… is seperate from package.json ’s workspaces, for some reason ) so that this would work. pnpm deploy is supposed to copy the project with it’s own node_modules since workspaces use a shared one. The problem is that, when it rewrites workspace dependencies (because I have a shared package for both the server & client), it links it to the wrong source, which no longer exists after it’s copied! I tried to debug and get this working for ACTUAL AGES before I gave up and just wrote commands that manually copy the files instead. I figured that there HAS to be a way to get this working, considering the documentation itself recommends this build file. But noooope. It doesn’t seem so (cite: this GitHub issue which has been open since… 2023??? ). so what did you actually do The Docker config works now, and that’s the important thing! I currently have the client build into an nginx image, but I’m either going to drop this entirely or have the server serve the client files itself. This will allow me to implement Discord proxy header verification too, if I decide to."}, {"post_id": 19750, "ts": "2026-07-01T04:19:16Z", "hours": 1.7331, "text": "Socket.IO! As for perhaps one of the most important bits… this is Socket.IO ! I had to figure out how to get this working with Fastify first ( thank you random GitHub commenter ) since that’s my web framework of choice for the backend (for anything not going through Socket.IO), but here’s a basic implementation of it working! what it do? Socket.IO works similarly to (and if it’s available, on top of) WebSockets, where there’s a persistent connection with bi-directional communication between the client and the server. Socket.IO adds some extra fancy things on top of that, such as fallbacks when WebSockets aren’t available and rooms, and in general will make my life easier (lol). This part is, of course, very important for getting a game handled by the backend to work! This will also allow us to do multiplayer. Discord gives you an instance ID for each activity that players are playing together, so I’ll use this to make the rooms, that way players in the same voice channel will end up in the same game!"}, {"post_id": 19673, "ts": "2026-07-01T01:46:04Z", "hours": 5.8181, "text": "ho boy… I’ve wanted to make a Discord Activity basically since the feature began being teased… so, no better time than the present, right? I saw some guys playing Jeopardy the other night and I realized that I feel like the online ways of playing Jeopardy are kinda… uh, bad? I thought I should fix that. I’ve been getting a lot more comfortable with frontend development recently (I’m normally more comfy with backend stuff!), so now this is really going to test my ability to handle FULL STACK development. With that said, I’ve been playing around since last night and I have a working setup with (stable) communication with the Discord client via the SDK. (hooray!) Currently, it just shows the name and avatar of connected players. don’t you love React? Me too! Unfortunately, I am lying. I’m trying Vue.js for the first time for this project. There is a LOT that I’m planning that is very new to me for this project. I expect to need Redis, Socket.IO, and (of course) the Discord activities SDK, none of which I’ve ever used. So, here we go? the name. dude. what. why I didn’t originally have a name for this (the README still remains “Untitled Jeopardy Clone” for now), so I was using the name “Leopardy” as a placeholder. Someone recommened me to switch to LARPARDY. I couldn’t say no. I wish I did. …anyways, next up is actually making some sort of game state work. I’m going to start working on the backend!"}]...
|
Title: LARPARDY! by @purpld | Stardance
Devlogs:
Title: LARPARDY! by @purpld | Stardance
Devlogs:
ho boy… I’ve wanted to make a Discord Activity basically since the feature began being teased… so, no better time than the present, right? I saw some guys playing Jeopardy the other night and I realized that I feel like the online ways of playing Jeopardy are kinda… uh, bad? I thought I should fix that. I’ve been getting a lot more comfortable with frontend development recently (I’m normally more comfy with backend stuff!), so now this is really going to test my ability to handle FULL STACK development. With that said, I’ve been playing around since last night and I have a working setup with (stable) communication with the Discord client via the SDK. (hooray!) Currently, it just shows the name and avatar of connected players. don’t you love React? Me too! Unfortunately, I am lying. I’m trying Vue.js for the first time for this project. There is a LOT that I’m planning that is very new to me for this project. I expect to need Redis, Socket.IO, and (of course) the Discord activities SDK, none of which I’ve ever used. So, here we go? the name. dude. what. why I didn’t originally have a name for this (the README still remains “Untitled Jeopardy Clone” for now), so I was using the name “Leopardy” as a placeholder. Someone recommened me to switch to LARPARDY. I couldn’t say no. I wish I did. …anyways, next up is actually making some sort of game state work. I’m going to start working on the backend!
Socket.IO! As for perhaps one of the most important bits… this is Socket.IO ! I had to figure out how to get this working with Fastify first ( thank you random GitHub commenter ) since that’s my web framework of choice for the backend (for anything not going through Socket.IO), but here’s a basic implementation of it working! what it do? Socket.IO works similarly to (and if it’s available, on top of) WebSockets, where there’s a persistent connection with bi-directional communication between the client and the server. Socket.IO adds some extra fancy things on top of that, such as fallbacks when WebSockets aren’t available and rooms, and in general will make my life easier (lol). This part is, of course, very important for getting a game handled by the backend to work! This will also allow us to do multiplayer. Discord gives you an instance ID for each activity that players are playing together, so I’ll use this to make the rooms, that way players in the same voice channel will end up in the same game!
I HATE DOCKER i love Docker!! So, I didn’t even write a devlog yesterday because I spent the entirety of the time that I did have setting up a Dockerfile and docker-compose.yml for LARPARDY. …why did it take that long Because I’ve never used Docker before! Well, I have, to run services on my PC and my homelab server, but I’ve never used it for my own projects before. Specifically, I want to go ahead and set up Docker because I know that I’m going to need a database (or possibly two! SQL + Redis), and running everything together in a container will make both development AND deployment much easier for me. I’ve never used it before, so this is, uh, a learning experience, to say the least. oh also, pnpm Oh. Also. pnpm has a bug. Apparently. I’m using pnpm as the package manager for both the server and the client (since they’re both TypeScript projects). Both projects are stored in a monorepo (literally meaning just a repo with multiple projects, basically), which makes it easy to manage for me and keeps my commits together. Nicely, pnpm recommends a Dockerfile for this exact scenario ! I reconfigured the project to use pnpm ‘s workspaces feature (which… is seperate from package.json ’s workspaces, for some reason ) so that this would work. pnpm deploy is supposed to copy the project with it’s own node_modules since workspaces use a shared one. The problem is that, when it rewrites workspace dependencies (because I have a shared package for both the server & client), it links it to the wrong source, which no longer exists after it’s copied! I tried to debug and get this working for ACTUAL AGES before I gave up and just wrote commands that manually copy the files instead. I figured that there HAS to be a way to get this working, considering the documentation itself recommends this build file. But noooope. It doesn’t seem so (cite: this GitHub issue which has been open since… 2023??? ). so what did you actually do The Docker config works now, and that’s the important thing! I currently have the client build into an nginx image, but I’m either going to drop this entirely or have the server serve the client files itself. This will allow me to implement Discord proxy header verification too, if I decide to.
oops… I wasted some time on accident, woops. I thought Discord’s proxy verification meant that the discordsays.com proxy would send these headers to verify that an actual Discord client had connected with them, but uh, I checked the flowchart again and I got that wrong. Hm. Thankfully, I didn’t get too far into implementing that. Regardless, trying to implement that still encouraged me to do a small bit of cleanup, which was properly declaring the environment variable. A certified moment. (YES I am going to abuse the fact that I figured out that you can use custom emotes here. i am so sorry) smol devlog
it’s REDISin’ time! wait is that… not the line from the movie? (also SORRY this should have been at least a couple devlogs lol, please forgive me) I’ve finally been working on the state management for LARPARDY! This turns out to be a MUCH harder task than I originally thought it would be, particularly because I’m trying to make sure that this will be safe and work well in a real environment. Redis First of all, instead of keeping state in the server’s memory, I have added a Redis DB to the project. This is part of why I wanted Docker set up, as this is now just in the docker-compose.yml ! I have NEVER personally used Redis before, so some time of the time from this devlog was admittedly stumbling my way through figuring out how to use Redis correctly. CORRECTLY is the key word, to be clear. I’m building basically a wrapper class around the Redis database, StateManager , which abstracts away the nasty database stuff so the main code doesn’t have to worry about actually interacting with Redis. It was, kind of a pain to write actually (lol?), because I was worried about race conditions basically the entire time, since this code needs to run async (i.e., something else might do something to a thing while we’re also trying to do something with that thing). I HOPE that the state management code is bug free for now, but we’ll see. (please…) Client The client has now also been updated to listen for new game states. I also finally figured out how to set up Rich Presence, so it will show that you’re playing LARPARDY on your profile! In addition, I made it so in-game avatars will highlight green when someone is speaking (like Discord), and I added waiting UI for when a player has joined but hasn’t fully connected yet, AND for when you are still connectin#. so NOWW can we start to make the actual game? yyyyyYES! I think so. I hope, anyway (lol). I believe my next step will be making a basic lobby/waiting UI that lets you start the game, and then finally start to implement the actual game. I AM EXCITEEEEDD (there’s not a ton to look at since this was mostly backend work. sorry! i’ll have more next time :3)
socket.io is cool, BUT So. 8 hour devlog, my bad, but I’m going to start by talking about the thing that I’ve been mostly fighting with today. The networking backend that I’m using for LARPARDY is Socket.IO , which works similarly to (and usually on top of) WebSockets, but with a lot more quality of life features and ease of use for specifically these kinds of situations. I have been fighting for a few hours today trying to figure out why I could not, for the life of me, get socket.emit to work on the client. It was, in fact, one setting, retries , in the client config, stopping it from working, for SOME reason. Oops. Anyways… PROGRESS! (GAME!) Progress has been steady! Most of the changes that I’ve been making have been making the client more workable as I make new components, and actually more planning out the infrastructure. I’ve designed some new UI elements, moved where some state is stored, and so on. I have a bad habit of overplanning, or rather, being too worried about planning big projects like these, because I like to avoid having to do cleanup work later (like the cleanup that I’m doing on the client right now). It’s not strictly a bad habit, but sometimes it’s better to just write the code rather than spend hours deliberating about micro-optimizations with yourself. I believe I am now ACTUALLY at the point where I can begin properly building the UI for the game board and the frontend & backend aspects around that. This was more hidden work (and… fighting with the socket.io client, apparently) so I don’t have too much to show this time either, sadly. BUT, I did finally design and prototype the lobby! So you do get something fun to look at while I work on everything lol
I prototyped the game board last night! This took a while to get the styling right as I want this to work well on all screen sizes, hopefully including mobile devices. It’s still a little rough on very small sizes (e.g., my phone), but one step at a time! I still want to add little “podiums” at the bottom for our players. After that, I’m going to be working on getting the board working on the serverside, so that actually becomes part of the game state.
BEEEG DEVLOG Wowwee! I’ve gotta remember to make devlogs more often. Seriously. Here’s a list of changes that I’ve made since my last devlog! The basics of the board are implemented! You can’t interact with it yet, but the template to do so is there, and it now exists on the server-side too and the client reads from that state. The board is also animated now. When someone selects a clue, it will highlight the category and the clue, you can hover clues, and, my favorite bit, the categories get revealed one by one when the game starts! That last part actually kind of sucked to implement lol. I prepared for this when making the lobby’s ready up system and made the state that it uses to work a bit dynamic because I knew that I would need it! The state stores readyForNextState , which for some states (like when we’re in the lobby) allow unreadying, but for others, simply act as a marker of whether a specific client is ready to move on. This is probably actually really important because if we just ran a timer on the server, a NUMBER of things could go wrong, most importantly being that a laggy client could get desynced VERY quickly and have a bad time. Alongside this, there is an intro now! I spent a good bit of time in Aseprite and messing with FL Studio to make some art and an intro track, both for the logo and so I finally have some artwork to add in the Discord Developer Portal, so there aren’t anymore blank assets. It’s not perfect (i am NOT an artist lol) See pictures below! psst , I also made a “think” music track for if the final round is enabled! It’s not in the game yet, though. I made a number of styling fixes. The board in particular looks much better on different screen sizes now, even on my phone. Reminder to use relative sizes when able, not px ! The server now registers the activity entry point command as having an APP_HANDLER handler, which means that the server must respond to interactions now, rather than Discord autolaunching the activity. The benefit of this is that we have control over whether a message gets sent to the channel it was started in (and when), or if we even launch the activity at all (disallow banned users? anything is possible…)! The rich presence actually has meaningful details now lol, rather than placeholder text. NOWWW what? I am going to, FINALLY, FOR REAL THIS TIME, (lol) actually start making the game logic. (It’s about time!) More updates sooooon!
A REAL BOARD! A trickier task than it sounds like, but I needed some clues finally! The default testing board was uh… not exactly “production ready” in my opinion (lol). This was tricky particularly because, well, where am I going to get clues from? You kinda need a LOT of clues for a good Jeopardy game, and while UGC is something I want to make, I would like a default mode, too, and there is certainly no way that I was going to try to make a bunch of clues by myself. (respectfully, I don’t think I am also smart enough to do that lol) Jepp I found a little project called jepp which exposes a LOT of existing Jeopardy clues through an API. I didn’t want to bother that API too much though, and there is an SQLite DB dump publicly available, so LARPARDY now uses that instead. With a little bit of SQL later (and, uh, remembering how to use SQL lol)… we have many, many clues! The only thing is that the database does not store the value of clues, so it’ll be a bit random. A $1000 clue might end up being super easy lol, but I think that’s some jank I’m okay with. Player list Ooh also, I made a proper player list now! I did want literal podiums, which I may still do at some point, but I’m happy with this for the time being. This can now also react to changes in the game like points or who’s turn it is!
Questions, and MORE boring serverside stuffs Oof, sorry, it’s been a while since I’ve been able to work on this project, and the clock is ticking! Clues! Clues can now actually be selected and that will be reflected to the server and all players. You can also see a bit of the buzzer work I started, which is actually much more of a pain than it would seem. Why? Well that’s because we now have to talk about: SYNCING TIME OVER THE NETWORK The server running the game has a system time. Your computer, phone, or whatever, also has its own system time which could vary entirely from the server’s. If the server wants to schedule an event (say, when you should be allowed to buzz in), how does it tell the client when that is without an offset? Using Unix timestamps is common, but without knowing how offset the client is from the server, we don’t actually really know when that timestamp is in reality (since EITHER could be offset from reality, if not both), and we don’t want mismatched times to cause weird problems. The solution that I went with is that the client will periodically (every 1 second for now) send a “ping” message to the server with its current timestamp. The server will reply with that time as well as it’s own timestamp. Upon receiving that reply, it can then do three things: Calculate the round trip time (i.e., ping!) from the original time we sent and the time it is now. Estimate the server time as we’re processing this by adding the server time + half of the ping Calculate our time offset from the server by subtracting our time from that estimate I admit that I did NOT figure this out on my own. Google is nice. But this does actually kind of serve as the basis for how things like the Network Time Protocol (NTP) work. Reminder that all of that is just so we can show when the buzzer is allowed to be pressed accurately. Spectating Also, I added a fix so late players aren’t actually awkwardly added in the middle of a game and are instead in a kind of “spectator” state; since they’re still connected, they receive all the game state events and so on. If all actual players leave, the game will reset (which also means I now have a function to reset the state, and for showing alerts!).
IT’S READY! I am very happy to say that I’m done with the main game! I wanted to split this into a couple of devlogs, but Stardance was having some issues syncing time earlier so I kept working. (I think it’s actually been up for a little bit… oops) Buzzing -> Judging Judging now is fully functional! Either someone gets the clue right, everyone gets it wrong, or not everybody buzzes in and we move on. I’ve also introduced something called Hostless Mode , which allows the game host to play (where normally they could not). This plays more like most online versions of the gameshow, where you can buzz in, reveal the answer, and then that’s that (instead of everyone getting a chance to buzz in if the first person is wrong). This also gives a way to play singleplayer, which should make it more accessible. All of this took a lot of careful logic work to make sure that everything works as expected (hence the VERY long log time, plus several other things), no matter how you’re playing! End of Line The game, also, can finally end, now that clues get marked off. I made a simple leaderboard that shows when the game is over, and then you can return to the lobby! See the photo below. GAMEPLAY! You can watch a short gameplay example with a host (right) + 2 players (left) below! You’re expected to play with voice (or a text channel, if you wish), so this demo just showcases the flow of the game. I logged a lot of time on this one because there was also a lot of testing and fixing small bugs, especially when making the judging system. A lot can get weird when managing so much state!
SHIP IT! LARPARDY! is now verified on Discord! I spent a short while writing a basic Terms of Service and Privacy Policy (as required by Discord) and verifying all the details. Live deployment I’ve also deployed a production version of the game server to my home lab! It’s exposed through a Cloudflare Tunnel, because I’m behind CGNAT (i.e., I don’t have my own public IP). Spending all that time setting up Docker for this project all that time ago made this VERY easy, which was the entire point. I’m glad nothing broke in the process… lol Discovery The last thing I want to do is set up Discovery on Discord, so reviewers (and anybody, for that matter!) can just search up LARPARDY! in Discord, and it should come up. I pretty much just need to make a support server and write the details, and then… LET’S SHIP IT! I dunno if anybody reads these things, but if you do, thank you. :D
Last devlog before ship (proper this time!) Discovery I set up a Discord server for the game, so LARPARDY! is now on Discord’s discovery (App Directory)! This is now used for the demo link for the game. README (please) Just spent some time redoing the (ancient) README and making it look pretty and detailed. I took some screenshots and added them here. They also show up on Discord! :D
Ships:
I made a Discord activity trivia game inspired by the Jeopardy game show called LARPARDY! that you can easily play with your friends without leaving Discord! I am very proud of how far this project has come because it was very challenging for me. The frontend is based on Vue.js, which before this, I had never used before. I wanted to try something non-React and I’ve come to REALLY love Vue. I had to write multiplayer netcode entirely by myself! I used Socket.IO to handle the networking itself, but I had to write ALL of the state management and syncing code. There were certainly some difficulties in doing so! I also have not worked with Redis before, which was my database of choice for state management. It is… quite different from other databases, so writing code to interact with it was a learning experience....
|
1792820949.7155461
|
1792907349.7155461
|
|
39412
|
Cultivation Incremental by @RanDK | Stardance
|
RanDK
|
2
|
93.0
|
1329
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-08T14:06:11Z", "hours": 20.0, "multiplier": 17.26, "payout": 338, "blessing": "neutral", "text": "VERSION 0.1 Only 16+ can play the Game currently as any other new roblox game. I am glad to add more of the essentials mechanic of the Game! Now here is the List of Features i have added to the game since the last release: Added Onboarding/Tutorial! I see a lot of player gets confused when they first joined the game, so now i added a tutorial on the basic of the game. That is: Cultivate, Shop, and Quest. Added New Enemy : Goblin. Added More quests . Added Cultivating Animation! Added Gamepass! Now you can buy a gamepass to get a benefit and support me! + Gamepass badge on the bottom left of the screen when bought. And more! you can read all the devlogs to see the small changes. I still have some features not yet implemented, that is fighting enemy animation, weapons, and PVP . But i don’t really have the courage since the Stardance deadline is within 3 weeks (and its already extended), but i do have plan to continue the project later in December for my own personal project (close sourced, even though right now its already semi close source since the models, maps i used is not in the code but in the roblox studio file.). Thanks for everyone who have followed the game journey, albeit short i thank you guys for supporting me!! (Especially those who bought my gamepass!!) . I CANT BELIEVE I GOT MY FIRST ROBUX FROM MAKING A GAME HERE IN STARDANCE :DD THANK YOU SO MUCH!!! This Game is Made with the best of my Game Dev abilities .", "repo": "https://github.com/RKPYI/cultivation", "demo": "https://www.roblox.com/games/128506264671282/Cultivation-Incremental"}, {"ship_num": 2, "ts": "2026-08-17T03:44:11Z", "hours": 73.0, "multiplier": 13.89, "payout": 991, "blessing": "neutral", "text": "VERSION 0.0.1 Only 16+ can play the Game currently as any other new roblox game. I am glad to finish the essentials mechanic of the Game! Now here is the List of Features the game have: Cultivate, just stand on the existing zone (and make sure you have the required Realm) and you’ll gain Qi automatically Breakthrough, the moment the top bar is full, you can breakthrough to higher realm which increases your qi gain and boost movement speed and jump a little bit. Quest, you can talk to an NPC with a (!) to get the quest. After finishing a quest, you can talk to the NPC again to claim the quest rewards. Battle, you can walk to enemy and you’ll automatically deal damage to them! Shop, you can buy items in shopkeeper NPC with Spiritual Stones which you can get from defeating an enemy or finishing a quest. The feature is implemented, but its very simple and “unprofessional”. Lame excuse but its really because this is my first time making game and im still learning the basics. I’ll be adding more stuff and refine the core features in the future updates!! This game is made for the love of the game and genre :)", "repo": "https://github.com/RKPYI/cultivation", "demo": "https://www.roblox.com/games/128506264671282/Cultivation-Incremental"}]...
|
[{"post_id": 74457, "ts": "202 [{"post_id": 74457, "ts": "2026-09-27T12:35:39Z", "hours": 6.9819, "text": "[Devlog #29] The Last Devlog The Game New Contents Gamepass! Now you can buy a gamepass to get a benefit and support me! + Gamepass badge on the bottom left of the screen when bought. Add beam/arrow to the quest npc when you’re done with their given quest. Add equip best button in the inventory menu. Add dmg mult information in the inventory meny (item detail menu). Updates Fix some bugs, for example player able to move while cultivating. Optimize and remove unused leaderboards. ready to publish it! Thank you for the opportunity Hackclub for me to grow as a beginner roblox developer I appreciate the support from everyone although my game is far from “professional”, atleast its a fully working game! and Im happy with it."}, {"post_id": 68131, "ts": "2026-09-14T15:48:31Z", "hours": 1.1519, "text": "[Devlog #28] New Content Added “Aura” like particle effect when cultivating, its more like you “suck” the surrounding qi into the body. Update Update the collision system to be more robust, before theres a problem with the collision when i try adding the Aura Part inside the Player. Now it will independently calculate the spatial rather than touching. Nothing crazy, just some cool small detail."}, {"post_id": 66709, "ts": "2026-09-12T16:27:10Z", "hours": 2.3578, "text": "[Devlog #27] New Contents New Mobile Button to Cultivate New Shortcut UI to press “C” to Cultivate when entering a Zone they can cultivate in. New Tutorial Section to tell the player to press “C” to start cultivating and gathering qi. Update Player now can’t walk/jump when cultivating May need to revise the button for mobile since its very basic right now"}, {"post_id": 66071, "ts": "2026-09-11T17:16:34Z", "hours": 1.8178, "text": "[Devlog #26] New Content Added Cultivating Animation! Update Now you have to press “C” to cultivate rather than just automatically gain Qi just by entering the Qi Zone. Next one is to add button for mobile user, and also add UX feedback for when they’re able to press C to cultivate and when they can’t (outside zone & higher realm zone). Oh! also adding particle/aura when player is cultivating for more satisfying feel."}, {"post_id": 61661, "ts": "2026-09-04T18:08:47Z", "hours": 0.5442, "text": "[Devlog #25] Updates Added more quests Optimize NPCServiceUtils.Data JSON for NPC that gives Chained Quests. Mostly just optimizing the json by creating a helper so that making a quest is easier and less error prone."}, {"post_id": 60953, "ts": "2026-09-03T17:11:44Z", "hours": 3.1036, "text": "[Devlog #24] New Content Added Onboarding/Tutorial ! I see a lot of player gets confused when they first joined the game, so now i added a tutorial on the basic of the game. That is: Cultivate, Shop, and Quest . Im really happy with the result, i didn’t expect making the trail line to be so easy (using beam instance from roblox themself). And maybe i’ll add onboarding for fighting enemy and equipping items, but its not really neccessary (i think)."}, {"post_id": 60245, "ts": "2026-09-02T14:23:32Z", "hours": 2.5775, "text": "[Devlog #23] New Content Added refresh countdown on leaderboard UI. Updates Moved enemy overhead gui from server to client (not yet tested for the behaviour in multiplayer) for more personalization (point 2 is possible because of this change). Dynamic enemy name color, higher realm will be colored red and cannot be attacked no matter how high your dmg is until you reach their cultivation rank. Polishing the game :))"}, {"post_id": 59659, "ts": "2026-09-01T16:01:39Z", "hours": 1.0572, "text": "[Devlog #22] New Contents Added 1 more enemy, goblin. Update Remove the realm requirement in NPC Shop for buying an item (Cannot buy the item until realm req is fulfilled). The requirement now only active when trying to equip the item. Fixed quest id being duplicated. im back!! hopefully i can make some more stuff although i may not have as much free time as before. I’ll try to make some progress everyday though! Try it Now Game may not be up to date from the devlog Cultivation Incremental (16+)"}, {"post_id": 46405, "ts": "2026-08-13T16:13:06Z", "hours": 0.8792, "text": "[Devlog #21] Updates Added a proper README. Fixed some minor bugs. The next devlog will be for a published Game . Its not a professional Roblox game, but its my learning process from 0 to this. So i appreciate any type of critics and feedback for me to develop this game furthur, because i really love these type of games. So im literally making my dream game here! But its still lacking to my vision because of my lack of time and skills."}, {"post_id": 45814, "ts": "2026-08-12T15:17:53Z", "hours": 0.6147, "text": "[Devlog #20] Update Added 1 more quest New Assets Added Game Icon and Thumbnail Spent most of my time on figma designing the Icon and Thumbnail of the game, but the time is not getting tracked because i use the app instead from web . Not yet released, but i’ll be testing it first with a few friends first and maybe add some feature because ngl it feels bland right now, but maybe its just my opinion. So to get some feedback, ill be testing it with my friends tommorow and maybe catch some multiplayer bugs that i couldn’t find when playing alone. I really don’t want to publish a boring game, but the time is ticking and im getting more and more busy this month."}, {"post_id": 45161, "ts": "2026-08-11T14:03:07Z", "hours": 0.3044, "text": "[Devlog #19] Update New UI for Leaderboard! I’ll be polishing the game (for real) and release the first version tommorow (hopefully)… Im getting really busy"}, {"post_id": 44685, "ts": "2026-08-10T16:42:21Z", "hours": 3.5644, "text": "[Devlog #18] New Content Added Qi Mult Counter when entered a Zone. The fire has animation Added Leaderboard . (UI is In Progress) . Spent most of my time making UI Animation using sprite sheet and integrate DataStoreService for leaderboard"}, {"post_id": 44139, "ts": "2026-08-09T18:19:01Z", "hours": 0.3978, "text": "[Devlog #17] Update Make the Breakthrough bar slimmer and more compact. Im kinda busy today and havent done anything yet, so im just improving the ui a little bit. Also i wanna add a Current Qi Multiplier Counter at the Top Right Corner of the screen using the fire gif."}, {"post_id": 43367, "ts": "2026-08-08T15:57:22Z", "hours": 4.3803, "text": "[Devlog #16] New Content Added 5 new Items you can buy. Updates Implemented the Functionality of the NPC Shop. You can now buy items here. Updated the Shop UI, now it looks better compared to previous version. Spent most of my times debugging the UI since i reuse the modal component that the main menu uses. So yea, i integrate the npc shop inside it and that creates a lot of bugs and conflict . Well i fixed all the bug i found so thats good. Now that the main features is done the next step is to polish the map and adding the game content (More NPC, Quest & Items)"}, {"post_id": 42792, "ts": "2026-08-07T18:02:10Z", "hours": 1.4983, "text": "[Devlog #15] Update Added UI for NPC Shop Spent all of my time designing the UI… i still dont like the yellow box, but it’ll do for now. Next i’ll be making it dynamic and functionable."}, {"post_id": 41964, "ts": "2026-08-06T14:25:20Z", "hours": 2.245, "text": "[Devlog #14] New Content Added Shop NPC (no functionality yet) Updates Enemy now drops Spiritual Stones Bugfixes & Refactor Fix Quest bug, it needs some nil value check protection. Fix Zone bug when player quit/disconnect, have to stop a task gracefully when the player disconnect. Refactor Inventory UI Component to use useMemo and make the Item Display Panel its own component. Zone Detection now only detect the user HumanoidRootPart for reliability and no jittery detection. No major progress today, just bugfixing and refactoring. I think im getting close to finishing the main loop of the gameplay. Cultivate -> Breakthrough -> Fight stronger enemy -> Buy better item in shop -> Cultivate -> Repeat."}, {"post_id": 41418, "ts": "2026-08-05T16:45:14Z", "hours": 4.5714, "text": "[Devlog #13] New Contents Added Marks for NPC with Quest Combat and Enemy! (Its partially done) The combat is still barebone, you get close to the enemy, the enemy got damaged by 1, when its hp is 0, it’ll add to the player totalEnemyKilled +1. Thats the current implementation. I will polish the combat feature and integrate it with the quest feature so that it tracks the amount of “enemy” killed."}, {"post_id": 40786, "ts": "2026-08-04T15:21:08Z", "hours": 2.5389, "text": "[Devlog #12] New Content Added Spiritual Stone . a new currency with no functionality yet. I’ll be adding shop that uses Spiritual Stone as the currency. Updates Now, completing a quest gives reward . Currently, you can get spiritual stones or items from quests. Added Notification Badge in the inventory button UI for when player get a new item. Remodeled the Old Man to Mysterious Being . Next i’ll polish the npc interaction more by adding a “❓” for npc with quest, and “❗” for a finished quest. And maybe start building the next feature, that is herb collection/fighting enemy."}, {"post_id": 40130, "ts": "2026-08-03T15:06:52Z", "hours": 5.1494, "text": "[Devlog #11] New Contents Added Quest List UI on the right side of the screen. 2 New Sfx for Taking a quest and Completing a quest. Updates Improves NPC Dialog UI , look at Devlog #10 for comparison. Options in the dialog now have a keyboard shortcut with the corresponding number. For example: clicking 1 in keyboard will click the first option. Refactors Create a Close Button component for ease of use. Refactor Dialogue View UI by creating DialogueOptions component. I am very satisfied with the Quest List UI, its looking really clean and good. I also make another design for the dialogue rectangle, its subtle but there’s a pattern and gradient on the dialogue UI. Next work is adding more npc, quest, and actually adding the Quest Rewards . Im planning on adding Spiritual stones and shops for item that improves qi gain. And maybe adding weapon and enemy in the future."}, {"post_id": 39516, "ts": "2026-08-02T14:54:08Z", "hours": 3.6114, "text": "[Devlog #10] New Contents Added NPC Dialogs Added Quests Features Broo, this two thing is messing my brain especially with all the thing to consider… Atleast the ui is presentable and its functionality is basically done. Its quest progress is actually saved to the Player Data, but there is no progress update yet, and also i can repeatedly take this quest again and again… Ok the serverside makes the player to not be able to take same quest twice, so its safe. But the UI, there is not yet state/system to detect that the user already take the quest… My next work is probably: Updating UI so that it knows the player already took the Mission. Adding taken quest UI Update the quest progress, etc. OK everything i said sounds very confusing even to me . In conclusion, my next work is just finishing the quests features and polishing the UI."}, {"post_id": 38931, "ts": "2026-08-01T15:15:53Z", "hours": 5.4314, "text": "[Devlog #9] New Contents BIGGER MAP (Added more houses, trees, mountains, clouds, and floating island). Added 4 more Zones . Added Realm List Board beside Spawn, it has the Full list of All Realms level. Updates Qi Particle inside zone now have different color as qi multiplier gets higher. Color hierarchy: White –> Blue –> Purple –> Gold Increasing qi requirement for Realm 100+ (Immortals) [Kinda irrelevant right now, since its statistically impossible to get there]. Added better placeholder image for Item. Changed Item Background according to Whether player can equip it or not (Realm requirement met). Red for can’t equip, Blue for can equip, Green for equipped item. Refactors (Technical) Move Qi Breakthrough sfx from RealmService to the SoundService. Move Zone Detection to Serverside for security reason. I still haven’t refactored the Inventory UI yet and all the models is not made by me. The only model i made was the Realm Board List. But every UI is made by me! (except for the fire icon)."}, {"post_id": 38278, "ts": "2026-07-31T16:19:33Z", "hours": 4.4764, "text": "[Devlog #8] New Content Item !! You can get more Qi Multiplier from item. And theres also Realm Requirement for each item. Inventory UI is now working (except for Delete Button). Info For the UI, the Layout Order is prioritizing equipped item. If Player realm lower than requirement, the requirement text will be red. Implementing Inventory system was very complicated, especially the ui. So many state, maybe its because i put basically everything in one file. I’ll refactor that first before im adding new content, otherwise i’ll lose my mind editing that spaggeti code later down the line… Anyway, as you can see in the screenshot. I don’t have the asset for items yet. Maybe i’ll work on that later, though not the highest priority. My priority right now is to refactor the ui and implement the delete button and adding Equip Best button."}, {"post_id": 37660, "ts": "2026-07-30T15:33:17Z", "hours": 4.3217, "text": "[Devlog #7] New Content Added Background Music ! Added Music and Sfx toggle in Settings Added Walkspeed & Jump Boost from Realm level Added Sprint ! Press Left Shift to Sprint. Bug Fixes Fix Overhead Gui , Everyone now have the Overhead Gui, and the Realm Level is synced to the actual player Realm. P.S. Shop and Inventory is still empty… Its hard designing and actually implementing the UI… Also i have too much idea and at the end only think about it and dont know how to implement it"}, {"post_id": 37040, "ts": "2026-07-29T14:43:03Z", "hours": 3.4936, "text": "[Devlog #6] Update Force player to use R6 Model for simplicity. New Content Added a Forest around the map. Added Menu Button (Settings, Shop, Inventory) Added Modal UI Component (still empty) Added SFX for Button when clicked and hovered. P.S. Most of my time is spent on making the design for the Settings, Shop, and Inventory Icon. And also on the functionality of the button (open/closing modal). Next, i’ll probably work on adding more sfx and backsound for the game. And also make the gui of the shop and settings."}, {"post_id": 36378, "ts": "2026-07-28T13:36:41Z", "hours": 4.3125, "text": "[Devlog #5] Update Implemented zone Realm Requirement and Qi Multiplier . Updated the Map, Not Final! just want to make it look like a grass. New Content Added more Realm , i use the webnovel Top Tier Providence for reference of realm names. Added 3 New Zone ’s. Added Qi Popups where it shows how much qi you just gained with accumulation. Optimization Refactoring how the system detect player entering a zone . From Looping a function every frame to saving it to a State where if player enters a zone, it update the state to True and start giving qi every second. VERY EFFICIENT!! P.S. All the models (Houses & Waterfall) is NOT made by me, i got it from roblox creator store free assets"}, {"post_id": 35806, "ts": "2026-07-27T14:04:34Z", "hours": 0.8486, "text": "[Devlog #4] Update Balancing Qi realm requirement and Qi bonus from realm . New Content Added UI for Cultivating Area . The UI Contain the Realm Requirement to Cultivate there (If requirement is not met, you don’t get any qi), and Qi Multiplier for that Area (Multiply with the Qi bonus from realm ) P.S. The Cultivating Area UI is not yet dynamic, and the functionality of realm requirement and qi multiplier from area is not yet implemented. My next goal is to implement the Area functionality and add atleast 3 more area to cultivate."}, {"post_id": 35190, "ts": "2026-07-26T13:39:43Z", "hours": 5.6908, "text": "[Devlog #3] Update Implemented the functionality of the previous static UI. Now the progress bar UI and the overhead UI is dynamic following User Data. You now can Breakthrough to go to Higher Realm. Added SFX for breaking through. Info Realm increases player qi gains. The higher the realm, the higher the qi gains. P.S. The Overhead UI currently added above the current user (local), other player won’t have the Overhead UI for now. I’ll work for new feature first before fixing that."}, {"post_id": 34693, "ts": "2026-07-25T16:50:59Z", "hours": 2.9936, "text": "[Devlog #2] New Content Added New Progression Layer: Realm Added Progress Bar UI for Realm (Not yet dynamic) Added Overhead UI for Player Current Realm and Username (Not yet dynamic) Bugfixes Fix user detection enter an area (the big transparent box); The Box is an Area that gives qi per second when entered."}, {"post_id": 34378, "ts": "2026-07-25T01:26:07Z", "hours": 12.1419, "text": "[Devlog #1] I learned the basics of Roblox Studio, Plugins, making UI in Figma in this first 12 recorded hour. Theres not much yet because im just trying to set up the project and familiarize myself with the language. I use wally for depedency manager and github for versioning. I just wanna learn new stuff here, so don’t expect a fully polished game at the end. I Can only hope that i have the work ethics to finish this project (Having a proper game loop)."}]...
|
Title: Cultivation Incremental by @RanDK | Stardan Title: Cultivation Incremental by @RanDK | Stardance
Devlogs:
[Devlog #1] I learned the basics of Roblox Studio, Plugins, making UI in Figma in this first 12 recorded hour. Theres not much yet because im just trying to set up the project and familiarize myself with the language. I use wally for depedency manager and github for versioning. I just wanna learn new stuff here, so don’t expect a fully polished game at the end. I Can only hope that i have the work ethics to finish this project (Having a proper game loop).
[Devlog #2] New Content Added New Progression Layer: Realm Added Progress Bar UI for Realm (Not yet dynamic) Added Overhead UI for Player Current Realm and Username (Not yet dynamic) Bugfixes Fix user detection enter an area (the big transparent box); The Box is an Area that gives qi per second when entered.
[Devlog #3] Update Implemented the functionality of the previous static UI. Now the progress bar UI and the overhead UI is dynamic following User Data. You now can Breakthrough to go to Higher Realm. Added SFX for breaking through. Info Realm increases player qi gains. The higher the realm, the higher the qi gains. P.S. The Overhead UI currently added above the current user (local), other player won’t have the Overhead UI for now. I’ll work for new feature first before fixing that.
[Devlog #4] Update Balancing Qi realm requirement and Qi bonus from realm . New Content Added UI for Cultivating Area . The UI Contain the Realm Requirement to Cultivate there (If requirement is not met, you don’t get any qi), and Qi Multiplier for that Area (Multiply with the Qi bonus from realm ) P.S. The Cultivating Area UI is not yet dynamic, and the functionality of realm requirement and qi multiplier from area is not yet implemented. My next goal is to implement the Area functionality and add atleast 3 more area to cultivate.
[Devlog #5] Update Implemented zone Realm Requirement and Qi Multiplier . Updated the Map, Not Final! just want to make it look like a grass. New Content Added more Realm , i use the webnovel Top Tier Providence for reference of realm names. Added 3 New Zone ’s. Added Qi Popups where it shows how much qi you just gained with accumulation. Optimization Refactoring how the system detect player entering a zone . From Looping a function every frame to saving it to a State where if player enters a zone, it update the state to True and start giving qi every second. VERY EFFICIENT!! P.S. All the models (Houses & Waterfall) is NOT made by me, i got it from roblox creator store free assets
[Devlog #6] Update Force player to use R6 Model for simplicity. New Content Added a Forest around the map. Added Menu Button (Settings, Shop, Inventory) Added Modal UI Component (still empty) Added SFX for Button when clicked and hovered. P.S. Most of my time is spent on making the design for the Settings, Shop, and Inventory Icon. And also on the functionality of the button (open/closing modal). Next, i’ll probably work on adding more sfx and backsound for the game. And also make the gui of the shop and settings.
[Devlog #7] New Content Added Background Music ! Added Music and Sfx toggle in Settings Added Walkspeed & Jump Boost from Realm level Added Sprint ! Press Left Shift to Sprint. Bug Fixes Fix Overhead Gui , Everyone now have the Overhead Gui, and the Realm Level is synced to the actual player Realm. P.S. Shop and Inventory is still empty… Its hard designing and actually implementing the UI… Also i have too much idea and at the end only think about it and dont know how to implement it
[Devlog #8] New Content Item !! You can get more Qi Multiplier from item. And theres also Realm Requirement for each item. Inventory UI is now working (except for Delete Button). Info For the UI, the Layout Order is prioritizing equipped item. If Player realm lower than requirement, the requirement text will be red. Implementing Inventory system was very complicated, especially the ui. So many state, maybe its because i put basically everything in one file. I’ll refactor that first before im adding new content, otherwise i’ll lose my mind editing that spaggeti code later down the line… Anyway, as you can see in the screenshot. I don’t have the asset for items yet. Maybe i’ll work on that later, though not the highest priority. My priority right now is to refactor the ui and implement the delete button and adding Equip Best button.
[Devlog #9] New Contents BIGGER MAP (Added more houses, trees, mountains, clouds, and floating island). Added 4 more Zones . Added Realm List Board beside Spawn, it has the Full list of All Realms level. Updates Qi Particle inside zone now have different color as qi multiplier gets higher. Color hierarchy: White –> Blue –> Purple –> Gold Increasing qi requirement for Realm 100+ (Immortals) [Kinda irrelevant right now, since its statistically impossible to get there]. Added better placeholder image for Item. Changed Item Background according to Whether player can equip it or not (Realm requirement met). Red for can’t equip, Blue for can equip, Green for equipped item. Refactors (Technical) Move Qi Breakthrough sfx from RealmService to the SoundService. Move Zone Detection to Serverside for security reason. I still haven’t refactored the Inventory UI yet and all the models is not made by me. The only model i made was the Realm Board List. But every UI is made by me! (except for the fire icon).
[Devlog #10] New Contents Added NPC Dialogs Added Quests Features Broo, this two thing is messing my brain especially with all the thing to consider… Atleast the ui is presentable and its functionality is basically done. Its quest progress is actually saved to the Player Data, but there is no progress update yet, and also i can repeatedly take this quest again and again… Ok the serverside makes the player to not be able to take same quest twice, so its safe. But the UI, there is not yet state/system to detect that the user already take the quest… My next work is probably: Updating UI so that it knows the player already took the Mission. Adding taken quest UI Update the quest progress, etc. OK everything i said sounds very confusing even to me . In conclusion, my next work is just finishing the quests features and polishing the UI.
[Devlog #11] New Contents Added Quest List UI on the right side of the screen. 2 New Sfx for Taking a quest and Completing a quest. Updates Improves NPC Dialog UI , look at Devlog #10 for comparison. Options in the dialog now have a keyboard shortcut with the corresponding number. For example: clicking 1 in keyboard will click the first option. Refactors Create a Close Button component for ease of use. Refactor Dialogue View UI by creating DialogueOptions component. I am very satisfied with the Quest List UI, its looking really clean and good. I also make another design for the dialogue rectangle, its subtle but there’s a pattern and gradient on the dialogue UI. Next work is adding more npc, quest, and actually adding the Quest Rewards . Im planning on adding Spiritual stones and shops for item that improves qi gain. And maybe adding weapon and enemy in the future.
[Devlog #12] New Content Added Spiritual Stone . a new currency with no functionality yet. I’ll be adding shop that uses Spiritual Stone as the currency. Updates Now, completing a quest gives reward . Currently, you can get spiritual stones or items from quests. Added Notification Badge in the inventory button UI for when player get a new item. Remodeled the Old Man to Mysterious Being . Next i’ll polish the npc interaction more by adding a “❓” for npc with quest, and “❗” for a finished quest. And maybe start building the next feature, that is herb collection/fighting enemy.
[Devlog #13] New Contents Added Marks for NPC with Quest Combat and Enemy! (Its partially done) The combat is still barebone, you get close to the enemy, the enemy got damaged by 1, when its hp is 0, it’ll add to the player totalEnemyKilled +1. Thats the current implementation. I will polish the combat feature and integrate it with the quest feature so that it tracks the amount of “enemy” killed.
[Devlog #14] New Content Added Shop NPC (no functionality yet) Updates Enemy now drops Spiritual Stones Bugfixes & Refactor Fix Quest bug, it needs some nil value check protection. Fix Zone bug when player quit/disconnect, have to stop a task gracefully when the player disconnect. Refactor Inventory UI Component to use useMemo and make the Item Display Panel its own component. Zone Detection now only detect the user HumanoidRootPart for reliability and no jittery detection. No major progress today, just bugfixing and refactoring. I think im getting close to finishing the main loop of the gameplay. Cultivate -> Breakthrough -> Fight stronger enemy -> Buy better item in shop -> Cultivate -> Repeat.
[Devlog #15] Update Added UI for NPC Shop Spent all of my time designing the UI… i still dont like the yellow box, but it’ll do for now. Next i’ll be making it dynamic and functionable.
[Devlog #16] New Content Added 5 new Items you can buy. Updates Implemented the Functionality of the NPC Shop. You can now buy items here. Updated the Shop UI, now it looks better compared to previous version. Spent most of my times debugging the UI since i reuse the modal component that the main menu uses. So yea, i integrate the npc shop inside it and that creates a lot of bugs and conflict . Well i fixed all the bug i found so thats good. Now that the main features is done the next step is to polish the map and adding the game content (More NPC, Quest & Items)
[Devlog #17] Update Make the Breakthrough bar slimmer and more compact. Im kinda busy today and havent done anything yet, so im just improving the ui a little bit. Also i wanna add a Current Qi Multiplier Counter at the Top Right Corner of the screen using the fire gif.
[Devlog #18] New Content Added Qi Mult Counter when entered a Zone. The fire has animation Added Leaderboard . (UI is In Progress) . Spent most of my time making UI Animation using sprite sheet and integrate DataStoreService for leaderboard
[Devlog #19] Update New UI for Leaderboard! I’ll be polishing the game (for real) and release the first version tommorow (hopefully)… Im getting really busy
[Devlog #20] Update Added 1 more quest New Assets Added Game Icon and Thumbnail Spent most of my time on figma designing the Icon and Thumbnail of the game, but the time is not getting tracked because i use the app instead from web . Not yet released, but i’ll be testing it first with a few friends first and maybe add some feature because ngl it feels bland right now, but maybe its just my opinion. So to get some feedback, ill be testing it with my friends tommorow and maybe catch some multiplayer bugs that i couldn’t find when playing alone. I really don’t want to publish a boring game, but the time is ticking and im getting more and more busy this month.
[Devlog #21] Updates Added a proper README. Fixed some minor bugs. The next devlog will be for a published Game . Its not a professional Roblox game, but its my learning process from 0 to this. So i appreciate any type of critics and feedback for me to develop this game furthur, because i really love these type of games. So im literally making my dream game here! But its still lacking to my vision because of my lack of time and skills.
[Devlog #22] New Contents Added 1 more enemy, goblin. Update Remove the realm requirement in NPC Shop for buying an item (Cannot buy the item until realm req is fulfilled). The requirement now only active when trying to equip the item. Fixed quest id being duplicated. im back!! hopefully i can make some more stuff although i may not have as much free time as before. I’ll try to make some progress everyday though! Try it Now Game may not be up to date from the devlog Cultivation Incremental (16+)
[Devlog #23] New Content Added refresh countdown on leaderboard UI. Updates Moved enemy overhead gui from server to client (not yet tested for the behaviour in multiplayer) for more personalization (point 2 is possible because of this change). Dynamic enemy name color, higher realm will be colored red and cannot be attacked no matter how high your dmg is until you reach their cultivation rank. Polishing the game :))
[Devlog #24] New Content Added Onboarding/Tutorial ! I see a lot of player gets confused when they first joined the game, so now i added a tutorial on the basic of the game. That is: Cultivate, Shop, and Quest . Im really happy with the result, i didn’t expect making the trail line to be so easy (using beam instance from roblox themself). And maybe i’ll add onboarding for fighting enemy and equipping items, but its not really neccessary (i think).
[Devlog #25] Updates Added more quests Optimize NPCServiceUtils.Data JSON for NPC that gives Chained Quests. Mostly just optimizing the json by creating a helper so that making a quest is easier and less error prone.
[Devlog #26] New Content Added Cultivating Animation! Update Now you have to press “C” to cultivate rather than just automatically gain Qi just by entering the Qi Zone. Next one is to add button for mobile user, and also add UX feedback for when they’re able to press C to cultivate and when they can’t (outside zone & higher realm zone). Oh! also adding particle/aura when player is cultivating for more satisfying feel.
[Devlog #27] New Contents New Mobile Button to Cultivate New Shortcut UI to press “C” to Cultivate when entering a Zone they can cultivate in. New Tutorial Section to tell the player to press “C” to start cultivating and gathering qi. Update Player now can’t walk/jump when cultivating May need to revise the button for mobile since its very basic right now
[Devlog #28] New Content Added “Aura” like particle effect when cultivating, its more like you “suck” the surrounding qi into the body. Update Update the collision system to be more robust, before theres a problem with the collision when i try adding the Aura Part inside the Player. Now it will independently calculate the spatial rather than touching. Nothing crazy, just some cool small detail.
[Devlog #29] The Last Devlog The Game New Contents Gamepass! Now you can buy a gamepass to get a benefit and support me! + Gamepass badge on the bottom left of the screen when bought. Add beam/arrow to the quest npc when you’re done with their given quest. Add equip best button in the inventory menu. Add dmg mult information in the inventory meny (item detail menu). Updates Fix some bugs, for example player able to move while cultivating. Optimize and remove unused leaderboards. ready to publish it! Thank you for the opportunity Hackclub for me to grow as a beginner roblox developer I appreciate the support from everyone although my game is far from “professional”, atleast its a fully working game! and Im happy with it.
Ships:
VERSION 0.0.1 Only 16+ can play the Game currently as any other new roblox game. I am glad to finish the essentials mechanic of the Game! Now here is the List of Features the game have: Cultivate, just stand on the existing zone (and make sure you have the required Realm) and you’ll gain Qi automatically Breakthrough, the moment the top bar is full, you can breakthrough to higher realm which increases your qi gain and boost movement speed and jump a little bit. Quest, you can talk to an NPC with a (!) to get the quest. After finishing a quest, you can talk to the NPC again to claim the quest rewards. Battle, you can walk to enemy and you’ll automatically deal damage to them! Shop, you can buy items in shopkeeper NPC with Spiritual Stones which you can get from defeating an enemy or finishing a quest. The feature is implemented, but its very simple and “unprofessional”. Lame excuse but its really because this is my first time making game and im still learning the basics. I’ll be adding more stuff and refine the core features in the future updates!! This game is made for the love of the game and genre :)
VERSION 0.1 Only 16+ can play the Game currently as any other new roblox game. I am glad to add more of the essentials mechanic of the Game! Now here is the List of Features i have added to the game since the last release: Added Onboarding/Tutorial! I see a lot of player gets confused when they first joined the game, so now i added a tutorial on the basic of the game. That is: Cultivate, Shop, and Quest. Added New Enemy : Goblin. Added More quests . Added Cultivating Animation! Added Gamepass! Now you can buy a gamepass to get a benefit and support me! + Gamepass badge on the bottom left of the screen when bought. And more! you can read all the devlogs to see the small changes. I still have some features not yet implemented, that is fighting enemy animation, weapons, and PVP . But i don’t really have the courage since the Stardance deadline is within 3 weeks (and its already extended), but i do have plan to continue the project later in December for my own personal project (close sourced, even though right now its already semi close source since the models, maps i used is not in the code but in the roblox studio file.). Thanks for everyone who have followed the game journey, albeit short i thank you guys for supporting me!! (Especially those who bought my gamepass!!) . I CANT BELIEVE I GOT MY FIRST ROBUX FROM MAKING A GAME HERE IN STARDANCE :DD THANK YOU SO MUCH!!! This Game is Made with the best of my Game Dev abilities ....
|
1792839324.5781875
|
1792925724.5781875
|
|
18514
|
Pokedex by @Ansh904 | Stardance
|
Ansh904
|
1
|
81.0
|
1342
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-09T15:48:59Z", "hours": 81.0, "multiplier": 19.17, "payout": 1342, "blessing": "neutral", "text": "Cosmidex!!!! A real life multi-platform Pokedex app that can identify a pokemon from a captured photo or uploaded image. The app started with making a scraper using selenium, that I used to scrape around 75,000 images of all 151 pokemon from Google images. The scraper was hard because I didnt knew selenium, but I learned it and made it. After scraping, I trained a yolov8-cls model on google colab using the scraped dataset. Then I converted the model to tflite and made the first android version of the app. Getting the app to work was really painful because it required me to manipulate the image and it’s raw pixel data to transform into the input tensor. After this everything went smoothly and I added a lot of new things like a list of all Pokemon and the fallback page when the model is not confident. I also made a web version of the app using the .web.js extensions, the web version used a tfjs model. After that i have another whole lot of things like a “Guess the Pokemon” game, shinies, a catch feature such that everytime you correctly predict a pokemon, it gets added to your caught pokemon list that is stored in local storage. The app also has shinies and you can toggle to hear pokemon cries. I am really proud of how the ui turned out, the space + pokemon theme really really looks very good, I used images from the nasa image library as backgrounds. On the Pokemon page, which displays the info for a specific pokemon including types, sprite, pokedex text (flavor text), base stats, evolutions and spawn info, the background changes dynamcally based on the type, I spent a lot of time finding those backgrounds, they perfectly match the pokemon typings. All other pages have specific backgrounds too. In the end I really like how the app started from a small side project to taking nearly 2 months to finish. I really want to add more features, but I lack the time cuz I have to study too for entrances, but I surely will add them in the future.", "repo": "https://github.com/Ansh9045/Cosmidex", "demo": "https://pokedex-murex-five-84.vercel.app/"}]...
|
[{"post_id": 44013, "ts": "202 [{"post_id": 44013, "ts": "2026-08-09T14:44:14Z", "hours": 5.5272, "text": "Cosmidex App is now finished !!!!! Finally, after 2 months, the app is finished and I am ready to ship!!! Here’s what I have added : Added Guess the Pokemon, It is addictive as hell, I used the imageTint property of the React native’s Image tag to make the whole silhouette of the pokemon black. After the user guesses it, it displays the orignal pokemon. Added cries, everytime you open the pokemon page for a pokemon, it’s latest or legacy cry plays once, you can toggle to not play it using the button on top right corner of the pokemon image. Added shiny, you can now toggle to show shiny or default sprites of the pokemon. That’s it, the project is finished :( I always want to add more, but I have to study for entrances."}, {"post_id": 42108, "ts": "2026-08-06T17:51:42Z", "hours": 10.1417, "text": "You can now get a Medal!!! Cosmidex Devlog #8 You will now get a medal everytime you catch all 151 pokemon in Generation 1!!! I have added the catch mechanishm Everytime you successfully predict a pokemon using your camera, gallery or from the Not Confident page, that pokemon would be added to your caught list. The caught list is stored in Local storage. Beside the catch mechanism here are other changes: Fixed the camera not closing issue on web by starting the Camera only when the Camera page is focused, otherwise closing it. Removed most of the unnecessay console.log() On android, the Tab was covering pokemon info on the Pokemon Page, to fix that, I made the tab shake toggled on that page, the user now needs to shake their Changed the Home page of android to match that of the web. Added a spawn tab that shows spawn locations along with methods to catch in the generation 1 games, ie- Pokemon Red, Blue and Yellow. Added the README file. Deployed the project on vercel properly, The project is now live on this link What’s next? I now want to add a daily Who’s that pokemon? Game, that would be so fun i guess. I also will add pokemon cries and show shiny versions of pokemons."}, {"post_id": 37136, "ts": "2026-07-29T16:53:18Z", "hours": 10.0683, "text": "Cosmidex Web app is complete !!! Devlog #7 The web version of the Cosmidex app is also finished, FINALLYYY!!! Here is what I have added: Converted the tflite model to TFJS, took a lot of time, many libraries were deprecated, so I had to manually remove imports for those. Created seperate web components using .web.js to upload/capture images -> preprocess -> predict, my codebase for both the android and the web version of the app is still the same. Created seperate page components for the web and changed the design for the Pokemon Page and the Home page. What’s left? The app is mostly ready for it’s first ship, I have hit the 10 hr mark thats why I am uploading a devlog early, but there’s not much left to do, I know I have been saying this for the last 2 devlogs. Here’s what is left: Remove all the console logs that still linger in components for debug. The camera doesn’t close in the web version after capturing and predicting so I have to fix that. Probably change the home page for the android version to match the web. Add some cool animations to it. At last I want to push this project one bit further and add a capturing feature, like you capture a photo of a pokemon and it gets added to your caught pokemon in the pokedex and after capturing all 151 pokemon, you get a medal."}, {"post_id": 31129, "ts": "2026-07-19T09:02:14Z", "hours": 10.1986, "text": "Pokedex Mobile app is finally finished Pokedex Devlog #6 The Pokedex mobile app is now finished and I am working on finishing the web version of the app too. Here is what I have added: A NotConfident page that is displayed when the model can’t give a solid prediction about the image. A ’AllPokemon` page that displays all 151 pokemons from generation 1 in a flatList. I was using a a very messy state based navigation so I updated it to a Stack navigation. I also add a tab at the bottom of the Pokemon, Not confident and All Pokemon pages, though it sometimes overlaps the page content like that of the mewtwo picture. Create a seperate AppContext for the web version to load the model in the web. What’s left in the project before the ship? The Mobile app is finished, I just have to make the Camera and Upload components for the web version of the app and then the project would officially be completed. I was having my exams so I wasn’t able to code for a while :("}, {"post_id": 18221, "ts": "2026-06-29T09:08:48Z", "hours": 15.4481, "text": "Pokedex App is finally complete (mostly) Devlog #5 The app is now mostly complete, this phase of the project went very smoothly. Here is what I have added: After predicting the pokemon, The app sends a request to PokeAPI at the https://pokeapi.co/api/v2/{pokemon_name} endpoint and gets the detailed information of the pokemon. The information is displayed on a pokemon page which includes basic stats, the type of the pokemon, height , wight et. I have also worked a lot of ui, majority of the time was spent in designing the ui. However the home page still looks empty, it is just a div with ImageBackground and a logo with two buttons and 1 scanner icon that I designed in canva. I have also added typed backgrounds, so that every pokemon type has a seperate space themed background, they are mostly nebula images that i found in the NASA Gallery but boyyyy do i like the themes, they look soooo gooood!!!. I am so proud of myself…. What’s left? While the app is mostly ready, there a few things that I still need/want to add: A page displaying all the 151 pokemons in generation 1 A page that is displayed when there is no confident prediction A web version of the app, which would be pretty easy, I just need to change the uploading and capturing logic for it to work on web So hopefully this is my second last devlog for this project, stay tuned !!!!"}, {"post_id": 14918, "ts": "2026-06-24T06:57:10Z", "hours": 14.8033, "text": "Pokedex Devlog #4 Heyyyyy Everyone!!! The training of the model is finally completed and I have made the first version of the Pokedex app , It captures an image using react-native-vision-camera , crops only the middle portion, resizes the image to match my model’s image size of 224*224 px , then gets the raw pixelbuffer, converts into rgb and normalises the values from 0-255 to 0-1.0 . This normalised pixel data is then fed to the model which predicts the class of the image. There were a lot of problems in making the app and there are still lot more to come , but here is everything I did: 1. An Ironical Training After collecting 75,000 images from my custom scraper, I zipped all of those images, and uploaded them directly to my colab notebook, uploading them took half an hour though😫 . I ran the training script at 50 epochs and training the model took another 8 hours . It was really ironical to see the model train in google colab on the same images that google was trying to hide from my little scraper. 2. A Successful Model After the training was completed, I had to test the model to see how it performed and whether I need to retrain it. The results shocked me, I gave the model 12 images from pintrest that it had never seen before and it predicted all of them correctly. The accuracy was way better than what I expect from a model trained on raw data. However, if needed I will clean the dataset and train again. 3. React native Camera Hell Everything was going very smoothly at this point, but I was never prepared for the next phase. I built a blank react native project, installed react-native-vision-camera and added a camera to the app.js, the camera was working, great, so I built a function to capture the photo and display it on the screen, that too worked. But the next step was to process the raw image pixel data into the format that my model required. I searched online, how to resize an image in react-native-vision-camera , the ai results told me to use the resizer package that comes with it. I spent three, three whole days!!! figuring why the resizer was not able to resize the image only to realise that it took a frame output not an image, so I rewrote the whole camera code again to use a live stream instead of capturing a photo. The resizer was working, I then normalized the pixel values while converting it into rgb format and fed the data to my model which outputed complete gibberish, all that work for nothing!!! 😭 I tried logging in the shape of input and output of the model, and the pixelformat of the bufffer and the raw pixel data. But all those were giving either undefined or 0. Nothing seemed to be working at this about, there was something seriously wrong with how I was processing the images. But then going through the docs of react-native-vision-camera , I saw that the image object that my previous capturing images code, that i had dumped, was outputting was a react-native-nitro-image object and it had an inbuilt resizeAsync function. I got frustrated again and rewrote the entire code again, this time with the previous capture photo logic. After cropping, resizing and getting the rgb data in to the required format, I tested the app with a photo of Gloom displayed on my laptop screen and it predicted it correctly. I was sooooo happyyy that it worked and is still working tho the accuracy is low due to pixel noises. What’s next? The hardest parts of the project are completed now, I just need to an api call, after the model predicts the pokemon to, get the details of the pokemon, like it’s type, pokedex entry and other things. The UI also sucks so I will work on that, I think I want to make it space theme, I don’t know how it would look but I will try. Till then… stay tuned!!!"}, {"post_id": 11166, "ts": "2026-06-18T08:01:40Z", "hours": 2.4978, "text": "ME Vs GOOGLE And I WON!!! Pokedex Devlog #3 Hey everyone I have been working on making a real life pokedex, one in which you just take the photo and get the stats of that pokemon on your screen. To achieve this I decided to train a yolov8n-cls model on images of pokemon. But getting those images were a nightmare due to GOOGLE!!! Fighting Google’s anti bot systems I built a custom scraper to scrape pokemon images from google images. But since the very start of the project, Google has been blocking me, it took a lot time for me, who had never touched selenium at that time, to bypass google’s anti bot systems. Since my laptop is very low end, I was using selenium in headless mode which triggered even more red flags for my bot. I switched from regular selenium to undetected_chromedriver , but still google’s system was flagging me with a big captcha that my little bot couldn’t solve. The main issue was that in headless mode, selenium runs a very small window size and it leaves clear machine tracks, I fixed that by using a larger window size and adding a user agent string that I chosen from a list of 10 different ua strings. Getting those Images Not being flagged by google was easy in comparison to this. Targetting the Images inside the search results was an absolute nightmare because instead of fixed static classes or ids google uses dynamic strings that change frequently, I wanted to write code that anyone can use anywhere and that is why couldn’t target those ever changing class names. I tried a lot things from targeting images inside nested divs to images inside divs with specific roles (eg: listitems ) or targeting images that have /imgres in their href attribute. But it took me an entire, with 6+ hours of coding and trying and a lot more researching and inspecting the elements of google images results but I found out that by targetting the images div with role of main with the images having a src or data-deffered attribute using the XPATH: //div[@role='main']//img[@data-deferred or @src] , I get the images which are inside the search results and I can then just use infinite scrolling to load them. The Results Knowing how to target those images, I absolutely destroyed google in the fight by making the scraper and using it to scrape a total of 74,718 images in one night without getting blocked a single time. My goal was was 500 images for each pokemon in generation 1, that is 75,500 total images, The scraper worked better than expected and I was just a 700 hundred images behind the goal. But even for those 700 images, the culprit was google not my little scraper, google didn’t have that many images for a few unpopular pokemon to fulfill my goals. What’s next? After winning the battle against google, I will use the images to train my model today, I already split those. Since my laptop is slow I will utilize google collab for training, using their own tool to train the model using the images they were trying so hard to hide XD….. and I really hope that scraping that many images is not illegal."}, {"post_id": 10545, "ts": "2026-06-17T09:57:17Z", "hours": 10.4703, "text": "Heyy Everyone Pokedex Devlog 2 !!! The selenium scraper is finally complete and it is working perfectly, except it hits a captcha some times, though it is rare. I started building this scraper without any knowledge of selenium. I started with a very basic bot that went to google and typed pokedex, I slowly added more features like using headless mode and WebDriverWait instead of hardcoded time delays. I once crashed my computer while printing the encrypted source code of the google result, XD. But I was also encountering captchas a lot so I switched to undetected_chromedriver and gave it a user agent string so that it won’t be flagged. My first bot was able to scrape the headers of the google search result. I then moved to an image scraping bot, The first version was very simple, It simply went to google images and downloaded every img tag that it could find. However, regardless of the target it scrapped only 21 images, the first being the google logo. This was because of lazy loading. To fix this I implemented an infinite scrolling loop that scrolled until it reached the end of the page or hit the target. But it still wasn’t near the target, after running the script without headless mode, I found out that the user agent string I gave it was of chrome 91, that was released in 2021, after switching to a newer version, chrome 135, it was able to complete it’s target but it was also downloading junk images like logos, icons or spacers that were present inside the search result. I spent 2 days fixing this problem, trying to point towards the image tags of the thubmnail images we see in google images. I wanted to write a code that would work everytime, that is why i couldn’t just point towards the ever changing classname of the img tag. I tried targeting imgs inside specific divs like img inside the div with role of listitems or img tags whose href attribute started with “/imgres” but it didnt worked. After a lot of tries I was able to get it right by targetting the img inside the div with role of main and whose dimensions are more that 100*100px. It worked like a charm. I then quickly made it in the form of a function and gave it 10 pokemons with target of 100 imgs each and boom I got 1000 images in total. I have also decided that labelling 15,100 images would take ridiculously long and the accuracy of the model would also be not accurate. So instead I am building a classification model and labelling it would be easy I am downloading the pokemon images inside the folder with their name. So now that I don’t have to worry about spending hours downloading or labelling them, I would use 500 images per pokemon and create a much accurate model. Currently I am running the script over all pokemons in gen 1, 151 in total, It has reached till Rattata, pokedex number - 19, that means images of 18 out of 151 pokemon are downloaded. I will keep the script running until all are complete and start training the classification model tomorrow."}, {"post_id": 8882, "ts": "2026-06-14T19:56:11Z", "hours": 1.9681, "text": "Heyy everyone I am currently building an android based pokedex app. The goal is simple point your phone’s camera towards a pokemon and it would use real time object detection to identify it and use pokeapi to fetch detailed stats about the pokemon. When I first thought of this project, I wanted to make a pokedex for all pokemon. However, some simple calculations gave me a reality check. To get a deceny accuracy, I aimed to train the object detection model at 100 images per pokemon, but there are 1,025 pokemon in total, that would mean more than 100k images to collect and label, it would take months if not years for me to do it alone, that’s why I narrowed down quickly to only generation 1 pokemons, around 151 pokemons and 15,100 images which still is a lot to collect and label manually. Instead of collecting images manually, I wanted to automate the process using the icrawler python framework. I initially tried using the built in google image crawler but it failed again and again, it returned no images, it wasnt able to detect the image tags, after some research I found out what was happening, google frequently changes their css class names to prevent bots from scraping and icrawler relied on hard coded class names. So I switched to the in built Bing image crawler and ran a test batch of 5 pokemons, it worked, I was happy to see images of pokemons being stored in my computer. But there was another roadblock, I had aimed at a total of 500 images (100 per pokemon) but it only managed to scrape around 30 images per pokemon. That’s only 30% of my target. To get past this I planning to build a better scraper using selenium and implement a dynamic scrolling loop to trigger lazy loaded images. I have attached today’s results, I got 156 images in total today and I hope for 500 tomorrow. Stay tuned for the next update"}]...
|
Title: Pokedex by @Ansh904 | Stardance
Devlogs:
H Title: Pokedex by @Ansh904 | Stardance
Devlogs:
Heyy everyone I am currently building an android based pokedex app. The goal is simple point your phone’s camera towards a pokemon and it would use real time object detection to identify it and use pokeapi to fetch detailed stats about the pokemon. When I first thought of this project, I wanted to make a pokedex for all pokemon. However, some simple calculations gave me a reality check. To get a deceny accuracy, I aimed to train the object detection model at 100 images per pokemon, but there are 1,025 pokemon in total, that would mean more than 100k images to collect and label, it would take months if not years for me to do it alone, that’s why I narrowed down quickly to only generation 1 pokemons, around 151 pokemons and 15,100 images which still is a lot to collect and label manually. Instead of collecting images manually, I wanted to automate the process using the icrawler python framework. I initially tried using the built in google image crawler but it failed again and again, it returned no images, it wasnt able to detect the image tags, after some research I found out what was happening, google frequently changes their css class names to prevent bots from scraping and icrawler relied on hard coded class names. So I switched to the in built Bing image crawler and ran a test batch of 5 pokemons, it worked, I was happy to see images of pokemons being stored in my computer. But there was another roadblock, I had aimed at a total of 500 images (100 per pokemon) but it only managed to scrape around 30 images per pokemon. That’s only 30% of my target. To get past this I planning to build a better scraper using selenium and implement a dynamic scrolling loop to trigger lazy loaded images. I have attached today’s results, I got 156 images in total today and I hope for 500 tomorrow. Stay tuned for the next update
Heyy Everyone Pokedex Devlog 2 !!! The selenium scraper is finally complete and it is working perfectly, except it hits a captcha some times, though it is rare. I started building this scraper without any knowledge of selenium. I started with a very basic bot that went to google and typed pokedex, I slowly added more features like using headless mode and WebDriverWait instead of hardcoded time delays. I once crashed my computer while printing the encrypted source code of the google result, XD. But I was also encountering captchas a lot so I switched to undetected_chromedriver and gave it a user agent string so that it won’t be flagged. My first bot was able to scrape the headers of the google search result. I then moved to an image scraping bot, The first version was very simple, It simply went to google images and downloaded every img tag that it could find. However, regardless of the target it scrapped only 21 images, the first being the google logo. This was because of lazy loading. To fix this I implemented an infinite scrolling loop that scrolled until it reached the end of the page or hit the target. But it still wasn’t near the target, after running the script without headless mode, I found out that the user agent string I gave it was of chrome 91, that was released in 2021, after switching to a newer version, chrome 135, it was able to complete it’s target but it was also downloading junk images like logos, icons or spacers that were present inside the search result. I spent 2 days fixing this problem, trying to point towards the image tags of the thubmnail images we see in google images. I wanted to write a code that would work everytime, that is why i couldn’t just point towards the ever changing classname of the img tag. I tried targeting imgs inside specific divs like img inside the div with role of listitems or img tags whose href attribute started with “/imgres” but it didnt worked. After a lot of tries I was able to get it right by targetting the img inside the div with role of main and whose dimensions are more that 100*100px. It worked like a charm. I then quickly made it in the form of a function and gave it 10 pokemons with target of 100 imgs each and boom I got 1000 images in total. I have also decided that labelling 15,100 images would take ridiculously long and the accuracy of the model would also be not accurate. So instead I am building a classification model and labelling it would be easy I am downloading the pokemon images inside the folder with their name. So now that I don’t have to worry about spending hours downloading or labelling them, I would use 500 images per pokemon and create a much accurate model. Currently I am running the script over all pokemons in gen 1, 151 in total, It has reached till Rattata, pokedex number - 19, that means images of 18 out of 151 pokemon are downloaded. I will keep the script running until all are complete and start training the classification model tomorrow.
ME Vs GOOGLE And I WON!!! Pokedex Devlog #3 Hey everyone I have been working on making a real life pokedex, one in which you just take the photo and get the stats of that pokemon on your screen. To achieve this I decided to train a yolov8n-cls model on images of pokemon. But getting those images were a nightmare due to GOOGLE!!! Fighting Google’s anti bot systems I built a custom scraper to scrape pokemon images from google images. But since the very start of the project, Google has been blocking me, it took a lot time for me, who had never touched selenium at that time, to bypass google’s anti bot systems. Since my laptop is very low end, I was using selenium in headless mode which triggered even more red flags for my bot. I switched from regular selenium to undetected_chromedriver , but still google’s system was flagging me with a big captcha that my little bot couldn’t solve. The main issue was that in headless mode, selenium runs a very small window size and it leaves clear machine tracks, I fixed that by using a larger window size and adding a user agent string that I chosen from a list of 10 different ua strings. Getting those Images Not being flagged by google was easy in comparison to this. Targetting the Images inside the search results was an absolute nightmare because instead of fixed static classes or ids google uses dynamic strings that change frequently, I wanted to write code that anyone can use anywhere and that is why couldn’t target those ever changing class names. I tried a lot things from targeting images inside nested divs to images inside divs with specific roles (eg: listitems ) or targeting images that have /imgres in their href attribute. But it took me an entire, with 6+ hours of coding and trying and a lot more researching and inspecting the elements of google images results but I found out that by targetting the images div with role of main with the images having a src or data-deffered attribute using the XPATH: //div[@role='main']//img[@data-deferred or @src] , I get the images which are inside the search results and I can then just use infinite scrolling to load them. The Results Knowing how to target those images, I absolutely destroyed google in the fight by making the scraper and using it to scrape a total of 74,718 images in one night without getting blocked a single time. My goal was was 500 images for each pokemon in generation 1, that is 75,500 total images, The scraper worked better than expected and I was just a 700 hundred images behind the goal. But even for those 700 images, the culprit was google not my little scraper, google didn’t have that many images for a few unpopular pokemon to fulfill my goals. What’s next? After winning the battle against google, I will use the images to train my model today, I already split those. Since my laptop is slow I will utilize google collab for training, using their own tool to train the model using the images they were trying so hard to hide XD….. and I really hope that scraping that many images is not illegal.
Pokedex Devlog #4 Heyyyyy Everyone!!! The training of the model is finally completed and I have made the first version of the Pokedex app , It captures an image using react-native-vision-camera , crops only the middle portion, resizes the image to match my model’s image size of 224*224 px , then gets the raw pixelbuffer, converts into rgb and normalises the values from 0-255 to 0-1.0 . This normalised pixel data is then fed to the model which predicts the class of the image. There were a lot of problems in making the app and there are still lot more to come , but here is everything I did: 1. An Ironical Training After collecting 75,000 images from my custom scraper, I zipped all of those images, and uploaded them directly to my colab notebook, uploading them took half an hour though😫 . I ran the training script at 50 epochs and training the model took another 8 hours . It was really ironical to see the model train in google colab on the same images that google was trying to hide from my little scraper. 2. A Successful Model After the training was completed, I had to test the model to see how it performed and whether I need to retrain it. The results shocked me, I gave the model 12 images from pintrest that it had never seen before and it predicted all of them correctly. The accuracy was way better than what I expect from a model trained on raw data. However, if needed I will clean the dataset and train again. 3. React native Camera Hell Everything was going very smoothly at this point, but I was never prepared for the next phase. I built a blank react native project, installed react-native-vision-camera and added a camera to the app.js, the camera was working, great, so I built a function to capture the photo and display it on the screen, that too worked. But the next step was to process the raw image pixel data into the format that my model required. I searched online, how to resize an image in react-native-vision-camera , the ai results told me to use the resizer package that comes with it. I spent three, three whole days!!! figuring why the resizer was not able to resize the image only to realise that it took a frame output not an image, so I rewrote the whole camera code again to use a live stream instead of capturing a photo. The resizer was working, I then normalized the pixel values while converting it into rgb format and fed the data to my model which outputed complete gibberish, all that work for nothing!!! 😭 I tried logging in the shape of input and output of the model, and the pixelformat of the bufffer and the raw pixel data. But all those were giving either undefined or 0. Nothing seemed to be working at this about, there was something seriously wrong with how I was processing the images. But then going through the docs of react-native-vision-camera , I saw that the image object that my previous capturing images code, that i had dumped, was outputting was a react-native-nitro-image object and it had an inbuilt resizeAsync function. I got frustrated again and rewrote the entire code again, this time with the previous capture photo logic. After cropping, resizing and getting the rgb data in to the required format, I tested the app with a photo of Gloom displayed on my laptop screen and it predicted it correctly. I was sooooo happyyy that it worked and is still working tho the accuracy is low due to pixel noises. What’s next? The hardest parts of the project are completed now, I just need to an api call, after the model predicts the pokemon to, get the details of the pokemon, like it’s type, pokedex entry and other things. The UI also sucks so I will work on that, I think I want to make it space theme, I don’t know how it would look but I will try. Till then… stay tuned!!!
Pokedex App is finally complete (mostly) Devlog #5 The app is now mostly complete, this phase of the project went very smoothly. Here is what I have added: After predicting the pokemon, The app sends a request to PokeAPI at the https://pokeapi.co/api/v2/{pokemon_name} endpoint and gets the detailed information of the pokemon. The information is displayed on a pokemon page which includes basic stats, the type of the pokemon, height , wight et. I have also worked a lot of ui, majority of the time was spent in designing the ui. However the home page still looks empty, it is just a div with ImageBackground and a logo with two buttons and 1 scanner icon that I designed in canva. I have also added typed backgrounds, so that every pokemon type has a seperate space themed background, they are mostly nebula images that i found in the NASA Gallery but boyyyy do i like the themes, they look soooo gooood!!!. I am so proud of myself…. What’s left? While the app is mostly ready, there a few things that I still need/want to add: A page displaying all the 151 pokemons in generation 1 A page that is displayed when there is no confident prediction A web version of the app, which would be pretty easy, I just need to change the uploading and capturing logic for it to work on web So hopefully this is my second last devlog for this project, stay tuned !!!!
Pokedex Mobile app is finally finished Pokedex Devlog #6 The Pokedex mobile app is now finished and I am working on finishing the web version of the app too. Here is what I have added: A NotConfident page that is displayed when the model can’t give a solid prediction about the image. A ’AllPokemon` page that displays all 151 pokemons from generation 1 in a flatList. I was using a a very messy state based navigation so I updated it to a Stack navigation. I also add a tab at the bottom of the Pokemon, Not confident and All Pokemon pages, though it sometimes overlaps the page content like that of the mewtwo picture. Create a seperate AppContext for the web version to load the model in the web. What’s left in the project before the ship? The Mobile app is finished, I just have to make the Camera and Upload components for the web version of the app and then the project would officially be completed. I was having my exams so I wasn’t able to code for a while :(
Cosmidex Web app is complete !!! Devlog #7 The web version of the Cosmidex app is also finished, FINALLYYY!!! Here is what I have added: Converted the tflite model to TFJS, took a lot of time, many libraries were deprecated, so I had to manually remove imports for those. Created seperate web components using .web.js to upload/capture images -> preprocess -> predict, my codebase for both the android and the web version of the app is still the same. Created seperate page components for the web and changed the design for the Pokemon Page and the Home page. What’s left? The app is mostly ready for it’s first ship, I have hit the 10 hr mark thats why I am uploading a devlog early, but there’s not much left to do, I know I have been saying this for the last 2 devlogs. Here’s what is left: Remove all the console logs that still linger in components for debug. The camera doesn’t close in the web version after capturing and predicting so I have to fix that. Probably change the home page for the android version to match the web. Add some cool animations to it. At last I want to push this project one bit further and add a capturing feature, like you capture a photo of a pokemon and it gets added to your caught pokemon in the pokedex and after capturing all 151 pokemon, you get a medal.
You can now get a Medal!!! Cosmidex Devlog #8 You will now get a medal everytime you catch all 151 pokemon in Generation 1!!! I have added the catch mechanishm Everytime you successfully predict a pokemon using your camera, gallery or from the Not Confident page, that pokemon would be added to your caught list. The caught list is stored in Local storage. Beside the catch mechanism here are other changes: Fixed the camera not closing issue on web by starting the Camera only when the Camera page is focused, otherwise closing it. Removed most of the unnecessay console.log() On android, the Tab was covering pokemon info on the Pokemon Page, to fix that, I made the tab shake toggled on that page, the user now needs to shake their Changed the Home page of android to match that of the web. Added a spawn tab that shows spawn locations along with methods to catch in the generation 1 games, ie- Pokemon Red, Blue and Yellow. Added the README file. Deployed the project on vercel properly, The project is now live on this link What’s next? I now want to add a daily Who’s that pokemon? Game, that would be so fun i guess. I also will add pokemon cries and show shiny versions of pokemons.
Cosmidex App is now finished !!!!! Finally, after 2 months, the app is finished and I am ready to ship!!! Here’s what I have added : Added Guess the Pokemon, It is addictive as hell, I used the imageTint property of the React native’s Image tag to make the whole silhouette of the pokemon black. After the user guesses it, it displays the orignal pokemon. Added cries, everytime you open the pokemon page for a pokemon, it’s latest or legacy cry plays once, you can toggle to not play it using the button on top right corner of the pokemon image. Added shiny, you can now toggle to show shiny or default sprites of the pokemon. That’s it, the project is finished :( I always want to add more, but I have to study for entrances.
Ships:
Cosmidex!!!! A real life multi-platform Pokedex app that can identify a pokemon from a captured photo or uploaded image. The app started with making a scraper using selenium, that I used to scrape around 75,000 images of all 151 pokemon from Google images. The scraper was hard because I didnt knew selenium, but I learned it and made it. After scraping, I trained a yolov8-cls model on google colab using the scraped dataset. Then I converted the model to tflite and made the first android version of the app. Getting the app to work was really painful because it required me to manipulate the image and it’s raw pixel data to transform into the input tensor. After this everything went smoothly and I added a lot of new things like a list of all Pokemon and the fallback page when the model is not confident. I also made a web version of the app using the .web.js extensions, the web version used a tfjs model. After that i have another whole lot of things like a “Guess the Pokemon” game, shinies, a catch feature such that everytime you correctly predict a pokemon, it gets added to your caught pokemon list that is stored in local storage. The app also has shinies and you can toggle to hear pokemon cries. I am really proud of how the ui turned out, the space + pokemon theme really really looks very good, I used images from the nasa image library as backgrounds. On the Pokemon page, which displays the info for a specific pokemon including types, sprite, pokedex text (flavor text), base stats, evolutions and spawn info, the background changes dynamcally based on the type, I spent a lot of time finding those backgrounds, they perfectly match the pokemon typings. All other pages have specific backgrounds too. In the end I really like how the app started from a small side project to taking nearly 2 months to finish. I really want to add more features, but I lack the time cuz I have to study too for entrances, but I surely will add them in the future....
|
1792821404.9460294
|
1792907804.9460294
|
|
41825
|
Asobi by @PAPER_01 | Stardance
|
PAPER_01
|
1
|
67.01
|
1349
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-28T10:15:24Z", "hours": 62.0, "multiplier": 18.18, "payout": 1349, "blessing": "neutral", "text": "Asobi is a site I am planning to make a mini-game collection. It will be containing tones of games in the future and I am integrating full frontend and backend on it especially for the Leaderbaord and login . Along with to prevent cheating on some game like Guess The Number [sorry , i suck at naming (ᵕ—ᴗ—)]. Currently I have added only one game , but It took me more time as I had to make the inital pages like landing , gamelist, leaderboard, signup and more like that. Please consider reading ReadMe on github for detail explaination , I really hope you will enjoy playing the game . Thank you so much for reading , Have a nice day =)", "repo": "https://github.com/shrestha-01/Asobi", "demo": "https://shrestha-project-08.66ghz.com/"}]...
|
[{"post_id": 63450, "ts": "202 [{"post_id": 63450, "ts": "2026-09-07T09:43:39Z", "hours": 2.5128, "text": "Asobi Devlog #17 Hello everyone, welcome to Devlog #17 of Asobi! (ノ◕ヮ◕)ノ*:・゚ Clicker Game Update Okay, umm.. I’m writing this devlog to update you about the The Clicker game of Asobi . So, I have added a basic CSS design to the game. I also tried a couple of other designs as well. . But decided to go with this design . I will add a screenshot below. Currently, I have this one, but I’m still not sure what I’m going to use . I’m still experimenting with the design, so if I change anything, I’ll let you all know in the next devlog. ( ̄▽ ̄)ゞ That’s It! And yeah, That’s all for this devlog. If you want me to explain something, then please do tell me in the comments. I’ll try my best to explain it as well. (≧▽≦) Thank you so much for reading, and have a very nice day! (ノ´ヮ`)ノ*:・゚✧"}, {"post_id": 60274, "ts": "2026-09-02T15:25:32Z", "hours": 2.5, "text": "Asobi Devlog #16 Hello everyone, welcome to Devlog #16 of Asobi! So, I just started working on the new game, the Clicker . Code Refinement Okay, so talking about the updates, I did some code refinement . I mean, I just cleaned up some code in the old game. Nothing major, but I thought it would be better to clean things up before moving forward. Clicker Game And yeah, I have started working on the Clicker game . Though it looks too empty right now, I have only worked on the HTML and JavaScript part for now. I guess the main thing I worked on this time was working on the precision. Precision Problem I was trying different ways to count the clicks, and I was facing an issue with maintaining the precision . I was not able to get anything more precise than two digits. For example, something like: 3.7 After the 7 , I could not really attain any significant number. But I did search online and looked at other similar games and found out about the performance.now() in JavaScript, which I didn’t know about before. So yeah, that was a lesson for me as well . ( ̄▽ ̄)ゞ Now I can use it to get much more precise timing for calculating the clicks per second. 10 Seconds Challenge For now, I have selected only 10 seconds of time in this game During those 10 seconds, the user can click the button as many times as they can, and the game will count their CPS (Clicks Per Second) . Though this is just the beginning, I’m planning to add lots of things in the future . Current Progress I’ll still add a screenshot of the current progress. Though, honestly, it will be quite empty and blank right now. =D But yeah, this is just the beginning of the Clicker game. That’s It! Yeah, that’s all for this devlog! If you think I did not explain something properly, or you want to know anything about the game, then please do tell me in the comments. I’ll try my best to explain it there. Thank you so much for reading! Have a nice day! (≧▽≦)"}, {"post_id": 56523, "ts": "2026-08-28T10:02:42Z", "hours": 1.0314, "text": "Finally, Shipping Soon! Hello everyone, welcome to Devlog #16 of Asobi! Final Changes Before Shipping So, the few changes I did before shipping are: Site Icon I have added the icon for the site . GIF to WEBM I converted all the GIFs to WEBM files , as there was some glitche with the GIF files because of which the file size was becoming too large. Because of this, the site’s loading screen was sometimes being shown for over a minute . So, I converted them to WEBM to reduce the file size and improve the loading time. Loading Screen I have also added the same loading screen to the Game List page as well . While the images and game list logos are being loaded, it will now show a loading screen instead of leaving the page empty. I guess that’s it! Finally Shipping! You can check out the game here: https://shrestha-project-08.66ghz.com/ Play in full screen for better experience [Press F11] Also I will attach a overview video of the site You can play the game using the link above. Thank you so much for reading, and I hope you all enjoy! Have a nice day! =)"}, {"post_id": 55311, "ts": "2026-08-27T01:47:11Z", "hours": 2.25, "text": "Asobi Devlog #15 Hello everyone, welcome to Devlog #15 of Asobi! Okay, so in this update,I have to inform about the bugs fixed and some hosting issue I am facing … Bug Fixes I fixed some bugs related to the scores . Sometimes, scores were not being updated properly , and sometimes I was being redirected from the username page back to the game list again and again . And yes, I did use AI to help me help me spot and debug these bugs. Leaderboard Icon Removed I also removed the Leaderboard sign from the game list . Obviously, there isn’t really a reason to show the leaderboard there because no game has been selected yet , so there is no specific leaderboard to display. Trying to Ship Asobi Right now, I am trying to ship Asobi as soon as possible , but I haven’t been able to find a reliable hosting site yet. Previously, I used InfinityFree , but due to some problems, I am currently unable to properly ship the site using it. To be more precise, I uploaded a GIF that is around 700 KB , but as soon as I reload the file manager in Infinityfree, for some reason its size increases to around 6 MB . Because the file becomes much larger, the loading time also increases, which makes the site feel slow adn laggy . I found another hosting service as well, but I forgot its name. I will mention it below once I remember. (AwardSpace) The problem with that one is that it **doesn’t provide SSL certification for free **, so the browser keeps showing warnings such as “Not Secure site” . So yeah, if I find a reliable hosting service, or if the problem with InfinityFree gets fixed, I should be able to ship Asobi really soon . Loading Screen One more thing I added is a loading screen . For now,I have only added it to guess.html . README Update I have also added the credits to the README regarding the loading screen design =) That’s It! Yeah, that’s pretty much it for this devlog! If you didn’t understand something or if you think I didnt explain anything properly then please do tell me in the comments, and I will try to explain it again. Also, if anyone knows a reliable hosting site that supports PHP and SQL , please do tell me in the comments. That would be a great help ! Thank you so much for reading, and have a nice day! =)"}, {"post_id": 53788, "ts": "2026-08-24T14:21:36Z", "hours": 6.1097, "text": "Asobi Devlog #14 Hello everyone, welcome to Devlog #14 of Asobi! So this time, I have tried to move almost everything to the backend . Moving Everything to the Backend Previously, things like the number generation, checking, score calculation, and results were handled on the frontend. But that had a pretty obvious problem. When I created this type of game previously, some people would simply console.log the random number and get the correct answer almost like i mean everytime. And Some people even executed the saveScore function themselves (╥﹏╥) So, to avoid that this time, I have moved almost everything to the backend . The number generation, checking, score calculation, and other important game logic are now handled by the server in the backend. Lets hope everything will be fair now (ᵕ—ᴗ—) Best Score on Difficulty Levels Along with that, I have also made some visual changes . Previously, the best score or rather, the number of tries was displayed as plain text at a constant place . Now, whenever you click on a difficulty level, your best result will be displayed at the bottom-right of that particular level label . I will attach a image below , I guess thats the only image i can show for this update (ó﹏ò。) It shows the lowest number of tries in which you have ever completed that difficulty level. And obviously, the lower the number of tries, the better . Points System And I also wanted to make one thing clear. Yes, this time I have used a points system instead of directly using the number of tries for the leaderboard. Let me explain why. Previously, when I made this type of game, I used the number of tries to determine the ranking. For example, if the Beginner difficulty is from 1–10 and you completed it in: 1 try → Rank 1 2 tries → Rank 2 3 tries → Rank 3 And so on… But there was a problem with this system. A lot of people were able to complete the lower-level difficulties in just 1 try . This meant that there could be around 8 or 9 people with Rank 1 on some of the easier levels , it kinda made the rank 1 less special or look cheap tbh. Technically, that was fair, but it didn’t felt quite right. It was something like , Once you got Rank 1, there was also basically nothing more to achieve . So this time, I implemented a points system . The basic idea is: Lower number of tries = More points This gives players more room to compete instead of simply having multiple people stuck at the same rank and maybe also encouraging them to collect more points. ##Responsiveness I will be honest about this , I am not really good at making sites responsive so i took the help of Gemini for making the site responsive. That’s It! I guess thats it, So yeah, that’s basically what I have added this time. Also,I thought of shipping it by today but there is another bug (sometimes the score is not being saved and it is requiring me to logout and login, i honestly havent still figured it out why its happening yet, But I am hoping to fix it soon and Also ship it soon. I hope I was able to explain everything clearly. If something was unclear, please tell me in the comments, and I will try to explain it again. Thank you so much for reading, and have a nice day! =)"}, {"post_id": 52831, "ts": "2026-08-23T05:57:32Z", "hours": 7.3242, "text": "Asobi Devlog #13 Hello everyone, welcome to Devlog #13 of Asobi! Okay, in this devlog, I would say there are quite a few additions , but I assume these two can be considered the main ones. Sign Up & Login The first major addition is the Sign Up and Login feature . When you try to log in for the first time, you will need to create an account first. You don’t really need to verify your email or anything like that. I did think about using OTP verification , but I felt like that would be a bit too much pain tbh So, I tried keeping it simple .૮₍ ´ ꒳ `₎ა You just need to: Enter a unique username Enter a password Confirm your password And you’re ready to start playing! That’s basically it. Leaderboard Time Filters Apart from user authentication, another major and somewhat time-consuming addition was the leaderboard time filter . Now, you can change the leaderboard based on different time periods: Last 24 Hours This Week All Time I thought this would be better because someone who is new to the game shouldn’t have to immediately compete with someone who has been playing for a long time. With the Last 24 Hours leaderboard, new players at least have a chance to compete and get themselves onto the leaderboard. Other Small Changes There are also a few other smaller additions and changes. I have changed the color of some text , including the numbers, and made some other minor visual adjustments. I have also changed some of the text throughout the game . These changes aren’t anything too significant, but they should be noticeable. New Game Banner And finally, I have added a banner for the next game that I will be working on later. The game is going to be a The Clicker . I will be updating it soon, but for now, I’ll be skipping this project and working on other parts of Asobi first. That’s It! And yeah, I guess that’s it for this devlog! I will be working on making the site calculation , like the generating and checking number saving server side so that no one cheats like before (╥﹏╥) .(old story short , I have made similar game before too where many people cheated as everything was done in frontend but it was deleted and I am making better version of it from the scratch) If anything was unclear please tell me in the comments and I will try again to explain . Thank You so much Thank you so much for reading, and have a nice day! =)"}, {"post_id": 51430, "ts": "2026-08-21T04:09:53Z", "hours": 6.5903, "text": "Asobi Devlog #12 Hello everyone, welcome to Devlog #12 of Asobi! So, umm… the main change—or addition, I would say—is the Hint Reaction . Hint Reaction GIFs GIFs are always fun, so to make the game more interesting, I have added GIFs to the game. But their role is actually more than that . For Hardcore Mode players (as well as normal players), the GIFs can sometimes act as a Secret Hint . Let me explain. There are a total of 18 GIFs that will be displayed randomly in the game: (The concept is same as my old game which was taken down, but i m trying to make it even better this time) 3 GIFs hint you to guess lower 3 GIFs hint you to guess higher The other 12 GIFs are just for fun This means there is a 33.33% chance that the GIF you get is actually a hint! =) And dont worry you wont be displayed the gifs to guess higher when the random number choosen is lower =). This feature is applied to all levels and modes . Top 3 Leaderboard Texture Okay, the next change is that I have added a sort of texture to the backgrounds of the Top 3 players . This has been added to both: The leaderboard on the main game page The full leaderboard page Difficulty Backgrounds I have also added a little background color to the difficulty levels , such as: Beginner Normal Hard etc. Before it was plain text and honestly i agree it didnt even seems clickable SVGs on the Navigation Bar Another change is that I have added SVG icons to the navigation bar at the top . あそび — Asobi And finally, I added the Japanese text あそび , meaning Asobi , below the logo. That’s All! I guess that’s all for this devlog! If anything was unclear, please do tell me in the comments, and I will try again to explain it. Thank you for reading, and have a nice day! =)"}, {"post_id": 50123, "ts": "2026-08-19T06:27:55Z", "hours": 6.6922, "text": "Devlog #11 - Asobi (あそび) Hello everyone, welcome to Devlog #11 of Asobi. Update So, I have finally finished working on the leaderboard page , and i have alos added a score card , which will be helping you understand about the pointing system of the game . I will attach a video below instead of explaining what i just made , i guess that would be much better than words =) And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)"}, {"post_id": 46310, "ts": "2026-08-13T13:22:27Z", "hours": 4.5028, "text": "Devlog #10 - Asobi (あそび) Hello everyone, welcome to Devlog #10 of Asobi. Update I just added a point system and am currently working on a seperate page to show leaderbaord and few other info like total games and stuff. so Let me explain the point system. Each difficulty has base point , if you guess the number in just one try , you get the base point ,and if you do it in more no. of tries/attempts you will lose points. Also there is a limit in how much you will get despite the no. of time you attempt , For an example if you even go like 100 attempts to guess the number between 1 to 10 then you will get at least 2 points in the beginner level . Its different for different level. I will try to make a table below. Difficulty | Base Points | Points Lost | Minimum Beginner | 10 | -1 | 2 Normal | 25 | -2 | 5 Hard | 50 | -3 | 10 Expert | 100 | -4 | 20 Master | 200 | -5 | 40 Impossible | 500 | -6 | 100 #Also The custom games are not eligible for Gaining points This devlog might have gotten abit big. Sorry about that, but i need to explain things. Also the main formula to calcualte points Points = Base Points - (Attempts - 1) × Attempt Penalty And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)"}, {"post_id": 45610, "ts": "2026-08-12T06:50:57Z", "hours": 2.6717, "text": "Devlog #09 - Asobi (あそび) Hello everyone, welcome to Devlog #09 of Asobi. Update Finally Database is connected and actually working . I spent half an hour doing everything to fix , but not turning on mariaDB (╥﹏╥) . But anyway Finally the leaderboard is working , but It currently show all the tries , so still need to work on alots of thing, and still have to move the number generation to backend as i dont want to end up like my old Binary Bound . I am still working on backend to conclude , except for a design on the leaderboard players list design. I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)"}, {"post_id": 45128, "ts": "2026-08-11T12:48:02Z", "hours": 2.5367, "text": "Devlog #08 - Asobi (あそび) Hello everyone, welcome to Devlog #08 of Asobi. Update I have completed working on the layout of the gamelist section where all the mini games will be displayed ,currently I have only made Guess the Numeber so i have kept only that for now. Also I have finally started working on the backend (php ,sql). I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)"}, {"post_id": 44602, "ts": "2026-08-10T14:07:37Z", "hours": 2.2981, "text": "Devlog #07 - Asobi (あそび) Hello everyone, welcome to Devlog #07 of Asobi. Update I have just completed working on the html and css part of the Asobi username , where username will be asked to the new users[entire js part is untouched right now]. I will upload a short video , i think that might be better than explain the design. I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)"}, {"post_id": 44523, "ts": "2026-08-10T10:43:41Z", "hours": 6.8644, "text": "Devlog #06 - Asobi (あそび) Hello everyone, welcome to Devlog #06 of Asobi. Update I have completed working on the landing page . Also I wanted to share how I take steps . Umm so basically I first go to chatgpt and tell to generate image of what i am going to make and then i ask it what the site should look like , and later i write code and make my site look same as the reference image (I also keep the reference image in the github, you can check it out). [The screenshot below is image of site itself] I also added some animated button design on the “Play Custom” button . I will put 2 screenshots if I am allowed to . And currently I am working on the page to accept the username . Also I have added sound effect on hover of the each letter of A S O B I I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)"}, {"post_id": 40723, "ts": "2026-08-04T13:15:48Z", "hours": 3.5592, "text": "Devlog #05 - Asobi (あそび) Hello everyone, welcome to Devlog #05 of Asobi. Update I have almost finished the layout .Additionally , I have changed the New Game btn design , and Guess design . I will provide the link of them in the Credits session of readme later on . I will attach a short video rather then explain with words , ig that would be much better =) I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)"}, {"post_id": 39925, "ts": "2026-08-03T07:37:30Z", "hours": 1.8361, "text": "Devlog #04 - Asobi (あそび) Hello everyone, welcome to Devlog #04 of Asobi. Update I actually dont have much to give update about , i have been struggling with the layout , I know tools like figma exists but i dont really know how to use it (and neither tried ) but i am still working the layout, i made a layout design on paint which i will attach here . Sorry , Hopefully i will be able to share something intresting next time (╥﹏╥) Also I have my entrance exam soon , so will not be able to work much for around a week. I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. (Reference img (AI generated) available in GitHub) Thank you so much for reading, and have a nice day. =)"}, {"post_id": 38992, "ts": "2026-08-01T16:51:43Z", "hours": 2.7197, "text": "Devlog #03 - Asobi (あそび) Hello everyone, welcome to Devlog #03 of Asobi. Update I will be trying to keep it short. Custom Game Here you can select the lower and higher limit yourself and choose options like minimum number , maximum number, no of guesses. Colors to the Arrow in history. Input limit Now i have added input limit which means if there its a beginner level with range from 1 to 10 then , and if you try to enter 99 or any number greater than 10 , then it will autocorrect it self to the highest and will also display a range msg =) Still working on the layout… Also I have my entrance exam soon , so will not be able to work much for around a week. I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. ( ̄︶ ̄)↗ Thank you so much for reading, and have a nice day. (≧◡≦)"}, {"post_id": 38162, "ts": "2026-07-31T12:37:26Z", "hours": 3.6875, "text": "Devlog #02 - Asobi (あそび) Hello everyone, welcome to Devlog #02 of Asobi. Update I have added a few more features, and I will try to summarize them in short. Added different levels: Beginner (1-10) Easy (1-50) Normal (1-100) Medium (1-500) Hard (1-1K) Expert (1-10K) Master (1-100K) Impossible (1-1M) Extra hint When your guess is 5% close or lower to the required randomNum , it will show a message like “You are very close.” When your guess is 20% close or lower , it will show a message like “You are close.” And if it’s away by more than 20% , it will show a message like “Nah, too far.” I have also added a history, which shows your recent choices, with an arrow indicating whether your choice was higher or lower than the required number. I know that all these hints will make the game easier, but don’t worry. I will make sure to add things that make the game interesting as well as a bit difficult. ( •̀ ω •́ )✧ I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. ( ̄︶ ̄)↗ Thank you so much for reading, and have a nice day. (≧◡≦) ♡"}, {"post_id": 37488, "ts": "2026-07-30T08:22:18Z", "hours": 1.1131, "text": "Devlog #01 - Asobi (あそび) Hello everyone, welcome to Devlog #01 of Asobi. A lot of things happened, but let’s keep working. I’m currently working on Asobi, あそび (which means “play” in Japanese). It will be a website that will contain a collection of games. Currently working on Guess the number game, will add tones of game soooon I’m planning to add features like leaderboards, achievements, levels, effects, and many more things. I’ll be adding those features one by one over time (if I get enough ideas -_-). Right now, I’ve only finished the simple basic design and js code for the 1 to 100 guessing game. Also, I’m using a neumorphism design (like before, to be honest), but the code is completely different. I’ll keep the link to the website from which I’m taking the design below. (It’s allowed, I asked about it on Slack, so don’t go banning me for that. ( ̄▽ ̄”) ) Neumorphism: https://neumorphism.io/#e0e0e0 I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain you there. ( ̄︶ ̄)↗ Thank you so much for reading and have a nice day. (≧◡≦) Also Thanks @Sam for support =)"}]...
|
Title: Asobi by @PAPER_01 | Stardance
Devlogs:
De Title: Asobi by @PAPER_01 | Stardance
Devlogs:
Devlog #01 - Asobi (あそび) Hello everyone, welcome to Devlog #01 of Asobi. A lot of things happened, but let’s keep working. I’m currently working on Asobi, あそび (which means “play” in Japanese). It will be a website that will contain a collection of games. Currently working on Guess the number game, will add tones of game soooon I’m planning to add features like leaderboards, achievements, levels, effects, and many more things. I’ll be adding those features one by one over time (if I get enough ideas -_-). Right now, I’ve only finished the simple basic design and js code for the 1 to 100 guessing game. Also, I’m using a neumorphism design (like before, to be honest), but the code is completely different. I’ll keep the link to the website from which I’m taking the design below. (It’s allowed, I asked about it on Slack, so don’t go banning me for that. ( ̄▽ ̄”) ) Neumorphism: https://neumorphism.io/#e0e0e0 I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain you there. ( ̄︶ ̄)↗ Thank you so much for reading and have a nice day. (≧◡≦) Also Thanks @Sam for support =)
Devlog #02 - Asobi (あそび) Hello everyone, welcome to Devlog #02 of Asobi. Update I have added a few more features, and I will try to summarize them in short. Added different levels: Beginner (1-10) Easy (1-50) Normal (1-100) Medium (1-500) Hard (1-1K) Expert (1-10K) Master (1-100K) Impossible (1-1M) Extra hint When your guess is 5% close or lower to the required randomNum , it will show a message like “You are very close.” When your guess is 20% close or lower , it will show a message like “You are close.” And if it’s away by more than 20% , it will show a message like “Nah, too far.” I have also added a history, which shows your recent choices, with an arrow indicating whether your choice was higher or lower than the required number. I know that all these hints will make the game easier, but don’t worry. I will make sure to add things that make the game interesting as well as a bit difficult. ( •̀ ω •́ )✧ I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. ( ̄︶ ̄)↗ Thank you so much for reading, and have a nice day. (≧◡≦) ♡
Devlog #03 - Asobi (あそび) Hello everyone, welcome to Devlog #03 of Asobi. Update I will be trying to keep it short. Custom Game Here you can select the lower and higher limit yourself and choose options like minimum number , maximum number, no of guesses. Colors to the Arrow in history. Input limit Now i have added input limit which means if there its a beginner level with range from 1 to 10 then , and if you try to enter 99 or any number greater than 10 , then it will autocorrect it self to the highest and will also display a range msg =) Still working on the layout… Also I have my entrance exam soon , so will not be able to work much for around a week. I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. ( ̄︶ ̄)↗ Thank you so much for reading, and have a nice day. (≧◡≦)
Devlog #04 - Asobi (あそび) Hello everyone, welcome to Devlog #04 of Asobi. Update I actually dont have much to give update about , i have been struggling with the layout , I know tools like figma exists but i dont really know how to use it (and neither tried ) but i am still working the layout, i made a layout design on paint which i will attach here . Sorry , Hopefully i will be able to share something intresting next time (╥﹏╥) Also I have my entrance exam soon , so will not be able to work much for around a week. I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. (Reference img (AI generated) available in GitHub) Thank you so much for reading, and have a nice day. =)
Devlog #05 - Asobi (あそび) Hello everyone, welcome to Devlog #05 of Asobi. Update I have almost finished the layout .Additionally , I have changed the New Game btn design , and Guess design . I will provide the link of them in the Credits session of readme later on . I will attach a short video rather then explain with words , ig that would be much better =) I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)
Devlog #06 - Asobi (あそび) Hello everyone, welcome to Devlog #06 of Asobi. Update I have completed working on the landing page . Also I wanted to share how I take steps . Umm so basically I first go to chatgpt and tell to generate image of what i am going to make and then i ask it what the site should look like , and later i write code and make my site look same as the reference image (I also keep the reference image in the github, you can check it out). [The screenshot below is image of site itself] I also added some animated button design on the “Play Custom” button . I will put 2 screenshots if I am allowed to . And currently I am working on the page to accept the username . Also I have added sound effect on hover of the each letter of A S O B I I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)
Devlog #07 - Asobi (あそび) Hello everyone, welcome to Devlog #07 of Asobi. Update I have just completed working on the html and css part of the Asobi username , where username will be asked to the new users[entire js part is untouched right now]. I will upload a short video , i think that might be better than explain the design. I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)
Devlog #08 - Asobi (あそび) Hello everyone, welcome to Devlog #08 of Asobi. Update I have completed working on the layout of the gamelist section where all the mini games will be displayed ,currently I have only made Guess the Numeber so i have kept only that for now. Also I have finally started working on the backend (php ,sql). I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)
Devlog #09 - Asobi (あそび) Hello everyone, welcome to Devlog #09 of Asobi. Update Finally Database is connected and actually working . I spent half an hour doing everything to fix , but not turning on mariaDB (╥﹏╥) . But anyway Finally the leaderboard is working , but It currently show all the tries , so still need to work on alots of thing, and still have to move the number generation to backend as i dont want to end up like my old Binary Bound . I am still working on backend to conclude , except for a design on the leaderboard players list design. I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)
Devlog #10 - Asobi (あそび) Hello everyone, welcome to Devlog #10 of Asobi. Update I just added a point system and am currently working on a seperate page to show leaderbaord and few other info like total games and stuff. so Let me explain the point system. Each difficulty has base point , if you guess the number in just one try , you get the base point ,and if you do it in more no. of tries/attempts you will lose points. Also there is a limit in how much you will get despite the no. of time you attempt , For an example if you even go like 100 attempts to guess the number between 1 to 10 then you will get at least 2 points in the beginner level . Its different for different level. I will try to make a table below. Difficulty | Base Points | Points Lost | Minimum Beginner | 10 | -1 | 2 Normal | 25 | -2 | 5 Hard | 50 | -3 | 10 Expert | 100 | -4 | 20 Master | 200 | -5 | 40 Impossible | 500 | -6 | 100 #Also The custom games are not eligible for Gaining points This devlog might have gotten abit big. Sorry about that, but i need to explain things. Also the main formula to calcualte points Points = Base Points - (Attempts - 1) × Attempt Penalty And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)
Devlog #11 - Asobi (あそび) Hello everyone, welcome to Devlog #11 of Asobi. Update So, I have finally finished working on the leaderboard page , and i have alos added a score card , which will be helping you understand about the pointing system of the game . I will attach a video below instead of explaining what i just made , i guess that would be much better than words =) And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)
Asobi Devlog #12 Hello everyone, welcome to Devlog #12 of Asobi! So, umm… the main change—or addition, I would say—is the Hint Reaction . Hint Reaction GIFs GIFs are always fun, so to make the game more interesting, I have added GIFs to the game. But their role is actually more than that . For Hardcore Mode players (as well as normal players), the GIFs can sometimes act as a Secret Hint . Let me explain. There are a total of 18 GIFs that will be displayed randomly in the game: (The concept is same as my old game which was taken down, but i m trying to make it even better this time) 3 GIFs hint you to guess lower 3 GIFs hint you to guess higher The other 12 GIFs are just for fun This means there is a 33.33% chance that the GIF you get is actually a hint! =) And dont worry you wont be displayed the gifs to guess higher when the random number choosen is lower =). This feature is applied to all levels and modes . Top 3 Leaderboard Texture Okay, the next change is that I have added a sort of texture to the backgrounds of the Top 3 players . This has been added to both: The leaderboard on the main game page The full leaderboard page Difficulty Backgrounds I have also added a little background color to the difficulty levels , such as: Beginner Normal Hard etc. Before it was plain text and honestly i agree it didnt even seems clickable SVGs on the Navigation Bar Another change is that I have added SVG icons to the navigation bar at the top . あそび — Asobi And finally, I added the Japanese text あそび , meaning Asobi , below the logo. That’s All! I guess that’s all for this devlog! If anything was unclear, please do tell me in the comments, and I will try again to explain it. Thank you for reading, and have a nice day! =)
Asobi Devlog #13 Hello everyone, welcome to Devlog #13 of Asobi! Okay, in this devlog, I would say there are quite a few additions , but I assume these two can be considered the main ones. Sign Up & Login The first major addition is the Sign Up and Login feature . When you try to log in for the first time, you will need to create an account first. You don’t really need to verify your email or anything like that. I did think about using OTP verification , but I felt like that would be a bit too much pain tbh So, I tried keeping it simple .૮₍ ´ ꒳ `₎ა You just need to: Enter a unique username Enter a password Confirm your password And you’re ready to start playing! That’s basically it. Leaderboard Time Filters Apart from user authentication, another major and somewhat time-consuming addition was the leaderboard time filter . Now, you can change the leaderboard based on different time periods: Last 24 Hours This Week All Time I thought this would be better because someone who is new to the game shouldn’t have to immediately compete with someone who has been playing for a long time. With the Last 24 Hours leaderboard, new players at least have a chance to compete and get themselves onto the leaderboard. Other Small Changes There are also a few other smaller additions and changes. I have changed the color of some text , including the numbers, and made some other minor visual adjustments. I have also changed some of the text throughout the game . These changes aren’t anything too significant, but they should be noticeable. New Game Banner And finally, I have added a banner for the next game that I will be working on later. The game is going to be a The Clicker . I will be updating it soon, but for now, I’ll be skipping this project and working on other parts of Asobi first. That’s It! And yeah, I guess that’s it for this devlog! I will be working on making the site calculation , like the generating and checking number saving server side so that no one cheats like before (╥﹏╥) .(old story short , I have made similar game before too where many people cheated as everything was done in frontend but it was deleted and I am making better version of it from the scratch) If anything was unclear please tell me in the comments and I will try again to explain . Thank You so much Thank you so much for reading, and have a nice day! =)
Asobi Devlog #14 Hello everyone, welcome to Devlog #14 of Asobi! So this time, I have tried to move almost everything to the backend . Moving Everything to the Backend Previously, things like the number generation, checking, score calculation, and results were handled on the frontend. But that had a pretty obvious problem. When I created this type of game previously, some people would simply console.log the random number and get the correct answer almost like i mean everytime. And Some people even executed the saveScore function themselves (╥﹏╥) So, to avoid that this time, I have moved almost everything to the backend . The number generation, checking, score calculation, and other important game logic are now handled by the server in the backend. Lets hope everything will be fair now (ᵕ—ᴗ—) Best Score on Difficulty Levels Along with that, I have also made some visual changes . Previously, the best score or rather, the number of tries was displayed as plain text at a constant place . Now, whenever you click on a difficulty level, your best result will be displayed at the bottom-right of that particular level label . I will attach a image below , I guess thats the only image i can show for this update (ó﹏ò。) It shows the lowest number of tries in which you have ever completed that difficulty level. And obviously, the lower the number of tries, the better . Points System And I also wanted to make one thing clear. Yes, this time I have used a points system instead of directly using the number of tries for the leaderboard. Let me explain why. Previously, when I made this type of game, I used the number of tries to determine the ranking. For example, if the Beginner difficulty is from 1–10 and you completed it in: 1 try → Rank 1 2 tries → Rank 2 3 tries → Rank 3 And so on… But there was a problem with this system. A lot of people were able to complete the lower-level difficulties in just 1 try . This meant that there could be around 8 or 9 people with Rank 1 on some of the easier levels , it kinda made the rank 1 less special or look cheap tbh. Technically, that was fair, but it didn’t felt quite right. It was something like , Once you got Rank 1, there was also basically nothing more to achieve . So this time, I implemented a points system . The basic idea is: Lower number of tries = More points This gives players more room to compete instead of simply having multiple people stuck at the same rank and maybe also encouraging them to collect more points. ##Responsiveness I will be honest about this , I am not really good at making sites responsive so i took the help of Gemini for making the site responsive. That’s It! I guess thats it, So yeah, that’s basically what I have added this time. Also,I thought of shipping it by today but there is another bug (sometimes the score is not being saved and it is requiring me to logout and login, i honestly havent still figured it out why its happening yet, But I am hoping to fix it soon and Also ship it soon. I hope I was able to explain everything clearly. If something was unclear, please tell me in the comments, and I will try to explain it again. Thank you so much for reading, and have a nice day! =)
Asobi Devlog #15 Hello everyone, welcome to Devlog #15 of Asobi! Okay, so in this update,I have to inform about the bugs fixed and some hosting issue I am facing … Bug Fixes I fixed some bugs related to the scores . Sometimes, scores were not being updated properly , and sometimes I was being redirected from the username page back to the game list again and again . And yes, I did use AI to help me help me spot and debug these bugs. Leaderboard Icon Removed I also removed the Leaderboard sign from the game list . Obviously, there isn’t really a reason to show the leaderboard there because no game has been selected yet , so there is no specific leaderboard to display. Trying to Ship Asobi Right now, I am trying to ship Asobi as soon as possible , but I haven’t been able to find a reliable hosting site yet. Previously, I used InfinityFree , but due to some problems, I am currently unable to properly ship the site using it. To be more precise, I uploaded a GIF that is around 700 KB , but as soon as I reload the file manager in Infinityfree, for some reason its size increases to around 6 MB . Because the file becomes much larger, the loading time also increases, which makes the site feel slow adn laggy . I found another hosting service as well, but I forgot its name. I will mention it below once I remember. (AwardSpace) The problem with that one is that it **doesn’t provide SSL certification for free **, so the browser keeps showing warnings such as “Not Secure site” . So yeah, if I find a reliable hosting service, or if the problem with InfinityFree gets fixed, I should be able to ship Asobi really soon . Loading Screen One more thing I added is a loading screen . For now,I have only added it to guess.html . README Update I have also added the credits to the README regarding the loading screen design =) That’s It! Yeah, that’s pretty much it for this devlog! If you didn’t understand something or if you think I didnt explain anything properly then please do tell me in the comments, and I will try to explain it again. Also, if anyone knows a reliable hosting site that supports PHP and SQL , please do tell me in the comments. That would be a great help ! Thank you so much for reading, and have a nice day! =)
Finally, Shipping Soon! Hello everyone, welcome to Devlog #16 of Asobi! Final Changes Before Shipping So, the few changes I did before shipping are: Site Icon I have added the icon for the site . GIF to WEBM I converted all the GIFs to WEBM files , as there was some glitche with the GIF files because of which the file size was becoming too large. Because of this, the site’s loading screen was sometimes being shown for over a minute . So, I converted them to WEBM to reduce the file size and improve the loading time. Loading Screen I have also added the same loading screen to the Game List page as well . While the images and game list logos are being loaded, it will now show a loading screen instead of leaving the page empty. I guess that’s it! Finally Shipping! You can check out the game here: https://shrestha-project-08.66ghz.com/ Play in full screen for better experience [Press F11] Also I will attach a overview video of the site You can play the game using the link above. Thank you so much for reading, and I hope you all enjoy! Have a nice day! =)
Asobi Devlog #16 Hello everyone, welcome to Devlog #16 of Asobi! So, I just started working on the new game, the Clicker . Code Refinement Okay, so talking about the updates, I did some code refinement . I mean, I just cleaned up some code in the old game. Nothing major, but I thought it would be better to clean things up before moving forward. Clicker Game And yeah, I have started working on the Clicker game . Though it looks too empty right now, I have only worked on the HTML and JavaScript part for now. I guess the main thing I worked on this time was working on the precision. Precision Problem I was trying different ways to count the clicks, and I was facing an issue with maintaining the precision . I was not able to get anything more precise than two digits. For example, something like: 3.7 After the 7 , I could not really attain any significant number. But I did search online and looked at other similar games and found out about the performance.now() in JavaScript, which I didn’t know about before. So yeah, that was a lesson for me as well . ( ̄▽ ̄)ゞ Now I can use it to get much more precise timing for calculating the clicks per second. 10 Seconds Challenge For now, I have selected only 10 seconds of time in this game During those 10 seconds, the user can click the button as many times as they can, and the game will count their CPS (Clicks Per Second) . Though this is just the beginning, I’m planning to add lots of things in the future . Current Progress I’ll still add a screenshot of the current progress. Though, honestly, it will be quite empty and blank right now. =D But yeah, this is just the beginning of the Clicker game. That’s It! Yeah, that’s all for this devlog! If you think I did not explain something properly, or you want to know anything about the game, then please do tell me in the comments. I’ll try my best to explain it there. Thank you so much for reading! Have a nice day! (≧▽≦)
Asobi Devlog #17 Hello everyone, welcome to Devlog #17 of Asobi! (ノ◕ヮ◕)ノ*:・゚ Clicker Game Update Okay, umm.. I’m writing this devlog to update you about the The Clicker game of Asobi . So, I have added a basic CSS design to the game. I also tried a couple of other designs as well. . But decided to go with this design . I will add a screenshot below. Currently, I have this one, but I’m still not sure what I’m going to use . I’m still experimenting with the design, so if I change anything, I’ll let you all know in the next devlog. ( ̄▽ ̄)ゞ That’s It! And yeah, That’s all for this devlog. If you want me to explain something, then please do tell me in the comments. I’ll try my best to explain it as well. (≧▽≦) Thank you so much for reading, and have a very nice day! (ノ´ヮ`)ノ*:・゚✧
Ships:
Asobi is a site I am planning to make a mini-game collection. It will be containing tones of games in the future and I am integrating full frontend and backend on it especially for the Leaderbaord and login . Along with to prevent cheating on some game like Guess The Number [sorry , i suck at naming (ᵕ—ᴗ—)]. Currently I have added only one game , but It took me more time as I had to make the inital pages like landing , gamelist, leaderboard, signup and more like that. Please consider reading ReadMe on github for detail explaination , I really hope you will enjoy playing the game . Thank you so much for reading , Have a nice day =)...
|
1792878477.024499
|
1793742477.024499
|
|
57535
|
Atom Simulator by @Rezz | Stardance
|
Rezz
|
1
|
67.08
|
1350
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-19T13:44:19Z", "hours": 65.0, "multiplier": 17.4, "payout": 1350, "blessing": "neutral", "text": "ATOM SIMULATOR!! Simulate an atom by adding subatomic particles manually or selecting elements directly from the periodic table and learn about every ground state isotope humanity has ever discovered! When I was starting this project I wanted to make something that I could show to others and be proud of it and this is what I have made! You can add any amount of subatomic particles and see the details of the isotope you have created. (Trust me there are many surprising combinations which actually exist). There are 3588 isotopes which exist in ground state and all are in the database of this project. This is a great opportunity to learn about the properties of every isotope in a fun and interactive way! What I built: :> The main canvas with the simulation of the atom. :> The element panel shows the information of the element you have created. :> The isotope panel gives you all the information about the current isotope you created and also visually highlights invalid isotopes, :> The control buttons let you ADD/REMOVE subatomic particles with full control. :> The periodic table with all the elements with proper buttons to jump to elements. :> Proper animation of the atom in the canvas. How I made it easy to use: :>Deployed it to GitHub pages so that anyone can easily access it without having to clone the repository. :> +10/-10 button help users to jump between atoms easily as well as see a satisfying animation. :> Added the ability to type in the desired number of subatomic particles for even more accessibility. :> The periodic table lets people jump to any desired element they want, so they do not have to struggle to reach any desired element. :> Made it so that the periodic table pops up with one click and disappears instantly when the user clicks an element or outside the table for a smooth and fast user experience. :> Colour coded each element in the periodic table depending on their types. :> If the user creates an invalid isotope, the isotope panels visually highlight it so that the user does not get confused. Technicalities A lot of things have been used in this project I have listed the things I learnt below: HTML5 Canvas Canvas Drawing Canvas Coordinate Systems requestAnimationFrame() Graphics / Animation Loops Mathematical Animation Polar / Circular Positioning Trigonometry in Programming Canvas Transformations 2.5D / Depth Illusion Painter’s Algorithm / Draw Order Dynamic Geometry State-Driven Graphics Data-Driven Application Design Managing Dynamic Object Collections Animation State Interpolated Animation Dynamic Numbers of Animated Objects Dynamic Shell Allocation UI State I am currently learning web development and these are my early steps. This is my first time using canvas so I gave it my best. The project may look very long in itself but it would have been way longer if you add the time spent reading documentation and watching videos about canvas Api. Since I started in stardance I have gone from not even knowing html syntax to here and I plan to further improve my understanding of canvas by making a game next. So, wish me luck. Please read the README for detailed explanation of my project!", "repo": "https://github.com/KartikeyaMishra-Ark/Atom-Simulation", "demo": "https://kartikeyamishra-ark.github.io/Atom-Simulation/"}]...
|
[{"post_id": 70719, "ts": "202 [{"post_id": 70719, "ts": "2026-09-19T17:27:55Z", "hours": 2.0822, "text": "Complete UI change!! The shipwrights told me my theme was very generic and looked very AI generated so I changed it into the theme of star charts used by astronomers in 17th-18th centuries. Renamed the periodic table to the atlas and over all made everything look like a diagram made on parchment. Also added a trail to the electrons to make it look a little bit more unique. My project is based on the Bohr model which was based on astronomy of that time which emerged from these star charts so I decided to use this theme to have a little personality and originality. Thanks for reading!!"}, {"post_id": 70545, "ts": "2026-09-19T10:33:05Z", "hours": 0.8514, "text": "Final Devlog is here guys after so many hours!! I have redone the UI to look less generic and a little more unique. The canvas is now having invisible borders so it blends in with the background. Added a header. Added red colour in case of invalid isotope and moved status to the to for better user experience. Also set the cap to 118 on both electrons and protons. Fixed the plus 10 button so it goes up to 118 instead of stopping if there is less than 10 electrons left to 118. That will be all I will ship this and other features will come in future updates like exit animations and ion panel. There is a lot more I could do but I have refined everything I made in this and that will be all for now as adding new things will create an unrefined product. I have set the default atom to chromium-24 just because it is not too small and not too big to help the users go lower and upward pretty quick. It was a long run and genuinely tough project. The amount of documentation I had to read was unreal. Thanks for reading!!!!!!!!!!!!!!"}, {"post_id": 70489, "ts": "2026-09-19T08:45:53Z", "hours": 5.8706, "text": "I have completed the animation now. The other electrons now move slowly into their new positions and make space for the incoming electron. I also made it so that it is fluid for +10 electrons as well. I also am moving towards my final UI so everything is black now instead of blue and I plan on making it more space like. Now comes the part where I tell you my struggles. I spent a lot of time trying to perfect the animation. To do this I had to make changes in a lot of my functions and I finally was at the end of my struggles after about 3 hours of work and there was just one bug I was unable to fix which was that whenever I spam added electrons they would go into one place and then teleport into their dedicated locations. To fix that I made a lot of changes. The problem was that the canvas was not giving new space assignment to the electron when it was being spam added and foolish me without committing decided to fix it and broke everything. I managed to break it so bad that program broke when adding a new shell. And because I had made so many changes I was not gonna spend another 3 hours fixing them one by one so I had no choice but to delete everything since the last commit which was my last devlog. and then I had to remake it from there. Lesson learnt. Thanks for reading!!!"}, {"post_id": 69615, "ts": "2026-09-17T12:54:50Z", "hours": 3.5044, "text": "I have finally added an animation to the addition of the electrons!! You can see in the video I have made it so that every added electron comes from outside the canvas and takes its place in the orbit. It is far from perfect right now but it’s the first step. The biggest problem in this was making sure it came in at the proper angle so it feels smooth and injects itself properly. I am thinking of animating the other electrons to slowly move and make space for the new electron so it doesn’t look like a flicker every electron added. The nucleus is still the same I am leaving it alone I will fix it in the end it’s too much for me. Also did a lot of CSS changes in the periodic table and the isotope panel and the control buttons. I am trying to make it look like an instrument more Than a button so hopefully it can happen. The next move is refining this animation and once it’s done I will redo the entire CSS to a space, science, observatory theme. Thanks for reading!!"}, {"post_id": 69163, "ts": "2026-09-16T14:35:00Z", "hours": 5.3294, "text": "This is making me give up guys. I cannot fix this nucleus this just isn’t working. I have been spending so many hours on this I used to do so much more daily but I just rage quit when I can’t fix this. You can see in the video is is still working in a sequence I cannot fix it. I did fix the flicker which happens every time a particle is added so it is very smooth now. also I added rotation to the shells by adjusting my already existing drawshell function. I made some changes in css though they are not noticable in the video as I removed most of them because the light theme didn’t suit the project. I am trying to make the theme more space and science like more like an observatory. I really wanna start on animations but I am holding it off for everything else to start working first. Thanks for reading!!"}, {"post_id": 68152, "ts": "2026-09-14T16:32:40Z", "hours": 6.3133, "text": "I am so freaking done with this!! I have been sitting here for so many hours trying to fix the nucleus and for some reason it is never working. I have created multiple new functions deleted those, changed those and one time is became a spiral pattern. Then I tried to randomise it and it became like a random splash. then the neutrons disappeared. then the count got messed up so every ten neutrons added get on screen. Then neutrons did not show up until we reached 24 of them. I tried every different way I could think of solving this but this is not working. At last I thought I should just go back to my old configuration because it was good enough but now it became like this and is overlapping into the first shell. I guess I deleted my old function where I had set its parameter to not overlap the inner shell but here we are. Also I found a way to make the periodic table work properly. It now pops up on screen so the user doesn’t have to scroll and disappears with th user input or if the user clicks the background. I will make it transparent in the future. Also I hope I can fix this nucleus this is so not it. Thanks for reading."}, {"post_id": 67356, "ts": "2026-09-13T13:10:52Z", "hours": 4.5983, "text": "COMPLETE CSS OVERHAUL. I have redone the entire CSS to make it look WAYYY better and you can see the results. I am adopting a dark theme. I do want it to look more like space but I will see to it later. I added a toggle function for the periodic table. It looks kind of useless now but what I wanna do is make it appear on the screen instead of appearing below so that the use can select without having to scroll. Also the nucleus must be catching your eye. I tried to randomise it but for some reason it is randomising every frame so I have to figure out how to fix it. I am pretty sure it is a very simple fix that I am wasting so much time on. Also changed the colour of the shell, electrons and nucleus and gave the particles a little glow for dramatic effect. Also gave the elements in the periodic table colours according to their categories like Alkali metals, noble gases etc. Next I am going to fix the nucleus. Make the periodic table appear on screen and try to make the UI look better. I am also thing of any features I can add. Thanks for reading!!"}, {"post_id": 66047, "ts": "2026-09-11T16:36:57Z", "hours": 8.6878, "text": "Sorry for so long undevlogged hours. First time I got a warning. I really procrastinate on devlogs. There are many changes I made, the first being the addition of radioactive/stable status, half-life, decay mode, spin/parity, and atomic mass into the isotope tab. My vision is that I want people to explore the isotopes when they play around manually with the subatomic particles. This increased my database for isotopes to 45k lines, hopefully the person who told me it’s ok to use AI for data collection was true. And for enhanced UX I added +10 and -10 buttons as well as the ability to type the number of electrons in. And the biggest and the most obvious update was the periodic table. I spent so long figuring it out. At first I tried doing the entire thing in CSS, but thankfully the array of elements with so many seemingly useless information I created at the start helped out and I was able to assign each of them groups and periods to look like a periodic table through JavaScript, but La and Ac were acting up because they kept going down to the f block. I moved them up but it still looks not as good. I then added each element on the table to be clickable and the user would instantly move to the desired element and be able to test what isotopes it has and also all their properties. Also I removed the configuration because I am making the Bohr model visible so it’s inaccurate to have the Aufbau configuration. I am 1000% going to do frequent devlogs please forgive me for my past 3 devlogs. Also I made sure the most commonly used isotope is there by default on the isotope panel when the periodic table is clicked. I think I will look how to make the UI better first as the periodic table being on the bottom feels so weird and bad UI because the user needs to scroll to see the change. I’ll think for a fix. Thanks for reading!!!!!"}, {"post_id": 63762, "ts": "2026-09-07T18:39:18Z", "hours": 8.0033, "text": "Now this is a big one! I have spent hours trying different ways to add isotopes to this. I thought I would add some common isotopes and not let the user make any other atom. Then I ditched it and tried to just say not in data. Then I tried to reduce the number of elements then I thought that how many isotopes can I actually add? So Iooked up on how many isotopes exist of all known elements I found a study of NUBASE in 2022 with 3588 ground state isotopes in their website. It had a lot of detail. I have used clause to parse it into a json file and it has 25k lines. I have asked the shipwrights and they said it’s fine so I did it. So now I have each possible ground state isotope and its basic properties in my project so I just linked it to javascript and then decided I wanted an entire window dedicated to isotopes and as my project had been bad for so long so I redid the html and finally touched css. Didn’t take me too long it has become very easy to create basic cards after my last project. Then I created a few functions for the isotopes which basically act as a validator which I made previously for protons. Also I deleted a lot of my code. So as seen in the video, Isotopes are divided into stable, radioactive and invalid. Any isotope which my database doesn’t have does not exist in ground state which is way bigger of a scale I was thinking about so I am proud of it. Also the name and symbol have been changed as well. the css looks very bad as I just did it very fast so that it at least looks like it is real. Next is redoing the nucleus to increase the randomisation and maybe I am thinking of redoing the isotopes window and the UI. Mostly thinking of working on UI now but idk what I do tomorrow. Thanks for reading!!"}, {"post_id": 62851, "ts": "2026-09-06T11:40:28Z", "hours": 6.7181, "text": "Very long devlog here. I have added a lot of stuff and have failed to add a lot of stuff too. The first task at my hand was making the nucleus into individual particles.The problem I ran into was when there were less than 14 nuclear particles they were too far away from each other. So I made a few if statements for better alignment in lower atomic number elements. Then I added colours for identification I will change them in the future. After adding colour I saw that the protons and neutrons aren’t mixing and are forming rings instead and so far I cannot fix it. Next thing I added was electronic configuration. I have used Aufbau’s principle for the electronic configuration which is kinda inaccurate as my model doesn’t use it but I added it because I can. Also I have not added all the exceptions like chromium. The next step was adding ions and isotopes. I spent so much time adding isotopes and failed terribly but the ions have been working out. Currently they are also inaccurate because I have yet to add a block for impossible structures and also the names just add ion instead of saying oxide or chloride. There is a type section currently because I first added just anion neutral and cation detector but then decided I want all ions and isotopes as well. The most amount of time spent this time is for sure the failure of my isotopes addition. Also I have been tweaking the tilts to make them look better. My devlog makes it look simple but it took so much freaking trial and error to do all this I am seriously burned out now. But it’s too fun for me to stop. Thanks for reading!!"}, {"post_id": 62205, "ts": "2026-09-05T13:55:38Z", "hours": 2.9883, "text": "I have now added buttons for user to add and remove subatomic particles. The neutrons are kind of useless because I have currently linked it to the periodic table I added to the code (yes I added all the elements as mentioned in previous devlogs). So the atomic mass is hardcoded for every element but in the future I will switch back to mass number when I add isotopes to the this. And now the most obvious change. I have added a tilt to all the electron paths and the shells so that I can have a 3d effect. I looked up on how to make this 3d and decided it was wayyy too out of my league, though what I am doing is already out of it, but I decided I will try a 2.5d style and this is as far as I have gotten. I have also made it so that the outer shells move faster than inner ones for better effect. It looks kinda ugly as I have neglected css but I am waiting for a general structure to be finished before I do that. I have to say that canvas is very complicated. And I am having to use a lot of loops and I am having difficulty understanding my own code. I hope by moving forwards I can get more comfortable with all this. Thanks for reading!!"}, {"post_id": 62052, "ts": "2026-09-05T08:52:41Z", "hours": 2.5119, "text": "I have added functions to calculate the mass number and the charge on each configuration. Then I have added the properties of each element in the periodic table into the code and made a div so that it can be seen in the web page. In the video below I am changing the number of electrons and protons to showcase it working I am yet to add an input on the screen. Also for each element I have added its atomic number, symbol, name, atomic mass, period, group and category. I believe it will prove useful in the future when I add a proper description. I am also going to add isotopes in the future. It was very boring to copy all the elements from he periodic table though. Thanks for reading!! edit: I just noticed a bug. I am not changing the number of neutrons so the mass number is wrong in every case. As I set the detection of each element by the number of protons I didn’t realise it. Sorry for the error"}, {"post_id": 61724, "ts": "2026-09-04T19:24:00Z", "hours": 2.265, "text": "The visual difference in this update may not look a lot but the code has changed a lot. Previously all of the stuff was just hardcoded values and now I have turned them all into proper dynamic values. I have given it a configuration to accommodate all 118 elements properly. Also made it so that the increasing number of shells reduces the spacing so the shells don’t clip out of bounds. Also having lesser shells spreads them out more so it looks zoomed in. All seems to work fine now. Almost all hardcoded values are turned into functions so I am going to try to add a way so the user can directly add an electron to the system. I am yet to touch the protons it’s still just balls revolving in a certain configuration, far from my vision. Thanks for reading!!"}, {"post_id": 61588, "ts": "2026-09-04T16:00:47Z", "hours": 4.2703, "text": "So I redid all the code of the javascript. I created different functions for the shells, nucleus and the electrons. After that I made a loop for the electrons so that they spawn in the shell structure of 2,8,8 and don’t overlap and another loop inside that to make sure that they all are revolving around the nucleus in their own shells. Then I made a loop for the shells with the same calculation of the radius so that they form properly along the revolving electrons. And damn was all of that hard to understand and create. In my previous projects I had not worked much with loops so I had to learn all about them and damn does this project use a lot of maths. It’s lowkey kind of fun playing with numbers and seeing varying results on screen. I think I will have to ditch these functions in the future because my end goal is to get all the 118 elements in there but this is an important learning step for me. Thanks for reading!!"}, {"post_id": 61336, "ts": "2026-09-04T06:26:06Z", "hours": 0.7969, "text": "Finally figured out how to move the electron along the path. Had to use Sine and Cosines to designate the movement. One problem which came up was that the new frame was not erasing the previous position of the electron so I did a clearRect so erase the previous frame but it currently is clearing everything including the shell and the nucleus. I am going to re write everything into separate functions to fix it."}, {"post_id": 61172, "ts": "2026-09-03T23:32:27Z", "hours": 1.9469, "text": "This project is kind of ambitious for me as it is a complicated one, but as a science. student I have always wanted to build something like this. I just spent a couple of hours experimenting and learning about canvas. First time using it. I really love that I have to use maths, physics and chemistry to make a project. The vision I have with this project is having a way to add electrons and protons and neutrons to make different elements and their isotopes. I will try to get then entire periodic table. And as my previous projects I don’t know how I will do it. I will learn as I build. This is very fun so far and I hope it doesn’t take as long as the last one. Thanks for reading!!"}]...
|
Title: Atom Simulator by @Rezz | Stardance
Devlog Title: Atom Simulator by @Rezz | Stardance
Devlogs:
This project is kind of ambitious for me as it is a complicated one, but as a science. student I have always wanted to build something like this. I just spent a couple of hours experimenting and learning about canvas. First time using it. I really love that I have to use maths, physics and chemistry to make a project. The vision I have with this project is having a way to add electrons and protons and neutrons to make different elements and their isotopes. I will try to get then entire periodic table. And as my previous projects I don’t know how I will do it. I will learn as I build. This is very fun so far and I hope it doesn’t take as long as the last one. Thanks for reading!!
Finally figured out how to move the electron along the path. Had to use Sine and Cosines to designate the movement. One problem which came up was that the new frame was not erasing the previous position of the electron so I did a clearRect so erase the previous frame but it currently is clearing everything including the shell and the nucleus. I am going to re write everything into separate functions to fix it.
So I redid all the code of the javascript. I created different functions for the shells, nucleus and the electrons. After that I made a loop for the electrons so that they spawn in the shell structure of 2,8,8 and don’t overlap and another loop inside that to make sure that they all are revolving around the nucleus in their own shells. Then I made a loop for the shells with the same calculation of the radius so that they form properly along the revolving electrons. And damn was all of that hard to understand and create. In my previous projects I had not worked much with loops so I had to learn all about them and damn does this project use a lot of maths. It’s lowkey kind of fun playing with numbers and seeing varying results on screen. I think I will have to ditch these functions in the future because my end goal is to get all the 118 elements in there but this is an important learning step for me. Thanks for reading!!
The visual difference in this update may not look a lot but the code has changed a lot. Previously all of the stuff was just hardcoded values and now I have turned them all into proper dynamic values. I have given it a configuration to accommodate all 118 elements properly. Also made it so that the increasing number of shells reduces the spacing so the shells don’t clip out of bounds. Also having lesser shells spreads them out more so it looks zoomed in. All seems to work fine now. Almost all hardcoded values are turned into functions so I am going to try to add a way so the user can directly add an electron to the system. I am yet to touch the protons it’s still just balls revolving in a certain configuration, far from my vision. Thanks for reading!!
I have added functions to calculate the mass number and the charge on each configuration. Then I have added the properties of each element in the periodic table into the code and made a div so that it can be seen in the web page. In the video below I am changing the number of electrons and protons to showcase it working I am yet to add an input on the screen. Also for each element I have added its atomic number, symbol, name, atomic mass, period, group and category. I believe it will prove useful in the future when I add a proper description. I am also going to add isotopes in the future. It was very boring to copy all the elements from he periodic table though. Thanks for reading!! edit: I just noticed a bug. I am not changing the number of neutrons so the mass number is wrong in every case. As I set the detection of each element by the number of protons I didn’t realise it. Sorry for the error
I have now added buttons for user to add and remove subatomic particles. The neutrons are kind of useless because I have currently linked it to the periodic table I added to the code (yes I added all the elements as mentioned in previous devlogs). So the atomic mass is hardcoded for every element but in the future I will switch back to mass number when I add isotopes to the this. And now the most obvious change. I have added a tilt to all the electron paths and the shells so that I can have a 3d effect. I looked up on how to make this 3d and decided it was wayyy too out of my league, though what I am doing is already out of it, but I decided I will try a 2.5d style and this is as far as I have gotten. I have also made it so that the outer shells move faster than inner ones for better effect. It looks kinda ugly as I have neglected css but I am waiting for a general structure to be finished before I do that. I have to say that canvas is very complicated. And I am having to use a lot of loops and I am having difficulty understanding my own code. I hope by moving forwards I can get more comfortable with all this. Thanks for reading!!
Very long devlog here. I have added a lot of stuff and have failed to add a lot of stuff too. The first task at my hand was making the nucleus into individual particles.The problem I ran into was when there were less than 14 nuclear particles they were too far away from each other. So I made a few if statements for better alignment in lower atomic number elements. Then I added colours for identification I will change them in the future. After adding colour I saw that the protons and neutrons aren’t mixing and are forming rings instead and so far I cannot fix it. Next thing I added was electronic configuration. I have used Aufbau’s principle for the electronic configuration which is kinda inaccurate as my model doesn’t use it but I added it because I can. Also I have not added all the exceptions like chromium. The next step was adding ions and isotopes. I spent so much time adding isotopes and failed terribly but the ions have been working out. Currently they are also inaccurate because I have yet to add a block for impossible structures and also the names just add ion instead of saying oxide or chloride. There is a type section currently because I first added just anion neutral and cation detector but then decided I want all ions and isotopes as well. The most amount of time spent this time is for sure the failure of my isotopes addition. Also I have been tweaking the tilts to make them look better. My devlog makes it look simple but it took so much freaking trial and error to do all this I am seriously burned out now. But it’s too fun for me to stop. Thanks for reading!!
Now this is a big one! I have spent hours trying different ways to add isotopes to this. I thought I would add some common isotopes and not let the user make any other atom. Then I ditched it and tried to just say not in data. Then I tried to reduce the number of elements then I thought that how many isotopes can I actually add? So Iooked up on how many isotopes exist of all known elements I found a study of NUBASE in 2022 with 3588 ground state isotopes in their website. It had a lot of detail. I have used clause to parse it into a json file and it has 25k lines. I have asked the shipwrights and they said it’s fine so I did it. So now I have each possible ground state isotope and its basic properties in my project so I just linked it to javascript and then decided I wanted an entire window dedicated to isotopes and as my project had been bad for so long so I redid the html and finally touched css. Didn’t take me too long it has become very easy to create basic cards after my last project. Then I created a few functions for the isotopes which basically act as a validator which I made previously for protons. Also I deleted a lot of my code. So as seen in the video, Isotopes are divided into stable, radioactive and invalid. Any isotope which my database doesn’t have does not exist in ground state which is way bigger of a scale I was thinking about so I am proud of it. Also the name and symbol have been changed as well. the css looks very bad as I just did it very fast so that it at least looks like it is real. Next is redoing the nucleus to increase the randomisation and maybe I am thinking of redoing the isotopes window and the UI. Mostly thinking of working on UI now but idk what I do tomorrow. Thanks for reading!!
Sorry for so long undevlogged hours. First time I got a warning. I really procrastinate on devlogs. There are many changes I made, the first being the addition of radioactive/stable status, half-life, decay mode, spin/parity, and atomic mass into the isotope tab. My vision is that I want people to explore the isotopes when they play around manually with the subatomic particles. This increased my database for isotopes to 45k lines, hopefully the person who told me it’s ok to use AI for data collection was true. And for enhanced UX I added +10 and -10 buttons as well as the ability to type the number of electrons in. And the biggest and the most obvious update was the periodic table. I spent so long figuring it out. At first I tried doing the entire thing in CSS, but thankfully the array of elements with so many seemingly useless information I created at the start helped out and I was able to assign each of them groups and periods to look like a periodic table through JavaScript, but La and Ac were acting up because they kept going down to the f block. I moved them up but it still looks not as good. I then added each element on the table to be clickable and the user would instantly move to the desired element and be able to test what isotopes it has and also all their properties. Also I removed the configuration because I am making the Bohr model visible so it’s inaccurate to have the Aufbau configuration. I am 1000% going to do frequent devlogs please forgive me for my past 3 devlogs. Also I made sure the most commonly used isotope is there by default on the isotope panel when the periodic table is clicked. I think I will look how to make the UI better first as the periodic table being on the bottom feels so weird and bad UI because the user needs to scroll to see the change. I’ll think for a fix. Thanks for reading!!!!!
COMPLETE CSS OVERHAUL. I have redone the entire CSS to make it look WAYYY better and you can see the results. I am adopting a dark theme. I do want it to look more like space but I will see to it later. I added a toggle function for the periodic table. It looks kind of useless now but what I wanna do is make it appear on the screen instead of appearing below so that the use can select without having to scroll. Also the nucleus must be catching your eye. I tried to randomise it but for some reason it is randomising every frame so I have to figure out how to fix it. I am pretty sure it is a very simple fix that I am wasting so much time on. Also changed the colour of the shell, electrons and nucleus and gave the particles a little glow for dramatic effect. Also gave the elements in the periodic table colours according to their categories like Alkali metals, noble gases etc. Next I am going to fix the nucleus. Make the periodic table appear on screen and try to make the UI look better. I am also thing of any features I can add. Thanks for reading!!
I am so freaking done with this!! I have been sitting here for so many hours trying to fix the nucleus and for some reason it is never working. I have created multiple new functions deleted those, changed those and one time is became a spiral pattern. Then I tried to randomise it and it became like a random splash. then the neutrons disappeared. then the count got messed up so every ten neutrons added get on screen. Then neutrons did not show up until we reached 24 of them. I tried every different way I could think of solving this but this is not working. At last I thought I should just go back to my old configuration because it was good enough but now it became like this and is overlapping into the first shell. I guess I deleted my old function where I had set its parameter to not overlap the inner shell but here we are. Also I found a way to make the periodic table work properly. It now pops up on screen so the user doesn’t have to scroll and disappears with th user input or if the user clicks the background. I will make it transparent in the future. Also I hope I can fix this nucleus this is so not it. Thanks for reading.
This is making me give up guys. I cannot fix this nucleus this just isn’t working. I have been spending so many hours on this I used to do so much more daily but I just rage quit when I can’t fix this. You can see in the video is is still working in a sequence I cannot fix it. I did fix the flicker which happens every time a particle is added so it is very smooth now. also I added rotation to the shells by adjusting my already existing drawshell function. I made some changes in css though they are not noticable in the video as I removed most of them because the light theme didn’t suit the project. I am trying to make the theme more space and science like more like an observatory. I really wanna start on animations but I am holding it off for everything else to start working first. Thanks for reading!!
I have finally added an animation to the addition of the electrons!! You can see in the video I have made it so that every added electron comes from outside the canvas and takes its place in the orbit. It is far from perfect right now but it’s the first step. The biggest problem in this was making sure it came in at the proper angle so it feels smooth and injects itself properly. I am thinking of animating the other electrons to slowly move and make space for the new electron so it doesn’t look like a flicker every electron added. The nucleus is still the same I am leaving it alone I will fix it in the end it’s too much for me. Also did a lot of CSS changes in the periodic table and the isotope panel and the control buttons. I am trying to make it look like an instrument more Than a button so hopefully it can happen. The next move is refining this animation and once it’s done I will redo the entire CSS to a space, science, observatory theme. Thanks for reading!!
I have completed the animation now. The other electrons now move slowly into their new positions and make space for the incoming electron. I also made it so that it is fluid for +10 electrons as well. I also am moving towards my final UI so everything is black now instead of blue and I plan on making it more space like. Now comes the part where I tell you my struggles. I spent a lot of time trying to perfect the animation. To do this I had to make changes in a lot of my functions and I finally was at the end of my struggles after about 3 hours of work and there was just one bug I was unable to fix which was that whenever I spam added electrons they would go into one place and then teleport into their dedicated locations. To fix that I made a lot of changes. The problem was that the canvas was not giving new space assignment to the electron when it was being spam added and foolish me without committing decided to fix it and broke everything. I managed to break it so bad that program broke when adding a new shell. And because I had made so many changes I was not gonna spend another 3 hours fixing them one by one so I had no choice but to delete everything since the last commit which was my last devlog. and then I had to remake it from there. Lesson learnt. Thanks for reading!!!
Final Devlog is here guys after so many hours!! I have redone the UI to look less generic and a little more unique. The canvas is now having invisible borders so it blends in with the background. Added a header. Added red colour in case of invalid isotope and moved status to the to for better user experience. Also set the cap to 118 on both electrons and protons. Fixed the plus 10 button so it goes up to 118 instead of stopping if there is less than 10 electrons left to 118. That will be all I will ship this and other features will come in future updates like exit animations and ion panel. There is a lot more I could do but I have refined everything I made in this and that will be all for now as adding new things will create an unrefined product. I have set the default atom to chromium-24 just because it is not too small and not too big to help the users go lower and upward pretty quick. It was a long run and genuinely tough project. The amount of documentation I had to read was unreal. Thanks for reading!!!!!!!!!!!!!!
Complete UI change!! The shipwrights told me my theme was very generic and looked very AI generated so I changed it into the theme of star charts used by astronomers in 17th-18th centuries. Renamed the periodic table to the atlas and over all made everything look like a diagram made on parchment. Also added a trail to the electrons to make it look a little bit more unique. My project is based on the Bohr model which was based on astronomy of that time which emerged from these star charts so I decided to use this theme to have a little personality and originality. Thanks for reading!!
Ships:
ATOM SIMULATOR!! Simulate an atom by adding subatomic particles manually or selecting elements directly from the periodic table and learn about every ground state isotope humanity has ever discovered! When I was starting this project I wanted to make something that I could show to others and be proud of it and this is what I have made! You can add any amount of subatomic particles and see the details of the isotope you have created. (Trust me there are many surprising combinations which actually exist). There are 3588 isotopes which exist in ground state and all are in the database of this project. This is a great opportunity to learn about the properties of every isotope in a fun and interactive way! What I built: :> The main canvas with the simulation of the atom. :> The element panel shows the information of the element you have created. :> The isotope panel gives you all the information about the current isotope you created and also visually highlights invalid isotopes, :> The control buttons let you ADD/REMOVE subatomic particles with full control. :> The periodic table with all the elements with proper buttons to jump to elements. :> Proper animation of the atom in the canvas. How I made it easy to use: :>Deployed it to GitHub pages so that anyone can easily access it without having to clone the repository. :> +10/-10 button help users to jump between atoms easily as well as see a satisfying animation. :> Added the ability to type in the desired number of subatomic particles for even more accessibility. :> The periodic table lets people jump to any desired element they want, so they do not have to struggle to reach any desired element. :> Made it so that the periodic table pops up with one click and disappears instantly when the user clicks an element or outside the table for a smooth and fast user experience. :> Colour coded each element in the periodic table depending on their types. :> If the user creates an invalid isotope, the isotope panels visually highlight it so that the user does not get confused. Technicalities A lot of things have been used in this project I have listed the things I learnt below: HTML5 Canvas Canvas Drawing Canvas Coordinate Systems requestAnimationFrame() Graphics / Animation Loops Mathematical Animation Polar / Circular Positioning Trigonometry in Programming Canvas Transformations 2.5D / Depth Illusion Painter’s Algorithm / Draw Order Dynamic Geometry State-Driven Graphics Data-Driven Application Design Managing Dynamic Object Collections Animation State Interpolated Animation Dynamic Numbers of Animated Objects Dynamic Shell Allocation UI State I am currently learning web development and these are my early steps. This is my first time using canvas so I gave it my best. The project may look very long in itself but it would have been way longer if you add the time spent reading documentation and watching videos about canvas Api. Since I started in stardance I have gone from not even knowing html syntax to here and I plan to further improve my understanding of canvas by making a game next. So, wish me luck. Please read the README for detailed explanation of my project!...
|
1792853827.402444
|
1792940227.402444
|
|
34098
|
Rust 6502 by @Wirenux | Stardance
|
Wirenux
|
3
|
74.0
|
1354
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T17:19:09Z", "hours": 7.0, "multiplier": 18.98, "payout": 127, "blessing": "neutral", "text": "Rust 6502 A MOS 6502 emulator TUI with a lot of features Before reading this Ship you should take a look at Ship 1 & Ship 2 What did you add ? Here is a list of everything that I have added since the last Ship Features Breakpoints : press “F” to set a breakpoint at any address, the emulator halts the moment PC reaches it Watchpoints : same idea, but for memory Conditional Breakpoints : halt execution when a register (AC, XR, YR, SP) meets a comparison (!=, ==, >=, <=, >, <) against a target value Step Back : press “B” to rewind execution one instruction at a time, restoring the CPU and memory exactly as they were before Random Number Generator : a memory-mapped register at $BFF3 that returns a random byte from the host PC on every read, so ASM programs can have real random number Keybind Panel : a popup listing every keyboard shortcut and control, and removed the old footer keybind list to make room for it Demo Program Snake : updated to pull apple placement from the new RNG instead of the old pseudo random method ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ What was challenging ? Wiring the conditional breakpoint into the run loop without breaking the existing breakpoint/watchpoint checks was harder than I though. Also getting a dropdown-style menu to choose the operator working in Ratatui was tought since there’s no native dropdown widget. So I ended up building a little spinner (▲ value ▼) that cycles through the operators instead ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ What are you proud of ? I’m proud that my emulator now has real debugging tools like : breakpoints, watchpoints, conditional breakpoints, and step-back. What should people know so they can test your project ? A Nerd Font is recommended in your terminal for a better rendering of the UI icons on the Home page How to test: Install the emulator directly from crates.io by running: cargo install rust6502 Download all the .bin files on the GitHub Releases page. Launch the emulator by running rust6502 and use the built-in Home menu to select one of the demo .bin files! Things to try Load snake_demo.bin and play :D Set a breakpoint on an address inside a demo program (check the keybind panel for the shortcut!) and watch execution halt exactly there Try a conditional breakpoint : for example, halt whenever XR == 0F and watch it stop right when the register hits that value Press “B” to step backward and rewind the CPU state instruction by instruction Press the keybind panel shortcut to see the full list of controls", "repo": "https://github.com/wirenux/Rust-6502", "demo": "https://crates.io/crates/rust6502"}, {"ship_num": 2, "ts": "2026-08-08T15:59:06Z", "hours": 28.0, "multiplier": 17.86, "payout": 504, "blessing": "neutral", "text": "=== Rust 6502 === A MOS 6502 emulator TUI with a lot of features ============================================ Before reading this Ship you should take a look at Ship #1 == What did you add ? == Here is a list of everything that I have added since the last Ship = Features = Serial Monitor : you connect to localhost:8080 using netcat. Useful for the Apple 1 OS or for debugging with text. The monitor can be used to display text but also to send text like a keyboard (useful for the Apple 1 OS) PS/2 Keyboard : a full PS/2 keyboard emulation (used in Snake) Use the UI with a Mouse: On the Home Menu and in the Emulator you can click on button, toggle, scroll, etc… Interrupt : IRQ & NMI Tips in the Settings Panel Modify speed with Hz & MHz (like a real 6502 chip) Reset Vector: The emulator will look at $FFFC & $FFFD to find the start address of the program (when the Force Address toggle is off) Set PC Address: keyboard shortcut to change the position of the PC (Program Counter) = Demo Program = Apple 1 OS (Wozmon) : I have modified the orginal Apple 1 code to fit my emulator, like Serial Monitor address, Keyboard etc… Snake : Just the Snake game ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ Keyboard Demo: Print every key press on the screen using a custom font Serial Monitor Demo: Show how the Serial Monitor works == What was challenging ? == The most challenging part of this 2nd ship was creating a Serial Monitor that works via a local port, and making a PS/2 Keyboard emulation. And of course, modifying the Apple 1 OS to make it work on this emulator ! (I was having a lot of bugs, so I rewrite a big part of the OS) ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ == What are you proud of ? == I am really proud of my self for the implementation of the Serial monitor that run on different CPU thread than the emulator itself and the fact that it work via the local network. And beyond everything the fact that my emulator can run : games, utility and the Apple 1 OS !!! ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ I’m also really proud that it’s officially published on crates.io. == What should people know so they can test your project ? == Note: A Nerd Font is recommended in your terminal emulator for a proper rendering of the UI icons on the Home page How to test: Install the emulator directly from crates.io by running: ================== cargo install rust6502 Download all the .bin files on the GitHub Releases page. Launch the emulator by running rust6502 and use the built-in Home menu to select one of the demo .bin files! == Things to try == Load snake_demo.bin to play at a classic game using the 32x32 screen and the PS/2 keyboard emulation Load wozmon.bin to use the Apple 1 OS ! You should see the documentation related to Wozmon : https://github.com/wirenux/Rust-6502/blob/main/AppleI.md Load keyboard_demo.bin to see every key you press show up on the 32x32 screen using a custom font The Debugger: go to the Settings menu inside the TUI and slow down the CPU speed. Then watch the Memory Viewer and Disassembler track exactly what the code is doing in real-time!", "repo": "https://github.com/wirenux/Rust-6502", "demo": "https://crates.io/crates/rust6502"}, {"ship_num": 3, "ts": "2026-07-23T16:03:44Z", "hours": 39.0, "multiplier": 19.83, "payout": 723, "blessing": "neutral", "text": "=== Rust 6502 === A legendary 8-bit CPU right in your terminal! 🦀 ᕙ( •̀ ᗜ •́ )ᕗ == What did you make ? == I built a fully functional emulator for the MOS 6502 (the microprocessor that powered the Apple II, Commodre 64, and the NES) from scratch using Rust ! Instead of a standard graphical window, I built a Terminal User Interface (TUI) using Ratatui. Here is what’s inside: Full CPU Emulation: Execute 6502 machine code with live register (AC, XR, YR, SP) and status flag tracking Virtual Screen: A 32x32 memory-mapped display ($0200-$05FF) rendered right in the terminal using Unicode Half-Block and a custom 16-color palette Live Disassembler & Hex Viewer: Watch the RAM change in real-time and see the raw binary machine code translated back into readable assembly instructions on the fly Built-in File Browser: A visual menu with Nerd Font icons to navigate your system and load compiled .bin ROMs Available on crates.io : You can download it via Cargo == What was challenging ? == The Disassembler: Writing a disassembler that parses raw .bin files is tricky because they don’t have headers. I ran into a massive issue where my image data (using the color byte $0A) was being read by the disassembler as infinite ASL A (Shift Left) instructions! I had to engineer a way for the disassembler to properly halt when it hit a BRK instruction so it wouldn’t try to execute my pixel art. Terminal UI Architecture: Designing a dashboard (hex grids, scrolling stacks, changing colors) required a really solid state-management architecture to keep the UI smooth and responsive while the CPU loop spins at thousands of instructions per second. == What are you proud of ? == I am proud of using this project to learn Rust in a fun way! ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ I’m also really proud that it’s officially published on crates.io, meaning anyone can install and run my emulator with a single command == What should people know so they can test your project ? == Note: A Nerd Font is recommended in your terminal emulator for a proper rendering of the UI icons on the Home page How to test: Install the emulator directly from crates.io by running: cargo install rust6502 Download all the .bin files on the GitHub Releases page. Launch the emulator by running rust6502 and use the built-in Home menu to select one of the demo .bin files! == Things to try == Load hackclub_logo_demo.bin to see the terminal render a 32x32 pixel art logo using 6502 assembly Load rainbow_demo.bin to watch a shifting color gradient animation directly manipulating video memory. Load helloworld_demo.bin to watch a centered Hello world message The Debugger: go to the Settings menu inside the TUI and slow down the CPU speed. Then watch the Memory Viewer and Disassembler track exactly what the code is doing in real-time!", "repo": "https://github.com/wirenux/Rust-6502", "demo": "https://crates.io/crates/rust6502"}]...
|
[{"post_id": 53188, "ts": "202 [{"post_id": 53188, "ts": "2026-08-23T17:01:36Z", "hours": 1.3231, "text": "+ 1h20 So… this might be the last devlog for this project. I just released the v1.3.0 . And here is what I added since the last devlog : A RNG documentation Snake now use a real RNG I recorded the Asciinema .cast file Update the python tools to generate memory diagrams Update the Memory documentation So next step is the 3rd Ship"}, {"post_id": 52497, "ts": "2026-08-22T17:18:02Z", "hours": 1.6328, "text": "+ 1h35 ! This might be the last feature I add to Rust 6502. Since I ran out of idea and for me the project seem to be finished. Anyway, here are the things I added : A RNG address : $BFF3 . The program just read from it and get a random value via the Host computer ( 4feb4d8 ) A conditional breakpoint : A top bar in the Breakpoint popup to add a conditional breakpoint (like : If AC != 0F -> Break) ( 1b7bc81 )"}, {"post_id": 51750, "ts": "2026-08-21T16:03:37Z", "hours": 1.4139, "text": "+1h 25 min ! Since the last time I have added the keybind panel. Where there is… all the keybinds I also remove the keybind on the footer to only get Keybind “K”"}, {"post_id": 48226, "ts": "2026-08-16T15:08:41Z", "hours": 0.8658, "text": "Okay so… I have added the Breakpoint and the Watchpoint . When you set the breakpoint to $C00C the CPU will stop before running the instruction at $C00C. The watchpoint stop if a value at an address at been changed."}, {"post_id": 47602, "ts": "2026-08-15T16:26:45Z", "hours": 0.8536, "text": "I added the step-back function. It work by pressing “B”, it’s just rewinding the emulator up to 500 opcode. Only work when moving in step-by-step mode (with Enter)"}, {"post_id": 45822, "ts": "2026-08-12T15:29:34Z", "hours": 0.5942, "text": "v1.2.0 Here are the changes attached to this release : fix: a bug on windows, with ghost key press ( c3c6009 ) add: a Scroll bar on the file explorer ( 94b2abb )"}, {"post_id": 43337, "ts": "2026-08-08T15:14:19Z", "hours": 0.2753, "text": "YAY Now rust6502 Version 1.1.0 is released ! On github with all the demo file and on crates.io / cargo !"}, {"post_id": 43315, "ts": "2026-08-08T14:47:20Z", "hours": 2.8169, "text": "Here is what I have done in 2h 50 . First I wrote a lot of docs, for the keyboard, Serial Monitor, Wozmon etc… This was so boring . But at least now I will be ready to ship soon ! Second, I have fixed the Wozmon list content of address. Before when you was doing FF00.FFFF it was just showing the byte at $FF00 and the byte at $FFFF now it list all the byte between !"}, {"post_id": 43203, "ts": "2026-08-08T10:26:46Z", "hours": 0.2706, "text": "New little update ! I have created a Python tools to create memory map for my emulator docs !"}, {"post_id": 43187, "ts": "2026-08-08T09:47:21Z", "hours": 0.5125, "text": "Little update ! I have added tips in the settings menu. The change randomly using the UNIX Epoch value"}, {"post_id": 42870, "ts": "2026-08-07T20:34:53Z", "hours": 0.6192, "text": "Little update, I added a Program Counter (PC) input to move it in when running a program. I also added a cursor for the start input on the Home Screen !"}, {"post_id": 42844, "ts": "2026-08-07T19:42:37Z", "hours": 1.9044, "text": "After 1h50 I have added a Snake demo program that use the PS/2 keyboard !!! I also make a demo program to test the Serial Monitor using netcat nc"}, {"post_id": 42206, "ts": "2026-08-06T20:22:37Z", "hours": 3.5697, "text": "Wow, just WOW. I have added a serial monitor, and Apple 1 OS Serial Monitor Here is the way the monitor work, you load character to $BFE0 like this : lda #'A' sta $BFE0 Then you run the program in the emulator like normal, then you open another terminal and you connect to localhost port 8080 using netcat nc like this : nc 127.0.0.1 8080 And now if you already launch the program, when you connect to localhost ( 127.0.0.1 is localhost) you will see a A in your terminal ! You can also type in the serial monitor ! Here is a code that show the number of characters typed by using the pixels in the 32x32 screen ! start: ldx #$FF txs ldx #$00 main_loop: bit $BFE1 bpl main_loop lda $BFE0 sta $BFE0 lda #WHITE_COLOR sta $0200, x inx jmp main_loop Apple 1 This is a very damn big part. To be short, I have recreated the Apple 1 OS (Wozmon) created by Steve Wozniak. In short I took the code given in the Apple 1 User Manual, modify it to use the Serial Monitor and Keyboard, fix some issue with the prompt. I can even run the classic program from the manual to print all the available characters. With Wozmon you can also write and read data from the memory so you can show some pixel on the screen ! Here is the program running and the serial monitor."}, {"post_id": 41544, "ts": "2026-08-05T20:29:50Z", "hours": 4.6692, "text": "Okay soo….. it’s been 4 hours and 35 minutes . I have done so much and not that much at the same time (I know it’s weird ) I have added a demo program who print the pressed character ! I have spend 2 hours on a little bug but yeah now it’s working ! So with the program I drew all the key on a PS/2 keyboard . I also fixed some little inattention problem in my code. I also created a little python script to help me convert .png drawing into raw .inc value ! ( Did you find the secret phrase ?)"}, {"post_id": 40862, "ts": "2026-08-04T17:37:24Z", "hours": 0.6206, "text": "Now there is all the number & lower case letter (a-z) & and the Space bar icon !"}, {"post_id": 40720, "ts": "2026-08-04T13:13:58Z", "hours": 0.6008, "text": "I want to create a ASM program who print the pressed key to the screen, and for that I need to create the font/image for each key. There is ~100 key . So here is the first one !"}, {"post_id": 40191, "ts": "2026-08-03T16:23:25Z", "hours": 2.2289, "text": "Wow that was… difficult . But now there is a PS/2 keyboard Emulation ! The I/O port is map on $BFF0-$BBF2. The PS/2 keyboard work with 3 addresses $BFF0 : KBD_DATA $BFF1 : KBD_STATUS $BFF2 : KBD_ACK To activate to keyboard in the emulator you can press on the screen container and to exit it just click anywhere else ! (The number you can see in the memory viewer at $0000 is the code from different key !) Maybe next time I will create a program to see each letter"}, {"post_id": 39675, "ts": "2026-08-02T20:07:26Z", "hours": 1.4747, "text": "YAY ! Now there is mouse control on the home screen, this mean that you can click every where to change the focus and in the file explorer you can double-click to open a folder and double-click to open a file directly, you can also with a simple click enable or disable Force Address Mode"}, {"post_id": 38319, "ts": "2026-07-31T17:15:48Z", "hours": 8.67, "text": "Ok so… it’s been 8h40 . I have done a lot (I mean it’s logic it’s been 8h and 40 minutes) In time order I have done : Replace self.pc + 1 to self.pc.wrapping_add(1) so it’s like on the real 6502 if the current PC is $FFFF and you add 1 it will be $0000 . Added a panic hook, before when the program was crashing (for a bad ASM program by example) the terminal was still in RAW mode (so if you click, move the mouse etc… it will print a bunch of garbage number) but now it exit the raw mode in a clean way ! Remove unused import Change the start of the Stack Pointer to $1FFF Added a memory reset function Write a bunch of test programs Replace IPS (instruction per seconds) by Hz and MHz like in real life (so i’ve adapted the UI for the change) Now the disassembler disassemble the whole program (neat right ? ) using .len() . (yes before it was an hard-coded number Optimize the screen render method. Before I was refreshing the screen even if nothings has been changed, now i check if somethings have been changed to update the screen Added address of each “quarter” of the screen in the screen documentation Fixed foreground and background color of the Frequency selector (on the Home Screen) Write a program to test IRQ and NMI Keybinds the I and N key to IRQ and NMI Changed the Hello World program to be rainbow The emulator will look by it self to the reset vector ( $FFFC and $FFFD ) to set the PC at the correct address Added a force address toggle to… force the the start address When the force addr toggle is off you can’t modify the start Addr and it’s darker Every file or folder who start by a . (dot) is not shown in the file selector Moved the hackclub logo raw binary data to a .inc file Added a self crashing test program (Next time I might add a PS/2 keyboard emulation… )"}, {"post_id": 33529, "ts": "2026-07-23T15:42:24Z", "hours": 0.2847, "text": "Last devlogs before Ship #1 Wow 37h of work. I have made an Asciinema video, Youtube video and update the README.md Wish me luck !"}, {"post_id": 33447, "ts": "2026-07-23T12:32:34Z", "hours": 0.8183, "text": "I have been writing a LOT of documentation on how to create a 6502 ASM program, Screen documentation. And the project is now published in version 1.0.0 on Github and Cargo https://github.com/wirenux/Rust-6502 https://crates.io/crates/rust6502"}, {"post_id": 33416, "ts": "2026-07-23T10:42:45Z", "hours": 0.8144, "text": "I have added a new program called HackClub Logo First, I have draw the hackclub logo in aseprite with a 32x32 pixel file using my custom color palette. Second, I have created a simple python script who take a .png in input and output ASM raw data for the image (using my color palette). Third, I have create a simple ASM program to print the logo on the screen !"}, {"post_id": 33164, "ts": "2026-07-22T20:28:05Z", "hours": 0.3019, "text": "WOW 35H 🎉 I have added a file : DemoProgram.md to show all the demo program"}, {"post_id": 33159, "ts": "2026-07-22T20:10:35Z", "hours": 3.8867, "text": "WOW 4h 😅 I have done the full README.md, documentation about the screen, color palette and fix some little bugs."}, {"post_id": 32560, "ts": "2026-07-21T20:27:52Z", "hours": 0.6103, "text": "Little bug fix: Now when we select a file in the Home File Selector the filename appear in the Opcode container. I have also reorganize the tui.rs code !"}, {"post_id": 32540, "ts": "2026-07-21T19:47:40Z", "hours": 0.3697, "text": "WOW already 30 hours ?! 😅 I now have added the home logo ! I also changed the step for the speed selection on Home Menu from 500 to 100 for each step"}, {"post_id": 32522, "ts": "2026-07-21T19:16:08Z", "hours": 2.0906, "text": "Wow that was damn hard 😭. But the Home Menu is finally here 🎉. There is the logo (might change). The select file container with full navigation (folder, parent directory, file), Icon (require a Nerd Font) and Colors. The selected file path update in real time with the absolute path of the file. The start address automatically change if the file selected is a demo file (end with “_demo.bin”) to $C000. The start address it editable with Alpha numeric character (hexadecimal). And the emulation speed work ! There is control on the footer bar."}, {"post_id": 32416, "ts": "2026-07-21T16:21:09Z", "hours": 1.2358, "text": "New demo program… HelloWorld_demo ! Print Hello World ! centered on the screen all in pure 6502 Assembly. I also modified the way the disassembler work, now even if there is a BRK it will continue to read the file until the end. The ASM part was really really haaarrddd."}, {"post_id": 32338, "ts": "2026-07-21T13:23:35Z", "hours": 0.4014, "text": "Now if I press R I can reset the program. I also modify the footer bar"}, {"post_id": 32323, "ts": "2026-07-21T12:48:13Z", "hours": 0.5539, "text": "I have update the color from word to RGB value so if a different terminal theme is applied the color are the same. I also added a footer bar with the keybinds."}, {"post_id": 32296, "ts": "2026-07-21T11:32:52Z", "hours": 1.4164, "text": "New panel 🥁🥁🥁…. the ✨ SETTINGS ✨ ! In this panel there is a smaller version of the Logo and the settings to modify the speed of the CPU. There is also the link to the github repo and stardance project"}, {"post_id": 31921, "ts": "2026-07-20T18:22:48Z", "hours": 0.2858, "text": "Now the name of the file currently running is in the title. I also finished the rainbow program to fill the whole screen."}, {"post_id": 31910, "ts": "2026-07-20T18:01:58Z", "hours": 1.7158, "text": "New feature 🥁🥁🥁 ✨ THE SCREEN ✨ This was very very hard. The screen use the Unicode half-block character “▀”, to write to the screen you just need to send value like this : LDA #$02 ; load \"02\" into the accumulator STA $0200 ; store it at memory address $0200 (the 1st pixel) Here the 02 is the color RED. Here is the color palette: fn palette_color ( index : u8 ) -> Color { match index & 0x0F { 0 => Color :: Black , 1 => Color :: White , 2 => Color :: Red , 3 => Color :: Cyan , 4 => Color :: Magenta , 5 => Color :: Green , 6 => Color :: Blue , 7 => Color :: Yellow , 8 => Color :: Rgb ( 255 , 165 , 0 ), // Orange 9 => Color :: Rgb ( 153 , 76 , 0 ), // Brown 10 => Color :: DarkGray , 11 => Color :: Gray , 12 => Color :: LightRed , 13 => Color :: LightBlue , 14 => Color :: LightGreen , _ => Color :: Reset , // 15 transparent } } The color may vary between terminal theme. I also had created an ASM program to print a rainbow on the 1st quarter of the screen. I also added the feature that when a BRK instruction is hit the program turn to HALT mode (in the UI). I also added the indentation system to BEQ, BNE, BCC, BCS, BMI, BPL, BVC, BVS. I also added a new way of calculating the speed of the program."}, {"post_id": 31806, "ts": "2026-07-20T14:10:36Z", "hours": 0.4183, "text": "Choosing between a variety of logo (2 first screen shot are in Apple Terminal the last is in ghostty with a Catpuccin Mocha theme)"}, {"post_id": 31786, "ts": "2026-07-20T13:41:37Z", "hours": 0.9217, "text": "I have added a top bar in the memory container with the last part of the address (to be more easy to read). I also fixed all the scroll bar from scrolling outside the container and just see nothings"}, {"post_id": 31761, "ts": "2026-07-20T12:25:55Z", "hours": 0.3808, "text": "I have fixed the cursor in the Stack Container to scroll automaticly when needed and when running. I also optimised the code !"}, {"post_id": 31735, "ts": "2026-07-20T11:29:19Z", "hours": 1.0997, "text": "A lot has been going on ! I have added the Memory Viewer, Scroll bar to the Stack Viewer and Memory Viewer (work with the 🥁…. SCROLL WHEEL !). I also reduce the space taken by the opcode list so we can see the memory viewer !"}, {"post_id": 31230, "ts": "2026-07-19T13:48:00Z", "hours": 0.4708, "text": "I have added a Stack Viewer on the left ! The container scroll it self when the “cursor”/current position of the Stack Pointer (SP). I also have fix the text for the SP in the register container"}, {"post_id": 30873, "ts": "2026-07-18T20:31:08Z", "hours": 0.5025, "text": "I have tried to implement multi-threading but realize that it’s not worth it for a simple emulator like this one."}, {"post_id": 30853, "ts": "2026-07-18T20:00:15Z", "hours": 0.4039, "text": "I have clean the code a little bit 🧹 and added a RUN or PAUSED indicator :"}, {"post_id": 30789, "ts": "2026-07-18T17:52:51Z", "hours": 1.2636, "text": "The UI is going forward one step after another ! I have changed a some little like the place where is the Flag Container, now it’s on the left side. And I also have added a LOT a things like: Register Container (under the Flag Container) Now when there is a JMP (or any type or jump like RST, etc…) the code indent it self Up and Down key move the cursor 🥁…. ✨UP & DOWN ✨ New color for the ADDR in the Opcode container Things I have removed: BYTES section in the Opcode container because I don’t think it’s really useful"}, {"post_id": 30680, "ts": "2026-07-18T13:37:25Z", "hours": 0.2903, "text": "YAY now the Flags can be shown ! Green Bold when active and Dark Gray classic when not"}, {"post_id": 30669, "ts": "2026-07-18T13:18:54Z", "hours": 0.5522, "text": "I have made a program to disassemble the program so the code could be shown in the TUI. And it work !"}, {"post_id": 30661, "ts": "2026-07-18T12:46:07Z", "hours": 1.1003, "text": "I am now making the TUI part of this emulator ! I am using Ratatui to make the TUI. This mean I have to change all the printing part of my existing program"}, {"post_id": 30627, "ts": "2026-07-18T10:52:26Z", "hours": 0.465, "text": "YAY Now EVERY opcode and EVERY addressing mode are implemented 🎉 (wow 1478 lines of pure opcodes)"}, {"post_id": 30355, "ts": "2026-07-17T20:40:38Z", "hours": 0.2844, "text": "I have fix some little print in 3-4 instruction and the IRQ function"}, {"post_id": 30342, "ts": "2026-07-17T20:21:23Z", "hours": 1.0506, "text": "I’m being closer and closer of getting all opcode and all Addressing mode implemented Here are the list of opcode I have implemented and there Addressing Mode: ADC Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y AND Zeropage Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y CMP Zeropage Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y EOR Zeropage Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y I also fixed the CLD instruction. I was doing a : cpu .sr | = ! CPU :: DECIMAL_FLAG ; but the right one was this: cpu .sr &= ! CPU :: DECIMAL_FLAG ;"}, {"post_id": 29763, "ts": "2026-07-16T21:06:40Z", "hours": 0.9353, "text": "New opcode time ! LDY ZeroPageX STA ZeroPageX AbsoluteY IndirectX IndirectY STX ZeroPageY Absolute STY ZeroPageX Absolute"}, {"post_id": 29468, "ts": "2026-07-16T13:13:24Z", "hours": 1.3792, "text": "Add interruption with NMI + IRQ. Add option to the user to start at a specific address"}, {"post_id": 29172, "ts": "2026-07-15T21:55:25Z", "hours": 0.4572, "text": "New opcode STA Absolute X"}, {"post_id": 29083, "ts": "2026-07-15T18:53:21Z", "hours": 0.73, "text": "I’ve just passed 40min to fix an interruption problem to final look back and see that my original code what working perfectly fine 😭 . I’ve also change my build tools to ca65 + ld65"}, {"post_id": 29035, "ts": "2026-07-15T18:04:18Z", "hours": 0.5122, "text": "YAY I have added a BUNCH of new Opcodes : BCS BCC BPL BIT with ZeroPage & Absolute BMI BVC BVS"}, {"post_id": 29003, "ts": "2026-07-15T17:27:28Z", "hours": 0.6717, "text": "New opcode TXS (transfer X to stack pointer) TSX (transfer stack pointer to X) ldx_absolute_Y lda_indirect_x lda_indirect_y ldx_zeropage_y New Addressing Mode: AbsoluteY ZeroPageY IndirectX IndirectY"}, {"post_id": 28387, "ts": "2026-07-14T16:45:14Z", "hours": 0.4636, "text": "✨ NEW OPCODE ✨ : PHP (Push Processor Status: push current value of all the flag to the stack) PLP (Pull Processor Status: pull current value of all the flag to the stack) But I have also add a memory dump with page (at the end of a program) to debug ! (1st screenshot) and i also add a fixed (address) memory viewer when running (2nd screenshot)"}, {"post_id": 28368, "ts": "2026-07-14T16:14:05Z", "hours": 0.3953, "text": "There now is 4 new opcode: ROR ROL ROR Memory ROL Memory"}, {"post_id": 28355, "ts": "2026-07-14T15:47:50Z", "hours": 0.7244, "text": "New Opcode : PLA (Pull Accumulator) PHA (Push Accumulator) ASL memory LSR memory"}, {"post_id": 27919, "ts": "2026-07-13T20:54:45Z", "hours": 0.3947, "text": "The now is new opcode ! : EOR ORA AND LDA (ZeroPageX) And some new AddressingMode : ZeroPageX AbsoluteX"}, {"post_id": 27728, "ts": "2026-07-13T15:22:17Z", "hours": 0.7697, "text": "Now there is a pop_stack function who return the top value of the stack (Last In First Out). I’ve also added those opcode : JSR RST And made this test code :"}, {"post_id": 27647, "ts": "2026-07-13T12:27:38Z", "hours": 1.7306, "text": "I’ve done a LOT of work. Added Opcodes: BEQ BNE SBC Immediate + Zeropage I’ve also done a lot of refractorisation. Code before : match opcode { 0x18 => { self .sr &= ! CPU :: CARRY_FLAG ; self .set_instr ( format! ( \"{:02X}\" , opcode ), \"CLC\" .to_string (), 2 ); }, // ... } VS now : match opcode { 0x18 => self .clc ( opcode ), // ... } So now every opcode have his own function !"}, {"post_id": 27367, "ts": "2026-07-12T21:19:13Z", "hours": 0.5197, "text": "I’ve added those instruction: ADC (Add with Carry) CLC (Clear Carry Flag) SEC (Set Carry Flag) I’ve also made this little ASM 6502 program to test those opcode .org $8000 START: SEC ; to test CLC LDA #$FF ; A = 255 CLC ; Clear Carry Flag before addition ADC #$02 ; 255 + 2 = 1, Carry is now 1 (0x01FF + 0x0002 = 0x0201) STA $20 ; Store Low Byte result (01) at $20 LDA #$00 ; Load 0 for the high byte ADC #$00 ; 0 + 0 + 1 (Carry from previous instruction) = 1 STA $21 ; Store High Byte result (01) at $21 ; SEC use SEC ; Carry = 1 LDA #$01 ; A = 1 ADC #$00 ; 1 + 0 + 1 (Carry) = 2 BRK And it work just fine !"}, {"post_id": 27343, "ts": "2026-07-12T20:41:04Z", "hours": 0.885, "text": "I’ve added a bunch of opcode like : STA, STX, STY (Zero Page, Absolute) LDX, LDY (Immediate, Zero Page, Absolute) JMP (Absolute), JMP (Indirect) (the screen shot is a new program that i’ve made and test on virtual 6502 and my project)"}, {"post_id": 27311, "ts": "2026-07-12T19:40:23Z", "hours": 0.3989, "text": "I’ve added a new UI and AddressingMode"}, {"post_id": 27261, "ts": "2026-07-12T17:42:19Z", "hours": 4.3097, "text": "Hi ! Right now in my project I have added : Bus with ram read & write function load from file function CPU All registry (a, x, y, sp, pc, sr) reset cpu function update Z & N flag function clock_tick with those opcode in it : BRK; DEY; TXA; TYA; TAY; LDA; TAX; INY; DEX; INX; NOP (1st screenshot is official emulator 2nd is mine)"}]...
|
Title: Rust 6502 by @Wirenux | Stardance
Devlogs: Title: Rust 6502 by @Wirenux | Stardance
Devlogs:
Hi ! Right now in my project I have added : Bus with ram read & write function load from file function CPU All registry (a, x, y, sp, pc, sr) reset cpu function update Z & N flag function clock_tick with those opcode in it : BRK; DEY; TXA; TYA; TAY; LDA; TAX; INY; DEX; INX; NOP (1st screenshot is official emulator 2nd is mine)
I’ve added a new UI and AddressingMode
I’ve added a bunch of opcode like : STA, STX, STY (Zero Page, Absolute) LDX, LDY (Immediate, Zero Page, Absolute) JMP (Absolute), JMP (Indirect) (the screen shot is a new program that i’ve made and test on virtual 6502 and my project)
I’ve added those instruction: ADC (Add with Carry) CLC (Clear Carry Flag) SEC (Set Carry Flag) I’ve also made this little ASM 6502 program to test those opcode .org $8000 START: SEC ; to test CLC LDA #$FF ; A = 255 CLC ; Clear Carry Flag before addition ADC #$02 ; 255 + 2 = 1, Carry is now 1 (0x01FF + 0x0002 = 0x0201) STA $20 ; Store Low Byte result (01) at $20 LDA #$00 ; Load 0 for the high byte ADC #$00 ; 0 + 0 + 1 (Carry from previous instruction) = 1 STA $21 ; Store High Byte result (01) at $21 ; SEC use SEC ; Carry = 1 LDA #$01 ; A = 1 ADC #$00 ; 1 + 0 + 1 (Carry) = 2 BRK And it work just fine !
I’ve done a LOT of work. Added Opcodes: BEQ BNE SBC Immediate + Zeropage I’ve also done a lot of refractorisation. Code before : match opcode { 0x18 => { self .sr &= ! CPU :: CARRY_FLAG ; self .set_instr ( format! ( "{:02X}" , opcode ), "CLC" .to_string (), 2 ); }, // ... } VS now : match opcode { 0x18 => self .clc ( opcode ), // ... } So now every opcode have his own function !
Now there is a pop_stack function who return the top value of the stack (Last In First Out). I’ve also added those opcode : JSR RST And made this test code :
The now is new opcode ! : EOR ORA AND LDA (ZeroPageX) And some new AddressingMode : ZeroPageX AbsoluteX
New Opcode : PLA (Pull Accumulator) PHA (Push Accumulator) ASL memory LSR memory
There now is 4 new opcode: ROR ROL ROR Memory ROL Memory
✨ NEW OPCODE ✨ : PHP (Push Processor Status: push current value of all the flag to the stack) PLP (Pull Processor Status: pull current value of all the flag to the stack) But I have also add a memory dump with page (at the end of a program) to debug ! (1st screenshot) and i also add a fixed (address) memory viewer when running (2nd screenshot)
New opcode TXS (transfer X to stack pointer) TSX (transfer stack pointer to X) ldx_absolute_Y lda_indirect_x lda_indirect_y ldx_zeropage_y New Addressing Mode: AbsoluteY ZeroPageY IndirectX IndirectY
YAY I have added a BUNCH of new Opcodes : BCS BCC BPL BIT with ZeroPage & Absolute BMI BVC BVS
I’ve just passed 40min to fix an interruption problem to final look back and see that my original code what working perfectly fine 😭 . I’ve also change my build tools to ca65 + ld65
New opcode STA Absolute X
Add interruption with NMI + IRQ. Add option to the user to start at a specific address
New opcode time ! LDY ZeroPageX STA ZeroPageX AbsoluteY IndirectX IndirectY STX ZeroPageY Absolute STY ZeroPageX Absolute
I’m being closer and closer of getting all opcode and all Addressing mode implemented Here are the list of opcode I have implemented and there Addressing Mode: ADC Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y AND Zeropage Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y CMP Zeropage Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y EOR Zeropage Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y I also fixed the CLD instruction. I was doing a : cpu .sr | = ! CPU :: DECIMAL_FLAG ; but the right one was this: cpu .sr &= ! CPU :: DECIMAL_FLAG ;
I have fix some little print in 3-4 instruction and the IRQ function
YAY Now EVERY opcode and EVERY addressing mode are implemented 🎉 (wow 1478 lines of pure opcodes)
I am now making the TUI part of this emulator ! I am using Ratatui to make the TUI. This mean I have to change all the printing part of my existing program
I have made a program to disassemble the program so the code could be shown in the TUI. And it work !
YAY now the Flags can be shown ! Green Bold when active and Dark Gray classic when not
The UI is going forward one step after another ! I have changed a some little like the place where is the Flag Container, now it’s on the left side. And I also have added a LOT a things like: Register Container (under the Flag Container) Now when there is a JMP (or any type or jump like RST, etc…) the code indent it self Up and Down key move the cursor 🥁…. ✨UP & DOWN ✨ New color for the ADDR in the Opcode container Things I have removed: BYTES section in the Opcode container because I don’t think it’s really useful
I have clean the code a little bit 🧹 and added a RUN or PAUSED indicator :
I have tried to implement multi-threading but realize that it’s not worth it for a simple emulator like this one.
I have added a Stack Viewer on the left ! The container scroll it self when the “cursor”/current position of the Stack Pointer (SP). I also have fix the text for the SP in the register container
A lot has been going on ! I have added the Memory Viewer, Scroll bar to the Stack Viewer and Memory Viewer (work with the 🥁…. SCROLL WHEEL !). I also reduce the space taken by the opcode list so we can see the memory viewer !
I have fixed the cursor in the Stack Container to scroll automaticly when needed and when running. I also optimised the code !
I have added a top bar in the memory container with the last part of the address (to be more easy to read). I also fixed all the scroll bar from scrolling outside the container and just see nothings
Choosing between a variety of logo (2 first screen shot are in Apple Terminal the last is in ghostty with a Catpuccin Mocha theme)
New feature 🥁🥁🥁 ✨ THE SCREEN ✨ This was very very hard. The screen use the Unicode half-block character “▀”, to write to the screen you just need to send value like this : LDA #$02 ; load "02" into the accumulator STA $0200 ; store it at memory address $0200 (the 1st pixel) Here the 02 is the color RED. Here is the color palette: fn palette_color ( index : u8 ) -> Color { match index & 0x0F { 0 => Color :: Black , 1 => Color :: White , 2 => Color :: Red , 3 => Color :: Cyan , 4 => Color :: Magenta , 5 => Color :: Green , 6 => Color :: Blue , 7 => Color :: Yellow , 8 => Color :: Rgb ( 255 , 165 , 0 ), // Orange 9 => Color :: Rgb ( 153 , 76 , 0 ), // Brown 10 => Color :: DarkGray , 11 => Color :: Gray , 12 => Color :: LightRed , 13 => Color :: LightBlue , 14 => Color :: LightGreen , _ => Color :: Reset , // 15 transparent } } The color may vary between terminal theme. I also had created an ASM program to print a rainbow on the 1st quarter of the screen. I also added the feature that when a BRK instruction is hit the program turn to HALT mode (in the UI). I also added the indentation system to BEQ, BNE, BCC, BCS, BMI, BPL, BVC, BVS. I also added a new way of calculating the speed of the program.
Now the name of the file currently running is in the title. I also finished the rainbow program to fill the whole screen.
New panel 🥁🥁🥁…. the ✨ SETTINGS ✨ ! In this panel there is a smaller version of the Logo and the settings to modify the speed of the CPU. There is also the link to the github repo and stardance project
I have update the color from word to RGB value so if a different terminal theme is applied the color are the same. I also added a footer bar with the keybinds.
Now if I press R I can reset the program. I also modify the footer bar
New demo program… HelloWorld_demo ! Print Hello World ! centered on the screen all in pure 6502 Assembly. I also modified the way the disassembler work, now even if there is a BRK it will continue to read the file until the end. The ASM part was really really haaarrddd.
Wow that was damn hard 😭. But the Home Menu is finally here 🎉. There is the logo (might change). The select file container with full navigation (folder, parent directory, file), Icon (require a Nerd Font) and Colors. The selected file path update in real time with the absolute path of the file. The start address automatically change if the file selected is a demo file (end with “_demo.bin”) to $C000. The start address it editable with Alpha numeric character (hexadecimal). And the emulation speed work ! There is control on the footer bar.
WOW already 30 hours ?! 😅 I now have added the home logo ! I also changed the step for the speed selection on Home Menu from 500 to 100 for each step
Little bug fix: Now when we select a file in the Home File Selector the filename appear in the Opcode container. I have also reorganize the tui.rs code !
WOW 4h 😅 I have done the full README.md, documentation about the screen, color palette and fix some little bugs.
WOW 35H 🎉 I have added a file : DemoProgram.md to show all the demo program
I have added a new program called HackClub Logo First, I have draw the hackclub logo in aseprite with a 32x32 pixel file using my custom color palette. Second, I have created a simple python script who take a .png in input and output ASM raw data for the image (using my color palette). Third, I have create a simple ASM program to print the logo on the screen !
I have been writing a LOT of documentation on how to create a 6502 ASM program, Screen documentation. And the project is now published in version 1.0.0 on Github and Cargo https://github.com/wirenux/Rust-6502 https://crates.io/crates/rust6502
Last devlogs before Ship #1 Wow 37h of work. I have made an Asciinema video, Youtube video and update the README.md Wish me luck !
Ok so… it’s been 8h40 . I have done a lot (I mean it’s logic it’s been 8h and 40 minutes) In time order I have done : Replace self.pc + 1 to self.pc.wrapping_add(1) so it’s like on the real 6502 if the current PC is $FFFF and you add 1 it will be $0000 . Added a panic hook, before when the program was crashing (for a bad ASM program by example) the terminal was still in RAW mode (so if you click, move the mouse etc… it will print a bunch of garbage number) but now it exit the raw mode in a clean way ! Remove unused import Change the start of the Stack Pointer to $1FFF Added a memory reset function Write a bunch of test programs Replace IPS (instruction per seconds) by Hz and MHz like in real life (so i’ve adapted the UI for the change) Now the disassembler disassemble the whole program (neat right ? ) using .len() . (yes before it was an hard-coded number Optimize the screen render method. Before I was refreshing the screen even if nothings has been changed, now i check if somethings have been changed to update the screen Added address of each “quarter” of the screen in the screen documentation Fixed foreground and background color of the Frequency selector (on the Home Screen) Write a program to test IRQ and NMI Keybinds the I and N key to IRQ and NMI Changed the Hello World program to be rainbow The emulator will look by it self to the reset vector ( $FFFC and $FFFD ) to set the PC at the correct address Added a force address toggle to… force the the start address When the force addr toggle is off you can’t modify the start Addr and it’s darker Every file or folder who start by a . (dot) is not shown in the file selector Moved the hackclub logo raw binary data to a .inc file Added a self crashing test program (Next time I might add a PS/2 keyboard emulation… )
YAY ! Now there is mouse control on the home screen, this mean that you can click every where to change the focus and in the file explorer you can double-click to open a folder and double-click to open a file directly, you can also with a simple click enable or disable Force Address Mode
Wow that was… difficult . But now there is a PS/2 keyboard Emulation ! The I/O port is map on $BFF0-$BBF2. The PS/2 keyboard work with 3 addresses $BFF0 : KBD_DATA $BFF1 : KBD_STATUS $BFF2 : KBD_ACK To activate to keyboard in the emulator you can press on the screen container and to exit it just click anywhere else ! (The number you can see in the memory viewer at $0000 is the code from different key !) Maybe next time I will create a program to see each letter
I want to create a ASM program who print the pressed key to the screen, and for that I need to create the font/image for each key. There is ~100 key . So here is the first one !
Now there is all the number & lower case letter (a-z) & and the Space bar icon !
Okay soo….. it’s been 4 hours and 35 minutes . I have done so much and not that much at the same time (I know it’s weird ) I have added a demo program who print the pressed character ! I have spend 2 hours on a little bug but yeah now it’s working ! So with the program I drew all the key on a PS/2 keyboard . I also fixed some little inattention problem in my code. I also created a little python script to help me convert .png drawing into raw .inc value ! ( Did you find the secret phrase ?)
Wow, just WOW. I have added a serial monitor, and Apple 1 OS Serial Monitor Here is the way the monitor work, you load character to $BFE0 like this : lda #'A' sta $BFE0 Then you run the program in the emulator like normal, then you open another terminal and you connect to localhost port 8080 using netcat nc like this : nc 127.0.0.1 8080 And now if you already launch the program, when you connect to localhost ( 127.0.0.1 is localhost) you will see a A in your terminal ! You can also type in the serial monitor ! Here is a code that show the number of characters typed by using the pixels in the 32x32 screen ! start: ldx #$FF txs ldx #$00 main_loop: bit $BFE1 bpl main_loop lda $BFE0 sta $BFE0 lda #WHITE_COLOR sta $0200, x inx jmp main_loop Apple 1 This is a very damn big part. To be short, I have recreated the Apple 1 OS (Wozmon) created by Steve Wozniak. In short I took the code given in the Apple 1 User Manual, modify it to use the Serial Monitor and Keyboard, fix some issue with the prompt. I can even run the classic program from the manual to print all the available characters. With Wozmon you can also write and read data from the memory so you can show some pixel on the screen ! Here is the program running and the serial monitor.
After 1h50 I have added a Snake demo program that use the PS/2 keyboard !!! I also make a demo program to test the Serial Monitor using netcat nc
Little update, I added a Program Counter (PC) input to move it in when running a program. I also added a cursor for the start input on the Home Screen !
Little update ! I have added tips in the settings menu. The change randomly using the UNIX Epoch value
New little update ! I have created a Python tools to create memory map for my emulator docs !
Here is what I have done in 2h 50 . First I wrote a lot of docs, for the keyboard, Serial Monitor, Wozmon etc… This was so boring . But at least now I will be ready to ship soon ! Second, I have fixed the Wozmon list content of address. Before when you was doing FF00.FFFF it was just showing the byte at $FF00 and the byte at $FFFF now it list all the byte between !
YAY Now rust6502 Version 1.1.0 is released ! On github with all the demo file and on crates.io / cargo !
v1.2.0 Here are the changes attached to this release : fix: a bug on windows, with ghost key press ( c3c6009 ) add: a Scroll bar on the file explorer ( 94b2abb )
I added the step-back function. It work by pressing “B”, it’s just rewinding the emulator up to 500 opcode. Only work when moving in step-by-step mode (with Enter)
Okay so… I have added the Breakpoint and the Watchpoint . When you set the breakpoint to $C00C the CPU will stop before running the instruction at $C00C. The watchpoint stop if a value at an address at been changed.
+1h 25 min ! Since the last time I have added the keybind panel. Where there is… all the keybinds I also remove the keybind on the footer to only get Keybind “K”
+ 1h35 ! This might be the last feature I add to Rust 6502. Since I ran out of idea and for me the project seem to be finished. Anyway, here are the things I added : A RNG address : $BFF3 . The program just read from it and get a random value via the Host computer ( 4feb4d8 ) A conditional breakpoint : A top bar in the Breakpoint popup to add a conditional breakpoint (like : If AC != 0F -> Break) ( 1b7bc81 )
+ 1h20 So… this might be the last devlog for this project. I just released the v1.3.0 . And here is what I added since the last devlog : A RNG documentation Snake now use a real RNG I recorded the Asciinema .cast file Update the python tools to generate memory diagrams Update the Memory documentation So next step is the 3rd Ship
Ships:
=== Rust 6502 === A legendary 8-bit CPU right in your terminal! 🦀 ᕙ( •̀ ᗜ •́ )ᕗ == What did you make ? == I built a fully functional emulator for the MOS 6502 (the microprocessor that powered the Apple II, Commodre 64, and the NES) from scratch using Rust ! Instead of a standard graphical window, I built a Terminal User Interface (TUI) using Ratatui. Here is what’s inside: Full CPU Emulation: Execute 6502 machine code with live register (AC, XR, YR, SP) and status flag tracking Virtual Screen: A 32x32 memory-mapped display ($0200-$05FF) rendered right in the terminal using Unicode Half-Block and a custom 16-color palette Live Disassembler & Hex Viewer: Watch the RAM change in real-time and see the raw binary machine code translated back into readable assembly instructions on the fly Built-in File Browser: A visual menu with Nerd Font icons to navigate your system and load compiled .bin ROMs Available on crates.io : You can download it via Cargo == What was challenging ? == The Disassembler: Writing a disassembler that parses raw .bin files is tricky because they don’t have headers. I ran into a massive issue where my image data (using the color byte $0A) was being read by the disassembler as infinite ASL A (Shift Left) instructions! I had to engineer a way for the disassembler to properly halt when it hit a BRK instruction so it wouldn’t try to execute my pixel art. Terminal UI Architecture: Designing a dashboard (hex grids, scrolling stacks, changing colors) required a really solid state-management architecture to keep the UI smooth and responsive while the CPU loop spins at thousands of instructions per second. == What are you proud of ? == I am proud of using this project to learn Rust in a fun way! ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ I’m also really proud that it’s officially published on crates.io, meaning anyone can install and run my emulator with a single command == What should people know so they can test your project ? == Note: A Nerd Font is recommended in your terminal emulator for a proper rendering of the UI icons on the Home page How to test: Install the emulator directly from crates.io by running: cargo install rust6502 Download all the .bin files on the GitHub Releases page. Launch the emulator by running rust6502 and use the built-in Home menu to select one of the demo .bin files! == Things to try == Load hackclub_logo_demo.bin to see the terminal render a 32x32 pixel art logo using 6502 assembly Load rainbow_demo.bin to watch a shifting color gradient animation directly manipulating video memory. Load helloworld_demo.bin to watch a centered Hello world message The Debugger: go to the Settings menu inside the TUI and slow down the CPU speed. Then watch the Memory Viewer and Disassembler track exactly what the code is doing in real-time!
=== Rust 6502 === A MOS 6502 emulator TUI with a lot of features ============================================ Before reading this Ship you should take a look at Ship #1 == What did you add ? == Here is a list of everything that I have added since the last Ship = Features = Serial Monitor : you connect to localhost:8080 using netcat. Useful for the Apple 1 OS or for debugging with text. The monitor can be used to display text but also to send text like a keyboard (useful for the Apple 1 OS) PS/2 Keyboard : a full PS/2 keyboard emulation (used in Snake) Use the UI with a Mouse: On the Home Menu and in the Emulator you can click on button, toggle, scroll, etc… Interrupt : IRQ & NMI Tips in the Settings Panel Modify speed with Hz & MHz (like a real 6502 chip) Reset Vector: The emulator will look at $FFFC & $FFFD to find the start address of the program (when the Force Address toggle is off) Set PC Address: keyboard shortcut to change the position of the PC (Program Counter) = Demo Program = Apple 1 OS (Wozmon) : I have modified the orginal Apple 1 code to fit my emulator, like Serial Monitor address, Keyboard etc… Snake : Just the Snake game ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ Keyboard Demo: Print every key press on the screen using a custom font Serial Monitor Demo: Show how the Serial Monitor works == What was challenging ? == The most challenging part of this 2nd ship was creating a Serial Monitor that works via a local port, and making a PS/2 Keyboard emulation. And of course, modifying the Apple 1 OS to make it work on this emulator ! (I was having a lot of bugs, so I rewrite a big part of the OS) ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ == What are you proud of ? == I am really proud of my self for the implementation of the Serial monitor that run on different CPU thread than the emulator itself and the fact that it work via the local network. And beyond everything the fact that my emulator can run : games, utility and the Apple 1 OS !!! ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ I’m also really proud that it’s officially published on crates.io. == What should people know so they can test your project ? == Note: A Nerd Font is recommended in your terminal emulator for a proper rendering of the UI icons on the Home page How to test: Install the emulator directly from crates.io by running: ================== cargo install rust6502 Download all the .bin files on the GitHub Releases page. Launch the emulator by running rust6502 and use the built-in Home menu to select one of the demo .bin files! == Things to try == Load snake_demo.bin to play at a classic game using the 32x32 screen and the PS/2 keyboard emulation Load wozmon.bin to use the Apple 1 OS ! You should see the documentation related to Wozmon : https://github.com/wirenux/Rust-6502/blob/main/AppleI.md Load keyboard_demo.bin to see every key you press show up on the 32x32 screen using a custom font The Debugger: go to the Settings menu inside the TUI and slow down the CPU speed. Then watch the Memory Viewer and Disassembler track exactly what the code is doing in real-time!
Rust 6502 A MOS 6502 emulator TUI with a lot of features Before reading this Ship you should take a look at Ship 1 & Ship 2 What did you add ? Here is a list of everything that I have added since the last Ship Features Breakpoints : press “F” to set a breakpoint at any address, the emulator halts the moment PC reaches it Watchpoints : same idea, but for memory Conditional Breakpoints : halt execution when a register (AC, XR, YR, SP) meets a comparison (!=, ==, >=, <=, >, <) against a target value Step Back : press “B” to rewind execution one instruction at a time, restoring the CPU and memory exactly as they were before Random Number Generator : a memory-mapped register at $BFF3 that returns a random byte from the host PC on every read, so ASM programs can have real random number Keybind Panel : a popup listing every keyboard shortcut and control, and removed the old footer keybind list to make room for it Demo Program Snake : updated to pull apple placement from the new RNG instead of the old pseudo random method ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ What was challenging ? Wiring the conditional breakpoint into the run loop without breaking the existing breakpoint/watchpoint checks was harder than I though. Also getting a dropdown-style menu to choose the operator working in Ratatui was tought since there’s no native dropdown widget. So I ended up building a little spinner (▲ value ▼) that cycles through the operators instead ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ What are you proud of ? I’m proud that my emulator now has real debugging tools like : breakpoints, watchpoints, conditional breakpoints, and step-back. What should people know so they can test your project ? A Nerd Font is recommended in your terminal for a better rendering of the UI icons on the Home page How to test: Install the emulator directly from crates.io by running: cargo install rust6502 Download all the .bin files on the GitHub Releases page. Launch the emulator by running rust6502 and use the built-in Home menu to select one of the demo .bin files! Things to try Load snake_demo.bin and play :D Set a breakpoint on an address inside a demo program (check the keybind panel for the shortcut!) and watch execution halt exactly there Try a conditional breakpoint : for example, halt whenever XR == 0F and watch it stop right when the register hits that value Press “B” to step backward and rewind the CPU state instruction by instruction Press the keybind panel shortcut to see the full list of controls...
|
1792831665.5734673
|
1792918065.5734673
|
|
14477
|
Celestial Capitalist by @Ratseer | Stardance
|
Ratseer
|
1
|
80.0
|
1360
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-18T08:46:59Z", "hours": 80.0, "multiplier": 19.18, "payout": 1360, "blessing": "neutral", "text": "Celestial Capitalist is a simulation game where the player simultaneously builds and ascends the corporate ladder from the bottom of the street to the self-built throne at the top of the cosmos. Beg your way from homelessness, run a lemonade stand, scam grandmas on the internet, start a cult, play union-buster tower defence, and generally just have a grand stupid time while the world slowly bends to your will. Currently on FIRST BETA! Contains the slightly unpolished first stage, Rock Bottom, with basic progression, a bunch of minigames and… style!. You’re homeless and you needa earn money to get out of it. Also you can’t save yet. And the volume is broken. WE’LL FIX IT ONE DAY. Controls are all point and clicked + arrow keys for the Fake Injury minigame. Windows only for the moment - will support more soon. Unzip and run ccap1.0exe. By @idi0cy and RatseerOfRattesse Made for Hack Club Stardance. Tribulations Coding is notorious for producing the kind of mistakes one looks through for an entire night and solves in a second of effort. We had a lot of that. The amount of stupid crap on the way here is immense and we’ve still not cleared out all of it. But, @idi0cy and I hope you will enjoy what we’ve made, cuz we sure did enjoy making it. Celestial Capitalist by @idi0cy and @Ratseer .", "repo": "https://github.com/idi0cy/Celestial-Capitalist", "demo": "https://ratseerofrattesse.itch.io/celestial-capitalist"}]...
|
[{"post_id": 70013, "ts": "202 [{"post_id": 70013, "ts": "2026-09-18T08:42:14Z", "hours": 3.6286, "text": "Celestial Capitalist - Beta Complete! After four hours of horrifically annoying bugfixing with @idi0cy , CC is ship ready! We did a lot of misc fixes. There was some really stupid code we left in such as ‘check if x > y’ and consecutively in that one ‘check if x < y’. We’re geniuses. Anyway, we just added a sound slider that doesn’t work outside the editor 😭 . There were also a bunch of balancing issues to fix, such as me labelling a bottle of soy sauce as 45 dollars. But it’s done, oh lord it’s done. Check it out! https://ratseerofrattesse.itch.io/celestial-capitalist"}, {"post_id": 67110, "ts": "2026-09-13T05:19:16Z", "hours": 10.2817, "text": "Revamped Tutorial Gave the new tutorial put in place by @idi0cy some flair. It now also contains a text box for you to pick a save name, which will automatically show up in the ledger where the account name thing is. It may be the save name, but we’re not going to be implementing saves before shipping as we’re lazy and have things to do. The revamp has also made the game through anywhere from 1-103 data.tree is null errors but it ain’t crashing and I’m done solving that crap. Two Bowls of Chili We now have the two bowls of chili as per request by a friend of @idi0cy . New Item Mechanics I’ve changed the item system so that they can take on far more data than just an item type. They now have an additionalProperties , which is a Dictionary that is meant to take a string key and value. This allows us to store pretty much any data we want in there. This was done so that I could make items give temporary skill buffs with ease, as a lot of them are currently only good for selling. So now, you can use a pencil and gain a minute of +1 dexterity (which helps in the fake injury and stealth steal minigames), among other buffs. Miscellaneous fixes We are nearing release, and so we’ve begun to review a lot of stuff and make balancing/bugfixing changes. Deathscreen now returns you to title screen. Made perception affect scavenge quality and charisma affect market quality Added a bajillion tooltips to explain stuff Haggle difficulty has been made easier Fixed an issue in scavenge that made all the loot 0 quality Made event popups stack Made it so other windows can’t open if a scavenge game is happening Celestial Capitalist , dubiously developed by @Ratseer and @idi0cy ."}, {"post_id": 56846, "ts": "2026-08-28T19:55:57Z", "hours": 12.85, "text": "Vitals System Added a health, hydration, and satiation system. Satiation controls max health, and if your hydration hits 0, you begin taking damage over time. When you take damage or your health is low, your screen has a damage overlay. Celestial Capitalist in collaboration with @idi0cy ."}, {"post_id": 42247, "ts": "2026-08-06T21:19:59Z", "hours": 10.2553, "text": "The Great Organization So while @idi0cy over there has been coding new stuff, I’ve been over here cleaning after his mess. I’m currently in the process of adding documentation comments to everything so we know what the hell anything is after we code it. Suffice to say, it’s not going that great but it’s coming along. This man literally wrote a variable called lengthOfTimeUnitThingHi_rAt_D_ontWeLovenamingConVentIons just to piss me off. Another part of the organization effort is adding these #region and #endregion comments everywhere so we can close and expand large sections of code. The Great Centralization I’ve also been working on centralizing certain things. I’ve added a new InventoryHelper class, which contains methods used for inventories such as the market stalls, loot boxes, the actual inventory, and the pick to sell menu. Attached below is the documentation comments for the Resources class containing pretty much every texture, dialogue line, name, and utility function and now a lot of the scripts extend it."}, {"post_id": 23270, "ts": "2026-07-06T03:47:42Z", "hours": 5.2578, "text": "The Market I’ve added a shop system! At exactly 00:00 every day the Market tab refreshes with a new market stall, with randomly generated name, products, and an owner profile for the funnies. This system isn’t really for you to buy and flip prices in the get money tab - this is supposed to drag money out of you when you’re starving for food and also purchase upgrades for your run. Said upgrades have not yet been implemented, but - Using Items Items that can be used now pop up a use item button in the inventory. Monetary items now return money to your ledger and food items now add to your vitals - which hasn’t been implemented yet. We’ll also be adding more items and usages - such as those aforementioned upgrades. Celestial Capitalist in collaboration with @idi0cy"}, {"post_id": 14197, "ts": "2026-06-23T06:03:54Z", "hours": 15.8422, "text": "Celestial Capitalist: Scavenging WOW that took a while! Probably should have posted some breadcrumbs midway but whatever. The SCAVENGING FEATURE IS COMPLETE. This is basically loot box opening simulator + squid game dalgona cookies. This will be your main way to get items to sell (therefore earn money). The value of each item is based off that quality value we’ve been showing off, as well as the item’s base value and your minigame performance. Loot even scales as you gain more money (which I do in the video with a debug keybind), allowing you to go from looting trash cans to looting discarded packages and dropped briefcases. To spice up the loot, I’ve also added WAYYY too many items (yes, I did the textures myself). The hardest part of this whole thing was making a proper weighted loot system. That was a pain, because I could never quite fine tune the results to what I wanted - still really haven’t, but it works well enough. The other hardest part was me, as a relative beginner to programming, discovering that assigning a new variable to an array in fact synced both arrays. Godot what the hell is duplicate_deep() 😭 Celestial Capitalist in collaboration with @idi0cy"}, {"post_id": 11810, "ts": "2026-06-19T06:57:08Z", "hours": 3.935, "text": "Celestial Capitalist: Randomized Stranger Names Just made random names for all the strangers - which was a damn pain because @idi0cy , despite his all-knowing-ness, decided to name the index of the button icons with the stranger sprites ‘index’, then proceeded to reference those same values in a different function under the name ‘place’ whilst the argument ‘index’ in said function was something entirely different. This confused me for at least an hour. You will also notice that we have a new merry little cast of sprites, for those strangers. I tried to make them look as dystopian as possible. Think it worked. Would probably have gone for more distorted faces too if I had the time. As you can see below, I spent way too long getting a massive list of names - mostly from Orteil’s RandomGen, and then a few references to media I like. We’ll definitely be adding more."}, {"post_id": 11148, "ts": "2026-06-18T07:16:54Z", "hours": 2.7939, "text": "Celestial Capitalist: Inventory Revamp + Misc Fixes Revamped the inventory item inspector and made it prettier, as seen below Also did various other internal fixes with code and stuff such as renaming a button, adding lines to the fake injury game, and item flavour text edit: just noticed the screenshot is horrendous so i replaced it edit two: nvm apparently stardance just crops it 😭 wtf"}, {"post_id": 11063, "ts": "2026-06-18T03:06:53Z", "hours": 2.9181, "text": "Celestial Capitalist: Randomized Dialogue little mini update while i do more stuff This and 15 more stupid lines per each dialogue option"}, {"post_id": 8514, "ts": "2026-06-14T05:01:46Z", "hours": 2.7608, "text": "Celestial Capitalist: Daily Monetaries + Tooltips Added a general purpose tooltip scene for instancing with the _make_custom_tooltip() method. That was a pain to get right - I spent a good half hour trying to figure out why it wouldn’t work before realizing the root had to be a container node. Control nodes stink and I hate them. In practical terms, I’ve added a method to append daily costs and profits to the ledger interface. Nothing actually uses it yet, so the values in here are from a debug keybind I was using."}, {"post_id": 8010, "ts": "2026-06-13T11:16:41Z", "hours": 3.9717, "text": "Celestial Capitalist: The Ledger Bit of an annoyance to make, but it works :D This is where you can keep track of your transactions and balance, as well as a hub for future financial stats that have yet to be implemented. Did a bunch of tomfoolery with containers and control nodes and all that weird stuff trying to make the collapsible boxes work - ended up just changing minimum sizes myself instead of bothering with the FoldableContainers. Other stuff In terms of backend stuff I guess you’d call it, I made some changes to the project settings for window scaling + added some font settings so we can apply them everywhere easier, as well as a button template script that won’t actually do anything. That’s for the tooltips on the daily buttons in the legder - for later!"}, {"post_id": 7783, "ts": "2026-06-13T00:11:11Z", "hours": 3.9939, "text": "Celestial Capitalist Dynamic Background Background now changes based on night cycle. Damn this was a pain - mostly because the issue wasn’t even the programming it was the frickin math. I hate math. I hate math so much. Also godot what the hell do you mean ‘70 is out of bounds of 70’ i’m dying The following showcase vid has time passing so quickly because I added a keybind to add hours to the clock for debug purposes. Also my laptop’s a bit laggy lmao Still needs polish, but hey, it works."}, {"post_id": 6529, "ts": "2026-06-10T23:42:25Z", "hours": 1.6681, "text": "Celestial Capitalist: Sprite Refresh Just did a big ol’ redo of all the placeholder sprite art + redid inventory grid to have five columns instead of ten so those 32*32 textures don’t go to waste. Also, this definitely took longer than an hour and a half. Unfortunately, I can’t log Krita. Anyw check out @idi0cy , he’s doing the code for this and original concept."}]...
|
Title: Celestial Capitalist by @Ratseer | Stardanc Title: Celestial Capitalist by @Ratseer | Stardance
Devlogs:
Celestial Capitalist: Sprite Refresh Just did a big ol’ redo of all the placeholder sprite art + redid inventory grid to have five columns instead of ten so those 32*32 textures don’t go to waste. Also, this definitely took longer than an hour and a half. Unfortunately, I can’t log Krita. Anyw check out @idi0cy , he’s doing the code for this and original concept.
Celestial Capitalist Dynamic Background Background now changes based on night cycle. Damn this was a pain - mostly because the issue wasn’t even the programming it was the frickin math. I hate math. I hate math so much. Also godot what the hell do you mean ‘70 is out of bounds of 70’ i’m dying The following showcase vid has time passing so quickly because I added a keybind to add hours to the clock for debug purposes. Also my laptop’s a bit laggy lmao Still needs polish, but hey, it works.
Celestial Capitalist: The Ledger Bit of an annoyance to make, but it works :D This is where you can keep track of your transactions and balance, as well as a hub for future financial stats that have yet to be implemented. Did a bunch of tomfoolery with containers and control nodes and all that weird stuff trying to make the collapsible boxes work - ended up just changing minimum sizes myself instead of bothering with the FoldableContainers. Other stuff In terms of backend stuff I guess you’d call it, I made some changes to the project settings for window scaling + added some font settings so we can apply them everywhere easier, as well as a button template script that won’t actually do anything. That’s for the tooltips on the daily buttons in the legder - for later!
Celestial Capitalist: Daily Monetaries + Tooltips Added a general purpose tooltip scene for instancing with the _make_custom_tooltip() method. That was a pain to get right - I spent a good half hour trying to figure out why it wouldn’t work before realizing the root had to be a container node. Control nodes stink and I hate them. In practical terms, I’ve added a method to append daily costs and profits to the ledger interface. Nothing actually uses it yet, so the values in here are from a debug keybind I was using.
Celestial Capitalist: Randomized Dialogue little mini update while i do more stuff This and 15 more stupid lines per each dialogue option
Celestial Capitalist: Inventory Revamp + Misc Fixes Revamped the inventory item inspector and made it prettier, as seen below Also did various other internal fixes with code and stuff such as renaming a button, adding lines to the fake injury game, and item flavour text edit: just noticed the screenshot is horrendous so i replaced it edit two: nvm apparently stardance just crops it 😭 wtf
Celestial Capitalist: Randomized Stranger Names Just made random names for all the strangers - which was a damn pain because @idi0cy , despite his all-knowing-ness, decided to name the index of the button icons with the stranger sprites ‘index’, then proceeded to reference those same values in a different function under the name ‘place’ whilst the argument ‘index’ in said function was something entirely different. This confused me for at least an hour. You will also notice that we have a new merry little cast of sprites, for those strangers. I tried to make them look as dystopian as possible. Think it worked. Would probably have gone for more distorted faces too if I had the time. As you can see below, I spent way too long getting a massive list of names - mostly from Orteil’s RandomGen, and then a few references to media I like. We’ll definitely be adding more.
Celestial Capitalist: Scavenging WOW that took a while! Probably should have posted some breadcrumbs midway but whatever. The SCAVENGING FEATURE IS COMPLETE. This is basically loot box opening simulator + squid game dalgona cookies. This will be your main way to get items to sell (therefore earn money). The value of each item is based off that quality value we’ve been showing off, as well as the item’s base value and your minigame performance. Loot even scales as you gain more money (which I do in the video with a debug keybind), allowing you to go from looting trash cans to looting discarded packages and dropped briefcases. To spice up the loot, I’ve also added WAYYY too many items (yes, I did the textures myself). The hardest part of this whole thing was making a proper weighted loot system. That was a pain, because I could never quite fine tune the results to what I wanted - still really haven’t, but it works well enough. The other hardest part was me, as a relative beginner to programming, discovering that assigning a new variable to an array in fact synced both arrays. Godot what the hell is duplicate_deep() 😭 Celestial Capitalist in collaboration with @idi0cy
The Market I’ve added a shop system! At exactly 00:00 every day the Market tab refreshes with a new market stall, with randomly generated name, products, and an owner profile for the funnies. This system isn’t really for you to buy and flip prices in the get money tab - this is supposed to drag money out of you when you’re starving for food and also purchase upgrades for your run. Said upgrades have not yet been implemented, but - Using Items Items that can be used now pop up a use item button in the inventory. Monetary items now return money to your ledger and food items now add to your vitals - which hasn’t been implemented yet. We’ll also be adding more items and usages - such as those aforementioned upgrades. Celestial Capitalist in collaboration with @idi0cy
The Great Organization So while @idi0cy over there has been coding new stuff, I’ve been over here cleaning after his mess. I’m currently in the process of adding documentation comments to everything so we know what the hell anything is after we code it. Suffice to say, it’s not going that great but it’s coming along. This man literally wrote a variable called lengthOfTimeUnitThingHi_rAt_D_ontWeLovenamingConVentIons just to piss me off. Another part of the organization effort is adding these #region and #endregion comments everywhere so we can close and expand large sections of code. The Great Centralization I’ve also been working on centralizing certain things. I’ve added a new InventoryHelper class, which contains methods used for inventories such as the market stalls, loot boxes, the actual inventory, and the pick to sell menu. Attached below is the documentation comments for the Resources class containing pretty much every texture, dialogue line, name, and utility function and now a lot of the scripts extend it.
Vitals System Added a health, hydration, and satiation system. Satiation controls max health, and if your hydration hits 0, you begin taking damage over time. When you take damage or your health is low, your screen has a damage overlay. Celestial Capitalist in collaboration with @idi0cy .
Revamped Tutorial Gave the new tutorial put in place by @idi0cy some flair. It now also contains a text box for you to pick a save name, which will automatically show up in the ledger where the account name thing is. It may be the save name, but we’re not going to be implementing saves before shipping as we’re lazy and have things to do. The revamp has also made the game through anywhere from 1-103 data.tree is null errors but it ain’t crashing and I’m done solving that crap. Two Bowls of Chili We now have the two bowls of chili as per request by a friend of @idi0cy . New Item Mechanics I’ve changed the item system so that they can take on far more data than just an item type. They now have an additionalProperties , which is a Dictionary that is meant to take a string key and value. This allows us to store pretty much any data we want in there. This was done so that I could make items give temporary skill buffs with ease, as a lot of them are currently only good for selling. So now, you can use a pencil and gain a minute of +1 dexterity (which helps in the fake injury and stealth steal minigames), among other buffs. Miscellaneous fixes We are nearing release, and so we’ve begun to review a lot of stuff and make balancing/bugfixing changes. Deathscreen now returns you to title screen. Made perception affect scavenge quality and charisma affect market quality Added a bajillion tooltips to explain stuff Haggle difficulty has been made easier Fixed an issue in scavenge that made all the loot 0 quality Made event popups stack Made it so other windows can’t open if a scavenge game is happening Celestial Capitalist , dubiously developed by @Ratseer and @idi0cy .
Celestial Capitalist - Beta Complete! After four hours of horrifically annoying bugfixing with @idi0cy , CC is ship ready! We did a lot of misc fixes. There was some really stupid code we left in such as ‘check if x > y’ and consecutively in that one ‘check if x < y’. We’re geniuses. Anyway, we just added a sound slider that doesn’t work outside the editor 😭 . There were also a bunch of balancing issues to fix, such as me labelling a bottle of soy sauce as 45 dollars. But it’s done, oh lord it’s done. Check it out! https://ratseerofrattesse.itch.io/celestial-capitalist
Ships:
Celestial Capitalist is a simulation game where the player simultaneously builds and ascends the corporate ladder from the bottom of the street to the self-built throne at the top of the cosmos. Beg your way from homelessness, run a lemonade stand, scam grandmas on the internet, start a cult, play union-buster tower defence, and generally just have a grand stupid time while the world slowly bends to your will. Currently on FIRST BETA! Contains the slightly unpolished first stage, Rock Bottom, with basic progression, a bunch of minigames and… style!. You’re homeless and you needa earn money to get out of it. Also you can’t save yet. And the volume is broken. WE’LL FIX IT ONE DAY. Controls are all point and clicked + arrow keys for the Fake Injury minigame. Windows only for the moment - will support more soon. Unzip and run ccap1.0exe. By @idi0cy and RatseerOfRattesse Made for Hack Club Stardance. Tribulations Coding is notorious for producing the kind of mistakes one looks through for an entire night and solves in a second of effort. We had a lot of that. The amount of stupid crap on the way here is immense and we’ve still not cleared out all of it. But, @idi0cy and I hope you will enjoy what we’ve made, cuz we sure did enjoy making it. Celestial Capitalist by @idi0cy and @Ratseer ....
|
1792853679.015367
|
1792940079.015367
|
|
12084
|
fraktalized by @swedishsplidney | Stardance
|
swedishsplidney
|
1
|
70.0
|
1361
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-02T06:36:27Z", "hours": 70.0, "multiplier": 19.43, "payout": 1361, "blessing": "neutral", "text": "fraktalized ship: fraktalized is an an open-source, cross-platform, ultra smooth real time fractal explorer built using a hybrid architecture of Qt6 (QML/C++) and openGL (GLSL 330 core / 4.3 compute shaders). fraktalized currently has 10 fractal sets: mandelbrot set: the classic fractal set julia set: cool swirly stuff, complete with adjustable constant coords burning ship set: cool pointy stuff newton set: kinda spidery looking buddhabrot: like the mandelbrot but galaxy looking anti-buddhabrot: reverse buddhabrot barnsley fern: looks very naturey mandelbulb: like the mandelbrot but 3d menger sponge: cube, but with infinite* surface ar a icebox: spiky box! there is both a set of 3 precompiled binaries on the github and a demo video: https://youtu.be/x9lH_pPzvbw", "repo": "https://github.com/swedishsplidney/fraktalized", "demo": "https://github.com/swedishsplidney/fraktalized/releases"}]...
|
[{"post_id": 20591, "ts": "202 [{"post_id": 20591, "ts": "2026-07-02T06:34:20Z", "hours": 0.7767, "text": "extra ui tweaks and readme updates added some images of 3d fractals to the readme, did some general ui tweaks, and some idiot proofing now its time to ship!!!"}, {"post_id": 20559, "ts": "2026-07-02T05:22:07Z", "hours": 4.9961, "text": "probably the final commit :o most of this was spent idiot proofing, going through all my code and making sure that everything works well and actually makes sense i also updated the tutorial to be a bit better a major amount of time was spent figuring out how to get windows to actually compile i swear windows is the bane of my entire existence its not reflected in the devlog hours, but i did also make a demo video to show off some of the features mystery link other than that, it was mostly ui and readme updates :)"}, {"post_id": 19733, "ts": "2026-07-01T03:52:28Z", "hours": 9.76, "text": "i set up a full tutorial system the hard part was doing the whole thing where it darkens everywhere except the thing the tutorial is yapping about… also, right now, the tutorial is really really easy to break, so i might have to implement some idiot proofing or something to be honest, adding the whole darkening thing was really simple, but actually getting it to work was really annoying for some reason. it essentially just gets the xy coord for each corner of the specified element, and then makes a dark block everywhere except inside those 4 corners. also, i made it so the tutorial saves to the same json file as the preset manager, so that you only have to do the tutorial one time and it doesnt just get in your way every single time you open it. aside from that, most of this time was spent trying to figure out how to get it to automatically build on github when i push a release. i did this successfully for my other project, but the problem so far has been linking the qml for the binaries on the different platforms. specifically, windows just really really doesnt want to behave, its starting to feel like getting a discord mod to eat anything other than gamersupps and pizza rolls overall, maybe getting close to shipping? it honestly just depends on how much more features and idiot proofing i want to add if this sounds interesting, check out (and star ) the repo here"}, {"post_id": 14222, "ts": "2026-06-23T07:20:06Z", "hours": 8.5239, "text": "3d wasd controls (wowie zowie) the math for this was super hard, especially because i want it to work alongside with the other classic orbit style controls lol i ended up adding a toggle in the sidebar, which felt like the cleanest way to do it, but did mean doing more qml also, i pretty much had to guess when setting up all my vectors so i spent like 15 presidential terms messing around with positives and negatives and 1.0f / 0.0f everywhere until doing stuff in the right directions actually did the right thing, which was hard also had to implement auto horizon correction so things d also added some live 3d settings, which took a while, but now theres a live slider for both the mandelbulb power (exponent), and the brightness (which was hard) and, theres now a math section in the readme, which i spent a lot of time pondering while making, but if you’re at all, check out the “mathy information” section of the readme https://github.com/swedishsplidney/fraktalized (also star the repo ) exploring the mandelbulb in wasd mode genuinely feels like exploring an alien planet in a spaceship, lowk super fun"}, {"post_id": 11771, "ts": "2026-06-19T04:47:05Z", "hours": 8.7492, "text": "3d is finally working!!!!! i have been having an epic samurai battle against opengl and 3d fractal math for what feels like forever, but it finally works, and I have a working 3d mandelbulb explorer!!! i have actually been working on getting 3d working for the past multiple devlogs, it just took me sooo incredibly long to actually figure it out that i never really mentioned it. the longest step was figuring out the controls. when i first started working on the 3d mode, then it was literally just a cube, and i had to figure out a good way to be able to rotate it the hard part wasn’t even trying to figure out how to do the math to rotate the vertices, the hard part was trying to figure out how the thing should actually rotate what i figured out how to do is having an orbit style camera, where dragging side to side rotates the model along its own local yaw, and then dragging up and down changes the camera’s global pitch. this way the model’s roll never changes (because that makes the model look tilted or skewed). i had to spend an embarassingly long amount of time trying to figure the logic of an orbital camera… the camera is also slerped (like lerping but 3d) so it feels smooth color mappping on the 3d was actually surprisingly easy, i just did it in a very similar way to the 2d escape time ones, except with an extra dimension (its not as hard as it sounds) one other major change was when i added the ability to add and remove gradient stops. this way, instead of always having 4 gradient stops, you can have anywhere from 2 to 16 stops, for more customizeability. also, the readme is updated, go check it out! (and star the repo ) https://github.com/swedishsplidney/fraktalized below: video demonstrating the 3d and camera system"}, {"post_id": 10469, "ts": "2026-06-17T06:25:16Z", "hours": 7.9178, "text": "added iterative function system fractals basically, iterative function fractals are fractals that start at a set point, then repeatedly apply the same affine transformations (scaling, rotating, shifting), making an infinitely repeating, self-same fractal. as far as actually getting this setup and working, i had to make a whole new compute shader that involves a lot of math and for loops to iterate forever getting ifs fractals to render was a particular challenge, and i almost exploded my gpu and accidentally caused a vram cache overflow causing my display output to break. in the end, it turns out the trick was to not send 4,000,000 worker threads to the gpu all at once, and to do them 3-4 at a time also finally got working on the whole 3d system, which will likely take forever, and completely does not work right now, but hopefully i will have figured out how in the world to get working 3d stuff by the next devlog 🙏 check out the github! -> https://github.com/swedishsplidney/fraktalized image: barnsley fern, rendered in 4k"}, {"post_id": 9130, "ts": "2026-06-15T08:45:47Z", "hours": 6.9228, "text": "added support for trajectory based fractals most people know the normal fractals (the ones ive covered so far), such as the mandelbrot and julia sets, that test wether or not a point escapes and maps how long it takes to escape trajectory fractals look really cool, and the difference is that they map the trajectory that 𝑧 takes on its way out, while incrementing a counter for every pixel it steps on. getting this to work was a lot of work, and required to write a whole new shader file from scratch, except instead of a .frag/.vert combo, it was a compute shader (.glsl). instead of simply running a loop and writing color data to each independent pixel like with the escape-time fractals do, the trajectory shader has to pick a random (x, y) starting coord, and then track its orbit across the complex plane, writing data to random pixels as it goes. this required me to use atomics, because if 2 orbits cross, instead of one overwriting each other, you have to use imageAtomicAdd() to make sure that the brightness stacks up. one other issue was that at first it was super grainy, which was fixed by assigning each gpu thread 50 random sampled to increase detail substantially. i also nearly exploded my gpu because i accidentally had the render system run 50+ compute sequences at the same time, so i now have each compute wait for the one before it to finish in other happenings, there is now a preset feature that writes your current color setup set, zoom, center, etc. to a JSON file to be loaded later also added the newton set, but its a less interesting escape-time fractal, so not covered in as much detail image: buddhabrot set, rendered at 4k"}, {"post_id": 7949, "ts": "2026-06-13T08:09:58Z", "hours": 5.9558, "text": "added the burning ship fractal, anti aliasing, and completely overhauled the color system to use a gradient input instead of one color. burning ship fractal: so the burning ship fractal is made when you take the mandelbrot equation, but you take the absolute value of the real and imaginary parts before squaring, basically destroying the symmetry: 𝑧ₙ₊₁ = (|𝑅𝑒(𝑍ₙ)| + 𝑖|𝐼𝑚(𝑍ₙ)|)² + 𝐶 this makes it look super duper cool (as seen in the image below) gradient-based color mapping so before, the color was just calculated using one color tint and boosting brightness quadratically near the edges. now, it takes in a gradient (calculated between 4 color inputs), and does the same color mapping but essentially moves what color it uses as the iterations increase. the hard part is figuring out how to get a good input system in qml with this, but I was able to do it using some colordialogues and a lot of trial and error. the new color input system is kinda like creating a gradient in photoshop or illustrator, with 4 little handles that you can drag across and change their colors. anti aliasing also added anti aliasing, or more specifically, ssaa (super sampling anti aliasing), with a selector to choose between off, 2x, and 3x so basically it renders the entire fractal at a higher resolution (2x or 3x) and then averages the color of every pixel block (2x2 or 3x3 respectively) and then displays that. this results in a much, much smoother image at the cost of much higher resource usage. while i was screwing around with dynamic resolutions, i also added a resolution slider to change the rendered resolution to anywhere from 25 to 150% of the window resolution. turning it up past 100% basically just gives the ssaa architecture more information to work with, making it even smoother my graphics card isnt very powerful and it basically stays pinned at 99% usage and 100% clock when i have anti aliasing turned on and the iterations above like 200. image: burning ship fractal, rendered at 4k with 150% resolution scale and 3x ssaa"}, {"post_id": 6713, "ts": "2026-06-11T07:42:55Z", "hours": 4.1331, "text": "now has a render to file feature basically you just import a custom resolution and it takes your current center and renders at that resolution with your current parameters. the hard part is that it uses a completely different framebuffer object from the regular viewport. while testing i did almost explode my gpu when pushing the resolution to almost 32k, which is kinda unreasonable, but this was a good opportunity to add a tiled render system basically it just splits up the image into 2000x2000 pixel sections and renders them, and then it does some math to position it the weird thing is that opengl is kinda goofy and likes to mirror stuff for some reason (literally no idea why) so theres some math to render it in reverse (which means that its actually correct) also increased the rendering to 64 bit, meaning it is now 536,870,912 times more accurate compared to the 32 bit one, and also means you can zoom in more than twice as far with better quality, but it is much more gpu intensive… this image is one of the cooler ones i rendered out at 4k, it kinda looks like colliding galaxies or something"}, {"post_id": 6139, "ts": "2026-06-10T10:13:47Z", "hours": 6.7264, "text": "is now fully interactive and honestly feels super great, especially compared to my last devlog where it was static and unchanging entirely added working real-time render parameters such as panning and zooming with mouse, and custom iteration setup and color setup on the sidebar. lots and lots and lots of quality of life features, such as: the reset button for if you get lost adjustable iteration slider min/max direct text enter for iterations hideable iteration min/max menu camera smoothing color clamping so it doesnt look deep fried also added the julia set (which is what is in the image) so basically, both the mandelbrot and julia sets are the same quadratic recurrence relation on the complex plane: 𝑧ₙ₊₁ = (𝑧ₙ)² + 𝑐 the main difference is that you start at the origin (𝑧₀ = 0) and change the constant 𝑐 for every single pixel on the screen based on its coordinates, but with the julia set the constant 𝑐 is the same everywhere, and the starting point 𝑧₀ changes based on the pixel’s coordinate, so you are testing how different starting points react to the same gravitational pull of 𝑐. the nice thing is that you can change the constant 𝑐 in the julia set, and completely change how the fractal looks, so i added that as an input field too looks really really cool lowk"}, {"post_id": 4855, "ts": "2026-06-08T12:00:00Z", "hours": 5.5808, "text": "working mandelbrot fractal rendering through opengl!!!!! using qt/qml and raw opengl shaders together was a mistake they really dont like working together and i had to spend 3 straight hours (its 5:42am at the time of this devlog) debugging an eternal tug of war between qt and opengl because qt kept overwriting what i wanted to happen the worst part is that an opengl fragment shader cant really debug to the log so if something is on fire over there i just kinda have to guess to fix it eventually i just gave up and switched to framebuffer objects, which i lowk should have done from the start the funnest part was actually writing the equations for the mandelbrot set lol (it also looks super pretty): so basically the Mandelbrot set is the set of all complex parameters 𝑐 ∈ ℂ for which the orbit of 𝑧₀ = 0 under quadratic recurrence remains bounded. in the shader, i just separate its multiplication into real and imaginary components: Re(𝑧ₙ₊₁) = 𝑥² + 𝑦² + Re(𝑐) Im(𝑧ₙ₊₁) = 2𝑥𝑦 + Im(𝑐) also infinity is impossible so the iterations are capped at 100 sorry if this was too nerdy or long lmao"}]...
|
Title: fraktalized by @swedishsplidney | Stardance Title: fraktalized by @swedishsplidney | Stardance
Devlogs:
working mandelbrot fractal rendering through opengl!!!!! using qt/qml and raw opengl shaders together was a mistake they really dont like working together and i had to spend 3 straight hours (its 5:42am at the time of this devlog) debugging an eternal tug of war between qt and opengl because qt kept overwriting what i wanted to happen the worst part is that an opengl fragment shader cant really debug to the log so if something is on fire over there i just kinda have to guess to fix it eventually i just gave up and switched to framebuffer objects, which i lowk should have done from the start the funnest part was actually writing the equations for the mandelbrot set lol (it also looks super pretty): so basically the Mandelbrot set is the set of all complex parameters 𝑐 ∈ ℂ for which the orbit of 𝑧₀ = 0 under quadratic recurrence remains bounded. in the shader, i just separate its multiplication into real and imaginary components: Re(𝑧ₙ₊₁) = 𝑥² + 𝑦² + Re(𝑐) Im(𝑧ₙ₊₁) = 2𝑥𝑦 + Im(𝑐) also infinity is impossible so the iterations are capped at 100 sorry if this was too nerdy or long lmao
is now fully interactive and honestly feels super great, especially compared to my last devlog where it was static and unchanging entirely added working real-time render parameters such as panning and zooming with mouse, and custom iteration setup and color setup on the sidebar. lots and lots and lots of quality of life features, such as: the reset button for if you get lost adjustable iteration slider min/max direct text enter for iterations hideable iteration min/max menu camera smoothing color clamping so it doesnt look deep fried also added the julia set (which is what is in the image) so basically, both the mandelbrot and julia sets are the same quadratic recurrence relation on the complex plane: 𝑧ₙ₊₁ = (𝑧ₙ)² + 𝑐 the main difference is that you start at the origin (𝑧₀ = 0) and change the constant 𝑐 for every single pixel on the screen based on its coordinates, but with the julia set the constant 𝑐 is the same everywhere, and the starting point 𝑧₀ changes based on the pixel’s coordinate, so you are testing how different starting points react to the same gravitational pull of 𝑐. the nice thing is that you can change the constant 𝑐 in the julia set, and completely change how the fractal looks, so i added that as an input field too looks really really cool lowk
now has a render to file feature basically you just import a custom resolution and it takes your current center and renders at that resolution with your current parameters. the hard part is that it uses a completely different framebuffer object from the regular viewport. while testing i did almost explode my gpu when pushing the resolution to almost 32k, which is kinda unreasonable, but this was a good opportunity to add a tiled render system basically it just splits up the image into 2000x2000 pixel sections and renders them, and then it does some math to position it the weird thing is that opengl is kinda goofy and likes to mirror stuff for some reason (literally no idea why) so theres some math to render it in reverse (which means that its actually correct) also increased the rendering to 64 bit, meaning it is now 536,870,912 times more accurate compared to the 32 bit one, and also means you can zoom in more than twice as far with better quality, but it is much more gpu intensive… this image is one of the cooler ones i rendered out at 4k, it kinda looks like colliding galaxies or something
added the burning ship fractal, anti aliasing, and completely overhauled the color system to use a gradient input instead of one color. burning ship fractal: so the burning ship fractal is made when you take the mandelbrot equation, but you take the absolute value of the real and imaginary parts before squaring, basically destroying the symmetry: 𝑧ₙ₊₁ = (|𝑅𝑒(𝑍ₙ)| + 𝑖|𝐼𝑚(𝑍ₙ)|)² + 𝐶 this makes it look super duper cool (as seen in the image below) gradient-based color mapping so before, the color was just calculated using one color tint and boosting brightness quadratically near the edges. now, it takes in a gradient (calculated between 4 color inputs), and does the same color mapping but essentially moves what color it uses as the iterations increase. the hard part is figuring out how to get a good input system in qml with this, but I was able to do it using some colordialogues and a lot of trial and error. the new color input system is kinda like creating a gradient in photoshop or illustrator, with 4 little handles that you can drag across and change their colors. anti aliasing also added anti aliasing, or more specifically, ssaa (super sampling anti aliasing), with a selector to choose between off, 2x, and 3x so basically it renders the entire fractal at a higher resolution (2x or 3x) and then averages the color of every pixel block (2x2 or 3x3 respectively) and then displays that. this results in a much, much smoother image at the cost of much higher resource usage. while i was screwing around with dynamic resolutions, i also added a resolution slider to change the rendered resolution to anywhere from 25 to 150% of the window resolution. turning it up past 100% basically just gives the ssaa architecture more information to work with, making it even smoother my graphics card isnt very powerful and it basically stays pinned at 99% usage and 100% clock when i have anti aliasing turned on and the iterations above like 200. image: burning ship fractal, rendered at 4k with 150% resolution scale and 3x ssaa
added support for trajectory based fractals most people know the normal fractals (the ones ive covered so far), such as the mandelbrot and julia sets, that test wether or not a point escapes and maps how long it takes to escape trajectory fractals look really cool, and the difference is that they map the trajectory that 𝑧 takes on its way out, while incrementing a counter for every pixel it steps on. getting this to work was a lot of work, and required to write a whole new shader file from scratch, except instead of a .frag/.vert combo, it was a compute shader (.glsl). instead of simply running a loop and writing color data to each independent pixel like with the escape-time fractals do, the trajectory shader has to pick a random (x, y) starting coord, and then track its orbit across the complex plane, writing data to random pixels as it goes. this required me to use atomics, because if 2 orbits cross, instead of one overwriting each other, you have to use imageAtomicAdd() to make sure that the brightness stacks up. one other issue was that at first it was super grainy, which was fixed by assigning each gpu thread 50 random sampled to increase detail substantially. i also nearly exploded my gpu because i accidentally had the render system run 50+ compute sequences at the same time, so i now have each compute wait for the one before it to finish in other happenings, there is now a preset feature that writes your current color setup set, zoom, center, etc. to a JSON file to be loaded later also added the newton set, but its a less interesting escape-time fractal, so not covered in as much detail image: buddhabrot set, rendered at 4k
added iterative function system fractals basically, iterative function fractals are fractals that start at a set point, then repeatedly apply the same affine transformations (scaling, rotating, shifting), making an infinitely repeating, self-same fractal. as far as actually getting this setup and working, i had to make a whole new compute shader that involves a lot of math and for loops to iterate forever getting ifs fractals to render was a particular challenge, and i almost exploded my gpu and accidentally caused a vram cache overflow causing my display output to break. in the end, it turns out the trick was to not send 4,000,000 worker threads to the gpu all at once, and to do them 3-4 at a time also finally got working on the whole 3d system, which will likely take forever, and completely does not work right now, but hopefully i will have figured out how in the world to get working 3d stuff by the next devlog 🙏 check out the github! -> https://github.com/swedishsplidney/fraktalized image: barnsley fern, rendered in 4k
3d is finally working!!!!! i have been having an epic samurai battle against opengl and 3d fractal math for what feels like forever, but it finally works, and I have a working 3d mandelbulb explorer!!! i have actually been working on getting 3d working for the past multiple devlogs, it just took me sooo incredibly long to actually figure it out that i never really mentioned it. the longest step was figuring out the controls. when i first started working on the 3d mode, then it was literally just a cube, and i had to figure out a good way to be able to rotate it the hard part wasn’t even trying to figure out how to do the math to rotate the vertices, the hard part was trying to figure out how the thing should actually rotate what i figured out how to do is having an orbit style camera, where dragging side to side rotates the model along its own local yaw, and then dragging up and down changes the camera’s global pitch. this way the model’s roll never changes (because that makes the model look tilted or skewed). i had to spend an embarassingly long amount of time trying to figure the logic of an orbital camera… the camera is also slerped (like lerping but 3d) so it feels smooth color mappping on the 3d was actually surprisingly easy, i just did it in a very similar way to the 2d escape time ones, except with an extra dimension (its not as hard as it sounds) one other major change was when i added the ability to add and remove gradient stops. this way, instead of always having 4 gradient stops, you can have anywhere from 2 to 16 stops, for more customizeability. also, the readme is updated, go check it out! (and star the repo ) https://github.com/swedishsplidney/fraktalized below: video demonstrating the 3d and camera system
3d wasd controls (wowie zowie) the math for this was super hard, especially because i want it to work alongside with the other classic orbit style controls lol i ended up adding a toggle in the sidebar, which felt like the cleanest way to do it, but did mean doing more qml also, i pretty much had to guess when setting up all my vectors so i spent like 15 presidential terms messing around with positives and negatives and 1.0f / 0.0f everywhere until doing stuff in the right directions actually did the right thing, which was hard also had to implement auto horizon correction so things d also added some live 3d settings, which took a while, but now theres a live slider for both the mandelbulb power (exponent), and the brightness (which was hard) and, theres now a math section in the readme, which i spent a lot of time pondering while making, but if you’re at all, check out the “mathy information” section of the readme https://github.com/swedishsplidney/fraktalized (also star the repo ) exploring the mandelbulb in wasd mode genuinely feels like exploring an alien planet in a spaceship, lowk super fun
i set up a full tutorial system the hard part was doing the whole thing where it darkens everywhere except the thing the tutorial is yapping about… also, right now, the tutorial is really really easy to break, so i might have to implement some idiot proofing or something to be honest, adding the whole darkening thing was really simple, but actually getting it to work was really annoying for some reason. it essentially just gets the xy coord for each corner of the specified element, and then makes a dark block everywhere except inside those 4 corners. also, i made it so the tutorial saves to the same json file as the preset manager, so that you only have to do the tutorial one time and it doesnt just get in your way every single time you open it. aside from that, most of this time was spent trying to figure out how to get it to automatically build on github when i push a release. i did this successfully for my other project, but the problem so far has been linking the qml for the binaries on the different platforms. specifically, windows just really really doesnt want to behave, its starting to feel like getting a discord mod to eat anything other than gamersupps and pizza rolls overall, maybe getting close to shipping? it honestly just depends on how much more features and idiot proofing i want to add if this sounds interesting, check out (and star ) the repo here
probably the final commit :o most of this was spent idiot proofing, going through all my code and making sure that everything works well and actually makes sense i also updated the tutorial to be a bit better a major amount of time was spent figuring out how to get windows to actually compile i swear windows is the bane of my entire existence its not reflected in the devlog hours, but i did also make a demo video to show off some of the features mystery link other than that, it was mostly ui and readme updates :)
extra ui tweaks and readme updates added some images of 3d fractals to the readme, did some general ui tweaks, and some idiot proofing now its time to ship!!!
Ships:
fraktalized ship: fraktalized is an an open-source, cross-platform, ultra smooth real time fractal explorer built using a hybrid architecture of Qt6 (QML/C++) and openGL (GLSL 330 core / 4.3 compute shaders). fraktalized currently has 10 fractal sets: mandelbrot set: the classic fractal set julia set: cool swirly stuff, complete with adjustable constant coords burning ship set: cool pointy stuff newton set: kinda spidery looking buddhabrot: like the mandelbrot but galaxy looking anti-buddhabrot: reverse buddhabrot barnsley fern: looks very naturey mandelbulb: like the mandelbrot but 3d menger sponge: cube, but with infinite* surface ar a icebox: spiky box! there is both a set of 3 precompiled binaries on the github and a demo video: https://youtu.be/x9lH_pPzvbw...
|
1792817596.708637
|
1792903996.708637
|
|
42278
|
Monado Phone Driver by @ttomf | Stardance
|
ttomf
|
3
|
76.94
|
1364
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-16T16:44:11Z", "hours": 22.0, "multiplier": 19.73, "payout": 430, "blessing": "neutral", "text": "I made Monado Phone Driver - a bridge between VR app and phone in cardboard headset. This allows you to play VR games just with Linux PC and Android phone, without buying expensive VR headset. There are alternatives, like ALVR and WiVRn , but my driver has 6DOF tracking (you can move and rotate in space) and hand tracking (it takes hand landmarks from PC or phone camera). Since last ship, I improved stability, added Android app settings, created auto installer, and mainly tracking from PC camera, because phone has small FOV and limited performance.", "repo": "https://github.com/ttomf/monado-phone", "demo": "https://github.com/ttomf/monado-phone/releases/"}, {"ship_num": 2, "ts": "2026-09-04T08:04:23Z", "hours": 32.0, "multiplier": 19.12, "payout": 609, "blessing": "neutral", "text": "Hi! This is my second ship of this project, Monado Phone Driver. It’s bridge between your VR app and your phone in headset ( Google Cardboard ). I wanted to make it better than ALVR , because it has only 3DOF tracking, so I created 6DOF tracking and hand tracking, like professional headsets. The most challenging part of this was debugging all of these. From Vulkan swapchain management and GStreamer pipeline to hand and 6DOF tracking. I am proud of it, because this will help people without VR headsets to enjoy VR games. NOTE: Hand tracking is done the best possible way, but I think it still doesn’t compete with real VR headsets. Next ship should add better tracking with PC camera.", "repo": "https://github.com/ttomf/monado-phone", "demo": "https://github.com/ttomf/monado-phone/releases/"}, {"ship_num": 3, "ts": "2026-08-05T13:16:21Z", "hours": 19.0, "multiplier": 17.05, "payout": 325, "blessing": "neutral", "text": "Hi! I ship my Monado Phone Driver ! I worked on it for last week and it was really challenging. My vision was to build something with what you can play VR games on phone (with Google Cardboard), like iVRy, but open-source and simple. I worked on streaming pipeline, UDP discovery, pose tracking and gluing it all together with Monado. I hope this will help people that wanted to play VR games without expensive headset.", "repo": "https://github.com/ttomf/monado-phone", "demo": "https://github.com/ttomf/monado-phone/releases/"}]...
|
[{"post_id": 73208, "ts": "202 [{"post_id": 73208, "ts": "2026-09-24T16:33:26Z", "hours": 3.9361, "text": "Hi! So I’m here again after many exams (I didn’t have time and strength to iteratively test this ) and I’m gonna make this better using better Hand Landmarkers and (hopefully) run on Window$."}, {"post_id": 69212, "ts": "2026-09-16T16:31:16Z", "hours": 1.6044, "text": "I think it’s time to new release! I merged upstream, created tag, built app and driver and published on GitHub."}, {"post_id": 68141, "ts": "2026-09-14T16:07:57Z", "hours": 3.4667, "text": "I am working on implementing hand controller using same data as hand tracking does. It also includes the “aim pose” - where does controller point. On video, it’s shown as red line, I take it from the index finger. I hope I will be able to play some better VR games!"}, {"post_id": 66631, "ts": "2026-09-12T14:11:34Z", "hours": 5.8714, "text": "I’ve fixed some bugs and leaks, added more configuration to Android app and created hand tracking vizualization for the PC script. Also, I am working on integrating hands as controllers (because controllers have better support across games)."}, {"post_id": 63611, "ts": "2026-09-07T15:18:52Z", "hours": 3.8808, "text": "YEAH! I have finally done the PC camera hand tracking! It has much better FOV than phone camera and more computing power. It’s just Python script with MediaPipe, sending the data to 127.0.0.1 to hand port, and it has same format, so the driver doesn’t even know the data is sending someone other than phone. You will ofc need to disable phone hand tracking, otherwise they will collide. As you see in the video, I can move the hands far and they still get tracked. (End of the video is when I took off the headset - it was also tracked :D)"}, {"post_id": 62773, "ts": "2026-09-06T09:09:55Z", "hours": 1.3114, "text": "Now I am making just minor changes to the driver as the base is nearly done. I added screen size synchronization with phone, so the driver now can send right stream. Also I am making small bugfixes and improvements."}, {"post_id": 62286, "ts": "2026-09-05T16:11:29Z", "hours": 1.7353, "text": "I added settings on phone, so now you can really configure the ports on both sides! Also there’s option to disable hand tracking or 6DOF (then it will send only rotation of headset)"}, {"post_id": 62060, "ts": "2026-09-05T09:18:28Z", "hours": 3.9211, "text": "I created simple terminal installer in python that downloads and setups Monado Phone Driver. Thanks also for the positive reviews and the 19.12x stardust multiplier — when I started this project, I didn’t think I’d ever finish it :D"}, {"post_id": 61371, "ts": "2026-09-04T07:52:18Z", "hours": 0.4617, "text": "Last devlog before ship! I just merged upstream monado, built release binaries and created GitHub release."}, {"post_id": 61334, "ts": "2026-09-04T06:19:09Z", "hours": 2.1025, "text": "So I finished the hand tracking! I tried to make it as good as possible on a phone, and it looks like it might actually work! Even though I’m limited by the hardware, you can see in the video that it tracks pretty well. (video from openxr-simple-playground )"}, {"post_id": 60746, "ts": "2026-09-03T09:54:46Z", "hours": 5.6369, "text": "I am enhancing hand tracking now, and it’s starting to look good! Here is how: I use MediaPipe by Google to analyze image from front camera. MediaPipe Hand Landmarker returns hand landmarks in camera-relative format in two dimensions, so I need to make depth (z-coordinate). I measure distance between wrist and fingers, in 2D space this means distance from camera (the farther away they are, the smaller they get). Now, they are 3D, but still relative to camera. Then I simply send both hands as UDP packet for the driver. The driver (PC side) computes real-world coordinates of the hands using saved earlier sent from ARCore and pushes them into Monado."}, {"post_id": 59610, "ts": "2026-09-01T15:01:51Z", "hours": 6.9739, "text": "I worked hard on both the Android app and the Monado driver and finally: I have working hand tracking! It is very laggy, needs many optimizations, and isn’t even in alpha state yet, but I can see that it is possible to do it. This was my dream when I began this project, and finally, it has come true. I hope it will help many people who cannot afford a professional headset :D"}, {"post_id": 58719, "ts": "2026-08-31T08:20:00Z", "hours": 2.2467, "text": "So today I finished image settings (you can configure them in the config file). They control how the image is rendered, because every headset has different lenses, distance between lenses, distance from screen to lenses etc. To find your headset’s properties, go to https://wwgc.firebaseapp.com/ ."}, {"post_id": 58171, "ts": "2026-08-30T15:09:22Z", "hours": 3.5397, "text": "I created new TCP socket logic for configuration sharing and added logic for loading configuration file. Now I am trying to change the x265enc software encoding to something faster on GPU. Unfortunately, nvenc (nvidia encoding) is really hard to configure properly, as you can see for yourselves."}, {"post_id": 57515, "ts": "2026-08-29T17:59:31Z", "hours": 9.2639, "text": "Phew, I almost went over the time limit (10 hours) :D I tried to get it running on Windows, and I partially succeeded, but it’s still not stable. Aside from that, I mostly cleaned up the code, improved usability, and removed unnecessary modules from CMake. Now I’m working on an improved distortion using Monado’s u_distortion_cardboard_calculate (cardboard stands for Google Cardboard btw) And one more thing: thanks to everyone for the positive feedback on the project — I really didn’t expect that!"}, {"post_id": 46899, "ts": "2026-08-14T13:22:12Z", "hours": 1.6314, "text": "Since nobody reviewed my submission, I don’t want to add more features, so I only updated the README and made small changes to the app. If anyone wants to play VR games on their phone, they can just download the files from Releases and run them without hard compiling!"}, {"post_id": 41279, "ts": "2026-08-05T12:09:23Z", "hours": 6.8658, "text": "Devlog 4 : I replaced boilerplate LLM code with my own. I also wrote README with instructions, so you can now try it!"}, {"post_id": 40628, "ts": "2026-08-04T09:25:23Z", "hours": 0.6022, "text": "I am making minor adjustments to run with SteamVR. I use opencomposite as layer between OpenXR and OpenVR/SteamVR. Video is phone screencap from free Steam game “Aircar”."}, {"post_id": 39990, "ts": "2026-08-03T10:37:11Z", "hours": 3.0761, "text": "Devlog 3 : I made 6DOF (6 degrees of freedom = position+rotation in space) tracking with ARCore. It’s a bit laggy, but it works. This is just test, I plan to optimize it later. Video is from xrgears with looking around."}, {"post_id": 39422, "ts": "2026-08-02T11:32:08Z", "hours": 1.5058, "text": "Devlog 2 : Finally I made working streaming pipeline! My driver takes image from Monado, gstreamer encodes it and sends via UDP. On phone, there is AMediaCodec that takes the packets, joins them and renders. Used codec is HEVC (H265). Video is from xrgears demo."}, {"post_id": 38950, "ts": "2026-08-01T15:47:39Z", "hours": 4.6072, "text": "So now I’m basically stuck. Three hours of debugging the streaming pipeline, refractoring with Opencode and trying to make it work. As you see, even Deepseek is struggling with it… Wish me luck 🤞"}, {"post_id": 38092, "ts": "2026-07-31T09:43:03Z", "hours": 2.3839, "text": "Hi! So I have started this project because I want to play VR games, but I don’t have any headset, only Google Cardboard. I know there is ALVR and iVRy, but: ALVR doesn’t have support for hand tracking and 6DOF iVRy is closed-source and wants to pay Sorry, but I don’t plan to add Windows support soon. Devlog 1 : I forked Monado and made some bureaucracy (like adding my driver to CMakeLists.txt etc.) I made simple Android app that pairs over UDP multicast with my driver. The image is from editor, because I don’t have anything interesting to post (except maybe positive logs 😁)"}]...
|
Title: Monado Phone Driver by @ttomf | Stardance
Title: Monado Phone Driver by @ttomf | Stardance
Devlogs:
Hi! So I have started this project because I want to play VR games, but I don’t have any headset, only Google Cardboard. I know there is ALVR and iVRy, but: ALVR doesn’t have support for hand tracking and 6DOF iVRy is closed-source and wants to pay Sorry, but I don’t plan to add Windows support soon. Devlog 1 : I forked Monado and made some bureaucracy (like adding my driver to CMakeLists.txt etc.) I made simple Android app that pairs over UDP multicast with my driver. The image is from editor, because I don’t have anything interesting to post (except maybe positive logs 😁)
So now I’m basically stuck. Three hours of debugging the streaming pipeline, refractoring with Opencode and trying to make it work. As you see, even Deepseek is struggling with it… Wish me luck 🤞
Devlog 2 : Finally I made working streaming pipeline! My driver takes image from Monado, gstreamer encodes it and sends via UDP. On phone, there is AMediaCodec that takes the packets, joins them and renders. Used codec is HEVC (H265). Video is from xrgears demo.
Devlog 3 : I made 6DOF (6 degrees of freedom = position+rotation in space) tracking with ARCore. It’s a bit laggy, but it works. This is just test, I plan to optimize it later. Video is from xrgears with looking around.
I am making minor adjustments to run with SteamVR. I use opencomposite as layer between OpenXR and OpenVR/SteamVR. Video is phone screencap from free Steam game “Aircar”.
Devlog 4 : I replaced boilerplate LLM code with my own. I also wrote README with instructions, so you can now try it!
Since nobody reviewed my submission, I don’t want to add more features, so I only updated the README and made small changes to the app. If anyone wants to play VR games on their phone, they can just download the files from Releases and run them without hard compiling!
Phew, I almost went over the time limit (10 hours) :D I tried to get it running on Windows, and I partially succeeded, but it’s still not stable. Aside from that, I mostly cleaned up the code, improved usability, and removed unnecessary modules from CMake. Now I’m working on an improved distortion using Monado’s u_distortion_cardboard_calculate (cardboard stands for Google Cardboard btw) And one more thing: thanks to everyone for the positive feedback on the project — I really didn’t expect that!
I created new TCP socket logic for configuration sharing and added logic for loading configuration file. Now I am trying to change the x265enc software encoding to something faster on GPU. Unfortunately, nvenc (nvidia encoding) is really hard to configure properly, as you can see for yourselves.
So today I finished image settings (you can configure them in the config file). They control how the image is rendered, because every headset has different lenses, distance between lenses, distance from screen to lenses etc. To find your headset’s properties, go to https://wwgc.firebaseapp.com/ .
I worked hard on both the Android app and the Monado driver and finally: I have working hand tracking! It is very laggy, needs many optimizations, and isn’t even in alpha state yet, but I can see that it is possible to do it. This was my dream when I began this project, and finally, it has come true. I hope it will help many people who cannot afford a professional headset :D
I am enhancing hand tracking now, and it’s starting to look good! Here is how: I use MediaPipe by Google to analyze image from front camera. MediaPipe Hand Landmarker returns hand landmarks in camera-relative format in two dimensions, so I need to make depth (z-coordinate). I measure distance between wrist and fingers, in 2D space this means distance from camera (the farther away they are, the smaller they get). Now, they are 3D, but still relative to camera. Then I simply send both hands as UDP packet for the driver. The driver (PC side) computes real-world coordinates of the hands using saved earlier sent from ARCore and pushes them into Monado.
So I finished the hand tracking! I tried to make it as good as possible on a phone, and it looks like it might actually work! Even though I’m limited by the hardware, you can see in the video that it tracks pretty well. (video from openxr-simple-playground )
Last devlog before ship! I just merged upstream monado, built release binaries and created GitHub release.
I created simple terminal installer in python that downloads and setups Monado Phone Driver. Thanks also for the positive reviews and the 19.12x stardust multiplier — when I started this project, I didn’t think I’d ever finish it :D
I added settings on phone, so now you can really configure the ports on both sides! Also there’s option to disable hand tracking or 6DOF (then it will send only rotation of headset)
Now I am making just minor changes to the driver as the base is nearly done. I added screen size synchronization with phone, so the driver now can send right stream. Also I am making small bugfixes and improvements.
YEAH! I have finally done the PC camera hand tracking! It has much better FOV than phone camera and more computing power. It’s just Python script with MediaPipe, sending the data to 127.0.0.1 to hand port, and it has same format, so the driver doesn’t even know the data is sending someone other than phone. You will ofc need to disable phone hand tracking, otherwise they will collide. As you see in the video, I can move the hands far and they still get tracked. (End of the video is when I took off the headset - it was also tracked :D)
I’ve fixed some bugs and leaks, added more configuration to Android app and created hand tracking vizualization for the PC script. Also, I am working on integrating hands as controllers (because controllers have better support across games).
I am working on implementing hand controller using same data as hand tracking does. It also includes the “aim pose” - where does controller point. On video, it’s shown as red line, I take it from the index finger. I hope I will be able to play some better VR games!
I think it’s time to new release! I merged upstream, created tag, built app and driver and published on GitHub.
Hi! So I’m here again after many exams (I didn’t have time and strength to iteratively test this ) and I’m gonna make this better using better Hand Landmarkers and (hopefully) run on Window$.
Ships:
Hi! I ship my Monado Phone Driver ! I worked on it for last week and it was really challenging. My vision was to build something with what you can play VR games on phone (with Google Cardboard), like iVRy, but open-source and simple. I worked on streaming pipeline, UDP discovery, pose tracking and gluing it all together with Monado. I hope this will help people that wanted to play VR games without expensive headset.
Hi! This is my second ship of this project, Monado Phone Driver. It’s bridge between your VR app and your phone in headset ( Google Cardboard ). I wanted to make it better than ALVR , because it has only 3DOF tracking, so I created 6DOF tracking and hand tracking, like professional headsets. The most challenging part of this was debugging all of these. From Vulkan swapchain management and GStreamer pipeline to hand and 6DOF tracking. I am proud of it, because this will help people without VR headsets to enjoy VR games. NOTE: Hand tracking is done the best possible way, but I think it still doesn’t compete with real VR headsets. Next ship should add better tracking with PC camera.
I made Monado Phone Driver - a bridge between VR app and phone in cardboard headset. This allows you to play VR games just with Linux PC and Android phone, without buying expensive VR headset. There are alternatives, like ALVR and WiVRn , but my driver has 6DOF tracking (you can move and rotate in space) and hand tracking (it takes hand landmarks from PC or phone camera). Since last ship, I improved stability, added Android app settings, created auto installer, and mainly tracking from PC camera, because phone has small FOV and limited performance....
|
1792835685.3610904
|
1792922085.3610904
|