|
44007
|
Racing Car by @CGS | Stardance
|
CGS
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Racing Car by @CGS | Stardance
|
1793990839.4604714
|
1794595639.4604714
|
|
44006
|
Temperature by @Lukas28 | Stardance
|
Lukas28
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Temperature by @Lukas28 | Stardance
|
1793990838.567045
|
1794595638.567045
|
|
44003
|
Led matrix and ambient light by @OBalint | Stardan Led matrix and ambient light by @OBalint | Stardance...
|
OBalint
|
0
|
2.77
|
0
|
[]
|
[{"post_id": 42579, "ts": "202 [{"post_id": 42579, "ts": "2026-08-07T12:22:08Z", "hours": 1.2417, "text": "Finished it. Sadly I couldn’t really document it but I’ve finally finished it."}, {"post_id": 41288, "ts": "2026-08-05T12:40:48Z", "hours": 1.5239, "text": "Working on the level shifter pcb for the digital output I devlog#1"}]...
|
Title: Led matrix and ambient light by @OBalint | Title: Led matrix and ambient light by @OBalint | Stardance
Devlogs:
Working on the level shifter pcb for the digital output I devlog#1
Finished it. Sadly I couldn’t really document it but I’ve finally finished it....
|
1793990837.0194988
|
1794595637.0194988
|
|
44002
|
BridgeWatch by @aum | Stardance
|
aum
|
0
|
5.79
|
0
|
[]
|
[{"post_id": 42784, "ts": "202 [{"post_id": 42784, "ts": "2026-08-07T17:48:15Z", "hours": 5.795, "text": "Our project is a portable, non-invasive bridge monitoring system designed to continuously collect structural and environmental data. The device is housed in a weatherproof 3D-printed enclosure and can be attached to a bridge without drilling or permanently modifying the structure.Using multiple sensors, the system measures bridge vibrations, environmental conditions, and traffic activity. A Raspberry Pi Pico processes the collected data and transmits it using LoRa to a nearby gateway. The gateway uploads the information to the cloud, where it can be viewed through a mobile application.Rather than replacing professional bridge inspections, our device serves as an early warning monitoring system , helping engineers identify unusual changes in bridge behavior between routine inspections.Why is this important?Bridges are critical pieces of infrastructure that millions of people rely on every day. Most bridges are only inspected every few months or years, meaning structural changes that occur between inspections can go unnoticed.Our project fills this gap by providing continuous, real-time monitoring . Instead of replacing professional inspections, the system acts as an early warning tool , detecting abnormal changes in vibration, movement, and environmental conditions that may indicate a developing problem.By combining affordable sensors with long-range LoRa communication, this system offers a scalable and cost-effective solution that could be deployed on many bridges rather than only high-value infrastructure. Continuous monitoring allows engineers to observe how bridges respond to traffic, weather, and long-term wear while identifying trends that may require further investigation.In addition to structural monitoring, the system also estimates traffic levels using vibration analysis. This information can help transportation departments understand bridge usage, identify heavily traveled routes, and make informed decisions about maintenance scheduling and future infrastructure improvements."}]...
|
Title: BridgeWatch by @aum | Stardance
Devlogs:
O Title: BridgeWatch by @aum | Stardance
Devlogs:
Our project is a portable, non-invasive bridge monitoring system designed to continuously collect structural and environmental data. The device is housed in a weatherproof 3D-printed enclosure and can be attached to a bridge without drilling or permanently modifying the structure.Using multiple sensors, the system measures bridge vibrations, environmental conditions, and traffic activity. A Raspberry Pi Pico processes the collected data and transmits it using LoRa to a nearby gateway. The gateway uploads the information to the cloud, where it can be viewed through a mobile application.Rather than replacing professional bridge inspections, our device serves as an early warning monitoring system , helping engineers identify unusual changes in bridge behavior between routine inspections.Why is this important?Bridges are critical pieces of infrastructure that millions of people rely on every day. Most bridges are only inspected every few months or years, meaning structural changes that occur between inspections can go unnoticed.Our project fills this gap by providing continuous, real-time monitoring . Instead of replacing professional inspections, the system acts as an early warning tool , detecting abnormal changes in vibration, movement, and environmental conditions that may indicate a developing problem.By combining affordable sensors with long-range LoRa communication, this system offers a scalable and cost-effective solution that could be deployed on many bridges rather than only high-value infrastructure. Continuous monitoring allows engineers to observe how bridges respond to traffic, weather, and long-term wear while identifying trends that may require further investigation.In addition to structural monitoring, the system also estimates traffic levels using vibration analysis. This information can help transportation departments understand bridge usage, identify heavily traveled routes, and make informed decisions about maintenance scheduling and future infrastructure improvements....
|
1793990836.1366181
|
1794595636.1366181
|
|
44001
|
My awesome macropad! by @weramos619 | Stardance
|
weramos619
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @weramos619 | Stard Title: My awesome macropad! by @weramos619 | Stardance...
|
1793990835.2644176
|
1794595635.2644176
|
|
44000
|
My awesome macropad! by @potatisauto | Stardance
|
potatisauto
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @potatisauto | Star Title: My awesome macropad! by @potatisauto | Stardance...
|
1793990834.3633056
|
1794595634.3633056
|
|
16044
|
CSPBattery by @PriyanshuBiswal | Stardance
|
PriyanshuBiswal
|
0
|
1.92
|
0
|
[]
|
[{"post_id": 7303, "ts": "2026 [{"post_id": 7303, "ts": "2026-06-12T05:19:07Z", "hours": 1.9233, "text": "Created an Android APK for this FRC battery manager!"}]...
|
Title: CSPBattery by @PriyanshuBiswal | Stardance
Title: CSPBattery by @PriyanshuBiswal | Stardance
Devlogs:
Created an Android APK for this FRC battery manager!...
|
1793990832.8003833
|
1794595632.8003833
|
|
11070
|
HYDROSENTINAL by @Nikhil | Stardance
|
Nikhil
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: HYDROSENTINAL by @Nikhil | Stardance
|
1793990831.909456
|
1794595631.909456
|
|
50022
|
MechanicaSaveFix by @Oignontom8283 | Stardance
|
Oignontom8283
|
1
|
38.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-23T01:43:55Z", "hours": 38.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "A super mod that fixes a nasty problem in a cool way (Virtual file system >:3) for a game almost nobody plays anymore! Yeeeeah! Go check out this post https://stardance.hackclub.com/projects/50022/devlogs/68461 that’s where the REAL description and the whole journey are.", "repo": "https://github.com/Oignontom8283/MechanicaSaveFix", "demo": "https://youtu.be/NF6xDftQVgA"}]...
|
[{"post_id": 81915, "ts": "202 [{"post_id": 81915, "ts": "2026-10-23T01:35:32Z", "hours": 0.5192, "text": "MechanicaSaveFix, a BepInEx mod that replaces Mechanica’s save system with a single archive per world. Demo video : https://youtu.be/NF6xDftQVgA This isn’t my first time getting into this game! I’ve been trying things out, doing little tweaks, etc. on the game for years now. But this is my first and biggest completed project aimed at modding this game! There are no resources online about the game’s structure, how it works, etc. So I spent way more time searching and understanding than actually coding! Working without documentation is really annoying :) My goal here is to get a big Blåhaj! Will I pull it off? I don’t know… The problem? Mechanica saves every object, robot, weld, link, etc. into its own little file, stored in nested folders. A small test world already makes hundreds of folders, and large worlds reach thousands of files. On large worlds, you run into what I call “Infinite Save Loading” (ISL). The save never finishes, you have to restart the game, and you lose your progress. I suspect the number of files is the cause, but I haven’t proven it, because these freezes are very hard to reproduce. However, during my testing, I didn’t have the issue. So at best, it improves things! Which is already pretty neat :3 What does the mod do? The mod doesn’t rewrite the game’s save system, which wasn’t designed to be replaced. It sits on top of it: It intercepts the game’s calls to files (File, Directory, FileInfo, DirectoryInfo) using Harmony; It redirects them to a Virtual File System (VFS) that keeps everything in memory; It then writes the result into a single .msa (Mechanica Save Archive) file, which is actually a zip containing the original files and folders. The game therefore continues to believe it is writing thousands of small files, while it is actually writing only one file to disk. On the first save, a classic world is converted to .msa. The original folder is not touched, and you can extract the archive to get back a standard save. I also rewrote the world selection menu (it lists classic folders and archives) and the world creation flow. I added a confirmation window, a config file, a backup system, and an optional update check. Difficulties encountered: No centralized save code. Every system (objects, robots, welds, storage, links…) reads and writes its files in its own way. There was no single place to hook into; Incremental saving and cleanup. The game only rewrites what has changed, then deletes any file absent from its list of valid paths, compared as exact strings. The mod must therefore keep everything in memory and reproduce paths identically: mix of / and , case, spaces. Early on, a bug like this caused all files to be deleted by cleanup; Not everything goes through File/Directory. Some parts of the code use FileInfo/DirectoryInfo, which had to be intercepted separately; Implicitly created folders. The game checks for the existence of folders that are sometimes legitimately empty. After a bug where object categories were duplicated on every reload, I added explicit folder tracking in the VFS, with entries for empty folders in the archive; A very tangled save menu. It relies on dictionaries indexed by UI objects, with a large part of the interface hardwired in the Unity editor, so invisible in decompiled code. I had to inspect the layout at runtime and rewrite the menu entirely; Architecture issues. It took me a while to decide where to place the world swap function (it’s in the VFS). I think I didn’t forget anything :/ Unfortunately, I admit, this is just a band-aid on a gaping wound. It only improves or at best delays the problem. Not to mention the fact that other things like the game’s multiplayer are still completely broken ¯ _ (ツ)_/¯"}, {"post_id": 76703, "ts": "2026-10-04T11:37:14Z", "hours": 3.8622, "text": "v0.12.0 Version v0.11.0 introduced a system that checks the GitHub repository for new versions of the mod.As for v0.12.0 … I ended up finding a bug that was causing certain item categories to be duplicated whenever a save was reloaded. I spent quite a bit of time tracking down the issue and fixing it, and it ended up requiring some fairly significant changes to the VFS.(Nothing too crazy, though. I basically just added explicit directory tracking so that empty directories are still properly preserved.) Anyway, it works now! :3"}, {"post_id": 68309, "ts": "2026-09-14T22:07:56Z", "hours": 7.2778, "text": "v0.10.0 There we go! The mod is technically functional and usable. All that’s left is getting other people to test it and adding a couple more things, like an update check, and that’s it (: What’s changed: Added a configuration file for the mod. Added several features driven by settings from the configuration file. Patched the new world creation menu to directly create a save in the new format. Reorganized a good chunk of the code in the larger files (Utils.cs, VirtualFS.cs, SaveMenu.cs). Progress so far: ✅ VFS (Virtual File System). ✅ Write the fake System.IO functions. ✅ Write/Read the .msa (Mechanica Save Archive) file. ✅ Intercepting the system functions. ✅ Write the triggers that will fire the capture/emission of virtual files. ✅ Add display/support for the new save format in the world selection menu. ✅ Config file ❌ [Optional] Fix non-blocking base-game load/save errors that clutter the console."}, {"post_id": 59545, "ts": "2026-09-01T13:00:09Z", "hours": 5.6392, "text": "v0.8.1 I thought this step was going to be simple… Not at all! It’s been a nightmare of an ordeal. The save selection menu’s code (its logic) was basically one flat, tangled plate of spaghetti. The base game used a bunch of dictionaries to store data and look it back up. The functions tied to the buttons used the Rect object handed to the class to look up the data they needed. Why hand over an object to look up data through a dictionary when you can just pass the function what it needs directly… I completely rewrote the menu’s behavior from scratch, cleanly, to support displaying and loading saves in their new archive form. What’s changed: Rewrote the save selection menu so it lists both classic save folders and the new .msa archives side by side. Added a proper confirmation popup (reused for save deletion, and reusable for anything else later) instead of the base game’s tangled state. Rebuilt the difficulty settings screen flow so it works the same way whether the save is a folder or an archive. Deleting a save now works for both save folders and .msa archives. Fixed thumbnails not showing for saves without a screenshot. Hooked up unloading the virtual file system when leaving a world, so you can load another world without restarting the game. Squashed a good number of bugs along the way (mixed up path separators, wrong field types, missing state resets) that only showed up once real saves were being loaded and listed. Progress so far: ✅ VFS (Virtual File System). ✅ Write the fake System.IO functions. ✅ Write/Read the .msa (Mechanica Save Archive) file. ✅ Intercepting the system functions. ✅ Write the triggers that will fire the capture/emission of virtual files. ✅ Add display/support for the new save format in the world selection menu. ❌ Add a config file, [deinitialize the VFS on world exit - Early Done], and other minor details/improvements (new) ❌ [Optional] Fix non-blocking base-game load/save errors that clutter the console."}, {"post_id": 54801, "ts": "2026-08-25T22:40:21Z", "hours": 7.2544, "text": "0.6.0 It wasn’t as simple as expected… But it works now! You can load a normal world, and on the first save it will be converted into a .msa archive. From then on, whenever you try to load a world that has an archived version, that version will be loaded instead of the other one. What’s changed: Fixed VirtualFS incorrectly normalizing the root save path, which caused it to no longer match the paths built by the game itself, breaking file lookups everywhere. Fixed QueryEntries not sanitizing multi-level directory paths, which caused Directory.GetFiles / GetDirectories to return nothing for nested folders (welds, anchors, etc.). Fixed reconstructed paths mixing / and \\ separators, which broke the game’s own string comparisons (e.g. RemoveOldFiles deleting everything instead of only orphaned files). Added patches for DirectoryInfo / FileInfo instance methods ( GetFiles , GetDirectories , CreateSubdirectory , Exists ), which weren’t covered by the static File / Directory patches. Simplified VirtualFS ‘s internal mode from three states ( Idle / Capturing / Playback ) down to two ( Idle / Intercepting ), since capture and playback behaved identically from the interception logic’s point of view. Wrote the Save() / LoadSave() coroutine wrappers that trigger the capture/playback cycle and commit/load the .msa archive. Progress so far: ✅ VFS (Virtual File System). ✅ Write the fake System.IO functions. ✅ Write/Read the .msa (Mechanica Save Archive) file. ✅ Intercepting the system functions. ✅ Write the triggers that will fire the capture/emission of virtual files. ❌ Add display/support for the new save format in the world selection menu. ❌ Add a config file, deinitialize the VFS on world exit, and other minor details/improvements (new) ❌ [Optional] Fix non-blocking base-game load/save errors that clutter the console. (new)"}, {"post_id": 51323, "ts": "2026-08-20T22:10:26Z", "hours": 0.9206, "text": "v0.5.1 I added the Harmony patches to intercept System.IO functions. It was long and repetitive 👍. What’s changed: Add src\\Patches\\io\\Directory.cs for the directory-related function patches. Add src\\Patches\\io\\File.cs for the file-related function patches. Removed old test files for writing/reading files. Progress so far: ✅ VFS (Virtual File System). ✅ Write the fake System.IO functions. ✅ Write/Read the .msa (Mechanica Save Archive) file. ✅ Intercepting the system functions. ❌ Write the triggers that will fire the capture/emission of virtual files. ❌ Add display/support for the new save format in the world selection menu. The next step should let me run the first tests, which will probably be followed by some bug fixes. Hopefully not 🤞."}, {"post_id": 50577, "ts": "2026-08-19T19:38:17Z", "hours": 1.9633, "text": "v0.4.1 I almost went CRAZY 😰 I ran into an architecture problem, and I was about two steps away from refactoring EVERYTHING to make it clean. I finally found a solution. It’s not the cleanest, but I didn’t have any other idea. So the world-swap function lives inside the VFS. In the end it’s just a matter of roles/responsibilities, nothing technically blocking really 😅. What’s changed: Add method to write the VFS to a zip archive. Add method to load a zip archive into the VFS. Add method to replace the world’s save with the new one and move the previous version to backup. Improved the versioning system, and included build info (hash, time…). Progress so far: ✅ VFS (Virtual File System). ✅ Write the fake System.IO functions. ✅ Write/Read the .msa (Mechanica Save Archive) file. ❌ Intercepting the system functions. ❌ Write the triggers that will fire the capture/emission of virtual files. ❌ Add display/support for the new save format in the world selection menu."}, {"post_id": 50082, "ts": "2026-08-19T04:29:19Z", "hours": 1.5697, "text": "Mostly environment/tooling additions and improvements. What’s changed: Add build.yml GitHub CI, to verify that commits and PRs compile. Add release.yml GitHub CI, to build and attach the mod to releases. Minor tweaks to the build script. Add a VSCode task to build the project without running a command. Progress so far (so no changes here ¯ _ (ツ)_/¯): ✅ VFS (Virtual File System). ✅ Write the fake System.IO functions. ❌ Write/Read the .msa (Mechanica Save Archive) file. ❌ Intercepting the system functions. ❌ Write the triggers that will fire the capture/emission of virtual files. ❌ Add display/support for the new save format in the world selection menu."}, {"post_id": 49874, "ts": "2026-08-18T20:28:48Z", "hours": 0.9658, "text": "I finished the Forward component, which faithfully reproduces every System.IO function (the functions used to interact with the computer’s file system). Why? : I need functions with the exact same API, since I’m going to intercept the game’s disk read/write functions to stop it from writing thousands of small files and folders. What’s changed: Add VirtualFS.DeleteFile() Add VirtualFS.DeleteFileNoThrow() ( System.IO ‘s Delete function doesn’t throw an error, unlike VirtualFS.DeleteFile() , so I made an alternative to properly mimic Delete ’s behavior. Add Forward.cs Progress so far: ✅ VFS (Virtual File System). ✅ Write the fake System.IO functions. ❌ Write/Read the .msa (Mechanica Save Archive) file. ❌ Intercepting the system functions. ❌ Write the triggers that will fire the capture/emission of virtual files. ❌ Add display/support for the new save format in the world selection menu."}, {"post_id": 49417, "ts": "2026-08-18T07:44:51Z", "hours": 7.745, "text": "I have to admit I’ve been working on reverse-engineering / decompiling this game for a long time now, so getting set up was pretty quick. I established the mod/patch structure, refactored it, refactored it again, until I landed on my current plan. Right now I’ve only written VirtualFS.cs , which contains the virtual file system that will intercept System.IO requests to prevent them from writing to disk. Next I’ll move on to writing the fake System.IO functions (write a file, read a file, etc.), the functions that will write and read the save in .zip format, the patches for the system functions, the triggers, and finally the interface. Progress so far: ✅ VFS (Virtual File System). ❌ Write the fake System.IO functions. ❌ Write/Read the .msa (Mechanica Save Archive) file. ❌ Intercepting the system functions. ❌ Write the triggers that will fire the capture/emission of virtual files. ❌ Add display/support for the new save format in the world selection menu. Markdown checkboxes don’t work… so I’m using good old emojis instead. ¯ _ (ツ)_/¯"}]...
|
Title: MechanicaSaveFix by @Oignontom8283 | Starda Title: MechanicaSaveFix by @Oignontom8283 | Stardance
Devlogs:
I have to admit I’ve been working on reverse-engineering / decompiling this game for a long time now, so getting set up was pretty quick. I established the mod/patch structure, refactored it, refactored it again, until I landed on my current plan. Right now I’ve only written VirtualFS.cs , which contains the virtual file system that will intercept System.IO requests to prevent them from writing to disk. Next I’ll move on to writing the fake System.IO functions (write a file, read a file, etc.), the functions that will write and read the save in .zip format, the patches for the system functions, the triggers, and finally the interface. Progress so far: ✅ VFS (Virtual File System). ❌ Write the fake System.IO functions. ❌ Write/Read the .msa (Mechanica Save Archive) file. ❌ Intercepting the system functions. ❌ Write the triggers that will fire the capture/emission of virtual files. ❌ Add display/support for the new save format in the world selection menu. Markdown checkboxes don’t work… so I’m using good old emojis instead. ¯ _ (ツ)_/¯
I finished the Forward component, which faithfully reproduces every System.IO function (the functions used to interact with the computer’s file system). Why? : I need functions with the exact same API, since I’m going to intercept the game’s disk read/write functions to stop it from writing thousands of small files and folders. What’s changed: Add VirtualFS.DeleteFile() Add VirtualFS.DeleteFileNoThrow() ( System.IO ‘s Delete function doesn’t throw an error, unlike VirtualFS.DeleteFile() , so I made an alternative to properly mimic Delete ’s behavior. Add Forward.cs Progress so far: ✅ VFS (Virtual File System). ✅ Write the fake System.IO functions. ❌ Write/Read the .msa (Mechanica Save Archive) file. ❌ Intercepting the system functions. ❌ Write the triggers that will fire the capture/emission of virtual files. ❌ Add display/support for the new save format in the world selection menu.
Mostly environment/tooling additions and improvements. What’s changed: Add build.yml GitHub CI, to verify that commits and PRs compile. Add release.yml GitHub CI, to build and attach the mod to releases. Minor tweaks to the build script. Add a VSCode task to build the project without running a command. Progress so far (so no changes here ¯ _ (ツ)_/¯): ✅ VFS (Virtual File System). ✅ Write the fake System.IO functions. ❌ Write/Read the .msa (Mechanica Save Archive) file. ❌ Intercepting the system functions. ❌ Write the triggers that will fire the capture/emission of virtual files. ❌ Add display/support for the new save format in the world selection menu.
v0.4.1 I almost went CRAZY 😰 I ran into an architecture problem, and I was about two steps away from refactoring EVERYTHING to make it clean. I finally found a solution. It’s not the cleanest, but I didn’t have any other idea. So the world-swap function lives inside the VFS. In the end it’s just a matter of roles/responsibilities, nothing technically blocking really 😅. What’s changed: Add method to write the VFS to a zip archive. Add method to load a zip archive into the VFS. Add method to replace the world’s save with the new one and move the previous version to backup. Improved the versioning system, and included build info (hash, time…). Progress so far: ✅ VFS (Virtual File System). ✅ Write the fake System.IO functions. ✅ Write/Read the .msa (Mechanica Save Archive) file. ❌ Intercepting the system functions. ❌ Write the triggers that will fire the capture/emission of virtual files. ❌ Add display/support for the new save format in the world selection menu.
v0.5.1 I added the Harmony patches to intercept System.IO functions. It was long and repetitive 👍. What’s changed: Add src\Patches\io\Directory.cs for the directory-related function patches. Add src\Patches\io\File.cs for the file-related function patches. Removed old test files for writing/reading files. Progress so far: ✅ VFS (Virtual File System). ✅ Write the fake System.IO functions. ✅ Write/Read the .msa (Mechanica Save Archive) file. ✅ Intercepting the system functions. ❌ Write the triggers that will fire the capture/emission of virtual files. ❌ Add display/support for the new save format in the world selection menu. The next step should let me run the first tests, which will probably be followed by some bug fixes. Hopefully not 🤞.
0.6.0 It wasn’t as simple as expected… But it works now! You can load a normal world, and on the first save it will be converted into a .msa archive. From then on, whenever you try to load a world that has an archived version, that version will be loaded instead of the other one. What’s changed: Fixed VirtualFS incorrectly normalizing the root save path, which caused it to no longer match the paths built by the game itself, breaking file lookups everywhere. Fixed QueryEntries not sanitizing multi-level directory paths, which caused Directory.GetFiles / GetDirectories to return nothing for nested folders (welds, anchors, etc.). Fixed reconstructed paths mixing / and \ separators, which broke the game’s own string comparisons (e.g. RemoveOldFiles deleting everything instead of only orphaned files). Added patches for DirectoryInfo / FileInfo instance methods ( GetFiles , GetDirectories , CreateSubdirectory , Exists ), which weren’t covered by the static File / Directory patches. Simplified VirtualFS ‘s internal mode from three states ( Idle / Capturing / Playback ) down to two ( Idle / Intercepting ), since capture and playback behaved identically from the interception logic’s point of view. Wrote the Save() / LoadSave() coroutine wrappers that trigger the capture/playback cycle and commit/load the .msa archive. Progress so far: ✅ VFS (Virtual File System). ✅ Write the fake System.IO functions. ✅ Write/Read the .msa (Mechanica Save Archive) file. ✅ Intercepting the system functions. ✅ Write the triggers that will fire the capture/emission of virtual files. ❌ Add display/support for the new save format in the world selection menu. ❌ Add a config file, deinitialize the VFS on world exit, and other minor details/improvements (new) ❌ [Optional] Fix non-blocking base-game load/save errors that clutter the console. (new)
v0.8.1 I thought this step was going to be simple… Not at all! It’s been a nightmare of an ordeal. The save selection menu’s code (its logic) was basically one flat, tangled plate of spaghetti. The base game used a bunch of dictionaries to store data and look it back up. The functions tied to the buttons used the Rect object handed to the class to look up the data they needed. Why hand over an object to look up data through a dictionary when you can just pass the function what it needs directly… I completely rewrote the menu’s behavior from scratch, cleanly, to support displaying and loading saves in their new archive form. What’s changed: Rewrote the save selection menu so it lists both classic save folders and the new .msa archives side by side. Added a proper confirmation popup (reused for save deletion, and reusable for anything else later) instead of the base game’s tangled state. Rebuilt the difficulty settings screen flow so it works the same way whether the save is a folder or an archive. Deleting a save now works for both save folders and .msa archives. Fixed thumbnails not showing for saves without a screenshot. Hooked up unloading the virtual file system when leaving a world, so you can load another world without restarting the game. Squashed a good number of bugs along the way (mixed up path separators, wrong field types, missing state resets) that only showed up once real saves were being loaded and listed. Progress so far: ✅ VFS (Virtual File System). ✅ Write the fake System.IO functions. ✅ Write/Read the .msa (Mechanica Save Archive) file. ✅ Intercepting the system functions. ✅ Write the triggers that will fire the capture/emission of virtual files. ✅ Add display/support for the new save format in the world selection menu. ❌ Add a config file, [deinitialize the VFS on world exit - Early Done], and other minor details/improvements (new) ❌ [Optional] Fix non-blocking base-game load/save errors that clutter the console.
v0.10.0 There we go! The mod is technically functional and usable. All that’s left is getting other people to test it and adding a couple more things, like an update check, and that’s it (: What’s changed: Added a configuration file for the mod. Added several features driven by settings from the configuration file. Patched the new world creation menu to directly create a save in the new format. Reorganized a good chunk of the code in the larger files (Utils.cs, VirtualFS.cs, SaveMenu.cs). Progress so far: ✅ VFS (Virtual File System). ✅ Write the fake System.IO functions. ✅ Write/Read the .msa (Mechanica Save Archive) file. ✅ Intercepting the system functions. ✅ Write the triggers that will fire the capture/emission of virtual files. ✅ Add display/support for the new save format in the world selection menu. ✅ Config file ❌ [Optional] Fix non-blocking base-game load/save errors that clutter the console.
v0.12.0 Version v0.11.0 introduced a system that checks the GitHub repository for new versions of the mod.As for v0.12.0 … I ended up finding a bug that was causing certain item categories to be duplicated whenever a save was reloaded. I spent quite a bit of time tracking down the issue and fixing it, and it ended up requiring some fairly significant changes to the VFS.(Nothing too crazy, though. I basically just added explicit directory tracking so that empty directories are still properly preserved.) Anyway, it works now! :3
MechanicaSaveFix, a BepInEx mod that replaces Mechanica’s save system with a single archive per world. Demo video : https://youtu.be/NF6xDftQVgA This isn’t my first time getting into this game! I’ve been trying things out, doing little tweaks, etc. on the game for years now. But this is my first and biggest completed project aimed at modding this game! There are no resources online about the game’s structure, how it works, etc. So I spent way more time searching and understanding than actually coding! Working without documentation is really annoying :) My goal here is to get a big Blåhaj! Will I pull it off? I don’t know… The problem? Mechanica saves every object, robot, weld, link, etc. into its own little file, stored in nested folders. A small test world already makes hundreds of folders, and large worlds reach thousands of files. On large worlds, you run into what I call “Infinite Save Loading” (ISL). The save never finishes, you have to restart the game, and you lose your progress. I suspect the number of files is the cause, but I haven’t proven it, because these freezes are very hard to reproduce. However, during my testing, I didn’t have the issue. So at best, it improves things! Which is already pretty neat :3 What does the mod do? The mod doesn’t rewrite the game’s save system, which wasn’t designed to be replaced. It sits on top of it: It intercepts the game’s calls to files (File, Directory, FileInfo, DirectoryInfo) using Harmony; It redirects them to a Virtual File System (VFS) that keeps everything in memory; It then writes the result into a single .msa (Mechanica Save Archive) file, which is actually a zip containing the original files and folders. The game therefore continues to believe it is writing thousands of small files, while it is actually writing only one file to disk. On the first save, a classic world is converted to .msa. The original folder is not touched, and you can extract the archive to get back a standard save. I also rewrote the world selection menu (it lists classic folders and archives) and the world creation flow. I added a confirmation window, a config file, a backup system, and an optional update check. Difficulties encountered: No centralized save code. Every system (objects, robots, welds, storage, links…) reads and writes its files in its own way. There was no single place to hook into; Incremental saving and cleanup. The game only rewrites what has changed, then deletes any file absent from its list of valid paths, compared as exact strings. The mod must therefore keep everything in memory and reproduce paths identically: mix of / and , case, spaces. Early on, a bug like this caused all files to be deleted by cleanup; Not everything goes through File/Directory. Some parts of the code use FileInfo/DirectoryInfo, which had to be intercepted separately; Implicitly created folders. The game checks for the existence of folders that are sometimes legitimately empty. After a bug where object categories were duplicated on every reload, I added explicit folder tracking in the VFS, with entries for empty folders in the archive; A very tangled save menu. It relies on dictionaries indexed by UI objects, with a large part of the interface hardwired in the Unity editor, so invisible in decompiled code. I had to inspect the layout at runtime and rewrite the menu entirely; Architecture issues. It took me a while to decide where to place the world swap function (it’s in the VFS). I think I didn’t forget anything :/ Unfortunately, I admit, this is just a band-aid on a gaping wound. It only improves or at best delays the problem. Not to mention the fact that other things like the game’s multiplayer are still completely broken ¯ _ (ツ)_/¯
Ships:
A super mod that fixes a nasty problem in a cool way (Virtual file system >:3) for a game almost nobody plays anymore! Yeeeeah! Go check out this post https://stardance.hackclub.com/projects/50022/devlogs/68461 that’s where the REAL description and the whole journey are....
|
1793990830.6286402
|
1794077230.6286402
|
|
1274
|
My awesome macropad! by @ryan_leung | Stardance
|
ryan_leung
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @ryan_leung | Stard Title: My awesome macropad! by @ryan_leung | Stardance...
|
1793987750.5750043
|
1794592550.5750043
|
|
7596
|
Untitled by @TheRealCitixx | Stardance
|
TheRealCitixx
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @TheRealCitixx | Stardance
|
1793987749.6996284
|
1794592549.6996284
|
|
23471
|
Frictionless by @Riccardo | Stardance
|
Riccardo
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @Riccardo | Stardance
|
1793987748.7773333
|
1794592548.7773333
|
|
9104
|
My awesome macropad! by @ShakerGryphon30 | Stardan My awesome macropad! by @ShakerGryphon30 | Stardance...
|
ShakerGryphon30
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @ShakerGryphon30 | Title: My awesome macropad! by @ShakerGryphon30 | Stardance...
|
1793987747.8994458
|
1794592547.8994458
|
|
35998
|
Frictionless by @granola | Stardance
|
granola
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @granola | Stardance
|
1793987747.0007987
|
1794592547.0007987
|
|
22237
|
CyberShield by @Moparapairayat | Stardance
|
Moparapairayat
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: CyberShield by @Moparapairayat | Stardance
|
1793987746.1153922
|
1794592546.1153922
|
|
14742
|
survive by @tejaswini | Stardance
|
tejaswini
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: survive by @tejaswini | Stardance
|
1793987745.2499492
|
1794592545.2499492
|
|
27443
|
My very own WebOS by @emmanuell | Stardance
|
emmanuell
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @emmanuell | Stardance
|
1793987744.371804
|
1794592544.371804
|
|
4658
|
Untitled project by @trishika | Stardance
|
trishika
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @trishika | Stardance
|
1793987743.4923394
|
1794592543.4923394
|
|
21867
|
My very own WebOS by @lara_o | Stardance
|
lara_o
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @lara_o | Stardance
|
1793987742.6073205
|
1794592542.6073205
|
|
6550
|
Leading Zeros Utility by @infinite_silly | Stardan Leading Zeros Utility by @infinite_silly | Stardance...
|
infinite_silly
|
2
|
23.0
|
304
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-07T21:43:33Z", "hours": 17.0, "multiplier": 17.27, "payout": 289, "blessing": "neutral", "text": "Hello everyone! I was working on some Project Euler problems, and I realised that my solutions weren’t sorting correctly because they didn’t have any leading zeros in the numeric portion of their filenames. The same issue happened for my Advent of Code solutions once I hit day 10. I realised I could automate this, and the leading-zero-util was born. It slowly grew from a little, mediocre script to a decently-ish written CLI tool with proper unit tests, a Homebrew tap, a man page, and completions. If you want a better look at the development process than just the devlogs, please check out my commits on GitHub. If you are going to install the LZU, I also recommend that you use the Homebrew tap rather than the crates.io release, the instructions for which are in the README.", "repo": "https://github.com/KaonQuantum/leading-zero-util", "demo": "https://crates.io/crates/leading-zero-util"}, {"ship_num": 2, "ts": "2026-06-10T15:04:30Z", "hours": 6.0, "multiplier": 2.57, "payout": 15, "blessing": "neutral", "text": "I made a utility to change the number of leading zeros in filenames! I was working on Project Euler and had to add a leading zero to all my filenames, which was tedious, so I made this!", "repo": "https://github.com/KaonQuantum/leading-zero-util", "demo": "https://crates.io/crates/leading-zero-util"}]...
|
[{"post_id": 42843, "ts": "202 [{"post_id": 42843, "ts": "2026-08-07T19:41:19Z", "hours": 0.9986, "text": "Drop it Like it’s Hot THIS IS THE FINAL DEVLOG!!!! We got a working release! After my last devlog, I added some unit tests for skip_rename(), and I added the Github default Rust workflow with some modifications to the repo to automatically test any new commits against the test suit, which is most of my codebase. Also added a test workflow to the homebrew tap so it’s easier to see that all is working."}, {"post_id": 42489, "ts": "2026-08-07T08:00:31Z", "hours": 1.3761, "text": "Refactor I’m going to keep this one quick because it just got deleted for being too long. The previously mentioned behaviour of overwriting filenames has been fixed and has it’s own unit test now. It was given an exception before the actual rename. All the rename logic was duplicated between dec and !dec, so I flattened that. I pulled out the pre-rename exception logic into a new helper: skip_rename(). It needs unit tests of its own. Byyyeeeeee!!!"}, {"post_id": 42432, "ts": "2026-08-07T04:14:30Z", "hours": 1.0014, "text": "I’m Smart but I’m Bad at Taking Tests Hello again! You know what they say, new commit, new devlog! “[Test] Torsion” We got MORE UNIT TESTS!!! The get_filenames() fn was formerly the only function in helpers.rs that had no unit tests, so I added 6 unit tests for it. They have about the same general structure as the unit tests for change_leading_zeros(). Beautification I was trying to make my code prettier, and I accidentally screwed up an ownership issue. My unit tests made use of tempdirs with the tempfile crate to test change_leading_zeros() and get_filenames. This is the original pattern for getting the temp dir’s path: let binding = tempdir () .unwrap (); let dir = binding .path (); // stuff can be done with dir now This is what I changed it to: let dir = tempdir () .unwrap () .path () .to_owned (); When the tempdir gets dropped, it also deletes the directory, which makes dir a path to a dir that doesn’t exist. Everything compiles fine, but the code panics because the tempdir doesn’t exist. Override Something I forgot to mention in my last devlog is that if there was the files file1.txt and file01.txt, it (c/w)ould rename over one of the files and silently delete the file written over. I still have to fix this issue. I’ve wanted to learn Zig, so I looked up Zig crash courses on Youtube, and this is from the one I was watching."}, {"post_id": 42339, "ts": "2026-08-07T00:40:04Z", "hours": 2.7222, "text": "Testing Tests Hello again! I can’t believe we’re on devlog #8, considering I have been doing pretty sparse devlogs! if true { allTestsPass } IT’S UNIT TEST TIIIIIME!!! I added 13 unit tests to my big change_leading_zeros() function. They cover most, if not all, possible edge cases. Rename file11 -> file11 I discovered that in change_leading_zeros(), if the resulting new filename was the same as the old, would still do the rename, and it would count as a renamed file, so that the actual number of renamed files would be too large. Hating on for loops as much as the functional bros. I realised that my get_filenames() fn, which still has no unit tests, could be swapped to an iterator structure. old: pub fn get_filenames ( path : & Path ) -> Vec < String > { let mut names = Vec :: new (); if let Ok ( read_dir ) = fs :: read_dir ( path ) { for file in read_dir .flatten () { names .push ( file .file_name () .into_string () .unwrap_or ( \"unknown name\" .into ()), ); } } names } pub fn get_filenames ( path : & Path ) -> Vec < String > { fs :: read_dir ( path ) .into_iter () .flatten () .flatten () .map (| f | f .file_name () .into_string () .unwrap_or ( \"unknown name\" .into ())) .collect () } The two functions behave in exactly the same way, no unnecesary unwrap()s that may cause panics See y’all next devlog!"}, {"post_id": 41806, "ts": "2026-08-06T07:38:58Z", "hours": 2.0653, "text": "Testing, Testing, 1 2 3 Here’s what I’ve been working on to try to get a good, stable release. I Need an Extension I discovered that when doing the normalising add, the one that’s like problem-1.txt, problem-11.rs (-n 1) -> problem-01.txt, problem-11.rs (keeps the same total length of the numeric portion), it actually counts the extension characters, so the result would actually be problem-01.txt, problem-011.rs because the extensions are different lengths. Previously, the find_target() function was like this: pub fn find_target ( filenames : & Vec < String > , count : usize ) -> usize { let mut minimum = usize :: MAX ; for file in filenames { let ( dot_index , cond ) = check_file ( file ); if cond { continue ; } let split_index = find_split_index ( file , dot_index ); minimum = minimum .min ( file [ split_index .. ] .len ()); } minimum + count } Now, it’s pub fn find_target ( filenames : & Vec < String > , count : usize ) -> usize { let mut minimum = usize :: MAX ; let mut is_numeric : bool = false ; for file in filenames { let ( dot_index , cond ) = check_file ( file ); if cond { continue ; } let split_index = find_split_index ( file , dot_index ); minimum = minimum .min ( file [ split_index .. dot_index ] .len ()); is_numeric = true ; } if is_numeric { minimum + count } else { 0 } } Now the target isn’t the shortest number of characters in the numeric portion plus the extension, it’s just the extension. The is_numeric variable is just there so that it doesn’t try to add count to usize::MAX, getting an overflow if there are no files with numeric suffixes. sleep(); sleep(); sleep(); allTestsPass(); The last step before 1.0.0 is UNIT TESTS!!!!!! The easiest unit tests to write are ones for my functions in helpers.rs, including find_target(), check_file(), find_split_index(), and get_filenames(). I wrote 15 unit tests for the first three, and I might write some for get_filenames after I write some for change_leading_zeros(). While writing the unit tests, I stumbled upon the edge case for find_target if there are no applicable files, which is why I added the is_numeric above. The next step is writing the aforementioned unit tests for change_leading_zeros()."}, {"post_id": 41550, "ts": "2026-08-05T20:43:11Z", "hours": 1.3689, "text": "Crack a Brewski with the Boys Much Abrew about Nothing, pt. 2 Got the homebrew tap working! Not much to say, except that it is a tad annoying to have to have a separate repo just for the tap. Compleated Because of the Homebrew tap, I decided to swap the non-nushell completions to a hidden flag, so you can run them with –generate-completions zsh/bash/fish/elvish/powershell to create the completions file, which the tap can do at install time for zsh, bash, and fish. Unfortunately, it can’t do it for elvish, powershell, or nushell, so you have to manually install completions for those three. Man(chester United) Because I now have a homebrew tap, installing man files is much easier. I brought back my old clap_mangen code for build.rs, and added a line to the formula, so now man generation works!"}, {"post_id": 41176, "ts": "2026-08-05T06:57:49Z", "hours": 0.9675, "text": "Much Abrew About Nothing Since the failure that was clap_mangen, I have been considering a homebrew release, because then I can more easily have the man files and completions be installed, and I would do homebrew specifically since it is the main package manager I use, and it kind of works on everything. I was using Claude Code to teach me how to create the tap, but I unfortunately ran through my limit and $100 of usage credits I got for free when Fable 5 dropped off my plan on a separate data entry task running with Claude Chrome, so I need to do some testing of the tap. See y’all next devlog!"}, {"post_id": 40506, "ts": "2026-08-04T02:47:49Z", "hours": 1.2161, "text": "Completionism A few days ago, I looked up clap on crates.io , and realised there were many crates built to add functionality to CLAP, like clap_mangen, clap-version-flag, and more. The two this devlog is about are clap_complete and clap_complete_nushell. These two allow for the generation of shell completions; clap_complete supports Bash, Zsh, Fish, Elvish, and PowerShell; clap_complete_nushell adds nushell support. The standard package has a new (in-development) feature that allows for the binary itself to be the completion script, allowing for more minimal user setup if downloading from crates.io†. The nushell version does not have this feature, so you have to run it with a special flag and save the output to a completions file in ~/.config/nushell/completions/leading-zero-util.nu. † crates.io doesn’t have an install step so it doesn’t look in the OUT_DIR at build time, so it doesn’t pick up files like the completion files. This same issue is why I chose not to use clap_mangen, since I only currently distribute through crates.io. If I later make a Homebrew tap, I’ll probably change the way the completions are done and re-add clap_mangen."}, {"post_id": 40305, "ts": "2026-08-03T18:53:22Z", "hours": 1.7167, "text": "Breaking it up Divide and Conquer When I was setting up my build.rs to use clap_mangen, I had to separate my CLI arg parser construct from the rest of my code and put it in a new file. I also realised that some of my code in my (basically) main function (change_leading_zeros()) was repetitive and could be extracted into functions. My change_leading_zeros() was extremely long and deserved its own file. Even after moving a ton of code into helpers.rs, it’s still 78 lines long, thoroughly violating Uncle Bob’s standards. (Granted, his standards are bad, and Uncle Bob could go trip on a log for all I care) I have never worked in a multi-file project before, not even for my Pong game, which is just 747 lines of code all in one file, and it could have easily been broken up into more files. I have a really fast scrolling speed on my laptop, to the point of it being almost unusable, so scrolling all the code in that project was annoying. Because I have never made a multi-file Rust project before, I had no idea what I was doing. I ran into a ton of errors, including my LSP stopping working, so I didn’t have autocomplete or clippy linting for one of my files for a bit, so I got even more confused. Now, fortunately, everything works now, and I even found some issues in my code (an if condition with an OR in which the first part of the OR was redundant; a for loop that instead could have been an iterator chain; a variable that stayed mutable after mutability was unnecessary), so it was an overall great success! Illiteracymaxxing Previously, I mentioned that the LZU operates off of a target length for file names, so having a schema like file01.txt project02.rs problem03.py wouldn’t work, but I was dead wrong. I haven’t worked on the project in a month and a half, and when reading over my code to see what it does, I mistook target as the target filename length, not the target length of the numeric portion. I thus removed the warnings associated with what I believed to be a behaviour of the LZU from the short help, long help, and README. The lesson is maybe to double-check with a friend or smth when you get confused by your own code."}, {"post_id": 39787, "ts": "2026-08-02T23:58:27Z", "hours": 1.5247, "text": "Google: “How to use leading-zero-util?” A couple things have happened since the last devlog, so let’s go through them! Flatten Until today, and we will get to why, all the code was in src/main.rs, which made it harder to deal with and harder to work with. I moved the Cli struct (the clap parser struct) to a new file, src/cli.rs, so it’s a little more readable now. Man Down! As I mentioned in my last devlog, I was going to use the clap_mangen crate to generate a man file for the leading-zero-util. I set it up and created a build.rs, but realised that crates.io wouldn’t do anything with the man files, so you can’t run man leading-zero-util. This was v0.4.0 (We are now on v0.5.0). The benefit of a man file is minuscule, and I can always add it back to my build.rs. It wasn’t worth the extra dependencies, so I dropped it. Reading the version message explains the version message. I was previously considering the clap-version-flag crate for a better version message, but realised it would add basically nothing, and it isn’t well maintained. I decided instead to use shadow-rs for a better long version. I had deleted my build.rs, so I made a new one and added shadow-rs to the code."}, {"post_id": 39347, "ts": "2026-08-02T08:21:29Z", "hours": 1.7653, "text": "Leading with Zeros, ending with .txt Hello everyone! Dusting off my leading zero utility after finishing up Pong, and there were some issues! The F in BSMRCDF I realised that my utility didn’t work for filenames with extensions (no problem-01.rs or mediocre-01.py), so that needed to be fixed. Look for the helpers The CLI uses a target length for non-basic additions, so it only works on filenames with nonnumeric sections of the same length (target-01.rs, project-11.rs), but not problem-11 & target-01. Consequently, the help sections need to warn about this. I also added some more examples at the bottom of the long help. Man the stall This isn’t as much of an issue as something I just found out about. There is a crate, clap_mangen , THAT LETS YOU GENERATE MAN DOCS, which I feel I feel way more excitement than it warrants. This is the next step for this project. See y’all next devlog!"}, {"post_id": 6262, "ts": "2026-06-10T14:57:57Z", "hours": 5.8289, "text": "Leading Zero Util 0.2.0 is complete!"}]...
|
Title: Leading Zeros Utility by @infinite_silly | Title: Leading Zeros Utility by @infinite_silly | Stardance
Devlogs:
Leading Zero Util 0.2.0 is complete!
Leading with Zeros, ending with .txt Hello everyone! Dusting off my leading zero utility after finishing up Pong, and there were some issues! The F in BSMRCDF I realised that my utility didn’t work for filenames with extensions (no problem-01.rs or mediocre-01.py), so that needed to be fixed. Look for the helpers The CLI uses a target length for non-basic additions, so it only works on filenames with nonnumeric sections of the same length (target-01.rs, project-11.rs), but not problem-11 & target-01. Consequently, the help sections need to warn about this. I also added some more examples at the bottom of the long help. Man the stall This isn’t as much of an issue as something I just found out about. There is a crate, clap_mangen , THAT LETS YOU GENERATE MAN DOCS, which I feel I feel way more excitement than it warrants. This is the next step for this project. See y’all next devlog!
Google: “How to use leading-zero-util?” A couple things have happened since the last devlog, so let’s go through them! Flatten Until today, and we will get to why, all the code was in src/main.rs, which made it harder to deal with and harder to work with. I moved the Cli struct (the clap parser struct) to a new file, src/cli.rs, so it’s a little more readable now. Man Down! As I mentioned in my last devlog, I was going to use the clap_mangen crate to generate a man file for the leading-zero-util. I set it up and created a build.rs, but realised that crates.io wouldn’t do anything with the man files, so you can’t run man leading-zero-util. This was v0.4.0 (We are now on v0.5.0). The benefit of a man file is minuscule, and I can always add it back to my build.rs. It wasn’t worth the extra dependencies, so I dropped it. Reading the version message explains the version message. I was previously considering the clap-version-flag crate for a better version message, but realised it would add basically nothing, and it isn’t well maintained. I decided instead to use shadow-rs for a better long version. I had deleted my build.rs, so I made a new one and added shadow-rs to the code.
Breaking it up Divide and Conquer When I was setting up my build.rs to use clap_mangen, I had to separate my CLI arg parser construct from the rest of my code and put it in a new file. I also realised that some of my code in my (basically) main function (change_leading_zeros()) was repetitive and could be extracted into functions. My change_leading_zeros() was extremely long and deserved its own file. Even after moving a ton of code into helpers.rs, it’s still 78 lines long, thoroughly violating Uncle Bob’s standards. (Granted, his standards are bad, and Uncle Bob could go trip on a log for all I care) I have never worked in a multi-file project before, not even for my Pong game, which is just 747 lines of code all in one file, and it could have easily been broken up into more files. I have a really fast scrolling speed on my laptop, to the point of it being almost unusable, so scrolling all the code in that project was annoying. Because I have never made a multi-file Rust project before, I had no idea what I was doing. I ran into a ton of errors, including my LSP stopping working, so I didn’t have autocomplete or clippy linting for one of my files for a bit, so I got even more confused. Now, fortunately, everything works now, and I even found some issues in my code (an if condition with an OR in which the first part of the OR was redundant; a for loop that instead could have been an iterator chain; a variable that stayed mutable after mutability was unnecessary), so it was an overall great success! Illiteracymaxxing Previously, I mentioned that the LZU operates off of a target length for file names, so having a schema like file01.txt project02.rs problem03.py wouldn’t work, but I was dead wrong. I haven’t worked on the project in a month and a half, and when reading over my code to see what it does, I mistook target as the target filename length, not the target length of the numeric portion. I thus removed the warnings associated with what I believed to be a behaviour of the LZU from the short help, long help, and README. The lesson is maybe to double-check with a friend or smth when you get confused by your own code.
Completionism A few days ago, I looked up clap on crates.io , and realised there were many crates built to add functionality to CLAP, like clap_mangen, clap-version-flag, and more. The two this devlog is about are clap_complete and clap_complete_nushell. These two allow for the generation of shell completions; clap_complete supports Bash, Zsh, Fish, Elvish, and PowerShell; clap_complete_nushell adds nushell support. The standard package has a new (in-development) feature that allows for the binary itself to be the completion script, allowing for more minimal user setup if downloading from crates.io†. The nushell version does not have this feature, so you have to run it with a special flag and save the output to a completions file in ~/.config/nushell/completions/leading-zero-util.nu. † crates.io doesn’t have an install step so it doesn’t look in the OUT_DIR at build time, so it doesn’t pick up files like the completion files. This same issue is why I chose not to use clap_mangen, since I only currently distribute through crates.io. If I later make a Homebrew tap, I’ll probably change the way the completions are done and re-add clap_mangen.
Much Abrew About Nothing Since the failure that was clap_mangen, I have been considering a homebrew release, because then I can more easily have the man files and completions be installed, and I would do homebrew specifically since it is the main package manager I use, and it kind of works on everything. I was using Claude Code to teach me how to create the tap, but I unfortunately ran through my limit and $100 of usage credits I got for free when Fable 5 dropped off my plan on a separate data entry task running with Claude Chrome, so I need to do some testing of the tap. See y’all next devlog!
Crack a Brewski with the Boys Much Abrew about Nothing, pt. 2 Got the homebrew tap working! Not much to say, except that it is a tad annoying to have to have a separate repo just for the tap. Compleated Because of the Homebrew tap, I decided to swap the non-nushell completions to a hidden flag, so you can run them with –generate-completions zsh/bash/fish/elvish/powershell to create the completions file, which the tap can do at install time for zsh, bash, and fish. Unfortunately, it can’t do it for elvish, powershell, or nushell, so you have to manually install completions for those three. Man(chester United) Because I now have a homebrew tap, installing man files is much easier. I brought back my old clap_mangen code for build.rs, and added a line to the formula, so now man generation works!
Testing, Testing, 1 2 3 Here’s what I’ve been working on to try to get a good, stable release. I Need an Extension I discovered that when doing the normalising add, the one that’s like problem-1.txt, problem-11.rs (-n 1) -> problem-01.txt, problem-11.rs (keeps the same total length of the numeric portion), it actually counts the extension characters, so the result would actually be problem-01.txt, problem-011.rs because the extensions are different lengths. Previously, the find_target() function was like this: pub fn find_target ( filenames : & Vec < String > , count : usize ) -> usize { let mut minimum = usize :: MAX ; for file in filenames { let ( dot_index , cond ) = check_file ( file ); if cond { continue ; } let split_index = find_split_index ( file , dot_index ); minimum = minimum .min ( file [ split_index .. ] .len ()); } minimum + count } Now, it’s pub fn find_target ( filenames : & Vec < String > , count : usize ) -> usize { let mut minimum = usize :: MAX ; let mut is_numeric : bool = false ; for file in filenames { let ( dot_index , cond ) = check_file ( file ); if cond { continue ; } let split_index = find_split_index ( file , dot_index ); minimum = minimum .min ( file [ split_index .. dot_index ] .len ()); is_numeric = true ; } if is_numeric { minimum + count } else { 0 } } Now the target isn’t the shortest number of characters in the numeric portion plus the extension, it’s just the extension. The is_numeric variable is just there so that it doesn’t try to add count to usize::MAX, getting an overflow if there are no files with numeric suffixes. sleep(); sleep(); sleep(); allTestsPass(); The last step before 1.0.0 is UNIT TESTS!!!!!! The easiest unit tests to write are ones for my functions in helpers.rs, including find_target(), check_file(), find_split_index(), and get_filenames(). I wrote 15 unit tests for the first three, and I might write some for get_filenames after I write some for change_leading_zeros(). While writing the unit tests, I stumbled upon the edge case for find_target if there are no applicable files, which is why I added the is_numeric above. The next step is writing the aforementioned unit tests for change_leading_zeros().
Testing Tests Hello again! I can’t believe we’re on devlog #8, considering I have been doing pretty sparse devlogs! if true { allTestsPass } IT’S UNIT TEST TIIIIIME!!! I added 13 unit tests to my big change_leading_zeros() function. They cover most, if not all, possible edge cases. Rename file11 -> file11 I discovered that in change_leading_zeros(), if the resulting new filename was the same as the old, would still do the rename, and it would count as a renamed file, so that the actual number of renamed files would be too large. Hating on for loops as much as the functional bros. I realised that my get_filenames() fn, which still has no unit tests, could be swapped to an iterator structure. old: pub fn get_filenames ( path : & Path ) -> Vec < String > { let mut names = Vec :: new (); if let Ok ( read_dir ) = fs :: read_dir ( path ) { for file in read_dir .flatten () { names .push ( file .file_name () .into_string () .unwrap_or ( "unknown name" .into ()), ); } } names } pub fn get_filenames ( path : & Path ) -> Vec < String > { fs :: read_dir ( path ) .into_iter () .flatten () .flatten () .map (| f | f .file_name () .into_string () .unwrap_or ( "unknown name" .into ())) .collect () } The two functions behave in exactly the same way, no unnecesary unwrap()s that may cause panics See y’all next devlog!
I’m Smart but I’m Bad at Taking Tests Hello again! You know what they say, new commit, new devlog! “[Test] Torsion” We got MORE UNIT TESTS!!! The get_filenames() fn was formerly the only function in helpers.rs that had no unit tests, so I added 6 unit tests for it. They have about the same general structure as the unit tests for change_leading_zeros(). Beautification I was trying to make my code prettier, and I accidentally screwed up an ownership issue. My unit tests made use of tempdirs with the tempfile crate to test change_leading_zeros() and get_filenames. This is the original pattern for getting the temp dir’s path: let binding = tempdir () .unwrap (); let dir = binding .path (); // stuff can be done with dir now This is what I changed it to: let dir = tempdir () .unwrap () .path () .to_owned (); When the tempdir gets dropped, it also deletes the directory, which makes dir a path to a dir that doesn’t exist. Everything compiles fine, but the code panics because the tempdir doesn’t exist. Override Something I forgot to mention in my last devlog is that if there was the files file1.txt and file01.txt, it (c/w)ould rename over one of the files and silently delete the file written over. I still have to fix this issue. I’ve wanted to learn Zig, so I looked up Zig crash courses on Youtube, and this is from the one I was watching.
Refactor I’m going to keep this one quick because it just got deleted for being too long. The previously mentioned behaviour of overwriting filenames has been fixed and has it’s own unit test now. It was given an exception before the actual rename. All the rename logic was duplicated between dec and !dec, so I flattened that. I pulled out the pre-rename exception logic into a new helper: skip_rename(). It needs unit tests of its own. Byyyeeeeee!!!
Drop it Like it’s Hot THIS IS THE FINAL DEVLOG!!!! We got a working release! After my last devlog, I added some unit tests for skip_rename(), and I added the Github default Rust workflow with some modifications to the repo to automatically test any new commits against the test suit, which is most of my codebase. Also added a test workflow to the homebrew tap so it’s easier to see that all is working.
Ships:
I made a utility to change the number of leading zeros in filenames! I was working on Project Euler and had to add a leading zero to all my filenames, which was tedious, so I made this!
Hello everyone! I was working on some Project Euler problems, and I realised that my solutions weren’t sorting correctly because they didn’t have any leading zeros in the numeric portion of their filenames. The same issue happened for my Advent of Code solutions once I hit day 10. I realised I could automate this, and the leading-zero-util was born. It slowly grew from a little, mediocre script to a decently-ish written CLI tool with proper unit tests, a Homebrew tap, a man page, and completions. If you want a better look at the development process than just the devlogs, please check out my commits on GitHub. If you are going to install the LZU, I also recommend that you use the Homebrew tap rather than the crates.io release, the instructions for which are in the README....
|
1793987741.288241
|
1794074141.288241
|
|
33445
|
My own site! by @maheen306shahzad | Stardance
|
maheen306shahzad
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My own site! by @maheen306shahzad | Stardan Title: My own site! by @maheen306shahzad | Stardance...
|
1793987740.397597
|
1794592540.397597
|
|
17905
|
Frictionless by @Sarthak_Lad | Stardance
|
Sarthak_Lad
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @Sarthak_Lad | Stardance
|
1793987739.509444
|
1794592539.509444
|
|
28169
|
NeWtAb by @Cris | Stardance
|
Cris
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-07T20:50:18Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a cool and simple new tab page built with Vite. While working on this project, I’ve been constantly learning JavaScript.", "repo": "https://github.com/crislazy/newtab", "demo": "https://newtab.webcris.icu/"}]...
|
[{"post_id": 24327, "ts": "202 [{"post_id": 24327, "ts": "2026-07-07T20:43:10Z", "hours": 2.5, "text": "Devlog 2 Last devlog before the first ship 🚀 In this devlog, I updated the UI a little bit but I also added a lot of new stuff. What’s new? The settings button is now in the bottom-left corner and opens a settings modal instead of expanding the page. The settings also include a link to the Stardance project and to my website. Added Quick Links where you can add your favorite websites for quick access, being saved in the localstorage. You can also delete them. (There is a name length limit of 35 characters) Added an actual banner and announcement that are retrieved from a GitHub repository: try { config = await fetch(\"https://raw.githubusercontent.com/crislazy/json-files/main/newtab.json\") .then(r => r.json()); } catch (e) { console.log(e) } And it gets back a JSON file like this: { \"banner\": \"https://user-cdn.hackclub-assets.com/019f3d65-e4e2-7493-aa1b-ff4c5b419d21/NeWtAb_Banner1.png\", \"announcement\": \"First ship #1\" } And, in case the banner couldn’t be loaded, there is a backup placeholder banner, just in case. I added a I feel lucky button that just redirects to a secret link I also removed the .env file as it wasn’t used I added the feature where you can search links like: https://example.com or http://example.com in the search bar and it would redirect to the website. Sadly URLs like example.com wont work… I also created a README file for the project as I forgot to make one before. AI declaration I get help from an AI agent for the Settings modal and for the Quick Links as I couldn’t make them work. As I mentioned, this will be the last devlog before shipping the project for the first time."}, {"post_id": 23060, "ts": "2026-07-05T19:57:57Z", "hours": 1.8875, "text": "Devlog 1 I currently added a clock, search bar and some settings. In the settings you can enable/disable if it opens a new tab or not when you search. Also you can switch the search engine from DuckDuckGo/Google/Bing. All the settings save in localstorage. I plan to add more stuff like shortcuts, calendar, an actual banner and more."}]...
|
Title: NeWtAb by @Cris | Stardance
Devlogs:
Devlo Title: NeWtAb by @Cris | Stardance
Devlogs:
Devlog 1 I currently added a clock, search bar and some settings. In the settings you can enable/disable if it opens a new tab or not when you search. Also you can switch the search engine from DuckDuckGo/Google/Bing. All the settings save in localstorage. I plan to add more stuff like shortcuts, calendar, an actual banner and more.
Devlog 2 Last devlog before the first ship 🚀 In this devlog, I updated the UI a little bit but I also added a lot of new stuff. What’s new? The settings button is now in the bottom-left corner and opens a settings modal instead of expanding the page. The settings also include a link to the Stardance project and to my website. Added Quick Links where you can add your favorite websites for quick access, being saved in the localstorage. You can also delete them. (There is a name length limit of 35 characters) Added an actual banner and announcement that are retrieved from a GitHub repository: try { config = await fetch("https://raw.githubusercontent.com/crislazy/json-files/main/newtab.json") .then(r => r.json()); } catch (e) { console.log(e) } And it gets back a JSON file like this: { "banner": "https://user-cdn.hackclub-assets.com/019f3d65-e4e2-7493-aa1b-ff4c5b419d21/NeWtAb_Banner1.png", "announcement": "First ship #1" } And, in case the banner couldn’t be loaded, there is a backup placeholder banner, just in case. I added a I feel lucky button that just redirects to a secret link I also removed the .env file as it wasn’t used I added the feature where you can search links like: https://example.com or http://example.com in the search bar and it would redirect to the website. Sadly URLs like example.com wont work… I also created a README file for the project as I forgot to make one before. AI declaration I get help from an AI agent for the Settings modal and for the Quick Links as I couldn’t make them work. As I mentioned, this will be the last devlog before shipping the project for the first time.
Ships:
I made a cool and simple new tab page built with Vite. While working on this project, I’ve been constantly learning JavaScript....
|
1793987738.3286247
|
1794074138.3286247
|
|
15160
|
RC AIRPLANE (SPITFIRE) by @senuja | Stardance
|
senuja
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: RC AIRPLANE (SPITFIRE) by @senuja | Stardan Title: RC AIRPLANE (SPITFIRE) by @senuja | Stardance...
|
1793987737.4529333
|
1794592537.4529333
|
|
30338
|
My own site! by @Neilkan | Stardance
|
Neilkan
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My own site! by @Neilkan | Stardance
|
1793987736.5685186
|
1794592536.5685186
|
|
851
|
Godot Shaders by @ahclip89 | Stardance
|
ahclip89
|
1
|
5.0
|
25
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-04T03:18:35Z", "hours": 5.0, "multiplier": 4.59, "payout": 25, "blessing": "neutral", "text": "I made a liquid generator with several sliders to customize it. This was my first time ever working with shaders and I learned a LOT. I plan on using shaders in some of my upcoming games and continue growing my skills.", "repo": "https://github.com/ahclip89/godot_shaders", "demo": "https://ahclip89.github.io/godot_shaders/build/web/"}]...
|
[{"post_id": 1881, "ts": "2026 [{"post_id": 1881, "ts": "2026-06-04T03:02:48Z", "hours": 2.5883, "text": "Using what I learned about shaders, I made a liquid editor with color and wave settings."}, {"post_id": 1171, "ts": "2026-06-03T00:48:57Z", "hours": 1.4681, "text": "I experimented with several effects to make a warpy glass thing and outlines. I also learned how to control shaders with a script and made a color selector."}, {"post_id": 650, "ts": "2026-06-02T05:20:52Z", "hours": 0.9008, "text": "I followed an intro to Godot shaders video and made a simple water shader."}, {"post_id": 552, "ts": "2026-06-02T01:30:20Z", "hours": 0.4575, "text": "I’m learning Godot shaders."}]...
|
Title: Godot Shaders by @ahclip89 | Stardance
Dev Title: Godot Shaders by @ahclip89 | Stardance
Devlogs:
I’m learning Godot shaders.
I followed an intro to Godot shaders video and made a simple water shader.
I experimented with several effects to make a warpy glass thing and outlines. I also learned how to control shaders with a script and made a color selector.
Using what I learned about shaders, I made a liquid editor with color and wave settings.
Ships:
I made a liquid generator with several sliders to customize it. This was my first time ever working with shaders and I learned a LOT. I plan on using shaders in some of my upcoming games and continue growing my skills....
|
1793987735.3725677
|
1794074135.3725677
|
|
4877
|
My first slack bot! by @Gunia | Stardance
|
Gunia
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @Gunia | Stardance
|
1793987734.4791033
|
1794592534.4791033
|
|
36217
|
idk by @renjiro | Stardance
|
renjiro
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: idk by @renjiro | Stardance
|
1793987731.6029208
|
1794592531.6029208
|
|
2100
|
My awesome macropad! by @Alondra | Stardance
|
Alondra
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Alondra | Stardanc Title: My awesome macropad! by @Alondra | Stardance...
|
1793987730.7126048
|
1794592530.7126048
|
|
29307
|
my APOD site by @sreerangshijoy3 | Stardance
|
sreerangshijoy3
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-03T05:58:05Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a website that displays NASA’s Astronomy Picture of the Day using their public API. The most challenging part was setting up the deployment and handling the API key securely. This was my first time working with APIs,", "repo": "https://github.com/sreerangshijoy3-cloud/my-APOD-site", "demo": "https://my-apod-site-1.vercel.app/"}]...
|
[{"post_id": 39899, "ts": "202 [{"post_id": 39899, "ts": "2026-08-03T05:53:41Z", "hours": 0.1053, "text": "I built a website that displays NASA’s Astronomy Picture of the Day using their public API.In this project, I worked on setting up a frontend application using Vite, fetching data from an external API, and dynamically displaying content like images, titles, and descriptions using JavaScript."}]...
|
Title: my APOD site by @sreerangshijoy3 | Stardanc Title: my APOD site by @sreerangshijoy3 | Stardance
Devlogs:
I built a website that displays NASA’s Astronomy Picture of the Day using their public API.In this project, I worked on setting up a frontend application using Vite, fetching data from an external API, and dynamically displaying content like images, titles, and descriptions using JavaScript.
Ships:
I made a website that displays NASA’s Astronomy Picture of the Day using their public API. The most challenging part was setting up the deployment and handling the API key securely. This was my first time working with APIs,...
|
1793987729.5453286
|
1794074129.5453286
|
|
20919
|
USS Enterprise CV-6 by @Troy | Stardance
|
Troy
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: USS Enterprise CV-6 by @Troy | Stardance
|
1793987728.6597457
|
1794592528.6597457
|
|
26594
|
Untitled by @ksgat | Stardance
|
ksgat
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @ksgat | Stardance
|
1793987727.7627437
|
1794592527.7627437
|
|
2112
|
AI-Generated Content detector by @isaprecieux112 | AI-Generated Content detector by @isaprecieux112 | Stardance...
|
isaprecieux112
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: AI-Generated Content detector by @isaprecie Title: AI-Generated Content detector by @isaprecieux112 | Stardance...
|
1793987726.5717266
|
1794592526.5717266
|
|
13627
|
My first slack bot! by @DJshelfmushroom | Stardanc My first slack bot! by @DJshelfmushroom | Stardance...
|
DJshelfmushroom
|
1
|
6.0
|
30
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-13T00:35:30Z", "hours": 6.0, "multiplier": 4.97, "payout": 30, "blessing": "neutral", "text": "This was a lot harder than I thought it would be, but honestly not that bad overall. I am not used to making projects that will actually go out into the world, so this is a first for me! Otherwise all features look to be good to go, so out into the world this slack bot goes!", "repo": "https://github.com/DJshelfmushroom/stardance-slackbot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0BA48WFSKD"}]...
|
[{"post_id": 7787, "ts": "2026 [{"post_id": 7787, "ts": "2026-06-13T00:23:56Z", "hours": 0.7544, "text": "Unsubscribing works, time to ship!"}, {"post_id": 7749, "ts": "2026-06-12T22:58:48Z", "hours": 4.2503, "text": "Scheduled cat messages working, time to make it possible to unsubscribe (like you would ever want to) This took way longer than it should’ve, Slack Bolt’s documentation is nonexistent."}, {"post_id": 5473, "ts": "2026-06-09T08:24:25Z", "hours": 0.3597, "text": "Got it up on Nest, running 24/7 now!"}, {"post_id": 5281, "ts": "2026-06-09T00:12:39Z", "hours": 0.3167, "text": "Damn I love cats. Random cat images!"}, {"post_id": 5259, "ts": "2026-06-08T23:41:26Z", "hours": 0.2744, "text": "Got the first command working, gonna add some of my own features next!"}]...
|
Title: My first slack bot! by @DJshelfmushroom | S Title: My first slack bot! by @DJshelfmushroom | Stardance
Devlogs:
Got the first command working, gonna add some of my own features next!
Damn I love cats. Random cat images!
Got it up on Nest, running 24/7 now!
Scheduled cat messages working, time to make it possible to unsubscribe (like you would ever want to) This took way longer than it should’ve, Slack Bolt’s documentation is nonexistent.
Unsubscribing works, time to ship!
Ships:
This was a lot harder than I thought it would be, but honestly not that bad overall. I am not used to making projects that will actually go out into the world, so this is a first for me! Otherwise all features look to be good to go, so out into the world this slack bot goes!...
|
1793987725.3891344
|
1794074125.3891344
|
|
7785
|
My awesome macropad! by @majaa | Stardance
|
majaa
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @majaa | Stardance
|
1793987724.494934
|
1794592524.494934
|
|
27496
|
Sign glove by @abdulla | Stardance
|
abdulla
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Sign glove by @abdulla | Stardance
|
1793987723.616111
|
1794592523.616111
|
|
23935
|
portfolio website by @professor | Stardance
|
professor
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: portfolio website by @professor | Stardance
|
1793987722.7356412
|
1794592522.7356412
|
|
11056
|
Project-SpaceGame by @akurainteractive | Stardance
|
akurainteractive
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Project-SpaceGame by @akurainteractive | St Title: Project-SpaceGame by @akurainteractive | Stardance...
|
1793987721.854627
|
1794592521.854627
|
|
14087
|
cosmic sticky notes by @realsaksham06 | Stardance
|
realsaksham06
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: cosmic sticky notes by @realsaksham06 | Sta Title: cosmic sticky notes by @realsaksham06 | Stardance...
|
1793987720.9766424
|
1794592520.9766424
|
|
2544
|
My awesome macropad! by @deeksha | Stardance
|
deeksha
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @deeksha | Stardanc Title: My awesome macropad! by @deeksha | Stardance...
|
1793987720.105827
|
1794592520.105827
|
|
4421
|
My awesome macropad! by @joycesusatyo | Stardance
|
joycesusatyo
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @joycesusatyo | Sta Title: My awesome macropad! by @joycesusatyo | Stardance...
|
1793987719.11979
|
1794592519.11979
|
|
26543
|
CroutonOS by @Krupam | Stardance
|
Krupam
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-27T02:24:06Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I am very proud of this project! This is a little website OS in order to learn about me. I have never coded in html, css or JS before so I am very proud. You can access it at: https://krupamc.github.io/croutonos/", "repo": "https://github.com/Krupamc/croutonos", "demo": "https://krupamc.github.io/croutonos/"}]...
|
[{"post_id": 16637, "ts": "202 [{"post_id": 16637, "ts": "2026-06-27T01:58:19Z", "hours": 3.5781, "text": "All finished with WebOS 1! My website hold a welcome page that can be dragged, opened (from icon), closed and can shift layers. The other app is how to contact me in about 5 ways!"}, {"post_id": 16525, "ts": "2026-06-26T21:46:12Z", "hours": 1.1353, "text": "Started to make my website!"}]...
|
Title: CroutonOS by @Krupam | Stardance
Devlogs:
Title: CroutonOS by @Krupam | Stardance
Devlogs:
Started to make my website!
All finished with WebOS 1! My website hold a welcome page that can be dragged, opened (from icon), closed and can shift layers. The other app is how to contact me in about 5 ways!
Ships:
I am very proud of this project! This is a little website OS in order to learn about me. I have never coded in html, css or JS before so I am very proud. You can access it at: https://krupamc.github.io/croutonos/...
|
1793987717.9377794
|
1794074117.9377794
|
|
38681
|
My very own WebOS by @sujay_robodev | Stardance
|
sujay_robodev
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @sujay_robodev | Stard Title: My very own WebOS by @sujay_robodev | Stardance...
|
1793987717.0439634
|
1794592517.0439634
|
|
32020
|
My awesome macropad! by @triple-colons | Stardance
|
triple-colons
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @triple-colons | St Title: My awesome macropad! by @triple-colons | Stardance...
|
1793987716.153456
|
1794592516.153456
|
|
6837
|
Untitled by @Moscow | Stardance
|
Moscow
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @Moscow | Stardance
|
1793987715.2729728
|
1794592515.2729728
|
|
22243
|
My awesome macropad! by @ismailmuhammad | Stardanc My awesome macropad! by @ismailmuhammad | Stardance...
|
ismailmuhammad
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @ismailmuhammad | S Title: My awesome macropad! by @ismailmuhammad | Stardance...
|
1793987714.3879263
|
1794592514.3879263
|
|
3589
|
Untitled project by @minhaz_eshan_abedin | Stardan Untitled project by @minhaz_eshan_abedin | Stardance...
|
minhaz_eshan_abedin
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @minhaz_eshan_abedin | Title: Untitled project by @minhaz_eshan_abedin | Stardance...
|
1793987713.5087657
|
1794592513.5087657
|
|
22802
|
Cosmo Sling by @Kartik_B | Stardance
|
Kartik_B
|
4
|
32.0
|
181
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-25T13:59:49Z", "hours": 2.0, "multiplier": 11.05, "payout": 23, "blessing": "neutral", "text": "This ships is all about the android build of the game. I have also fixed some bugs. i did a lot of playtesting in android.", "repo": "https://github.com/K-BIDDOLIYA/Cosmo-Slingshot", "demo": "https://kartik-biddoliya.itch.io/cosmo-sling"}, {"ship_num": 2, "ts": "2026-08-03T17:48:02Z", "hours": 8.0, "multiplier": 2.26, "payout": 18, "blessing": "neutral", "text": "Cosmo Sling is a 2D space arcade game where players pilot a spacecraft through hazardous space, dodging asteroids, black holes, and other cosmic dangers. This submission includes both Campaign and Endless modes, multiple selectable ships, polished UI, dynamic backgrounds, and improved gameplay and visual effects.", "repo": "https://github.com/K-BIDDOLIYA/Cosmo-Slingshot", "demo": "https://kartik-biddoliya.itch.io/cosmo-sling"}, {"ship_num": 3, "ts": "2026-07-19T17:06:15Z", "hours": 8.0, "multiplier": 7.58, "payout": 62, "blessing": "neutral", "text": "Cosmo Sling is a 2D physics-based space puzzle game where players launch a spaceship from Earth and use the gravitational pull of randomly generated planets to reach the destination. Throughout development, the project has evolved from a simple gravity prototype into a polished game with procedural level generation, multiple difficulty modes, accurate trajectory prediction, dynamic gravity physics, sound effects, UI menus (main menu, settings, pause, win/lose screens), camera improvements, and WebGL support. Continuous feedback and playtesting have led to numerous gameplay balancing, bug fixes, UI refinements, performance improvements, and overall polish, bringing the game close to its final release version.", "repo": "https://github.com/K-BIDDOLIYA/Cosmo-Slingshot", "demo": "https://kartik-biddoliya.itch.io/cosmo-sling"}, {"ship_num": 4, "ts": "2026-07-05T15:09:17Z", "hours": 14.0, "multiplier": 5.54, "payout": 78, "blessing": "neutral", "text": "I made Cosmo Sling, a 2D physics-based space game where you get one launch to reach the destination planet. Randomly generated planets use gravity to curve your ship’s path, with four difficulty modes ranging from 1–6 planets. The most challenging parts were building the gravity system, random level generation, keeping the game working across different screen sizes, and fixing scene/UI issues. I’m most proud of getting the complete game polished and shipped with sound, settings, pause/restart controls, and a Windows build. To test it, download the game, unzip it, and run Cosmo Sling.exe. Click and drag to aim, release to launch, press P to pause, and R to restart anytime.", "repo": "https://github.com/K-BIDDOLIYA/Cosmo-Slingshot", "demo": "https://kartik-biddoliya.itch.io/cosmo-sling"}]...
|
[{"post_id": 73532, "ts": "202 [{"post_id": 73532, "ts": "2026-09-25T10:26:39Z", "hours": 2.1081, "text": "I added the android build also. trust me its better that the image below"}, {"post_id": 40258, "ts": "2026-08-03T17:45:43Z", "hours": 2.5464, "text": "Upgrade Devlog - #3 Just completed the game, upgraded the ui, selection of ships and a new gamemode. i will not add anything to this game anymore. This game is complete for me. This is the End!"}, {"post_id": 38955, "ts": "2026-08-01T16:00:25Z", "hours": 3.0036, "text": "Upgrading Devlog -#2 I added nebula that will come and try to block your vision. Also, i added blackhole but its not fully developed yet. You can see this perfectly timed image of the game that will show all of the upgrades"}, {"post_id": 38708, "ts": "2026-08-01T07:45:19Z", "hours": 2.2847, "text": "Upgrading devlog - #1 I just woke up and decided to upgrade the game and add an endless mode also. I will work on more upgrades like - mutiple ships, game control etc. This is what has been completed till now: Endless bg. Ship movement by WASD. Asteroids."}, {"post_id": 31330, "ts": "2026-07-19T17:03:54Z", "hours": 2.7847, "text": "After first ship devlog - #4 I have successfully fixed all of the issues pointed out in the feedback. Here’s what i did: Implemented the core gravity slingshot mechanic. Added procedural planet generation and difficulty levels. Improved ship launch controls and aiming. Made the trajectory prediction smoother and more accurate. Fixed multiple gameplay bugs (launch, collisions, UI, camera). Added pause menu, settings, win and lose screens. Improved audio system with sound effects and music controls. Balanced gravity strength and gameplay difficulty. Refined ship movement and collision handling. Fixed camera positioning and gameplay visibility issues. Optimized the game for WebGL and browser compatibility. Resolved UI scaling and resolution problems based on testing feedback. Added overall polish and prepared the game for release. Special thanks to @PAPER_01 for following this journey and encouraging me."}, {"post_id": 30668, "ts": "2026-07-18T13:15:24Z", "hours": 0.8947, "text": "After ship devlog - #3 Just fixed the win/lose panels. I’ll add WebGL very soon."}, {"post_id": 30142, "ts": "2026-07-17T14:09:06Z", "hours": 2.9939, "text": "After ship devlog - #2 I’ve just fixed 40% of the issues ya’ll pointed in the first ship and tried my best to work on your feedbacks."}, {"post_id": 25919, "ts": "2026-07-10T12:39:22Z", "hours": 0.8697, "text": "After ship devlog - #1 Started working on the feedback from the first players today. I fixed the difficulty system so each mode now spawns the correct number of planets, fixed the pause menu not appearing properly the first time, and stopped the win/lose sounds from repeating. I also fixed the music and sound toggles so they stay independent and sync correctly, and optimized the gravity system by caching the planets once per level instead of searching for them every physics frame. Still a lot more feedback to work through, but the game is already becoming much more stable and polished. I will ship the game again after fixes and some more firey upgrades."}, {"post_id": 23386, "ts": "2026-07-06T09:44:29Z", "hours": 0.6711, "text": "Devlog – I’m Shipping Again My first ship was sent back with changes requested because I accidentally forgot to mention my AI usage in the submission. I’ve now corrected that and am resubmitting the project with the proper information. There is also a second Hackatime project because I changed the Unity project/company name from Cosmo Slingshot to Cosmo Sling near the end of development. Hackatime detected the renamed project as a new project instead of continuing to track time under the original one. So the two Hackatime projects are both for the same game: Cosmo Slingshot — most of the development time Cosmo Sling — final changes after the rename This is not a second game or a duplicate project—just the same project being tracked under two names."}, {"post_id": 22890, "ts": "2026-07-05T15:03:01Z", "hours": 3.5681, "text": "Final Devlog – Cosmo Sling Shipped 🚀 Today I finished and shipped Cosmo Sling! I completed the final polish, including: Background music and sound effects Music and sound toggles with saved settings Pause menu and win/lose states Final UI fixes and screen scaling Game icon and branding Windows build and final testing After fixing the last build and resolution issues, I packaged the complete game and published it on itch.io. Cosmo Sling is officially finished and shipped!"}, {"post_id": 22151, "ts": "2026-07-04T13:53:14Z", "hours": 3.4792, "text": "Devlog #5 – UI & Visual Polish Today I focused on improving Cosmo Sling’s visuals and UI. Added a new pixel-art settings panel. Created Music and Sound toggles with blue/white visual states. Improved the menu’s space-themed design. Added an infinitely moving space background. Fixed several issues related to camera bounds, level generation, launching, and missing audio references. The game is now starting to look much more polished and consistent with its space theme."}, {"post_id": 19287, "ts": "2026-06-30T15:38:42Z", "hours": 4.1344, "text": "Devlog #4 – Big Progress on Cosmo Sling I completely forgot to write two day’s devlog while working 😅. I spent around 3–4 hours developing the game, so here’s a recap of everything I got done. Project Update Development on Cosmo Sling has been progressing really well. The core gameplay loop is now in place and the project feels much more like a real game than just a prototype. Gameplay Finished the one-shot launch mechanic. Improved the aiming system with a visual aim line. Added gravity that pulls the spaceship toward nearby planets. Implemented procedural generation of gravity planets based on the selected difficulty. Added random planet sizes and gravity strengths. Added minimum spacing between generated planets to reduce overlap. Game Systems Added a proper Game Manager and Level Manager. Added win and lose conditions. Implemented a hull (health) system. Added boundary collisions with hull damage. Added restart functionality and pause menu. UI Created the HUD to display hull information. Added Win and Game Over panels. Added buttons for restarting and returning to the main menu. Visual Polish Added planet spawn animations. Added a launch animation for the spaceship. Added a pulsing effect to the destination planet. Added an explosion effect when the ship is destroyed. Challenges There were a few bugs along the way, mostly related to script references, gravity generation, and scene setup. After tracking them down and fixing them, the project is much more stable and easier to build on. Next Steps The next goal is to improve the game’s presentation by adding camera effects, audio, particle effects, and a more polished background. After that, I’ll focus on balancing gameplay and polishing the overall experience before release. Overall, today’s session was very productive, and Cosmo Sling is steadily becoming a complete and polished game."}, {"post_id": 17455, "ts": "2026-06-28T07:31:55Z", "hours": 1.565, "text": "Devlog #3 - Fresh Start After running into a few issues with the original project setup, I decided it was better to rebuild everything from scratch instead of trying to patch things up. Along with the fresh start, I also renamed the game from Gravity Sling to Cosmo Sling—I think it fits the space theme much better. This is also my first time working on the project again after a pretty long break, so it feels great to finally get back into development. What I worked on today: 🔄 Rebuilt the project from scratch with a cleaner structure. 🚀 Renamed the game to Cosmo Sling. 📁 Organized the project folders for easier development. 🌍 Set up the Earth, spaceship, launch point, and core scene. 🎯 Implemented the click-and-drag launch mechanic. 📏 Added a launch trajectory line. 🛠️ Refactored the launch system into a dedicated Launch Manager for a cleaner architecture. 🧹 Fixed several early issues, including launch direction, spawn position, and ship interactions with Earth. The core launch mechanic is now working, which gives me a solid foundation for the next step: implementing planetary gravity and procedural level generation. Looking forward to making the first playable prototype!"}, {"post_id": 12600, "ts": "2026-06-20T16:07:40Z", "hours": 0.8, "text": "🚀 Gravity Sling — Devlog #2 Made progress on the game scene. Added: Earth and destination planet Spaceship setup Screen Boundaries Basic in-game UI The game is still static for now, but the playground for the core mechanic is finally ready. Next step: launching the ship and seeing gravity do its thing. #gamedev #unity #GravitySling #indiedev"}, {"post_id": 12505, "ts": "2026-06-20T13:01:23Z", "hours": 0.5, "text": "Gravity Sling — Devlog #1 Started work on a new Unity project: Gravity Sling. Today was mostly about building the foundation. The main menu is now up and running with: Start menu Difficulty selection Settings panel Audio controls Nothing flashy yet, but every game starts somewhere. The core idea revolves around launching a spacecraft and using the environment to reach a distant destination. I’m keeping the details secret for now because discovering the mechanics is part of the fun. Next up: bringing the actual gameplay to life and seeing if the physics feels as satisfying as it does in my head. Built with Unity.#gamedev #unity #indiedev #stardance #GravitySling"}]...
|
Title: Cosmo Sling by @Kartik_B | Stardance
Devlo Title: Cosmo Sling by @Kartik_B | Stardance
Devlogs:
Gravity Sling — Devlog #1 Started work on a new Unity project: Gravity Sling. Today was mostly about building the foundation. The main menu is now up and running with: Start menu Difficulty selection Settings panel Audio controls Nothing flashy yet, but every game starts somewhere. The core idea revolves around launching a spacecraft and using the environment to reach a distant destination. I’m keeping the details secret for now because discovering the mechanics is part of the fun. Next up: bringing the actual gameplay to life and seeing if the physics feels as satisfying as it does in my head. Built with Unity.#gamedev #unity #indiedev #stardance #GravitySling
🚀 Gravity Sling — Devlog #2 Made progress on the game scene. Added: Earth and destination planet Spaceship setup Screen Boundaries Basic in-game UI The game is still static for now, but the playground for the core mechanic is finally ready. Next step: launching the ship and seeing gravity do its thing. #gamedev #unity #GravitySling #indiedev
Devlog #3 - Fresh Start After running into a few issues with the original project setup, I decided it was better to rebuild everything from scratch instead of trying to patch things up. Along with the fresh start, I also renamed the game from Gravity Sling to Cosmo Sling—I think it fits the space theme much better. This is also my first time working on the project again after a pretty long break, so it feels great to finally get back into development. What I worked on today: 🔄 Rebuilt the project from scratch with a cleaner structure. 🚀 Renamed the game to Cosmo Sling. 📁 Organized the project folders for easier development. 🌍 Set up the Earth, spaceship, launch point, and core scene. 🎯 Implemented the click-and-drag launch mechanic. 📏 Added a launch trajectory line. 🛠️ Refactored the launch system into a dedicated Launch Manager for a cleaner architecture. 🧹 Fixed several early issues, including launch direction, spawn position, and ship interactions with Earth. The core launch mechanic is now working, which gives me a solid foundation for the next step: implementing planetary gravity and procedural level generation. Looking forward to making the first playable prototype!
Devlog #4 – Big Progress on Cosmo Sling I completely forgot to write two day’s devlog while working 😅. I spent around 3–4 hours developing the game, so here’s a recap of everything I got done. Project Update Development on Cosmo Sling has been progressing really well. The core gameplay loop is now in place and the project feels much more like a real game than just a prototype. Gameplay Finished the one-shot launch mechanic. Improved the aiming system with a visual aim line. Added gravity that pulls the spaceship toward nearby planets. Implemented procedural generation of gravity planets based on the selected difficulty. Added random planet sizes and gravity strengths. Added minimum spacing between generated planets to reduce overlap. Game Systems Added a proper Game Manager and Level Manager. Added win and lose conditions. Implemented a hull (health) system. Added boundary collisions with hull damage. Added restart functionality and pause menu. UI Created the HUD to display hull information. Added Win and Game Over panels. Added buttons for restarting and returning to the main menu. Visual Polish Added planet spawn animations. Added a launch animation for the spaceship. Added a pulsing effect to the destination planet. Added an explosion effect when the ship is destroyed. Challenges There were a few bugs along the way, mostly related to script references, gravity generation, and scene setup. After tracking them down and fixing them, the project is much more stable and easier to build on. Next Steps The next goal is to improve the game’s presentation by adding camera effects, audio, particle effects, and a more polished background. After that, I’ll focus on balancing gameplay and polishing the overall experience before release. Overall, today’s session was very productive, and Cosmo Sling is steadily becoming a complete and polished game.
Devlog #5 – UI & Visual Polish Today I focused on improving Cosmo Sling’s visuals and UI. Added a new pixel-art settings panel. Created Music and Sound toggles with blue/white visual states. Improved the menu’s space-themed design. Added an infinitely moving space background. Fixed several issues related to camera bounds, level generation, launching, and missing audio references. The game is now starting to look much more polished and consistent with its space theme.
Final Devlog – Cosmo Sling Shipped 🚀 Today I finished and shipped Cosmo Sling! I completed the final polish, including: Background music and sound effects Music and sound toggles with saved settings Pause menu and win/lose states Final UI fixes and screen scaling Game icon and branding Windows build and final testing After fixing the last build and resolution issues, I packaged the complete game and published it on itch.io. Cosmo Sling is officially finished and shipped!
Devlog – I’m Shipping Again My first ship was sent back with changes requested because I accidentally forgot to mention my AI usage in the submission. I’ve now corrected that and am resubmitting the project with the proper information. There is also a second Hackatime project because I changed the Unity project/company name from Cosmo Slingshot to Cosmo Sling near the end of development. Hackatime detected the renamed project as a new project instead of continuing to track time under the original one. So the two Hackatime projects are both for the same game: Cosmo Slingshot — most of the development time Cosmo Sling — final changes after the rename This is not a second game or a duplicate project—just the same project being tracked under two names.
After ship devlog - #1 Started working on the feedback from the first players today. I fixed the difficulty system so each mode now spawns the correct number of planets, fixed the pause menu not appearing properly the first time, and stopped the win/lose sounds from repeating. I also fixed the music and sound toggles so they stay independent and sync correctly, and optimized the gravity system by caching the planets once per level instead of searching for them every physics frame. Still a lot more feedback to work through, but the game is already becoming much more stable and polished. I will ship the game again after fixes and some more firey upgrades.
After ship devlog - #2 I’ve just fixed 40% of the issues ya’ll pointed in the first ship and tried my best to work on your feedbacks.
After ship devlog - #3 Just fixed the win/lose panels. I’ll add WebGL very soon.
After first ship devlog - #4 I have successfully fixed all of the issues pointed out in the feedback. Here’s what i did: Implemented the core gravity slingshot mechanic. Added procedural planet generation and difficulty levels. Improved ship launch controls and aiming. Made the trajectory prediction smoother and more accurate. Fixed multiple gameplay bugs (launch, collisions, UI, camera). Added pause menu, settings, win and lose screens. Improved audio system with sound effects and music controls. Balanced gravity strength and gameplay difficulty. Refined ship movement and collision handling. Fixed camera positioning and gameplay visibility issues. Optimized the game for WebGL and browser compatibility. Resolved UI scaling and resolution problems based on testing feedback. Added overall polish and prepared the game for release. Special thanks to @PAPER_01 for following this journey and encouraging me.
Upgrading devlog - #1 I just woke up and decided to upgrade the game and add an endless mode also. I will work on more upgrades like - mutiple ships, game control etc. This is what has been completed till now: Endless bg. Ship movement by WASD. Asteroids.
Upgrading Devlog -#2 I added nebula that will come and try to block your vision. Also, i added blackhole but its not fully developed yet. You can see this perfectly timed image of the game that will show all of the upgrades
Upgrade Devlog - #3 Just completed the game, upgraded the ui, selection of ships and a new gamemode. i will not add anything to this game anymore. This game is complete for me. This is the End!
I added the android build also. trust me its better that the image below
Ships:
I made Cosmo Sling, a 2D physics-based space game where you get one launch to reach the destination planet. Randomly generated planets use gravity to curve your ship’s path, with four difficulty modes ranging from 1–6 planets. The most challenging parts were building the gravity system, random level generation, keeping the game working across different screen sizes, and fixing scene/UI issues. I’m most proud of getting the complete game polished and shipped with sound, settings, pause/restart controls, and a Windows build. To test it, download the game, unzip it, and run Cosmo Sling.exe. Click and drag to aim, release to launch, press P to pause, and R to restart anytime.
Cosmo Sling is a 2D physics-based space puzzle game where players launch a spaceship from Earth and use the gravitational pull of randomly generated planets to reach the destination. Throughout development, the project has evolved from a simple gravity prototype into a polished game with procedural level generation, multiple difficulty modes, accurate trajectory prediction, dynamic gravity physics, sound effects, UI menus (main menu, settings, pause, win/lose screens), camera improvements, and WebGL support. Continuous feedback and playtesting have led to numerous gameplay balancing, bug fixes, UI refinements, performance improvements, and overall polish, bringing the game close to its final release version.
Cosmo Sling is a 2D space arcade game where players pilot a spacecraft through hazardous space, dodging asteroids, black holes, and other cosmic dangers. This submission includes both Campaign and Endless modes, multiple selectable ships, polished UI, dynamic backgrounds, and improved gameplay and visual effects.
This ships is all about the android build of the game. I have also fixed some bugs. i did a lot of playtesting in android....
|
1793987712.205287
|
1794074112.205287
|
|
34762
|
Dira by @soomit | Stardance
|
soomit
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Dira by @soomit | Stardance
|
1793987711.345314
|
1794592511.345314
|
|
14863
|
WebOS by OS :) by @TXJ_PROGRAMER | Stardance
|
TXJ_PROGRAMER
|
4
|
34.0
|
74
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-27T03:32:59Z", "hours": 10.0, "multiplier": 6.27, "payout": 61, "blessing": "neutral", "text": "i added more features and fixed some bugs . Ii added games like snake, 2048, minesweeper", "repo": "https://github.com/srinj-ai/WebOS-portfolio", "demo": "https://web-os-portfolio-lake.vercel.app/"}, {"ship_num": 2, "ts": "2026-08-26T14:06:12Z", "hours": 23.0, "multiplier": 2.91, "payout": 11, "blessing": "neutral", "text": "Its a WebOS made to experement and experence a OS ina website.", "repo": "https://github.com/srinj-ai/WebOS-portfolio", "demo": "https://web-os-portfolio-lake.vercel.app/"}, {"ship_num": 3, "ts": "2026-06-23T10:02:08Z", "hours": 0.0, "multiplier": 8.23, "payout": 2, "blessing": "neutral", "text": "Its a WebOS made to experement and experence a OS ina website.", "repo": "https://github.com/srinj-ai/WebOS-portfolio", "demo": "https://web-os-portfolio-lake.vercel.app/"}, {"ship_num": 4, "ts": "2026-06-23T05:03:46Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Its a WebOS made to experement and experence a OS ina website.", "repo": "https://github.com/srinj-ai/WebOS-portfolio", "demo": "https://web-os-portfolio-lake.vercel.app/"}]...
|
[{"post_id": 74272, "ts": "202 [{"post_id": 74272, "ts": "2026-09-27T03:30:56Z", "hours": 5.0336, "text": "Dev Vlog #10 — Added Minesweeper! 💣 Hey everyone, welcome back to another WebOS update! This time I made another classic game, Minesweeper . Some lines of code to make the mines and tile revealing work, like: const revealCell = ( row : number , col : number ) => { if ( board [ row ][ col ]. isMine ) { setGameStatus ( ' lost ' ); return ; } const newBoard = board . map (( r ) => [... r ]); newBoard [ row ][ col ]. isRevealed = true ; setBoard ( newBoard ); }; The game now has tile movement, merging tiles, and adding new tiles after each move. it was too hard to set the tile screen and mines & it still have bugs , but its good for now and i am gona a ship it 😋😋"}, {"post_id": 73917, "ts": "2026-09-26T09:54:03Z", "hours": 1.1503, "text": "JUST A QUICK CAPUP just to remind u guys to I fixed some lag issue abt 2048 and snake and added both to CMD :)"}, {"post_id": 73124, "ts": "2026-09-24T13:18:57Z", "hours": 0.3172, "text": "Dev Vlog #9 — Added 2048 Game! Hey everyone, welcome back to another WebOS update! This time I made another popular game, 2048 . Some lines of code to make the tiles move and merge, like: const moveRow = ( row : number []) => { const filtered = row . filter (( value ) => value !== 0 ); const result : number [] = []; for ( let i = 0 ; i < filtered . length ; i ++ ) { if ( filtered [ i ] === filtered [ i + 1 ]) { result . push ( filtered [ i ] * 2 ); i ++ ; } else { result . push ( filtered [ i ]); } } while ( result . length < 4 ) { result . push ( 0 ); } return result ; }; I changed my mind at last to shift form minesweeper It was pretty fun making 2048 and getting the tile movement and merging to work properly inside WebOS. i will make minesweeper now!!!!!!"}, {"post_id": 62751, "ts": "2026-09-06T08:28:04Z", "hours": 3.295, "text": "Dev Vlog #9 — Added Snake Game! Hey everyone, welcome back to another WebOS update! This time I made a game, quite a popular one, Snake Game. Some lines of code to make its movement and food growth work, like: currentWindows . map (( appWindow ) => { const game = appWindow . gameState ?. snake ; if ( ! game || game . status !== ' playing ' ) return appWindow ; const head = game . body [ 0 ]; const direction = game . nextDirection ; const nextHead = { x : ( head . x + direction . x + SNAKE_SIZE ) % SNAKE_SIZE , y : ( head . y + direction . y + SNAKE_SIZE ) % SNAKE_SIZE , }; const hitSelf = game . body . some ( ( point ) => point . x === nextHead . x && point . y === nextHead . y ); if ( hitSelf ) { return { ... appWindow , gameState : { ... appWindow . gameState , snake : { ... game , status : ' lost ' }, }, }; } It does not die when it hits the wall, but ends up on the other side of the screen. It dies when it hits itself. OK then , its all for today if will make minesweeper next it may take AI to help , but i will try my best 🤧🤧"}, {"post_id": 54533, "ts": "2026-08-25T15:44:14Z", "hours": 20.9406, "text": "Dev Vlog #8 — Finally Working! Hey everyone, welcome back to another WebOS update! I have fully compleated my terminal and going for a ship please support and enjoy thank u all and bye!!! XD"}, {"post_id": 23367, "ts": "2026-07-06T09:14:41Z", "hours": 0.6261, "text": "Dev Vlog #7 — Terminal is Finally Working! Hey everyone, welcome back to another WebOS update! This time I finished one of the apps I was most excited abt the : Terminal . It can now run basic commands and works right inside the WebOS window system. Current commands include: help — Shows all available commands clear — Clears the terminal about — Gives a short description about the project XD date — Shows the current date and time apps — Shows all the available apps files — Shows all available files stored open notepad — Opens Notepad open calculator — Opens Calculator open files — Opens Files open portfolio — Redirects website to my portfolio https://srinj-ai.github.io/MY-PORTFOLIO/ XD Getting all of these commands working took a lot more logic than I expected, but it was definitely worth it. Next, I’m planning to add more commands, improve the desktop, and keep making WebOS feel more like a real operating system. thank u all and bye!!! XD"}, {"post_id": 22678, "ts": "2026-07-05T07:18:57Z", "hours": 0.6128, "text": "Dev Vlog #6 — File Explorer is Finally Done! Hey everyone, welcome back to another WebOS update! it took longer than I expected, but it finally work . it Stores the file created by notebook and displaces it in file explorer NEXT Next, I’ll be working on adding more apps like CMD ( i think so). There’s still a lot I want to add, and plese give me suggestion what to add next. bye see in the next one !!"}, {"post_id": 17428, "ts": "2026-06-28T06:26:47Z", "hours": 0.3492, "text": "DevLog #5 Minor bug fix and Notepad update Hey everyone, welcome back to another WebOS update! i have fix some bugs related to calcylator and notepad i also changed the colour of text in notepad so you gays can have a hacker vibe :)"}, {"post_id": 14266, "ts": "2026-06-23T09:21:18Z", "hours": 0.2822, "text": "Dev Vlog #4 — Last-Minute Fixes Before Release 🚀 Hey everyone, welcome back to another WebOS update! This update was mostly about fixing things before release. Changes Made Fixed photo issues Fixed source code issues Honestly, there’s not much to show in this update, but these fixes were important to get done before shipping. Hopefully everything goes well and it gets accepted Project Status: 🟢 Release Ready"}, {"post_id": 12961, "ts": "2026-06-21T06:45:19Z", "hours": 0.5425, "text": "Dev Vlog #3 — WebOS is Ready to Ship 🚀 After weeks of coding, fixing bugs, and adding features, WebOS is finally finished and ready to ship! WebOS is a browser-based desktop experience built with React, TypeScript, and Vite. The goal was simple: make something that feels like a real operating system while running entirely in the browser. Features Desktop-style operating system interface Draggable and focusable application windows Notepad Calculator About/Welcome App Start Menu Live taskbar clock Active window management Window controls (open, close) Responsive design With everything planned now completed, WebOS v1 is officially finished and ready to ship. 🎉 Thanks to everyone who followed the project and read the devlogs along the way. This is the end of the WebOS v1 journey, and now let’s see if all the hard work pays off and how people react to it. Project Status: 🟢 Ready to Ship"}, {"post_id": 12386, "ts": "2026-06-20T06:54:44Z", "hours": 0.4369, "text": "Dev Vlog #2 — Calculator is Done! Hey everyone, welcome back to another WebOS update! Since the last devlog, I’ve finished the second app : a Calculator !!! . It can: Perform basic calculations Use multiple operators in one expression Handle parentheses correctly Display accurate results Run inside the WebOS window system One thing I’m pretty happy with is that it doesn’t use JavaScript’s built-in eval() function. Instead, it processes expressions itself, which gives me more control over how calculations work. Next, I’ll be improving the window system and starting work on a File Explorer. Project Status: 🟡 Early Development ALSO FOLLOW MY “VORTEX AI” PROJECT"}, {"post_id": 6211, "ts": "2026-06-10T13:02:02Z", "hours": 0.3842, "text": "Dev Vlog #1 — Notepad is Done! 🚀 Hey everyone, welcome to the first WebOS devlog! I’ve finished the first app for WebOS: Notepad . Right now, it lets you: Open it from the desktop Type and edit text Use it as a simple note-taking app Experience the first working WebOS window I’m also working on improving the desktop, fixing bugs, and planning the next features. Next up: Taskbar Calculator WebOS is still in the very early stages, but it’s nice to finally have the first app up and running. Project Status: 🟡 Early Development"}]...
|
Title: WebOS by OS :) by @TXJ_PROGRAMER | Stardanc Title: WebOS by OS :) by @TXJ_PROGRAMER | Stardance
Devlogs:
Dev Vlog #1 — Notepad is Done! 🚀 Hey everyone, welcome to the first WebOS devlog! I’ve finished the first app for WebOS: Notepad . Right now, it lets you: Open it from the desktop Type and edit text Use it as a simple note-taking app Experience the first working WebOS window I’m also working on improving the desktop, fixing bugs, and planning the next features. Next up: Taskbar Calculator WebOS is still in the very early stages, but it’s nice to finally have the first app up and running. Project Status: 🟡 Early Development
Dev Vlog #2 — Calculator is Done! Hey everyone, welcome back to another WebOS update! Since the last devlog, I’ve finished the second app : a Calculator !!! . It can: Perform basic calculations Use multiple operators in one expression Handle parentheses correctly Display accurate results Run inside the WebOS window system One thing I’m pretty happy with is that it doesn’t use JavaScript’s built-in eval() function. Instead, it processes expressions itself, which gives me more control over how calculations work. Next, I’ll be improving the window system and starting work on a File Explorer. Project Status: 🟡 Early Development ALSO FOLLOW MY “VORTEX AI” PROJECT
Dev Vlog #3 — WebOS is Ready to Ship 🚀 After weeks of coding, fixing bugs, and adding features, WebOS is finally finished and ready to ship! WebOS is a browser-based desktop experience built with React, TypeScript, and Vite. The goal was simple: make something that feels like a real operating system while running entirely in the browser. Features Desktop-style operating system interface Draggable and focusable application windows Notepad Calculator About/Welcome App Start Menu Live taskbar clock Active window management Window controls (open, close) Responsive design With everything planned now completed, WebOS v1 is officially finished and ready to ship. 🎉 Thanks to everyone who followed the project and read the devlogs along the way. This is the end of the WebOS v1 journey, and now let’s see if all the hard work pays off and how people react to it. Project Status: 🟢 Ready to Ship
Dev Vlog #4 — Last-Minute Fixes Before Release 🚀 Hey everyone, welcome back to another WebOS update! This update was mostly about fixing things before release. Changes Made Fixed photo issues Fixed source code issues Honestly, there’s not much to show in this update, but these fixes were important to get done before shipping. Hopefully everything goes well and it gets accepted Project Status: 🟢 Release Ready
DevLog #5 Minor bug fix and Notepad update Hey everyone, welcome back to another WebOS update! i have fix some bugs related to calcylator and notepad i also changed the colour of text in notepad so you gays can have a hacker vibe :)
Dev Vlog #6 — File Explorer is Finally Done! Hey everyone, welcome back to another WebOS update! it took longer than I expected, but it finally work . it Stores the file created by notebook and displaces it in file explorer NEXT Next, I’ll be working on adding more apps like CMD ( i think so). There’s still a lot I want to add, and plese give me suggestion what to add next. bye see in the next one !!
Dev Vlog #7 — Terminal is Finally Working! Hey everyone, welcome back to another WebOS update! This time I finished one of the apps I was most excited abt the : Terminal . It can now run basic commands and works right inside the WebOS window system. Current commands include: help — Shows all available commands clear — Clears the terminal about — Gives a short description about the project XD date — Shows the current date and time apps — Shows all the available apps files — Shows all available files stored open notepad — Opens Notepad open calculator — Opens Calculator open files — Opens Files open portfolio — Redirects website to my portfolio https://srinj-ai.github.io/MY-PORTFOLIO/ XD Getting all of these commands working took a lot more logic than I expected, but it was definitely worth it. Next, I’m planning to add more commands, improve the desktop, and keep making WebOS feel more like a real operating system. thank u all and bye!!! XD
Dev Vlog #8 — Finally Working! Hey everyone, welcome back to another WebOS update! I have fully compleated my terminal and going for a ship please support and enjoy thank u all and bye!!! XD
Dev Vlog #9 — Added Snake Game! Hey everyone, welcome back to another WebOS update! This time I made a game, quite a popular one, Snake Game. Some lines of code to make its movement and food growth work, like: currentWindows . map (( appWindow ) => { const game = appWindow . gameState ?. snake ; if ( ! game || game . status !== ' playing ' ) return appWindow ; const head = game . body [ 0 ]; const direction = game . nextDirection ; const nextHead = { x : ( head . x + direction . x + SNAKE_SIZE ) % SNAKE_SIZE , y : ( head . y + direction . y + SNAKE_SIZE ) % SNAKE_SIZE , }; const hitSelf = game . body . some ( ( point ) => point . x === nextHead . x && point . y === nextHead . y ); if ( hitSelf ) { return { ... appWindow , gameState : { ... appWindow . gameState , snake : { ... game , status : ' lost ' }, }, }; } It does not die when it hits the wall, but ends up on the other side of the screen. It dies when it hits itself. OK then , its all for today if will make minesweeper next it may take AI to help , but i will try my best 🤧🤧
Dev Vlog #9 — Added 2048 Game! Hey everyone, welcome back to another WebOS update! This time I made another popular game, 2048 . Some lines of code to make the tiles move and merge, like: const moveRow = ( row : number []) => { const filtered = row . filter (( value ) => value !== 0 ); const result : number [] = []; for ( let i = 0 ; i < filtered . length ; i ++ ) { if ( filtered [ i ] === filtered [ i + 1 ]) { result . push ( filtered [ i ] * 2 ); i ++ ; } else { result . push ( filtered [ i ]); } } while ( result . length < 4 ) { result . push ( 0 ); } return result ; }; I changed my mind at last to shift form minesweeper It was pretty fun making 2048 and getting the tile movement and merging to work properly inside WebOS. i will make minesweeper now!!!!!!
JUST A QUICK CAPUP just to remind u guys to I fixed some lag issue abt 2048 and snake and added both to CMD :)
Dev Vlog #10 — Added Minesweeper! 💣 Hey everyone, welcome back to another WebOS update! This time I made another classic game, Minesweeper . Some lines of code to make the mines and tile revealing work, like: const revealCell = ( row : number , col : number ) => { if ( board [ row ][ col ]. isMine ) { setGameStatus ( ' lost ' ); return ; } const newBoard = board . map (( r ) => [... r ]); newBoard [ row ][ col ]. isRevealed = true ; setBoard ( newBoard ); }; The game now has tile movement, merging tiles, and adding new tiles after each move. it was too hard to set the tile screen and mines & it still have bugs , but its good for now and i am gona a ship it 😋😋
Ships:
Its a WebOS made to experement and experence a OS ina website.
Its a WebOS made to experement and experence a OS ina website.
Its a WebOS made to experement and experence a OS ina website.
i added more features and fixed some bugs . Ii added games like snake, 2048, minesweeper...
|
1793987709.999581
|
1794074109.999581
|