|
14066
|
Janitor Space Program (J.S.P.) by @aloyak | Starda Janitor Space Program (J.S.P.) by @aloyak | Stardance...
|
aloyak
|
2
|
160.0
|
3078
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-17T13:40:57Z", "hours": 55.0, "multiplier": 18.95, "payout": 1041, "blessing": "neutral", "text": "This is my 3D exploration-sandbox game that I built with my custom game engine! I’ve added quite a lot of stuff like a simple exploration game mode that allows you to move around a hand-crafted solar system i called “Halcyon”. there are also a lot of other game modes you can try and have fun with before I finally add the campaign game mode for the final version! In the picture you can see an in-game screenshot of the player walking around the surface of the earth-like planet “Gaia”, hope you like my game! With <3, 4loyak!", "repo": "https://github.com/aloyak/jsp", "demo": "https://aloyak.itch.io/jsp"}, {"ship_num": 2, "ts": "2026-07-16T13:34:38Z", "hours": 105.0, "multiplier": 19.52, "payout": 2037, "blessing": "neutral", "text": "This is my 3D game about space exploration and kessler cascades, it has a campaign mode coming up but i havent finished that yet, for now enjoy the 3 game modes! i built this on top of my custom engine so its been a lot of hard work, please try it out!!!!", "repo": "https://github.com/aloyak/jsp", "demo": "https://aloyak.itch.io/jsp"}]...
|
[{"post_id": 48889, "ts": "202 [{"post_id": 48889, "ts": "2026-08-17T13:35:52Z", "hours": 3.9133, "text": "JSP! I’m back! and I finally have a new decent version that im probably gonna ship shortly after I publish this devlog. Its been so long since the last devlog because a number of factors, I had some vacations, my main pc is now just a steam deck connected to a monitor and also I’m kind of struggling to continue this project, I hope this isnt the last version but working on the project and adding or fixing things is very complicated and requires a lot of research to do it right, and it is exhausting What was added?? Included the new planet models to the halcyon system, you can now correctly explore them by using the new terrain system I added to the engine! Added some small help windows/hints for the new stuff before shipping! Fixed some audio bugs and added a sound effect for when you close a window Fixed the in-helmet HUD UI, the input vectors now correctly show the direction the thrust is being applied to, kinda like in Outer Wilds!! I’m most likely to be focusing on continuing the engine for a little bit, it really really does require some refactoring and I also need to clean some likely dead code or at least re-understand the code i wrote as it has lines from almost a 10 months ago! Hopefully someone could help and contribute to the project maybe or make something new out of it too! Im still planing on continuing to develop it but not at this pace considering im about to start college :))"}, {"post_id": 41224, "ts": "2026-08-05T09:35:20Z", "hours": 6.8169, "text": "J.S.P. Very exciting changes to the exploration mode yay !! I’ve been working on precisely TWO (2) things but one of them is way too early for me to be able to show you anything, more on that in the end Whats new? I’ve create a custom blender addon that lets me create procedural noise-based planets! It is really powerful and it gets you really good results for how simple it is really. In a way, its nothing but a vertex shader but coded in python lol It generates 3D spherical noise and applies it into an icosphere with a variety of parameters. Some of them arent precisely working but they are fine for now (specially the “ridged” option) You can try it yourself, its open source too! https://github.com/aloyak/JSP/blob/main/assets_src/blender/addons/planet_generator.py Terrain System I’m developing a way for the player to correctly collide with the geometry of these planets, but this is mostly engine-sided changes and I’m not very deep into it yet. I’m currently researching how to handle multi-threading async functions… more information about this in my latest engine’s devlog: https://stardance.hackclub.com/projects/1029/devlogs/34738 Known issues These are not really important right now, but for some reason I’ve realized that the splash screen takes different amounts of time depending on where you run the game?? what? A steam deck is around 3 seconds, my computer (the intended duration) is 4 seconds and in a friend’s laptop it is ~0.5 seconds"}, {"post_id": 39548, "ts": "2026-08-02T15:55:39Z", "hours": 7.1231, "text": "JSP We are SO back! I thought it would take me weeks to solve this issue but it wasnt that hard, thanks claude lol for helping. It’s not perfect just yet but its honestly crazy how my own engine managed to handle what im about to explain What took soo long The game now handles a transition from a global physics world to a new extra physics world that lives locally when the player enters a new planet (the origin of the new physics world would be the planet’s center), this means that you can perfectly walk on the surface of all the planets while they move around in the orbits without any weird behaviors This took a good amount of engine refactoring and a few changes to some systems (specially the floating origin) I need to fix a couple things like the drag when you are entering a planet, but that should be handled later on when you actually use a spaceship to enter and not just yourself with your spacesuit Other stuff that is cool Added a helmet overlay! (very inspired by outer wilds, id like some suggestions to make it more original honestly, but right now it decent). It is currently work in progress tho, and theres a lot of information missing… Small UI improvements: rounded borders, removed window’s transparency, added window close sound effects (need to find a better one tho), little better controller support… I just this idea to have vehicles but that will take super long, its added to the ideas file but thats certainty not being considered for short term, Any suggestions are welcome tho PD: video is very bad res bc i had to compress it unfortunately"}, {"post_id": 35908, "ts": "2026-07-27T17:18:56Z", "hours": 5.9792, "text": "JSP! I’ve finished porting the game to the new action based input system, its not great yet, theres a lot to polish but at least you can play 80% of the game just as good as with a keyboard/mouse (even better sometimes!) What’s the new input system? The game now asks for “actions” callbacks instead of directly asking for raw input. This new layer in the middle allows to make different devices have their own way to control each actions, so it now supports all the gamepads you probably have: xbox, playstation, steam, nintendo, generic ones too It is almost steam deck ready! Ive been playing this game on my steam deck and it works great! (you can get around 900 fps when unrestricted) Playing the game with a controller plus a little help from the little mouse trackpad really makes this game fun to play (100% coverage with this setup) Now i will finally start doing the boring physics stuff that will hopefully not take so long but idk, we’ll have to see Other stuff that was added Improved a bit the gravity based movement mode, it now adds the atmosphere’s drag gradually depending on its density, being the density higher the closer you are to the surface, this makes entering planets feel better Fixed some messed up formatting style in my code I dont know if start a new project for no more than 2 weeks and then go back, ive been having some cool new ideas but for now ill stick to this project PD: the picture is an old version (0.12.1), latest version with good controller support is 0.14.0"}, {"post_id": 34767, "ts": "2026-07-25T19:07:39Z", "hours": 8.6764, "text": "JSP Omg i need a break! just one more change bro and i will start doing the hard and boring stuff, just one more i swear! This sums up everything ive done for the past few hours, although the new improvements are actually quite important, i feel like im somewhat rushing them instead of focusing on the exploration mode New things!! Simple LOD system for planets, there wasnt a big performance change, but the model swap is very unnoticeable and nice so thats great! Added a simple spoiler warning to the exploration mode, the original idea was that you should unlock it after playing the campaign but i guess its fine lol I FIXED THE DEPTH BUFFER PRECISION ISSUE!!!! it was such a small change omg, i just dynamically changed the near plane of the camera based on how far you are to a planet, pretty nice WIP Work in progress: I’m porting the whole game to the new action-based input system so that the game supports controllers natively without any kind of steam layer on top, this is till very early and i still dont know how to make some stuff be fun to use with a controller…. I finish this, finish the two major things on the exploration mode that are 100% gonna be quick, make some decent amount of content for it, add the custom spaceship controller and launch system, make the first ~5 minutes of the campaign mode, and then SHIP THIS PROJECT (this will surely go as planned) PD: the video u see is completely controlled with my gamepad, not the best controls yet but its better than nothing!"}, {"post_id": 33389, "ts": "2026-07-23T09:24:10Z", "hours": 5.8975, "text": "JSP Worked on so many things before getting started with the complicated stuff, ill tell more about that in the bottom section, but for now, im pretty happy with what ive just added, even tho progress is pretty slow!!! What have i added? Full/complete atmospheric effect , it now not only looks good from outside, now from the inside too!!! Its a small trick but when the camera gets close enough to a planet, its atmosphere’s density scales up making the sky blue like here on earth or greatly improving the sunrises and sunsets , they do look beatiful Added floating origin: double precision was not enough so ive added a system that teleports all the entities in the scene when the player gets too far from the origin, this works surprisingly good and it was very simple to do, hopefully it wont break physics later on, but so far its great! This allows the solar system to go from ~10000 units wide to over ~3000000!! that is great! This was a engine-level change mostly tho You can finally use the planets you discover in the campaign mode in the sandbox mode Dynamic settings!!! I made it so that when you first load into the game, the UI scales to your resolution and your target fps are set to your monitor’s refresh rate, might not look like something important but this is actually HUGE Whats cooking up currently! Need a system to allow the player to be placed on top of moving planets (it currently works but breaks sometimes), and also to allow those planets to rotate. This will be achieved with a completely new physics world that will live localy on the closest planet the player is to Chunked mesh collider system i really dont know how to this, because of the terrain of my planets (TODO), collisions will be complicated to calculate, if you know about anything that could help, please send it!!! PD: I wish i could spend more time actually coding than thinking, if that were to be the case id have 300 hours+ in this project already"}, {"post_id": 32263, "ts": "2026-07-21T10:11:59Z", "hours": 8.1467, "text": "JSP This is one of the most exiting devlogs so far!! I’ve managed to get a very basic “solar system working, not all the time and of course it isnt perfect but it is really cool, heres its lore: (note that planets are placeholders right now, and distances/scale should be a lot bigger in the future) The “Halcyon” System Somewhere very very far from our current home, humanity has managed to establish a multi-planetary life in a new system after traveling for generations in their own space station The Halcyon system is composed of 5 planets (maybe more in the future) that orbit around a massive black hole (it doesnt have a name yet) “Gaia” is the earth-like planet whose own satellite, “Vesta”, is a red dwarf star that provides just enough light and heat in order to live (seen in the demo video) “Ying” and “Yan” (names will probably change), are two tiny planets that follow exact opposite orbits around the black hole, when one of them is at the perihelion, the other ones at the aphelion “Kepler” is a huge rocky planet at the outskirts of the system where small human colonies currently live Note that the campaign will be linear and happen entirely inside this place, but you will also have a “exploration” game mode that will allow you to find and see new secrets hidden… :)) Technical stuff (i.e. what was added) Created the base for the Halcyon System, planets follow a predetermined elliptical orbit in real-time. Note that for debugging, scale is around 10 to 100 times less! Added a simple physics based player controller, this took a lot of engine refactoring too. The player is affected by the gravity of the near planets and, when close enough to a planet’s surface, it is automatically aligned with the gravity vector and its also affected by the atmosphere’s drag (if theres any), this was by far the most difficult thing to do Added a little Free Camera controller as well What will be added in the future This is only the start . Theres still a few complicated things to do: Add double precision and floating origin to solve the problems that will appear when distances become as big as id like them to be Add a chunked collision mesh system for planets with complex geometry, like mountains or things like that. Right now they are all controlled by a simple kinematic sphere collider This system currently breaks the player movement when planets are moving, this is why i set “time scale” to 0. To fix this ive been thinking of creating a local physics world that sets the planet you are on to be the origin of the physics, making it look like if the planet was static, this will by by far what will take the most amount of work probably i also wanna update the atmospheric shader as it is by far the thing worsening the game’s performance, and id like to make the sky fully tint when your inside it PD: Thank you so much for all the people that support/follow this project, it already has 21 followers . thank you, really!"}, {"post_id": 30589, "ts": "2026-07-18T09:11:03Z", "hours": 8.3614, "text": "JSP I want to dedicate this devlog to @Rupnil as he always says that devlogs need to be 3-4 hours max, so i can explain why thats not always possible. Out of the 8 hours i devlog today, around 7.5 of them were spent ONLY debugging ONE SINGLE BUG for 2 whole days. I started losing my mind lmfao the bug: All the built-in and embedded textures became completely broken and ONLY on super specific conditions on certain parts and game modes. But the worst part was that rolling back to a version from days ago DID NOT solve the issue at all . I even considered that my GPU gave up on my and it was just showing gpu artifact slop in my screen the fix: Apparently there was a small bug with gpu memory allocation in the backend of dear imgui (apparently ONLY in the SDL2-OpenGL backend lmfao) and only for the docking branch of the repo. Rolling back to an old dear imgui version from the main branch solved the issue but damn. Ive also reported the issue as much as i could in the official repo. Pretty much, updating the engine to the latest version automatically updated its dependencies and thus leaked the bug to my game Appart from that I’ve spent a little bit on starting to develop the open-universe system where you can travel around planets! More on that in the next devlog probably. I already have though about the planet’s names, positions and stuff! pretty exiting!! PD: In the mean time ive also being updating the engine at the same time to improve the physics system, which is a lot better right now!"}, {"post_id": 29477, "ts": "2026-07-16T13:30:28Z", "hours": 4.3869, "text": "JSP Pre-ship checklist is complete! I’m so ready to ship the first version and start developing the campaign, which is the main thing of this game. I’ve actually started it a little bit, it now has an interior level system completely different to the gamemode system i had for the rest of the game, this is pretty exiting! stuff that ive done before shipping Built the game for windows, took a little bit but performance is 1:1 and everything works perfectly, the only thing was that i had to change the backend of the audio engine to use something else but that was fairly quick! Reduced the size of the game MASSIVELY , it went from around 350MB to ~35MB , thats literally 10 times less!! managed to do this by compressing the audio files, although the change is almost unnoticeable, and also making the engine bake some textures on build time, just like real fancy engines do! Changed a bit the main menu/ campaing mode but for now it is all a placeholder Created a new itch.io banner Made the HELP menu show up by default, i dont really like this but i think its probably the best for people to rate it nicely, wont be in the final version… Added a input mode (another one) to the spaceship building mode that allows you to hover the attachment points and it will tell you with a little popup what category of part can go there If you are rating my project, please ishowspeed i need this now in all fairness i hope people like my game! im not even close to finishing it lol Right after this first ship i will work on updating the engine to support new features that the campaign mode will certainty need 100%, like a working physics engine, ive thought of porting what i currently have to use a new one i found and that is getting very popular called “Box3D”, we’ll see, byeeeeeee"}, {"post_id": 27751, "ts": "2026-07-13T16:07:37Z", "hours": 7.2142, "text": "JSP https://github.com/aloyak/JSP https://aloyak.itch.io/jsp?secret=nkYXIEVo8woJvblBQRYMIrWSFc I feel like im getting very close to a first ever release and finally start with the campaign mode! I finished some polishing stuff and fixed a bit, i dont think the spacecraft builder mode is ready 100% but ill use it in the campaing mode either way so ill have to update it regardless I’ve officially published the github repository where you can check out the huge amount of code this project already has lol. I’ve also created a new itchio page, this is the secret link (for feedback): https://aloyak.itch.io/jsp?secret=nkYXIEVo8woJvblBQRYMIrWSFc added things: Published the github repo and the itchio page! With a lot of new screenshots and art. I’ve also added the source files of the textures (.xfc gimp files, including the itchio banners) as well as the 3D models I’ve made (in blender) which can all be found in the assets_src/ folder Added a way to delete different parts in the spaceship building mode Added a few new parts to the spaceship building mode, refactored the whole system to make it “easier” (not really) to add new parts and things Added a full README + LICENSE to the repo Added a new shader , it is the small fog that you see in the vide when building a spaceship in order to hide the lack of detail in the exterior, the shader fades out the more you look up so you can see the beautiful skybox Added load/saving to the spacecraft building game mode, you can now save your ship’s to load them later just like with planets and sandboxes Fix some memory management problems where i forgot to delete some pointers => no memory leaks or crashes! I dont think this will be the last devlog before the first ship, but maybe, who knows right? Looking forward to you all trying my game! (the part that is done) PD: 100 hours"}, {"post_id": 25218, "ts": "2026-07-09T10:34:55Z", "hours": 3.7989, "text": "JSP Can’t really express enough how much I enjoy making shaders, the look really good. i might make a video about it with the new hackclub video challenge, we might see, I’m kinda shy for these sort of things :)) Today’s devlog is pretty much to show only one thing. I’ve been doing some really small changes to UI, a few bug fixes but the important thing is the new Central Body system for the sandbox mode (the code is pretty rough right now but hopefully ill improve it), this now allows you to choose the central body that your planets will orbit around So now, instead of having only the sun in the middle you can now select a BLACK HOLE instead, which i think its a lot cooler. Note that the whole black hole is completely done by a single glsl fragment shader, how cool is that? I’ve reused a small amount of code from the atmosphere shader and then researched a bit on similar projects Apart from this I’ve also added a new “extra” option to allow the player to change the tint of the skybox, so you can create even weirder solar systems, any new suggestions on what else to add are welcome! After this im gonna do a small refactoring change that is really stupid and needs to be changed in the entire code base, its just a small thing with the new language system"}, {"post_id": 24594, "ts": "2026-07-08T09:29:46Z", "hours": 8.8931, "text": "JSP Worked on polishing and improving a few quality of life features and overall stability, also I took my time to translate every single text in the game to spanish, although the new dynamic language system should work for adding any new language fairly quickly. this is a very important change because doing this after the campaign would be a nightmare. language is also saved to settings new stuff Added a dynamic language system and support for playing the game in spanish, if you want any new languages or help translate and thus be added to the credits please reach out Added a full credits panel where it shows all the licenses and 3rd party code/art used, AI disclosure and other stuff Fixed some weird seg faults when going back to main menu from the blueprint view Updated all icons, all of them were used in the sandbox game mode Added some new settings to the blueprint view inside the spaceship building game mode What I wanna do now is to finally finish the spaceship sandbox finally but its taking longer than expected and it requires a lot of brainpower that many times is less appealing to do compared to playing persona 5 royal lmao. Note: once the source code is published, sending feedback, playtesting or translating would maybe mean that i put you in the credits! fr i might need some help tho"}, {"post_id": 22329, "ts": "2026-07-04T19:06:08Z", "hours": 7.0856, "text": "JSP I really enjoy creating and coding shaders and so i started adding some cool effects to the spacecraft editor, didnt really add any new parts but i think that what i added was pretty interesting. I’ve also been working on improving a bit the user experience and making things obvious to use without explaining anything, this is probably the most fun i had doing this project in a while :) what was added Added “Blueprint” view for your spaceship, watch the video to see what it is! currently very early version tho Added a help window that changes based on the gamemode Added geometry center (blue) and center of mass (yellow) to the spaceship Small fixes to transition between movesets Added a border shader to mark the bounds of the building workspace Added a few icons that really need some improvement The idea of the blueprint mode is to edit different things from the spaceship, and also to see the different stages of your little ship! more on this later, im not specially creative enough to write a lot today lol Ill also probably add a dynamic cursor system but idk"}, {"post_id": 20638, "ts": "2026-07-02T08:56:03Z", "hours": 6.5689, "text": "JSP Been working on the spaceship builder gamemode and its pretty fun! right now the system is very simple but solid. i had to model a couple test things and fix many bugs but it is going quite fast. The current system is a simple attachment-part system where each attachment holds up information about allowed part’s categories to attach and the normal vector of the attachment. Unfortunately removing parts is not really an option yet cuz i need to see how i will make that possible later on summary on new features: started the actual spaceship building gamemode, currently it features just basic part placement logic small changes to sound effects and music (not shown in the video) Apart from obvious structural changes, id also want to add some sort of customization to your spaceships, with different colors, flags, sigils idk. I dont want to make building a spaceship something hard but just a simple thing you do to have your own individual experience, obviously you wont be able to make some cursed stuff as it wont just fly into space without an engine, but the idea is that everything with enough parts should work"}, {"post_id": 18642, "ts": "2026-06-29T20:39:49Z", "hours": 3.7319, "text": "JSP Unfortunately hackatime doesnt support blender so the ~2.5 hours i spent modeling the assembly building for the spacecraft editor sandbox will not count but its fine. I’ve also done some deep debugging to the engine as it now supports embedded materials even when they dont have any texture, before this change everything looked like a wierd artifact in black/purple colors (check out the second image if ud like to see it, its pretty in a way) what was added/changed Created a not-final but decent model for the assembly building you will be creating your custom spaceship in Added first person camera control, that is used by this gamemode to get a different “perspective” on your awesome creation. you can toggle between the normal orbital view and the fp view some engine-level optimizations This now means im FREE… to actually start developing the spacecraft building sandbox, so we are back to it lol. im hoping it doesnt take me that much but i still need to finish to understand how exactly i want this to be as this is probably the only shared code that the campaign game mode will use, so i better make it good as it “counts” double PD: already said this, but the second screenshot is just so you comprehend what ive been struggling with for the past 48 hours :("}, {"post_id": 17110, "ts": "2026-06-27T19:42:28Z", "hours": 9.6172, "text": "JSP Huge progress!! (yes, really) I’ve made some cool stuff an this game now looks a lot more professional, these last changes we’re surprisingly fast and fun to do (finally for once lmao), although the following changes, most of them, are still work in progress. I’ve officially decided that I’m not gonna be updating the engine’s repository solely for this project as im a bit more focused on making my game work rather than making the engine reliable and well-structured for any usecase, even tho the engine will still recieve updates any way cuz i really need them for the game, but the main focus is to not suffocate the engine with specific jsp stuff. new stuff audio system: custom imgui wrapper that lets me make sound effects for buttons on hover and press + background music system that lets me control simple fade out and transition to other songs, currently only in the main menu user settings: instead of making the same json slop ive made for the rest of the load/saving stuff, i made a fancy system that lives in the engine’s core and that lets you save any kind of settings a lot easier. user settings are now correctly saved when changed on user/settings.json created a simple intro text for the first run that explains a some information made the settings window accessible from anywhere, not tied to the main menu anymore FANCY TRANSITIONS between gamemodes, it now fades in/out to black with a little loading icon in the bottom right corner, this took longer than id like to explain unfortunately added a color history for the paint tool in the planet sandbox improved atmosphere UI controls in the planet sandbox fix water shader sometimes rendering on top of an atmosphere As you might be able to guess, some of these changes weren’t really necessary but im sort of procrastinating so that i dont have to model the assembly building for the next game mode cuz i really suck at it and will be painful most likely I’ve though of adding a “first person view” move mode to the spacecraft sandbox as it would be cool to see your creation from an engineer’s point of view and also because that way i already will have coded the controls for the campaign :))"}, {"post_id": 15575, "ts": "2026-06-25T10:26:14Z", "hours": 5.6989, "text": "JSP Currently finishing the gravity sandbox gamemode! I still need to make quite a big change as im thinking of unifying the “gravity body” struct i use in the sandbox with the “planet component” i use in the rest of the game, so this will probably take a while but, for now, the sandbox game mode seems to be the next thing to be finished! new stuff! the gravity sandbox now has gravity!!!! note that it is not super realistic nasa-level simulation, i was thinking of something a lot more arcade. this is very well reflected in the fictional scale (its around 1:100000), because games must be fun first, then realistic if possible separated the gravity sandbox file to hold the built-in planet’s registry in a different file (its around ~1300 lines of code rn lol, after the simplification…) added a nice destroy animation for the planets, improved the velocity tool and made the selection tool follow the planets the intro animation now locks into the sun, which is now the origin of the scene + changes to the style of the sun added trails to the planets in the simulation (that you can toggle, of course) small UI improvements Whats next u say? applying the same load/save system that i used in the planet builder sandbox, only that now i wont have to create a vertex data to file system (yay) Im also starting to 3d model in blender the “assembly building” where you will be able to build your spaceships in the other game mode, but im really bad at it so ill leave it for later, once the spacecraft builder game mode is finished i will probably ship the first version"}, {"post_id": 13151, "ts": "2026-06-21T14:56:42Z", "hours": 10.1961, "text": "JSP I’ve officially finished the planet builder sandbox gamemode finally, probably will tweak a lot of things but the main stuff is done. i spent quite a lot trying to fix a problem with the depth texture that isnt even fixed right now lmao, quick explanation: distances are huge and so the depth texture loses a lot of precision, to combat this i decide to add reverse-z to the engine’s renderer but this didnt really solve the issue as it probably needs even more work adding an inifinite “far” plane or logarithmic depth but i think its fine for now, ill explain this more in depth with the next devlog on the origin engine. new features added oceans to the planet builder, very simple for now but as a first version i think it works just fine, i spent at least 8 hours with this already lol, added basic controls to the ui to modify the shader’s uniforms and hopefully its good enough added loading/saving to the planet builder and to the sandbox, you can now save your projects using json serialization, a geometry-to-file algorithm and a texture-to file algorithm. note that the planets you create in the planet builder can also be used in the gravity sandbox added the terrain tool so you can now modify the geometry of your planet as you like, creating mountains, valleys or oceans Next up is to finish the gravity sandbox gamemode, hopefully that should be a lot quicker as most of it is already done, but you know how this usually goes HELP: if you have any ideas on how to make the depth texture more precise given the huge distances please let me know, theres not a lot of information out there"}, {"post_id": 11875, "ts": "2026-06-19T10:45:42Z", "hours": 5.4583, "text": "JSP I’ve been stuck with a super upsetting bug with the engine’s render class and the ownership of the output buffer that made the engine’s sandbox editor be completely unusable for however long this “postprocessing pipeline update” lasted. it is now fixed and i could continue developing this game finally. As the engine now supports adding many layers of postprocessing on top of the main render pipeline, i started cooking up atmospheric and star shaders, although only the first one is finished. i ported the atmosphere shader from a tutorial posted by nvidia on atmospheric scattering from a many years ago but the end result is honestly amazing, way better than what i had in mind. This is supposed to give the same feeling as the atmospheres from outer wilds, which is part of my inspiration for this project (and also my fav game in general) new features add “Has atmosphere” option to the planet builder mode, with a lot of options and parameters to control and make your own planets, showcased in the video… made all entities with the planet component now have an option to show an atmosphere, although it is disabled by default. this results on the earth shown in the main menu to now also have a atmosphere I will be focusing on finishing the planet builder game mode first, as it is ~60% done (probably less), i just need to add the entire terrain tool and save the planet settings to a file to be able to use it later or use it in the gravity sandbox PD: i know it seems like im focusing too much into the small/extra gamemodes but this is supposed to function as a base for the campaign mode, which i dont think will be released in the first public version unfortunately"}, {"post_id": 10582, "ts": "2026-06-17T12:03:21Z", "hours": 4.9575, "text": "JSP Good but slow progress (im not finishing this game before stardance ends probably) I want to focus on having the 4 main gamemodes ready to have a good base for the camping, which is gonna be epic! new features/changes: wrote the story for the campaign mode, yet to be showcased, but it is pretty cool, more on that later removed the explore mode, this was a thing i had in mind at the very beginning of the development but it doesnt really fit my view right now, will make a comeback at some point, but the previous implementation was just a bunch of dead code created a simple spaceship building scene, wip as you can see in the video added a very simple splash screen improved the planet creation sandbox, now with a paint tool (a bit buggy, for now) that lets you generate a real-time texture and save it to a png file, biggest progress here was made in the engine itself actually. This took so much time fighting with translation of screen-space coords to world-space coords to UV coords, im actually impressed it even works lmao. this was almost gonna get scrapped till i realized the UV unwrapping of the sphere was a cubic projection and that was messing everything up I am struggling so much with blender and my sandbox, it looks like they hate each other, also WHY DOES BLENDER USE Z+ UP, anyway, stay tuned! Its hard to make devlogs when progress is so slow but i hope you like it PD: I just fixed the colors looking like confetti (look at the color of the blue paint brush), apparently i was multiplying the alpha channel by 255 in the texture class because of a previous implementation and that was causing some sort of overflow in the shaders, thus the weird colors, so paint tool is officially finished, hopefully"}, {"post_id": 9425, "ts": "2026-06-15T19:45:20Z", "hours": 8.1431, "text": "J.S.P. I’ve been making some progress in every direction while i find out exactly what i want this game to be. ive started writing the story for the campaign mode that i hope is about 3 to 4 hours. Overall the main progress of this devlog is summarized in a finished early version of the sandbox, although theres a lot to fix in it, the main stuff is done. Ive also started with the planet creation sandbox and focused on working into instancing even though it is not quite there yet (im thinking of removing the explore mode entirely or do it completely different) new features: improved sandbox mode with actual simulation (very early), a new intro animation, different tools to select, move and change the starting velocity of each planet set a base for both the planet and spacecraft creation sandboxes as these mechanics will make the development of the campaign a bit easier, hopefully created a simple logo, probably to be changed, i dont really like it but id appreciate feedback refactored the scale system to make working with different distances and planet’s radius a lot easier, this new system is so clean i actually love it As you can see progress is extremely slow, i want to make this right and also make sure that the project is well structured enough to hold up. Also did a simple check on performance and after a couple tweaks, average fps sit around 3000, fr, on my little rtx 3060 so thats great"}, {"post_id": 7522, "ts": "2026-06-12T15:45:45Z", "hours": 5.6847, "text": "JSP Today’s devlog is not so much focus into the progress but into some design decisions that made me had to restructure the project a quite a lot, ive got a new view of the project that i think will make it a lot more fun gamemodes: campaign: top secret for now explore: you can explore, find, filter and search up real-life satellites at their real position, this is mostly done already but i need to work on adding instancing to the engine because rendering ~14000 satellites is not something my little tiny engine can really handle right now, performance drops from ~1700 fps to 9 fps lol sandbox: no more real life stuff, distances are too big and not fun to play with, this is the main change. this means that the idea is to now not only allow to play around with 3d gravity and make solar systems, but also to create and design custom planets and spacecrafts (and save/load them to a custom json file that you can share or reuse) new features I want to showcase how the current sandbox mode is like right now, this is only a part of the final sandbox mode tho (read the previous paragraph for more info). I added this cool animation from the main menu, simple movement that scales with distance, and a placing-editing system that took way too long (i had to do matrix calculations lol, math does be useful sometimes), right now the only object you can place is the Earth, but you will be able to place pretty much anything and modify their mass, velocity or anything really I will now start with making instancing something real and not just a dead branch in the engine’s repo, but this means im gonna have to read some opengl documentation :( PD: the visual bug in the video is completely intentional"}, {"post_id": 6769, "ts": "2026-06-11T10:36:15Z", "hours": 7.2383, "text": "JSP I’ve been working on a lot of things and the project is taking a really nice shape! ive organized the game into different game modes that independently manage their needs in an organized way. Also ive made some progress with the real life satellites and made some nice main menu! new features: WIP: explore real time satellites and see them move as they are in real life, with custom orbit calculations, still in the works, getting fetched directly from the internet and cached every 24 hours Added a main menu, as the engine doesnt have any in-house UI system, Im using a modified dear imgui version that is holding up nicely, also added some placeholders for settings etc… Started a new gamemode: gravity sandbox, where you can play around with custom objects and real life planets and their gravitational interactions I also had to update the engine a bit to make it be able to handle quads and their operations. the idea is to finalize a working sandbox gamemode as that would set the base for many more complex features incoming"}, {"post_id": 6120, "ts": "2026-06-10T09:09:05Z", "hours": 6.2383, "text": "JSP A 3D pixelart videogame about space exploration where you have to save humanity from the Kessler effect, currently working on the “exploration” mode where you can find and explore all the satellites of earth (and later on the solar system) at their real time location. Current Features! I’ve made a simple system that gets the real life data of these satellites from CelesTrak’s Public TLE Text Files, which than caches them and are refreshed every 24 hours, so you can see the real-life position of, for example, the ISS Built using my own custom engine, actually been updating the engine while creating this because, lets say the engine isnt very “mature” yet, but its holding up nicely! Check out the ORIGIN engine at: https://origin.aloyak.dev The game will feature this little 3d pixel art style that i really like honestly. The hardest thing to do so far was to setup a fork of the engine so that i could work on the game without actually contributing to the engine itself at all. All these models used currently are from NASA themselves, so they should be pretty accurate! I’m thinking of maybe adding a web build but the more i try to make it work the more it breaks lol :( 🚀🚀"}]...
|
Title: Janitor Space Program (J.S.P.) by @aloyak | Title: Janitor Space Program (J.S.P.) by @aloyak | Stardance
Devlogs:
JSP A 3D pixelart videogame about space exploration where you have to save humanity from the Kessler effect, currently working on the “exploration” mode where you can find and explore all the satellites of earth (and later on the solar system) at their real time location. Current Features! I’ve made a simple system that gets the real life data of these satellites from CelesTrak’s Public TLE Text Files, which than caches them and are refreshed every 24 hours, so you can see the real-life position of, for example, the ISS Built using my own custom engine, actually been updating the engine while creating this because, lets say the engine isnt very “mature” yet, but its holding up nicely! Check out the ORIGIN engine at: https://origin.aloyak.dev The game will feature this little 3d pixel art style that i really like honestly. The hardest thing to do so far was to setup a fork of the engine so that i could work on the game without actually contributing to the engine itself at all. All these models used currently are from NASA themselves, so they should be pretty accurate! I’m thinking of maybe adding a web build but the more i try to make it work the more it breaks lol :( 🚀🚀
JSP I’ve been working on a lot of things and the project is taking a really nice shape! ive organized the game into different game modes that independently manage their needs in an organized way. Also ive made some progress with the real life satellites and made some nice main menu! new features: WIP: explore real time satellites and see them move as they are in real life, with custom orbit calculations, still in the works, getting fetched directly from the internet and cached every 24 hours Added a main menu, as the engine doesnt have any in-house UI system, Im using a modified dear imgui version that is holding up nicely, also added some placeholders for settings etc… Started a new gamemode: gravity sandbox, where you can play around with custom objects and real life planets and their gravitational interactions I also had to update the engine a bit to make it be able to handle quads and their operations. the idea is to finalize a working sandbox gamemode as that would set the base for many more complex features incoming
JSP Today’s devlog is not so much focus into the progress but into some design decisions that made me had to restructure the project a quite a lot, ive got a new view of the project that i think will make it a lot more fun gamemodes: campaign: top secret for now explore: you can explore, find, filter and search up real-life satellites at their real position, this is mostly done already but i need to work on adding instancing to the engine because rendering ~14000 satellites is not something my little tiny engine can really handle right now, performance drops from ~1700 fps to 9 fps lol sandbox: no more real life stuff, distances are too big and not fun to play with, this is the main change. this means that the idea is to now not only allow to play around with 3d gravity and make solar systems, but also to create and design custom planets and spacecrafts (and save/load them to a custom json file that you can share or reuse) new features I want to showcase how the current sandbox mode is like right now, this is only a part of the final sandbox mode tho (read the previous paragraph for more info). I added this cool animation from the main menu, simple movement that scales with distance, and a placing-editing system that took way too long (i had to do matrix calculations lol, math does be useful sometimes), right now the only object you can place is the Earth, but you will be able to place pretty much anything and modify their mass, velocity or anything really I will now start with making instancing something real and not just a dead branch in the engine’s repo, but this means im gonna have to read some opengl documentation :( PD: the visual bug in the video is completely intentional
J.S.P. I’ve been making some progress in every direction while i find out exactly what i want this game to be. ive started writing the story for the campaign mode that i hope is about 3 to 4 hours. Overall the main progress of this devlog is summarized in a finished early version of the sandbox, although theres a lot to fix in it, the main stuff is done. Ive also started with the planet creation sandbox and focused on working into instancing even though it is not quite there yet (im thinking of removing the explore mode entirely or do it completely different) new features: improved sandbox mode with actual simulation (very early), a new intro animation, different tools to select, move and change the starting velocity of each planet set a base for both the planet and spacecraft creation sandboxes as these mechanics will make the development of the campaign a bit easier, hopefully created a simple logo, probably to be changed, i dont really like it but id appreciate feedback refactored the scale system to make working with different distances and planet’s radius a lot easier, this new system is so clean i actually love it As you can see progress is extremely slow, i want to make this right and also make sure that the project is well structured enough to hold up. Also did a simple check on performance and after a couple tweaks, average fps sit around 3000, fr, on my little rtx 3060 so thats great
JSP Good but slow progress (im not finishing this game before stardance ends probably) I want to focus on having the 4 main gamemodes ready to have a good base for the camping, which is gonna be epic! new features/changes: wrote the story for the campaign mode, yet to be showcased, but it is pretty cool, more on that later removed the explore mode, this was a thing i had in mind at the very beginning of the development but it doesnt really fit my view right now, will make a comeback at some point, but the previous implementation was just a bunch of dead code created a simple spaceship building scene, wip as you can see in the video added a very simple splash screen improved the planet creation sandbox, now with a paint tool (a bit buggy, for now) that lets you generate a real-time texture and save it to a png file, biggest progress here was made in the engine itself actually. This took so much time fighting with translation of screen-space coords to world-space coords to UV coords, im actually impressed it even works lmao. this was almost gonna get scrapped till i realized the UV unwrapping of the sphere was a cubic projection and that was messing everything up I am struggling so much with blender and my sandbox, it looks like they hate each other, also WHY DOES BLENDER USE Z+ UP, anyway, stay tuned! Its hard to make devlogs when progress is so slow but i hope you like it PD: I just fixed the colors looking like confetti (look at the color of the blue paint brush), apparently i was multiplying the alpha channel by 255 in the texture class because of a previous implementation and that was causing some sort of overflow in the shaders, thus the weird colors, so paint tool is officially finished, hopefully
JSP I’ve been stuck with a super upsetting bug with the engine’s render class and the ownership of the output buffer that made the engine’s sandbox editor be completely unusable for however long this “postprocessing pipeline update” lasted. it is now fixed and i could continue developing this game finally. As the engine now supports adding many layers of postprocessing on top of the main render pipeline, i started cooking up atmospheric and star shaders, although only the first one is finished. i ported the atmosphere shader from a tutorial posted by nvidia on atmospheric scattering from a many years ago but the end result is honestly amazing, way better than what i had in mind. This is supposed to give the same feeling as the atmospheres from outer wilds, which is part of my inspiration for this project (and also my fav game in general) new features add “Has atmosphere” option to the planet builder mode, with a lot of options and parameters to control and make your own planets, showcased in the video… made all entities with the planet component now have an option to show an atmosphere, although it is disabled by default. this results on the earth shown in the main menu to now also have a atmosphere I will be focusing on finishing the planet builder game mode first, as it is ~60% done (probably less), i just need to add the entire terrain tool and save the planet settings to a file to be able to use it later or use it in the gravity sandbox PD: i know it seems like im focusing too much into the small/extra gamemodes but this is supposed to function as a base for the campaign mode, which i dont think will be released in the first public version unfortunately
JSP I’ve officially finished the planet builder sandbox gamemode finally, probably will tweak a lot of things but the main stuff is done. i spent quite a lot trying to fix a problem with the depth texture that isnt even fixed right now lmao, quick explanation: distances are huge and so the depth texture loses a lot of precision, to combat this i decide to add reverse-z to the engine’s renderer but this didnt really solve the issue as it probably needs even more work adding an inifinite “far” plane or logarithmic depth but i think its fine for now, ill explain this more in depth with the next devlog on the origin engine. new features added oceans to the planet builder, very simple for now but as a first version i think it works just fine, i spent at least 8 hours with this already lol, added basic controls to the ui to modify the shader’s uniforms and hopefully its good enough added loading/saving to the planet builder and to the sandbox, you can now save your projects using json serialization, a geometry-to-file algorithm and a texture-to file algorithm. note that the planets you create in the planet builder can also be used in the gravity sandbox added the terrain tool so you can now modify the geometry of your planet as you like, creating mountains, valleys or oceans Next up is to finish the gravity sandbox gamemode, hopefully that should be a lot quicker as most of it is already done, but you know how this usually goes HELP: if you have any ideas on how to make the depth texture more precise given the huge distances please let me know, theres not a lot of information out there
JSP Currently finishing the gravity sandbox gamemode! I still need to make quite a big change as im thinking of unifying the “gravity body” struct i use in the sandbox with the “planet component” i use in the rest of the game, so this will probably take a while but, for now, the sandbox game mode seems to be the next thing to be finished! new stuff! the gravity sandbox now has gravity!!!! note that it is not super realistic nasa-level simulation, i was thinking of something a lot more arcade. this is very well reflected in the fictional scale (its around 1:100000), because games must be fun first, then realistic if possible separated the gravity sandbox file to hold the built-in planet’s registry in a different file (its around ~1300 lines of code rn lol, after the simplification…) added a nice destroy animation for the planets, improved the velocity tool and made the selection tool follow the planets the intro animation now locks into the sun, which is now the origin of the scene + changes to the style of the sun added trails to the planets in the simulation (that you can toggle, of course) small UI improvements Whats next u say? applying the same load/save system that i used in the planet builder sandbox, only that now i wont have to create a vertex data to file system (yay) Im also starting to 3d model in blender the “assembly building” where you will be able to build your spaceships in the other game mode, but im really bad at it so ill leave it for later, once the spacecraft builder game mode is finished i will probably ship the first version
JSP Huge progress!! (yes, really) I’ve made some cool stuff an this game now looks a lot more professional, these last changes we’re surprisingly fast and fun to do (finally for once lmao), although the following changes, most of them, are still work in progress. I’ve officially decided that I’m not gonna be updating the engine’s repository solely for this project as im a bit more focused on making my game work rather than making the engine reliable and well-structured for any usecase, even tho the engine will still recieve updates any way cuz i really need them for the game, but the main focus is to not suffocate the engine with specific jsp stuff. new stuff audio system: custom imgui wrapper that lets me make sound effects for buttons on hover and press + background music system that lets me control simple fade out and transition to other songs, currently only in the main menu user settings: instead of making the same json slop ive made for the rest of the load/saving stuff, i made a fancy system that lives in the engine’s core and that lets you save any kind of settings a lot easier. user settings are now correctly saved when changed on user/settings.json created a simple intro text for the first run that explains a some information made the settings window accessible from anywhere, not tied to the main menu anymore FANCY TRANSITIONS between gamemodes, it now fades in/out to black with a little loading icon in the bottom right corner, this took longer than id like to explain unfortunately added a color history for the paint tool in the planet sandbox improved atmosphere UI controls in the planet sandbox fix water shader sometimes rendering on top of an atmosphere As you might be able to guess, some of these changes weren’t really necessary but im sort of procrastinating so that i dont have to model the assembly building for the next game mode cuz i really suck at it and will be painful most likely I’ve though of adding a “first person view” move mode to the spacecraft sandbox as it would be cool to see your creation from an engineer’s point of view and also because that way i already will have coded the controls for the campaign :))
JSP Unfortunately hackatime doesnt support blender so the ~2.5 hours i spent modeling the assembly building for the spacecraft editor sandbox will not count but its fine. I’ve also done some deep debugging to the engine as it now supports embedded materials even when they dont have any texture, before this change everything looked like a wierd artifact in black/purple colors (check out the second image if ud like to see it, its pretty in a way) what was added/changed Created a not-final but decent model for the assembly building you will be creating your custom spaceship in Added first person camera control, that is used by this gamemode to get a different “perspective” on your awesome creation. you can toggle between the normal orbital view and the fp view some engine-level optimizations This now means im FREE… to actually start developing the spacecraft building sandbox, so we are back to it lol. im hoping it doesnt take me that much but i still need to finish to understand how exactly i want this to be as this is probably the only shared code that the campaign game mode will use, so i better make it good as it “counts” double PD: already said this, but the second screenshot is just so you comprehend what ive been struggling with for the past 48 hours :(
JSP Been working on the spaceship builder gamemode and its pretty fun! right now the system is very simple but solid. i had to model a couple test things and fix many bugs but it is going quite fast. The current system is a simple attachment-part system where each attachment holds up information about allowed part’s categories to attach and the normal vector of the attachment. Unfortunately removing parts is not really an option yet cuz i need to see how i will make that possible later on summary on new features: started the actual spaceship building gamemode, currently it features just basic part placement logic small changes to sound effects and music (not shown in the video) Apart from obvious structural changes, id also want to add some sort of customization to your spaceships, with different colors, flags, sigils idk. I dont want to make building a spaceship something hard but just a simple thing you do to have your own individual experience, obviously you wont be able to make some cursed stuff as it wont just fly into space without an engine, but the idea is that everything with enough parts should work
JSP I really enjoy creating and coding shaders and so i started adding some cool effects to the spacecraft editor, didnt really add any new parts but i think that what i added was pretty interesting. I’ve also been working on improving a bit the user experience and making things obvious to use without explaining anything, this is probably the most fun i had doing this project in a while :) what was added Added “Blueprint” view for your spaceship, watch the video to see what it is! currently very early version tho Added a help window that changes based on the gamemode Added geometry center (blue) and center of mass (yellow) to the spaceship Small fixes to transition between movesets Added a border shader to mark the bounds of the building workspace Added a few icons that really need some improvement The idea of the blueprint mode is to edit different things from the spaceship, and also to see the different stages of your little ship! more on this later, im not specially creative enough to write a lot today lol Ill also probably add a dynamic cursor system but idk
JSP Worked on polishing and improving a few quality of life features and overall stability, also I took my time to translate every single text in the game to spanish, although the new dynamic language system should work for adding any new language fairly quickly. this is a very important change because doing this after the campaign would be a nightmare. language is also saved to settings new stuff Added a dynamic language system and support for playing the game in spanish, if you want any new languages or help translate and thus be added to the credits please reach out Added a full credits panel where it shows all the licenses and 3rd party code/art used, AI disclosure and other stuff Fixed some weird seg faults when going back to main menu from the blueprint view Updated all icons, all of them were used in the sandbox game mode Added some new settings to the blueprint view inside the spaceship building game mode What I wanna do now is to finally finish the spaceship sandbox finally but its taking longer than expected and it requires a lot of brainpower that many times is less appealing to do compared to playing persona 5 royal lmao. Note: once the source code is published, sending feedback, playtesting or translating would maybe mean that i put you in the credits! fr i might need some help tho
JSP Can’t really express enough how much I enjoy making shaders, the look really good. i might make a video about it with the new hackclub video challenge, we might see, I’m kinda shy for these sort of things :)) Today’s devlog is pretty much to show only one thing. I’ve been doing some really small changes to UI, a few bug fixes but the important thing is the new Central Body system for the sandbox mode (the code is pretty rough right now but hopefully ill improve it), this now allows you to choose the central body that your planets will orbit around So now, instead of having only the sun in the middle you can now select a BLACK HOLE instead, which i think its a lot cooler. Note that the whole black hole is completely done by a single glsl fragment shader, how cool is that? I’ve reused a small amount of code from the atmosphere shader and then researched a bit on similar projects Apart from this I’ve also added a new “extra” option to allow the player to change the tint of the skybox, so you can create even weirder solar systems, any new suggestions on what else to add are welcome! After this im gonna do a small refactoring change that is really stupid and needs to be changed in the entire code base, its just a small thing with the new language system
JSP https://github.com/aloyak/JSP https://aloyak.itch.io/jsp?secret=nkYXIEVo8woJvblBQRYMIrWSFc I feel like im getting very close to a first ever release and finally start with the campaign mode! I finished some polishing stuff and fixed a bit, i dont think the spacecraft builder mode is ready 100% but ill use it in the campaing mode either way so ill have to update it regardless I’ve officially published the github repository where you can check out the huge amount of code this project already has lol. I’ve also created a new itchio page, this is the secret link (for feedback): https://aloyak.itch.io/jsp?secret=nkYXIEVo8woJvblBQRYMIrWSFc added things: Published the github repo and the itchio page! With a lot of new screenshots and art. I’ve also added the source files of the textures (.xfc gimp files, including the itchio banners) as well as the 3D models I’ve made (in blender) which can all be found in the assets_src/ folder Added a way to delete different parts in the spaceship building mode Added a few new parts to the spaceship building mode, refactored the whole system to make it “easier” (not really) to add new parts and things Added a full README + LICENSE to the repo Added a new shader , it is the small fog that you see in the vide when building a spaceship in order to hide the lack of detail in the exterior, the shader fades out the more you look up so you can see the beautiful skybox Added load/saving to the spacecraft building game mode, you can now save your ship’s to load them later just like with planets and sandboxes Fix some memory management problems where i forgot to delete some pointers => no memory leaks or crashes! I dont think this will be the last devlog before the first ship, but maybe, who knows right? Looking forward to you all trying my game! (the part that is done) PD: 100 hours
JSP Pre-ship checklist is complete! I’m so ready to ship the first version and start developing the campaign, which is the main thing of this game. I’ve actually started it a little bit, it now has an interior level system completely different to the gamemode system i had for the rest of the game, this is pretty exiting! stuff that ive done before shipping Built the game for windows, took a little bit but performance is 1:1 and everything works perfectly, the only thing was that i had to change the backend of the audio engine to use something else but that was fairly quick! Reduced the size of the game MASSIVELY , it went from around 350MB to ~35MB , thats literally 10 times less!! managed to do this by compressing the audio files, although the change is almost unnoticeable, and also making the engine bake some textures on build time, just like real fancy engines do! Changed a bit the main menu/ campaing mode but for now it is all a placeholder Created a new itch.io banner Made the HELP menu show up by default, i dont really like this but i think its probably the best for people to rate it nicely, wont be in the final version… Added a input mode (another one) to the spaceship building mode that allows you to hover the attachment points and it will tell you with a little popup what category of part can go there If you are rating my project, please ishowspeed i need this now in all fairness i hope people like my game! im not even close to finishing it lol Right after this first ship i will work on updating the engine to support new features that the campaign mode will certainty need 100%, like a working physics engine, ive thought of porting what i currently have to use a new one i found and that is getting very popular called “Box3D”, we’ll see, byeeeeeee
JSP I want to dedicate this devlog to @Rupnil as he always says that devlogs need to be 3-4 hours max, so i can explain why thats not always possible. Out of the 8 hours i devlog today, around 7.5 of them were spent ONLY debugging ONE SINGLE BUG for 2 whole days. I started losing my mind lmfao the bug: All the built-in and embedded textures became completely broken and ONLY on super specific conditions on certain parts and game modes. But the worst part was that rolling back to a version from days ago DID NOT solve the issue at all . I even considered that my GPU gave up on my and it was just showing gpu artifact slop in my screen the fix: Apparently there was a small bug with gpu memory allocation in the backend of dear imgui (apparently ONLY in the SDL2-OpenGL backend lmfao) and only for the docking branch of the repo. Rolling back to an old dear imgui version from the main branch solved the issue but damn. Ive also reported the issue as much as i could in the official repo. Pretty much, updating the engine to the latest version automatically updated its dependencies and thus leaked the bug to my game Appart from that I’ve spent a little bit on starting to develop the open-universe system where you can travel around planets! More on that in the next devlog probably. I already have though about the planet’s names, positions and stuff! pretty exiting!! PD: In the mean time ive also being updating the engine at the same time to improve the physics system, which is a lot better right now!
JSP This is one of the most exiting devlogs so far!! I’ve managed to get a very basic “solar system working, not all the time and of course it isnt perfect but it is really cool, heres its lore: (note that planets are placeholders right now, and distances/scale should be a lot bigger in the future) The “Halcyon” System Somewhere very very far from our current home, humanity has managed to establish a multi-planetary life in a new system after traveling for generations in their own space station The Halcyon system is composed of 5 planets (maybe more in the future) that orbit around a massive black hole (it doesnt have a name yet) “Gaia” is the earth-like planet whose own satellite, “Vesta”, is a red dwarf star that provides just enough light and heat in order to live (seen in the demo video) “Ying” and “Yan” (names will probably change), are two tiny planets that follow exact opposite orbits around the black hole, when one of them is at the perihelion, the other ones at the aphelion “Kepler” is a huge rocky planet at the outskirts of the system where small human colonies currently live Note that the campaign will be linear and happen entirely inside this place, but you will also have a “exploration” game mode that will allow you to find and see new secrets hidden… :)) Technical stuff (i.e. what was added) Created the base for the Halcyon System, planets follow a predetermined elliptical orbit in real-time. Note that for debugging, scale is around 10 to 100 times less! Added a simple physics based player controller, this took a lot of engine refactoring too. The player is affected by the gravity of the near planets and, when close enough to a planet’s surface, it is automatically aligned with the gravity vector and its also affected by the atmosphere’s drag (if theres any), this was by far the most difficult thing to do Added a little Free Camera controller as well What will be added in the future This is only the start . Theres still a few complicated things to do: Add double precision and floating origin to solve the problems that will appear when distances become as big as id like them to be Add a chunked collision mesh system for planets with complex geometry, like mountains or things like that. Right now they are all controlled by a simple kinematic sphere collider This system currently breaks the player movement when planets are moving, this is why i set “time scale” to 0. To fix this ive been thinking of creating a local physics world that sets the planet you are on to be the origin of the physics, making it look like if the planet was static, this will by by far what will take the most amount of work probably i also wanna update the atmospheric shader as it is by far the thing worsening the game’s performance, and id like to make the sky fully tint when your inside it PD: Thank you so much for all the people that support/follow this project, it already has 21 followers . thank you, really!
JSP Worked on so many things before getting started with the complicated stuff, ill tell more about that in the bottom section, but for now, im pretty happy with what ive just added, even tho progress is pretty slow!!! What have i added? Full/complete atmospheric effect , it now not only looks good from outside, now from the inside too!!! Its a small trick but when the camera gets close enough to a planet, its atmosphere’s density scales up making the sky blue like here on earth or greatly improving the sunrises and sunsets , they do look beatiful Added floating origin: double precision was not enough so ive added a system that teleports all the entities in the scene when the player gets too far from the origin, this works surprisingly good and it was very simple to do, hopefully it wont break physics later on, but so far its great! This allows the solar system to go from ~10000 units wide to over ~3000000!! that is great! This was a engine-level change mostly tho You can finally use the planets you discover in the campaign mode in the sandbox mode Dynamic settings!!! I made it so that when you first load into the game, the UI scales to your resolution and your target fps are set to your monitor’s refresh rate, might not look like something important but this is actually HUGE Whats cooking up currently! Need a system to allow the player to be placed on top of moving planets (it currently works but breaks sometimes), and also to allow those planets to rotate. This will be achieved with a completely new physics world that will live localy on the closest planet the player is to Chunked mesh collider system i really dont know how to this, because of the terrain of my planets (TODO), collisions will be complicated to calculate, if you know about anything that could help, please send it!!! PD: I wish i could spend more time actually coding than thinking, if that were to be the case id have 300 hours+ in this project already
JSP Omg i need a break! just one more change bro and i will start doing the hard and boring stuff, just one more i swear! This sums up everything ive done for the past few hours, although the new improvements are actually quite important, i feel like im somewhat rushing them instead of focusing on the exploration mode New things!! Simple LOD system for planets, there wasnt a big performance change, but the model swap is very unnoticeable and nice so thats great! Added a simple spoiler warning to the exploration mode, the original idea was that you should unlock it after playing the campaign but i guess its fine lol I FIXED THE DEPTH BUFFER PRECISION ISSUE!!!! it was such a small change omg, i just dynamically changed the near plane of the camera based on how far you are to a planet, pretty nice WIP Work in progress: I’m porting the whole game to the new action-based input system so that the game supports controllers natively without any kind of steam layer on top, this is till very early and i still dont know how to make some stuff be fun to use with a controller…. I finish this, finish the two major things on the exploration mode that are 100% gonna be quick, make some decent amount of content for it, add the custom spaceship controller and launch system, make the first ~5 minutes of the campaign mode, and then SHIP THIS PROJECT (this will surely go as planned) PD: the video u see is completely controlled with my gamepad, not the best controls yet but its better than nothing!
JSP! I’ve finished porting the game to the new action based input system, its not great yet, theres a lot to polish but at least you can play 80% of the game just as good as with a keyboard/mouse (even better sometimes!) What’s the new input system? The game now asks for “actions” callbacks instead of directly asking for raw input. This new layer in the middle allows to make different devices have their own way to control each actions, so it now supports all the gamepads you probably have: xbox, playstation, steam, nintendo, generic ones too It is almost steam deck ready! Ive been playing this game on my steam deck and it works great! (you can get around 900 fps when unrestricted) Playing the game with a controller plus a little help from the little mouse trackpad really makes this game fun to play (100% coverage with this setup) Now i will finally start doing the boring physics stuff that will hopefully not take so long but idk, we’ll have to see Other stuff that was added Improved a bit the gravity based movement mode, it now adds the atmosphere’s drag gradually depending on its density, being the density higher the closer you are to the surface, this makes entering planets feel better Fixed some messed up formatting style in my code I dont know if start a new project for no more than 2 weeks and then go back, ive been having some cool new ideas but for now ill stick to this project PD: the picture is an old version (0.12.1), latest version with good controller support is 0.14.0
JSP We are SO back! I thought it would take me weeks to solve this issue but it wasnt that hard, thanks claude lol for helping. It’s not perfect just yet but its honestly crazy how my own engine managed to handle what im about to explain What took soo long The game now handles a transition from a global physics world to a new extra physics world that lives locally when the player enters a new planet (the origin of the new physics world would be the planet’s center), this means that you can perfectly walk on the surface of all the planets while they move around in the orbits without any weird behaviors This took a good amount of engine refactoring and a few changes to some systems (specially the floating origin) I need to fix a couple things like the drag when you are entering a planet, but that should be handled later on when you actually use a spaceship to enter and not just yourself with your spacesuit Other stuff that is cool Added a helmet overlay! (very inspired by outer wilds, id like some suggestions to make it more original honestly, but right now it decent). It is currently work in progress tho, and theres a lot of information missing… Small UI improvements: rounded borders, removed window’s transparency, added window close sound effects (need to find a better one tho), little better controller support… I just this idea to have vehicles but that will take super long, its added to the ideas file but thats certainty not being considered for short term, Any suggestions are welcome tho PD: video is very bad res bc i had to compress it unfortunately
J.S.P. Very exciting changes to the exploration mode yay !! I’ve been working on precisely TWO (2) things but one of them is way too early for me to be able to show you anything, more on that in the end Whats new? I’ve create a custom blender addon that lets me create procedural noise-based planets! It is really powerful and it gets you really good results for how simple it is really. In a way, its nothing but a vertex shader but coded in python lol It generates 3D spherical noise and applies it into an icosphere with a variety of parameters. Some of them arent precisely working but they are fine for now (specially the “ridged” option) You can try it yourself, its open source too! https://github.com/aloyak/JSP/blob/main/assets_src/blender/addons/planet_generator.py Terrain System I’m developing a way for the player to correctly collide with the geometry of these planets, but this is mostly engine-sided changes and I’m not very deep into it yet. I’m currently researching how to handle multi-threading async functions… more information about this in my latest engine’s devlog: https://stardance.hackclub.com/projects/1029/devlogs/34738 Known issues These are not really important right now, but for some reason I’ve realized that the splash screen takes different amounts of time depending on where you run the game?? what? A steam deck is around 3 seconds, my computer (the intended duration) is 4 seconds and in a friend’s laptop it is ~0.5 seconds
JSP! I’m back! and I finally have a new decent version that im probably gonna ship shortly after I publish this devlog. Its been so long since the last devlog because a number of factors, I had some vacations, my main pc is now just a steam deck connected to a monitor and also I’m kind of struggling to continue this project, I hope this isnt the last version but working on the project and adding or fixing things is very complicated and requires a lot of research to do it right, and it is exhausting What was added?? Included the new planet models to the halcyon system, you can now correctly explore them by using the new terrain system I added to the engine! Added some small help windows/hints for the new stuff before shipping! Fixed some audio bugs and added a sound effect for when you close a window Fixed the in-helmet HUD UI, the input vectors now correctly show the direction the thrust is being applied to, kinda like in Outer Wilds!! I’m most likely to be focusing on continuing the engine for a little bit, it really really does require some refactoring and I also need to clean some likely dead code or at least re-understand the code i wrote as it has lines from almost a 10 months ago! Hopefully someone could help and contribute to the project maybe or make something new out of it too! Im still planing on continuing to develop it but not at this pace considering im about to start college :))
Ships:
This is my 3D game about space exploration and kessler cascades, it has a campaign mode coming up but i havent finished that yet, for now enjoy the 3 game modes! i built this on top of my custom engine so its been a lot of hard work, please try it out!!!!
This is my 3D exploration-sandbox game that I built with my custom game engine! I’ve added quite a lot of stuff like a simple exploration game mode that allows you to move around a hand-crafted solar system i called “Halcyon”. there are also a lot of other game modes you can try and have fun with before I finally add the campaign game mode for the final version! In the picture you can see an in-game screenshot of the player walking around the surface of the earth-like planet “Gaia”, hope you like my game! With <3, 4loyak!...
|
1792828335.4881313
|
1792914735.4881313
|
|
24310
|
BitDrop by @thestarviper | Stardance
|
thestarviper
|
1
|
160.0
|
3167
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-10T09:55:31Z", "hours": 160.0, "multiplier": 19.75, "payout": 3167, "blessing": "neutral", "text": "PLEASE READ THE HINTS SO YOU KNOW HOW TO PLAY I made a pachinko roguelite game that is inspired by balatro, slay the spire, and ultrapool. The game is a web game that is hosted on itch.io so no need to download anything. Have fun!", "repo": "https://github.com/TheStarViper/Bitdrop", "demo": "https://thestarviper.itch.io/bitdrop"}]...
|
[{"post_id": 44510, "ts": "202 [{"post_id": 44510, "ts": "2026-08-10T09:53:13Z", "hours": 1.0939, "text": "UPDATE #32 FIREFOX SUCKS Summary FIREFOX SUCKS. anyways i added a buncha sfx and ct5 found a bug where the game done goofy mode on firefox so i had to fix that breakdown map hover sfx shop buy sfx cashout sfx basket score sfx node pin sfx louder on playtester request used playtester feedback: this game on firefox compiled weird goofy its up on itchio now wowie #SHIP TIME YAYAYAYAYAYAYAY"}, {"post_id": 44482, "ts": "2026-08-10T08:38:47Z", "hours": 1.9064, "text": "UPDATE #31 Balancing Summary ITS ALL COMING TOGETHER RAHHHHH. I added like 10 new daemons changed icons and balanced the prices along with sending my project into the hackclub slack for playtesting. breakdown added 10 new daemons changed icons of every daemon since they shared the same icon balanced prices of consumables and daemons used playtester feedback: some things were confusing so i added more hints used playtester feedback: a button in the shop was unintuative so i made it so that it worked more intuiatively used playtester feedback: playtester found a bug with one of the new daemons that destroyed itself didnt free up a slot NEXT UPDATE IS JUST SOUND EFFECTS AND MAYBE FEEDBACK FROM SLACK THEN I SHIP YAY IM GETTING THIS DONE BEFORE I SLEEP"}, {"post_id": 44442, "ts": "2026-08-10T06:02:41Z", "hours": 4.5892, "text": "UPDATE #30 A little bit of everything Summary added a loss screen, another pin modifier, changed clone pin graphic, added music, changed map nodes, added overload mechanic breakdown added a loss screen with a loss sound effect added another pin mod called “Amplify” which just gives 1.5x score on hit to the ball changed clone pin graphic to show the pull distance and changes with leveling added main menu music and gameplay music changed map nodes by renaming them and changing colors around made final boss node bigger than it was originally for emphasis added overload mechanic that basically is a multiplier that increases by .08x per pin hit and decreases by .4x per second and adds the multiplier on scoring Things to polish before shipping daemons consumables balancing sfx"}, {"post_id": 43180, "ts": "2026-08-08T09:27:38Z", "hours": 2.7903, "text": "UPDATE #29 Polish Polish Polish Summary added a few consumables and added basket mods breakdown added a consumable to multiply a basket’s mult by 1.5x permanently added a consumable to lower quota on a level by 25% added a pin modifier that makes balls gravitate towards it made it so that consumables in shop can have weights Things to polish before shipping daemons consumables pin mods screenshake more tutorial steps music / sfx balancing"}, {"post_id": 43020, "ts": "2026-08-08T01:57:36Z", "hours": 2.4019, "text": "UPDATE #28 Endless Mode Summary added a win screen for when you win with a button to go endless mode called “ascensions” breakdown made endless mode made win screen (prolly should make it look better) fixed bug where you clicking back in a submenu in escmenu would double click and exit out of esc menu entirely fixed bug where you couldnt exit stats menu in escmenu from main menu Roadmap in order of completion add consumables for baskets to multiply basket mult re-org code before polish and balance cuz its kinda goofy spaghetti silly polish and balance by adding more stuff and things in general to daemons,consumables,stats,settings,pin mods add more screenshakes cuz i only have a few screenshakes music"}, {"post_id": 42465, "ts": "2026-08-07T06:51:18Z", "hours": 3.2836, "text": "UPDATE #27 Tutorial Summary made a hint based tutorial system every time you encounter a new mechanic breakdown made it so that in 1-2ish lines of code you can add a new hint to any aspect of the game hints pop up only on the first time you encounter a mechanic hints darken the background and go away with a glitch effect and sound effect after clicking “got it” button Roadmap in order of completion fix some of the bugs i have noted down in a personal doc that are hard to explain endless mode daemon synergies maybe add consumables for baskets still not decided polish and balance by adding more stuff and things in general to daemons,consumables,stats,settings,pin mods music"}, {"post_id": 42369, "ts": "2026-08-07T01:41:28Z", "hours": 2.8478, "text": "UPDATE #26 Main Menu Summary made a main menu breakdown took the grid background from the map and put it in the main menu took the tri-circle spinning animation from the map and put it in the main menu reused the button class i use everywhere settings button just goes to the settings menu i already made stats button just goes to the stats menu but i think ill change it to a tutorial button terminate button just gives a popup that says “its a web game silly” Roadmap in order of completion add tutorial endless mode daemon synergies maybe add consumables for baskets still not decided polish and balance by adding more stuff and things in general to daemons,consumables,stats,settings,pin mods music"}, {"post_id": 41791, "ts": "2026-08-06T06:19:51Z", "hours": 4.7828, "text": "UPDATE #25 Escape Menu three Summary added settings and stats page to the esc menu thing breakdown made it so that you can add more stats and settings with just one line of code to control or display a variable added a gamespeed notched slider added volume slider added screenshake toggle added a bunch of stats in the stats page moved back button to the bottom of the menu since we are nearing the phase where i ship this project i already have set a roadmap of things i need to do so i figure i could just share it here: add main menu maybe add consumables for baskets still not decided add tutorial endless mode daemon synergies polish and balance by adding more stuff and things in general to daemons,consumables,stats,settings,pin mods music"}, {"post_id": 41566, "ts": "2026-08-05T21:07:59Z", "hours": 4.3561, "text": "UPDATE #24 Escape Menu two Summary pin mods now show what level they are aswell as all the other mods on the pin in the form of colors and dots and hovering shows it more detailed also escape menu has buttons now. breakdown escape menu now has buttons and a different color back button when opening esc menu theres a glitch effect now along with a sound effect and closing does same thing putting a mod on the pin outlines the pin with the color of the mod and a dot for every level of the mod putting multiple mods on a pin divides the outline into multiple parts Next update plan add stats menu add settings menu add main menu maybe add consumables for baskets aswell but prolly the update after this one"}, {"post_id": 41090, "ts": "2026-08-05T01:46:24Z", "hours": 8.2328, "text": "UPDATE #23 Escape Menu Summary modularized code for pin mods, added levels and max levels, started work on an escape menu for settings. breakdown hover on nodes now shows level of the modifier on the node nodes like clone level 1 have it so the payout is split between the two balls and level 2 has it so that it isnt split between the two added menu button next to balance display modularized code for pin modifiers so its easier to add conflicts and such in the future and new features esc puts you in an esc menu to quit run new run settings optinos etc the same as the menu button esc menu stops time and physics aswell as all interaction in game until you unpause fixed issue where reroll text would overflow outside of the reroll box so now it resizes to fit inside of the reroll button node modifiers were also split into a different file Next update plan I got sidequested again for the escape menu so ill be working on that in tandem with the modifiers code and stuff make pins on modifiers visually distinct that can be stacked ontop of each other more work on esc menu"}, {"post_id": 40371, "ts": "2026-08-03T20:39:02Z", "hours": 6.2458, "text": "UPDATE #22 consumable board editor TWOOOO Summary made is so you can stack mods on pins and some are incompatible with others breakdown you can stack mods of different types on pins some mods are incompatible with each other if you modify a pin with an incompatible modifier it will just remove the conflicting modifier from the pin red alert text on consumables with conflicting modifiers hover shows the pins modifiers Next update plan you can stack modifiers on the same pin to level it up more pin modifier types make pins on modifiers visually distinct that can be stacked ontop of each other"}, {"post_id": 39200, "ts": "2026-08-02T00:08:00Z", "hours": 5.2997, "text": "UPDATE #21 consumable board editor Summary added new consumables that modified pins on the board to do different things breakdown added system where you can select nodes now added system where you can select multiple things to modify with a consumable added pin effect “mitosis” splits node into two added pin effect “overclock pin” makes pin valued at 1.5mb instead of 1mb prolly changing this this was just testing added pin effect “volitile pin” makes pin add a random payload from 1-10mb also was just testing prolly will modify this Next update plan add more sound effects make it so mitosis is called miosis and splits the value of the ball into half between the two balls make it so you can modify a pin with multiple modifiers and hovering shows what mods it has make pin modifiers like minecraft enchantments where you can apply some modifiers not with each other like mending + infinity isnt possible in minecraft or fortune + silk touch type thing"}, {"post_id": 38025, "ts": "2026-07-31T05:20:46Z", "hours": 3.1969, "text": "UPDATE #20 more animations Summary got sidetracked from original plan and made daemons look better along with making the map have velocity that keeps momentum after you stop scrolling breakdown made daemons look better using a dual layer system map has velocity that decreasese in speed after you stop scrolling with mouse click or scroll wheel dual layer daemon graphics I think this is kinda cool so basically i have the empty daemon slot image and when a daemon slot is empty it just keeps that sprite up and adds text ontop of that that says empty daemon slot (number). But when you get a daemon it uses the same hueshift function i have from the shop daemons and consumables and hueshifts an overlay with a transparent interior to add color and stuff. Empty daemon slot: empty daemon sprite layered text saying slot number and that it’s empty Occupied daemon slot: empty daemon sprite occupied daemon overlay with hue shift title and description text overlay + level overlay then put hover effects and stuff ontop Next update plan add more sound effects expand consumables system"}, {"post_id": 37419, "ts": "2026-07-30T03:53:05Z", "hours": 2.9794, "text": "UPDATE #19 more animations Summary added buy and sell animations along with fixing a few bugs it was alot faster than initially planned cuz it was just re-purposing existing code breakdown added buy animation for deamons and consumables added sell animations for daemons and consumablse fixed bug where shop didnt refresh when you re-enter after beating a level fixed bug where boss levels had a smaller quota than normal levels screenshake helper function implemented so i can just put screenshake(intensity,duration); anywhere and add screenshake with one line added a glitch location helper function based off my glitch transition code so now you can do TriggerGlitchAt(bounding-box-using-raylib-rectangle, duration); to glitch effect a location for a duration Next update plan maybe 6 hours for this update add more sound effects expand consumables system maybe make daemons look better but that might be for the update after this one"}, {"post_id": 36874, "ts": "2026-07-29T07:14:51Z", "hours": 4.0314, "text": "UPDATE #18 Shop Graphics Update pt 2 Summary updated shop graphics for consumables and made a custom class to make custom shaped polygons breakdown made consumables look better made consumables have a full consumables slot graphic and a not enough money alert made consumables have a background thingy in the shop that looks cool same hue shift graphic trick applied to the consumables like the daemons made insufficient funds for the daemons larger and more clear made a custom class for making polygons with an arbitrary number of vertexs so its faster to make polygons instead of the original way i used which was draw triangle fan made it so the class also detects hovers and clicks built in to make it easier Next update plan im hoping this next update can be completed in like 5 hrs or less to keep the pace of more frequent devlogs add buy animations add sell animations screen shake helper function"}, {"post_id": 36228, "ts": "2026-07-28T05:20:56Z", "hours": 4.4294, "text": "UPDATE #17 Shop Graphics Update pt 1 Summary updated shop graphics and animation breakdown used ai to generate a shop item slot and polished it in microsoft paint you can hover buttons and the main part and plays sfx buttons now have 6 vertexes daemons only get bought on left click release instead of on click since the shop items use sprites now instead of vector drawing i now hue shift the sprite to acheive different colors from one sprite (this took a while) reduced shop to have 4 items instead of 5 for balance and to fit the graphics nicer Next update plan update the consumables section of the shop to look better add buy animations"}, {"post_id": 35691, "ts": "2026-07-27T09:09:29Z", "hours": 3.3542, "text": "UPDATE #16 Map Graphics Update Summary updated the nodes in the map to look better and custom icons along with making the pathways more distinct from the background breakdown swirling things around node passively gliched nodes have funky movement with their animation which i find cool made pathways more distinct from background lines color nodes now have icons instead of text Next steps I currently plan to dedicate the next few updates to improving graphics before i continue with the gameplay changes i have listed below balancing endless mode skill tree overclock shards and daemon leveling daemon synergies more consumables more sfx more animations"}, {"post_id": 35028, "ts": "2026-07-26T05:56:26Z", "hours": 4.0314, "text": "UPDATE #15 Consumables Shop Summary Added consumables to the shop and reduced consumables slots breakdown you can buy and reroll consumables in shop reroll animation rerolls consumables too the consumables are a different shape then daemons in shop i gotta figure out the colors to be more different tho two consumable slots instead of four Next steps i came up with alot more ideas to implement balancing endless mode skill tree overclock shards and daemon leveling daemon synergies more consumables more sfx more animations"}, {"post_id": 34387, "ts": "2026-07-25T02:01:05Z", "hours": 6.0822, "text": "UPDATE #14 Consumables 2 Summary Added two consumables, changed price of rerolls and did some code restructuring. breakdown added a consumable “flash sale” is basically temperance from balatro and gives sell value of all your daemons into your balance added a consumable “dycrypt” and it decrypts unknown nodes so you know what they are moved the payout ball orb stuff to a different file moved the transitions stuff to a different file you can now sell consumables and it adds to the balance aswell two types of consumable one is instant use and one requires selecting something to effect i will use this later on nodes Next steps balancing more consumables more sfx more animations"}, {"post_id": 33390, "ts": "2026-07-23T09:24:36Z", "hours": 3.9456, "text": "UPDATE #13 Consumables Summary Added consumables slots graphics and the use/sell buttons that do nothing so far mainly ripped from the daemon code along with basic backend structure for consumables. also fixed a bug where hovering sfx never stopped playing on glitched nodes Next steps balancing consumables actions more sfx more animations"}, {"post_id": 32852, "ts": "2026-07-22T08:34:06Z", "hours": 5.7922, "text": "UPDATE #12 Audio Summary Added sound effects and shop polish breakdown transition sound (my favorite) bounce sound (need a better one) hover glitched node sound hover daemon sound hover shop item sound hover shop items for more interactivity Next steps balancing consumables more sfx more animations"}, {"post_id": 32205, "ts": "2026-07-21T06:57:06Z", "hours": 1.8539, "text": "UPDATE #11 Graphics Summary Added moving daemon animation and added encrypted nodes into the map that are a mystery of what it is until you click on them Next steps balancing consumables shop polish with hovers sfx near the end more animations"}, {"post_id": 30986, "ts": "2026-07-19T00:25:17Z", "hours": 6.2539, "text": "UPDATE #10 Graphics Summary Added money adding animation, 4 new daemons, and a reroll animation Finer Details rerolls have a glitch animation money scoring summons energy balls that glitch into balance 1 for each remaining ball and 1 for the money winning the level fixed bug where you could have over 5 daemons new daemon “Honeypot Trap” 30% chance to duplicate score new daemon “Firmware Backdoor” +5MB per node hit new daemon “Proxy Chain” multiplier per daemon owned (1.2x,1.4x,1.6x) new daemon “Rootkit Persistence” every 3rd ball scores 3x Next steps balancing consumables shop polish with hovers sfx near the end more animations"}, {"post_id": 30395, "ts": "2026-07-17T21:48:54Z", "hours": 6.2739, "text": "UPDATE #9 Map PT 3 Summary Added menu transitions, fixeds a few bugs Finer Details changes orange glow on current column to green made the nodes offset on the y and x axis a bit so it looks less grid-like added a glitch menu transition fixed bug where you couldnt interact with daemons in the map menu fixed map generation that generates stray nodes fixed map generate that generated incomplete paths level name it now displayed on box on hover light path that shows a path you can take to get to the node if you hover a future node from current node nodes no longer mostly connect to every single other node Next steps consumables shop polish with hovers sfx near the end more animations"}, {"post_id": 29365, "ts": "2026-07-16T08:28:25Z", "hours": 8.6403, "text": "UPDATE #8 The Map PT 2 Summary Polished the map more and added it into the gameplay loop so that it sets the quota and adds money still no animations for these Finer Details levels give money now levels have a random amount of money that increase as you go levels interact with setting rewards and score requirements quota and reward are displayed on hover corner brackets appear with easing in and out size on hover aswell changed based unit to MB from KB cuz KB of data are kinda smol fixed some frame update bugs where the stuff updates after selection making it look weird for a frame faint orange glow on the column of levels you are on Next steps you can’t sell daemons in the map for some reason map polish level node entry point map path generation sometimes generates a void where you cant progress and also every node connects to every other consumables shop polish with hovers sfx near the end more animations"}, {"post_id": 28533, "ts": "2026-07-14T20:51:02Z", "hours": 9.1822, "text": "UPDATE #7 The Map Summary I made it so rerolls cost money, empty daemon slots have a graphic now and started the start of a level map/selector. Finer Details made a hacking style map based on slay the spire’s level selector map currently randomly generates nodes and connections map scrolls using left or right click along with scroll wheel nodes also have random descriptions as ive yet to come up with names for enemies and bosses i thought NETWATCH from cyberpunk 2077 would be cool if you can’t afford a reroll the button gets darker to signal Next steps you can’t sell daemons in the map for some reason finish map to link to game consumables shop polish with hovers sfx near the end more animations"}, {"post_id": 26490, "ts": "2026-07-11T09:42:24Z", "hours": 5.0842, "text": "UPDATE #6 The Black Market part 2 Summary I started finishing the shop system i started last devlog. I added rerolls to the shop aswell as a next round button. I also added 2 new Daemons. Finer Details New Daemon “Schrodinger’s Basket” 50% chance of 2.5x points 50% chance of .5x points New Daemon “Dark Web Node” 5% chance for 15x points on scoring made it so when you buy a daemon it gets sold out instead of infinite stock daemons you have dont show up in shop next button currently goes back to normal game but i want it to go to a levels screen/map like slay the spire made credits balance have a thousands seperator of “ “ instead of nothing and no comma cuz a spacebar looks cooler Next steps I want to add a graphic for empty daemon slots and add consumables of some sort and the upgrading daemon system along with the slay the spire level map. shop could use more polish with hovers and icons."}, {"post_id": 25812, "ts": "2026-07-10T08:45:53Z", "hours": 9.7839, "text": "UPDATE #5 The Shop part 1 Summary I started work on a shop system and have item purchases up now. I added a few new daemons and squashed a few new bugs. Fine Details New Daemon “Loyalty Points” 2x points every 5 pins hit New Daemon “Mesh Network” 1.5x score for every ball in play somehow made it so that the description variables werent being assigned in the class and took an hour to hunt that one down added a shop screen with the ability to buy a daemon extracted button logic from multiple places to a function to draw the button instead increased max score from -9.22 × 10^18 to 1.7 x 10^308 bytes made scores that are extremely large get formmated to scientific notation Next steps Still considering that hands system for later maybe in 3 devlogs I want to add a graphic for empty daemon slots and have you a bought item graphic so you cant buy it again in the same shop. reroll and next round button in shop."}, {"post_id": 24451, "ts": "2026-07-08T00:39:27Z", "hours": 6.2844, "text": "UPDATE #4 The Daemon Frontend Overview I made Daemons almost fully functional and made them affect the gamestate. I also added a visual so you know which ball is being effected by which daemon. Fine Details i accidentally used ^ instead of std::pow for one of my functions so it took a while to debug i added text wrapping to Daemon descriptions so that long descriptions dont overflow added a sell value to daemons and linked it to the credits display lines between daemons and balls fade out made is so that the line picks a random starting point on the left side of the daemon Next steps I’m thinking of making a hands system where you choose how many balls you drop at the start and then you have to wait till they all score before you can drop more balls. I want to add a graphic for empty daemon slots and add a shop system which pops up after you pass the score threshold and all balls finish scoring."}, {"post_id": 23373, "ts": "2026-07-06T09:29:37Z", "hours": 8.7297, "text": "UPDATE #3 The Daemon Backend Overview just worked on backend this update and minor graphical changes. I made it so you can click on the daemons and move them up and down aswell as sell them. Fine Details i also changed the level of the daemon indicator location, added the graphic for overclocking (buff past max level planned in future basically), and made it easier to make daemons. Next steps i wanna add a sell value to the daemons to add to credit balance and make the credit balance actually exist. animations and making the daemons do stuff is next step then get back to pachinko"}, {"post_id": 21983, "ts": "2026-07-04T06:24:52Z", "hours": 7.4675, "text": "UPDATE #2 Overview added a class system for my daemons to try to be able to implement a large amount of them including daemon level, color, effects, etc. Made the balls bounce on pegs with animation and hover animation on daemons. also added the balls have a value shown and when scored the scored data is moved upwards a bit until it disappears Next steps the next steps i hope to achieve before the next devlog is that i hope to have a partly functional daemon system that works with the game or atleast be able to reorder and sell them before next update. AI USE had ai generate the daemons vector graphic"}, {"post_id": 21233, "ts": "2026-07-03T02:04:38Z", "hours": 5.1572, "text": "UPDATE #1 so this is the start of my game “BitDrop” it’s a pachinko roguelike that takes inspiration from games like balatro,slay the spire, ultrapool. How it works Your ball starts with a starting score of something i havent figured out the value of yet and gains score to and cashes out at the bottom. The 5 things on the right are jokers from balatro but like 100% original totally not jokers and are called daemons. There is a target Quota score measured in bytes with the base unit being a kilobyte and so on. The plan currently the plan is to have a limited amount of balls per turn and if you put multiple balls at the same time you gain a higher score multiplier but if you have balls leftover you get more money. The pegs i think would be able to be upgraded and the balls aswell. The baskets will prolly be the same throughout and the daemons will assist with scoring higher What i have so far graphics balls drop have have physics balls bounce off pegs everything else not listed is placeholder graphics but yeaaaaa thats about it and the idea for the gameeeeee thank youuuuuu"}]...
|
Title: BitDrop by @thestarviper | Stardance
Devlo Title: BitDrop by @thestarviper | Stardance
Devlogs:
UPDATE #1 so this is the start of my game “BitDrop” it’s a pachinko roguelike that takes inspiration from games like balatro,slay the spire, ultrapool. How it works Your ball starts with a starting score of something i havent figured out the value of yet and gains score to and cashes out at the bottom. The 5 things on the right are jokers from balatro but like 100% original totally not jokers and are called daemons. There is a target Quota score measured in bytes with the base unit being a kilobyte and so on. The plan currently the plan is to have a limited amount of balls per turn and if you put multiple balls at the same time you gain a higher score multiplier but if you have balls leftover you get more money. The pegs i think would be able to be upgraded and the balls aswell. The baskets will prolly be the same throughout and the daemons will assist with scoring higher What i have so far graphics balls drop have have physics balls bounce off pegs everything else not listed is placeholder graphics but yeaaaaa thats about it and the idea for the gameeeeee thank youuuuuu
UPDATE #2 Overview added a class system for my daemons to try to be able to implement a large amount of them including daemon level, color, effects, etc. Made the balls bounce on pegs with animation and hover animation on daemons. also added the balls have a value shown and when scored the scored data is moved upwards a bit until it disappears Next steps the next steps i hope to achieve before the next devlog is that i hope to have a partly functional daemon system that works with the game or atleast be able to reorder and sell them before next update. AI USE had ai generate the daemons vector graphic
UPDATE #3 The Daemon Backend Overview just worked on backend this update and minor graphical changes. I made it so you can click on the daemons and move them up and down aswell as sell them. Fine Details i also changed the level of the daemon indicator location, added the graphic for overclocking (buff past max level planned in future basically), and made it easier to make daemons. Next steps i wanna add a sell value to the daemons to add to credit balance and make the credit balance actually exist. animations and making the daemons do stuff is next step then get back to pachinko
UPDATE #4 The Daemon Frontend Overview I made Daemons almost fully functional and made them affect the gamestate. I also added a visual so you know which ball is being effected by which daemon. Fine Details i accidentally used ^ instead of std::pow for one of my functions so it took a while to debug i added text wrapping to Daemon descriptions so that long descriptions dont overflow added a sell value to daemons and linked it to the credits display lines between daemons and balls fade out made is so that the line picks a random starting point on the left side of the daemon Next steps I’m thinking of making a hands system where you choose how many balls you drop at the start and then you have to wait till they all score before you can drop more balls. I want to add a graphic for empty daemon slots and add a shop system which pops up after you pass the score threshold and all balls finish scoring.
UPDATE #5 The Shop part 1 Summary I started work on a shop system and have item purchases up now. I added a few new daemons and squashed a few new bugs. Fine Details New Daemon “Loyalty Points” 2x points every 5 pins hit New Daemon “Mesh Network” 1.5x score for every ball in play somehow made it so that the description variables werent being assigned in the class and took an hour to hunt that one down added a shop screen with the ability to buy a daemon extracted button logic from multiple places to a function to draw the button instead increased max score from -9.22 × 10^18 to 1.7 x 10^308 bytes made scores that are extremely large get formmated to scientific notation Next steps Still considering that hands system for later maybe in 3 devlogs I want to add a graphic for empty daemon slots and have you a bought item graphic so you cant buy it again in the same shop. reroll and next round button in shop.
UPDATE #6 The Black Market part 2 Summary I started finishing the shop system i started last devlog. I added rerolls to the shop aswell as a next round button. I also added 2 new Daemons. Finer Details New Daemon “Schrodinger’s Basket” 50% chance of 2.5x points 50% chance of .5x points New Daemon “Dark Web Node” 5% chance for 15x points on scoring made it so when you buy a daemon it gets sold out instead of infinite stock daemons you have dont show up in shop next button currently goes back to normal game but i want it to go to a levels screen/map like slay the spire made credits balance have a thousands seperator of “ “ instead of nothing and no comma cuz a spacebar looks cooler Next steps I want to add a graphic for empty daemon slots and add consumables of some sort and the upgrading daemon system along with the slay the spire level map. shop could use more polish with hovers and icons.
UPDATE #7 The Map Summary I made it so rerolls cost money, empty daemon slots have a graphic now and started the start of a level map/selector. Finer Details made a hacking style map based on slay the spire’s level selector map currently randomly generates nodes and connections map scrolls using left or right click along with scroll wheel nodes also have random descriptions as ive yet to come up with names for enemies and bosses i thought NETWATCH from cyberpunk 2077 would be cool if you can’t afford a reroll the button gets darker to signal Next steps you can’t sell daemons in the map for some reason finish map to link to game consumables shop polish with hovers sfx near the end more animations
UPDATE #8 The Map PT 2 Summary Polished the map more and added it into the gameplay loop so that it sets the quota and adds money still no animations for these Finer Details levels give money now levels have a random amount of money that increase as you go levels interact with setting rewards and score requirements quota and reward are displayed on hover corner brackets appear with easing in and out size on hover aswell changed based unit to MB from KB cuz KB of data are kinda smol fixed some frame update bugs where the stuff updates after selection making it look weird for a frame faint orange glow on the column of levels you are on Next steps you can’t sell daemons in the map for some reason map polish level node entry point map path generation sometimes generates a void where you cant progress and also every node connects to every other consumables shop polish with hovers sfx near the end more animations
UPDATE #9 Map PT 3 Summary Added menu transitions, fixeds a few bugs Finer Details changes orange glow on current column to green made the nodes offset on the y and x axis a bit so it looks less grid-like added a glitch menu transition fixed bug where you couldnt interact with daemons in the map menu fixed map generation that generates stray nodes fixed map generate that generated incomplete paths level name it now displayed on box on hover light path that shows a path you can take to get to the node if you hover a future node from current node nodes no longer mostly connect to every single other node Next steps consumables shop polish with hovers sfx near the end more animations
UPDATE #10 Graphics Summary Added money adding animation, 4 new daemons, and a reroll animation Finer Details rerolls have a glitch animation money scoring summons energy balls that glitch into balance 1 for each remaining ball and 1 for the money winning the level fixed bug where you could have over 5 daemons new daemon “Honeypot Trap” 30% chance to duplicate score new daemon “Firmware Backdoor” +5MB per node hit new daemon “Proxy Chain” multiplier per daemon owned (1.2x,1.4x,1.6x) new daemon “Rootkit Persistence” every 3rd ball scores 3x Next steps balancing consumables shop polish with hovers sfx near the end more animations
UPDATE #11 Graphics Summary Added moving daemon animation and added encrypted nodes into the map that are a mystery of what it is until you click on them Next steps balancing consumables shop polish with hovers sfx near the end more animations
UPDATE #12 Audio Summary Added sound effects and shop polish breakdown transition sound (my favorite) bounce sound (need a better one) hover glitched node sound hover daemon sound hover shop item sound hover shop items for more interactivity Next steps balancing consumables more sfx more animations
UPDATE #13 Consumables Summary Added consumables slots graphics and the use/sell buttons that do nothing so far mainly ripped from the daemon code along with basic backend structure for consumables. also fixed a bug where hovering sfx never stopped playing on glitched nodes Next steps balancing consumables actions more sfx more animations
UPDATE #14 Consumables 2 Summary Added two consumables, changed price of rerolls and did some code restructuring. breakdown added a consumable “flash sale” is basically temperance from balatro and gives sell value of all your daemons into your balance added a consumable “dycrypt” and it decrypts unknown nodes so you know what they are moved the payout ball orb stuff to a different file moved the transitions stuff to a different file you can now sell consumables and it adds to the balance aswell two types of consumable one is instant use and one requires selecting something to effect i will use this later on nodes Next steps balancing more consumables more sfx more animations
UPDATE #15 Consumables Shop Summary Added consumables to the shop and reduced consumables slots breakdown you can buy and reroll consumables in shop reroll animation rerolls consumables too the consumables are a different shape then daemons in shop i gotta figure out the colors to be more different tho two consumable slots instead of four Next steps i came up with alot more ideas to implement balancing endless mode skill tree overclock shards and daemon leveling daemon synergies more consumables more sfx more animations
UPDATE #16 Map Graphics Update Summary updated the nodes in the map to look better and custom icons along with making the pathways more distinct from the background breakdown swirling things around node passively gliched nodes have funky movement with their animation which i find cool made pathways more distinct from background lines color nodes now have icons instead of text Next steps I currently plan to dedicate the next few updates to improving graphics before i continue with the gameplay changes i have listed below balancing endless mode skill tree overclock shards and daemon leveling daemon synergies more consumables more sfx more animations
UPDATE #17 Shop Graphics Update pt 1 Summary updated shop graphics and animation breakdown used ai to generate a shop item slot and polished it in microsoft paint you can hover buttons and the main part and plays sfx buttons now have 6 vertexes daemons only get bought on left click release instead of on click since the shop items use sprites now instead of vector drawing i now hue shift the sprite to acheive different colors from one sprite (this took a while) reduced shop to have 4 items instead of 5 for balance and to fit the graphics nicer Next update plan update the consumables section of the shop to look better add buy animations
UPDATE #18 Shop Graphics Update pt 2 Summary updated shop graphics for consumables and made a custom class to make custom shaped polygons breakdown made consumables look better made consumables have a full consumables slot graphic and a not enough money alert made consumables have a background thingy in the shop that looks cool same hue shift graphic trick applied to the consumables like the daemons made insufficient funds for the daemons larger and more clear made a custom class for making polygons with an arbitrary number of vertexs so its faster to make polygons instead of the original way i used which was draw triangle fan made it so the class also detects hovers and clicks built in to make it easier Next update plan im hoping this next update can be completed in like 5 hrs or less to keep the pace of more frequent devlogs add buy animations add sell animations screen shake helper function
UPDATE #19 more animations Summary added buy and sell animations along with fixing a few bugs it was alot faster than initially planned cuz it was just re-purposing existing code breakdown added buy animation for deamons and consumables added sell animations for daemons and consumablse fixed bug where shop didnt refresh when you re-enter after beating a level fixed bug where boss levels had a smaller quota than normal levels screenshake helper function implemented so i can just put screenshake(intensity,duration); anywhere and add screenshake with one line added a glitch location helper function based off my glitch transition code so now you can do TriggerGlitchAt(bounding-box-using-raylib-rectangle, duration); to glitch effect a location for a duration Next update plan maybe 6 hours for this update add more sound effects expand consumables system maybe make daemons look better but that might be for the update after this one
UPDATE #20 more animations Summary got sidetracked from original plan and made daemons look better along with making the map have velocity that keeps momentum after you stop scrolling breakdown made daemons look better using a dual layer system map has velocity that decreasese in speed after you stop scrolling with mouse click or scroll wheel dual layer daemon graphics I think this is kinda cool so basically i have the empty daemon slot image and when a daemon slot is empty it just keeps that sprite up and adds text ontop of that that says empty daemon slot (number). But when you get a daemon it uses the same hueshift function i have from the shop daemons and consumables and hueshifts an overlay with a transparent interior to add color and stuff. Empty daemon slot: empty daemon sprite layered text saying slot number and that it’s empty Occupied daemon slot: empty daemon sprite occupied daemon overlay with hue shift title and description text overlay + level overlay then put hover effects and stuff ontop Next update plan add more sound effects expand consumables system
UPDATE #21 consumable board editor Summary added new consumables that modified pins on the board to do different things breakdown added system where you can select nodes now added system where you can select multiple things to modify with a consumable added pin effect “mitosis” splits node into two added pin effect “overclock pin” makes pin valued at 1.5mb instead of 1mb prolly changing this this was just testing added pin effect “volitile pin” makes pin add a random payload from 1-10mb also was just testing prolly will modify this Next update plan add more sound effects make it so mitosis is called miosis and splits the value of the ball into half between the two balls make it so you can modify a pin with multiple modifiers and hovering shows what mods it has make pin modifiers like minecraft enchantments where you can apply some modifiers not with each other like mending + infinity isnt possible in minecraft or fortune + silk touch type thing
UPDATE #22 consumable board editor TWOOOO Summary made is so you can stack mods on pins and some are incompatible with others breakdown you can stack mods of different types on pins some mods are incompatible with each other if you modify a pin with an incompatible modifier it will just remove the conflicting modifier from the pin red alert text on consumables with conflicting modifiers hover shows the pins modifiers Next update plan you can stack modifiers on the same pin to level it up more pin modifier types make pins on modifiers visually distinct that can be stacked ontop of each other
UPDATE #23 Escape Menu Summary modularized code for pin mods, added levels and max levels, started work on an escape menu for settings. breakdown hover on nodes now shows level of the modifier on the node nodes like clone level 1 have it so the payout is split between the two balls and level 2 has it so that it isnt split between the two added menu button next to balance display modularized code for pin modifiers so its easier to add conflicts and such in the future and new features esc puts you in an esc menu to quit run new run settings optinos etc the same as the menu button esc menu stops time and physics aswell as all interaction in game until you unpause fixed issue where reroll text would overflow outside of the reroll box so now it resizes to fit inside of the reroll button node modifiers were also split into a different file Next update plan I got sidequested again for the escape menu so ill be working on that in tandem with the modifiers code and stuff make pins on modifiers visually distinct that can be stacked ontop of each other more work on esc menu
UPDATE #24 Escape Menu two Summary pin mods now show what level they are aswell as all the other mods on the pin in the form of colors and dots and hovering shows it more detailed also escape menu has buttons now. breakdown escape menu now has buttons and a different color back button when opening esc menu theres a glitch effect now along with a sound effect and closing does same thing putting a mod on the pin outlines the pin with the color of the mod and a dot for every level of the mod putting multiple mods on a pin divides the outline into multiple parts Next update plan add stats menu add settings menu add main menu maybe add consumables for baskets aswell but prolly the update after this one
UPDATE #25 Escape Menu three Summary added settings and stats page to the esc menu thing breakdown made it so that you can add more stats and settings with just one line of code to control or display a variable added a gamespeed notched slider added volume slider added screenshake toggle added a bunch of stats in the stats page moved back button to the bottom of the menu since we are nearing the phase where i ship this project i already have set a roadmap of things i need to do so i figure i could just share it here: add main menu maybe add consumables for baskets still not decided add tutorial endless mode daemon synergies polish and balance by adding more stuff and things in general to daemons,consumables,stats,settings,pin mods music
UPDATE #26 Main Menu Summary made a main menu breakdown took the grid background from the map and put it in the main menu took the tri-circle spinning animation from the map and put it in the main menu reused the button class i use everywhere settings button just goes to the settings menu i already made stats button just goes to the stats menu but i think ill change it to a tutorial button terminate button just gives a popup that says “its a web game silly” Roadmap in order of completion add tutorial endless mode daemon synergies maybe add consumables for baskets still not decided polish and balance by adding more stuff and things in general to daemons,consumables,stats,settings,pin mods music
UPDATE #27 Tutorial Summary made a hint based tutorial system every time you encounter a new mechanic breakdown made it so that in 1-2ish lines of code you can add a new hint to any aspect of the game hints pop up only on the first time you encounter a mechanic hints darken the background and go away with a glitch effect and sound effect after clicking “got it” button Roadmap in order of completion fix some of the bugs i have noted down in a personal doc that are hard to explain endless mode daemon synergies maybe add consumables for baskets still not decided polish and balance by adding more stuff and things in general to daemons,consumables,stats,settings,pin mods music
UPDATE #28 Endless Mode Summary added a win screen for when you win with a button to go endless mode called “ascensions” breakdown made endless mode made win screen (prolly should make it look better) fixed bug where you clicking back in a submenu in escmenu would double click and exit out of esc menu entirely fixed bug where you couldnt exit stats menu in escmenu from main menu Roadmap in order of completion add consumables for baskets to multiply basket mult re-org code before polish and balance cuz its kinda goofy spaghetti silly polish and balance by adding more stuff and things in general to daemons,consumables,stats,settings,pin mods add more screenshakes cuz i only have a few screenshakes music
UPDATE #29 Polish Polish Polish Summary added a few consumables and added basket mods breakdown added a consumable to multiply a basket’s mult by 1.5x permanently added a consumable to lower quota on a level by 25% added a pin modifier that makes balls gravitate towards it made it so that consumables in shop can have weights Things to polish before shipping daemons consumables pin mods screenshake more tutorial steps music / sfx balancing
UPDATE #30 A little bit of everything Summary added a loss screen, another pin modifier, changed clone pin graphic, added music, changed map nodes, added overload mechanic breakdown added a loss screen with a loss sound effect added another pin mod called “Amplify” which just gives 1.5x score on hit to the ball changed clone pin graphic to show the pull distance and changes with leveling added main menu music and gameplay music changed map nodes by renaming them and changing colors around made final boss node bigger than it was originally for emphasis added overload mechanic that basically is a multiplier that increases by .08x per pin hit and decreases by .4x per second and adds the multiplier on scoring Things to polish before shipping daemons consumables balancing sfx
UPDATE #31 Balancing Summary ITS ALL COMING TOGETHER RAHHHHH. I added like 10 new daemons changed icons and balanced the prices along with sending my project into the hackclub slack for playtesting. breakdown added 10 new daemons changed icons of every daemon since they shared the same icon balanced prices of consumables and daemons used playtester feedback: some things were confusing so i added more hints used playtester feedback: a button in the shop was unintuative so i made it so that it worked more intuiatively used playtester feedback: playtester found a bug with one of the new daemons that destroyed itself didnt free up a slot NEXT UPDATE IS JUST SOUND EFFECTS AND MAYBE FEEDBACK FROM SLACK THEN I SHIP YAY IM GETTING THIS DONE BEFORE I SLEEP
UPDATE #32 FIREFOX SUCKS Summary FIREFOX SUCKS. anyways i added a buncha sfx and ct5 found a bug where the game done goofy mode on firefox so i had to fix that breakdown map hover sfx shop buy sfx cashout sfx basket score sfx node pin sfx louder on playtester request used playtester feedback: this game on firefox compiled weird goofy its up on itchio now wowie #SHIP TIME YAYAYAYAYAYAYAY
Ships:
PLEASE READ THE HINTS SO YOU KNOW HOW TO PLAY I made a pachinko roguelite game that is inspired by balatro, slay the spire, and ultrapool. The game is a web game that is hosted on itch.io so no need to download anything. Have fun!...
|
1792810544.5796192
|
1792896944.5796192
|
|
42261
|
Prestyly by @ducki | Stardance
|
ducki
|
0
|
160.21
|
0
|
[]
|
[{"post_id": 79124, "ts": "202 [{"post_id": 79124, "ts": "2026-10-12T19:08:59Z", "hours": 6.1117, "text": "Devlog 27 Almost ready to publish This devlog I have managed to fix almost all of the bugs I know of, as well as implement a load of quality of life features Finally fixed outline width not displaying, because specific Element did not allow for outlines, landed on a fix of displaying an element which does allow outlines, behind the text. Visually it looks identical to how it would look with one element. resizing continue beyond the possible, for example dragging the top right dot, past the top left one, which should not be allowed. Decided to fix it by clamping the values. Was quite painful altering the ~300 line function. Fixed problem with text leaving the possible input box if the used typed too much, now the box automatically expands by checking the needed height to display all the lines. Added a error indicator incase of some unforseen API issue (Hopefully will not appear) Image API uses a query to get the image, a problem comes when the query is empty, causing a error, instead I decided to default the query to the cosmos to stay on the theme of stars dancing Tried to upload a video, but it took an hour just to fail, so instead here is this guy"}, {"post_id": 78393, "ts": "2026-10-10T17:08:12Z", "hours": 5.8883, "text": "Devlog 26 Mobile styling finally looks good!!!!!! I like the new design way better + the fact that it scales well with all screen sizes, while the last one had more edge cases where it breaks. The website feels way more polished on mobile Credit slide redesign Before the credit slide system used a variable of used artists, which worked fine, but needed a lot of functions, for example when removing a image or deleting a slide, to remove the images artists. A bit hard to keep up with it all, and harder to change long term. Decided to redesign it to check every slide, for every image, and then from each images url get the artist. What is left? After these 150 hours of making this one project (I thought it would take only 50 ) I only have a small list of stuff I have to do. Fix text outline sometimes not appearing Searching for empty images breaks the site Add a error notifier in case of image searching failing Publish the site Write a read me Give the site to my friends for testing"}, {"post_id": 77078, "ts": "2026-10-05T16:02:25Z", "hours": 6.535, "text": "Devlog 25 I hate bugs Programming wise and in real life. The past project time has gone into a big list of bug fixes, feature changes, and more styling. styling updated delete slide confirm pop up updated choose slide prefab page updated save presentation pop up Small addition to item aligning I realised that aligning items to the border could be useful, added it, and my first thought: “Woah this was so needed”. Way easier to get your images or text into the corners. Bug fixes Fixed items not aligning with eachoter on the y asis Fixed new variable changes getting overrided sometimes Fixed bugs with background sometimes not being able to display images"}, {"post_id": 76627, "ts": "2026-10-04T06:36:29Z", "hours": 4.0928, "text": "Devlog 24 New image and text variable editing side bar designs Added the new color pallete to them, as well as cleaned some components up a bit like sliders. As well as fixed some bugs, for example aspect ratio restoring not working, deleting photos not working, some values saving two times bug hunting continues Fixed a bug of the background color for slides not changing when switching slides, so for example making one slide blue, then choosing a new one, that one would also be blue Found a bug with horizontal alignment with other objects sometimes not working, will have to fix that Fixed bug that allowed bypassing maximal values for outline width and layer"}, {"post_id": 76350, "ts": "2026-10-03T08:35:04Z", "hours": 10.0492, "text": "Devlog 23 Huge visual changes 🦆 The previous design was a bit bland and a bit too bright for my eyes. so obviously dark designs are the best. After trying multiple different layouts and color schemes I have landed on the design seen in the images. Afterwards had to make it scale with * hopefully all computer types (Mobile coming soon) Font size works a bit wonky cause it has to scale with the presentation it is displayed on, fixed it by scaling the text based on the presentation slide size. Also changed main presentation system for bigger screen to allow up to 1920x1080 size (before was 800x450 which was small on bigger screens) Extra changes Exporting changes -> fixed exported slides not having accurate font sizes Fixed font size not saving when chaged Had to change text to allow breaks in the text, but it broke text outlines Fixed bug with images sometimes not loading Like I have most liekely said before, I was not expecting this project to take this long, but now looking back, all the needed features togheter are quite a lot. With this new improved design I am sure that it is the final one and feel like I am getting close to being finished"}, {"post_id": 72364, "ts": "2026-09-22T19:09:53Z", "hours": 3.1664, "text": "Devlog 22 Credit slide From what I have read, the API I use does not force image photographers to be credited. But I think they still deserve the credit. So I made a credit slide generator. To make it I had to add a system to save and remove photographer each time a image gets added/changed Then when generating the slide, the saved photographers get instantly placed on the slide."}, {"post_id": 71909, "ts": "2026-09-21T19:09:36Z", "hours": 4.5469, "text": "Devlog 21 Annihilating bugs!!!!! 🐛 The website has had some very annoying bugs, that had been in the website for multiple days. This devlog I have finally destroyed them. These bugs include: The color saving system was saving a value to undo/redo every frame, making one color undo require pressing ctrl + z 100 times Being able to unselected selected slides, when it should not be possible selecting already selected buttons buttons showing up 2x for some reason Mainly I am proud of the color saving multiple times, cause that is one of the most fun variable to change for text. Issue was with the react component not containing any event for closing the color wheele, so I ended up coming up with my own fix, by checking to see if the color was changed when unselecting the object and then saving it if the color was changed. Mobile functionality To my current knowledge, I have finished implementing all buttons/features, except hold tapping to duplicate slides, into the functionality. Moving slide objects, deleting slides, moving slides, all is possible on mobile now"}, {"post_id": 71272, "ts": "2026-09-20T15:41:14Z", "hours": 3.9561, "text": "Devlog 20 website adjustments for mobile I want the website to be available on mobile, so continuing on my recent mobile implementations, there are some more new ones. Prefab amounts scaled for screen size -> for example instead of displaying a 2x2 grid, like on the computer, to adjust for increased height for vertical phone use, instead the site displays a 1x3 grid font sizes adjusted for mobile devices -> added a aspect ration variable, that gets calculated when loading the site using the screen size small css styling changes"}, {"post_id": 69352, "ts": "2026-09-16T21:14:37Z", "hours": 6.5992, "text": "Devlog 19 CSS styling is starting to haunt me 👻 A presentation creation site is possibly one of the hardest thing to style for mobile . -> I have started slowly, while already continuing to make a main site style, also start creating mobile styling, just so the site is available more comfortably. Hardest thing is keeping the presentation aspect ratio, all while having it visible, which has proved quite the challenge on some phone aspect ratios. New slide prefabs Currently my idea is to have 4 slide types, one optional slide -> credit slide (for all the photos) The 4 slide types include intro slides info slides image slides outro slides Now all of them need slide prefabs, to use, so I have also began making those, starting with the intro slides."}, {"post_id": 67624, "ts": "2026-09-13T19:30:08Z", "hours": 9.2914, "text": "Devlog 18 A bit of a bigger devlog site styling I am trying out color paletes, and different positions for componets and landed on this idea of having the variable editor tab be on the right of the presentation, to save vertical space. Will this be how it is in the end? Probably, just with different colors/sizes. I am a fan of the position and think it helps keep more space verticaly for other components. Presentation exporting form I did not like how the presentation name text input looked at the top of the screen, so instead I decided to move it to a custom form when exporting the presentation to your files, to then input the presentations name. Looks a bit cleaner, less clutter Loading bar When getting a new image or exporting the presentation, sometimes a problem of wait times appears. For presentations, when exporting slides with images, they take waaaay longer to download, so I obviously needed a loading screen . And now it does not feel slow or confusing when exporting or loading new images. The main part is definetly the user getting feedback that the button process was successfull and everything is great. + some small changes to Presentation exporting Some number input styling/text saving Icon button changes 📷"}, {"post_id": 65516, "ts": "2026-09-10T18:26:01Z", "hours": 3.6967, "text": "Devlog 17 Presentation saving to files!!! With the functionality of being able to now save created presentations to files., I can say that the website is functional . The saving happens to a powerpoint file, so after saving it is easy to edit in a bunch of ways. It feels great being able to actually play around and make presentations on something I made myself :D Sadly , I had to remove corner rounding for images, because there is not a option for rounded corners through my way of saving all of the presentation slides. picture outlines Also caused a bit of an issue, there is also no option for adding pictures to slides with an outline, but for that I have built a work around, where the image is a object in the background. Now , even with this awesome new feature I am quite far from being done, mainly with styling and adding phone support, so that the website is accesible and comfortable on all devices"}, {"post_id": 64944, "ts": "2026-09-09T17:55:08Z", "hours": 6.5622, "text": "Devlog 16 Editing tab changes Failed to find any text alignment icons that I liked currently, so I shall leave that for later. I think the sliders and color scheme definetly still need work, but I wanted to start working on some more important/new features Image outlines Made the image outline system go to all sides, instead of making the picture more right and down. (goofy bug) Found out image generation was broken Took a few hours to fix it and then also connect it to data saving."}, {"post_id": 63209, "ts": "2026-09-06T21:47:43Z", "hours": 5.2225, "text": "Devlog 15 Too many bugs that I had not noticed The worst kind of coding bugs I would say are small tiny ones, well that is what I am now thinking, after having to slowly go through line by line trying to slowly fix a bunch of small bugs. Most important of the bugs fixed: changing the position of selected object sometimes updated every saved previous position of the selected object accidentally forgetting one digit in a line of code .-. Changing text color or width color, made the save system save the new color each frame -> Which now I have to create a new way to save the new chosen color, only when I believe the player would have completed their pick, which is a interesting user design to think about. What is realy the best time. Also started changing the editing tab -> Planning on adding icons, pretty buttons"}, {"post_id": 62831, "ts": "2026-09-06T11:14:17Z", "hours": 8.7775, "text": "Devlog 14 More values to ctrl z and ctrl y I decided to make more presentation changes save, so I had to rewrite some code to allow for saving even more variables. The system now also works a bit more intuitively Variable rewriting While programming I continue to realise with how big this project is starting to get, I did waaay too little planing out on how to keep it easy to add new features. That is why I took a few hours, to rewrite variable access to some scripts, as well as functions, to make it so I can easily get the needed variables in any script. This should allow me to make new features way faster extra changes some of the more prominent ones: fixed saving changes sometimes saving wrong fixed some overlapping issues"}, {"post_id": 61843, "ts": "2026-09-04T23:27:10Z", "hours": 5.1264, "text": "Devlog 13 Slide duplicating To easily keep designs the same between multiple slides it is important to be able to duplicate slides, I decided to keep this feature under a left click, left click the slide you want to duplicate instead of the regular options like copying and pasting that pop up, a custom selection box opens up, where you can either delete or duplicate the slide. ctrl c, ctrl v Slowly started working on copy and pasting functionality, works, but I want to polish it more more code rewriting Continuing my previous code cleaning, I have made more chages, to just shorten scripts, make them more readable, as well as simpler, because like a great person once said good code is simple code"}, {"post_id": 59785, "ts": "2026-09-01T18:35:45Z", "hours": 4.3758, "text": "Devlog 12 Object alignment based on other objects Presentations where text is not ordered perfectly can be infuriating, so I knew I hade to make it so you have automatic item alignment based on other item positions. Currently the it checks all 3 possible alignments on all 3 possible sides, which might end up being a bit too much when there are mutliple objects. Also made the system a bit cleaner, easy to add/change features -> a continuation of my code cleaning Half the time while making this feature it kept breaking and tranporting my object to like 10000 pixels away, but that was a funny bug"}, {"post_id": 58856, "ts": "2026-08-31T13:11:31Z", "hours": 6.715, "text": "Devlog 11 Code restructuring As the project grown in size I have been needing to take a small step back and cleanup a bunch of code. Bug fixes The app has a lot of bugs and small issues you would not like in a presentation creator. I have slowly been working on fixing them, for example selecting slides, the text objects, block the select button. new features Added new hover indicators new slide types -> When adding a new slide I want the player to have a choice from multiple types, that then give prefabs. Imagine wanting to have a big picture in the slide, well then you chose a new image slide prefab, that should allow for people to create slides as fast as possible."}, {"post_id": 52099, "ts": "2026-08-22T05:30:04Z", "hours": 6.3772, "text": "Devlog 10 New text and image object creation Just like hinted in the last devlog Now to prevent objects from stacking making multiple objects, distances them from each other, and then if it can no longer distance it down, that is when there are a lot of way to go about placing it, I decided to randomize it while making the feature had a bug in the start with new created text overriding already exsisting text Now it should not happen anymore Key binds!!! THE MOST USEFULL KEYBIND IN ANY PROGRAM ctrl+z and crtl+y I have started implementing keybind functionality, currently ctrl+z and ctrl+y already work, but they need a bit of polish also did a bunch of bug fixes and small tweaks Prestyly is slowly crawling to the finish line, hopefully I will be able to finish it in the next 50 hours put into it And it has to be polished"}, {"post_id": 51310, "ts": "2026-08-20T21:44:36Z", "hours": 3.62, "text": "Devlog 9!!! (so kind of the magical 10th) Duplicating and deleting objects Now I think it is self explanatory that it kind of sucks not being able to delete a image, if you do not want to use it, so the presentation creator needed a delete button. Simply press on the object and then press delete to delete it These functions were quite easy to add, but the code is slowly becoming very big to keep up, and sending functions between scripts is also. Started making new text object and new image creating not done fully yet, but a high chance it will be included in the next devlog Plans Every good presentation has some decorations Right now the only images I get are all with a background, so I am gonna have to think of a way to implement presentation decorations, if you have any ideas, would gradly hear it in the comments"}, {"post_id": 48464, "ts": "2026-08-16T20:23:04Z", "hours": 6.2356, "text": "Devlog 8 The magical shift key o-o Personally when I make presentation for photos I use the shift key a lot, well mainly just so they do not get stretched like cheese So that is what I have been mainly working on, All of the component scripts slowly keep getting bigger and bigger and I have to then divide them even more just so it is readable. It is very fun working on these small features that always prove to be teoretically easy, but need a bit of rewriting code to implement This is a project where a lot can be learned. Small fixes Fixed some alignment issues made slide bar display images a bunch of small bug fixes new bugs: text objects sometimes do not update when changing one of their text settings. some buttons sometimes block other buttons Every 3 fixed bugs leads to a new bug, hard to sometimes keep track of all the little possibilities."}, {"post_id": 46022, "ts": "2026-08-12T22:21:58Z", "hours": 3.9731, "text": "Devlog 7 An import feature is being able to get objects into the correct position, one of which being the center. new I added a slide moving display in the slide list, and when moving text/photos if close enough aligns to the x asis or y asis center. It was interesting to code, another very specific app detail done. Later will have to update this feature into a aligning based on other projcts."}, {"post_id": 45540, "ts": "2026-08-12T03:02:54Z", "hours": 7.9336, "text": "Devlog 6 You can now move slides :O I did not think this would be that hard of a feature, but turns out it is not that easy of a feature. And I still have to add a display that showcases where this slide will now go after letting go of your mouse. The idea is When I start moving the slide I calculate every slides global x position in the slide tab, then when the mouse moves I check the mouses global x position to then compare with the slides positions to see where it would go. Basically a bunch of position calculations slidePositions.current.map((pos, ind) => { if (newXPos < pos && found != true) { found = true; console.log(newXPos, pos); if (ind > startingSlidePos.current) { updateNewSlidePos(ind - 1); } else { updateNewSlidePos(ind); }}}); Also added image and text scaling using only one axis. Thought overview I am very excited at how the website is starting to look. And that you are already able to make real presentation slides, that look good in as little as a minute. Every single devlog I think of more and more small quality of life feature that most presentation creator tools contain, and this can quickly become a daunting project."}, {"post_id": 43915, "ts": "2026-08-09T11:17:42Z", "hours": 2.8975, "text": "Devlog 5 I possibly made my dumbest programming mistake ever! My image API gets 15 images each time, now to not have to use the API every time, I deficed that if the user enters the same prompt, the 15 images they already got would be used and just shuffled through. Now to shuffle the array I used for (let i = 0; i < arr.length * 3; i++) { const varPos1 = Math.floor(Math.random() * arr.length); const varPos2 = Math.floor(Math.random() * arr.length); const val1 = arr[varPos1]; arr[varPos1] = arr[varPos2]; arr[varPos2] = arr[VarPos1]; } console.log(arr); return arr; } It does not take an expert to find the problem, So there I sat thinking why when increasing the shown photo ID i kept getting the same image But now I should not run out of API tokens"}, {"post_id": 43546, "ts": "2026-08-08T21:33:45Z", "hours": 3.0356, "text": "devlog 4 Text can now be fancy. Mainly worked on a bar for you to edit selected text, change text color, outline. Was not too bad, but definetly need icons for Bold, italic and underline text. Thoughts I am not sure where to put this tab, below of above the main presentation display. well also does it matter, most likely will put it at the top, since that seems most popular, but otherwise, will have to test. I think it is easy to understand I like ducks from the presentation one slide made in ~2 minutes, already a success."}, {"post_id": 42827, "ts": "2026-08-07T19:18:49Z", "hours": 5.1494, "text": "movement go brrrr The website now allows you to move objects around, your text is not stuck in one position, also started working on an editing tab, for image outlines, text color, text width. problems The text moving is nice, but I can’t drag select text cause of it, so I have to think of a way to fix it. Had to write two system for how to calculate mouse movement because the first system limited me on future additions, also broke with multiple objects, which made the object wiggle wiggle between the top left corner and actual position. User interface is gonna be quite the pain on this project"}, {"post_id": 41151, "ts": "2026-08-05T05:43:25Z", "hours": 7.13, "text": "Devlog 2 For my presentation creator website to make it faster to create stuff I wish to have it cause as little decision fatigue as possible. There will still be options to choose from, but they will not be thrown at you all instantly Progress Presentation creating has way more edge cases than I first thought. Just the action of when resizing, each dot works a bit differently, as well as what if you move the dot to be on a dot side it should not be. Have I already implemented this, not at all, not yet, Plan is to first work on full functionality then get all the edge cases. Now the website also contains text and image resizing text editing slide saving slides can now contain images if you have any cool ideas for features, freely drop it in the comments"}, {"post_id": 39932, "ts": "2026-08-03T07:43:14Z", "hours": 7.6219, "text": "Devlog 1 Slowly but surely starting to work like a presentation editor. Now comes the hard part of thinking where/how to display everything, how to show what is customizable, how to tell the user what they are updating. Basicaly user experience. New Slide creating Slide displaying Slide changing A bit of slide editing Problems I have already ran into a bit of problems/weird bugs having to think about every work around. I know there will be many more bugs with all the nuances possible, but motivation is at an all time high."}, {"post_id": 38418, "ts": "2026-07-31T19:36:01Z", "hours": 5.5258, "text": "Devlog 0 I always have had a problem with presentation designs, it takes so long just to find one picture that actually works. So, I have decided to fix this problem by making a simpler way to create presentations/presentation styles. The idea A simple web page where you create your presentation style is made with you mostly just clicking, no more looking for pictures or design to edit. Choose a good looking design for each slide, get photos instatly added to your slide with just one word input, no uplading files. Then create as many slides as you wish, then being able to export the presentation to a powerpoint file to change specific details in a different website or application. The idea is to make presentation designs creatable in a short lunch break before you have to present it. progress: Mainly I have gotten a image fetching API working for text inputs as well as connected the front end and backend, to keep enviornment variables protected in the backend and later possibly add users and databases"}]...
|
Title: Prestyly by @ducki | Stardance
Devlogs:
De Title: Prestyly by @ducki | Stardance
Devlogs:
Devlog 0 I always have had a problem with presentation designs, it takes so long just to find one picture that actually works. So, I have decided to fix this problem by making a simpler way to create presentations/presentation styles. The idea A simple web page where you create your presentation style is made with you mostly just clicking, no more looking for pictures or design to edit. Choose a good looking design for each slide, get photos instatly added to your slide with just one word input, no uplading files. Then create as many slides as you wish, then being able to export the presentation to a powerpoint file to change specific details in a different website or application. The idea is to make presentation designs creatable in a short lunch break before you have to present it. progress: Mainly I have gotten a image fetching API working for text inputs as well as connected the front end and backend, to keep enviornment variables protected in the backend and later possibly add users and databases
Devlog 1 Slowly but surely starting to work like a presentation editor. Now comes the hard part of thinking where/how to display everything, how to show what is customizable, how to tell the user what they are updating. Basicaly user experience. New Slide creating Slide displaying Slide changing A bit of slide editing Problems I have already ran into a bit of problems/weird bugs having to think about every work around. I know there will be many more bugs with all the nuances possible, but motivation is at an all time high.
Devlog 2 For my presentation creator website to make it faster to create stuff I wish to have it cause as little decision fatigue as possible. There will still be options to choose from, but they will not be thrown at you all instantly Progress Presentation creating has way more edge cases than I first thought. Just the action of when resizing, each dot works a bit differently, as well as what if you move the dot to be on a dot side it should not be. Have I already implemented this, not at all, not yet, Plan is to first work on full functionality then get all the edge cases. Now the website also contains text and image resizing text editing slide saving slides can now contain images if you have any cool ideas for features, freely drop it in the comments
movement go brrrr The website now allows you to move objects around, your text is not stuck in one position, also started working on an editing tab, for image outlines, text color, text width. problems The text moving is nice, but I can’t drag select text cause of it, so I have to think of a way to fix it. Had to write two system for how to calculate mouse movement because the first system limited me on future additions, also broke with multiple objects, which made the object wiggle wiggle between the top left corner and actual position. User interface is gonna be quite the pain on this project
devlog 4 Text can now be fancy. Mainly worked on a bar for you to edit selected text, change text color, outline. Was not too bad, but definetly need icons for Bold, italic and underline text. Thoughts I am not sure where to put this tab, below of above the main presentation display. well also does it matter, most likely will put it at the top, since that seems most popular, but otherwise, will have to test. I think it is easy to understand I like ducks from the presentation one slide made in ~2 minutes, already a success.
Devlog 5 I possibly made my dumbest programming mistake ever! My image API gets 15 images each time, now to not have to use the API every time, I deficed that if the user enters the same prompt, the 15 images they already got would be used and just shuffled through. Now to shuffle the array I used for (let i = 0; i < arr.length * 3; i++) { const varPos1 = Math.floor(Math.random() * arr.length); const varPos2 = Math.floor(Math.random() * arr.length); const val1 = arr[varPos1]; arr[varPos1] = arr[varPos2]; arr[varPos2] = arr[VarPos1]; } console.log(arr); return arr; } It does not take an expert to find the problem, So there I sat thinking why when increasing the shown photo ID i kept getting the same image But now I should not run out of API tokens
Devlog 6 You can now move slides :O I did not think this would be that hard of a feature, but turns out it is not that easy of a feature. And I still have to add a display that showcases where this slide will now go after letting go of your mouse. The idea is When I start moving the slide I calculate every slides global x position in the slide tab, then when the mouse moves I check the mouses global x position to then compare with the slides positions to see where it would go. Basically a bunch of position calculations slidePositions.current.map((pos, ind) => { if (newXPos < pos && found != true) { found = true; console.log(newXPos, pos); if (ind > startingSlidePos.current) { updateNewSlidePos(ind - 1); } else { updateNewSlidePos(ind); }}}); Also added image and text scaling using only one axis. Thought overview I am very excited at how the website is starting to look. And that you are already able to make real presentation slides, that look good in as little as a minute. Every single devlog I think of more and more small quality of life feature that most presentation creator tools contain, and this can quickly become a daunting project.
Devlog 7 An import feature is being able to get objects into the correct position, one of which being the center. new I added a slide moving display in the slide list, and when moving text/photos if close enough aligns to the x asis or y asis center. It was interesting to code, another very specific app detail done. Later will have to update this feature into a aligning based on other projcts.
Devlog 8 The magical shift key o-o Personally when I make presentation for photos I use the shift key a lot, well mainly just so they do not get stretched like cheese So that is what I have been mainly working on, All of the component scripts slowly keep getting bigger and bigger and I have to then divide them even more just so it is readable. It is very fun working on these small features that always prove to be teoretically easy, but need a bit of rewriting code to implement This is a project where a lot can be learned. Small fixes Fixed some alignment issues made slide bar display images a bunch of small bug fixes new bugs: text objects sometimes do not update when changing one of their text settings. some buttons sometimes block other buttons Every 3 fixed bugs leads to a new bug, hard to sometimes keep track of all the little possibilities.
Devlog 9!!! (so kind of the magical 10th) Duplicating and deleting objects Now I think it is self explanatory that it kind of sucks not being able to delete a image, if you do not want to use it, so the presentation creator needed a delete button. Simply press on the object and then press delete to delete it These functions were quite easy to add, but the code is slowly becoming very big to keep up, and sending functions between scripts is also. Started making new text object and new image creating not done fully yet, but a high chance it will be included in the next devlog Plans Every good presentation has some decorations Right now the only images I get are all with a background, so I am gonna have to think of a way to implement presentation decorations, if you have any ideas, would gradly hear it in the comments
Devlog 10 New text and image object creation Just like hinted in the last devlog Now to prevent objects from stacking making multiple objects, distances them from each other, and then if it can no longer distance it down, that is when there are a lot of way to go about placing it, I decided to randomize it while making the feature had a bug in the start with new created text overriding already exsisting text Now it should not happen anymore Key binds!!! THE MOST USEFULL KEYBIND IN ANY PROGRAM ctrl+z and crtl+y I have started implementing keybind functionality, currently ctrl+z and ctrl+y already work, but they need a bit of polish also did a bunch of bug fixes and small tweaks Prestyly is slowly crawling to the finish line, hopefully I will be able to finish it in the next 50 hours put into it And it has to be polished
Devlog 11 Code restructuring As the project grown in size I have been needing to take a small step back and cleanup a bunch of code. Bug fixes The app has a lot of bugs and small issues you would not like in a presentation creator. I have slowly been working on fixing them, for example selecting slides, the text objects, block the select button. new features Added new hover indicators new slide types -> When adding a new slide I want the player to have a choice from multiple types, that then give prefabs. Imagine wanting to have a big picture in the slide, well then you chose a new image slide prefab, that should allow for people to create slides as fast as possible.
Devlog 12 Object alignment based on other objects Presentations where text is not ordered perfectly can be infuriating, so I knew I hade to make it so you have automatic item alignment based on other item positions. Currently the it checks all 3 possible alignments on all 3 possible sides, which might end up being a bit too much when there are mutliple objects. Also made the system a bit cleaner, easy to add/change features -> a continuation of my code cleaning Half the time while making this feature it kept breaking and tranporting my object to like 10000 pixels away, but that was a funny bug
Devlog 13 Slide duplicating To easily keep designs the same between multiple slides it is important to be able to duplicate slides, I decided to keep this feature under a left click, left click the slide you want to duplicate instead of the regular options like copying and pasting that pop up, a custom selection box opens up, where you can either delete or duplicate the slide. ctrl c, ctrl v Slowly started working on copy and pasting functionality, works, but I want to polish it more more code rewriting Continuing my previous code cleaning, I have made more chages, to just shorten scripts, make them more readable, as well as simpler, because like a great person once said good code is simple code
Devlog 14 More values to ctrl z and ctrl y I decided to make more presentation changes save, so I had to rewrite some code to allow for saving even more variables. The system now also works a bit more intuitively Variable rewriting While programming I continue to realise with how big this project is starting to get, I did waaay too little planing out on how to keep it easy to add new features. That is why I took a few hours, to rewrite variable access to some scripts, as well as functions, to make it so I can easily get the needed variables in any script. This should allow me to make new features way faster extra changes some of the more prominent ones: fixed saving changes sometimes saving wrong fixed some overlapping issues
Devlog 15 Too many bugs that I had not noticed The worst kind of coding bugs I would say are small tiny ones, well that is what I am now thinking, after having to slowly go through line by line trying to slowly fix a bunch of small bugs. Most important of the bugs fixed: changing the position of selected object sometimes updated every saved previous position of the selected object accidentally forgetting one digit in a line of code .-. Changing text color or width color, made the save system save the new color each frame -> Which now I have to create a new way to save the new chosen color, only when I believe the player would have completed their pick, which is a interesting user design to think about. What is realy the best time. Also started changing the editing tab -> Planning on adding icons, pretty buttons
Devlog 16 Editing tab changes Failed to find any text alignment icons that I liked currently, so I shall leave that for later. I think the sliders and color scheme definetly still need work, but I wanted to start working on some more important/new features Image outlines Made the image outline system go to all sides, instead of making the picture more right and down. (goofy bug) Found out image generation was broken Took a few hours to fix it and then also connect it to data saving.
Devlog 17 Presentation saving to files!!! With the functionality of being able to now save created presentations to files., I can say that the website is functional . The saving happens to a powerpoint file, so after saving it is easy to edit in a bunch of ways. It feels great being able to actually play around and make presentations on something I made myself :D Sadly , I had to remove corner rounding for images, because there is not a option for rounded corners through my way of saving all of the presentation slides. picture outlines Also caused a bit of an issue, there is also no option for adding pictures to slides with an outline, but for that I have built a work around, where the image is a object in the background. Now , even with this awesome new feature I am quite far from being done, mainly with styling and adding phone support, so that the website is accesible and comfortable on all devices
Devlog 18 A bit of a bigger devlog site styling I am trying out color paletes, and different positions for componets and landed on this idea of having the variable editor tab be on the right of the presentation, to save vertical space. Will this be how it is in the end? Probably, just with different colors/sizes. I am a fan of the position and think it helps keep more space verticaly for other components. Presentation exporting form I did not like how the presentation name text input looked at the top of the screen, so instead I decided to move it to a custom form when exporting the presentation to your files, to then input the presentations name. Looks a bit cleaner, less clutter Loading bar When getting a new image or exporting the presentation, sometimes a problem of wait times appears. For presentations, when exporting slides with images, they take waaaay longer to download, so I obviously needed a loading screen . And now it does not feel slow or confusing when exporting or loading new images. The main part is definetly the user getting feedback that the button process was successfull and everything is great. + some small changes to Presentation exporting Some number input styling/text saving Icon button changes 📷
Devlog 19 CSS styling is starting to haunt me 👻 A presentation creation site is possibly one of the hardest thing to style for mobile . -> I have started slowly, while already continuing to make a main site style, also start creating mobile styling, just so the site is available more comfortably. Hardest thing is keeping the presentation aspect ratio, all while having it visible, which has proved quite the challenge on some phone aspect ratios. New slide prefabs Currently my idea is to have 4 slide types, one optional slide -> credit slide (for all the photos) The 4 slide types include intro slides info slides image slides outro slides Now all of them need slide prefabs, to use, so I have also began making those, starting with the intro slides.
Devlog 20 website adjustments for mobile I want the website to be available on mobile, so continuing on my recent mobile implementations, there are some more new ones. Prefab amounts scaled for screen size -> for example instead of displaying a 2x2 grid, like on the computer, to adjust for increased height for vertical phone use, instead the site displays a 1x3 grid font sizes adjusted for mobile devices -> added a aspect ration variable, that gets calculated when loading the site using the screen size small css styling changes
Devlog 21 Annihilating bugs!!!!! 🐛 The website has had some very annoying bugs, that had been in the website for multiple days. This devlog I have finally destroyed them. These bugs include: The color saving system was saving a value to undo/redo every frame, making one color undo require pressing ctrl + z 100 times Being able to unselected selected slides, when it should not be possible selecting already selected buttons buttons showing up 2x for some reason Mainly I am proud of the color saving multiple times, cause that is one of the most fun variable to change for text. Issue was with the react component not containing any event for closing the color wheele, so I ended up coming up with my own fix, by checking to see if the color was changed when unselecting the object and then saving it if the color was changed. Mobile functionality To my current knowledge, I have finished implementing all buttons/features, except hold tapping to duplicate slides, into the functionality. Moving slide objects, deleting slides, moving slides, all is possible on mobile now
Devlog 22 Credit slide From what I have read, the API I use does not force image photographers to be credited. But I think they still deserve the credit. So I made a credit slide generator. To make it I had to add a system to save and remove photographer each time a image gets added/changed Then when generating the slide, the saved photographers get instantly placed on the slide.
Devlog 23 Huge visual changes 🦆 The previous design was a bit bland and a bit too bright for my eyes. so obviously dark designs are the best. After trying multiple different layouts and color schemes I have landed on the design seen in the images. Afterwards had to make it scale with * hopefully all computer types (Mobile coming soon) Font size works a bit wonky cause it has to scale with the presentation it is displayed on, fixed it by scaling the text based on the presentation slide size. Also changed main presentation system for bigger screen to allow up to 1920x1080 size (before was 800x450 which was small on bigger screens) Extra changes Exporting changes -> fixed exported slides not having accurate font sizes Fixed font size not saving when chaged Had to change text to allow breaks in the text, but it broke text outlines Fixed bug with images sometimes not loading Like I have most liekely said before, I was not expecting this project to take this long, but now looking back, all the needed features togheter are quite a lot. With this new improved design I am sure that it is the final one and feel like I am getting close to being finished
Devlog 24 New image and text variable editing side bar designs Added the new color pallete to them, as well as cleaned some components up a bit like sliders. As well as fixed some bugs, for example aspect ratio restoring not working, deleting photos not working, some values saving two times bug hunting continues Fixed a bug of the background color for slides not changing when switching slides, so for example making one slide blue, then choosing a new one, that one would also be blue Found a bug with horizontal alignment with other objects sometimes not working, will have to fix that Fixed bug that allowed bypassing maximal values for outline width and layer
Devlog 25 I hate bugs Programming wise and in real life. The past project time has gone into a big list of bug fixes, feature changes, and more styling. styling updated delete slide confirm pop up updated choose slide prefab page updated save presentation pop up Small addition to item aligning I realised that aligning items to the border could be useful, added it, and my first thought: “Woah this was so needed”. Way easier to get your images or text into the corners. Bug fixes Fixed items not aligning with eachoter on the y asis Fixed new variable changes getting overrided sometimes Fixed bugs with background sometimes not being able to display images
Devlog 26 Mobile styling finally looks good!!!!!! I like the new design way better + the fact that it scales well with all screen sizes, while the last one had more edge cases where it breaks. The website feels way more polished on mobile Credit slide redesign Before the credit slide system used a variable of used artists, which worked fine, but needed a lot of functions, for example when removing a image or deleting a slide, to remove the images artists. A bit hard to keep up with it all, and harder to change long term. Decided to redesign it to check every slide, for every image, and then from each images url get the artist. What is left? After these 150 hours of making this one project (I thought it would take only 50 ) I only have a small list of stuff I have to do. Fix text outline sometimes not appearing Searching for empty images breaks the site Add a error notifier in case of image searching failing Publish the site Write a read me Give the site to my friends for testing
Devlog 27 Almost ready to publish This devlog I have managed to fix almost all of the bugs I know of, as well as implement a load of quality of life features Finally fixed outline width not displaying, because specific Element did not allow for outlines, landed on a fix of displaying an element which does allow outlines, behind the text. Visually it looks identical to how it would look with one element. resizing continue beyond the possible, for example dragging the top right dot, past the top left one, which should not be allowed. Decided to fix it by clamping the values. Was quite painful altering the ~300 line function. Fixed problem with text leaving the possible input box if the used typed too much, now the box automatically expands by checking the needed height to display all the lines. Added a error indicator incase of some unforseen API issue (Hopefully will not appear) Image API uses a query to get the image, a problem comes when the query is empty, causing a error, instead I decided to default the query to the cosmos to stay on the theme of stars dancing Tried to upload a video, but it took an hour just to fail, so instead here is this guy...
|
1792504166.3608503
|
1793108966.3608503
|
|
6400
|
Minecraft Web by @TruthEntity | Stardance
|
TruthEntity
|
2
|
160.71
|
1901
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-06T10:33:36Z", "hours": 73.0, "multiplier": 15.82, "payout": 1127, "blessing": "neutral", "text": "NOTE: Please Skip Voting, if it failed to run on your system please… Hi Friends, so, I have been working on Minecraft for a long time, and Virtually touching grass LOL.. AKA, Making Minecraft, it is quite challenging to say the least, you can check my devlogs.. Basically, I want to make a very very optimized version of minecraft, that you can see through far and far, and highly optimized. I want to add lighting and all, but the banner is a bit misleading.. I will continue to work on the project, but obviously, not Three.js, because What I have learnt is that.. You can use engines like Unity and Unreal, and make goated projects, the feel of making optimized content, and making it run even on a potato, is just on another level.. Seeing the entire generation moving towards fast making and prototyping, it is always a safe bet to try something new and interesting. This is one of the prototypes that taught me a lot, from How to deal with chunks, and manage chunks, to making biomes, which was actually new.. Chunks I have worked with AI before, and it helped me a ton, and I know about those, but not here.. Hope you love my project", "repo": "https://github.com/SatyamRaj67/Minecraft-with-Three", "demo": "https://satyamraj67.github.io/Minecraft-with-Three/"}, {"ship_num": 2, "ts": "2026-06-15T05:58:35Z", "hours": 58.0, "multiplier": 14.37, "payout": 774, "blessing": "neutral", "text": "Basically, What I have made is Minecraft Web, well Minecraft but on the Website, running on your Browser. Through the Power of Optimizations and knowing how to code, and also using AI for my shader building and debugging bugs like IDK, What I have done to my life. But Basically, I made my own Engine just to prove that You don’t always need THREE.js to do your heavy lifting, and honestly, it was not that hard. You can see the source code, just a few days ago, I refactored it. Hope you love and enjoy my project.", "repo": "https://github.com/SatyamRaj67/Minecraft-with-Three", "demo": "https://satyamraj67.github.io/Minecraft-with-Three/"}]...
|
[{"post_id": 31749, "ts": "202 [{"post_id": 31749, "ts": "2026-07-20T12:00:53Z", "hours": 0.5433, "text": "Hi Everyone, My Devlogs have been lacking a bit, and this another quick devlog, because, I am really not feeling good these days. I am having fever and not feeling great about anything. Currently, I was just searching and asking AI about chunk generation. One of the things, where AI is now needed, because I know noise generation, but I don’t really know, how to make it into reality, and specially when people want realistic chunk generation and all.. I will get into good and start fixing first of all, this light problem, and then just hope, I get well soon, because India’s heat waves are really no joke. My Indian Friends.. Please stay safe and inside house.. IDK, Why even schools are open.."}, {"post_id": 30259, "ts": "2026-07-17T18:05:03Z", "hours": 1.0661, "text": "I literally been sick for 2 days, and now that I come back, I somehow see worse.. Like, I wanted to implement meshing and all.. GUESS WHAT I DONE.. YES, MESHED THE ENTIRE WORLD TO DISAPPEAR.. BALLS… I AM GUAVA AND I WILL EAT MYSELF.. That’s enough coding for today as well, signing off.."}, {"post_id": 30030, "ts": "2026-07-17T08:56:17Z", "hours": 3.1806, "text": "67 Structure Implemented and running, and to those who recommended me this.. GUYS YOU REALLY NEED TO SEE A THERAPY OR SOMETHING.. LMAO.."}, {"post_id": 28175, "ts": "2026-07-14T09:36:33Z", "hours": 2.6172, "text": "Procedural Generation unlocked, now, you can move as much as you want, and play. Current, block placing and all won’t work, but yah.. Frustum Culling is working as you can see with the culled meter."}, {"post_id": 27634, "ts": "2026-07-13T12:05:35Z", "hours": 4.9944, "text": "Added some simple tests for the ECS system and the topological sort Kahn’s Algorithm system and the Event Bus, so as to 100% confirm the workings of what is intended and what is not.. Also there was a problem with connection of gbuffers into swap chain, so had to make a custom pass called, composite pass, that will intercept and then gives us the necessary output. This might add very minute delay, but it is very unnoticable so don’t worry.."}, {"post_id": 27195, "ts": "2026-07-12T15:17:58Z", "hours": 0.6597, "text": "Sorry, ANOTHER QUICK UPDATE I KNOW.. But trust me, this took me ages to implement, and yes, had to work from backwards, because and again found out, There was nothing being connected to the swapchain for some reason.. It’s actually really not that hard to find bugs when you are used to it, like when something isn’t rendering you know, something must be wrong with renderer and all.. and a quick side step, and you understand yah, swapchain being uninitialized is the key."}, {"post_id": 27162, "ts": "2026-07-12T14:03:45Z", "hours": 0.7392, "text": "LMAO, You know, you are at the pinnacle when you are going through forums and forums of actually big stuff, that very very few people ever talk about.. Literally.."}, {"post_id": 27117, "ts": "2026-07-12T11:58:08Z", "hours": 4.5569, "text": "Been some time, and the amount of Logs that I am going through is just.. LMAO.. Crazy Crazy.. For my 67 fans, just give me like a few more moments.. Because, Now, I just want to render one block, and I will just add a sky, which will be a simple color gradient, and then I will work on whatever you that 67 thing.. This was really hectic to implement.. Literally had to go through and implement Archetype.. Yes, even I don’t know what they are… But after like learning about it, here is my understanding.. Archetype is basically a central place to keep all the components and all. Remember, we are optimizing the sheesh out of this project.. Archetypes allow us to apply the same gravity and same systems like Physics, collisions and so on, while still giving you customizabilty on if you want to enable it or not.. It’s really cool, but the amount of things I had to implement.. That’s some brutal stuff… Imagine, you forgot to plug the input system, and you are crashing out on, HOW TO FAH THE POSITION IS NOT CHANGING?? LOL, YAH 2 HOURS OF DEBUGGING WENT THERE, only to realise, I forgot to add that.. LOL.."}, {"post_id": 26687, "ts": "2026-07-11T16:55:52Z", "hours": 5.4511, "text": "I am crashing out a lot over some assets, because first of all, why is the grass block not green and a colormap, I mean, it does look cool.. BUT COME ON, THAT’S A MENTAL TRAUMA AND NOW WHICH COLOR OF GRASS SHOULD I PICK.. Furthermore, this is also a problem with water and all.. I am trying to find better ways, and actually learn about how Minecraft renders these and turns out, they just.. well.. OVERLAY A GREEN MAP or BLUE MAP over the grass.. I mean, that sounds HORRIBLE TO IMPLEMENT, MY GOD, THIS GAME SU…. IS FINE.. AND FUN.. Furthermore, thank you so so so much for all the reviewers out there.. The fact you guys appreciated my project, and said it is Fine to be using AI.. It just blew my heart.. This is the reason why I am currently working, else, I had already blew my mind with so much complex debugging, such that, I had to make my own engine, and debugger.. As with the latest you can see.. Things are tough but yah.. Also, I see you @skhsmrn on my devlog and another reviewer.. Your demands for 67 WILL BE FULFILLED SOON TM.."}, {"post_id": 25348, "ts": "2026-07-09T16:07:34Z", "hours": 1.0511, "text": "I have connected my GPU now, and details are also loading nicely.. I will working on GPU Frames and all as well now."}, {"post_id": 24257, "ts": "2026-07-07T18:18:55Z", "hours": 4.8525, "text": "I almost crashed out today. It was a hectic of a job today for me.. Basically, Today I wanted to work on Debugging tools in my original minecraft version. Though, this was hectic of a job, but now I am confident enough to say that, if anything goes wrong, my error codes will instantly trigger and stop those bugs to ever reach me, specially, If I messed up something. This is specifically made to guard rail myself (as I am a newbie in the GPU optimization and just breaks stuff way too often for comfort during my learning steps..) Now, you might be working what is so special that I did that I am being too optimistic (Specially if you know my history of crashouts LOL…) So, Basically, This time, I researched about an algorithm for dependencies.. Basically, what npm uses to keep track of all the dependencies.. You never know where knowledge might reach you LOL.. So, Basically, now each file, or system like Player, Physics, and to add, Chunks and More, will have to implement system, and each system would have a dependency tree, and then by using Kahn’s Algorithm, we can literally turn that tree upside down, and go through the data and make it work.. It literally tells you, which files are Missing in your code, that is just too good.. The only one critic is that, each time you need to be assing a new attribute, which might be tedious, but the profits are way too big to ignore at all.."}, {"post_id": 23398, "ts": "2026-07-06T10:26:26Z", "hours": 2.1028, "text": "Final few fixes before shipping, added biome support, and now I will be ready to be trying to make a project, without following tutorial, trying to optimize it, because obviously, three.js, though sounds cool and all.. Uses WebGL, which is widely supported.. but I want to use your entire GPU.. because obviously.. I PAID FOR THE ENTIRE GPU.. (BTW, I don’t even have a GPU, I have what is called Shared GPU Memory with storage but anyways.. THAT IS NOT THE POINT..)"}, {"post_id": 23315, "ts": "2026-07-06T05:58:40Z", "hours": 2.9458, "text": "Added Water, Trees, Sand and polish to my project… Like the toolbar, you can see in the bottom. Clean and Elegant.. COMMENT 67 IF YOU WANT TO SEE A 67 STRUCTURE ADDED TO MY GAME… ;)"}, {"post_id": 22734, "ts": "2026-07-05T09:50:57Z", "hours": 4.8264, "text": "I want to ask, How do you literally add shadows, and fog, and everything and that so, all in just one line of code? That is just stupid to even think about.. But anyways, now I have made it so, you can break and place blocks and also, if you render out from the world, and come back in, the blocks will still be there.. BE READY FOR ANOTHER ROUND OF 67 … OH WAIT.. NEXT DEVLOG WILL BE 67.. OR WAIT, LET ME JUST.. LOL, 100% NOT A STRUCTURE IN GAME.. (ATLEAST FOR NOW.. HEHEHEHE)"}, {"post_id": 22082, "ts": "2026-07-04T10:32:13Z", "hours": 0.3108, "text": "Guys Just imagine a world, where the whole life is actually a simulation, and God is literally using his laptop like this, to see what you are doing.. (AND YES, YOU WERE BANGING YOUR HEAD, JUST NOT ON GRASS.. DON’T LIE TO ME.. I AM SEEING YOU..)"}, {"post_id": 22052, "ts": "2026-07-04T09:31:51Z", "hours": 1.9986, "text": "Collisions are now working, with this beautiful looking icosphere as an helper. I JUST WISH WEBGPU OFFERED SUCH CUSTOMIZABILITY.. BUT TRUST ME, I AM GOING TO ADD THESE INTO THE MAIN PROJECT AS WELL.. Three.JS is just so cool.. But again, my goal is to make it the most optimized stuff and see the Entire Earth, and not be happy with just collisions.. SO Let me just complete this tutorial, but I am having a blast."}, {"post_id": 21954, "ts": "2026-07-04T04:53:29Z", "hours": 0.4147, "text": "I hate to admit it, but did I just add, literal shadows, that would have taken me, so so much hours to be working on.. And THREE.JS SOMEHOW, LITERALLY HAS A FREAKING FUNCTION.. THAT DOES THAT AUTOMATICALLY?? EXCUSE ME??? THAT’S JUST CHEATING.."}, {"post_id": 21906, "ts": "2026-07-04T02:37:42Z", "hours": 0.9956, "text": "This really feels surreal.. I am editing parameters to a game, in which people will land their beautiful foot on, ad mine ores, and do stuff, and this is like a dev mode, where I and I choose how much coal and Iron I want in my life.. Damn.."}, {"post_id": 21629, "ts": "2026-07-03T17:47:52Z", "hours": 0.6967, "text": "Umm, Why is Three.js so easy?? HELLO?? JUST MADE A SIMPLE SLIDER THINGY, AND THIS IS SO DOPE GUYS.."}, {"post_id": 21428, "ts": "2026-07-03T11:35:56Z", "hours": 1.0111, "text": "I have started following a tutorial, and I have done so much research, but it a shame that I cannot log that time. I went through some of the best documents written about WebGPU and explaining stuff.. But anyways, I have started following a tutorial on Three.js for making minecraft. It has literally made me in ease, because now I can log some actual time now.. By writing code rather than researching and for now here is my plan Continue to do this project Phase: 1 Draw a Cube with Controls, Draw 2 Cubes with Controls DRAW 64000 CUBES WITH CONTROLS.. By controls they are Orbital Controls, and then we will move on to the second part which is Working on a Naive Mesher, which will just give all the blocks its own 12 triangles on 8 edges each, and then blow up my laptop because if you realise 64000 * 12 is some sheesh work.. SO MANY TRIANGLES, AND I COULD SEE HARDLY 100.. But atleast, it will be the start, then I will work on Instancing and get me fps back up Also utilize the FrameStats which I will make for myself, like the same which well.. THREE.JS USES BUT WITH MY AKA TRUTHENTITY STYLE.. YOOOOO Then perhaps start erasing triangles that are connected through a second mesher Yes I will have multiple types of Meshers and Multiple type of Camera.. And all should follow a common Camera and everything else should be an Implementation like last time, I gave Geometry Pass the implementation of the simpler Renderer Pass, because it effectively make me plug and play with multiple different ways. This is going to be my stuff for next few days of my life."}, {"post_id": 21275, "ts": "2026-07-03T03:33:09Z", "hours": 0.5992, "text": "Guys, My very first shader, completely written by me, and it looks so sick. All it does is feed into the fragment an attribute of space, and break that space with a checker.. And this is just fascinating.. I want to hug myself.."}, {"post_id": 20908, "ts": "2026-07-02T17:05:27Z", "hours": 1.1739, "text": "Guys I can see progress.."}, {"post_id": 20214, "ts": "2026-07-01T19:23:17Z", "hours": 2.3717, "text": "It was quite easy, I mean, I am finally writing shaders, and yes, you guys have seen me make a triangle before, but that was genuinely speaking, was just a normal little trinagle.. But this triangle.. NO NO.. I have structured it so nicely that dare you break this, and my FATAL ERROR systems start to panic and trigger alarms all around.. It was a chaotic mess, and yes I did rejuvanate some parts of my old project, but yah, It’s not like I don’t know what I am doing now.. Furthermore, Sorry for my mental issues, I GOT MY FIRST SHIP’S PAYOUT, and though I was not expecting it, I am more than happy, even if it was a 13x mult and yah, I got a lot of comments regarding Z-Fighting.. I don’t really know the source of this issue, so I will be making the stuff again anyways, in my ways this time.. And hopefully, it will be better than last time.. I am so happy that I literally broke a tear when I saw I got a payout.. Thanks to everyone for so so much support… I will not be working harder than ever towards this project."}, {"post_id": 19340, "ts": "2026-06-30T16:55:33Z", "hours": 1.5981, "text": "Sorry for all my mental breakdowns.. Here is some actual progress that I did by myself.. I learnt about Assert from my last code.. And why do we need assert.. And I made my own Logger.. What are these so let me explain.. A Logger is atmost just a console.log message, but why to make it a separate class? This offers a lot of usability, as first, you can just say, this is a warning type of stuff, or this is just verbose.. Or MAYBE STOP SOMETHING IF IT IS SOMETHING VERY FATAL, AND SHOULD BE FIXED ASAP.. Not only that, often you will encounter like specially if you link something like a canvas, it might always be that well, Either you will force it using “!” in the end, or you will just do a command that eliminated undefined.. Like if (canvas !== undefined), but assert says.. OK, LET ME HAVE A CONDITION, and not only that, my asserts are special, as I have rigged it, so it will never ever return or what Typescript called a never return.. So you don’t need to write those.. Loggers also have a special use, as if the messages are verbose, instead of removing and readding all the console logs in like a stupid way.. You can declare a class and say, if the level is below fatal, like for verbose or info type of stuff, just cancel those stuff.. Just don’t show it.. It is very nice tool tbh.. Oh yah, I forgot.. Well, as these are custom, so You can literally add another parameter like context, as to what might be the reason for the breaking of the code, so if you check that code later on in life.. You will still know, what broke and where.. It’s a really handy tool in my opinion and everyone should give it a shot."}, {"post_id": 18410, "ts": "2026-06-29T15:32:03Z", "hours": 4.3344, "text": "Yesterday, I was doing research, so I don’t disappoint any of you guys. I watched some matrices manipulation videos and all, and I made this small little copy for myself to store all the findings I have. I don’t really have a lot, but these are certainly my findings, and I don’t prefer making notes on laptop, because personal preference in that. Anyways Give this a read, it is not very hard, and you will learn something new about how the GPU works and specially if you always wondered, what is the actual use of “Matrices” because I am in high school, and I always thought Matrices were silly and all. For people, who have been since the start of this project. First of all, I wanted to talk to you guys.. I don’t really know, what to do to this project. And I feel like, I am going to get banned, because even after all those iterations, remember, the whole project is widely AI made.. Though I am currently research, and have been open. But I don’t really know, how to feel about it. My stupid little Autistic Brain is really panicing that all my 100 hours of work would be gone. Honestly, I won’t be sad or anything if I get banned, because, indeed I used AI, but I just wanted to write my best shot, that atleast, I had a point to say, and then whatever the friends at StarDance decide, I will be completely fine with it. My main goal for developing this project, came from watching a tutorial, and I wanted to try to make something like Minecraft but for the web, because I was fascinated by optimizations.. This optimization, that optimization.. And I was like, Wait, these youtubers are literally rendering trillions of vertexes, why not make it in the browser, and even if I am able to render in 100s.. I still would always find it fascinating.. I never really thought before I started, and I just wanted to talk to AI, about how everything worked, and all.. I did mostly the research about optimization, and I specifically chose Gemini Pro over Claude, because Claude really does the heavy lifting for everyone, whereas I was here to learn. That’s the reason, I had so many hours invested.. (and so many reiterations on my code LOL…). I wanted to learn, but not like the code, but like how to optimize, like, I used to think.. Wait, BITWISE MAPPING.. We can map this much bytes to this, and that, and let the AI write the code for that.. I was just so invested on this project, I forgot we had a rule of “NO MORE THAN 30% AI..” Ahh, I am stupid.. That’s why, I am trying to gain myself back a lot now.. Doing stuff without hours like writing on copy, because obviously I could have written through VSC or something.. but now, I have really given hope on this project as a Retired / Banned Project…. I literally am currently working on a different repo with the name Minecraft rather than this.. I am watching youtube videos and lectures about how WebGPU works and all.. And I want to gain myself back.. As in a good person, and not like an AI slop, who breaks rules.."}, {"post_id": 17378, "ts": "2026-06-28T04:25:03Z", "hours": 0.5958, "text": "If anyone wants to understand more about what a Graphics API is, and how is it meant to work, I would highly suggest watching “Making my own 3D engine” by Inkbox https://www.youtube.com/watch?v=OJoZSRnU0is"}, {"post_id": 16728, "ts": "2026-06-27T05:24:19Z", "hours": 9.9878, "text": "IDK, How should I actually show my research in here but this is like, I have been working on, I have made 5 different notes, and as you can see by the time.. Yah, I have worked some hours on this bad boy.."}, {"post_id": 15580, "ts": "2026-06-25T10:41:26Z", "hours": 6.1003, "text": "Never in my life, I thought I would be so happy seeing a Red Triangle Render on my screen.. YAH, I WASTED LIKE 6 HOURS READING ARTICLES WRITING SHEESH, THEN ASKING AI, Obviously not to generate code, but about where to understand it better, and how to understand the concepts. And more. GUYS, STOP FOLLOWING ME.. It breaks my heart so much, that I am gonna disappoint you all, if I didn’t make this project, fully work.. Till I was trying to make stuff, and learn and sleep, and learn, I didn’t have so many followers, it was like, fine, if it broke for me, it’s completely fine with me, but now.. IT FEELS LIKE, IT IS NOT GOING TO BE FINE.. Thankfully, I am using a different repo, and that is accurately named as “Minecraft” rather than Puzzles to avoid confusion. As where did the Puzzle come from? Well, long story short, see my first ever devlog in here."}, {"post_id": 14225, "ts": "2026-06-23T07:27:20Z", "hours": 2.3678, "text": "Guys, I will be completely open, and I have said before as well, but seeing so many people keep following me. Thank you so much for following a project, that is though made by me, but it like I am owning a shop that is run by someone else. AKA, AI has helped me a ton, and so much that, I don’t know, anything afterwards, specially with Shaders, WebGPU and other creative stuff and optimizations, which let’s be honest, the optimizations like, GREEDY MESHING!!, OCCLUSION CULLING, BACK CULLING (Though it was just like a line as it was native to WebGPU), and while reading through other low level youtubers about optimizations such as, EXTREMITY BOUND CHECKING, BITWISE MANIPULATION,CACHE LOCALITY, NOISE UPSAMPLING, NOISE CASHING, RUN LENGTH ENCODING, RLE BASED RUNTIME. VOXEL DATALOOKUP TABLES, AoSoA and so on, like these just become buzz words that I ask my AI to help with, and that’s the recipe to make everything fall apart when you want to add something new. AI’s context windows are just not big enough to have a full fedged Minecraft. Seeing all you guys support, I have decided to ask AI to now teach me, and help me with the flow, and never the code, I will be coding every single word by myself. Read Papers, and try to implement it myself and so on.. This might be a big turning point for the project because, YAH, I AM WRITING THIS ENTIRE CODE ONCE AGAIN, But this time, I promise, I will be learning everything, and I will keep this as running, and make a second repo like minecraft or something, to enjoy. Sorry to everyone who thought, this is entirely made by me, because that is just not possible for such small 7 second attention span kids like us."}, {"post_id": 12912, "ts": "2026-06-21T04:32:28Z", "hours": 1.0956, "text": "Added leaves and foliage, this was arguable much easy, but I sure know, I again broke my optimizations or atleast something must be broken, because things cannot go this smooth.. AND FOR ONCE, I WROTE SOMETHING I CAN ALSO UNDERSTAND, and then AI was like Nuh Uh, SALTED TREE SIMULATOR!! USE SEED, AND FEED IT WITH SOME SALT, PUSH THAT UP A TREE, AND YOU HAVE BETTER TREES.. I am sometimes stunned that how much AI can really help you develop something, that can look this promising. I thought only top tier people, or people with tons and tons of money to burn on Claude can build this, but this is not that bad, if I am being honest. Obviously, I won’t reach the same level of achievements as that of something like Claude, but I think, I learnt so so much about Shaders, its types, like Vertex, Fragment and My fav, COMPUTE shaders.. And everything is just so cool. Still fixing some bugs here and there, because umm.. Yah, it still needs a lot, and A LOT OF OPTIMIZATIONS and polish, because my chunk generation worked better in my last attempt. Will be figuring everything out so stay tuned my dear friends.. NOTABLE MENTIONS:- YOUTUBERS Low Level Game Dev (He has some clever tricks up as well, which Vericidium didn’t) Vercidium (TRUE INSPIRATION AND GOATED, FOR MAKING MY PROJECT WORK) Frieends Rupnil (My cutiepie, NO QUESTIONS) Adamd (He helped me get funds for one of my hardware projects without asking anything in return. THANK YOU)"}, {"post_id": 12571, "ts": "2026-06-20T15:06:04Z", "hours": 3.2694, "text": "I have just added the option to save, so basically, if you make something funny like 67 on your world with water blocks, first of all, EWW… And second of all, yes it will persist and now I will hate you even more."}, {"post_id": 12374, "ts": "2026-06-20T06:15:52Z", "hours": 1.0867, "text": "Guys, I think, I broke something, but I really cannot point out, what is wrong in my minecraft? I mean.. There is something missing, but what can it be?"}, {"post_id": 12091, "ts": "2026-06-19T18:52:09Z", "hours": 2.1861, "text": "Current Lighting Rendering Engine, currently using the AO metrics that I used last time, but I never understood properly, but this time, this looks so so so cool.. This will be coming soon for you guys as well to enjoy. Stay tuned. This was a lot of trouble and back and forth. Because lighting engine, doesn’t one have to update one chunk, but four neighboring chunk as well, and idk why it took me so long to realise.."}, {"post_id": 11915, "ts": "2026-06-19T12:59:27Z", "hours": 1.8122, "text": "I am sorry, did I just get 60FPS?? I HAD TO PAUSE MY FRAME TO CAPTURE THIS MUCH OPTIMIZATION. I am not even at the peak of it. Furthermore, I was currently working on Sky Box, and I am tired to figuring out what’s wrong, so this is an early devlog of just about 2 hours. I want to rant about skyBox and what did I do to well, Make my game break.. So, what happened is that, the shaders that I am using, I was using vec3, which means sun’s direction is a vector of 3 floats, but somehow, vec3 must always start on a multiple of 16.. WHO DECIDED THAT WAS A GOOD IDEA.. WHO IS THAT MORON??? I WANT TO TAKE MY SHOTGUN OUT (TO FLEX) AND PUNCH HIM (BECAUSE WHO WASTES AMMO.. TOO EXPENSIVE LAH.) I GOT TIRED DEBUGGING THIS… Only for AI to tell me, you did everything right except everything.. I just uploaded everything. You guys might think this is a negative as no trees and grass, but TRUST THE PROCESS.. I KNOW YOU CAN, ELSE I WILL SHOW YOU MY SHOTGUN AND PUNCH YOU AS WELL!!"}, {"post_id": 11811, "ts": "2026-06-19T07:03:19Z", "hours": 1.8922, "text": "Quick Update on the progress.. I mean, FAH.. The render distance so high, and yet the FPS IS PLAYABLE, without even much optimizations. I know, the terrain has nothing for now. But don’t worry.. SOON TM.. Let me handle the optimizations first. AND DON’T YOU DARE CROSS QUESTION ME, ELSE I WILL CROSS YOUR QUESTION BACK TO YOU"}, {"post_id": 11216, "ts": "2026-06-18T11:10:03Z", "hours": 3.03, "text": "Playing Minecraft it was never meant to be LMAO.. On this, an important announcement to make here. I will not be able to add multiplayer into this build, because it adds extra complexity into the build, which I am not able to work it for now. It requires you to first have an server in the first place, and then work with streaming and all those. Latency can be a nightmare to tackle with. I am waiting for my last ship’s payout so I can push on github, all my updates. Till then, I am working on small things, like adding structures like trees, water and so on, because this is a new, and much more optimized build than the last one. You will also find it relatively pleasing to read my code, if you are nerdy enough, but isn’t that hard tbh."}, {"post_id": 11112, "ts": "2026-06-18T05:41:13Z", "hours": 4.0106, "text": "Better support for AO Voxels and lighting coming soon to this build. Stay Tunes or you might miss out. Here is a small working prototype of it. What is AO you may ask? AO means Ambient Occlusion, what it does is check in the four corners, and predict the shading based off of those corners. I mean, AO has much more, but this is like a basic and optimized version of it, that looks good, but also not performance heavy. Obviously, I am not using GAMING RTX 5090 for this.. Hell, My Laptop doesn’t even have a GPU, SO SHUT UP.. IT’S MY GAME AND I WILL DESIGN IT HOWEVER I WANT."}, {"post_id": 10666, "ts": "2026-06-17T15:05:23Z", "hours": 6.2597, "text": "Hate me as much as you want, because, I am rewriting my code once again for the idk, like 5th time, just to learn more, and finally I am able to structure my code properly. Go this was a bad plan. And I would not like to go to this hell ever again. Please god, forgive me for my sins.. But anyways, as you can see, I am currently, literally rewriting parts of the code, and organishing it, into much better folder structure, so I and you, and she who told you not to worry about his boy, can all understand this code and you don’t have to be a nerd to be changing parameters to buff yourself, to become the boy the girls needs.. IDK, I have been working too much on this project. I need therapy LMAO.."}, {"post_id": 9758, "ts": "2026-06-16T06:01:00Z", "hours": 3.4519, "text": "Currently working on WebRTC and understanding, why do I exist, but also why do computers exist, and how do computers know that my computer is not your computer and your computer is well, how is it your computer. And can they secretly interact and do goofy things with ultrasonic, and I mean, it’s technically the speed of light so.. YAH.."}, {"post_id": 9084, "ts": "2026-06-15T05:46:24Z", "hours": 5.6536, "text": "Final Finishing Touches, And I wanted to add much more, like better lighting support and all, but Now I am getting too much out of my comfort zone, and will have to work completely with AI, I have polished the UI, made an Inventory system and a bit more, but now, I am really tired, and cannot explain, how tedious it has become maintaining my own code. So I will have to halt my project now and ship it. Thanks to Stardance for giving me such a wonderful place to code at and work, and show my works and learn so so much cool stuff into the world of GPUs and Shaders."}, {"post_id": 8023, "ts": "2026-06-13T11:57:01Z", "hours": 3.1878, "text": "Umm.. Do cows have lawyers? Anyways, Today, i just worked on refactoring my code into different files, so it is easier to navigate and understand the code. Because it was getting a mess."}, {"post_id": 7405, "ts": "2026-06-12T10:32:33Z", "hours": 1.5669, "text": "Water Update with bouyancy and all.. And made everything look like Avatar.. BLUE TONED.. Because you know, Water is blue, and blue is blue, I have no clue, so make everything blue. Now, you are blue, and me is blue"}, {"post_id": 6967, "ts": "2026-06-11T18:00:49Z", "hours": 0.31, "text": "IDK, How do I show you but basically, As I have moved to a typescript focused base. So, I had to change my monorepo and all. So Now, the game is playable for anyone to enjoy."}, {"post_id": 6940, "ts": "2026-06-11T17:14:07Z", "hours": 11.7611, "text": "Guys it’s been about 12 hours and let me tell you. First of all. I am just too tired after all this. I wanted to use better optimized code like SSBOs but basically, I cannot use it due to the fact that it is not available in OpenGL ES 30 so I had to go all around and make the entire game in another GPU.. Making shaders was already hard. THIS MADE IT WORSE!! So, Currenly, my app supports two formats and if you are stupid enough that you don’t have WebGPU, so it will run normally like WebGL will get on and help. Further optimized my code and also, I will be optimizing it even further. I have added grass by then SO I CAN TOUCH IT, ATLEAST WHEN I AM SITTING AND LEARNING AND DOING THESE STUPID STUFF. Uff.. Also the I have also added moving Cows so you can see, but the texture is just stone so please don’t mind."}, {"post_id": 5711, "ts": "2026-06-09T16:39:15Z", "hours": 0.6553, "text": "Guys, I think, I found a friend.. Its not cute and all.. BUT IT’S LOVELY.. I LOVE HER SO MUCH.. YOU NAME IS WELL.. PET ROCK.. AWWWW.. YOU ARE SO LOVELY MS. PET ROCK.. Hope you don’t die the moment you fall.. 100% NOT FORESHADOWING.."}, {"post_id": 5685, "ts": "2026-06-09T15:47:02Z", "hours": 1.0764, "text": "Water is finally working and it is moving.. It is animated so you can enjoy the ambience. Furthermore, I have dialed up the variables for my night. So, the night isn’t like a horror movie. Took me a little too long then I would anticipate."}, {"post_id": 5566, "ts": "2026-06-09T12:09:32Z", "hours": 1.4347, "text": "Currently I am working on Implementing Water, and let’s just say, it’s not working out well for me."}, {"post_id": 5514, "ts": "2026-06-09T10:09:46Z", "hours": 2.4567, "text": "Guys, I think, When I meant Water, I meant to add Water not BEANS IN MINECRAFT.. LMAOO… BEANS!!!!!! BEANS MOD COMING SOON TM"}, {"post_id": 5058, "ts": "2026-06-08T18:38:13Z", "hours": 1.1131, "text": "ONLY 1% OF PEOPLE CAN FIND THE DIFFERENCE BETWEEN MY LODs LMAO XD… CAN YOU FIND THE 4 LEVELS OF LODS BECAUSE I CANNOT - DORA THE DRUG DEALER"}, {"post_id": 4955, "ts": "2026-06-08T16:20:44Z", "hours": 0.7411, "text": "Inventory Icon Update"}, {"post_id": 4933, "ts": "2026-06-08T15:19:58Z", "hours": 1.7539, "text": "Not to brag about anything, but I just rendered like over 4000 chunks with I know I know, 20 FPS, but you don’t realise, just see the CPU and GPU. It’s not even a proper GPU, Is uses VRAM from my storage no less.. For anyone wondering, Check Intel UHD Graphics, and my CPU is i3-1005G1, so it’s some antique peice, but yet, my algorithms held strong even in rendering 4000 fizzing chunks. Entities like cows coming soon."}, {"post_id": 4779, "ts": "2026-06-08T08:31:49Z", "hours": 4.2933, "text": "Rendering Pipeline Updated, to make it work with even more chunks Procedural Generation, and make it not suck. The main problem I was facing and is still facing is the fact that I am dumb, and also Lighting. Somehow, the Lighting Engine is not working out with so many parameters that I have tested with. I will probably just"}, {"post_id": 4357, "ts": "2026-06-07T17:26:03Z", "hours": 4.3622, "text": "Lighting Engine Update, And tons of optimizations added to make it work. I hope, it doesn’t crash on anyone, because, when I check the memory usage of this bad boy, it was just 56MB, I was like, FAH??? I MADE ALL OF THIS, IN 56 MB???? That’s some crazy shit. I will be working on the Menu and all next. Stay tuned."}, {"post_id": 4077, "ts": "2026-06-07T08:32:19Z", "hours": 6.5333, "text": "First of all, thanks to rufus.gordonheywood for his following, because, I forgot, I was doing star dance, I literally, went so deep into making Minecraft work. If you want, you can check, this minecraft literally has no external dependencies.. THAT IS SOME CRAZY SHIT. I recently made procedral generation, multithreading, and so much more. And I want to be brutally honest with everyone, yes I am using AI, because I just couldn’t make it work without it, the WEBGPU Shaders, the compiling languages, and so much more. I am sorry for anyone who is disappointed. BTW, Currently, I am seeing a bug, that if you fork my project and run it through live server, it is working fine, but not through github. IDK, What’s wrong, but I will get into it ASAP, and make everyone enjoy my shit."}, {"post_id": 3551, "ts": "2026-06-06T15:21:27Z", "hours": 6.1564, "text": "Don’t even ask, why I made a 32x32x32 Minecraft world, and hyperoptimized it to run on GPU and write compute shaders, and eat myself multiple times in the process.. Yah Yah, I used AI, but I wrote everything by hand and understand most of the code, apart from Shaders, just don’t ask me please.. LOL.. But, I made this run with only 40 vertices, like WHAT THE FLUFFFF???? YOOOOO"}, {"post_id": 2775, "ts": "2026-06-05T16:03:25Z", "hours": 5.2967, "text": "Worked on Procedral Glass Breaking… Please don’t ask how long it took, because IT TOOK ME THROUGH THE CORNERS OF INTERNET TO FIND SOMETHING, and then refined it with AI.. Yah AI, I want to be open, But I am not smart enough dealing with such intricate part and design"}]...
|
Title: Minecraft Web by @TruthEntity | Stardance
Title: Minecraft Web by @TruthEntity | Stardance
Devlogs:
Worked on Procedral Glass Breaking… Please don’t ask how long it took, because IT TOOK ME THROUGH THE CORNERS OF INTERNET TO FIND SOMETHING, and then refined it with AI.. Yah AI, I want to be open, But I am not smart enough dealing with such intricate part and design
Don’t even ask, why I made a 32x32x32 Minecraft world, and hyperoptimized it to run on GPU and write compute shaders, and eat myself multiple times in the process.. Yah Yah, I used AI, but I wrote everything by hand and understand most of the code, apart from Shaders, just don’t ask me please.. LOL.. But, I made this run with only 40 vertices, like WHAT THE FLUFFFF???? YOOOOO
First of all, thanks to rufus.gordonheywood for his following, because, I forgot, I was doing star dance, I literally, went so deep into making Minecraft work. If you want, you can check, this minecraft literally has no external dependencies.. THAT IS SOME CRAZY SHIT. I recently made procedral generation, multithreading, and so much more. And I want to be brutally honest with everyone, yes I am using AI, because I just couldn’t make it work without it, the WEBGPU Shaders, the compiling languages, and so much more. I am sorry for anyone who is disappointed. BTW, Currently, I am seeing a bug, that if you fork my project and run it through live server, it is working fine, but not through github. IDK, What’s wrong, but I will get into it ASAP, and make everyone enjoy my shit.
Lighting Engine Update, And tons of optimizations added to make it work. I hope, it doesn’t crash on anyone, because, when I check the memory usage of this bad boy, it was just 56MB, I was like, FAH??? I MADE ALL OF THIS, IN 56 MB???? That’s some crazy shit. I will be working on the Menu and all next. Stay tuned.
Rendering Pipeline Updated, to make it work with even more chunks Procedural Generation, and make it not suck. The main problem I was facing and is still facing is the fact that I am dumb, and also Lighting. Somehow, the Lighting Engine is not working out with so many parameters that I have tested with. I will probably just
Not to brag about anything, but I just rendered like over 4000 chunks with I know I know, 20 FPS, but you don’t realise, just see the CPU and GPU. It’s not even a proper GPU, Is uses VRAM from my storage no less.. For anyone wondering, Check Intel UHD Graphics, and my CPU is i3-1005G1, so it’s some antique peice, but yet, my algorithms held strong even in rendering 4000 fizzing chunks. Entities like cows coming soon.
Inventory Icon Update
ONLY 1% OF PEOPLE CAN FIND THE DIFFERENCE BETWEEN MY LODs LMAO XD… CAN YOU FIND THE 4 LEVELS OF LODS BECAUSE I CANNOT - DORA THE DRUG DEALER
Guys, I think, When I meant Water, I meant to add Water not BEANS IN MINECRAFT.. LMAOO… BEANS!!!!!! BEANS MOD COMING SOON TM
Currently I am working on Implementing Water, and let’s just say, it’s not working out well for me.
Water is finally working and it is moving.. It is animated so you can enjoy the ambience. Furthermore, I have dialed up the variables for my night. So, the night isn’t like a horror movie. Took me a little too long then I would anticipate.
Guys, I think, I found a friend.. Its not cute and all.. BUT IT’S LOVELY.. I LOVE HER SO MUCH.. YOU NAME IS WELL.. PET ROCK.. AWWWW.. YOU ARE SO LOVELY MS. PET ROCK.. Hope you don’t die the moment you fall.. 100% NOT FORESHADOWING..
Guys it’s been about 12 hours and let me tell you. First of all. I am just too tired after all this. I wanted to use better optimized code like SSBOs but basically, I cannot use it due to the fact that it is not available in OpenGL ES 30 so I had to go all around and make the entire game in another GPU.. Making shaders was already hard. THIS MADE IT WORSE!! So, Currenly, my app supports two formats and if you are stupid enough that you don’t have WebGPU, so it will run normally like WebGL will get on and help. Further optimized my code and also, I will be optimizing it even further. I have added grass by then SO I CAN TOUCH IT, ATLEAST WHEN I AM SITTING AND LEARNING AND DOING THESE STUPID STUFF. Uff.. Also the I have also added moving Cows so you can see, but the texture is just stone so please don’t mind.
IDK, How do I show you but basically, As I have moved to a typescript focused base. So, I had to change my monorepo and all. So Now, the game is playable for anyone to enjoy.
Water Update with bouyancy and all.. And made everything look like Avatar.. BLUE TONED.. Because you know, Water is blue, and blue is blue, I have no clue, so make everything blue. Now, you are blue, and me is blue
Umm.. Do cows have lawyers? Anyways, Today, i just worked on refactoring my code into different files, so it is easier to navigate and understand the code. Because it was getting a mess.
Final Finishing Touches, And I wanted to add much more, like better lighting support and all, but Now I am getting too much out of my comfort zone, and will have to work completely with AI, I have polished the UI, made an Inventory system and a bit more, but now, I am really tired, and cannot explain, how tedious it has become maintaining my own code. So I will have to halt my project now and ship it. Thanks to Stardance for giving me such a wonderful place to code at and work, and show my works and learn so so much cool stuff into the world of GPUs and Shaders.
Currently working on WebRTC and understanding, why do I exist, but also why do computers exist, and how do computers know that my computer is not your computer and your computer is well, how is it your computer. And can they secretly interact and do goofy things with ultrasonic, and I mean, it’s technically the speed of light so.. YAH..
Hate me as much as you want, because, I am rewriting my code once again for the idk, like 5th time, just to learn more, and finally I am able to structure my code properly. Go this was a bad plan. And I would not like to go to this hell ever again. Please god, forgive me for my sins.. But anyways, as you can see, I am currently, literally rewriting parts of the code, and organishing it, into much better folder structure, so I and you, and she who told you not to worry about his boy, can all understand this code and you don’t have to be a nerd to be changing parameters to buff yourself, to become the boy the girls needs.. IDK, I have been working too much on this project. I need therapy LMAO..
Better support for AO Voxels and lighting coming soon to this build. Stay Tunes or you might miss out. Here is a small working prototype of it. What is AO you may ask? AO means Ambient Occlusion, what it does is check in the four corners, and predict the shading based off of those corners. I mean, AO has much more, but this is like a basic and optimized version of it, that looks good, but also not performance heavy. Obviously, I am not using GAMING RTX 5090 for this.. Hell, My Laptop doesn’t even have a GPU, SO SHUT UP.. IT’S MY GAME AND I WILL DESIGN IT HOWEVER I WANT.
Playing Minecraft it was never meant to be LMAO.. On this, an important announcement to make here. I will not be able to add multiplayer into this build, because it adds extra complexity into the build, which I am not able to work it for now. It requires you to first have an server in the first place, and then work with streaming and all those. Latency can be a nightmare to tackle with. I am waiting for my last ship’s payout so I can push on github, all my updates. Till then, I am working on small things, like adding structures like trees, water and so on, because this is a new, and much more optimized build than the last one. You will also find it relatively pleasing to read my code, if you are nerdy enough, but isn’t that hard tbh.
Quick Update on the progress.. I mean, FAH.. The render distance so high, and yet the FPS IS PLAYABLE, without even much optimizations. I know, the terrain has nothing for now. But don’t worry.. SOON TM.. Let me handle the optimizations first. AND DON’T YOU DARE CROSS QUESTION ME, ELSE I WILL CROSS YOUR QUESTION BACK TO YOU
I am sorry, did I just get 60FPS?? I HAD TO PAUSE MY FRAME TO CAPTURE THIS MUCH OPTIMIZATION. I am not even at the peak of it. Furthermore, I was currently working on Sky Box, and I am tired to figuring out what’s wrong, so this is an early devlog of just about 2 hours. I want to rant about skyBox and what did I do to well, Make my game break.. So, what happened is that, the shaders that I am using, I was using vec3, which means sun’s direction is a vector of 3 floats, but somehow, vec3 must always start on a multiple of 16.. WHO DECIDED THAT WAS A GOOD IDEA.. WHO IS THAT MORON??? I WANT TO TAKE MY SHOTGUN OUT (TO FLEX) AND PUNCH HIM (BECAUSE WHO WASTES AMMO.. TOO EXPENSIVE LAH.) I GOT TIRED DEBUGGING THIS… Only for AI to tell me, you did everything right except everything.. I just uploaded everything. You guys might think this is a negative as no trees and grass, but TRUST THE PROCESS.. I KNOW YOU CAN, ELSE I WILL SHOW YOU MY SHOTGUN AND PUNCH YOU AS WELL!!
Current Lighting Rendering Engine, currently using the AO metrics that I used last time, but I never understood properly, but this time, this looks so so so cool.. This will be coming soon for you guys as well to enjoy. Stay tuned. This was a lot of trouble and back and forth. Because lighting engine, doesn’t one have to update one chunk, but four neighboring chunk as well, and idk why it took me so long to realise..
Guys, I think, I broke something, but I really cannot point out, what is wrong in my minecraft? I mean.. There is something missing, but what can it be?
I have just added the option to save, so basically, if you make something funny like 67 on your world with water blocks, first of all, EWW… And second of all, yes it will persist and now I will hate you even more.
Added leaves and foliage, this was arguable much easy, but I sure know, I again broke my optimizations or atleast something must be broken, because things cannot go this smooth.. AND FOR ONCE, I WROTE SOMETHING I CAN ALSO UNDERSTAND, and then AI was like Nuh Uh, SALTED TREE SIMULATOR!! USE SEED, AND FEED IT WITH SOME SALT, PUSH THAT UP A TREE, AND YOU HAVE BETTER TREES.. I am sometimes stunned that how much AI can really help you develop something, that can look this promising. I thought only top tier people, or people with tons and tons of money to burn on Claude can build this, but this is not that bad, if I am being honest. Obviously, I won’t reach the same level of achievements as that of something like Claude, but I think, I learnt so so much about Shaders, its types, like Vertex, Fragment and My fav, COMPUTE shaders.. And everything is just so cool. Still fixing some bugs here and there, because umm.. Yah, it still needs a lot, and A LOT OF OPTIMIZATIONS and polish, because my chunk generation worked better in my last attempt. Will be figuring everything out so stay tuned my dear friends.. NOTABLE MENTIONS:- YOUTUBERS Low Level Game Dev (He has some clever tricks up as well, which Vericidium didn’t) Vercidium (TRUE INSPIRATION AND GOATED, FOR MAKING MY PROJECT WORK) Frieends Rupnil (My cutiepie, NO QUESTIONS) Adamd (He helped me get funds for one of my hardware projects without asking anything in return. THANK YOU)
Guys, I will be completely open, and I have said before as well, but seeing so many people keep following me. Thank you so much for following a project, that is though made by me, but it like I am owning a shop that is run by someone else. AKA, AI has helped me a ton, and so much that, I don’t know, anything afterwards, specially with Shaders, WebGPU and other creative stuff and optimizations, which let’s be honest, the optimizations like, GREEDY MESHING!!, OCCLUSION CULLING, BACK CULLING (Though it was just like a line as it was native to WebGPU), and while reading through other low level youtubers about optimizations such as, EXTREMITY BOUND CHECKING, BITWISE MANIPULATION,CACHE LOCALITY, NOISE UPSAMPLING, NOISE CASHING, RUN LENGTH ENCODING, RLE BASED RUNTIME. VOXEL DATALOOKUP TABLES, AoSoA and so on, like these just become buzz words that I ask my AI to help with, and that’s the recipe to make everything fall apart when you want to add something new. AI’s context windows are just not big enough to have a full fedged Minecraft. Seeing all you guys support, I have decided to ask AI to now teach me, and help me with the flow, and never the code, I will be coding every single word by myself. Read Papers, and try to implement it myself and so on.. This might be a big turning point for the project because, YAH, I AM WRITING THIS ENTIRE CODE ONCE AGAIN, But this time, I promise, I will be learning everything, and I will keep this as running, and make a second repo like minecraft or something, to enjoy. Sorry to everyone who thought, this is entirely made by me, because that is just not possible for such small 7 second attention span kids like us.
Never in my life, I thought I would be so happy seeing a Red Triangle Render on my screen.. YAH, I WASTED LIKE 6 HOURS READING ARTICLES WRITING SHEESH, THEN ASKING AI, Obviously not to generate code, but about where to understand it better, and how to understand the concepts. And more. GUYS, STOP FOLLOWING ME.. It breaks my heart so much, that I am gonna disappoint you all, if I didn’t make this project, fully work.. Till I was trying to make stuff, and learn and sleep, and learn, I didn’t have so many followers, it was like, fine, if it broke for me, it’s completely fine with me, but now.. IT FEELS LIKE, IT IS NOT GOING TO BE FINE.. Thankfully, I am using a different repo, and that is accurately named as “Minecraft” rather than Puzzles to avoid confusion. As where did the Puzzle come from? Well, long story short, see my first ever devlog in here.
IDK, How should I actually show my research in here but this is like, I have been working on, I have made 5 different notes, and as you can see by the time.. Yah, I have worked some hours on this bad boy..
If anyone wants to understand more about what a Graphics API is, and how is it meant to work, I would highly suggest watching “Making my own 3D engine” by Inkbox https://www.youtube.com/watch?v=OJoZSRnU0is
Yesterday, I was doing research, so I don’t disappoint any of you guys. I watched some matrices manipulation videos and all, and I made this small little copy for myself to store all the findings I have. I don’t really have a lot, but these are certainly my findings, and I don’t prefer making notes on laptop, because personal preference in that. Anyways Give this a read, it is not very hard, and you will learn something new about how the GPU works and specially if you always wondered, what is the actual use of “Matrices” because I am in high school, and I always thought Matrices were silly and all. For people, who have been since the start of this project. First of all, I wanted to talk to you guys.. I don’t really know, what to do to this project. And I feel like, I am going to get banned, because even after all those iterations, remember, the whole project is widely AI made.. Though I am currently research, and have been open. But I don’t really know, how to feel about it. My stupid little Autistic Brain is really panicing that all my 100 hours of work would be gone. Honestly, I won’t be sad or anything if I get banned, because, indeed I used AI, but I just wanted to write my best shot, that atleast, I had a point to say, and then whatever the friends at StarDance decide, I will be completely fine with it. My main goal for developing this project, came from watching a tutorial, and I wanted to try to make something like Minecraft but for the web, because I was fascinated by optimizations.. This optimization, that optimization.. And I was like, Wait, these youtubers are literally rendering trillions of vertexes, why not make it in the browser, and even if I am able to render in 100s.. I still would always find it fascinating.. I never really thought before I started, and I just wanted to talk to AI, about how everything worked, and all.. I did mostly the research about optimization, and I specifically chose Gemini Pro over Claude, because Claude really does the heavy lifting for everyone, whereas I was here to learn. That’s the reason, I had so many hours invested.. (and so many reiterations on my code LOL…). I wanted to learn, but not like the code, but like how to optimize, like, I used to think.. Wait, BITWISE MAPPING.. We can map this much bytes to this, and that, and let the AI write the code for that.. I was just so invested on this project, I forgot we had a rule of “NO MORE THAN 30% AI..” Ahh, I am stupid.. That’s why, I am trying to gain myself back a lot now.. Doing stuff without hours like writing on copy, because obviously I could have written through VSC or something.. but now, I have really given hope on this project as a Retired / Banned Project…. I literally am currently working on a different repo with the name Minecraft rather than this.. I am watching youtube videos and lectures about how WebGPU works and all.. And I want to gain myself back.. As in a good person, and not like an AI slop, who breaks rules..
Sorry for all my mental breakdowns.. Here is some actual progress that I did by myself.. I learnt about Assert from my last code.. And why do we need assert.. And I made my own Logger.. What are these so let me explain.. A Logger is atmost just a console.log message, but why to make it a separate class? This offers a lot of usability, as first, you can just say, this is a warning type of stuff, or this is just verbose.. Or MAYBE STOP SOMETHING IF IT IS SOMETHING VERY FATAL, AND SHOULD BE FIXED ASAP.. Not only that, often you will encounter like specially if you link something like a canvas, it might always be that well, Either you will force it using “!” in the end, or you will just do a command that eliminated undefined.. Like if (canvas !== undefined), but assert says.. OK, LET ME HAVE A CONDITION, and not only that, my asserts are special, as I have rigged it, so it will never ever return or what Typescript called a never return.. So you don’t need to write those.. Loggers also have a special use, as if the messages are verbose, instead of removing and readding all the console logs in like a stupid way.. You can declare a class and say, if the level is below fatal, like for verbose or info type of stuff, just cancel those stuff.. Just don’t show it.. It is very nice tool tbh.. Oh yah, I forgot.. Well, as these are custom, so You can literally add another parameter like context, as to what might be the reason for the breaking of the code, so if you check that code later on in life.. You will still know, what broke and where.. It’s a really handy tool in my opinion and everyone should give it a shot.
It was quite easy, I mean, I am finally writing shaders, and yes, you guys have seen me make a triangle before, but that was genuinely speaking, was just a normal little trinagle.. But this triangle.. NO NO.. I have structured it so nicely that dare you break this, and my FATAL ERROR systems start to panic and trigger alarms all around.. It was a chaotic mess, and yes I did rejuvanate some parts of my old project, but yah, It’s not like I don’t know what I am doing now.. Furthermore, Sorry for my mental issues, I GOT MY FIRST SHIP’S PAYOUT, and though I was not expecting it, I am more than happy, even if it was a 13x mult and yah, I got a lot of comments regarding Z-Fighting.. I don’t really know the source of this issue, so I will be making the stuff again anyways, in my ways this time.. And hopefully, it will be better than last time.. I am so happy that I literally broke a tear when I saw I got a payout.. Thanks to everyone for so so much support… I will not be working harder than ever towards this project.
Guys I can see progress..
Guys, My very first shader, completely written by me, and it looks so sick. All it does is feed into the fragment an attribute of space, and break that space with a checker.. And this is just fascinating.. I want to hug myself..
I have started following a tutorial, and I have done so much research, but it a shame that I cannot log that time. I went through some of the best documents written about WebGPU and explaining stuff.. But anyways, I have started following a tutorial on Three.js for making minecraft. It has literally made me in ease, because now I can log some actual time now.. By writing code rather than researching and for now here is my plan Continue to do this project Phase: 1 Draw a Cube with Controls, Draw 2 Cubes with Controls DRAW 64000 CUBES WITH CONTROLS.. By controls they are Orbital Controls, and then we will move on to the second part which is Working on a Naive Mesher, which will just give all the blocks its own 12 triangles on 8 edges each, and then blow up my laptop because if you realise 64000 * 12 is some sheesh work.. SO MANY TRIANGLES, AND I COULD SEE HARDLY 100.. But atleast, it will be the start, then I will work on Instancing and get me fps back up Also utilize the FrameStats which I will make for myself, like the same which well.. THREE.JS USES BUT WITH MY AKA TRUTHENTITY STYLE.. YOOOOO Then perhaps start erasing triangles that are connected through a second mesher Yes I will have multiple types of Meshers and Multiple type of Camera.. And all should follow a common Camera and everything else should be an Implementation like last time, I gave Geometry Pass the implementation of the simpler Renderer Pass, because it effectively make me plug and play with multiple different ways. This is going to be my stuff for next few days of my life.
Umm, Why is Three.js so easy?? HELLO?? JUST MADE A SIMPLE SLIDER THINGY, AND THIS IS SO DOPE GUYS..
This really feels surreal.. I am editing parameters to a game, in which people will land their beautiful foot on, ad mine ores, and do stuff, and this is like a dev mode, where I and I choose how much coal and Iron I want in my life.. Damn..
I hate to admit it, but did I just add, literal shadows, that would have taken me, so so much hours to be working on.. And THREE.JS SOMEHOW, LITERALLY HAS A FREAKING FUNCTION.. THAT DOES THAT AUTOMATICALLY?? EXCUSE ME??? THAT’S JUST CHEATING..
Collisions are now working, with this beautiful looking icosphere as an helper. I JUST WISH WEBGPU OFFERED SUCH CUSTOMIZABILITY.. BUT TRUST ME, I AM GOING TO ADD THESE INTO THE MAIN PROJECT AS WELL.. Three.JS is just so cool.. But again, my goal is to make it the most optimized stuff and see the Entire Earth, and not be happy with just collisions.. SO Let me just complete this tutorial, but I am having a blast.
Guys Just imagine a world, where the whole life is actually a simulation, and God is literally using his laptop like this, to see what you are doing.. (AND YES, YOU WERE BANGING YOUR HEAD, JUST NOT ON GRASS.. DON’T LIE TO ME.. I AM SEEING YOU..)
I want to ask, How do you literally add shadows, and fog, and everything and that so, all in just one line of code? That is just stupid to even think about.. But anyways, now I have made it so, you can break and place blocks and also, if you render out from the world, and come back in, the blocks will still be there.. BE READY FOR ANOTHER ROUND OF 67 … OH WAIT.. NEXT DEVLOG WILL BE 67.. OR WAIT, LET ME JUST.. LOL, 100% NOT A STRUCTURE IN GAME.. (ATLEAST FOR NOW.. HEHEHEHE)
Added Water, Trees, Sand and polish to my project… Like the toolbar, you can see in the bottom. Clean and Elegant.. COMMENT 67 IF YOU WANT TO SEE A 67 STRUCTURE ADDED TO MY GAME… ;)
Final few fixes before shipping, added biome support, and now I will be ready to be trying to make a project, without following tutorial, trying to optimize it, because obviously, three.js, though sounds cool and all.. Uses WebGL, which is widely supported.. but I want to use your entire GPU.. because obviously.. I PAID FOR THE ENTIRE GPU.. (BTW, I don’t even have a GPU, I have what is called Shared GPU Memory with storage but anyways.. THAT IS NOT THE POINT..)
I almost crashed out today. It was a hectic of a job today for me.. Basically, Today I wanted to work on Debugging tools in my original minecraft version. Though, this was hectic of a job, but now I am confident enough to say that, if anything goes wrong, my error codes will instantly trigger and stop those bugs to ever reach me, specially, If I messed up something. This is specifically made to guard rail myself (as I am a newbie in the GPU optimization and just breaks stuff way too often for comfort during my learning steps..) Now, you might be working what is so special that I did that I am being too optimistic (Specially if you know my history of crashouts LOL…) So, Basically, This time, I researched about an algorithm for dependencies.. Basically, what npm uses to keep track of all the dependencies.. You never know where knowledge might reach you LOL.. So, Basically, now each file, or system like Player, Physics, and to add, Chunks and More, will have to implement system, and each system would have a dependency tree, and then by using Kahn’s Algorithm, we can literally turn that tree upside down, and go through the data and make it work.. It literally tells you, which files are Missing in your code, that is just too good.. The only one critic is that, each time you need to be assing a new attribute, which might be tedious, but the profits are way too big to ignore at all..
I have connected my GPU now, and details are also loading nicely.. I will working on GPU Frames and all as well now.
I am crashing out a lot over some assets, because first of all, why is the grass block not green and a colormap, I mean, it does look cool.. BUT COME ON, THAT’S A MENTAL TRAUMA AND NOW WHICH COLOR OF GRASS SHOULD I PICK.. Furthermore, this is also a problem with water and all.. I am trying to find better ways, and actually learn about how Minecraft renders these and turns out, they just.. well.. OVERLAY A GREEN MAP or BLUE MAP over the grass.. I mean, that sounds HORRIBLE TO IMPLEMENT, MY GOD, THIS GAME SU…. IS FINE.. AND FUN.. Furthermore, thank you so so so much for all the reviewers out there.. The fact you guys appreciated my project, and said it is Fine to be using AI.. It just blew my heart.. This is the reason why I am currently working, else, I had already blew my mind with so much complex debugging, such that, I had to make my own engine, and debugger.. As with the latest you can see.. Things are tough but yah.. Also, I see you @skhsmrn on my devlog and another reviewer.. Your demands for 67 WILL BE FULFILLED SOON TM..
Been some time, and the amount of Logs that I am going through is just.. LMAO.. Crazy Crazy.. For my 67 fans, just give me like a few more moments.. Because, Now, I just want to render one block, and I will just add a sky, which will be a simple color gradient, and then I will work on whatever you that 67 thing.. This was really hectic to implement.. Literally had to go through and implement Archetype.. Yes, even I don’t know what they are… But after like learning about it, here is my understanding.. Archetype is basically a central place to keep all the components and all. Remember, we are optimizing the sheesh out of this project.. Archetypes allow us to apply the same gravity and same systems like Physics, collisions and so on, while still giving you customizabilty on if you want to enable it or not.. It’s really cool, but the amount of things I had to implement.. That’s some brutal stuff… Imagine, you forgot to plug the input system, and you are crashing out on, HOW TO FAH THE POSITION IS NOT CHANGING?? LOL, YAH 2 HOURS OF DEBUGGING WENT THERE, only to realise, I forgot to add that.. LOL..
LMAO, You know, you are at the pinnacle when you are going through forums and forums of actually big stuff, that very very few people ever talk about.. Literally..
Sorry, ANOTHER QUICK UPDATE I KNOW.. But trust me, this took me ages to implement, and yes, had to work from backwards, because and again found out, There was nothing being connected to the swapchain for some reason.. It’s actually really not that hard to find bugs when you are used to it, like when something isn’t rendering you know, something must be wrong with renderer and all.. and a quick side step, and you understand yah, swapchain being uninitialized is the key.
Added some simple tests for the ECS system and the topological sort Kahn’s Algorithm system and the Event Bus, so as to 100% confirm the workings of what is intended and what is not.. Also there was a problem with connection of gbuffers into swap chain, so had to make a custom pass called, composite pass, that will intercept and then gives us the necessary output. This might add very minute delay, but it is very unnoticable so don’t worry..
Procedural Generation unlocked, now, you can move as much as you want, and play. Current, block placing and all won’t work, but yah.. Frustum Culling is working as you can see with the culled meter.
67 Structure Implemented and running, and to those who recommended me this.. GUYS YOU REALLY NEED TO SEE A THERAPY OR SOMETHING.. LMAO..
I literally been sick for 2 days, and now that I come back, I somehow see worse.. Like, I wanted to implement meshing and all.. GUESS WHAT I DONE.. YES, MESHED THE ENTIRE WORLD TO DISAPPEAR.. BALLS… I AM GUAVA AND I WILL EAT MYSELF.. That’s enough coding for today as well, signing off..
Hi Everyone, My Devlogs have been lacking a bit, and this another quick devlog, because, I am really not feeling good these days. I am having fever and not feeling great about anything. Currently, I was just searching and asking AI about chunk generation. One of the things, where AI is now needed, because I know noise generation, but I don’t really know, how to make it into reality, and specially when people want realistic chunk generation and all.. I will get into good and start fixing first of all, this light problem, and then just hope, I get well soon, because India’s heat waves are really no joke. My Indian Friends.. Please stay safe and inside house.. IDK, Why even schools are open..
Ships:
Basically, What I have made is Minecraft Web, well Minecraft but on the Website, running on your Browser. Through the Power of Optimizations and knowing how to code, and also using AI for my shader building and debugging bugs like IDK, What I have done to my life. But Basically, I made my own Engine just to prove that You don’t always need THREE.js to do your heavy lifting, and honestly, it was not that hard. You can see the source code, just a few days ago, I refactored it. Hope you love and enjoy my project.
NOTE: Please Skip Voting, if it failed to run on your system please… Hi Friends, so, I have been working on Minecraft for a long time, and Virtually touching grass LOL.. AKA, Making Minecraft, it is quite challenging to say the least, you can check my devlogs.. Basically, I want to make a very very optimized version of minecraft, that you can see through far and far, and highly optimized. I want to add lighting and all, but the banner is a bit misleading.. I will continue to work on the project, but obviously, not Three.js, because What I have learnt is that.. You can use engines like Unity and Unreal, and make goated projects, the feel of making optimized content, and making it run even on a potato, is just on another level.. Seeing the entire generation moving towards fast making and prototyping, it is always a safe bet to try something new and interesting. This is one of the prototypes that taught me a lot, from How to deal with chunks, and manage chunks, to making biomes, which was actually new.. Chunks I have worked with AI before, and it helped me a ton, and I know about those, but not here.. Hope you love my project...
|
1792835375.0242522
|
1792921775.0242522
|
|
20759
|
ez-SDR by @lupc65779 | Stardance
|
lupc65779
|
1
|
163.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-17T15:44:56Z", "hours": 163.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built ez-SDR , an open source software defined radio application written entirely in Rust (one of the relatively few fully Rust-based SDR desktop applications). ez-SDR has three main tabs: Radio: A general-purpose radio receiver with AM, FM, SSB, CW, and other modulation modes, real-time spectrum and waterfall displays, and stereo FM with RDS support. ADS-B: An aircraft tracking system with an interactive map showing aircraft positions, altitudes, speeds, headings, and flight trails. It includes native decoders for both 1090 MHz ADS-B, used worldwide, and the freedom frequency (978 MHz) Meteor Decoding: A satellite image decoder capable of decoding imagery transmitted by the Russian Meteor-M2-3 and M2-4 weather satellites. It supports both live reception and decoding previously recorded radio signals (saved as CS8 or CF32 files), with image previews and PNG exports. (A moment of silence for the deprecated NOAA satellites) Another major feature is the architecture itself. I beheaded it. (The project.) The actual GUI is separated from the radio processing backend allowing it to run as a headless daemon. It exposes HTTP and WebSocket API’s, making it possible to interact with the backend without using the GUI. Getting everything working was… interesting. Building the decoding pipelines, integrating them into a responsive desktop interface (making it snappy and fast took several tens of hours), debugging signal processing issues, and literally running through cornfields with an antenna in my hand were some of the biggest challenges I ran into. The project went through several major redesigns, from the initial Rust implementation to separating the backend from the UI, briefly experimenting with Electron, and eventually returning to the native Rust interface. After over 160 hours of logged work , I’m excited to finally ship ez-SDR! The source code and Linux builds are available on GitHub, with a Windows build planned for the near future.", "repo": "https://github.com/Lupc9102/ez-sdr", "demo": "https://drive.google.com/file/d/1CAk3eGq8M2QFzbwPgKeuX1w_fwFsIhUG/view?usp=sharing"}]...
|
[{"post_id": 80362, "ts": "202 [{"post_id": 80362, "ts": "2026-10-17T12:36:53Z", "hours": 10.9075, "text": "Major reliability and release readiness improvements for EZ-SDR -stronger ADS-B/UAT decoding -safer settings, cleaner daemon and browser lifecycles -better audio and integrations - finally stable data paths -packaging fixes -removal of immense amounts of bloat PS heres an image of LRPT decoding in action"}, {"post_id": 78367, "ts": "2026-10-10T16:02:57Z", "hours": 10.4897, "text": "Getting ready to ship it so here I am trying to patch some final bugs in the Meteor Satellite Lrpt decoding pipeline"}, {"post_id": 77103, "ts": "2026-10-05T17:15:36Z", "hours": 15.5006, "text": "Going for a final round of fixes on the ads-b pipeline before marking it as finished 6.1 sol xhigh audited it and its not looking too good (holy f 11k words)"}, {"post_id": 74071, "ts": "2026-09-26T16:52:51Z", "hours": 8.1261, "text": "Rust UI is back, also ported a couple of features from sdr++, The screenshot contains an actual signal (unlike the mockups in past devblogs), more precisely a local music radio station received through ez-sdr with a rtl sdr v4 dongle"}, {"post_id": 72598, "ts": "2026-09-23T09:47:02Z", "hours": 13.9953, "text": "a TON of bug hunting and im going back to the old rust ui because it turns out the electron app wasnt my brightest idea"}, {"post_id": 57242, "ts": "2026-08-29T10:50:29Z", "hours": 9.9469, "text": "Couldnt patch the ads-b map view inside the rust gui app so i took a U turn with the porject and went all in for an Electron App as the gui for the ez-sdr daemon. mockup waterfall"}, {"post_id": 44519, "ts": "2026-08-10T10:22:10Z", "hours": 8.3333, "text": "Not much to be written, just some painful and slow progress with decoding meteor imagery."}, {"post_id": 28507, "ts": "2026-07-14T20:02:26Z", "hours": 6.0031, "text": "Should I even be happy? I finally tested ez-sdr’s satellite decoding with a real recording I took yesterday on an Meteor M2-4 88* pass, and it’s… not great, especially compared to SatDump’s decode. (Ez-sdr is the first image, SatDump is the second image.) What troubles me the most is that I literally stole SatDump’s homework equation by equation and rewrote it in Rust, and it still looks like shite lol. Its for sure progress and im happy with that lol"}, {"post_id": 27542, "ts": "2026-07-13T06:10:40Z", "hours": 9.3789, "text": "Considering that the last two LRPT satellites that still transmit are Meteor m2-3 and Meteor m2-4 i did efforts to make decoding them as fast as possible , especially cf32, cs16 and cs8 decoding. Now i didnt really get to test the upgrades.. because i didnt get to FINISH the upgrades but i DID finish the web ui remote from the last devlog. (I am posting this devlog WITHOUT a finished feature because im getting close to the 10 hour cap) Also ive went outside, touched grass and snatched a good cs32 from meteor m2-4 so i actually have what to test the decoding on."}, {"post_id": 25907, "ts": "2026-07-10T12:18:29Z", "hours": 10.7172, "text": "I cut its head off. Fully decoupled Ez-sdr from Ez-gui (the Rust UI), effectively turning Ez-sdr into a headless project. This allows Ez-sdr to be coupled to multiple channels: The original Rust UI WebUI (Almost done, in development) Discord (in development) This decoupling also exposes an API, allowing you to integrate and use Ez-sdr functionalities on the go within your own applications and projects."}, {"post_id": 25177, "ts": "2026-07-09T07:11:47Z", "hours": 28.3117, "text": "Yet another from-scratch redesign because lately most of the app started feeling bloated and hard to use for beginners (which defeats the entire purpose of ez -sdr, which is meant to be easy . Therefore i moved most of the unnecessary stuff in advanced and other tabs. Also patched a lot of bugs."}, {"post_id": 20817, "ts": "2026-07-02T15:02:41Z", "hours": 25.5669, "text": "Full UI redesign + a ton of new features: The ADSB tab now includes a map, plane labels, and a 3D view mode. Added a Discord gateway that sends notifications and images of detected planes, satellite passes, and more. Overhauled the AI Assistant tab. Added a reasoning effort dropdown to the AI assistant. Granted the AI the ability to perform web searches. Added well-documented checklists and tutorials for beginners setting up their SDR kits, including an antenna angle and length calculator, recommended environments, cabling tips, and driver recommendations. Added UI presets: users can select their experience level on the first boot, and the app automatically customizes the interface accordingly (beginners rely more on the AI assistant and auto-tuning, while experts manage everything manually with optional AI assistance). Added premade themes and in depth ui customization."}, {"post_id": 17812, "ts": "2026-06-28T19:00:19Z", "hours": 5.7533, "text": "I know how hard is it to get started with software defined radios. I went through the hassle of being a complete beginner and having to deal with sketchy blogs and UIs of apps older than most of us participating in this hackaton, and so I tried to build an all-in-one SDR app with most of the cool things you can get from the average RTL-SDR kit: plane tracking, listening to ATC and some other cool frequencies, satellite signal capturing, decoding and tracking, and many more in one unified app interface. I originally intended to do ALL this in Python, but it was way too slow and crashed during DSP, so I had to rewrite it fully in Rust. Problem is that I don’t really know Rust (and basically anything lower level than Python) so props on kimi k2.6 who handled the whole rewrite flawlessly. There’s still many things to improve on this, and, more importantly.. a ton of testing and trial and error"}]...
|
Title: ez-SDR by @lupc65779 | Stardance
Devlogs:
Title: ez-SDR by @lupc65779 | Stardance
Devlogs:
I know how hard is it to get started with software defined radios. I went through the hassle of being a complete beginner and having to deal with sketchy blogs and UIs of apps older than most of us participating in this hackaton, and so I tried to build an all-in-one SDR app with most of the cool things you can get from the average RTL-SDR kit: plane tracking, listening to ATC and some other cool frequencies, satellite signal capturing, decoding and tracking, and many more in one unified app interface. I originally intended to do ALL this in Python, but it was way too slow and crashed during DSP, so I had to rewrite it fully in Rust. Problem is that I don’t really know Rust (and basically anything lower level than Python) so props on kimi k2.6 who handled the whole rewrite flawlessly. There’s still many things to improve on this, and, more importantly.. a ton of testing and trial and error
Full UI redesign + a ton of new features: The ADSB tab now includes a map, plane labels, and a 3D view mode. Added a Discord gateway that sends notifications and images of detected planes, satellite passes, and more. Overhauled the AI Assistant tab. Added a reasoning effort dropdown to the AI assistant. Granted the AI the ability to perform web searches. Added well-documented checklists and tutorials for beginners setting up their SDR kits, including an antenna angle and length calculator, recommended environments, cabling tips, and driver recommendations. Added UI presets: users can select their experience level on the first boot, and the app automatically customizes the interface accordingly (beginners rely more on the AI assistant and auto-tuning, while experts manage everything manually with optional AI assistance). Added premade themes and in depth ui customization.
Yet another from-scratch redesign because lately most of the app started feeling bloated and hard to use for beginners (which defeats the entire purpose of ez -sdr, which is meant to be easy . Therefore i moved most of the unnecessary stuff in advanced and other tabs. Also patched a lot of bugs.
I cut its head off. Fully decoupled Ez-sdr from Ez-gui (the Rust UI), effectively turning Ez-sdr into a headless project. This allows Ez-sdr to be coupled to multiple channels: The original Rust UI WebUI (Almost done, in development) Discord (in development) This decoupling also exposes an API, allowing you to integrate and use Ez-sdr functionalities on the go within your own applications and projects.
Considering that the last two LRPT satellites that still transmit are Meteor m2-3 and Meteor m2-4 i did efforts to make decoding them as fast as possible , especially cf32, cs16 and cs8 decoding. Now i didnt really get to test the upgrades.. because i didnt get to FINISH the upgrades but i DID finish the web ui remote from the last devlog. (I am posting this devlog WITHOUT a finished feature because im getting close to the 10 hour cap) Also ive went outside, touched grass and snatched a good cs32 from meteor m2-4 so i actually have what to test the decoding on.
Should I even be happy? I finally tested ez-sdr’s satellite decoding with a real recording I took yesterday on an Meteor M2-4 88* pass, and it’s… not great, especially compared to SatDump’s decode. (Ez-sdr is the first image, SatDump is the second image.) What troubles me the most is that I literally stole SatDump’s homework equation by equation and rewrote it in Rust, and it still looks like shite lol. Its for sure progress and im happy with that lol
Not much to be written, just some painful and slow progress with decoding meteor imagery.
Couldnt patch the ads-b map view inside the rust gui app so i took a U turn with the porject and went all in for an Electron App as the gui for the ez-sdr daemon. mockup waterfall
a TON of bug hunting and im going back to the old rust ui because it turns out the electron app wasnt my brightest idea
Rust UI is back, also ported a couple of features from sdr++, The screenshot contains an actual signal (unlike the mockups in past devblogs), more precisely a local music radio station received through ez-sdr with a rtl sdr v4 dongle
Going for a final round of fixes on the ads-b pipeline before marking it as finished 6.1 sol xhigh audited it and its not looking too good (holy f 11k words)
Getting ready to ship it so here I am trying to patch some final bugs in the Meteor Satellite Lrpt decoding pipeline
Major reliability and release readiness improvements for EZ-SDR -stronger ADS-B/UAT decoding -safer settings, cleaner daemon and browser lifecycles -better audio and integrations - finally stable data paths -packaging fixes -removal of immense amounts of bloat PS heres an image of LRPT decoding in action
Ships:
I built ez-SDR , an open source software defined radio application written entirely in Rust (one of the relatively few fully Rust-based SDR desktop applications). ez-SDR has three main tabs: Radio: A general-purpose radio receiver with AM, FM, SSB, CW, and other modulation modes, real-time spectrum and waterfall displays, and stereo FM with RDS support. ADS-B: An aircraft tracking system with an interactive map showing aircraft positions, altitudes, speeds, headings, and flight trails. It includes native decoders for both 1090 MHz ADS-B, used worldwide, and the freedom frequency (978 MHz) Meteor Decoding: A satellite image decoder capable of decoding imagery transmitted by the Russian Meteor-M2-3 and M2-4 weather satellites. It supports both live reception and decoding previously recorded radio signals (saved as CS8 or CF32 files), with image previews and PNG exports. (A moment of silence for the deprecated NOAA satellites) Another major feature is the architecture itself. I beheaded it. (The project.) The actual GUI is separated from the radio processing backend allowing it to run as a headless daemon. It exposes HTTP and WebSocket API’s, making it possible to interact with the backend without using the GUI. Getting everything working was… interesting. Building the decoding pipelines, integrating them into a responsive desktop interface (making it snappy and fast took several tens of hours), debugging signal processing issues, and literally running through cornfields with an antenna in my hand were some of the biggest challenges I ran into. The project went through several major redesigns, from the initial Rust implementation to separating the backend from the UI, briefly experimenting with Electron, and eventually returning to the native Rust interface. After over 160 hours of logged work , I’m excited to finally ship ez-SDR! The source code and Linux builds are available on GitHub, with a Windows build planned for the near future....
|
1792655342.8871033
|
1792741742.8871033
|
|
46447
|
My own site! by @spearedrice | Stardance
|
spearedrice
|
0
|
163.4
|
0
|
[]
|
[{"post_id": 81376, "ts": "202 [{"post_id": 81376, "ts": "2026-10-21T01:50:11Z", "hours": 0.3669, "text": "we all love larpin!!"}, {"post_id": 81365, "ts": "2026-10-21T00:13:33Z", "hours": 8.1392, "text": "more poses ig"}, {"post_id": 81231, "ts": "2026-10-20T11:42:14Z", "hours": 18.3669, "text": "added window snapping for realism (accidentally spent 18 hrs on this because I screwed up the code)"}, {"post_id": 80282, "ts": "2026-10-17T03:01:36Z", "hours": 10.0369, "text": "added the konami code so now lots of stuff happens"}, {"post_id": 80056, "ts": "2026-10-16T02:48:40Z", "hours": 15.3181, "text": "adding a INSANE feature"}, {"post_id": 79517, "ts": "2026-10-14T12:36:15Z", "hours": 10.6333, "text": "progress (adding screensaver, unfinished so here is some blurry code)"}, {"post_id": 78938, "ts": "2026-10-12T03:06:08Z", "hours": 10.0128, "text": "adding a button that finally mutes the music"}, {"post_id": 78726, "ts": "2026-10-11T12:33:55Z", "hours": 11.0222, "text": "almost done, 2 features left"}, {"post_id": 78482, "ts": "2026-10-10T22:27:34Z", "hours": 10.0333, "text": "amazing things (unfinished)"}, {"post_id": 78316, "ts": "2026-10-10T12:13:10Z", "hours": 11.795, "text": "uhh unfinished right now but great things coming 😭"}, {"post_id": 78205, "ts": "2026-10-09T23:36:45Z", "hours": 56.6311, "text": "spent 50 hours on THIS"}, {"post_id": 57011, "ts": "2026-08-29T02:36:13Z", "hours": 0.6814, "text": "Adding windows to my site, also added GTA 6"}, {"post_id": 54873, "ts": "2026-08-26T02:26:45Z", "hours": 0.3675, "text": "I made my own site (for the 2nd time) and added some pretty cool styling."}]...
|
Title: My own site! by @spearedrice | Stardance
D Title: My own site! by @spearedrice | Stardance
Devlogs:
I made my own site (for the 2nd time) and added some pretty cool styling.
Adding windows to my site, also added GTA 6
spent 50 hours on THIS
uhh unfinished right now but great things coming 😭
amazing things (unfinished)
almost done, 2 features left
adding a button that finally mutes the music
progress (adding screensaver, unfinished so here is some blurry code)
adding a INSANE feature
added the konami code so now lots of stuff happens
added window snapping for realism (accidentally spent 18 hrs on this because I screwed up the code)
more poses ig
we all love larpin!!...
|
1792662908.7921853
|
1793267708.7921853
|
|
5003
|
Browse++ by @kallenseelo | Stardance
|
kallenseelo
|
1
|
165.0
|
3160
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-29T03:43:00Z", "hours": 165.0, "multiplier": 19.1, "payout": 3160, "blessing": "neutral", "text": "Browse++ A C++ Browser Engine from Scratch. Overview: Over the course of 2 months and almost 300 hours (165 coding) of work, I built a browser engine that can download, parse, and render websites with tab handling and a lot of other cool features, from almost complete scratch! What’s a Browser Engine? A basic definition of a browser engine is a program that pulls content from a website, then takes that content, gives the elements the properties assigned in the CSS, and then renders the content on the screen. They end up being very difficult to build, as HTML and CSS can run and be run without errors, so that makes it super hard to build an engine that can properly handle, parse, and render a site with a lot of errors. How to use this? If you would like to use my browser engine, there is quite a few ways to do so! NOTE: I do not have an actual Linux laptop, so the Linux version is super buggy (and does not have any networking), but I really hope to fix that in the future, but you can use the more outdated web demo! If you don’t want to download anything, you can use the Web Demo , its a bit behind, but it shows it nicely. If you are willing to download, and you are on windows , you can go to the github here and download to try it! If you want to see the real thing, I have a video going through it here. What am I most proud of? I think the thing I’m most proud of was the amount of browser systems i was able to build from scratch , this was a super fun thing to build, but it had a lot of challenges and ups and down, and a lot of hours fixing bugs that make no sense at all lol! The other thing I’m most proud of is not using any AI on the main engine; there was a bit of AI used for the web demo, as that wasn’t my main focus, but the browser engine overall used absolutely no AI! AI usage GLM 5.2 was used to convert the Windows code to a web server for Linux (way before I supported Linux). Any code changes are clearly marked with ( // CHANGED WITH AI: ... ) if they have been changed with AI, and very little has been changed.", "repo": "https://github.com/k754a/C-Plus-Plus-Web-Engine", "demo": "https://k754a.hackclub.app/"}]...
|
[{"post_id": 56948, "ts": "202 [{"post_id": 56948, "ts": "2026-08-28T23:53:05Z", "hours": 4.8833, "text": "Final work on the readme, getting a standalone windows build! Over the last few days, I’ve been hard at work getting the readme finished up, it was super tedious but now its in a good spot for a ship, and looks awesome! I’ve also gotten the windows build to be standalone! this took a lot of googling, but now with CMake, it now can run on anyone’s computer, without needing anything else!! Other than that, its been a bit of work on the Linux side, i attempted to get some sort of https working, but because its a vm, its super screwy, and i hope to be able to have a computer that has Linux on it for use, but we will see ig. Also made a YT vid https://www.youtube.com/watch?v=I-mCh9xSYeg&t=8s Overall a good day!"}, {"post_id": 54642, "ts": "2026-08-25T17:49:57Z", "hours": 4.9522, "text": "Linux support!!! Over the last few days, I’ve been working on migrating the project from MSBuild to CMake, allowing it to run on both Linux and macOS (though I haven’t been able to test it lol). Linux has been tested, however, and everything works on it (except I haven’t migrated the networking, so that’s still to do!!), so there are still some things that need to be done, but it boots on my Debian VM and renders! So I’m super happy for that. Some other changes were that I got autocompletion (you’ll see it in a sec) as well as getting the open in a new tab working a bit better for both Windows and Linux!! Overall a good day!"}, {"post_id": 52150, "ts": "2026-08-22T07:40:12Z", "hours": 6.0289, "text": "Updated context menu, Desktop Logo, Hover effects, Rework of the input bar, and bug fixes! Ok, its like 1:30 am rn lol, so im going to try to do this fast. First, i updated the context menu, the menu now has a nice drop shadow, and looks so much nicer than before (lemme know what you think about it). second, i added a basic desktop logo (a grayish black circle) that changes based on light or dark mode (the vid shows it well). Another change was hover effects! now hovering over buttons changes the color slighly, making it a bit simpler to see that your over something, and aswell as being a bit more reactive! the input bar rework allows clicking onto the bar, rather than always typing on the bar (for ctr-F coming soon!). Finally, bug fixes, i had a lot of issues with having both custom x pos, and custom y pos, but thats all fixed now! aswell as the backgrounds not updating per tab (thats now fixed too!). Finally II, i worked on the readme a bit! Overall it was a good day (with over 10 hours of work lol), and i still have a few features to add! so yeah, thanks for reading! (as well as excuse the spelling mistakes, there might be a lot lol)"}, {"post_id": 51922, "ts": "2026-08-21T20:50:43Z", "hours": 6.1733, "text": "More HTML style options, browser history, and work on the Readme.md Ok, so over the last 6 hours this is what I worked on. First, I worked on adding more style options, so now you can set font size (another way) and set font boldness (like normal HTML), and you can now add custom number values to the vertical alignment (that in the vid is shown on the homepage!). I also worked on the browser history now, saving it to a txt file. You can scroll back through what you’ve searched before (and add a button to clear it next update).I also was working on the readme, making it clear and better before the ship. Overall a good day, and I think I’ll try to do the settings menu, aswell as support for buttons in the viewer (though they probably won’t do anything thanks to not having JavaScript), so yeah!"}, {"post_id": 51394, "ts": "2026-08-21T02:14:27Z", "hours": 5.9358, "text": "More text formatting and positioning. (and LOTS of bug fixing) Today was a great day of work; I got height adjusting working, and this took way longer than I thought, just with all the bugs and problems I ran into, with old code I had created, but I was able to solve it all. The other notable thing is having another way to color text and the bg of text, but also, I fixed it so that none of the text falls off the edge in the positioning, so overall a good day! I’m actually so close to being done; I’ve wanted to go to 200 hours, then kind of just chill and slow down, and I’m at 14 hours left of that! Then I’ll ship. But I do want to finish the history menu, though I may leave the settings menu on pause. (for now). So yeah!"}, {"post_id": 50790, "ts": "2026-08-20T05:38:54Z", "hours": 5.1342, "text": "HTML text-align handling, history tab, and settings. Ok, I’m going to be honest, I looked at that settings menu and genuinely did NOTHING. It’s going to be a pain, so I’m just avoiding it till I have no choice. Something HUGE, though, I’ve gotten working is getting proper styling so that text can render in the middle and right (with way more text-align and style options to come)! This really opens the door for much more dynamic rendering text, though there are still a few bugs with it (large text goes off screen, and the home screen doesn’t apply the settings), so there is still a lot to fix, but honestly, I didn’t even think it was possible, so this is awesome! Overall a good day; I’m going to continue working on history and styles and then the settings lol."}, {"post_id": 49986, "ts": "2026-08-19T00:38:26Z", "hours": 6.455, "text": "Add context menu and startup URL (and fixed a LOT of bugs)! Sorry it’s been like 2 weeks, but after finishing my other project, I’m back at it! Over the last 2 days, I worked a LOT on the context menu and bug fixes (like loading text files into the engine, and old ones I caught working on this!). The context menu changes its options based on what things you right-click (like a real context menu), so for example, when I click a link, I get way more different options than if I clicked a tab. This allows for a lot of customization, and it’s basically fully implemented (minus a few features I want to add). The startup URL is kind of a part of that; when clicking a link, you have the choice to open it in a new window, and getting a URL that can change on startup really made it easy to add the feature! So overall a good day. What I’m going to work on next is the settings menu. Thanks for reading!"}, {"post_id": 41749, "ts": "2026-08-06T04:16:16Z", "hours": 5.6256, "text": "Settings button, bug fixes, scroll bar drag, and a context menu! This update was just a crazy number of features! I ended up shifting around the top area to make room for a settings button (that I will deal with soon), then I decided to allow scroll bar drag so that you can scroll through a page with the bar, not just your wheel! The big thing was the context menu; this took the most time and was the most difficult, as it was just a pain to get 2 windows rendering, but now, it works super well! I also attempted to work on getting a better layout, but I just screwed a lot of stuff up lol, so that didn’t really work out, but that’s ok!"}, {"post_id": 39793, "ts": "2026-08-03T00:24:38Z", "hours": 3.6864, "text": "Done all comments and released 0.1.0 ! If you want to check out or support this project, you can click the GitHub link! https://github.com/k754a/C-Plus-Plus-Web-Engine I ended up going on a camping trip with the homies, so I didn’t work on this for a bit, but when I came back, I fixed a few more bugs, ended up finishing all the comments for GUI.cpp, and created release 0.1. 0! This is huge, as I was able to fix all known bugs and get a working version out! For version 1.0.0, I want to fully fix the layout engine to render close to a modern browser, add a settings page, fix performance, and add things like buttons and checkboxes on websites! Thanks for reading!"}, {"post_id": 35496, "ts": "2026-07-26T23:35:45Z", "hours": 3.4192, "text": "Quality of life improvements, more comments, and finally fixed the crashes If you want to check out or support this project, you can click the GitHub link! https://github.com/k754a/C-Plus-Plus-Web-Engine Ok, so first off, the huge crash I was getting was because of using a global variable for holding the link and not a local variable, and when 2 threads attempted to use it at the same time, my app would freeze and crash, so now it runs great! Some of the QofL improvements are adding keyboard shortcuts and the ability to close tabs by pressing the middle button down, like a real browser! Then there were a lot more comments that I am so close to being done! Overall a decent 2 days; I’m definitely getting a bit bored of the comments, so my plan is to work on my other project for a bit and come back later! But yeah, a good day. :)"}, {"post_id": 33882, "ts": "2026-07-24T04:53:53Z", "hours": 6.0147, "text": "Local file loading, better comments, and crash fixing! If you want to check out or support this project, you can click the GitHub link! https://github.com/k754a/C-Plus-Plus-Web-Engine Today, I worked a TON; I got through all the comments for the start and collision events for all the buttons and things in GUIRENDER . I also added some new features and fixed some huge bugs! The new feature is file loading! You can now load PNG, JPEG, HTML, TXT, and HTM files straight from the search bar! The main fix, and what took most of my time, was the prerender. as i was working on slimming the new tab create button down, i found a lot of strange bugs, esspicaly with webpages with large amounts of images (like stardance), this lead me down a lot of changes, overall, it was a issue with how i checked to see if i wanted to load it from disk, but it was also a bunch of stuff to do with multithreading, and locking parts, but after a lot of work, i fixed it! I still need to fix up and finish GUIRENDER , but once I’m done with that, it’s off to work on the settings page. Thanks for reading!"}, {"post_id": 33247, "ts": "2026-07-23T00:15:09Z", "hours": 5.6319, "text": "Halfway done rewriting Gui.cpp—Lots of bug fixes and speed improvements! If you want to check out or support this project, you can click the GitHub link! https://github.com/k754a/C-Plus-Plus-Web-Engine Over the last 2 days, I’ve rewritten about half of GUI.cpp (up to the GUIRENDER function), with changes, bug fixes, and speedups that helped the engine a lot! The main speedup came from changing the way I handled the font so that I loaded it once, not every loop. This allowed a lot less SSD usage and a gradual increase of performance, up to about 50% for large sites! I worked a lot on organization and got it so that different functions are grouped together, even moving some to different scripts that fit better! The final change was reworking how images and the home button worked, and it allowed me to drop a function, as well as have much faster image batch loading times! Going through the code made me realize how many bugs and bad code I did. I fixed a lot of it, but I still got a bit to go! Overall it was a good day. My plan for everything else is to finish the rest of GUI.cpp, start work on a settings page, and try to make the parser faster still! Thanks for reading!"}, {"post_id": 32062, "ts": "2026-07-20T23:17:12Z", "hours": 3.9422, "text": "Lots of bug fixes, quality-of-life changes, and the start of a rewrite! try it out! https://k754a.hackclub.app/ I’ve been still a bit busy, but over the last 2 days, I ended up fixing a lot of bugs with crashing, especially with dealing with multithreaded tab handling. Some of the quality-of-life changes I did were creating a new tab handle that allows you to go back to the new tab in history and other small changes! The biggest bug was where, if you searched something and, while it was loading, switched tabs, it would overwrite your tab to the one you switched to, not the original one you searched in. Now that is fully fixed! Overall a good day! I’m going to fully rewrite and comment all 2500+ lines of the GUI and other functions, fix a LOT of bugs, and then add settings, history, and a few other things! Thanks for reading!"}, {"post_id": 29965, "ts": "2026-07-17T05:38:51Z", "hours": 4.44, "text": "Dark mode and bug fixes (with more bugs) and HTTP error codes Today, I recorded most of my link and search handling to be better at handling URLs and links like /home. I also added a dark mode! (Super helpful on the eyes lol) Unfortunately there is a big bug, some websites will just not work anymore (like hackclub), and also websites take super long to load, this is because the images it is processing are in a buffer, and this buffer needs to finish the images of one page before the other, i think i have an idea to fix it, so I hope I will be able too soon! But overall, this update changed a lot of bugs, and I’m hoping it can be even better for the future!"}, {"post_id": 28606, "ts": "2026-07-14T23:12:44Z", "hours": 6.4553, "text": "Lots of optimization, better comments, and bug fixes! Sorry for not posting for a few days; I was super busy and didn’t really have the time. However, I’m back at it! Over the last week, I’ve been changing and updating lots of stuff. The first one was much better comments for the layout.cpp file! I still have a bit left to do, but I was getting pretty tired, so I moved onto making the engine a bit faster! One of the main things I did was use threading, passing the text off to the GPU rather than going from CPU to GPU, as well as multithreading it. This allows about 2 seconds faster search time, and I have some more ideas for changes too! The reason this took so long is the number of bugs I introduced. The Gui.cpp is huge (2000+ lines), so I want to really rewrite it, as there is SO much junk and bad coding practices lol. Overall though, it was a good day, and I think I want to start tackling JavaScript after adding a lot of QofL and fixes to a ton of bugs! Thanks for reading!"}, {"post_id": 23282, "ts": "2026-07-06T04:43:49Z", "hours": 3.3869, "text": "Performance analyzer and comments for our DOM! Today, I created a performance analyzer that could tell me how many microseconds it takes to get through certain programs. This helped a lot with optimization and making things faster! I also finished and optimized the DOM code! Today was a pretty basic day; I’m a bit busy over this coming week, so it’s going to be a bit more broken up, but overall a good day today!"}, {"post_id": 22558, "ts": "2026-07-05T02:28:53Z", "hours": 4.8858, "text": "Performance increases, and a rewrite of the parser! Today was a nice easy day; I rewrote most of the parser, fixing a lot of bugs, and also learned how to use the performance analyzer in C++! The code is much more documented, with every line describing what it’s doing, making it super easy to follow along! The main change was an increase in speed from about 5% CPU usage to 1% and a 50MB reduction in RAM usage, allowing for 10 tabs at once, with only 61MB overall, rather than the 1000MB of something like Chrome! as well as about a 6% faster parse and load time. There is still a lot to optimize and work on, so I’ll keep doing that!"}, {"post_id": 21750, "ts": "2026-07-03T20:49:12Z", "hours": 5.1881, "text": "The first part is rewritten! Today, I worked on rewriting my network code with better comments, names, and methods. This took a while, as I created so many bugs, but it does work! The long part is still yet to come; however, the main things like the parser and the GUI are going to be a headache, but I should get it done! Overall a good day; ~4 files have been changed, with 6 more to go! Then after this, i want to add a history button, a settings page, and just improve performance, and formatting, then I’m done!"}, {"post_id": 21182, "ts": "2026-07-03T00:10:54Z", "hours": 3.2625, "text": "Updated the web version to the latest! Ok, so the main thing i did today was update the web version, and got it to match the main version overall, with everything! I also tried to get better formatting on the text, but i think my code is just so muddled its gonna be impossible, so my plan is to start rewriting it, with the things I’ve learned, and updating the comments (as i have a lot of them, in many wrong spaces)! that should take a bit, but hopefully will pay off in the future! If you want to try the new version, its here: https://k754a.hackclub.app/"}, {"post_id": 20502, "ts": "2026-07-02T03:18:13Z", "hours": 4.0853, "text": "Scroll bar support, bookmarks, and printing sites! Today I got a lot done; the main things were getting scrollbars, bookmarks, and getting sites to print all working! I ended up running into a lot of bugs (especially with the scroll bar), but now it works, so yeah! Currently the browser portion is far behind, and I want to update it, so I’ll try doing that next! Overall today was a good day; I got a lot done and a lot working! Anyways, thanks for reading! Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ "}, {"post_id": 20310, "ts": "2026-07-01T21:33:17Z", "hours": 3.6294, "text": "New icons and more buttons! Today, I was able to get icons supported into the engine (kind of)! The way I did it was by using a font modifier. I loaded the font I’ve been using and created some custom icons! A lot of the challenge was fixing text, as the new icons had issues with scaling and position, especially the back and forth arrows! Overall it was a great day. I’ll work on getting the printer button and the star button working; then it’s on to improving the engine! (also added a home button!)"}, {"post_id": 19574, "ts": "2026-06-30T22:14:59Z", "hours": 3.1631, "text": "Got Flex and Absolute boxes working on the engine! This took a while, just with fixing all the bugs and the weird reasons why some things would just not work at all lol! It was definitely a learning process for sure, and it should be easier to add more support for everything else in the future! This has to be one of the most difficult projects I’ve ever worked on, but it’s coming along! I want to do something a bit more fun, so my plan is to start work on a UI overall, just to give myself a break from all the crazy stuff! Anyways, thanks for reading! (oh, websites look so much nicer, with the new stuff!)"}, {"post_id": 19420, "ts": "2026-06-30T18:56:13Z", "hours": 4.5111, "text": "Rebuild of the layout engine! Today, I rebuilt a bunch of the layout engine to start support for flexboxes and divs! I mainly switched the code to do 2 passes, first to figure out spacing, size, and position, then to place the elements on it! Overall, this was a kind of boring day; it works basically the exact same rn, so there’s really nothing to show, but I’ll send a screenshot or two of my code! Anyways, the plan next is to get flexboxes working! After that, I might rewrite my engine, as it’s getting a bit ugly and crowded, and I coded some stuff pretty badly the first time around; it probably would only take about 10 hours, working off my code, but I think it would save me time in the future, but I’ll see! Anyways, thanks for reading! Also, if you want to support the project, dropping a star on the GitHub would be awesome; no pressure, though. :) https://github.com/k754a/C-Plus-Plus-Web-Engine"}, {"post_id": 19020, "ts": "2026-06-30T05:52:42Z", "hours": 3.1311, "text": "Lots of bug fixing on the engine! & Making it to the news letter! First of all, I want to thank everyone who has liked, reposted, and checked out my project. I made it to the Stardance newsletter, and it was so awesome :). Thank you so much! Today, I fixed a crazy amount of bugs; the main one was I would have these empty boxes, and it took me a good hour and a half to figure it out, but now text renders so much nicer! The next bug I fixed was clicking links. Up until this point, clicking links did not work at ALL, so now they work! (super happy about that)! History now works for each tab, not just one pool! I’m also starting work on making a YT video for this project. I’ve never made one before, so we will see how it turns out. For tomorrow, I’m going to work on the formatting of the engine, as normal websites have text like how Stardance has the home, notifications, rate, missions, etc, on the side and the main text in the middle, so I’ll hopefully get that working! Anyways, thanks for reading! You can check out my project below. :) Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ "}, {"post_id": 16595, "ts": "2026-06-27T00:22:18Z", "hours": 5.3503, "text": "Images Working for the Browser Engine! I’m going to be honest with you, this has to be the top 10 worst things I’ve ever coded. 😭😭 But images now can load; there are a few bugs, most images don’t load, and the ones that do load in pairs of 2 have weird bounding boxes. However, they do work, and that’s what I’m happy about! I’m going to do a quick side project, just to have a bit of room so I don’t overdo it, but overall it was good. Next I’ll just fix the bugs and start getting like the formatting of texts to start matching websites! The vid below shows them in action."}, {"post_id": 16093, "ts": "2026-06-26T05:07:23Z", "hours": 3.3942, "text": "Rebuilt part of the browser engine to handle tabs! Today, I worked on getting tabs working! It wasn’t as bad as I thought; the worst part was making all the UI elements and handling the inputs for them! I also found a bug; the engine easily uses my entire CPU’s dedicated GPU and causes issues with other apps lol, but I’ll fix it in a bit! Overall it was just bug fixes, quality-of-life improvements, and tabs! Hopefully tomorrow I’ll do images, then I’m taking a break for a bit and doing something else because I’m burnt out, and that’s a tip for all of you too: don’t overwork yourselves! The vid below shows it in action. Thanks for reading! Also, if you want to support the project, dropping a star on the GitHub would be awesome; no pressure, though. :) https://github.com/k754a/C-Plus-Plus-Web-Engine"}, {"post_id": 15935, "ts": "2026-06-25T21:47:30Z", "hours": 3.0242, "text": "Back and forth arrows, reloading, better formatting, and searching on the browser! Today was huge; I was able to get better formatting for text, search for things, and get buttons like back and forth and reloading working! My next task to tackle is images! The vid below shows all of the changes in action! Thanks for reading!"}, {"post_id": 15459, "ts": "2026-06-25T04:13:52Z", "hours": 2.7303, "text": "Links, and better rendering! Today I got links, and rendering improved rendering! Words now render together, rather than making a new line each time. I also got links, and that allows you to browse something like Wikipedia (the video below) much easier! For next time, I’m going to get the back and forward arrow and reload a working website! And may start work on getting the browser to have divs! Thanks for reading!"}, {"post_id": 15204, "ts": "2026-06-24T18:29:06Z", "hours": 2.1114, "text": "Today, I got a bunch of colors working! The browser engine can now render different colored backgrounds, texts, and highlights! This actually wasn’t too bad, as the hardest part was just fixing all the bugs from CSS being such a bad language, but overall it turned out awesome!"}, {"post_id": 14842, "ts": "2026-06-24T03:19:32Z", "hours": 2.5572, "text": "Version 0.1.0 of the Browser Engine! If you don’t know what I’m building, I’m creating a custom browser engine in C++ from scratch, something like Chromium, but a lot more bare bones. Today, I did a bunch of things. I got my first CSS attributes to detect and work! Text now is not hardcoded and dynamically scales based on the CSS! This really wasn’t too hard, so I moved on to the next thing, getting a working UI! The UI I’ve created is basic, but it allows you to search without using the terminal and search multiple things! Overall this was an awesome day for today; my plan over the coming days is to support more CSS and work on fixing performance and overflow bugs! Thanks for reading. :) Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ The video shows the standalone app, and searching 2 different sites."}, {"post_id": 14688, "ts": "2026-06-23T21:39:00Z", "hours": 3.2131, "text": "CSS Parsing! I got CSS working! I was able to get my CSS parser working on the engine and parse properly. This wasn’t as easy as I thought, as my first attempt worked but was dreadfully slow (10+ seconds), so a lot of the time went into rewrites and optimizations, bringing it from 10+ to about 2 seconds for huge CSS (1000+ lines of CSS)! Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ Video below shows it loading the hackclub website!"}, {"post_id": 13373, "ts": "2026-06-21T22:06:37Z", "hours": 2.1894, "text": "The browser now has a GUI! This took a bit and a few tutorials, but now you’re able to browse the web with no styles, one font, and just things like headers, but for now this is super awesome! I’ve been going pretty hard at it the last few days, and I lowkey need a break, or else I’m gonna get super burnt out, so I might just start a side project for the fun of it, something easy when I’m feeling a bit sluggish. When I come back, I’ll work on adding a UI around the browser (to get fully away from the terminal), and then it’s just getting CSS parsed and working, which isn’t too bad at all. You can check out the code and try the project below. C++ Browser Engine You can try it online! : https://k754a.hackclub.app/ Source code: https://github.com/k754a/C-Plus-Plus-Web-Engine"}, {"post_id": 12960, "ts": "2026-06-21T06:40:22Z", "hours": 1.6656, "text": "C++ Browser Engine You can try it online! : https://k754a.hackclub.app/ Source code: https://github.com/k754a/C-Plus-Plus-Web-Engine Got started work on the GUI using SDL3! Today, I worked on getting a GUI up and running; for now it’s just a window, but I’ll get it working! I also started work on a logo, as I felt a bit burnt out during today, but nothing really came of it, as all my designs I tried sucked; the best one I linked below. I also created the first readme!"}, {"post_id": 12643, "ts": "2026-06-20T17:28:53Z", "hours": 0.7358, "text": "This is a super short devlog, I updated the server so that it uses my latest code, and supports HTTPS! you can try it out with the link below. https://k754a.hackclub.app/"}, {"post_id": 12395, "ts": "2026-06-20T07:09:43Z", "hours": 2.2253, "text": "C++ Browser Engine You can try it online! : https://k754a.hackclub.app/ Source code: https://github.com/k754a/C-Plus-Plus-Web-Engine Got the DOM tree working! Ok, in this devlog, I fixed the DOM tree issues; it seemed to be a combo of issues with the parser (I fixed that) and some actually easy fixes from the DOM tree; it just took a rewrite! I was also able to code a way to see the tree: DOM TREE ├── [ROOT] │ ├── [!DOCTYPE] │ │ ├── [html] │ │ │ ├── [body] │ │ │ │ ├── [h1] │ │ │ │ │ └──── \" Heading test \" │ │ │ │ ├── [p] │ │ │ │ │ └──── \" Paragraph test \" │ │ │ │ ├── [p] │ │ │ │ │ └──── \" Multiple \" │ │ │ │ │ ├── [strong] │ │ │ │ │ │ └──── \" Char \" │ │ │ │ │ └──── \" Test \" We are super close to getting our first text on the screen! (Maybe just a devlog or 2). The vid below shows it in action! Thanks for reading :)"}, {"post_id": 12205, "ts": "2026-06-19T22:30:15Z", "hours": 1.7031, "text": "Today I Worked on the DOM tree, for my C++ Web Engine from scratch! Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ Today was my first attempt at building a DOM tree and also learning structure types and building trees. This first attempt, after learning a lot about how trees work, doesn’t really work fully; it seems to have issues when parsing tokens and just processing them overall, so the hope is that I can rebuild this for next time! Overall this was a pretty boring day; hopefully I’ll get the DOM tree working, then it’s straight to rendering!"}, {"post_id": 11748, "ts": "2026-06-19T04:11:02Z", "hours": 2.1842, "text": "Fixed my parser! Today’s update: I fixed my parser. The main issue was that it didn’t parse in order; it would do it like this: Text that should be in <a></a> The problem was that I couldn’t use this for my DOM tree, and getting my DOM program to do this would be slow and inefficient. Also, the cause of this was because I didn’t check for conditions that it was a start, middle, or end tag. I did it so I bunched the start and end together, and this was a huge problem because it ended up being put at the bottom, which wouldn’t work at all! Fixing it took a hot minute, but tomorrow I should have DOM’s working. Ok, thanks for reading that! The before and after are in the images below. Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/"}, {"post_id": 10978, "ts": "2026-06-18T00:22:11Z", "hours": 3.2256, "text": "HTTPS Working I was able to get HTTPS working on the C++ engine and get it to properly parse. Most websites work on it, but they were a bit slow, so I ended up rebuilding parts of the tokenizer to be faster, changing the speed overall from 3+ seconds to under 0.2 seconds. The main problem is Google websites don’t load at all, so I’ll fix that in the future. Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ The video below shows it in action, loading the Hack Club web page super fast."}, {"post_id": 10261, "ts": "2026-06-16T22:03:22Z", "hours": 2.195, "text": "C++ Browser Engine You can try it online! : https://k754a.hackclub.app/ Source code: https://github.com/k754a/C-Plus-Plus-Web-Engine I built a custom tokenizer for HTTP to be able to load and render websites! I’m building a super-fast, pure custom C++ browser engine from scratch, and the thing I built today was an HTML parser! HTML parsers are super hard to code, thanks to HTML being a very loose markup language. There can be tons of stuff, like: Missing divs <div> Hello World! </p></div> Missing end tags <img src= \"image.png\" Even nested divs! <div class= \"container\" ><span> Nested Elements </span></div> So I needed to build a parser that could handle all of it. Another challenge I’ve been trying is forcing myself to stop making variables for everything and trying to be minimal and fast! This new update also added local HTML loading; this lets me test much faster and test certain things, especially for the DOM and render tree! Some struggles I ran into while building this project were just the amount of errors and debugging I had to do to figure out what went wrong, as well as working with large pieces of code with constant changes. This part really taught me about data types, how to find and remove elements from multiple different classes and types, how to make loops efficient, and how to use vectors! My plan for the next devlog will be building a DOM tree or getting HTTPS to work. After doing some research, I found that I can use: #include <wininet.h> to help get this thing working, so that’s my plan! Okay, this was super long. Thanks for looking at it. The video linked below is a demo of it loading and tokenizing some text locally on a machine!"}, {"post_id": 9517, "ts": "2026-06-15T21:46:02Z", "hours": 3.3375, "text": "In this devlog I built the first half of my parser for the web engine; it can go through a website and match tokens! There are a few issues; some things, like conditions (like <a href=> arnt supported), as well as I can’t pull text from things like headers and stuff. I also made an animation so people can see how it works! The animations basically shows how my buffer system, and determining the order of tokens works, to prevent things like mismatches!"}, {"post_id": 8360, "ts": "2026-06-13T21:58:37Z", "hours": 1.1603, "text": "I was able to build a website demo for people to try out. To make this, I ran it on the Nest servers from Hack Club! However, I used a bit of AI, as I had never set up a server, as well as my project being only built for Windows. However, AI still hasn’t and will not be used in the main project. I did this as a bit of a time saver and to not have to commit 40+ times to test it lol. https://k754a.hackclub.app/"}, {"post_id": 7951, "ts": "2026-06-13T08:10:50Z", "hours": 1.3631, "text": "First version of the browser. It is currently all through the terminal; there is no formatting, CSS, JavaScript, fonts, styles, or even structure to the text. However, any HTTP website can now be rendered into readable text, even if it’s a bit hard to see, lol! The next version of this, I’m going to hook up a rendering pipeline (not sure to what yet, though). Then it will be allowing different fonts and structures, and then finally, support for some CSS. What I have just described will probably take 200 hours!"}, {"post_id": 7836, "ts": "2026-06-13T02:24:42Z", "hours": 1.7817, "text": "I update the web browser engine to allow the download of full files from websites in HTTP. This will pave the way to let me parse the website for the next devlog! Some more changes I made were a bit more error handling and also refining some of the output to make it cleaner and retiring some of the older debug logs. The next difficult part will be some basic parsing and pulling out text Then I’ll attempt to render text without position (this will take about ~4 hours), and then I’ll work on formatting."}, {"post_id": 7688, "ts": "2026-06-12T20:48:29Z", "hours": 1.8869, "text": "I built the first version of my web client. It can now pull HTML data from HTTP sites, using a TCP socket. If you don’t know what I’m working on, I’m building a pure C++ browser engine, to load and render websites like google without the use of AI and libraries. Note that it does not work for https, as to build a handshake between the 2 is super difficult, even for a good programmer. The next step will be to pull an entire webpage off and save it in RAM. Thanks for reading, and I hope you follow my journey!"}, {"post_id": 7066, "ts": "2026-06-11T20:43:24Z", "hours": 1.8558, "text": "Using C++ and native windows libraries, i was able to connect to a website and pull some data off of it. this was super difficult, but im super happy it worked, its able to connect to any IPV4, http site. my next plan is to start pulling files, like html into ram from websites. "}, {"post_id": 4053, "ts": "2026-06-07T07:22:15Z", "hours": 1.5675, "text": "The overall of my essay, is just laying out how im going to be building a web engine from scratch. its not going to run JavaScirpt or interface with HTTPS off the bat, as i have to code all of that and it sucks. https://github.com/k754a/C-Plus-Plus-Web-Engine/blob/main/README.md (this is a link to it as i could not upload a pdf file.) Overall, this will be one of the most complex projects I’ve ever tried/attempted to take on, even over https://github.com/k754a/C-Custom-Code-Editor by a long shot. This will 100% test my research, development, and C++ skills, but I believe that even if I’m not able to pull this off, I will learn a lot about how browsers work and good C++ practices. I hope you will follow my progress on GitHub and Stardance as I build this!"}]...
|
Title: Browse++ by @kallenseelo | Stardance
Devlo Title: Browse++ by @kallenseelo | Stardance
Devlogs:
The overall of my essay, is just laying out how im going to be building a web engine from scratch. its not going to run JavaScirpt or interface with HTTPS off the bat, as i have to code all of that and it sucks. https://github.com/k754a/C-Plus-Plus-Web-Engine/blob/main/README.md (this is a link to it as i could not upload a pdf file.) Overall, this will be one of the most complex projects I’ve ever tried/attempted to take on, even over https://github.com/k754a/C-Custom-Code-Editor by a long shot. This will 100% test my research, development, and C++ skills, but I believe that even if I’m not able to pull this off, I will learn a lot about how browsers work and good C++ practices. I hope you will follow my progress on GitHub and Stardance as I build this!
Using C++ and native windows libraries, i was able to connect to a website and pull some data off of it. this was super difficult, but im super happy it worked, its able to connect to any IPV4, http site. my next plan is to start pulling files, like html into ram from websites.
I built the first version of my web client. It can now pull HTML data from HTTP sites, using a TCP socket. If you don’t know what I’m working on, I’m building a pure C++ browser engine, to load and render websites like google without the use of AI and libraries. Note that it does not work for https, as to build a handshake between the 2 is super difficult, even for a good programmer. The next step will be to pull an entire webpage off and save it in RAM. Thanks for reading, and I hope you follow my journey!
I update the web browser engine to allow the download of full files from websites in HTTP. This will pave the way to let me parse the website for the next devlog! Some more changes I made were a bit more error handling and also refining some of the output to make it cleaner and retiring some of the older debug logs. The next difficult part will be some basic parsing and pulling out text Then I’ll attempt to render text without position (this will take about ~4 hours), and then I’ll work on formatting.
First version of the browser. It is currently all through the terminal; there is no formatting, CSS, JavaScript, fonts, styles, or even structure to the text. However, any HTTP website can now be rendered into readable text, even if it’s a bit hard to see, lol! The next version of this, I’m going to hook up a rendering pipeline (not sure to what yet, though). Then it will be allowing different fonts and structures, and then finally, support for some CSS. What I have just described will probably take 200 hours!
I was able to build a website demo for people to try out. To make this, I ran it on the Nest servers from Hack Club! However, I used a bit of AI, as I had never set up a server, as well as my project being only built for Windows. However, AI still hasn’t and will not be used in the main project. I did this as a bit of a time saver and to not have to commit 40+ times to test it lol. https://k754a.hackclub.app/
In this devlog I built the first half of my parser for the web engine; it can go through a website and match tokens! There are a few issues; some things, like conditions (like <a href=> arnt supported), as well as I can’t pull text from things like headers and stuff. I also made an animation so people can see how it works! The animations basically shows how my buffer system, and determining the order of tokens works, to prevent things like mismatches!
C++ Browser Engine You can try it online! : https://k754a.hackclub.app/ Source code: https://github.com/k754a/C-Plus-Plus-Web-Engine I built a custom tokenizer for HTTP to be able to load and render websites! I’m building a super-fast, pure custom C++ browser engine from scratch, and the thing I built today was an HTML parser! HTML parsers are super hard to code, thanks to HTML being a very loose markup language. There can be tons of stuff, like: Missing divs <div> Hello World! </p></div> Missing end tags <img src= "image.png" Even nested divs! <div class= "container" ><span> Nested Elements </span></div> So I needed to build a parser that could handle all of it. Another challenge I’ve been trying is forcing myself to stop making variables for everything and trying to be minimal and fast! This new update also added local HTML loading; this lets me test much faster and test certain things, especially for the DOM and render tree! Some struggles I ran into while building this project were just the amount of errors and debugging I had to do to figure out what went wrong, as well as working with large pieces of code with constant changes. This part really taught me about data types, how to find and remove elements from multiple different classes and types, how to make loops efficient, and how to use vectors! My plan for the next devlog will be building a DOM tree or getting HTTPS to work. After doing some research, I found that I can use: #include <wininet.h> to help get this thing working, so that’s my plan! Okay, this was super long. Thanks for looking at it. The video linked below is a demo of it loading and tokenizing some text locally on a machine!
HTTPS Working I was able to get HTTPS working on the C++ engine and get it to properly parse. Most websites work on it, but they were a bit slow, so I ended up rebuilding parts of the tokenizer to be faster, changing the speed overall from 3+ seconds to under 0.2 seconds. The main problem is Google websites don’t load at all, so I’ll fix that in the future. Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ The video below shows it in action, loading the Hack Club web page super fast.
Fixed my parser! Today’s update: I fixed my parser. The main issue was that it didn’t parse in order; it would do it like this: Text that should be in <a></a> The problem was that I couldn’t use this for my DOM tree, and getting my DOM program to do this would be slow and inefficient. Also, the cause of this was because I didn’t check for conditions that it was a start, middle, or end tag. I did it so I bunched the start and end together, and this was a huge problem because it ended up being put at the bottom, which wouldn’t work at all! Fixing it took a hot minute, but tomorrow I should have DOM’s working. Ok, thanks for reading that! The before and after are in the images below. Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/
Today I Worked on the DOM tree, for my C++ Web Engine from scratch! Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ Today was my first attempt at building a DOM tree and also learning structure types and building trees. This first attempt, after learning a lot about how trees work, doesn’t really work fully; it seems to have issues when parsing tokens and just processing them overall, so the hope is that I can rebuild this for next time! Overall this was a pretty boring day; hopefully I’ll get the DOM tree working, then it’s straight to rendering!
C++ Browser Engine You can try it online! : https://k754a.hackclub.app/ Source code: https://github.com/k754a/C-Plus-Plus-Web-Engine Got the DOM tree working! Ok, in this devlog, I fixed the DOM tree issues; it seemed to be a combo of issues with the parser (I fixed that) and some actually easy fixes from the DOM tree; it just took a rewrite! I was also able to code a way to see the tree: DOM TREE ├── [ROOT] │ ├── [!DOCTYPE] │ │ ├── [html] │ │ │ ├── [body] │ │ │ │ ├── [h1] │ │ │ │ │ └──── " Heading test " │ │ │ │ ├── [p] │ │ │ │ │ └──── " Paragraph test " │ │ │ │ ├── [p] │ │ │ │ │ └──── " Multiple " │ │ │ │ │ ├── [strong] │ │ │ │ │ │ └──── " Char " │ │ │ │ │ └──── " Test " We are super close to getting our first text on the screen! (Maybe just a devlog or 2). The vid below shows it in action! Thanks for reading :)
This is a super short devlog, I updated the server so that it uses my latest code, and supports HTTPS! you can try it out with the link below. https://k754a.hackclub.app/
C++ Browser Engine You can try it online! : https://k754a.hackclub.app/ Source code: https://github.com/k754a/C-Plus-Plus-Web-Engine Got started work on the GUI using SDL3! Today, I worked on getting a GUI up and running; for now it’s just a window, but I’ll get it working! I also started work on a logo, as I felt a bit burnt out during today, but nothing really came of it, as all my designs I tried sucked; the best one I linked below. I also created the first readme!
The browser now has a GUI! This took a bit and a few tutorials, but now you’re able to browse the web with no styles, one font, and just things like headers, but for now this is super awesome! I’ve been going pretty hard at it the last few days, and I lowkey need a break, or else I’m gonna get super burnt out, so I might just start a side project for the fun of it, something easy when I’m feeling a bit sluggish. When I come back, I’ll work on adding a UI around the browser (to get fully away from the terminal), and then it’s just getting CSS parsed and working, which isn’t too bad at all. You can check out the code and try the project below. C++ Browser Engine You can try it online! : https://k754a.hackclub.app/ Source code: https://github.com/k754a/C-Plus-Plus-Web-Engine
CSS Parsing! I got CSS working! I was able to get my CSS parser working on the engine and parse properly. This wasn’t as easy as I thought, as my first attempt worked but was dreadfully slow (10+ seconds), so a lot of the time went into rewrites and optimizations, bringing it from 10+ to about 2 seconds for huge CSS (1000+ lines of CSS)! Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ Video below shows it loading the hackclub website!
Version 0.1.0 of the Browser Engine! If you don’t know what I’m building, I’m creating a custom browser engine in C++ from scratch, something like Chromium, but a lot more bare bones. Today, I did a bunch of things. I got my first CSS attributes to detect and work! Text now is not hardcoded and dynamically scales based on the CSS! This really wasn’t too hard, so I moved on to the next thing, getting a working UI! The UI I’ve created is basic, but it allows you to search without using the terminal and search multiple things! Overall this was an awesome day for today; my plan over the coming days is to support more CSS and work on fixing performance and overflow bugs! Thanks for reading. :) Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/ The video shows the standalone app, and searching 2 different sites.
Today, I got a bunch of colors working! The browser engine can now render different colored backgrounds, texts, and highlights! This actually wasn’t too bad, as the hardest part was just fixing all the bugs from CSS being such a bad language, but overall it turned out awesome!
Links, and better rendering! Today I got links, and rendering improved rendering! Words now render together, rather than making a new line each time. I also got links, and that allows you to browse something like Wikipedia (the video below) much easier! For next time, I’m going to get the back and forward arrow and reload a working website! And may start work on getting the browser to have divs! Thanks for reading!
Back and forth arrows, reloading, better formatting, and searching on the browser! Today was huge; I was able to get better formatting for text, search for things, and get buttons like back and forth and reloading working! My next task to tackle is images! The vid below shows all of the changes in action! Thanks for reading!
Rebuilt part of the browser engine to handle tabs! Today, I worked on getting tabs working! It wasn’t as bad as I thought; the worst part was making all the UI elements and handling the inputs for them! I also found a bug; the engine easily uses my entire CPU’s dedicated GPU and causes issues with other apps lol, but I’ll fix it in a bit! Overall it was just bug fixes, quality-of-life improvements, and tabs! Hopefully tomorrow I’ll do images, then I’m taking a break for a bit and doing something else because I’m burnt out, and that’s a tip for all of you too: don’t overwork yourselves! The vid below shows it in action. Thanks for reading! Also, if you want to support the project, dropping a star on the GitHub would be awesome; no pressure, though. :) https://github.com/k754a/C-Plus-Plus-Web-Engine
Images Working for the Browser Engine! I’m going to be honest with you, this has to be the top 10 worst things I’ve ever coded. 😭😭 But images now can load; there are a few bugs, most images don’t load, and the ones that do load in pairs of 2 have weird bounding boxes. However, they do work, and that’s what I’m happy about! I’m going to do a quick side project, just to have a bit of room so I don’t overdo it, but overall it was good. Next I’ll just fix the bugs and start getting like the formatting of texts to start matching websites! The vid below shows them in action.
Lots of bug fixing on the engine! & Making it to the news letter! First of all, I want to thank everyone who has liked, reposted, and checked out my project. I made it to the Stardance newsletter, and it was so awesome :). Thank you so much! Today, I fixed a crazy amount of bugs; the main one was I would have these empty boxes, and it took me a good hour and a half to figure it out, but now text renders so much nicer! The next bug I fixed was clicking links. Up until this point, clicking links did not work at ALL, so now they work! (super happy about that)! History now works for each tab, not just one pool! I’m also starting work on making a YT video for this project. I’ve never made one before, so we will see how it turns out. For tomorrow, I’m going to work on the formatting of the engine, as normal websites have text like how Stardance has the home, notifications, rate, missions, etc, on the side and the main text in the middle, so I’ll hopefully get that working! Anyways, thanks for reading! You can check out my project below. :) Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/
Rebuild of the layout engine! Today, I rebuilt a bunch of the layout engine to start support for flexboxes and divs! I mainly switched the code to do 2 passes, first to figure out spacing, size, and position, then to place the elements on it! Overall, this was a kind of boring day; it works basically the exact same rn, so there’s really nothing to show, but I’ll send a screenshot or two of my code! Anyways, the plan next is to get flexboxes working! After that, I might rewrite my engine, as it’s getting a bit ugly and crowded, and I coded some stuff pretty badly the first time around; it probably would only take about 10 hours, working off my code, but I think it would save me time in the future, but I’ll see! Anyways, thanks for reading! Also, if you want to support the project, dropping a star on the GitHub would be awesome; no pressure, though. :) https://github.com/k754a/C-Plus-Plus-Web-Engine
Got Flex and Absolute boxes working on the engine! This took a while, just with fixing all the bugs and the weird reasons why some things would just not work at all lol! It was definitely a learning process for sure, and it should be easier to add more support for everything else in the future! This has to be one of the most difficult projects I’ve ever worked on, but it’s coming along! I want to do something a bit more fun, so my plan is to start work on a UI overall, just to give myself a break from all the crazy stuff! Anyways, thanks for reading! (oh, websites look so much nicer, with the new stuff!)
New icons and more buttons! Today, I was able to get icons supported into the engine (kind of)! The way I did it was by using a font modifier. I loaded the font I’ve been using and created some custom icons! A lot of the challenge was fixing text, as the new icons had issues with scaling and position, especially the back and forth arrows! Overall it was a great day. I’ll work on getting the printer button and the star button working; then it’s on to improving the engine! (also added a home button!)
Scroll bar support, bookmarks, and printing sites! Today I got a lot done; the main things were getting scrollbars, bookmarks, and getting sites to print all working! I ended up running into a lot of bugs (especially with the scroll bar), but now it works, so yeah! Currently the browser portion is far behind, and I want to update it, so I’ll try doing that next! Overall today was a good day; I got a lot done and a lot working! Anyways, thanks for reading! Code / Project You can check out the code here: https://github.com/k754a/C-Plus-Plus-Web-Engine And try a older version of it: https://k754a.hackclub.app/
Updated the web version to the latest! Ok, so the main thing i did today was update the web version, and got it to match the main version overall, with everything! I also tried to get better formatting on the text, but i think my code is just so muddled its gonna be impossible, so my plan is to start rewriting it, with the things I’ve learned, and updating the comments (as i have a lot of them, in many wrong spaces)! that should take a bit, but hopefully will pay off in the future! If you want to try the new version, its here: https://k754a.hackclub.app/
The first part is rewritten! Today, I worked on rewriting my network code with better comments, names, and methods. This took a while, as I created so many bugs, but it does work! The long part is still yet to come; however, the main things like the parser and the GUI are going to be a headache, but I should get it done! Overall a good day; ~4 files have been changed, with 6 more to go! Then after this, i want to add a history button, a settings page, and just improve performance, and formatting, then I’m done!
Performance increases, and a rewrite of the parser! Today was a nice easy day; I rewrote most of the parser, fixing a lot of bugs, and also learned how to use the performance analyzer in C++! The code is much more documented, with every line describing what it’s doing, making it super easy to follow along! The main change was an increase in speed from about 5% CPU usage to 1% and a 50MB reduction in RAM usage, allowing for 10 tabs at once, with only 61MB overall, rather than the 1000MB of something like Chrome! as well as about a 6% faster parse and load time. There is still a lot to optimize and work on, so I’ll keep doing that!
Performance analyzer and comments for our DOM! Today, I created a performance analyzer that could tell me how many microseconds it takes to get through certain programs. This helped a lot with optimization and making things faster! I also finished and optimized the DOM code! Today was a pretty basic day; I’m a bit busy over this coming week, so it’s going to be a bit more broken up, but overall a good day today!
Lots of optimization, better comments, and bug fixes! Sorry for not posting for a few days; I was super busy and didn’t really have the time. However, I’m back at it! Over the last week, I’ve been changing and updating lots of stuff. The first one was much better comments for the layout.cpp file! I still have a bit left to do, but I was getting pretty tired, so I moved onto making the engine a bit faster! One of the main things I did was use threading, passing the text off to the GPU rather than going from CPU to GPU, as well as multithreading it. This allows about 2 seconds faster search time, and I have some more ideas for changes too! The reason this took so long is the number of bugs I introduced. The Gui.cpp is huge (2000+ lines), so I want to really rewrite it, as there is SO much junk and bad coding practices lol. Overall though, it was a good day, and I think I want to start tackling JavaScript after adding a lot of QofL and fixes to a ton of bugs! Thanks for reading!
Dark mode and bug fixes (with more bugs) and HTTP error codes Today, I recorded most of my link and search handling to be better at handling URLs and links like /home. I also added a dark mode! (Super helpful on the eyes lol) Unfortunately there is a big bug, some websites will just not work anymore (like hackclub), and also websites take super long to load, this is because the images it is processing are in a buffer, and this buffer needs to finish the images of one page before the other, i think i have an idea to fix it, so I hope I will be able too soon! But overall, this update changed a lot of bugs, and I’m hoping it can be even better for the future!
Lots of bug fixes, quality-of-life changes, and the start of a rewrite! try it out! https://k754a.hackclub.app/ I’ve been still a bit busy, but over the last 2 days, I ended up fixing a lot of bugs with crashing, especially with dealing with multithreaded tab handling. Some of the quality-of-life changes I did were creating a new tab handle that allows you to go back to the new tab in history and other small changes! The biggest bug was where, if you searched something and, while it was loading, switched tabs, it would overwrite your tab to the one you switched to, not the original one you searched in. Now that is fully fixed! Overall a good day! I’m going to fully rewrite and comment all 2500+ lines of the GUI and other functions, fix a LOT of bugs, and then add settings, history, and a few other things! Thanks for reading!
Halfway done rewriting Gui.cpp—Lots of bug fixes and speed improvements! If you want to check out or support this project, you can click the GitHub link! https://github.com/k754a/C-Plus-Plus-Web-Engine Over the last 2 days, I’ve rewritten about half of GUI.cpp (up to the GUIRENDER function), with changes, bug fixes, and speedups that helped the engine a lot! The main speedup came from changing the way I handled the font so that I loaded it once, not every loop. This allowed a lot less SSD usage and a gradual increase of performance, up to about 50% for large sites! I worked a lot on organization and got it so that different functions are grouped together, even moving some to different scripts that fit better! The final change was reworking how images and the home button worked, and it allowed me to drop a function, as well as have much faster image batch loading times! Going through the code made me realize how many bugs and bad code I did. I fixed a lot of it, but I still got a bit to go! Overall it was a good day. My plan for everything else is to finish the rest of GUI.cpp, start work on a settings page, and try to make the parser faster still! Thanks for reading!
Local file loading, better comments, and crash fixing! If you want to check out or support this project, you can click the GitHub link! https://github.com/k754a/C-Plus-Plus-Web-Engine Today, I worked a TON; I got through all the comments for the start and collision events for all the buttons and things in GUIRENDER . I also added some new features and fixed some huge bugs! The new feature is file loading! You can now load PNG, JPEG, HTML, TXT, and HTM files straight from the search bar! The main fix, and what took most of my time, was the prerender. as i was working on slimming the new tab create button down, i found a lot of strange bugs, esspicaly with webpages with large amounts of images (like stardance), this lead me down a lot of changes, overall, it was a issue with how i checked to see if i wanted to load it from disk, but it was also a bunch of stuff to do with multithreading, and locking parts, but after a lot of work, i fixed it! I still need to fix up and finish GUIRENDER , but once I’m done with that, it’s off to work on the settings page. Thanks for reading!
Quality of life improvements, more comments, and finally fixed the crashes If you want to check out or support this project, you can click the GitHub link! https://github.com/k754a/C-Plus-Plus-Web-Engine Ok, so first off, the huge crash I was getting was because of using a global variable for holding the link and not a local variable, and when 2 threads attempted to use it at the same time, my app would freeze and crash, so now it runs great! Some of the QofL improvements are adding keyboard shortcuts and the ability to close tabs by pressing the middle button down, like a real browser! Then there were a lot more comments that I am so close to being done! Overall a decent 2 days; I’m definitely getting a bit bored of the comments, so my plan is to work on my other project for a bit and come back later! But yeah, a good day. :)
Done all comments and released 0.1.0 ! If you want to check out or support this project, you can click the GitHub link! https://github.com/k754a/C-Plus-Plus-Web-Engine I ended up going on a camping trip with the homies, so I didn’t work on this for a bit, but when I came back, I fixed a few more bugs, ended up finishing all the comments for GUI.cpp, and created release 0.1. 0! This is huge, as I was able to fix all known bugs and get a working version out! For version 1.0.0, I want to fully fix the layout engine to render close to a modern browser, add a settings page, fix performance, and add things like buttons and checkboxes on websites! Thanks for reading!
Settings button, bug fixes, scroll bar drag, and a context menu! This update was just a crazy number of features! I ended up shifting around the top area to make room for a settings button (that I will deal with soon), then I decided to allow scroll bar drag so that you can scroll through a page with the bar, not just your wheel! The big thing was the context menu; this took the most time and was the most difficult, as it was just a pain to get 2 windows rendering, but now, it works super well! I also attempted to work on getting a better layout, but I just screwed a lot of stuff up lol, so that didn’t really work out, but that’s ok!
Add context menu and startup URL (and fixed a LOT of bugs)! Sorry it’s been like 2 weeks, but after finishing my other project, I’m back at it! Over the last 2 days, I worked a LOT on the context menu and bug fixes (like loading text files into the engine, and old ones I caught working on this!). The context menu changes its options based on what things you right-click (like a real context menu), so for example, when I click a link, I get way more different options than if I clicked a tab. This allows for a lot of customization, and it’s basically fully implemented (minus a few features I want to add). The startup URL is kind of a part of that; when clicking a link, you have the choice to open it in a new window, and getting a URL that can change on startup really made it easy to add the feature! So overall a good day. What I’m going to work on next is the settings menu. Thanks for reading!
HTML text-align handling, history tab, and settings. Ok, I’m going to be honest, I looked at that settings menu and genuinely did NOTHING. It’s going to be a pain, so I’m just avoiding it till I have no choice. Something HUGE, though, I’ve gotten working is getting proper styling so that text can render in the middle and right (with way more text-align and style options to come)! This really opens the door for much more dynamic rendering text, though there are still a few bugs with it (large text goes off screen, and the home screen doesn’t apply the settings), so there is still a lot to fix, but honestly, I didn’t even think it was possible, so this is awesome! Overall a good day; I’m going to continue working on history and styles and then the settings lol.
More text formatting and positioning. (and LOTS of bug fixing) Today was a great day of work; I got height adjusting working, and this took way longer than I thought, just with all the bugs and problems I ran into, with old code I had created, but I was able to solve it all. The other notable thing is having another way to color text and the bg of text, but also, I fixed it so that none of the text falls off the edge in the positioning, so overall a good day! I’m actually so close to being done; I’ve wanted to go to 200 hours, then kind of just chill and slow down, and I’m at 14 hours left of that! Then I’ll ship. But I do want to finish the history menu, though I may leave the settings menu on pause. (for now). So yeah!
More HTML style options, browser history, and work on the Readme.md Ok, so over the last 6 hours this is what I worked on. First, I worked on adding more style options, so now you can set font size (another way) and set font boldness (like normal HTML), and you can now add custom number values to the vertical alignment (that in the vid is shown on the homepage!). I also worked on the browser history now, saving it to a txt file. You can scroll back through what you’ve searched before (and add a button to clear it next update).I also was working on the readme, making it clear and better before the ship. Overall a good day, and I think I’ll try to do the settings menu, aswell as support for buttons in the viewer (though they probably won’t do anything thanks to not having JavaScript), so yeah!
Updated context menu, Desktop Logo, Hover effects, Rework of the input bar, and bug fixes! Ok, its like 1:30 am rn lol, so im going to try to do this fast. First, i updated the context menu, the menu now has a nice drop shadow, and looks so much nicer than before (lemme know what you think about it). second, i added a basic desktop logo (a grayish black circle) that changes based on light or dark mode (the vid shows it well). Another change was hover effects! now hovering over buttons changes the color slighly, making it a bit simpler to see that your over something, and aswell as being a bit more reactive! the input bar rework allows clicking onto the bar, rather than always typing on the bar (for ctr-F coming soon!). Finally, bug fixes, i had a lot of issues with having both custom x pos, and custom y pos, but thats all fixed now! aswell as the backgrounds not updating per tab (thats now fixed too!). Finally II, i worked on the readme a bit! Overall it was a good day (with over 10 hours of work lol), and i still have a few features to add! so yeah, thanks for reading! (as well as excuse the spelling mistakes, there might be a lot lol)
Linux support!!! Over the last few days, I’ve been working on migrating the project from MSBuild to CMake, allowing it to run on both Linux and macOS (though I haven’t been able to test it lol). Linux has been tested, however, and everything works on it (except I haven’t migrated the networking, so that’s still to do!!), so there are still some things that need to be done, but it boots on my Debian VM and renders! So I’m super happy for that. Some other changes were that I got autocompletion (you’ll see it in a sec) as well as getting the open in a new tab working a bit better for both Windows and Linux!! Overall a good day!
Final work on the readme, getting a standalone windows build! Over the last few days, I’ve been hard at work getting the readme finished up, it was super tedious but now its in a good spot for a ship, and looks awesome! I’ve also gotten the windows build to be standalone! this took a lot of googling, but now with CMake, it now can run on anyone’s computer, without needing anything else!! Other than that, its been a bit of work on the Linux side, i attempted to get some sort of https working, but because its a vm, its super screwy, and i hope to be able to have a computer that has Linux on it for use, but we will see ig. Also made a YT vid https://www.youtube.com/watch?v=I-mCh9xSYeg&t=8s Overall a good day!
Ships:
Browse++ A C++ Browser Engine from Scratch. Overview: Over the course of 2 months and almost 300 hours (165 coding) of work, I built a browser engine that can download, parse, and render websites with tab handling and a lot of other cool features, from almost complete scratch! What’s a Browser Engine? A basic definition of a browser engine is a program that pulls content from a website, then takes that content, gives the elements the properties assigned in the CSS, and then renders the content on the screen. They end up being very difficult to build, as HTML and CSS can run and be run without errors, so that makes it super hard to build an engine that can properly handle, parse, and render a site with a lot of errors. How to use this? If you would like to use my browser engine, there is quite a few ways to do so! NOTE: I do not have an actual Linux laptop, so the Linux version is super buggy (and does not have any networking), but I really hope to fix that in the future, but you can use the more outdated web demo! If you don’t want to download anything, you can use the Web Demo , its a bit behind, but it shows it nicely. If you are willing to download, and you are on windows , you can go to the github here and download to try it! If you want to see the real thing, I have a video going through it here. What am I most proud of? I think the thing I’m most proud of was the amount of browser systems i was able to build from scratch , this was a super fun thing to build, but it had a lot of challenges and ups and down, and a lot of hours fixing bugs that make no sense at all lol! The other thing I’m most proud of is not using any AI on the main engine; there was a bit of AI used for the web demo, as that wasn’t my main focus, but the browser engine overall used absolutely no AI! AI usage GLM 5.2 was used to convert the Windows code to a web server for Linux (way before I supported Linux). Any code changes are clearly marked with ( // CHANGED WITH AI: ... ) if they have been changed with AI, and very little has been changed....
|
1792878475.348404
|
1793742475.348404
|
|
15129
|
Tempname: Engine by @pkncoder | Stardance
|
pkncoder
|
1
|
165.0
|
2930
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T12:06:16Z", "hours": 165.0, "multiplier": 19.97, "payout": 2930, "blessing": "neutral", "text": "—————– Ship #1 —————– - - Welcome - To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). 💚 The current state 💫 There is still no UI, all render control is based in a JSON file. The current only renderer is a custom Deferred Renderer. Note: As this is built for 3d rendering, a modern computer, with a GPU is recommended. Modern Macbooks will run it, however it will be slower as it is basically magic that it works on them. Thank you so much! I’ve spent a lot of time on this. It may not seem like that, however when building this, I decided to do it right (as this is my 3rd attempt). I split the development into phases: Get a window Get something rendering + a camera Get object/material/texture loaders + basic scene managers + basic concept of working Create full scale (professional) renderers/scene managers/resource managers/etc. Get a UI Currently, I’m in getting everything polished in the backend. I didn’t want to move on to the UI, as I didn’t want to rush that. Rushing a UI meant missing other things. So thank you, and I really hope you enjoy. If there are any issues, please report them to the issues page on the github, and message me on slack ( @pkncoder ). Github releases: https://github.com/pkncoder/Engine/releases Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine", "repo": "https://github.com/pkncoder/Engine/", "demo": "https://pkncoder.github.io/Engine/index.html"}]...
|
[{"post_id": 72971, "ts": "202 [{"post_id": 72971, "ts": "2026-09-24T04:20:28Z", "hours": 2.5239, "text": "—————– Devlog XXVII —————– - - Release is out testing time – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Not too much has happened, mostly: Updated README (resources, gallery, installation & use) Updated the landing page (added a tech-stack) Created my first release under the 1.3.x alpha title That big 1.3.x “alpha” release is the big one, as I need some help. If you could just take a bit of time, and you aren’t on linux-arm or apple-intel, could you check out the github releases and try it out, that would be great! I plan to ship tmwr, but I want some testing done first. Thank You for Reading So close!! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 72516, "ts": "2026-09-23T03:30:31Z", "hours": 9.9433, "text": "—————– Devlog XXVI —————– - - Almost… there – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ In order to show the capabilites, I’ve been setting up scenes for my engine to show off, and here are some of the results! It would be great to get your favorite render of these! For the full 9 renders , check out the scrapbook in the slack , as they will be there w/ a thread. Thank You for Reading Hopefully will actually ship tmwr! I’m actually getting kind of sad, I won’t be stopping development by any means, but this has been my summer (although I might not be able to get any stardance tokens, but that’s ok ig…). If you have any questions, feel free to DM me either here, or at @pkncoder on discord if that’s easier for you! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 71565, "ts": "2026-09-21T02:05:45Z", "hours": 2.1433, "text": "—————– Devlog XXV —————– – New JSON scene file 📁 - SHIP TIMEEEEE – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Not that much has happened tbh. All that has really happened… Updated the README a bit more Added a new json parser to spawn the scene from that Added hot reloading of the scene So yea, next should be the ship. When updating the README on the github, I was going through the Usage section, and added a new promise for how people could add their own meshes. In this I created the idea of activeScene.json , a JSON file that listed the scene data (crazy, right?). And so, after I updated the README , I added the new loader, and made the scene reload by pressing the “ r ” key. That’s kinda it… Thank You for Reading Before shipping, I need to… Do another update of the README Create the base Releases for Mac, Windows, and Linux And test these Do a pass through TODO.md Update the landing page Shouldn’t take too long Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 69952, "ts": "2026-09-18T03:52:09Z", "hours": 8.6456, "text": "—————– Devlog XXIV —————– – i HATE shadow maps!!! - Renderer? I hardly know her? – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ WOAH A lot has happened. Previously, I had just implemented a new entity system & a new camera system. So what’s new? I present: The Deferred Renderer !!! Basically, it’s just another way of rendering. HOWEVER , it has some funzies: Mostly together render graph, just a little smthin Shadow Pass G-Buffer Pass Lighting Pass New point lights (replacing the emmissive texture searching before) Looking to add SSAO (hemisphere sampling) in the future!! Now, along with this, I just tested creating a build for windows and testing it on a friends machine, and it worked (his laptop is crap, so it ran slow, but surprisingly fast) . Along with that, I also tried the current build on mac, and it also worked, so that’s also great (I’m supprised)!! However, the real prize, is the trypophobia horrors made along the way!! That’s right! When trying to get textures to work, I ran into a ton of problems (mostly related to the alpha map & image formats) that caused major headaches. Images and videos, where they are a bit compressed, can be found below. Thank You for Reading Almost there, I still need to change up the landing page, rewrite the readme, and merge the main branch, plus try to get a way to change the 3d models for users, but I’m getting there. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 67656, "ts": "2026-09-13T20:09:19Z", "hours": 7.9958, "text": "—————– Devlog XXIII —————– – I NEED TO HURRY UP AAAA - EnTT - Table – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ In my previous devlog, I stated how I was working on the new RenderGraph . I’ve now realized, that I have like until the end of the week for when I need to ship. So instead , my goal is to get this looking impressive . To start, here is what I’ve done so far : Cleaned up system inits Changed how the UUID service works (now you just access it and call generate ) Implemented a new library, EnTT Did some cleanning up Added a PointLightComponent for future use (no dev. yet) Added and implemented the CameraComponent Here are the big things: EnTT EnTT is an open-source library that handles objects within games, editors, etc. It’s creator is: Michele Caini (skypjack on github) . EnTT is a library that exposes something called an Entity Component System (ECS). Basically, instead of saving a bunch of data directly inside of one struct or class, you define an entity (a unique id) and assign that entity components. The components are what actually gives the entity meaning. New Camera If you have ever ued Blender for a bit, you would know that your camera is on the same list as your meshes. This is since, to Blender, they are inherantly the same thing (don’t quote me on that) . Previously, my camera was seperate to all of the rest of the objects. This caused the data to be split, and handling the differences made my architecture a bit weird. Now that I’ve implemented EnTT , I’ve added a CameraComponent that defines things like rotation, FoV, etc - completely erasing the need for a separate camera, and opening the doors to more flexibility. Thank You for Reading New book is great! I won’t get to use too much of it for stardance, but I’m checking out this snowglobe thing that seems like it would be the next area!! Wish me luck on the ship. I want to get it out by the end of the week so I can hopefully still cache in some stardust. Probally won’t get the computer though (high hopes for a living or smthin idk) Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Change my Rasterizer to be a Defered Renderer & implement multiple point lights UI??"}, {"post_id": 61084, "ts": "2026-09-03T20:05:33Z", "hours": 3.7325, "text": "—————– Devlog XXII —————– – BrEaKiNg ChaNGeS - 📖 NEW BOOOKKKK – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Sadly, I’ve done much coding Base list This is what I have done since the last devlog: Planned out a bit more on the inner workings from no Renderer->Rendered Image Created the new Shader & Program classes Updated the workings on RendererManager Started work on the new Renderer / IRenderer class Current commit is now broken (compiles, doesn’t run Overview In my new obsidian vault , I’ve been working on creating the new database on how it all works. Through this, I’ve been using excalidraw (Obsidian) to plan out pipelines & create visuals. Currently, I have 2 main drawings: Shader & Program pipeline Renderer Pipeline The Shader & Program pipeline explains the lifetime and usage of both the Shader and Program (OpenGL program) classes. A program gets created, has shaders attached to it (deleting the shader in the process) , and then the program gets linked & binded. The Renderer Pipeline explains the lifetime and usage of a renderer. Starting from the RendererManager, go through normal rendering stuff, and will end at shutting down the RendererManager. For the inner workings of the new renderer setup, I’ll leave that for (hopefully next devlog) when I get everything working start to finish of the RendererPipeline . Thank You for Reading As for the “ New Book I got, I have just purchased “ Game Engine Architecture Vol. I ” (Jason Gregory) to specialize the program more (most likely after Stardance ends). Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Plan out the RenderGraph Create the base RenderGraph class Create the BlitList Create the INodeInput & INodeOutput"}, {"post_id": 58866, "ts": "2026-08-31T13:21:49Z", "hours": 3.4211, "text": "—————– Devlog XXI —————– – My brain hurts 🧠 - Sharp like glass – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Sadly, I haven’t done much coding Instead, I’ve been trying to figure out how I want my Render Graph to work. To start, what is a render graph? What I am interpreting the render graph as, issss: An API meant to simplify and provide structure to a final renderer. In the final application, the render graph will be an option for a more advanced final render editor. What I am working on now, is how it will be put together so I don’t have a mess in the future. Recently, I’ve been using Obsidian to mark everything down. This also starts a little docs. Using a mix of Obsidian and the excalidraw plugin, I’m able to write everything down and create visuals. Currently, I have a mix of nodes that are the main important ones. These nodes are just the interfaces , so they aren’t specified. They act as a blueprint for any of the full nodes. IRenderOutput - Add textures to a list of blitables IShaderInput - Base input interface IShaderOutput - Base output interface IShaderNode - Node representation of shaders IShaderPassNode - Base shader interface Thank You for Reading I haven’t been home enough to create the “big brain wall” which is sad, but at least my stuff is digital. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Setup current program for Render Graph implementation Implement IShader, IGPUTexture, etc. Create IRenderGraph for the renderers"}, {"post_id": 53552, "ts": "2026-08-24T04:42:42Z", "hours": 3.7022, "text": "—————– Devlog XX —————– – 🌟I have the best one liners 🗿– 🥀 Now I have to be smart ??? 🧠 – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ For the quick overview: Fixed the shadow map issue ( so angry about this, see below ) Fixed an issue with textures not caching Got the very base implementation of Uniform Buffers To start off, in the previous devlog I mentioned I was re-writing the shadow mapping . Shadow Mapping - Rendering a 3d model with the light being the eye. Everything that it can see is not in shadow, everything else is. quick explanation I was having issues with getting the shadows to work correctly. I had ideas for issues, including: (the model matrix , the renderPackets being in a bad order , the far plane ). IT TURNS OUT It was none of these. Whenever I made the code to compile a geometry shader along the vertex & fragment shader, I just copied my old one and spliced in the code. Turns out I forgot to swap some variables, and I was putting code in places it should NOT be at. No idea why it didn’t crash, but it fixed my shadow issues very quick . As for UBOs, I’ll talk about them in a future devlog, when I have everything planned out. Thank You for Reading As I said with “Planning out” everything, I’m going to set up a whiteboard - I’ll have to move my 🏳️🌈 pride flags 🏳️⚧️ :( - Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Refactor Build the big brain wall Do some thinking 🥀 Git Commits🗿 Weird position issue Saving now, I am so angry about this. I was compiling and overwrigting the wrong code :( Made the testing for shadows a bit better, and changed the rendering a bit Fixed issue with textures and full models not actually caching Removed anoying debug line for shadow transform matricies Working on getting the ubos working’ Got it to push First test ubos"}, {"post_id": 52406, "ts": "2026-08-22T15:11:34Z", "hours": 4.0344, "text": "—————– Devlog XIX —————– - 🌲 Textuers 🧚♀️ - 👩💻 Shadoowwsss 💀- To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ To recap on what I did: Got the program to launch to black screen I needed to inject the Asset Manager to a class Got objects loading correctly without shadows Got textures to load Started work on fixing the shadow map Nothing too crazy has been changed, the texture issues were about some compatibility problems and not uploading to the same index. The shadow values are uploaded to a 3d texture, where to calculate if an object is in sight or not, we commit triangles based on their position. The problem now is about the far plane, and hitting triangles that weren’t in shadow. I’m not sure what the problem is, but I’m going to do a bit more looking into it. Thank You for Reading :3-blahaj-spinning I still have to fix the shadows issue (obviuosly) but then I can move onto formatting the data (putting it into buffers, creating wrappers, etc).!! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Write the shadow cubemap geometry shader & ad it to the OpaquePass (temp main pass) Make and debug UBOs replacing base uniforms Refactor / clean Create the real Render Graph? 🥀 Git Commits (shortened)🗿 Commits: https://github.com/pkncoder/Engine/commits/Phase-IV/ Most Recent: Temporary Save"}, {"post_id": 50519, "ts": "2026-08-19T18:20:39Z", "hours": 5.6344, "text": "—————– Devlog XVIII —————– - 🌲 Trees 🧚♀️ - 👩💻 SO MUCH REWRITING 💀- To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ These last few days, I’ve been working on getting my Rasterizer (drawing triangles of a model on screen and coloring them) working. The big changes that I did include: Fixing an issue with textures not loading Updated the Interface for every Renderer. Implemented the extract / prepare / dispatch pipeline into the Rasterizer for real now. Started working on the base ideas of a “Shader Graph” The issue with textures was just moving a line like 3 lines lower . I was freeing the image data before saving it (oops) . The updated interface is the IRenderer class. Each Renderer bases off of the class, supplying it with a framework so each Renderer can be talked to the same way. Here are some of those functions: beginFrame - Clear previous frame data and prepare for a new frame extract - Take raw scene data ( camera , renderables ) and convert it into packets for the next step. prepare - Take each packet from extract and turn them into draw commands for dispatch. dispatch - Take each draw command and send a draw call, along the way binding any textures & uniforms. postProcess - Take the frame and post-process it. This may be removed. present - Take the rendered frame and show it to the screen ( blit it ). To do a quick review on what the Shader Graph is - it is a collection of “nodes,” each with their own inputs and outputs that connect together to render out a frame. I’m still a bit confused, but I’ve been watching presentations on the topic from companies like Unity & Activision . Thank You for Reading Yea, I know it’s been a while since my last devlog. I’ve been making some posts in slack about my Path Tracer, since I spent a little time on that. I’m looking at the timing for everything , the hope is to ship this at the end of Phase-IV and hope that I can get a UI working before too late. I’m hoping I can get enough stardust to pay for a new laptop, but idk that’s a long shot. I still have about 25 more hours if I get a 16x mult (which I can only hope for) before I would hit the mark for the FW 12, which isn’t crazy (the mult is tho). Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Stop the program from crashing to reach a black screen Rewrite shaders to allow for correct models wo/ shadows Write the shadow cubemap geometry shader & ad it to the OpaquePass (temp main pass) Make and debug UBOs replacing base uniforms 🥀 Git Commits (shortened)🗿 https://github.com/pkncoder/Engine/commits/Phase-IV/"}, {"post_id": 45347, "ts": "2026-08-11T18:54:11Z", "hours": 2.9381, "text": "—————– Devlog XVII —————– - Strange Hours - To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ To start off, I did not work directly on my application, but the online demo . It’s like working on the website, but through another editor sometimes. The goal of the Path Tracer is to eventaully get it clean & quick enough to be real-time. This is the first of the 5 renderers that I will be making. I was working on my online shadertoy DEMO for the Path Tracer, specifically the denoiser. The name of the denoiser I am using is the “Edge-Avoiding Á Trous Wavelet Transform” . As a quick overview: It applies a blur “ with holes ” to allow for less to no image distortion Fast enough for realtime Includes “ weights ” based on (in my code): Normal , Depth , and Color . The larger the difference between the center pixel and the scanned pixel * (kernel), the more weight is applied, lessening the amount of blur. This is amazing, however when the camera moves , the denoiser assumes that the current and previous pixel are in the same world postion (when it isn’t). This causes errors when trying to overlay the image and gather data. This is why we track the motion of the camera, creating a vector to get the same world position pixel. I got this wrong on one of the first attempts, the last attachment (videos are compressed) shows that fun video (warning for those who get motion sick). With this, I am able to blur the image, and with some more techniques, I can get rid of “ghosting.” Thank You for Reading In the videos, I rendered them in fullscreen 4k on my better laptop+GPU, don’t worry about your system being too slow, just don’t fullscreen it <3 (the development was done on my lower end mac). The hours logged are from refactoring the project after the last devlog, and editing the code when I didn’t do it in shadertoy’s editor. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🥀 Git Commits 🗿 BREAKING CHANGE - Refactored Buffer & GPUResource managers + IRenderer - Code has been broken for a bit but womp womp Shadertoy shaders path tracer https://www.shadertoy.com/view/7fBSzR"}, {"post_id": 44514, "ts": "2026-08-10T10:13:23Z", "hours": 4.0428, "text": "—————– Devlog XVI —————– So long , gay Bowser ⭐️ – IRenderer, hardly know her? - To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ⭐️ BEFORE ANYTHING - Thanks so much to @AVD for the super star, wasn’t expecting it and I really appreciate it 👏 👏. Now, for what I did: Dealt with an issue in Obsidian, as apparently there was “minor rendering performance improvements.” This is FALSE :( - I just downgraded the version Created the new BufferManager to handle UBOs, SSBOs, VBOs, EBOs, etc. + Dynamic, Static, and Stream buffers. Integrated the RenderTarget & ShaderPass system from PathTracer straight into IRenderer + added base utilities to it. Did some formatting Overall the two big things that I did was the new Buffer system & the updated IRenderer interface. For the new Buffers, previously I had UBOs (dynamic values) & SSBOs (big mostly static information blocks) set up in seperate files, that BufferManager returned. Now, every buffer is a single struct called GPUBuffer , and GPUBuffer has a type, and a usage (see attached photo). Now everything is centralized on that. For the new IRenderer interface, now there are RenderTargets - textures that shaders write to as output - and ShaderPasses - A pass of a shader. These can be added to a registry, keyed by a UUID (big number, in this case). Thanks for reading Again, thanks so much to AVD for the super star! I’m excited for when I can finally start writing my shaders, it’s getting closer & closer!! The fancy Path Tracer will be cool and all, but I have big plans for the Ray Marcher!! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🥀 Git Commits 🗿 Fixed an obsidian issue I ran into, “Minor rendering performance improvements.” was NOT true, broke almost the entire canvas. Fixed it though + new png Created the new buffer managegr system, I need to go through and make changes. Also, on launch there was more blacked out sections, different every launch :( New IRenderer setup for the render targets & render handles Refactor 1-6 Refactor 7-9 for BufferManager"}, {"post_id": 42396, "ts": "2026-08-07T02:46:23Z", "hours": 5.3317, "text": "—————– Devlog XV —————– – Temp code go brrrrr 🔋 - New term : “Far Landing” – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ I tried getting this out before 4 hours, but it just –wouldn’t__ happen. Weird errors kept popping up ( mostly being my fault) . Here’s a list of what I did: Figured out generally how I was going to deal with uploading and caching meshes + textures Put the new GPUResourceManager class into place to do the previously mentioned job Started reworking the renderer pipeline (NOT THE RENDER PIPELINE) on CPU side, and set up the interface class with that Patched together the old Rasterizer renderer to work with the new IRenderer pipeline Fixed errors throughout Split up normal & bump textures Planned out how I will deal with all the different textures on the shader side, cutting the checks out at shader compile time Yea, I know, it’s a lot . It just felt wrong to create a devlog in the middle of everything, since up until after fixing errors I had nothing to show for it. :( I ran into this errors when fixing those errors, where the entire model (I was using the Sponza scene, check the attached video ) was banded, where parts “didn’t exist” and the other bands did . This reminded me a lot of the “Minecraft Farlands” specifically the pocket edition ones. 🔥 What didn’t I do? 💥 To keep this brief: Fully split up the SSBO system in the BufferManager Reimplement good use cases of UBOs (although I did put in place double buffering) Add the more sophicticated data handling in the PathTracer (as I commented it’s existance out so I could complile). Figure out how shadow mapping is going to be cleaned up in the Rasterizer. ❤️ Thanks for reading! These devlogs have been getting more attention, and I’m getting closer to doing a rebrand to finally get my point and final ideas across! :3 Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🥀 Git commits 🗿 Patched in the “new” buffer system - Really just to get it to compile before I do anything big. Attempting to run the app to test resources & scene Well it compiles, runs, and renders. I still need to go through all the models, HOWEVER, I am having an issue with like 3 models in sponza and bump UGH Well, I checked Phase-III, and the issue with those models are there too, probally some texture coord issue or the bump map is messed up (I’ll check in blender), BUT THEN ON FIRST LOAD THE MODEL FRA LANDED????"}, {"post_id": 40154, "ts": "2026-08-03T15:39:36Z", "hours": 3.0697, "text": "—————– Devlog XIV —————– The Planning - The possible NEW NAME??? - The New Project!! To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ So What Happened? 📸 I haven’t done much pure coding, HOWEVER , I am getting ready for some large-scale rewrites and additions to the code. For what has happened: Fully sectioned the resource - disk - and scene - cpu/logic - directories (folders) so there wasn’t any GPU actions taken place. Refactored resource and scene directories Re-implemented Application into CMakeLists so I can compile and link that file. Did some planning for the huge renderer rewrite that is coming up. Along with all of that, I came up with a possible name for the application (since, surprisingly, Tempname: Engine is a temp name) I had it when when gazing at the sun through some clouds over a feild. Although it is super basic, so I’m going to have to play with it. ❤️ Thanks for Reading!!! I might have to take a bit of a break from progress on this project, as I have a website that I’m making for my local fire dept. (look out for a new stardance project)! I’m also planning on doing some re-marketing / re-branding (idk what to call it) to change the descriptions of the project (ex. the “To recap section on my devlogs, and the landing page). I’ve been getting more questions on it, and my current explanations are a bit too much. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🗿 Commits 🥀 (top-oldest : bottom-newest) No more mention of buffer manager or any uploading to gpu in scene & assets. Meshes are now split up from models in the cache, models hold refrences to asset handles to meshes. Refactored and fixed errors in scene and resources. The program won’t work, as only scene and resources are being compiled & linked Added application back into the mix & fixed the scene loading section. Did some planning on how a model will go from spawn to render"}, {"post_id": 38683, "ts": "2026-08-01T06:03:47Z", "hours": 3.0264, "text": "—————– Devlog XIII —————– Spent some time off from working on this project, started the beginnings of another one. Finally ended up getting the interest to come back to this one To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). 💡 Overview Commit message for this devlog: BREAKING CHANGE - New asset system, new scene system, renamed SceneLoader to PrefabSpawner, still need to update rest of code with temp fix until reworking for new system. ✨ What did I do? Previously, the asset manager did still handle caching already loaded assets (models, materials, textures), however the implementation was not professional and temporary: Caching based on a string key (slow) Broke the “single responsibility principal” many times by uploading to the GPU & constructing Scene objects Now, I am using AssetHandles (UUIDs) for caching, and I no longer uploading to the GPU in AssetManager. ❌ What didn’t I do? This new system is a good start for realigning and separating the different parts of the program, but is only about a third of the work. For what I still need to do, this is what follows: Stop uploading to the GPU in the PrefabSpawner (scene) Fix the renderer and find where I will upload the mesh & texture data. Check for compilation and working across the whole project. Change every instance of AssetManager to using AssetHandles. Once I have these, I can move onto redoing the renderers and FINALLY start working on the “fun stuff” ❤️ Thanks for reading Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 36073, "ts": "2026-07-27T22:33:56Z", "hours": 1.5831, "text": "—————– Devlog XII —————– I haven’t done as much programing recently, but yesterday I wanted to finish what I needed to do quickly, as it wouldn’t take that long. To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). 🎯 UUIDs For a quick explanation of what a UUID is: UUID stands for Universally Unique Identifier. In practice it is a random alphanumeric (a-z,0-9) ID between 64-128 bits. For my project, I used an unsigned 64 bit integer (no negative numbers). It isn’t exactly what the standard for a UUID is, as it isn’t alphanumeric, but I think for now 18.4 quintillion ids are just fine. ⬆️ What Next?? Now that I’ve finished this, the next step is to gut & rewrite the entire asset managing system. I need to redo how files are found, how data is stored, how they are retrieved. Basically the CRUD (create, read, update, delete) line and more. ❤️ Thanks for reading Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 32890, "ts": "2026-07-22T10:48:43Z", "hours": 6.8567, "text": "—————– Devlog XI —————– I haven’t been programming as much, as marching band 🎺 has started, so I’ve had less time. But now I can do the really exiting stuff! To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). What did I Do? As I mentioned in the last devlog, I have been working on doing a full passthrough of the entire project to get ready for major rewrites. I have completed by refactor checklist, so I have gone through ever cpp file to: Fix warnings Check object method & attribute visibility Check const, static, and inline declarations Change the placement and formatting of method Going through every line of code to do minor logic changes & change formatting Rename methods, attributes, functions, and variables to better names & names w/ personal conventions. Add comments everywhere Change the placement of the #include statements (main header file, object interfaces, project files, project packages, extra C++ headers) Run a full clean, compile, and test of the application The LIE Technically I didn’t go through every file, as I left AssetManager & Rasterizer . Since these will be completely rewrote soon I felt like it was a waste. What next? Now that I have finished cleaning up the code base, the next projects are to: Move to using UUIDs instead of an entity index in scene Gut AssetManager and rewrite it Change to using metafiles instead of a preditermined path to assets Rework the scene class Extend IRenderer and get ready for the fun part! Thanks for reading! I tried to keep this one shorter for y’all. I don’t normally get too much attention to my devlogs, but I would be more than happy to answer any questions, as there is so much more to this project that even the landing page doesn’t cover (WIP). If you’re curious, feel free to reach out on slack (pkncoder), and here are some extra links about the project: Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine"}, {"post_id": 29073, "ts": "2026-07-15T18:41:40Z", "hours": 4.3689, "text": "—————– Devlog X —————– I’ve been working on refactoring my project for the last few hours. Part of how I code includes: Comments throughout to explain the code, strict formatting throughout, and trying to help the compiler with “const” and “inline” keywords. To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). The process My process of refactoring usually happens once I finish a new addition, however I haven’t been adding new things for a while. Now that I’ve added a new addition to the project (Event system & LayerStack), I want to go through the entire codebase under the src/ directory (not the glsl shaders). Project code stats (src/ directory) Running the command line utility “cloc” on my src/ directory to count code stats, I get these counts: ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- C++ 23 646 464 1930 C/C++ Header 47 506 205 1302 ------------------------------------------------------------------------------- SUM: 70 1152 669 3232 ------------------------------------------------------------------------------- Not very big yet, although that will be increased once I get to redoing the entire rendering engine. What I have done Now, back to my refactoring. I got through the basics: removing warnings, double checking the public/private attribute declarations on classes & structs, setting const on functions & params, setting inline on functions. The checklist This is my entire checklist for refactors, this is my first project using it, so it is still being worked on: ### Refactor Checklist (src/) 1. [x] Fix warnings 2. [x] Fix public vs. private 3. [x] Make functions const when needed 4. [x] Make function params const when needed 5. [x] Make functions inline when needed 6. [ ] Fix placement of functions 7. [ ] Refactor step by step in code 8. [ ] Rename things 9. [ ] Add comments 10. [ ] Place the \\#includes in the right spots 11. [ ] Fix file tree 12. [ ] Run ```./fullTest``` 13. [ ] Update the obsidian canvas & png 14. [ ] Update the website Eventually I will also need to make one for the shaders too, as they are sometimes more technical on the code side. Conclusion That’s all that I’ve been doing, thanks for reading. Here is my Github repo & landing page for this application: Source Code: https://github.com/pkncoder/Engine Landing Page: https://pkncoder.github.io/Engine"}, {"post_id": 27729, "ts": "2026-07-13T15:23:24Z", "hours": 8.2792, "text": "Devlog IX I have been working the past week to get the Event system working & trying to fix pointer / referance issues (there are still a few I haven’t figured out). But now I have a working event system. To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). LayerStack recap In my previous devlog, I explained the Layer Stack 🥞, a top-down structure for controlling object ownership and main loop execution. Every frame, the layer stack runs the first layer to poll camera movement inputs (temp), and then next layer is ran to render out the frame through the RendererManager. Events This is great, but where the layer stack really shines is the event system . Events are reactions to when anything happens, keys being pressed / released, the window resizing, etc. When an event is dispatched, the layerstack stops, loops through each layer running it’s “onEvent” function to let that layer react (ex. the final render needing it’s texture resized). If a layer doesn’t want below layers to react to the event, it can consume it, stopping the event dispatching and continuing execution. Struggle and Pointer Nonsense I struggled a ton with the event state not updating correctly, and the camera not giving the right values to render the triangles. It turned out to be objects/classes duplicating, and not being able to update. There is so many debug messages in the terminal 😭 Ends This was all front-end changes (no change in the render), but now there is a better system put in place (back end changes). Github repo: https://github.com/pkncoder/Engine/tree/Phase-IV Landing page / Website: https://pkncoder.github.io/Engine/"}, {"post_id": 23348, "ts": "2026-07-06T07:48:30Z", "hours": 11.7481, "text": "Tempname: Engine update. I am so tired To keep it all contained, since the last devlog I have: Merged Phase-III into main & created a Phase-IV branch Changed the landing page’s color palette Modified the target architecture 4 times (3 committed) Created a rudimentary SceneManager class Implemented an EngineContext class to distribute ownership & to help with data flow+containment Implemented a layer system to help cut down on application & to contain/host the events system. Finally put in the system directory (folder) in the architecture that will host any simulations, computations, and animations. Currently it is the planned details for the camera system. The biggest thing that I have done so far is the layer system & state/context creation. The context of the engine lets managers talk to each other so everything can work together, while keeping everything contained. The state is split up into two parts, state & settings (or state & configuration). The state is meant for information that is meant to change throughout runtime, and the engine depends on it to render the right final result (ex. camera state & position). The settings part is meant for variables that won’t change too much, but if they do it is something that is a large modification to the runtime (ex. window title, rendering engine). The layer system is like a regenerating stack of pancakes 🥞. Before you cast your pancake regeneration spell we all have, you have to prep the pancakes with butter and syrup. Each time you finish the pancakes, a new round starts and you eat them again. Then, once you are done, you have to disable the regeneration spell. The layer system acts the same, but computationally & layers instead of pancakes. Each layer goes through the lifecycle of onAttach -> onUpdate -> onDetach. By far the biggest reason for the layer system is the event system, but I’ll leave that for the next devlog. Here is the github page: https://github.com/pkncoder/Engine/tree/Phase-IV Here is the landing page: https://pkncoder.github.io/Engine/ I still have soooo much to do, especially with & after the event system. I’ve completed most of the easy stuff for Phase-IV. Here is the current architecture & a site screenshot."}, {"post_id": 19362, "ts": "2026-06-30T17:15:23Z", "hours": 5.5031, "text": "Changed my mind on shipping, however I do now have a landing page! I still have to do things like changing the color palette (it’s alright now, but I want something different I think), adding little details to really sell the “Rendering” aspect of Tempname: Engine, etc. etc. Here’s the landing page, please check it out & give any feedback! https://pkncoder.github.io/Engine/index.html Since I changed my mind on shipping, here are those images that I was going to use!"}, {"post_id": 18091, "ts": "2026-06-29T02:57:38Z", "hours": 8.6825, "text": "Just got done with some renders on the engine, been working all day on implementing the things needed. Along with the images, I added: Shadow Mapping for the Rasterizer (only 1 emitter) Tone mapping to the Rasterizer Fog to the Rasterizer A vignette effect to the Rasterizer Transparency maps to the Rasterizer Settings & presets for the renders A new “Queer Room” modeled by me in blender for the Path Tracer (going to post it on ship). I honestly have had so much fun with this. Currently working on a landing page to go in place of my “Online Demo” on stardance (since this isn’t that kind of application D: ). Here’s the github: https://github.com/pkncoder/Engine/tree/Phase-III ! At some point I’ll be redoing the README as well for more info. Also, these images aren’t even the best ones, I’ll leave that for the ship :3"}, {"post_id": 16960, "ts": "2026-06-27T15:16:34Z", "hours": 1.2764, "text": "I’ve done a bunch more Todos in my code, getting ready for shipping Phase-III. However, I realized I forgot in my planned Architechture about Acceleration structures (which are very important). So I planned that out! Currently just: BVH (Bounding Volume Heirarchy) for Ray & Path Tracing SVO (Sparse Voxel Octree) for Ray Marching (Hypothetically) These acceleration structures make rendering methods like Ray & Path Tracing, Ray Marching, Ray Casting, etc. feasible for real-time by “cutting out” data (objects) similar to how a Binary Tree works. Next is more clean up, then creating models for some renders I can use in the banner of this + the github Readme, and finally creating a landing page to put in place of the online demo! Then I can finally ship!!!! Here’s the github (ignore main branch): https://github.com/pkncoder/Engine/tree/Phase-III ."}, {"post_id": 16713, "ts": "2026-06-27T04:43:42Z", "hours": 17.5281, "text": "Working on finishing the current development phase, of my project, which also means finally shipping Tempname Engine: Phase-III. I wanted to plan out Phase IV a little bit more, which will focus on: Getting a structured scene management system Improving the Renderer (ability & architecture) + adding 2 new Renderers Adding scene loading & serialization (and “asset serialization” which is weird name) Here is the current & planned architectures of Phase III & Phase IV, at some point I need to redo Phase-III’s to match the style, but I’m tired of working in obsidian to not even get the hours logged."}, {"post_id": 11788, "ts": "2026-06-19T05:50:41Z", "hours": 7.56, "text": "I have finished getting albedo (basic color) textures loading! To get this working I had to redo how meshes were loaded completely, but I finally finished that. The backrooms model was an issue, as I needed to find one that would work, and then fix it in blender, but I’m glad it’s rendering! As for the promised model of the oiiaioooooiai cat 🐈 (Ethel), I did get the model & textures, but I will have to mess with it more, as the model & texture do not line up yet. If you would like to try for yourself, the github repo is here: https://github.com/pkncoder/Engine/tree/Phase-III . The repo is large currently, as I still need to compress the files, or remove them (gitignore). The path tracer is currently disabled , as I need to swap the textures to handles, and then modify the path tracer to work with the textures. It will look really good once I get that working though!"}, {"post_id": 10063, "ts": "2026-06-16T17:20:32Z", "hours": 2.4, "text": "I haven’t done much work on getting textures or anything, however I was able to re-do the shaders. Just some framework stuff like abstracting the shader models so each renderer can implement them to their need. I also spent some more time getting some generic formatting stuff like naming conventions (mostly naming conventions) I also made an “architecture” diagram, as I was requested for one (plus I needed one anyways). Anything purple (besides the background) is a temporary connection/file. Anything green needs re-worked The “Services” group contains files that are completely static in use, and are accessible globally. It’s still a bit messy, but that’s partly due to the temporary/need re-worked files. There’s a still some spaghetti code due to that. The shader files do look a lot like spaghetti as well, but that is mostly do to positioning. It’s pretty basic, as the ui/ and system/ dirs aren’t in there either (system/ is simulations + any computations that would need to be done (ex. translating data for one renderer to another)). I made the image in Obsidian’s canvas, sadly the wakatime add-on wasn’t working for me, so that time didn’t get counted, but oh well. And if the image is cut-off for you, the Services block has Input.cpp, Timer.cpp, and Logger.cpp. I still have a lot of shader work to redo, but I might try to get textures working soon for the Rasterizer, as I’m wanting them more & more."}, {"post_id": 9647, "ts": "2026-06-16T01:45:44Z", "hours": 19.2833, "text": "Hey everyone, I’m Kia! 👋 I’m currently building a custom 3D Engine from the ground up. While it’s definitely a fun passion project, it’s designed to be a genuinely powerful and useful tool. The scope of this project is pretty massive, but here are the main goals I’m chasing right now: 🎨 Multi-Style Rendering: I want this engine to render scenes in highly stylized ways using a variety of techniques. Currently planning support for: Rasterization Path Tracing Ray Marching Ray Casting (Voxels) Simple and easy: No one likes being thrown to the wolves. The engine will feature a clean, simple UI that scales in complexity as you learn how to use it, rather than overwhelming you right at the start. Accessible Animation: Built-in tools for animations and simulations that are actually easy to understand and use. 🛠️ Latest Update: Path Tracer Rewrite I recently did a complete rewrite of the Path Tracer! This was a massive step to future-proof the engine. It now supports multiple shader passes, debug textures, and is fully prepped for texture mapping. Why am I so excited about getting textures working? Because the second they drop, I am immediately rendering 1) The Backrooms 🟨 and 2) the spinning “Oiiaioooooiai” cat 🐈. Texture support should be ready very soon! Want to check it out (please do)? 💻 GitHub: Check out the code and the todo.md to see what I’m working on next: https://github.com/pkncoder/Engine/tree/Phase-III 🎮 Live Demo: Try out my almost real-time Path Tracer right in your browser (click and drag to look around): Shadertoy Path Tracer Demo: https://www.shadertoy.com/view/7fBSzR"}]...
|
Title: Tempname: Engine by @pkncoder | Stardance
Title: Tempname: Engine by @pkncoder | Stardance
Devlogs:
Hey everyone, I’m Kia! 👋 I’m currently building a custom 3D Engine from the ground up. While it’s definitely a fun passion project, it’s designed to be a genuinely powerful and useful tool. The scope of this project is pretty massive, but here are the main goals I’m chasing right now: 🎨 Multi-Style Rendering: I want this engine to render scenes in highly stylized ways using a variety of techniques. Currently planning support for: Rasterization Path Tracing Ray Marching Ray Casting (Voxels) Simple and easy: No one likes being thrown to the wolves. The engine will feature a clean, simple UI that scales in complexity as you learn how to use it, rather than overwhelming you right at the start. Accessible Animation: Built-in tools for animations and simulations that are actually easy to understand and use. 🛠️ Latest Update: Path Tracer Rewrite I recently did a complete rewrite of the Path Tracer! This was a massive step to future-proof the engine. It now supports multiple shader passes, debug textures, and is fully prepped for texture mapping. Why am I so excited about getting textures working? Because the second they drop, I am immediately rendering 1) The Backrooms 🟨 and 2) the spinning “Oiiaioooooiai” cat 🐈. Texture support should be ready very soon! Want to check it out (please do)? 💻 GitHub: Check out the code and the todo.md to see what I’m working on next: https://github.com/pkncoder/Engine/tree/Phase-III 🎮 Live Demo: Try out my almost real-time Path Tracer right in your browser (click and drag to look around): Shadertoy Path Tracer Demo: https://www.shadertoy.com/view/7fBSzR
I haven’t done much work on getting textures or anything, however I was able to re-do the shaders. Just some framework stuff like abstracting the shader models so each renderer can implement them to their need. I also spent some more time getting some generic formatting stuff like naming conventions (mostly naming conventions) I also made an “architecture” diagram, as I was requested for one (plus I needed one anyways). Anything purple (besides the background) is a temporary connection/file. Anything green needs re-worked The “Services” group contains files that are completely static in use, and are accessible globally. It’s still a bit messy, but that’s partly due to the temporary/need re-worked files. There’s a still some spaghetti code due to that. The shader files do look a lot like spaghetti as well, but that is mostly do to positioning. It’s pretty basic, as the ui/ and system/ dirs aren’t in there either (system/ is simulations + any computations that would need to be done (ex. translating data for one renderer to another)). I made the image in Obsidian’s canvas, sadly the wakatime add-on wasn’t working for me, so that time didn’t get counted, but oh well. And if the image is cut-off for you, the Services block has Input.cpp, Timer.cpp, and Logger.cpp. I still have a lot of shader work to redo, but I might try to get textures working soon for the Rasterizer, as I’m wanting them more & more.
I have finished getting albedo (basic color) textures loading! To get this working I had to redo how meshes were loaded completely, but I finally finished that. The backrooms model was an issue, as I needed to find one that would work, and then fix it in blender, but I’m glad it’s rendering! As for the promised model of the oiiaioooooiai cat 🐈 (Ethel), I did get the model & textures, but I will have to mess with it more, as the model & texture do not line up yet. If you would like to try for yourself, the github repo is here: https://github.com/pkncoder/Engine/tree/Phase-III . The repo is large currently, as I still need to compress the files, or remove them (gitignore). The path tracer is currently disabled , as I need to swap the textures to handles, and then modify the path tracer to work with the textures. It will look really good once I get that working though!
Working on finishing the current development phase, of my project, which also means finally shipping Tempname Engine: Phase-III. I wanted to plan out Phase IV a little bit more, which will focus on: Getting a structured scene management system Improving the Renderer (ability & architecture) + adding 2 new Renderers Adding scene loading & serialization (and “asset serialization” which is weird name) Here is the current & planned architectures of Phase III & Phase IV, at some point I need to redo Phase-III’s to match the style, but I’m tired of working in obsidian to not even get the hours logged.
I’ve done a bunch more Todos in my code, getting ready for shipping Phase-III. However, I realized I forgot in my planned Architechture about Acceleration structures (which are very important). So I planned that out! Currently just: BVH (Bounding Volume Heirarchy) for Ray & Path Tracing SVO (Sparse Voxel Octree) for Ray Marching (Hypothetically) These acceleration structures make rendering methods like Ray & Path Tracing, Ray Marching, Ray Casting, etc. feasible for real-time by “cutting out” data (objects) similar to how a Binary Tree works. Next is more clean up, then creating models for some renders I can use in the banner of this + the github Readme, and finally creating a landing page to put in place of the online demo! Then I can finally ship!!!! Here’s the github (ignore main branch): https://github.com/pkncoder/Engine/tree/Phase-III .
Just got done with some renders on the engine, been working all day on implementing the things needed. Along with the images, I added: Shadow Mapping for the Rasterizer (only 1 emitter) Tone mapping to the Rasterizer Fog to the Rasterizer A vignette effect to the Rasterizer Transparency maps to the Rasterizer Settings & presets for the renders A new “Queer Room” modeled by me in blender for the Path Tracer (going to post it on ship). I honestly have had so much fun with this. Currently working on a landing page to go in place of my “Online Demo” on stardance (since this isn’t that kind of application D: ). Here’s the github: https://github.com/pkncoder/Engine/tree/Phase-III ! At some point I’ll be redoing the README as well for more info. Also, these images aren’t even the best ones, I’ll leave that for the ship :3
Changed my mind on shipping, however I do now have a landing page! I still have to do things like changing the color palette (it’s alright now, but I want something different I think), adding little details to really sell the “Rendering” aspect of Tempname: Engine, etc. etc. Here’s the landing page, please check it out & give any feedback! https://pkncoder.github.io/Engine/index.html Since I changed my mind on shipping, here are those images that I was going to use!
Tempname: Engine update. I am so tired To keep it all contained, since the last devlog I have: Merged Phase-III into main & created a Phase-IV branch Changed the landing page’s color palette Modified the target architecture 4 times (3 committed) Created a rudimentary SceneManager class Implemented an EngineContext class to distribute ownership & to help with data flow+containment Implemented a layer system to help cut down on application & to contain/host the events system. Finally put in the system directory (folder) in the architecture that will host any simulations, computations, and animations. Currently it is the planned details for the camera system. The biggest thing that I have done so far is the layer system & state/context creation. The context of the engine lets managers talk to each other so everything can work together, while keeping everything contained. The state is split up into two parts, state & settings (or state & configuration). The state is meant for information that is meant to change throughout runtime, and the engine depends on it to render the right final result (ex. camera state & position). The settings part is meant for variables that won’t change too much, but if they do it is something that is a large modification to the runtime (ex. window title, rendering engine). The layer system is like a regenerating stack of pancakes 🥞. Before you cast your pancake regeneration spell we all have, you have to prep the pancakes with butter and syrup. Each time you finish the pancakes, a new round starts and you eat them again. Then, once you are done, you have to disable the regeneration spell. The layer system acts the same, but computationally & layers instead of pancakes. Each layer goes through the lifecycle of onAttach -> onUpdate -> onDetach. By far the biggest reason for the layer system is the event system, but I’ll leave that for the next devlog. Here is the github page: https://github.com/pkncoder/Engine/tree/Phase-IV Here is the landing page: https://pkncoder.github.io/Engine/ I still have soooo much to do, especially with & after the event system. I’ve completed most of the easy stuff for Phase-IV. Here is the current architecture & a site screenshot.
Devlog IX I have been working the past week to get the Event system working & trying to fix pointer / referance issues (there are still a few I haven’t figured out). But now I have a working event system. To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). LayerStack recap In my previous devlog, I explained the Layer Stack 🥞, a top-down structure for controlling object ownership and main loop execution. Every frame, the layer stack runs the first layer to poll camera movement inputs (temp), and then next layer is ran to render out the frame through the RendererManager. Events This is great, but where the layer stack really shines is the event system . Events are reactions to when anything happens, keys being pressed / released, the window resizing, etc. When an event is dispatched, the layerstack stops, loops through each layer running it’s “onEvent” function to let that layer react (ex. the final render needing it’s texture resized). If a layer doesn’t want below layers to react to the event, it can consume it, stopping the event dispatching and continuing execution. Struggle and Pointer Nonsense I struggled a ton with the event state not updating correctly, and the camera not giving the right values to render the triangles. It turned out to be objects/classes duplicating, and not being able to update. There is so many debug messages in the terminal 😭 Ends This was all front-end changes (no change in the render), but now there is a better system put in place (back end changes). Github repo: https://github.com/pkncoder/Engine/tree/Phase-IV Landing page / Website: https://pkncoder.github.io/Engine/
—————– Devlog X —————– I’ve been working on refactoring my project for the last few hours. Part of how I code includes: Comments throughout to explain the code, strict formatting throughout, and trying to help the compiler with “const” and “inline” keywords. To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). The process My process of refactoring usually happens once I finish a new addition, however I haven’t been adding new things for a while. Now that I’ve added a new addition to the project (Event system & LayerStack), I want to go through the entire codebase under the src/ directory (not the glsl shaders). Project code stats (src/ directory) Running the command line utility “cloc” on my src/ directory to count code stats, I get these counts: ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- C++ 23 646 464 1930 C/C++ Header 47 506 205 1302 ------------------------------------------------------------------------------- SUM: 70 1152 669 3232 ------------------------------------------------------------------------------- Not very big yet, although that will be increased once I get to redoing the entire rendering engine. What I have done Now, back to my refactoring. I got through the basics: removing warnings, double checking the public/private attribute declarations on classes & structs, setting const on functions & params, setting inline on functions. The checklist This is my entire checklist for refactors, this is my first project using it, so it is still being worked on: ### Refactor Checklist (src/) 1. [x] Fix warnings 2. [x] Fix public vs. private 3. [x] Make functions const when needed 4. [x] Make function params const when needed 5. [x] Make functions inline when needed 6. [ ] Fix placement of functions 7. [ ] Refactor step by step in code 8. [ ] Rename things 9. [ ] Add comments 10. [ ] Place the \#includes in the right spots 11. [ ] Fix file tree 12. [ ] Run ```./fullTest``` 13. [ ] Update the obsidian canvas & png 14. [ ] Update the website Eventually I will also need to make one for the shaders too, as they are sometimes more technical on the code side. Conclusion That’s all that I’ve been doing, thanks for reading. Here is my Github repo & landing page for this application: Source Code: https://github.com/pkncoder/Engine Landing Page: https://pkncoder.github.io/Engine
—————– Devlog XI —————– I haven’t been programming as much, as marching band 🎺 has started, so I’ve had less time. But now I can do the really exiting stuff! To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). What did I Do? As I mentioned in the last devlog, I have been working on doing a full passthrough of the entire project to get ready for major rewrites. I have completed by refactor checklist, so I have gone through ever cpp file to: Fix warnings Check object method & attribute visibility Check const, static, and inline declarations Change the placement and formatting of method Going through every line of code to do minor logic changes & change formatting Rename methods, attributes, functions, and variables to better names & names w/ personal conventions. Add comments everywhere Change the placement of the #include statements (main header file, object interfaces, project files, project packages, extra C++ headers) Run a full clean, compile, and test of the application The LIE Technically I didn’t go through every file, as I left AssetManager & Rasterizer . Since these will be completely rewrote soon I felt like it was a waste. What next? Now that I have finished cleaning up the code base, the next projects are to: Move to using UUIDs instead of an entity index in scene Gut AssetManager and rewrite it Change to using metafiles instead of a preditermined path to assets Rework the scene class Extend IRenderer and get ready for the fun part! Thanks for reading! I tried to keep this one shorter for y’all. I don’t normally get too much attention to my devlogs, but I would be more than happy to answer any questions, as there is so much more to this project that even the landing page doesn’t cover (WIP). If you’re curious, feel free to reach out on slack (pkncoder), and here are some extra links about the project: Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
—————– Devlog XII —————– I haven’t done as much programing recently, but yesterday I wanted to finish what I needed to do quickly, as it wouldn’t take that long. To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). 🎯 UUIDs For a quick explanation of what a UUID is: UUID stands for Universally Unique Identifier. In practice it is a random alphanumeric (a-z,0-9) ID between 64-128 bits. For my project, I used an unsigned 64 bit integer (no negative numbers). It isn’t exactly what the standard for a UUID is, as it isn’t alphanumeric, but I think for now 18.4 quintillion ids are just fine. ⬆️ What Next?? Now that I’ve finished this, the next step is to gut & rewrite the entire asset managing system. I need to redo how files are found, how data is stored, how they are retrieved. Basically the CRUD (create, read, update, delete) line and more. ❤️ Thanks for reading Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
—————– Devlog XIII —————– Spent some time off from working on this project, started the beginnings of another one. Finally ended up getting the interest to come back to this one To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). 💡 Overview Commit message for this devlog: BREAKING CHANGE - New asset system, new scene system, renamed SceneLoader to PrefabSpawner, still need to update rest of code with temp fix until reworking for new system. ✨ What did I do? Previously, the asset manager did still handle caching already loaded assets (models, materials, textures), however the implementation was not professional and temporary: Caching based on a string key (slow) Broke the “single responsibility principal” many times by uploading to the GPU & constructing Scene objects Now, I am using AssetHandles (UUIDs) for caching, and I no longer uploading to the GPU in AssetManager. ❌ What didn’t I do? This new system is a good start for realigning and separating the different parts of the program, but is only about a third of the work. For what I still need to do, this is what follows: Stop uploading to the GPU in the PrefabSpawner (scene) Fix the renderer and find where I will upload the mesh & texture data. Check for compilation and working across the whole project. Change every instance of AssetManager to using AssetHandles. Once I have these, I can move onto redoing the renderers and FINALLY start working on the “fun stuff” ❤️ Thanks for reading Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
—————– Devlog XIV —————– The Planning - The possible NEW NAME??? - The New Project!! To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ So What Happened? 📸 I haven’t done much pure coding, HOWEVER , I am getting ready for some large-scale rewrites and additions to the code. For what has happened: Fully sectioned the resource - disk - and scene - cpu/logic - directories (folders) so there wasn’t any GPU actions taken place. Refactored resource and scene directories Re-implemented Application into CMakeLists so I can compile and link that file. Did some planning for the huge renderer rewrite that is coming up. Along with all of that, I came up with a possible name for the application (since, surprisingly, Tempname: Engine is a temp name) I had it when when gazing at the sun through some clouds over a feild. Although it is super basic, so I’m going to have to play with it. ❤️ Thanks for Reading!!! I might have to take a bit of a break from progress on this project, as I have a website that I’m making for my local fire dept. (look out for a new stardance project)! I’m also planning on doing some re-marketing / re-branding (idk what to call it) to change the descriptions of the project (ex. the “To recap section on my devlogs, and the landing page). I’ve been getting more questions on it, and my current explanations are a bit too much. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🗿 Commits 🥀 (top-oldest : bottom-newest) No more mention of buffer manager or any uploading to gpu in scene & assets. Meshes are now split up from models in the cache, models hold refrences to asset handles to meshes. Refactored and fixed errors in scene and resources. The program won’t work, as only scene and resources are being compiled & linked Added application back into the mix & fixed the scene loading section. Did some planning on how a model will go from spawn to render
—————– Devlog XV —————– – Temp code go brrrrr 🔋 - New term : “Far Landing” – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ I tried getting this out before 4 hours, but it just –wouldn’t__ happen. Weird errors kept popping up ( mostly being my fault) . Here’s a list of what I did: Figured out generally how I was going to deal with uploading and caching meshes + textures Put the new GPUResourceManager class into place to do the previously mentioned job Started reworking the renderer pipeline (NOT THE RENDER PIPELINE) on CPU side, and set up the interface class with that Patched together the old Rasterizer renderer to work with the new IRenderer pipeline Fixed errors throughout Split up normal & bump textures Planned out how I will deal with all the different textures on the shader side, cutting the checks out at shader compile time Yea, I know, it’s a lot . It just felt wrong to create a devlog in the middle of everything, since up until after fixing errors I had nothing to show for it. :( I ran into this errors when fixing those errors, where the entire model (I was using the Sponza scene, check the attached video ) was banded, where parts “didn’t exist” and the other bands did . This reminded me a lot of the “Minecraft Farlands” specifically the pocket edition ones. 🔥 What didn’t I do? 💥 To keep this brief: Fully split up the SSBO system in the BufferManager Reimplement good use cases of UBOs (although I did put in place double buffering) Add the more sophicticated data handling in the PathTracer (as I commented it’s existance out so I could complile). Figure out how shadow mapping is going to be cleaned up in the Rasterizer. ❤️ Thanks for reading! These devlogs have been getting more attention, and I’m getting closer to doing a rebrand to finally get my point and final ideas across! :3 Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🥀 Git commits 🗿 Patched in the “new” buffer system - Really just to get it to compile before I do anything big. Attempting to run the app to test resources & scene Well it compiles, runs, and renders. I still need to go through all the models, HOWEVER, I am having an issue with like 3 models in sponza and bump UGH Well, I checked Phase-III, and the issue with those models are there too, probally some texture coord issue or the bump map is messed up (I’ll check in blender), BUT THEN ON FIRST LOAD THE MODEL FRA LANDED????
—————– Devlog XVI —————– So long , gay Bowser ⭐️ – IRenderer, hardly know her? - To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ⭐️ BEFORE ANYTHING - Thanks so much to @AVD for the super star, wasn’t expecting it and I really appreciate it 👏 👏. Now, for what I did: Dealt with an issue in Obsidian, as apparently there was “minor rendering performance improvements.” This is FALSE :( - I just downgraded the version Created the new BufferManager to handle UBOs, SSBOs, VBOs, EBOs, etc. + Dynamic, Static, and Stream buffers. Integrated the RenderTarget & ShaderPass system from PathTracer straight into IRenderer + added base utilities to it. Did some formatting Overall the two big things that I did was the new Buffer system & the updated IRenderer interface. For the new Buffers, previously I had UBOs (dynamic values) & SSBOs (big mostly static information blocks) set up in seperate files, that BufferManager returned. Now, every buffer is a single struct called GPUBuffer , and GPUBuffer has a type, and a usage (see attached photo). Now everything is centralized on that. For the new IRenderer interface, now there are RenderTargets - textures that shaders write to as output - and ShaderPasses - A pass of a shader. These can be added to a registry, keyed by a UUID (big number, in this case). Thanks for reading Again, thanks so much to AVD for the super star! I’m excited for when I can finally start writing my shaders, it’s getting closer & closer!! The fancy Path Tracer will be cool and all, but I have big plans for the Ray Marcher!! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🥀 Git Commits 🗿 Fixed an obsidian issue I ran into, “Minor rendering performance improvements.” was NOT true, broke almost the entire canvas. Fixed it though + new png Created the new buffer managegr system, I need to go through and make changes. Also, on launch there was more blacked out sections, different every launch :( New IRenderer setup for the render targets & render handles Refactor 1-6 Refactor 7-9 for BufferManager
—————– Devlog XVII —————– - Strange Hours - To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ To start off, I did not work directly on my application, but the online demo . It’s like working on the website, but through another editor sometimes. The goal of the Path Tracer is to eventaully get it clean & quick enough to be real-time. This is the first of the 5 renderers that I will be making. I was working on my online shadertoy DEMO for the Path Tracer, specifically the denoiser. The name of the denoiser I am using is the “Edge-Avoiding Á Trous Wavelet Transform” . As a quick overview: It applies a blur “ with holes ” to allow for less to no image distortion Fast enough for realtime Includes “ weights ” based on (in my code): Normal , Depth , and Color . The larger the difference between the center pixel and the scanned pixel * (kernel), the more weight is applied, lessening the amount of blur. This is amazing, however when the camera moves , the denoiser assumes that the current and previous pixel are in the same world postion (when it isn’t). This causes errors when trying to overlay the image and gather data. This is why we track the motion of the camera, creating a vector to get the same world position pixel. I got this wrong on one of the first attempts, the last attachment (videos are compressed) shows that fun video (warning for those who get motion sick). With this, I am able to blur the image, and with some more techniques, I can get rid of “ghosting.” Thank You for Reading In the videos, I rendered them in fullscreen 4k on my better laptop+GPU, don’t worry about your system being too slow, just don’t fullscreen it <3 (the development was done on my lower end mac). The hours logged are from refactoring the project after the last devlog, and editing the code when I didn’t do it in shadertoy’s editor. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine 🥀 Git Commits 🗿 BREAKING CHANGE - Refactored Buffer & GPUResource managers + IRenderer - Code has been broken for a bit but womp womp Shadertoy shaders path tracer https://www.shadertoy.com/view/7fBSzR
—————– Devlog XVIII —————– - 🌲 Trees 🧚♀️ - 👩💻 SO MUCH REWRITING 💀- To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ These last few days, I’ve been working on getting my Rasterizer (drawing triangles of a model on screen and coloring them) working. The big changes that I did include: Fixing an issue with textures not loading Updated the Interface for every Renderer. Implemented the extract / prepare / dispatch pipeline into the Rasterizer for real now. Started working on the base ideas of a “Shader Graph” The issue with textures was just moving a line like 3 lines lower . I was freeing the image data before saving it (oops) . The updated interface is the IRenderer class. Each Renderer bases off of the class, supplying it with a framework so each Renderer can be talked to the same way. Here are some of those functions: beginFrame - Clear previous frame data and prepare for a new frame extract - Take raw scene data ( camera , renderables ) and convert it into packets for the next step. prepare - Take each packet from extract and turn them into draw commands for dispatch. dispatch - Take each draw command and send a draw call, along the way binding any textures & uniforms. postProcess - Take the frame and post-process it. This may be removed. present - Take the rendered frame and show it to the screen ( blit it ). To do a quick review on what the Shader Graph is - it is a collection of “nodes,” each with their own inputs and outputs that connect together to render out a frame. I’m still a bit confused, but I’ve been watching presentations on the topic from companies like Unity & Activision . Thank You for Reading Yea, I know it’s been a while since my last devlog. I’ve been making some posts in slack about my Path Tracer, since I spent a little time on that. I’m looking at the timing for everything , the hope is to ship this at the end of Phase-IV and hope that I can get a UI working before too late. I’m hoping I can get enough stardust to pay for a new laptop, but idk that’s a long shot. I still have about 25 more hours if I get a 16x mult (which I can only hope for) before I would hit the mark for the FW 12, which isn’t crazy (the mult is tho). Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Stop the program from crashing to reach a black screen Rewrite shaders to allow for correct models wo/ shadows Write the shadow cubemap geometry shader & ad it to the OpaquePass (temp main pass) Make and debug UBOs replacing base uniforms 🥀 Git Commits (shortened)🗿 https://github.com/pkncoder/Engine/commits/Phase-IV/
—————– Devlog XIX —————– - 🌲 Textuers 🧚♀️ - 👩💻 Shadoowwsss 💀- To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ To recap on what I did: Got the program to launch to black screen I needed to inject the Asset Manager to a class Got objects loading correctly without shadows Got textures to load Started work on fixing the shadow map Nothing too crazy has been changed, the texture issues were about some compatibility problems and not uploading to the same index. The shadow values are uploaded to a 3d texture, where to calculate if an object is in sight or not, we commit triangles based on their position. The problem now is about the far plane, and hitting triangles that weren’t in shadow. I’m not sure what the problem is, but I’m going to do a bit more looking into it. Thank You for Reading :3-blahaj-spinning I still have to fix the shadows issue (obviuosly) but then I can move onto formatting the data (putting it into buffers, creating wrappers, etc).!! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Write the shadow cubemap geometry shader & ad it to the OpaquePass (temp main pass) Make and debug UBOs replacing base uniforms Refactor / clean Create the real Render Graph? 🥀 Git Commits (shortened)🗿 Commits: https://github.com/pkncoder/Engine/commits/Phase-IV/ Most Recent: Temporary Save
—————– Devlog XX —————– – 🌟I have the best one liners 🗿– 🥀 Now I have to be smart ??? 🧠 – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ For the quick overview: Fixed the shadow map issue ( so angry about this, see below ) Fixed an issue with textures not caching Got the very base implementation of Uniform Buffers To start off, in the previous devlog I mentioned I was re-writing the shadow mapping . Shadow Mapping - Rendering a 3d model with the light being the eye. Everything that it can see is not in shadow, everything else is. quick explanation I was having issues with getting the shadows to work correctly. I had ideas for issues, including: (the model matrix , the renderPackets being in a bad order , the far plane ). IT TURNS OUT It was none of these. Whenever I made the code to compile a geometry shader along the vertex & fragment shader, I just copied my old one and spliced in the code. Turns out I forgot to swap some variables, and I was putting code in places it should NOT be at. No idea why it didn’t crash, but it fixed my shadow issues very quick . As for UBOs, I’ll talk about them in a future devlog, when I have everything planned out. Thank You for Reading As I said with “Planning out” everything, I’m going to set up a whiteboard - I’ll have to move my 🏳️🌈 pride flags 🏳️⚧️ :( - Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Refactor Build the big brain wall Do some thinking 🥀 Git Commits🗿 Weird position issue Saving now, I am so angry about this. I was compiling and overwrigting the wrong code :( Made the testing for shadows a bit better, and changed the rendering a bit Fixed issue with textures and full models not actually caching Removed anoying debug line for shadow transform matricies Working on getting the ubos working’ Got it to push First test ubos
—————– Devlog XXI —————– – My brain hurts 🧠 - Sharp like glass – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Sadly, I haven’t done much coding Instead, I’ve been trying to figure out how I want my Render Graph to work. To start, what is a render graph? What I am interpreting the render graph as, issss: An API meant to simplify and provide structure to a final renderer. In the final application, the render graph will be an option for a more advanced final render editor. What I am working on now, is how it will be put together so I don’t have a mess in the future. Recently, I’ve been using Obsidian to mark everything down. This also starts a little docs. Using a mix of Obsidian and the excalidraw plugin, I’m able to write everything down and create visuals. Currently, I have a mix of nodes that are the main important ones. These nodes are just the interfaces , so they aren’t specified. They act as a blueprint for any of the full nodes. IRenderOutput - Add textures to a list of blitables IShaderInput - Base input interface IShaderOutput - Base output interface IShaderNode - Node representation of shaders IShaderPassNode - Base shader interface Thank You for Reading I haven’t been home enough to create the “big brain wall” which is sad, but at least my stuff is digital. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Setup current program for Render Graph implementation Implement IShader, IGPUTexture, etc. Create IRenderGraph for the renderers
—————– Devlog XXII —————– – BrEaKiNg ChaNGeS - 📖 NEW BOOOKKKK – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Sadly, I’ve done much coding Base list This is what I have done since the last devlog: Planned out a bit more on the inner workings from no Renderer->Rendered Image Created the new Shader & Program classes Updated the workings on RendererManager Started work on the new Renderer / IRenderer class Current commit is now broken (compiles, doesn’t run Overview In my new obsidian vault , I’ve been working on creating the new database on how it all works. Through this, I’ve been using excalidraw (Obsidian) to plan out pipelines & create visuals. Currently, I have 2 main drawings: Shader & Program pipeline Renderer Pipeline The Shader & Program pipeline explains the lifetime and usage of both the Shader and Program (OpenGL program) classes. A program gets created, has shaders attached to it (deleting the shader in the process) , and then the program gets linked & binded. The Renderer Pipeline explains the lifetime and usage of a renderer. Starting from the RendererManager, go through normal rendering stuff, and will end at shutting down the RendererManager. For the inner workings of the new renderer setup, I’ll leave that for (hopefully next devlog) when I get everything working start to finish of the RendererPipeline . Thank You for Reading As for the “ New Book I got, I have just purchased “ Game Engine Architecture Vol. I ” (Jason Gregory) to specialize the program more (most likely after Stardance ends). Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Plan out the RenderGraph Create the base RenderGraph class Create the BlitList Create the INodeInput & INodeOutput
—————– Devlog XXIII —————– – I NEED TO HURRY UP AAAA - EnTT - Table – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ In my previous devlog, I stated how I was working on the new RenderGraph . I’ve now realized, that I have like until the end of the week for when I need to ship. So instead , my goal is to get this looking impressive . To start, here is what I’ve done so far : Cleaned up system inits Changed how the UUID service works (now you just access it and call generate ) Implemented a new library, EnTT Did some cleanning up Added a PointLightComponent for future use (no dev. yet) Added and implemented the CameraComponent Here are the big things: EnTT EnTT is an open-source library that handles objects within games, editors, etc. It’s creator is: Michele Caini (skypjack on github) . EnTT is a library that exposes something called an Entity Component System (ECS). Basically, instead of saving a bunch of data directly inside of one struct or class, you define an entity (a unique id) and assign that entity components. The components are what actually gives the entity meaning. New Camera If you have ever ued Blender for a bit, you would know that your camera is on the same list as your meshes. This is since, to Blender, they are inherantly the same thing (don’t quote me on that) . Previously, my camera was seperate to all of the rest of the objects. This caused the data to be split, and handling the differences made my architecture a bit weird. Now that I’ve implemented EnTT , I’ve added a CameraComponent that defines things like rotation, FoV, etc - completely erasing the need for a separate camera, and opening the doors to more flexibility. Thank You for Reading New book is great! I won’t get to use too much of it for stardance, but I’m checking out this snowglobe thing that seems like it would be the next area!! Wish me luck on the ship. I want to get it out by the end of the week so I can hopefully still cache in some stardust. Probally won’t get the computer though (high hopes for a living or smthin idk) Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine ❓ What’s next? 🛑 Change my Rasterizer to be a Defered Renderer & implement multiple point lights UI??
—————– Devlog XXIV —————– – i HATE shadow maps!!! - Renderer? I hardly know her? – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ WOAH A lot has happened. Previously, I had just implemented a new entity system & a new camera system. So what’s new? I present: The Deferred Renderer !!! Basically, it’s just another way of rendering. HOWEVER , it has some funzies: Mostly together render graph, just a little smthin Shadow Pass G-Buffer Pass Lighting Pass New point lights (replacing the emmissive texture searching before) Looking to add SSAO (hemisphere sampling) in the future!! Now, along with this, I just tested creating a build for windows and testing it on a friends machine, and it worked (his laptop is crap, so it ran slow, but surprisingly fast) . Along with that, I also tried the current build on mac, and it also worked, so that’s also great (I’m supprised)!! However, the real prize, is the trypophobia horrors made along the way!! That’s right! When trying to get textures to work, I ran into a ton of problems (mostly related to the alpha map & image formats) that caused major headaches. Images and videos, where they are a bit compressed, can be found below. Thank You for Reading Almost there, I still need to change up the landing page, rewrite the readme, and merge the main branch, plus try to get a way to change the 3d models for users, but I’m getting there. Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
—————– Devlog XXV —————– – New JSON scene file 📁 - SHIP TIMEEEEE – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Not that much has happened tbh. All that has really happened… Updated the README a bit more Added a new json parser to spawn the scene from that Added hot reloading of the scene So yea, next should be the ship. When updating the README on the github, I was going through the Usage section, and added a new promise for how people could add their own meshes. In this I created the idea of activeScene.json , a JSON file that listed the scene data (crazy, right?). And so, after I updated the README , I added the new loader, and made the scene reload by pressing the “ r ” key. That’s kinda it… Thank You for Reading Before shipping, I need to… Do another update of the README Create the base Releases for Mac, Windows, and Linux And test these Do a pass through TODO.md Update the landing page Shouldn’t take too long Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
—————– Devlog XXVI —————– - - Almost… there – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ In order to show the capabilites, I’ve been setting up scenes for my engine to show off, and here are some of the results! It would be great to get your favorite render of these! For the full 9 renders , check out the scrapbook in the slack , as they will be there w/ a thread. Thank You for Reading Hopefully will actually ship tmwr! I’m actually getting kind of sad, I won’t be stopping development by any means, but this has been my summer (although I might not be able to get any stardance tokens, but that’s ok ig…). If you have any questions, feel free to DM me either here, or at @pkncoder on discord if that’s easier for you! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
—————– Devlog XXVII —————– - - Release is out testing time – To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). ✨ What did I do? ☀️ Not too much has happened, mostly: Updated README (resources, gallery, installation & use) Updated the landing page (added a tech-stack) Created my first release under the 1.3.x alpha title That big 1.3.x “alpha” release is the big one, as I need some help. If you could just take a bit of time, and you aren’t on linux-arm or apple-intel, could you check out the github releases and try it out, that would be great! I plan to ship tmwr, but I want some testing done first. Thank You for Reading So close!! Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine
Ships:
—————– Ship #1 —————– - - Welcome - To recap, my project is a custom made rendering engine that focuses on diverse rendering options along with high stylistic control (very high-level explanation). 💚 The current state 💫 There is still no UI, all render control is based in a JSON file. The current only renderer is a custom Deferred Renderer. Note: As this is built for 3d rendering, a modern computer, with a GPU is recommended. Modern Macbooks will run it, however it will be slower as it is basically magic that it works on them. Thank you so much! I’ve spent a lot of time on this. It may not seem like that, however when building this, I decided to do it right (as this is my 3rd attempt). I split the development into phases: Get a window Get something rendering + a camera Get object/material/texture loaders + basic scene managers + basic concept of working Create full scale (professional) renderers/scene managers/resource managers/etc. Get a UI Currently, I’m in getting everything polished in the backend. I didn’t want to move on to the UI, as I didn’t want to rush that. Rushing a UI meant missing other things. So thank you, and I really hope you enjoy. If there are any issues, please report them to the issues page on the github, and message me on slack ( @pkncoder ). Github releases: https://github.com/pkncoder/Engine/releases Github repo: https://github.com/pkncoder/Engine Project landing page: https://pkncoder.github.io/Engine...
|
1792853732.3869977
|
1792940132.3869977
|
|
508
|
Slime Simulator by @RespectableDot | Stardance
|
RespectableDot
|
1
|
166.0
|
3195
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-05T19:22:45Z", "hours": 166.0, "multiplier": 19.34, "payout": 3195, "blessing": "neutral", "text": "A simulator that is about making crazy slimes through natural selection, evolution, and genetic engineering. One thing that made this project challenging was the slime pathfinding. To solve this, I used the A* pathfinding technique. Something I am proud of is the art style. I worked very hard on it and I think it look good. To test my project, just click on the demo link. Thank you to the people who supported and suggested good ideas to the project!", "repo": "https://github.com/Aidnpatrick/Slime-Hub", "demo": "https://respectabledot.itch.io/slime-simulator"}]...
|
[{"post_id": 41491, "ts": "202 [{"post_id": 41491, "ts": "2026-08-05T18:49:31Z", "hours": 3.4703, "text": "Sound! Devlog 35 This will be a short devlog because I don’t know what else to say. Sounds effects I added inside the game: Slime spawning Clicking on slime clicking on ui(button) Slime Noises ocean wind Slime Eating Planting Guns(Lasers, Regular bullets Passive slime noises Active slime noises Night(Crickets) Credit to qubodup and filippe for the slime sound effects."}, {"post_id": 39720, "ts": "2026-08-02T21:12:32Z", "hours": 6.6606, "text": "Optimization and Fixes Devlog 34 2nd to last devlog! Cant wait to ship Things I added: When you press escape or the gear icon at the bottom-right, you can enter the settings page. In here, you can disable or enable features to your likings. This can help run the game faster on lower-end PCs. Placing blocks, plants or effects shows a small special effect. Between and Night, there will be dusk and evening. They will make the sky orange for 15 seconds. There will be more farmers and less unemployed people. Big Fixes: Upgraded the pathfinding system for the slimes. Whenever they are hungry but can’t reach their food, they will find alternate food that is close to them."}, {"post_id": 37321, "ts": "2026-07-29T22:57:14Z", "hours": 7.0725, "text": "Another Batch of Updates Devlog 33 I dont know when to stop this project, I have a lot of things to add… Check out my game here! https://respectabledot.itch.io/slime-simulator Things I added: Day/Night Cycle! Every minute it switches from day to night or vice versa. When at night, slimes and buildings glow so they are easier to see. Also, it looks cool. (The light thing took a long time to figure out) There is a notification bar that tells you what is currently happening in the world. When guns fire, it will create a muzzle flash effect. New Items: FN SCAR: A powerful gun that hits hard. It is kind of inaccurate though. Laser Gun: Its bullets are faster than other guns. Does decent damage."}, {"post_id": 35337, "ts": "2026-07-26T17:35:05Z", "hours": 8.3517, "text": "More Mechanics and Items! Devlog 32 Things I added: Houses are a new building. Currently they don’t really do anything, but later on they can be used for slimes to sleep in. Doctors is a new ability that treats and heal slimes. Their item is a medkit. When you favorite a slime, a star icon will show up above them. This helps keep track of your favorite slimes. Added 8 new cosmetics! New Items! MP5: A submachine gun that fires really fast. Blue staff: A staff that is blue and shoots out 3 blue balls. Katana: The first melee weapon. Does a lot of damage. Medkit: Used by doctors to treat and heal other slimes. M1911: Originally called the pistol. AR-15: Originally called the Rifle. MP-133: Originally called the Shotgun. Things I will add: More cosmetics coming soon! Houses will have a function other than doing the embappe special Game link here: https://respectabledot.itch.io/slime-simulator"}, {"post_id": 33076, "ts": "2026-07-22T17:35:43Z", "hours": 9.6567, "text": "Items and Slime sizes Devlog 31 I forgot to devlog again :( Items and Equipment Slimes can now have items. Items can help them complete tasks or give them a buff. To see what item the slime has, check in the slime stats. Items currently in the game: Hammer: Used for constructing buildings. Hoe: Used by farmers to farm. Pistol: For killing slimes. Rifle: For killing slimes. Slime characteristics and stuff Instead of slimes being the same size, they can be big or small. This makes it more realistic, I guess. Slimes can pass down their family name. If the two parents have different family names, the offspring chooses one of them. UI Changes The section for terrain editing got a small upgrade. Next to the text, there is an image of the block to show you what it looks like. At the top-right corner of the slime statistics page, there is the X button that closes the UI. You can check what equipment the slime is using by going to the slime UI & statistics Other Waves can appear outside of the editing zone so it looks more natural."}, {"post_id": 31412, "ts": "2026-07-19T19:17:11Z", "hours": 2.9606, "text": "Spells! Devlog 30 Check out my game here: https://respectabledot.itch.io/slime-simulator Spells control and influence a slime mentally and physically. Currently, there are only 4 spells. I will plan to add more of them in later updates."}, {"post_id": 30419, "ts": "2026-07-17T22:56:36Z", "hours": 7.5947, "text": "UI Revamp and cosmetics Devlog 29 I am currently working on another update but I forgot to post a devlog, so I will post a devlog for the things I finished then post the ones I haven’t finished yet. Things I added: After taking some feedback, I changed some stuff inside the slime UI. Instead of just plain text, I added pictures and icons to make reading a slime’s information much easier. I also replaced most of the transparent boxes with some better ones that are drawn. For the cosmetics, I added around 10 new hats."}, {"post_id": 29034, "ts": "2026-07-15T18:03:17Z", "hours": 6.9889, "text": "Kingdoms and Colonies👑🔥👑🔥 Devlog 28 Slimes can establish kingdoms if there aren’t any or are far enough away from other kingdoms. If a slime is spawned by the user, the slime will head to the cllosest kingdom(If close enough). But if a slime came from another slime, they will automatically be part of the kingdom. A slime can create a settlement if they are already in a kingdom and is far enough away from it. If a slime has one parent from a kingdom and another from another kingdom, then they will random choose which to live in. A slime farmer can only work in the kingdom’s fields. Things I will add next time: War and Economy will be my next priority. Check out my game here: https://respectabledot.itch.io/slime-simulator"}, {"post_id": 27515, "ts": "2026-07-13T04:30:28Z", "hours": 11.2606, "text": "Another big update but isn’t as tiring Devlog 27 Things I added: Violence is a lot more encouraged between the slimes. There is too much peace. Added lettuce. Instead of the slimes growing meat, they grow lettuce. This is a lot more normal. Slimes have a Walking Animation, which is just them expanding and shrinking constantly. Food generation in farms is reduced because this encourages them to explore the world more. Bug fixes Buttons in the bottom bar will not activate when users are cancelling them. In planting mode, blockable objects like trees will destroy items beneath them. In building mode, changing a tile will cause things that are stuck on top of them to disappear. Things I will add next time: There will be a list of effects. These effects buff or weaken a slime’s body or influence the way it acts. An example could be make it faster, have more health, or make it more prone to attacking other slimes. Clans and kingdoms is already being worked on. Check out my game here: https://respectabledot.itch.io/slime-simulator"}, {"post_id": 26625, "ts": "2026-07-11T15:32:53Z", "hours": 7.8944, "text": "100 HOURS LETS GO Farms. Devlog 26 This is the most tiring update ever. This update is a test, so a lot of things can be broken. Things I added: Added roles. Some slimes get assigned task, like constructing buildings or farming. Added farms. Slimes can plant and produe their own food. All they have to do is place farming soil near windmills that are set up by constructors. The soil will automatically generate crops, which is meat. Made the art for the windmill. It even has an animation! Slimes interacting with other slimes is encouraged. Food spawning is greatly reduced because slimes can now produce their own food. Check out my game here: https://respectabledot.itch.io/slime-simulator"}, {"post_id": 26089, "ts": "2026-07-10T17:53:13Z", "hours": 3.8569, "text": "Miscellaneous Updates Devlog 25 Things I added: Made a sprite for when the slimes die. It looks like a splat. When a slime dies, their family member and friends get sad. You can press “h” to hide UI. Bug Fixes: Fixed a bug where the slimes get stuck after doing eating or interacting. Fixed the tutorial-skipping button. Slimes don’t lose their color anymore Check out my game here: https://respectabledot.itch.io/slime-simulator"}, {"post_id": 25634, "ts": "2026-07-10T01:18:16Z", "hours": 2.4928, "text": "Introduction Update Devlog 24 Made a simple intro. It contains the game’s logo and unity’s logo. Made a tutorial for the start of the game. It teaches you how to spawn slimes. If you have already played, there will be an option to skip. Check out my game: https://respectabledot.itch.io/slime-simulator"}, {"post_id": 25102, "ts": "2026-07-09T02:57:24Z", "hours": 2.9383, "text": "Cosmetics Update Devlog 23 I added 10 kinds of hats that can spawn on the slimes. They don’t affect the slimes, it’s just for appearance. My project is now on itch.io, go check it out! https://respectabledot.itch.io/slime-simulator"}, {"post_id": 24389, "ts": "2026-07-07T22:19:12Z", "hours": 5.8222, "text": "Random Good Updates Devlog 22 Sorry for not devlogging more Made a new button where you can plant weeds and trees. I don’t know what else to say but this took me so long. Reworked the violence behavior in slimes. Before the update, slimes would attack the nearest person when they get upset and hungry (Hangry). But now, slimes may choose to slime out someone nearby OR someone who they already don’t like in their relationships list. This makes it more realistic to real life. Reworked equation for slime violence weight: tasks[2] = distanceSlime > 18 ? 0 : (100 - stats[2] * 0.6f - stats[0] * 0.85f) / 50 + angryBias + baseTasks[2]; When slimes sleep, they will have their own special sprite for that. Also, they will have the “zzz” icon above them. Still working on the issue where slimes get stuck after doing some task. It seems to be fixed though, for now. My project is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator"}, {"post_id": 23626, "ts": "2026-07-06T18:08:25Z", "hours": 1.6611, "text": "Misc. Update Devlog 21 Added palm trees. They act like normal tree but spawn on sand. Also, they generate coconuts. Made a system where the slime’s pathfinding algorithm is a lot more efficient. Whenever they find a place where it’s impossible to go, they will make a mental note of that. This reduces possessing power. My game is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator"}, {"post_id": 23264, "ts": "2026-07-06T03:28:23Z", "hours": 5.8814, "text": "Emotion Update 😀😢😡 Devlog 20 I have something else that I worked on but there is still a little more work to go. I will post it in another devlog. For this update, I added emotion to the slimes. Slimes will get happy when they eat food or when they talk to their friends. They get sad overtime when they don’t do anything or they get attacked. You will know when they get upset when a emoji shows up above them. Emojis will show up for other things too, like when eating, fighting, or interacting with others. I will post the other part in the next devlog. My game is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator"}, {"post_id": 22259, "ts": "2026-07-04T17:10:08Z", "hours": 2.6747, "text": "Miscellaneous Update Devlog 19 My game is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator — Things I added: Added a crosschair. THis makes it a lot easier to see what you are hovering over. The crosschair can highlight on tiles and slimes. Made an about and instructions page. Go to the top-left and you will see the buttons that will take you to the pages. Fixed slime behavior. Sometimes the slimes get stuck after eating so I hope I fixed the issue."}, {"post_id": 21595, "ts": "2026-07-03T17:07:39Z", "hours": 3.0675, "text": "Taking Feedback Devlog 18 Font Change When I showed my project to people asking for some suggestions, they said I should change the font. So I decided to change the font to more of a pixel style, called “Pixel Operator”. It took a while to set up due to my lack of experience. Slime Violence Slime will now be able to attack each other. It starts from them being sad or angry, and being hungry. Then they unleashed their fury onto other slimes. When they hit other slimes, the slimes that are hit lose health. Other Stuff Slime can now slowly regenerate health when they are fed and have energy. Fixed a bug where rocks wont spawn in world editing mode."}, {"post_id": 20544, "ts": "2026-07-02T04:58:51Z", "hours": 3.8733, "text": "Visual Update Devlog 16 Check out my game here: https://respectabledot.itch.io/slime-simulator Particles Water used to look bad because it’s just blue and nothing else, so I added waves for the movement. Leaves now fall off trees. Other graphics When near land(Sand, Grass, rocks), the water becomes more shallow. It is indicated by the water being more light than the others. Added more grass when starting the game. Clouds appear a lot less due to it sometimes blocking the user’s vision. Bug fixes Fixed a bug where slimes were not spawning, caused by a poor algorithm. Temporarily removed the buggy walking animation for the slimes. I also added apples🍎"}, {"post_id": 20090, "ts": "2026-07-01T16:38:46Z", "hours": 6.3022, "text": "World Building Update Devlog 15 Terrain Editing You can now edit your world. All of the blocks will be available. To use this feature, click on the button with the blocks. All of the blocks: Water, Grass, Sand, Rock Programming took a bit longer than I thought, but testing was surprisingly easy. Next time, I could add things other than blocks, maybe like trees and grass. Other stuff There is now world age so you know how old your world is. Small changes in some of the UI"}, {"post_id": 18659, "ts": "2026-06-29T20:59:19Z", "hours": 5.4806, "text": "Map Update Devlog 14 Terrain Generation After implementing A* pathfinding, I added obstacles and other things for the map. I used to perlin noise to make the mountains and rivers feel more real. float noise = Mathf.PerlinNoise(i * 0.05f+ offsetX, j * 0.05f + offsetY); Added trees. I can make them useful for the slimes in later updates. Art I made the sprites for the rocks and water. It didn’t take that long because it didn’t need much detail. Made the art for the “kill slime” button, which is a knife. Bug fixing Fixed a ton of bugs because adding in the new pathfinding messed a lot of things up. A lot of problems came up when making terrain generation, like the slimes behaving weirdly. Future Updates I might add clans and tribes to make things more interesting. Violence will be added very soon. Check out my game here: https://respectabledot.itch.io/slime-simulator"}, {"post_id": 17664, "ts": "2026-06-28T15:31:41Z", "hours": 5.295, "text": "Big Update Devlog 13 Favorites tab You can now favorite slimes. This is for when you like one of them or find one interesting. To use, just click on one of the slimes. Kill tab If you want to get rid of a slime, go to the kill tab and click on the slime. I will add the death animation next time. New pathfinding Replaced the old AI reinforcement learning with the A* pathfinding method. This is because the new system can avoid obstacles and doesn’t take much computing power. UI revamp Made the UI better. Most of the buttons and panels have art and stuff. Things I will add in the future Terrain: You will be able to customize the terrain to make the world more interesting Animations: When walking, the slime will have animation."}, {"post_id": 16090, "ts": "2026-06-26T04:47:00Z", "hours": 6.1744, "text": "A title Devlog 12 Things I implemented Slimes don’t mixed up colors equally anymore. This is because mixing them up equally makes them more dull and grey over time. To stop this, I had to mix the colors up unevenly to maintain the vibrant colors. To track and follow a slime, click on them and press the “Track” button. The slime UI got a major upgrade. It’s now easier to read and more sorted out. You can now spawn food for the slimes. To do it, go to the bar at the bottom. Above the bar, there is a text that tells you what you have selected inside the bar. Clouds have been implemented. Right now they don’t do anything, but they will be able to drop food."}, {"post_id": 15381, "ts": "2026-06-25T00:34:38Z", "hours": 5.0311, "text": "Batch of Updates! Devlog 11 Slime genetics Slimes have more realistic natural genetic creation. Instead of only picking up one of their parent’s colors, they mix the two colors together. Speed and Health changes for an offspring is toned down. Implemented more slime mutations. These includes drastic color changes, faster or slow speeds, or health changes. When testing, I noticed that after a while, the colors started becoming black(I don’t know why). That’s why I made it so that an offspring may be given a bold color(Blue, Red, Green, etc.). UI Made a system where you can view slimes’ friends just by checking their friends list. By clicking on one of their friends or family, it will take you to the selected slime. I made the UIs a lot more responsive and clean."}, {"post_id": 13969, "ts": "2026-06-22T22:33:23Z", "hours": 4.535, "text": "More Mechanics! Devlog 10 Small UI Update The slime information and slime population text boxes are separated. There is now a bar that is gonna contain some button. Right now the only button I added is adding more slimes, but there are gonna be more in the future. Other Things I added Slimes can now have multiple babies instead of only one. I added some grass to make it less barren."}, {"post_id": 12908, "ts": "2026-06-21T04:19:17Z", "hours": 3.1158, "text": "Update Devlog 9 Traits Slimes now have traits! Traits are minor tweaks on the brain of a slime. This brings out personality and characteristics. For now, traits are only obtainable at birth. Slimes aren’t able to pass down traits to their offspring. Other stuff I finished working on the background and is preparing to work on the art of the food. Things I will do next time I will start working on the UI because that makes it easier for people to test my simulator. I will work on more traits, so far I have 7-8 of them."}, {"post_id": 12810, "ts": "2026-06-20T23:26:52Z", "hours": 7.8597, "text": "Big Fat Update 🔨🔨🔥🔥 Devlog 8 I don’t use AI to write any of my devlogs. Relationships Slimes can interact with one another. To do so, they just have to be next to each other. After an interaction, if they haven’t known each other before, they will have an updated friends list. If they have already met each other, then what they think of each other goes up. If two slime’s relationship value go up to a certain number like 30, then they can have babies. DNA and Genes Each Slime have their own characteristics. This includes speed, health, and species. They pass down their genes to their offspring. Offspring’s traits will be slightly changed to maintain diversity and natural selection. For example, a slime with a fast genes will be able to get to a food quicker than the ones that are slow. The faster slime will get to survive and make babies. Color 🔥🔥(My fav update) Slimes have multiple kinds of traits, and that includes color. They can pass down their color to their offspring(Though their offspring’s color may be slightly different). This addition makes the game look a lot better. Problems 😢😢😢 While doing some tests, I noticed that some slimes were dying. This was weird because there were definitely enough food for everyone. When I looked closer, I realized that there was a bug where some slimes get stuck and become braindead. This problem is and still very difficult to fix."}, {"post_id": 11703, "ts": "2026-06-19T02:03:09Z", "hours": 2.3189, "text": "Art! 🔥🔥🔥🔥 Devlog 7 Made a sprite for the slimes. The default color is white because it supposed to be changed into other colors. The movement of slimes is now smooth instead of teleporting to the nearest block. A lot easier ot tell what’s going on. Things I will add later: Better UI will be implemented later. Because right now it’s just a piece of text that tells you the stats of a slime. Demo will be released soon because I need some feedback. Slimes will be able to kill each other. 💀💀💀"}, {"post_id": 11574, "ts": "2026-06-18T21:13:40Z", "hours": 4.0161, "text": "More mechanics! Devlog 6 In this update I added a basic social structure and generations. Things added in this update: When two slimes meet, they gather some information. If one slime’s mental value is bad while meeting, then they will have a bad meeting. If they have a good meeting and keep it up for multiple interactions, then they can have babies. There are a lot less bugs when slimes are interacting with each other. They don’t glitch out nor do they just stop moving. Food now constantly generates, so the slimes can live and thrive. Things I will add later: Parents will soon be able to pass down genes and DNA to their offspring. There will be a more advanced social structure so it doesn’t seem too robotic. Art will be implemented later on. I might put this on itch.io for people to test. My game is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator"}, {"post_id": 11017, "ts": "2026-06-18T01:23:04Z", "hours": 3.3789, "text": "Relationships!😀😀😀😀 Devlog 5 This update is mainly focused on relationships. Slimes can now interact with each other. How it works: ⚙️⚙️⚙️ Slime number 1 will look for another slime within a certain radius. If found, slime number 1 will go to that slime (Slime number 2) and have some sort of interaction. If slime number two is already in the list of contact of slime number one, their bond will go up. Formula for the value of interacting: (100 - stats[2]) / 100 - Vector3.Distance(FindClosest(otherSlimes, Mathf.Infinity, \"pluh\").transform.position, transform.position) / 20; Later updates: 🔨🔨🔨🔨 Big fixes: Sometimes after an interaction, slime glitches out and has a seizure. The seizure is temporary but I still want to fix this issue. Slime mating: If slimes have a very high bond, they can have baby slimes. (Baby slimes will have the genes and DNA of their parents)"}, {"post_id": 10413, "ts": "2026-06-17T03:20:04Z", "hours": 2.1417, "text": "4th Devlog Like & Sub for good payouts (Legit and proved) Things I added: ⭐🐵 Slimes now has an idling state. This mean that when they dont have anything to do, they will just wander around to nearby places or stand still. This mechanic is to make the slimes feel more alive. Made it so that whenever a slime finishes a task, they will have a cooldown for around 2 seconds. Then they can do their thing again. Fixed bugs, like the UI not working right and the slime tweaking out whenever they finish pathfinding. Thing I will add later: 🔨🔨🔨 Slimes will soon have relationships with other slimes. They can be friends or enemies. Since I already coded the pathfinding, it should be easy. Slimes who are enemies will attack each other. DNA and Genes will be added later on. Parents will be able to pass their genes to their offsprings."}, {"post_id": 9735, "ts": "2026-06-16T05:02:30Z", "hours": 2.0414, "text": "Devlog 3.😩😩😩 Things I added: Slimes now have color! There is a statistic text at the top-left. Whenever you click on a slime, it will show the stats of that slime. Fixed a bug where slimes stop whenever they collect food."}, {"post_id": 9560, "ts": "2026-06-15T22:42:40Z", "hours": 0.8458, "text": "Du Bist Gut Genug 🥵🥵 (Ball knowledge) Devlog 3 Things I added: I wanted to make each slime have a unique name, so I added a name generator. How this works is a script will put random words from a text file that contains nouns. Slimes now has different movement speed. The average speed of all of them should be around 0.7 block/sec. (Lowest speed: 1 b/s, Highest speed: 0.4 b/s) Slimes now have hit points. If the hit points go to 0 they will die. (Lowest hitpoint: 70, Highest hitpoint: 140) If the slime has 0 hunger or is too tired, they will slowly start to lose health and die. Made the github repo, so people can see my cool code."}, {"post_id": 9498, "ts": "2026-06-15T21:03:54Z", "hours": 2.3692, "text": "2nd Devlog🥵🥵🥵 Note: Still no github repo for you Things I added: I put together the slime, so now it can walk around and do things slimes do. The slime now has a food source, so the slimes can now walk around and collect some nutrients. Things I will add in the future: Slimes will be able to do more things, and they will be able to interact. They can do things like talk or kill each other."}, {"post_id": 8918, "ts": "2026-06-14T20:53:50Z", "hours": 1.3481, "text": "1st Devlog! Note: No repo yet, I will add it later. Things I added: Made the structure of a slimes’ brain and mechanic. Made my own AI pathfinding thingy. Right now it doesn’t support obstacles, but it will soon. How the slime’s brain works: There was many variables inside. Each variable represents a stat, like hunger points or energy level. Once in a while the brain chooses the highest variable and will act accordingly. ex. If the hunger variable is the highest then the brain will find something to eat. Updates for later: I will actually put everything together and maybe make the repo. The slimes will be seperated into different species. The the much later future, you can influence the slime’s dna and stuff."}]...
|
Title: Slime Simulator by @RespectableDot | Starda Title: Slime Simulator by @RespectableDot | Stardance
Devlogs:
1st Devlog! Note: No repo yet, I will add it later. Things I added: Made the structure of a slimes’ brain and mechanic. Made my own AI pathfinding thingy. Right now it doesn’t support obstacles, but it will soon. How the slime’s brain works: There was many variables inside. Each variable represents a stat, like hunger points or energy level. Once in a while the brain chooses the highest variable and will act accordingly. ex. If the hunger variable is the highest then the brain will find something to eat. Updates for later: I will actually put everything together and maybe make the repo. The slimes will be seperated into different species. The the much later future, you can influence the slime’s dna and stuff.
2nd Devlog🥵🥵🥵 Note: Still no github repo for you Things I added: I put together the slime, so now it can walk around and do things slimes do. The slime now has a food source, so the slimes can now walk around and collect some nutrients. Things I will add in the future: Slimes will be able to do more things, and they will be able to interact. They can do things like talk or kill each other.
Du Bist Gut Genug 🥵🥵 (Ball knowledge) Devlog 3 Things I added: I wanted to make each slime have a unique name, so I added a name generator. How this works is a script will put random words from a text file that contains nouns. Slimes now has different movement speed. The average speed of all of them should be around 0.7 block/sec. (Lowest speed: 1 b/s, Highest speed: 0.4 b/s) Slimes now have hit points. If the hit points go to 0 they will die. (Lowest hitpoint: 70, Highest hitpoint: 140) If the slime has 0 hunger or is too tired, they will slowly start to lose health and die. Made the github repo, so people can see my cool code.
Devlog 3.😩😩😩 Things I added: Slimes now have color! There is a statistic text at the top-left. Whenever you click on a slime, it will show the stats of that slime. Fixed a bug where slimes stop whenever they collect food.
4th Devlog Like & Sub for good payouts (Legit and proved) Things I added: ⭐🐵 Slimes now has an idling state. This mean that when they dont have anything to do, they will just wander around to nearby places or stand still. This mechanic is to make the slimes feel more alive. Made it so that whenever a slime finishes a task, they will have a cooldown for around 2 seconds. Then they can do their thing again. Fixed bugs, like the UI not working right and the slime tweaking out whenever they finish pathfinding. Thing I will add later: 🔨🔨🔨 Slimes will soon have relationships with other slimes. They can be friends or enemies. Since I already coded the pathfinding, it should be easy. Slimes who are enemies will attack each other. DNA and Genes will be added later on. Parents will be able to pass their genes to their offsprings.
Relationships!😀😀😀😀 Devlog 5 This update is mainly focused on relationships. Slimes can now interact with each other. How it works: ⚙️⚙️⚙️ Slime number 1 will look for another slime within a certain radius. If found, slime number 1 will go to that slime (Slime number 2) and have some sort of interaction. If slime number two is already in the list of contact of slime number one, their bond will go up. Formula for the value of interacting: (100 - stats[2]) / 100 - Vector3.Distance(FindClosest(otherSlimes, Mathf.Infinity, "pluh").transform.position, transform.position) / 20; Later updates: 🔨🔨🔨🔨 Big fixes: Sometimes after an interaction, slime glitches out and has a seizure. The seizure is temporary but I still want to fix this issue. Slime mating: If slimes have a very high bond, they can have baby slimes. (Baby slimes will have the genes and DNA of their parents)
More mechanics! Devlog 6 In this update I added a basic social structure and generations. Things added in this update: When two slimes meet, they gather some information. If one slime’s mental value is bad while meeting, then they will have a bad meeting. If they have a good meeting and keep it up for multiple interactions, then they can have babies. There are a lot less bugs when slimes are interacting with each other. They don’t glitch out nor do they just stop moving. Food now constantly generates, so the slimes can live and thrive. Things I will add later: Parents will soon be able to pass down genes and DNA to their offspring. There will be a more advanced social structure so it doesn’t seem too robotic. Art will be implemented later on. I might put this on itch.io for people to test. My game is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator
Art! 🔥🔥🔥🔥 Devlog 7 Made a sprite for the slimes. The default color is white because it supposed to be changed into other colors. The movement of slimes is now smooth instead of teleporting to the nearest block. A lot easier ot tell what’s going on. Things I will add later: Better UI will be implemented later. Because right now it’s just a piece of text that tells you the stats of a slime. Demo will be released soon because I need some feedback. Slimes will be able to kill each other. 💀💀💀
Big Fat Update 🔨🔨🔥🔥 Devlog 8 I don’t use AI to write any of my devlogs. Relationships Slimes can interact with one another. To do so, they just have to be next to each other. After an interaction, if they haven’t known each other before, they will have an updated friends list. If they have already met each other, then what they think of each other goes up. If two slime’s relationship value go up to a certain number like 30, then they can have babies. DNA and Genes Each Slime have their own characteristics. This includes speed, health, and species. They pass down their genes to their offspring. Offspring’s traits will be slightly changed to maintain diversity and natural selection. For example, a slime with a fast genes will be able to get to a food quicker than the ones that are slow. The faster slime will get to survive and make babies. Color 🔥🔥(My fav update) Slimes have multiple kinds of traits, and that includes color. They can pass down their color to their offspring(Though their offspring’s color may be slightly different). This addition makes the game look a lot better. Problems 😢😢😢 While doing some tests, I noticed that some slimes were dying. This was weird because there were definitely enough food for everyone. When I looked closer, I realized that there was a bug where some slimes get stuck and become braindead. This problem is and still very difficult to fix.
Update Devlog 9 Traits Slimes now have traits! Traits are minor tweaks on the brain of a slime. This brings out personality and characteristics. For now, traits are only obtainable at birth. Slimes aren’t able to pass down traits to their offspring. Other stuff I finished working on the background and is preparing to work on the art of the food. Things I will do next time I will start working on the UI because that makes it easier for people to test my simulator. I will work on more traits, so far I have 7-8 of them.
More Mechanics! Devlog 10 Small UI Update The slime information and slime population text boxes are separated. There is now a bar that is gonna contain some button. Right now the only button I added is adding more slimes, but there are gonna be more in the future. Other Things I added Slimes can now have multiple babies instead of only one. I added some grass to make it less barren.
Batch of Updates! Devlog 11 Slime genetics Slimes have more realistic natural genetic creation. Instead of only picking up one of their parent’s colors, they mix the two colors together. Speed and Health changes for an offspring is toned down. Implemented more slime mutations. These includes drastic color changes, faster or slow speeds, or health changes. When testing, I noticed that after a while, the colors started becoming black(I don’t know why). That’s why I made it so that an offspring may be given a bold color(Blue, Red, Green, etc.). UI Made a system where you can view slimes’ friends just by checking their friends list. By clicking on one of their friends or family, it will take you to the selected slime. I made the UIs a lot more responsive and clean.
A title Devlog 12 Things I implemented Slimes don’t mixed up colors equally anymore. This is because mixing them up equally makes them more dull and grey over time. To stop this, I had to mix the colors up unevenly to maintain the vibrant colors. To track and follow a slime, click on them and press the “Track” button. The slime UI got a major upgrade. It’s now easier to read and more sorted out. You can now spawn food for the slimes. To do it, go to the bar at the bottom. Above the bar, there is a text that tells you what you have selected inside the bar. Clouds have been implemented. Right now they don’t do anything, but they will be able to drop food.
Big Update Devlog 13 Favorites tab You can now favorite slimes. This is for when you like one of them or find one interesting. To use, just click on one of the slimes. Kill tab If you want to get rid of a slime, go to the kill tab and click on the slime. I will add the death animation next time. New pathfinding Replaced the old AI reinforcement learning with the A* pathfinding method. This is because the new system can avoid obstacles and doesn’t take much computing power. UI revamp Made the UI better. Most of the buttons and panels have art and stuff. Things I will add in the future Terrain: You will be able to customize the terrain to make the world more interesting Animations: When walking, the slime will have animation.
Map Update Devlog 14 Terrain Generation After implementing A* pathfinding, I added obstacles and other things for the map. I used to perlin noise to make the mountains and rivers feel more real. float noise = Mathf.PerlinNoise(i * 0.05f+ offsetX, j * 0.05f + offsetY); Added trees. I can make them useful for the slimes in later updates. Art I made the sprites for the rocks and water. It didn’t take that long because it didn’t need much detail. Made the art for the “kill slime” button, which is a knife. Bug fixing Fixed a ton of bugs because adding in the new pathfinding messed a lot of things up. A lot of problems came up when making terrain generation, like the slimes behaving weirdly. Future Updates I might add clans and tribes to make things more interesting. Violence will be added very soon. Check out my game here: https://respectabledot.itch.io/slime-simulator
World Building Update Devlog 15 Terrain Editing You can now edit your world. All of the blocks will be available. To use this feature, click on the button with the blocks. All of the blocks: Water, Grass, Sand, Rock Programming took a bit longer than I thought, but testing was surprisingly easy. Next time, I could add things other than blocks, maybe like trees and grass. Other stuff There is now world age so you know how old your world is. Small changes in some of the UI
Visual Update Devlog 16 Check out my game here: https://respectabledot.itch.io/slime-simulator Particles Water used to look bad because it’s just blue and nothing else, so I added waves for the movement. Leaves now fall off trees. Other graphics When near land(Sand, Grass, rocks), the water becomes more shallow. It is indicated by the water being more light than the others. Added more grass when starting the game. Clouds appear a lot less due to it sometimes blocking the user’s vision. Bug fixes Fixed a bug where slimes were not spawning, caused by a poor algorithm. Temporarily removed the buggy walking animation for the slimes. I also added apples🍎
Taking Feedback Devlog 18 Font Change When I showed my project to people asking for some suggestions, they said I should change the font. So I decided to change the font to more of a pixel style, called “Pixel Operator”. It took a while to set up due to my lack of experience. Slime Violence Slime will now be able to attack each other. It starts from them being sad or angry, and being hungry. Then they unleashed their fury onto other slimes. When they hit other slimes, the slimes that are hit lose health. Other Stuff Slime can now slowly regenerate health when they are fed and have energy. Fixed a bug where rocks wont spawn in world editing mode.
Miscellaneous Update Devlog 19 My game is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator — Things I added: Added a crosschair. THis makes it a lot easier to see what you are hovering over. The crosschair can highlight on tiles and slimes. Made an about and instructions page. Go to the top-left and you will see the buttons that will take you to the pages. Fixed slime behavior. Sometimes the slimes get stuck after eating so I hope I fixed the issue.
Emotion Update 😀😢😡 Devlog 20 I have something else that I worked on but there is still a little more work to go. I will post it in another devlog. For this update, I added emotion to the slimes. Slimes will get happy when they eat food or when they talk to their friends. They get sad overtime when they don’t do anything or they get attacked. You will know when they get upset when a emoji shows up above them. Emojis will show up for other things too, like when eating, fighting, or interacting with others. I will post the other part in the next devlog. My game is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator
Misc. Update Devlog 21 Added palm trees. They act like normal tree but spawn on sand. Also, they generate coconuts. Made a system where the slime’s pathfinding algorithm is a lot more efficient. Whenever they find a place where it’s impossible to go, they will make a mental note of that. This reduces possessing power. My game is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator
Random Good Updates Devlog 22 Sorry for not devlogging more Made a new button where you can plant weeds and trees. I don’t know what else to say but this took me so long. Reworked the violence behavior in slimes. Before the update, slimes would attack the nearest person when they get upset and hungry (Hangry). But now, slimes may choose to slime out someone nearby OR someone who they already don’t like in their relationships list. This makes it more realistic to real life. Reworked equation for slime violence weight: tasks[2] = distanceSlime > 18 ? 0 : (100 - stats[2] * 0.6f - stats[0] * 0.85f) / 50 + angryBias + baseTasks[2]; When slimes sleep, they will have their own special sprite for that. Also, they will have the “zzz” icon above them. Still working on the issue where slimes get stuck after doing some task. It seems to be fixed though, for now. My project is now on itch, go check it out! https://respectabledot.itch.io/slime-simulator
Cosmetics Update Devlog 23 I added 10 kinds of hats that can spawn on the slimes. They don’t affect the slimes, it’s just for appearance. My project is now on itch.io, go check it out! https://respectabledot.itch.io/slime-simulator
Introduction Update Devlog 24 Made a simple intro. It contains the game’s logo and unity’s logo. Made a tutorial for the start of the game. It teaches you how to spawn slimes. If you have already played, there will be an option to skip. Check out my game: https://respectabledot.itch.io/slime-simulator
Miscellaneous Updates Devlog 25 Things I added: Made a sprite for when the slimes die. It looks like a splat. When a slime dies, their family member and friends get sad. You can press “h” to hide UI. Bug Fixes: Fixed a bug where the slimes get stuck after doing eating or interacting. Fixed the tutorial-skipping button. Slimes don’t lose their color anymore Check out my game here: https://respectabledot.itch.io/slime-simulator
100 HOURS LETS GO Farms. Devlog 26 This is the most tiring update ever. This update is a test, so a lot of things can be broken. Things I added: Added roles. Some slimes get assigned task, like constructing buildings or farming. Added farms. Slimes can plant and produe their own food. All they have to do is place farming soil near windmills that are set up by constructors. The soil will automatically generate crops, which is meat. Made the art for the windmill. It even has an animation! Slimes interacting with other slimes is encouraged. Food spawning is greatly reduced because slimes can now produce their own food. Check out my game here: https://respectabledot.itch.io/slime-simulator
Another big update but isn’t as tiring Devlog 27 Things I added: Violence is a lot more encouraged between the slimes. There is too much peace. Added lettuce. Instead of the slimes growing meat, they grow lettuce. This is a lot more normal. Slimes have a Walking Animation, which is just them expanding and shrinking constantly. Food generation in farms is reduced because this encourages them to explore the world more. Bug fixes Buttons in the bottom bar will not activate when users are cancelling them. In planting mode, blockable objects like trees will destroy items beneath them. In building mode, changing a tile will cause things that are stuck on top of them to disappear. Things I will add next time: There will be a list of effects. These effects buff or weaken a slime’s body or influence the way it acts. An example could be make it faster, have more health, or make it more prone to attacking other slimes. Clans and kingdoms is already being worked on. Check out my game here: https://respectabledot.itch.io/slime-simulator
Kingdoms and Colonies👑🔥👑🔥 Devlog 28 Slimes can establish kingdoms if there aren’t any or are far enough away from other kingdoms. If a slime is spawned by the user, the slime will head to the cllosest kingdom(If close enough). But if a slime came from another slime, they will automatically be part of the kingdom. A slime can create a settlement if they are already in a kingdom and is far enough away from it. If a slime has one parent from a kingdom and another from another kingdom, then they will random choose which to live in. A slime farmer can only work in the kingdom’s fields. Things I will add next time: War and Economy will be my next priority. Check out my game here: https://respectabledot.itch.io/slime-simulator
UI Revamp and cosmetics Devlog 29 I am currently working on another update but I forgot to post a devlog, so I will post a devlog for the things I finished then post the ones I haven’t finished yet. Things I added: After taking some feedback, I changed some stuff inside the slime UI. Instead of just plain text, I added pictures and icons to make reading a slime’s information much easier. I also replaced most of the transparent boxes with some better ones that are drawn. For the cosmetics, I added around 10 new hats.
Spells! Devlog 30 Check out my game here: https://respectabledot.itch.io/slime-simulator Spells control and influence a slime mentally and physically. Currently, there are only 4 spells. I will plan to add more of them in later updates.
Items and Slime sizes Devlog 31 I forgot to devlog again :( Items and Equipment Slimes can now have items. Items can help them complete tasks or give them a buff. To see what item the slime has, check in the slime stats. Items currently in the game: Hammer: Used for constructing buildings. Hoe: Used by farmers to farm. Pistol: For killing slimes. Rifle: For killing slimes. Slime characteristics and stuff Instead of slimes being the same size, they can be big or small. This makes it more realistic, I guess. Slimes can pass down their family name. If the two parents have different family names, the offspring chooses one of them. UI Changes The section for terrain editing got a small upgrade. Next to the text, there is an image of the block to show you what it looks like. At the top-right corner of the slime statistics page, there is the X button that closes the UI. You can check what equipment the slime is using by going to the slime UI & statistics Other Waves can appear outside of the editing zone so it looks more natural.
More Mechanics and Items! Devlog 32 Things I added: Houses are a new building. Currently they don’t really do anything, but later on they can be used for slimes to sleep in. Doctors is a new ability that treats and heal slimes. Their item is a medkit. When you favorite a slime, a star icon will show up above them. This helps keep track of your favorite slimes. Added 8 new cosmetics! New Items! MP5: A submachine gun that fires really fast. Blue staff: A staff that is blue and shoots out 3 blue balls. Katana: The first melee weapon. Does a lot of damage. Medkit: Used by doctors to treat and heal other slimes. M1911: Originally called the pistol. AR-15: Originally called the Rifle. MP-133: Originally called the Shotgun. Things I will add: More cosmetics coming soon! Houses will have a function other than doing the embappe special Game link here: https://respectabledot.itch.io/slime-simulator
Another Batch of Updates Devlog 33 I dont know when to stop this project, I have a lot of things to add… Check out my game here! https://respectabledot.itch.io/slime-simulator Things I added: Day/Night Cycle! Every minute it switches from day to night or vice versa. When at night, slimes and buildings glow so they are easier to see. Also, it looks cool. (The light thing took a long time to figure out) There is a notification bar that tells you what is currently happening in the world. When guns fire, it will create a muzzle flash effect. New Items: FN SCAR: A powerful gun that hits hard. It is kind of inaccurate though. Laser Gun: Its bullets are faster than other guns. Does decent damage.
Optimization and Fixes Devlog 34 2nd to last devlog! Cant wait to ship Things I added: When you press escape or the gear icon at the bottom-right, you can enter the settings page. In here, you can disable or enable features to your likings. This can help run the game faster on lower-end PCs. Placing blocks, plants or effects shows a small special effect. Between and Night, there will be dusk and evening. They will make the sky orange for 15 seconds. There will be more farmers and less unemployed people. Big Fixes: Upgraded the pathfinding system for the slimes. Whenever they are hungry but can’t reach their food, they will find alternate food that is close to them.
Sound! Devlog 35 This will be a short devlog because I don’t know what else to say. Sounds effects I added inside the game: Slime spawning Clicking on slime clicking on ui(button) Slime Noises ocean wind Slime Eating Planting Guns(Lasers, Regular bullets Passive slime noises Active slime noises Night(Crickets) Credit to qubodup and filippe for the slime sound effects.
Ships:
A simulator that is about making crazy slimes through natural selection, evolution, and genetic engineering. One thing that made this project challenging was the slime pathfinding. To solve this, I used the A* pathfinding technique. Something I am proud of is the art style. I worked very hard on it and I think it look good. To test my project, just click on the demo link. Thank you to the people who supported and suggested good ideas to the project!...
|
1792842791.8326545
|
1792929191.8326545
|
|
4066
|
Koryphaios by @Micah | Stardance
|
Micah
|
1
|
167.02
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-04T07:26:21Z", "hours": 134.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made Koryphaios, a desktop workspace for running AI agents together without losing control of your files, costs, or progress. The hardest part was getting the cli providers to cooperate with koryphaios’s built in features like notes, goals, workflows, etc. I am proud of how much of the app now works as one connected experience. Keep in mind this is a desktop app but all it takes is one little curl command and you can delete it after if you dont like it too. Critque is wanted on this and I look forward to seeing how people use it.", "repo": "https://github.com/Sylorlabs/koryphaios", "demo": "https://koryphaios.com/download/"}]...
|
[{"post_id": 44475, "ts": "202 [{"post_id": 44475, "ts": "2026-08-10T07:58:20Z", "hours": 33.0247, "text": "fixing dumb bugs like error repeating itself 2 times"}, {"post_id": 40587, "ts": "2026-08-04T07:18:28Z", "hours": 133.7669, "text": "this is the ui for koryphaios 0.1.0 I still need to adjust some things like the placement of goal mode or were workflows are placed"}]...
|
Title: Koryphaios by @Micah | Stardance
Devlogs:
Title: Koryphaios by @Micah | Stardance
Devlogs:
this is the ui for koryphaios 0.1.0 I still need to adjust some things like the placement of goal mode or were workflows are placed
fixing dumb bugs like error repeating itself 2 times
Ships:
I made Koryphaios, a desktop workspace for running AI agents together without losing control of your files, costs, or progress. The hardest part was getting the cli providers to cooperate with koryphaios’s built in features like notes, goals, workflows, etc. I am proud of how much of the app now works as one connected experience. Keep in mind this is a desktop app but all it takes is one little curl command and you can delete it after if you dont like it too. Critque is wanted on this and I look forward to seeing how people use it....
|
1792835405.5171058
|
1792921805.5171058
|
|
33460
|
Intelligent Star Wars Droid by @Mortaccio | Starda Intelligent Star Wars Droid by @Mortaccio | Stardance...
|
Mortaccio
|
0
|
169.09
|
0
|
[]
|
[{"post_id": 43590, "ts": "202 [{"post_id": 43590, "ts": "2026-08-08T22:53:16Z", "hours": 39.4822, "text": "Still working on the RL policy, I have Claude helping me bug fix the scripts for the training algorithms, its rough so far but I think if I optimize for low torque and then continuously lower kp I can make it work with my current constraints, so far I have moved the batteries in the head to increase stability and a better COM, but a working walking policy is still on the horizon"}, {"post_id": 40699, "ts": "2026-08-04T12:03:56Z", "hours": 14.7025, "text": "RL training in progress, you cant exactly see it in this screenshot, but I have hundreds of millions of robots being trained digitally with consideration of position, heat and balance of course. Now that I have a standing model, I will need to make some tweaks, like making sure it stands a bit taller so the shins dont collide with th etorso and implementing a walking policy."}, {"post_id": 38592, "ts": "2026-08-01T02:15:46Z", "hours": 10.3872, "text": "New Spring system for balancing torque on knee, which will save energy, add more deep squat margin, and increase efficiency. Scoped spring and cord dimensions, learned how to auto implement screws in onshape, and got it all figured out for the most part, now all I need to do is lower weight, probably by decreasing batteries, and maybe I wont even have to reduce weight with this new spring in place, then I can implement the foam inserts on feet, remodel head, and maybe add head yaw, a lot to go but a majority of the work is done."}, {"post_id": 33926, "ts": "2026-07-24T07:26:00Z", "hours": 8.2003, "text": "full body mockup, with brackets, major electrical components, actuators and timing belt/gear system installed. Now all that needs to be done is add masses and rotation limits and small tweaks, then I can simulate in mujoco, test for major flaws, onshape to urdf file, then to Isaac Lab."}, {"post_id": 33438, "ts": "2026-07-23T11:57:09Z", "hours": 12.0608, "text": "Bracketing of electronics and added new antenna servos along with capstan drive for the antenna servos"}, {"post_id": 32694, "ts": "2026-07-22T00:28:44Z", "hours": 7.6347, "text": "Gear Synch Added! Ok so boom, gears/pulleys for the timing belt system are added and implemented, found all the parts I need on Amazon for ~$25 extra for both legs and used the provided seller info to spec the CAD models. Now, just have to add the foot, along with its connection to the ankle gear, and add all the significantly weighted tech pieces/ anything that takes up significant space to figure out bracketing. After that, add weights, clean rough edges, and train the RL policy while we wait for a grant."}, {"post_id": 32168, "ts": "2026-07-21T04:23:30Z", "hours": 16.975, "text": "New design work, made the motor proxies bigger to account for drivers, made thigh brackets bigger, added antennas with rotation axis, turns out im going to be using a dual antenna system, where only one is powered at a time based upon which garners a greater signal, but for right now only the antenna proxies are needed for weight calculations, fixed some more design details, am currently working on implementing belt system into cad."}, {"post_id": 30507, "ts": "2026-07-18T04:20:35Z", "hours": 11.2592, "text": "Details Galore, added details to the thigh bracket, torso and head. Reproportionized a lot of stuff, all in all just a big design change day. Really hit a wave of frustration today when looking at some other people’s robots and how far other people have come. But then I started realizing that to compare to robots with different functions and different budgets is apples to oranges. I will continue to do the best with what I have. The budget has run out of control. Currently, my estimated cost to finish the robot is around an additional 350 dollars. I know that sounds rough but that’s where I’m at. Maybe GDZ34 drivers wouldnt be too bad a present for my birthday lol. All in all, rough day. I think I just need to fall in love with the design again and my motivation will come back. I plan on making the final-final version out of metal, so I will model for that."}, {"post_id": 28730, "ts": "2026-07-15T05:15:52Z", "hours": 9.7186, "text": "NEW Mechanisms in the pipeline, removing ankle servo in favor of utilizing a chain linkage to the hip actuator to sync hip and ankle movements inversely. New designs, new CAD model for the foot. New Shin redesign. Due to heat strain on hip roll servos, a aluminum heatsink will be added, may require further cooling solutions in the future. Removing the ankle servos saves weight, distal mass and complexity of bus protocols. All in all, simpler is better and this new redesign is elegant and simple."}, {"post_id": 27533, "ts": "2026-07-13T05:21:26Z", "hours": 8.3167, "text": "Final Touches, Moving to Sim————————Extended Shin, Recalculate Torque, Added Hip Roll Motor Horn Connectors, Signed up for AWS, requested more large server access (EC2), did material testing and found I only need ~avg 20% infill, made feet and imported to mujoco to get this awesome pic"}, {"post_id": 26748, "ts": "2026-07-11T18:30:13Z", "hours": 5.2828, "text": "CAD Leg Shenanigans– Found cheap ankle servos that work from Feetech, Remodeled the shin and thigh brackets for better aesthetics and new bracketing. To do: Find and implement hip roll servos, implement head tilt/pan servo (if able to- not super high priority) and make knee 3:2 ratio gear if needed."}, {"post_id": 26296, "ts": "2026-07-11T00:32:26Z", "hours": 1.5578, "text": "Ive found it, the Goldilock of motors for my build. After hours of bartering with Alibaba factories, and messing with thigh and shin lengths, re-calculating torque requirements, I’ve found the motor that singlehandedly will solve all of my problems. The GIM3505-8 has RPM ~2x what I would have needed for walking, with enough torque for the hip pitch and possibly the knee pitch (hopefully). Because of the fact that my CAD and Mujoco models show most of the weight falling on the knee joint, as it is backward-facing, it is often holding the weight of the robot in solely its rotation. In addition, the knee joint requires the highest rpm and the highest range of motion. All these limits make it increasingly difficult to stay true to the form factor of the BD-1 without sacrificing money in the thousands. The motor comes with a encoder, so all I need is a driver. I thought about utilizing a all in one PCB board, with the Reinforcement Learning Policy, drivers and any other compute needed all in one place. Unfortunately, this elegant solution is very cost inefficent. While a great way to try my luck at PCB design, it will run me at least ~$30 more than just buying two arduinos and a raspberry pie 4. I still need to decide on the ankle motor replacement and the hip roll replacement as my old proxies were incorrect. (Claude doesn’t like CAD)."}, {"post_id": 26191, "ts": "2026-07-10T21:02:05Z", "hours": 23.5128, "text": "Shin + Thigh Re-proportioning and Motor selection and Motor CAD Implementation"}]...
|
Title: Intelligent Star Wars Droid by @Mortaccio | Title: Intelligent Star Wars Droid by @Mortaccio | Stardance
Devlogs:
Shin + Thigh Re-proportioning and Motor selection and Motor CAD Implementation
Ive found it, the Goldilock of motors for my build. After hours of bartering with Alibaba factories, and messing with thigh and shin lengths, re-calculating torque requirements, I’ve found the motor that singlehandedly will solve all of my problems. The GIM3505-8 has RPM ~2x what I would have needed for walking, with enough torque for the hip pitch and possibly the knee pitch (hopefully). Because of the fact that my CAD and Mujoco models show most of the weight falling on the knee joint, as it is backward-facing, it is often holding the weight of the robot in solely its rotation. In addition, the knee joint requires the highest rpm and the highest range of motion. All these limits make it increasingly difficult to stay true to the form factor of the BD-1 without sacrificing money in the thousands. The motor comes with a encoder, so all I need is a driver. I thought about utilizing a all in one PCB board, with the Reinforcement Learning Policy, drivers and any other compute needed all in one place. Unfortunately, this elegant solution is very cost inefficent. While a great way to try my luck at PCB design, it will run me at least ~$30 more than just buying two arduinos and a raspberry pie 4. I still need to decide on the ankle motor replacement and the hip roll replacement as my old proxies were incorrect. (Claude doesn’t like CAD).
CAD Leg Shenanigans– Found cheap ankle servos that work from Feetech, Remodeled the shin and thigh brackets for better aesthetics and new bracketing. To do: Find and implement hip roll servos, implement head tilt/pan servo (if able to- not super high priority) and make knee 3:2 ratio gear if needed.
Final Touches, Moving to Sim————————Extended Shin, Recalculate Torque, Added Hip Roll Motor Horn Connectors, Signed up for AWS, requested more large server access (EC2), did material testing and found I only need ~avg 20% infill, made feet and imported to mujoco to get this awesome pic
NEW Mechanisms in the pipeline, removing ankle servo in favor of utilizing a chain linkage to the hip actuator to sync hip and ankle movements inversely. New designs, new CAD model for the foot. New Shin redesign. Due to heat strain on hip roll servos, a aluminum heatsink will be added, may require further cooling solutions in the future. Removing the ankle servos saves weight, distal mass and complexity of bus protocols. All in all, simpler is better and this new redesign is elegant and simple.
Details Galore, added details to the thigh bracket, torso and head. Reproportionized a lot of stuff, all in all just a big design change day. Really hit a wave of frustration today when looking at some other people’s robots and how far other people have come. But then I started realizing that to compare to robots with different functions and different budgets is apples to oranges. I will continue to do the best with what I have. The budget has run out of control. Currently, my estimated cost to finish the robot is around an additional 350 dollars. I know that sounds rough but that’s where I’m at. Maybe GDZ34 drivers wouldnt be too bad a present for my birthday lol. All in all, rough day. I think I just need to fall in love with the design again and my motivation will come back. I plan on making the final-final version out of metal, so I will model for that.
New design work, made the motor proxies bigger to account for drivers, made thigh brackets bigger, added antennas with rotation axis, turns out im going to be using a dual antenna system, where only one is powered at a time based upon which garners a greater signal, but for right now only the antenna proxies are needed for weight calculations, fixed some more design details, am currently working on implementing belt system into cad.
Gear Synch Added! Ok so boom, gears/pulleys for the timing belt system are added and implemented, found all the parts I need on Amazon for ~$25 extra for both legs and used the provided seller info to spec the CAD models. Now, just have to add the foot, along with its connection to the ankle gear, and add all the significantly weighted tech pieces/ anything that takes up significant space to figure out bracketing. After that, add weights, clean rough edges, and train the RL policy while we wait for a grant.
Bracketing of electronics and added new antenna servos along with capstan drive for the antenna servos
full body mockup, with brackets, major electrical components, actuators and timing belt/gear system installed. Now all that needs to be done is add masses and rotation limits and small tweaks, then I can simulate in mujoco, test for major flaws, onshape to urdf file, then to Isaac Lab.
New Spring system for balancing torque on knee, which will save energy, add more deep squat margin, and increase efficiency. Scoped spring and cord dimensions, learned how to auto implement screws in onshape, and got it all figured out for the most part, now all I need to do is lower weight, probably by decreasing batteries, and maybe I wont even have to reduce weight with this new spring in place, then I can implement the foam inserts on feet, remodel head, and maybe add head yaw, a lot to go but a majority of the work is done.
RL training in progress, you cant exactly see it in this screenshot, but I have hundreds of millions of robots being trained digitally with consideration of position, heat and balance of course. Now that I have a standing model, I will need to make some tweaks, like making sure it stands a bit taller so the shins dont collide with th etorso and implementing a walking policy.
Still working on the RL policy, I have Claude helping me bug fix the scripts for the training algorithms, its rough so far but I think if I optimize for low torque and then continuously lower kp I can make it work with my current constraints, so far I have moved the batteries in the head to increase stability and a better COM, but a working walking policy is still on the horizon...
|
1792752893.2222433
|
1793357693.2222433
|
|
13978
|
Roblox Minigolf by @ThatRandomMaker | Stardance
|
ThatRandomMaker
|
1
|
170.69
|
2416
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-13T09:33:14Z", "hours": 167.0, "multiplier": 15.65, "payout": 2416, "blessing": "neutral", "text": "I’ve made a minigolf game in Roblox studio, featuring 3 maps and 22 stages in total, with cosmetics that can be bought for your golf club or golf ball, and some nice QoL features like a music menu, or a hide UI hotkey In my opinion, the main challenging thing was building all the maps. I’m not a great map builder, so making even one map or all stages took a lot of time, plus taking on the task of making 3 maps for the first release was, admittedly, a not-so-thought-through idea. Of course, this doesn’t mean that there was just 1 challenge, this was just the main one for me. Please note: due to the Roblox guideline changes, you must have an account that is 16+ Facial Age Estimation or ID verified to play the game. This can only be changed if the game reaches 250 “active” players. There are alternatives, which is either setting up the game yourself in Roblox Studio (takes some time), or just by watching the small feature demo. These restrictions/alternatives are mentioned in the README. (written per default questions)", "repo": "https://github.com/ThatRandomMaker/Roblox-Minigolf", "demo": "https://www.roblox.com/games/11200475351/Minigolf"}]...
|
[{"post_id": 76096, "ts": "202 [{"post_id": 76096, "ts": "2026-10-02T09:52:34Z", "hours": 2.2314, "text": "Finished the first room in the new Factory map! What lighting style do you think is better? Realistic or soft? (shadowmap) Realistic is img 1-2, soft is 3-4 At the moment, there won’t be any minigolf courses, as I’d rather finish the building first. Also, I had a few new ideas for the game that may make it a bit more “immersive” to say the least.. Will experiment with them and post something in the future if it works out."}, {"post_id": 72599, "ts": "2026-09-23T09:50:33Z", "hours": 1.4561, "text": "After a few prototypes, (a lot) I’ve decided to make another map, which a factory/warehouse type of map. So far, I’ve made these props: Conveyor Structual beam Light Unloading zones At the moment, I’m not really sure how I’ll make the stages in the map, but I have an idea of making them more interactive (somewhat similar to the arcade map.) One small mention, the map will likely be in beta or not fully finished (when or if I ship again), as Stardance is likely going to end soon."}, {"post_id": 67234, "ts": "2026-09-13T09:16:00Z", "hours": 4.0808, "text": "FINALLY shipping! (after this devlog) After likely losing a few hairs here and there (/j) after these 3 (almost 3 and 1/2) months, I deem minigolf to be done. I’m kind of suprised myself that the project took so long. I believe that this, by far is the longest project I’ve ever made. During the process, I’ve learned A LOT more about studio and luau overall, which will definetly help make better games (with better implementations). I have to admit, coming closer to the end there was a bit of burnout, but the result, in my opinion, was definetly worth it. I also want to say thank you to everyone that has supported me and this project, it means a lot :) Since the last devlog, I fixed and updated the few rough edges left in the game, GitHub repository and Stardance which are: Stardance: Making a new banner (old one didn’t even match the style of the game anymore) Adding a demo link & github repository link GitHub repository: Made a README that, in my opinion, is nice. It follows the requirements that the shipping guide/README guide Stardance mentions (controls, images, demo link, features, etc) Game: Changing the teleport screen to one that blends in during teleport Changed badges for new ones (icons) and requirements (now 1, 10 and 22 stages) Made the maze in stage 8 (grass map) harder to complete, was too easy before Changed all loading music Removed the funFacts moduleScript (not needed anymore) Stage 9 sign fixed to show status for Arcade_9 instead of Arcade_3 Updated desertMap particles to be thinner Changed loadUI to have fake shadow text instead of a thick UIStroke"}, {"post_id": 65465, "ts": "2026-09-10T16:40:51Z", "hours": 1.6436, "text": "Desert map complete! Well.. that was way faster compared to the other maps, which makes sense due to a desert.. well, being a desert. Anyway, now that the main game is done*, I’ve also made thumbnails and an icon for the game. I still need to make a README and a proper description for the game, to ship , of course. *Will likely rework the tutorial gui a bit and the ui shown when teleporting between maps Anyway, look forward to seeing a few more updates soon, as the aforementioned updates/additions shouldn’t take a while"}, {"post_id": 64885, "ts": "2026-09-09T16:18:59Z", "hours": 1.3189, "text": "Started work on the “Desert” map. All stages are now built! There are only 5 stages due to school taking most of my time, as usual. (and, there’s already 2 other maps in the game, so that’s that)"}, {"post_id": 64261, "ts": "2026-09-08T15:10:07Z", "hours": 8.0694, "text": "Arcade map complete! New: the outside has now been fully finished (instead of just being a baseplate) Smaller changes/additions: the arcade map now has seats , shapes on the floor and ambiance zones. As the second map is done, I’m getting closer to (finally) shipping this project, and (hopefully) getting good enough reviews to get my goal from SD. The “Desert” map will likely be a bit shorter compared to the arcade map (or even grass map, undecided.), as I don’t have that much time anymore due to school starting."}, {"post_id": 61466, "ts": "2026-09-04T12:15:21Z", "hours": 10.2056, "text": "Arcade map update The indoor area is close to being finished! It still, of course needs a few things to be completed (for example, the food area, filling the empty space, etcetera.) Next step is, of course, the outdoors! I assume it shouldn’t take as long to make as the interior was, but who knows Another thing the game still needs is ambiance zones. (and a new ambiance sound for the indoors, of course) I’m thinking of implementing this with just 2 parts for the indoors and outdoors, which should do the trick. Every day this project is (hopefully) coming a bit closer to being shipped, but progress will slow down a bit due to school starting. In an ideal situation this’ll likely be shipped in a week, or atleast I hope to get it sort-of-ship ready by that time."}, {"post_id": 54531, "ts": "2026-08-25T15:39:57Z", "hours": 4.0231, "text": "Arcade Machines They have interactable buttons (which do nothing, except move up and down) Nothing else to say about them, really.. Changes/additions: Changed song2 (main menu) due to likely being made by AI (cover seems to be aigen) Light mode setting now also changes the main menu Changed buttonFrame in-game to have wrapper frames, in result being affected by the UIListLayout, and now they don’t clip together when using smaller screens, but they can still be animated."}, {"post_id": 51588, "ts": "2026-08-21T11:08:56Z", "hours": 8.1239, "text": "Overhauled main menu GUI including new songs and animations! Demo is in the attached video as usual! So, I’ve spent a bit of time reworking the main menu , since the old one looked “temporary” instead of finished. In my opinion, the result seems to be pretty nice . I’ve made/added/reworked: Esentially every menu New animations when moving pages or when going in-game Added hover effects for buttons Icons for the main buttons Added fake shadows to text instead of the bad-looking UIStroke like before Added image backgrounds Replaced (most) old songs! (song 1, song 3-5) It still isn’t fully finished, as I need to implement a light mode for it, but otherwise it’s fully functional! When light mode for the main menu and (maybe) loadUI is done, the focus will likely shift back to building the arcade map. Every time I test the game I somehow find bugs on accident, whoops! Anyway, there were a “few” fixes/updates that were made during development of this overhaul: Fixed spinnyCamera (script) to not repeat points Updated generateNumber for spinnyCamera (script) to go through all the points instead of randomly pick one and look repetitive Fixed autosaveUI appearing in the main menu Fixed hideUIHotkey setting (a lot of things which I won’t describe as this post isn’t meant to be a wall of text) Fixed mainMenuButton UIScale bug by resetting UIScale on click Updated both cameraFolder(s) to be models instead of folders, with ModelStreamingMode to be set to Atomic (fixes delay or infinite yielding on slower devices) Updated mainMenuUI image background transparency to 0.5 for settingsFrame, cameraModeFrame and creditsFrame Updated hideHotkey setting textColor3 when text is “Set Keybind” and added UIPadding to the button for text not to clip Fixed soundLogic volume bug that didn’t reset audio volume when going back to the main menu, in result making the song silent Updated soundLogic to fade in song volume instead of immediately start playing it at full volume And a lot more… (these are just ones found after the overhaul)"}, {"post_id": 48935, "ts": "2026-08-17T14:30:42Z", "hours": 4.1728, "text": "New camera mode for the main menu! Demo is in the video! Before remaking/overhauling the main menu UI into light/dark mode (and, to look nice, of course), I’ve decided to rework the camera as it’s a bit of a weak point in the menu. It features: Camera sway Camera switching between points 15 different points for the camera Now, this has also reminded me that the main menu needs a little bit different of a song selection, as drum and bass for a gentle camera sway obviously doesn’t work. Miscellanous changes/fixes: Flying trees fixed statsGui (naming fix soonTM) bgcolor and background transparency changed in light mode to that of the old UI."}, {"post_id": 48115, "ts": "2026-08-16T12:28:38Z", "hours": 9.935, "text": "In-game UI revamp is complete! *and a few miscellaneous fixes have been made The settings menu has been revamped to add the light mode setting, now featuring page 1 and 2, and a few other settings which are currently in progress of being made. In my opinion, light mode looks decent but I still prefer dark mode. A new setting that is still a bit of a work in progress, but mostly finished is a hide UI hotkey , which as the name states, hides ui (in-game only). I still need to implement that the setting saves, but overall it works just fine. It’s made to only apply a keybind if you’re playing on PC, though. Fixes: autosaveUI loading/saving icon was still spinning when not visible. Fixed by seeing if the frame is actually visible (instead of if the frame exists, small typo) Shadow button now just changes immediately instead of waiting for the server to change the variable, now it just fires the remoteEvent only to save the setting autosaveUI UIstroke clipping fixed by changing it to apply inner instead of outer Tree sway intensity has been changed to be a bit lower, otherwise it’d look unnatural. Tree pivots fixed to be on the bottom for tree sway (this was a pain) Tree pivot issues: Changing tree pivots manually always broke for some reason. It took a few hours to fix them, then when I dragged the trees down it reset them. Upon pressing undo the pivots were still reset, not like they were before. Then, I tried fixing them without dragging anything, and the next time I opened studio it reset again. I found that ctrl+l may work, but that didn’t work either. Had to end up cloning everything over again, which somehow has made the shadows more intense in the dense tree areas, even though nothing changed between the two. This was NOT fun When writing this devlog, I found out that the oak trees have decided to fly in the air, so that’s great"}, {"post_id": 41247, "ts": "2026-08-05T10:30:05Z", "hours": 9.6728, "text": "UI Revamp (W.I.P) I’ve started reworking the main UI for the game because well.. the old one is to say the least - not good. So far I’ve reworked basically everything in-game (except the tutorial, but it won’t be reworked anyway as it can only be seen one time) I’ve also experimented a bit with hover tweens (button getting larger on hover) and sound effects, which have been implemented now. Another thing I’ve experimented a bit with is viewport frames , which are now used in the shop to show golf balls and clubs/“sticks” spinning. I’d want to possibly implement a “Are you sure you want to buy (x) item for (x) amount” in the shop, but that’s not planned at the moment. Things still unfinished that I want to complete (for UIs): Setting to enable/disable dark mode Light mode UI (as at the moment it’s dark mode only) Sound changes: “song2” in the main menu has been replaced due to it being striked by Roblox (not sure why!) Sound in the tutorial UI before accepting/declining the tutorial has been changed (same issue)"}, {"post_id": 37696, "ts": "2026-07-30T16:22:40Z", "hours": 4.7486, "text": "Every stage in the Arcade (map) has been built! The arcade now consists of 9 stages in total! New thing is that some are a bit more.. interactive , and a few are a bit difficult or tedious .. to say the least. (example of changing stages the attached video) Now that the stages are done, the game is inching a bit closer to completion! Now, of course, there may be ~15 or more things to still complete in the roadmap , but any progress is great. You may (or may not) be wondering how I made all of these in 4 hours. Well, I only have one explanation. I uhh… forgot to enable the plugin after making something else. Oops! (factory gambler prototype) Anyway, during this time a few small misc changes have been done: stageLogic (new script) has been added to well.. control the stages. (Stage 5, 7 and 9.) Shop UI trail naming has been changed a little. Blinking activity on stage signs has been removed. Note: Video player in SD is bugged. You have to click on the devlog, then go and click on the video for it to play."}, {"post_id": 35256, "ts": "2026-07-26T15:40:53Z", "hours": 8.5958, "text": "Hello again! I’ve started working on the arcade map, as the grass map is pretty much complete (just need to fix the ui a bit) I’ve decided to rewrite the playSound script a bit to not be hardcoded and play a different sound (depending on what string is received from the remoteEvent) instead of creating a remoteEvent and a new script for each one For example, now it can play either the golfhole sound or the sound for the ball disappearing in stage 2. Also, for the new automated door, I’ve experimented a little with spatial-ish sound. Turns out it’s really easy (for what I need, atleast) So far I’ve made a few things in-game and outlined a few ideas and a roadmap. Currently built: First three stages (which are glow-in-the-dark!) mostly complete parking lot Front of the building (although unfinished) A road leading up to the parking lot with a small grass patch. Automated door There may not be as much devlogs now, but the game is still in development!"}, {"post_id": 30623, "ts": "2026-07-18T10:46:31Z", "hours": 6.6422, "text": "Devlog 7 Additions: Grass map is now complete! Added lamp scenery to the stages, so you can actually complete them during the night Tutorial is complete with music! Shop UI now has shadows behind the buttons Added an invisible hitbox extension to the golfstick (mainly fixes issue, although still may need to switch to r6 due to animation packs) UI with stats (Cash, stages won) and sounds + cash counting up/down The tutorial now has animations for hitting the ball Changes: Tutorial made more visually similar overall First tutorial animation changed to: Move the golfstick not as far back/forward Move the golfstick a bit faster when hitting the ball Tutorial second animation changed to: Not rotate the golfstick as far (60 degrees instead of 90) Fixes: Stats UI centering on screen Before starting to work on the next map which is the Arcade, a few other settings will be added to the settings menu. Music UI may also change."}, {"post_id": 27248, "ts": "2026-07-12T17:13:40Z", "hours": 10.0919, "text": "Small update/Devlog 6 New additions: A tutorial has been added and is fully working! (still needs sounds but otherwise fully complete) Main menu disallows the player to join the Arcade and Desert map if they haven’t completed the tutorial yet. Map scenery is done! Only need the stages now A boost pad has been added (and a golf ball loop will be made!) Colorcorrectioneffect has been added to make the game brighter in terms of colors instead of dull. Fixes: Trees were optimized a little in blender (the fir tree originally had 6.6k faces when I opened the file.. oof) Renderfidelity on leaf parts for trees was changed to automatic (otherwise the trees would look like twigs from far away) Lights turn off when daytime cycle setting gets turned off Daytime cycle script fixed to turn off after turning off the nighttime setting Changes: Lighting from invisible walls on stages removed (will use lights that the player can see instead) Main menu UI has been changed to have shadows on the buttons. Main menu UI text also has a “manual” shadow on the “Choose your destination!” text UIStroke on stage signs is now a bit thicker (text is easier to read) Need to add/fix: UI that shows your current leaderboard stats instead of the default one Arm swinging the golfstick when moving with it (will probably either switch to R6 or just make an invisible hitbox for the tool) Note: Ignore the last map building update. The upload system completely broke for me. I can’t add an attachment to the devlog (so I can’t edit it) and deleting it just results in an error."}, {"post_id": 25189, "ts": "2026-07-09T08:12:53Z", "hours": 21.9158, "text": "Map development update #2 I’ve developed the map and it’s outer scenery a lot , although I’m running into optimization regarding te trees. (haven’t worked on a lot of stages though, only added the 4th one) Maybe the tree has a lot of vertices and I could somehow optimize it in blender? If so, that could be the main factor why the game ran better with less trees. Sunrays, bloom and a shorter range detpth of field have been added And a small experiment for a tutorial cutscene has been added too. In the process of this “devlog” I’ve also lost 11h of work Also, a new loading screen has been added and the one from TP has been fixed!"}, {"post_id": 19276, "ts": "2026-06-30T15:27:41Z", "hours": 4.4606, "text": "Map development update I’ve been working on a few ideas recently and have been attempting to build something “decent”. With a bit of trial and error so far I’ve made A tree And 3 stages 🤞 Perfect development pace, isn’t it? Anyway, here are the images showing stages and the tree."}, {"post_id": 17522, "ts": "2026-06-28T10:34:21Z", "hours": 10.4989, "text": "Small update/Devlog 5.5 I’ve been working on a few things for the game before starting to build the map and in result wanted to share these. Changes: “New” spawnPad and clearBall models, both now display their cooldowns with text and colors (locally for the player) I’ve replaced the low quality music in the main menu and added a “few” more songs, instead of just 11 songs now the game has.. 87! Now the main menu is also controlled by one script only, instead of having one in each button (in result also making porting easier to the other places) Also, the side buttons have been redesigned! Now they have a collapse menu button, and a button for returning to the main menu. This is so that more of the screen is available for mobile players (and a bit of the screen on PC, too). Returning to the main menu will be useful for example, if the player completes every stage in the Grass “destination”/Environment and wants to continue to the next one. Also the music UI has been fixed to work on 4K (didn’t properly implement scale on the buttons) And, a very special thing in my opinion is that the shop is finally complete ! Consisting of golf balls, trails, effects and different golf clubs (for a visual representation, go to the video after reading this post) The Golf club preview image on the tool changes per the equipped cosmetic too!"}, {"post_id": 15173, "ts": "2026-06-24T17:30:12Z", "hours": 10.3753, "text": "Devlog 5! New fixes and additions also shown in the video Features: Parts now spin the same speed at any fps, and one main script is now controlling them all using CollectionService The GolfStick now has customization added in the shop! Autosave has been added (saves every 60sec with visual UI) Completed levels and main menu settings get saved Main menu now has transitions! Fixes: Shop and music menu now finally properly scale on ALL resolutions! Shop buttons fixed with scale instead of sizing Disabled the back button when attempting to teleport to a different place Lights are fixed for the nightTime setting (didn’t turn on/off before) Ambiance now plays with the nightTime setting on A saved table is now used instead of searching for lamp parts each time the alpha tween runs (dynamic lighting on/off tween), in result saving performance. Fixed golf ball trail and effect visibility (now you don’t see other player trails and effects, which reduced visibility before.) Main menu play button fixed to not start volume fade out from volume 1, instead now uses the current volume of the sound Commented out debug prints that aren’t needed anymore (kept incase something breaks though) Fixed saves when altf4-ing from the game or the server shutting down. PlayerRemoving and BindToClose double saving upon shutdown Still need to replace: Placeholder images and items in the shop UI. After that, time to start building!"}, {"post_id": 11863, "ts": "2026-06-19T09:53:37Z", "hours": 8.5456, "text": "Devlog 4 fixes and additions New additions and fixes also shown in the video Features: Added badge rewards on milestones (5 badges so far, 1-1000 stages won) Setting for daytime cycle in main menu Dynamic lighting system Replaced placeholder images in the main menu (main menu is fully complete now) Seperate play UI instead of one button Spinning parts Loading screen Day and night ambiance Fixes: Dynamic lighting fixed to not depend the animation on ClockTime, instead make a tween and play it in a certain time range. Dynamic lighting fixed to not read ClockTime every time it changes (inefficient) Teleport handler fixed to handle any errors with servers and re-enable the menu incase of an unsuccesful teleport. Music UI fixed to show volume slider properly (not to combine the button to stop the current song playing in the same line) Implemented proper join song rng (otherwise it’d usually pick the first or the 4th song) Credit menu scaling Needs fixing: Shop and music menu scaling on 1440p screens (Credit to ShootingCat for finding this bug, since I don’t have a 1440p monitor) Disabling the back button when attempting to teleport to a different place When enabling night time, to turn the lights on, since the current dynamic lighting system only checks 2 timeframes, and doesn’t turn on otherwise. Still need to add/replace: Replace placeholder items and images in the shop frame Adding customization options for the golf club (or as it’s named, golfstick) 3. Finally start building the map (if nothing else comes up that needs fixing, or another idea that needs to be implemented)"}, {"post_id": 10585, "ts": "2026-06-17T12:07:24Z", "hours": 7.51, "text": "Devlog 3, game additions and hotfixes New additions shown in the video Additions: Implemented most of the main menu. Includes: Credits, settings (shadows and night time) Camera spinning around a specific (target) part for main menu Button to stop current song in the music menu. Replaced placeholder images and sounds in the music menu Spinning parts using tween(s) Fixes: Menu proper scaling for devices Player input and backpack UI disabling when in main menu Shop has an error sound (instead of purchase sound) when not having enough money for an item. Added default/none options to the shop for disabling trails and effects. Still need to add: Badge rewards on a milestone (changed from reward per stage) Volume slider or manual volume entering for the music menu Replacing placeholder items and images in the shop frame Images for the buttons, separate play UI in the main menu"}, {"post_id": 9284, "ts": "2026-06-15T16:15:08Z", "hours": 6.1644, "text": "Devlog 2, a lot has changed! Project demo available in the video Features: Shop UI has now been fully implemented and saving works Golf balls are now customizable by buying cosmetics from the shop (with in-game cash), cosmetics consist of golf ball colors, trails and effects Music UI has been added to the game for listening songs during gameplay Now there was one bad thing, which is that I somehow accidentally deleted the whole shop UI and had to remake it since autosave (of course) had to save in that exact moment.. Still need to implement: Badge rewards when winning a stage Main menu with setting(s) Spinning and moving parts (for unique stages) Volume control for music UI Replacing placeholder sounds in the music frame Replacing placeholder items and images in the shop frame Adding materials as a customization option for golf balls"}, {"post_id": 7945, "ts": "2026-06-13T07:59:58Z", "hours": 6.6408, "text": "Hello, Minigolf! Implemented the core mechanics for the game to work which are: Custom collisiongroups to prevent griefing (for example, your golf ball hitting one that’s owned by another player, or the golf club hitting the ground making it hard to play) Transparency on different clients, to know which golf ball you own Working goal with a sound effect and tween to fade out the ball before destroying it Side mechanics added: Barebones datastore implementation, now rewards cash and golf hole scored/won UI test for music selection menu and shop (to get trails, custom golf ball colors, etc), full implementation soonTM Still working on to implement: Working shop with equippable cosmetics Working music selection Main menu"}]...
|
Title: Roblox Minigolf by @ThatRandomMaker | Stard Title: Roblox Minigolf by @ThatRandomMaker | Stardance
Devlogs:
Hello, Minigolf! Implemented the core mechanics for the game to work which are: Custom collisiongroups to prevent griefing (for example, your golf ball hitting one that’s owned by another player, or the golf club hitting the ground making it hard to play) Transparency on different clients, to know which golf ball you own Working goal with a sound effect and tween to fade out the ball before destroying it Side mechanics added: Barebones datastore implementation, now rewards cash and golf hole scored/won UI test for music selection menu and shop (to get trails, custom golf ball colors, etc), full implementation soonTM Still working on to implement: Working shop with equippable cosmetics Working music selection Main menu
Devlog 2, a lot has changed! Project demo available in the video Features: Shop UI has now been fully implemented and saving works Golf balls are now customizable by buying cosmetics from the shop (with in-game cash), cosmetics consist of golf ball colors, trails and effects Music UI has been added to the game for listening songs during gameplay Now there was one bad thing, which is that I somehow accidentally deleted the whole shop UI and had to remake it since autosave (of course) had to save in that exact moment.. Still need to implement: Badge rewards when winning a stage Main menu with setting(s) Spinning and moving parts (for unique stages) Volume control for music UI Replacing placeholder sounds in the music frame Replacing placeholder items and images in the shop frame Adding materials as a customization option for golf balls
Devlog 3, game additions and hotfixes New additions shown in the video Additions: Implemented most of the main menu. Includes: Credits, settings (shadows and night time) Camera spinning around a specific (target) part for main menu Button to stop current song in the music menu. Replaced placeholder images and sounds in the music menu Spinning parts using tween(s) Fixes: Menu proper scaling for devices Player input and backpack UI disabling when in main menu Shop has an error sound (instead of purchase sound) when not having enough money for an item. Added default/none options to the shop for disabling trails and effects. Still need to add: Badge rewards on a milestone (changed from reward per stage) Volume slider or manual volume entering for the music menu Replacing placeholder items and images in the shop frame Images for the buttons, separate play UI in the main menu
Devlog 4 fixes and additions New additions and fixes also shown in the video Features: Added badge rewards on milestones (5 badges so far, 1-1000 stages won) Setting for daytime cycle in main menu Dynamic lighting system Replaced placeholder images in the main menu (main menu is fully complete now) Seperate play UI instead of one button Spinning parts Loading screen Day and night ambiance Fixes: Dynamic lighting fixed to not depend the animation on ClockTime, instead make a tween and play it in a certain time range. Dynamic lighting fixed to not read ClockTime every time it changes (inefficient) Teleport handler fixed to handle any errors with servers and re-enable the menu incase of an unsuccesful teleport. Music UI fixed to show volume slider properly (not to combine the button to stop the current song playing in the same line) Implemented proper join song rng (otherwise it’d usually pick the first or the 4th song) Credit menu scaling Needs fixing: Shop and music menu scaling on 1440p screens (Credit to ShootingCat for finding this bug, since I don’t have a 1440p monitor) Disabling the back button when attempting to teleport to a different place When enabling night time, to turn the lights on, since the current dynamic lighting system only checks 2 timeframes, and doesn’t turn on otherwise. Still need to add/replace: Replace placeholder items and images in the shop frame Adding customization options for the golf club (or as it’s named, golfstick) 3. Finally start building the map (if nothing else comes up that needs fixing, or another idea that needs to be implemented)
Devlog 5! New fixes and additions also shown in the video Features: Parts now spin the same speed at any fps, and one main script is now controlling them all using CollectionService The GolfStick now has customization added in the shop! Autosave has been added (saves every 60sec with visual UI) Completed levels and main menu settings get saved Main menu now has transitions! Fixes: Shop and music menu now finally properly scale on ALL resolutions! Shop buttons fixed with scale instead of sizing Disabled the back button when attempting to teleport to a different place Lights are fixed for the nightTime setting (didn’t turn on/off before) Ambiance now plays with the nightTime setting on A saved table is now used instead of searching for lamp parts each time the alpha tween runs (dynamic lighting on/off tween), in result saving performance. Fixed golf ball trail and effect visibility (now you don’t see other player trails and effects, which reduced visibility before.) Main menu play button fixed to not start volume fade out from volume 1, instead now uses the current volume of the sound Commented out debug prints that aren’t needed anymore (kept incase something breaks though) Fixed saves when altf4-ing from the game or the server shutting down. PlayerRemoving and BindToClose double saving upon shutdown Still need to replace: Placeholder images and items in the shop UI. After that, time to start building!
Small update/Devlog 5.5 I’ve been working on a few things for the game before starting to build the map and in result wanted to share these. Changes: “New” spawnPad and clearBall models, both now display their cooldowns with text and colors (locally for the player) I’ve replaced the low quality music in the main menu and added a “few” more songs, instead of just 11 songs now the game has.. 87! Now the main menu is also controlled by one script only, instead of having one in each button (in result also making porting easier to the other places) Also, the side buttons have been redesigned! Now they have a collapse menu button, and a button for returning to the main menu. This is so that more of the screen is available for mobile players (and a bit of the screen on PC, too). Returning to the main menu will be useful for example, if the player completes every stage in the Grass “destination”/Environment and wants to continue to the next one. Also the music UI has been fixed to work on 4K (didn’t properly implement scale on the buttons) And, a very special thing in my opinion is that the shop is finally complete ! Consisting of golf balls, trails, effects and different golf clubs (for a visual representation, go to the video after reading this post) The Golf club preview image on the tool changes per the equipped cosmetic too!
Map development update I’ve been working on a few ideas recently and have been attempting to build something “decent”. With a bit of trial and error so far I’ve made A tree And 3 stages 🤞 Perfect development pace, isn’t it? Anyway, here are the images showing stages and the tree.
Map development update #2 I’ve developed the map and it’s outer scenery a lot , although I’m running into optimization regarding te trees. (haven’t worked on a lot of stages though, only added the 4th one) Maybe the tree has a lot of vertices and I could somehow optimize it in blender? If so, that could be the main factor why the game ran better with less trees. Sunrays, bloom and a shorter range detpth of field have been added And a small experiment for a tutorial cutscene has been added too. In the process of this “devlog” I’ve also lost 11h of work Also, a new loading screen has been added and the one from TP has been fixed!
Small update/Devlog 6 New additions: A tutorial has been added and is fully working! (still needs sounds but otherwise fully complete) Main menu disallows the player to join the Arcade and Desert map if they haven’t completed the tutorial yet. Map scenery is done! Only need the stages now A boost pad has been added (and a golf ball loop will be made!) Colorcorrectioneffect has been added to make the game brighter in terms of colors instead of dull. Fixes: Trees were optimized a little in blender (the fir tree originally had 6.6k faces when I opened the file.. oof) Renderfidelity on leaf parts for trees was changed to automatic (otherwise the trees would look like twigs from far away) Lights turn off when daytime cycle setting gets turned off Daytime cycle script fixed to turn off after turning off the nighttime setting Changes: Lighting from invisible walls on stages removed (will use lights that the player can see instead) Main menu UI has been changed to have shadows on the buttons. Main menu UI text also has a “manual” shadow on the “Choose your destination!” text UIStroke on stage signs is now a bit thicker (text is easier to read) Need to add/fix: UI that shows your current leaderboard stats instead of the default one Arm swinging the golfstick when moving with it (will probably either switch to R6 or just make an invisible hitbox for the tool) Note: Ignore the last map building update. The upload system completely broke for me. I can’t add an attachment to the devlog (so I can’t edit it) and deleting it just results in an error.
Devlog 7 Additions: Grass map is now complete! Added lamp scenery to the stages, so you can actually complete them during the night Tutorial is complete with music! Shop UI now has shadows behind the buttons Added an invisible hitbox extension to the golfstick (mainly fixes issue, although still may need to switch to r6 due to animation packs) UI with stats (Cash, stages won) and sounds + cash counting up/down The tutorial now has animations for hitting the ball Changes: Tutorial made more visually similar overall First tutorial animation changed to: Move the golfstick not as far back/forward Move the golfstick a bit faster when hitting the ball Tutorial second animation changed to: Not rotate the golfstick as far (60 degrees instead of 90) Fixes: Stats UI centering on screen Before starting to work on the next map which is the Arcade, a few other settings will be added to the settings menu. Music UI may also change.
Hello again! I’ve started working on the arcade map, as the grass map is pretty much complete (just need to fix the ui a bit) I’ve decided to rewrite the playSound script a bit to not be hardcoded and play a different sound (depending on what string is received from the remoteEvent) instead of creating a remoteEvent and a new script for each one For example, now it can play either the golfhole sound or the sound for the ball disappearing in stage 2. Also, for the new automated door, I’ve experimented a little with spatial-ish sound. Turns out it’s really easy (for what I need, atleast) So far I’ve made a few things in-game and outlined a few ideas and a roadmap. Currently built: First three stages (which are glow-in-the-dark!) mostly complete parking lot Front of the building (although unfinished) A road leading up to the parking lot with a small grass patch. Automated door There may not be as much devlogs now, but the game is still in development!
Every stage in the Arcade (map) has been built! The arcade now consists of 9 stages in total! New thing is that some are a bit more.. interactive , and a few are a bit difficult or tedious .. to say the least. (example of changing stages the attached video) Now that the stages are done, the game is inching a bit closer to completion! Now, of course, there may be ~15 or more things to still complete in the roadmap , but any progress is great. You may (or may not) be wondering how I made all of these in 4 hours. Well, I only have one explanation. I uhh… forgot to enable the plugin after making something else. Oops! (factory gambler prototype) Anyway, during this time a few small misc changes have been done: stageLogic (new script) has been added to well.. control the stages. (Stage 5, 7 and 9.) Shop UI trail naming has been changed a little. Blinking activity on stage signs has been removed. Note: Video player in SD is bugged. You have to click on the devlog, then go and click on the video for it to play.
UI Revamp (W.I.P) I’ve started reworking the main UI for the game because well.. the old one is to say the least - not good. So far I’ve reworked basically everything in-game (except the tutorial, but it won’t be reworked anyway as it can only be seen one time) I’ve also experimented a bit with hover tweens (button getting larger on hover) and sound effects, which have been implemented now. Another thing I’ve experimented a bit with is viewport frames , which are now used in the shop to show golf balls and clubs/“sticks” spinning. I’d want to possibly implement a “Are you sure you want to buy (x) item for (x) amount” in the shop, but that’s not planned at the moment. Things still unfinished that I want to complete (for UIs): Setting to enable/disable dark mode Light mode UI (as at the moment it’s dark mode only) Sound changes: “song2” in the main menu has been replaced due to it being striked by Roblox (not sure why!) Sound in the tutorial UI before accepting/declining the tutorial has been changed (same issue)
In-game UI revamp is complete! *and a few miscellaneous fixes have been made The settings menu has been revamped to add the light mode setting, now featuring page 1 and 2, and a few other settings which are currently in progress of being made. In my opinion, light mode looks decent but I still prefer dark mode. A new setting that is still a bit of a work in progress, but mostly finished is a hide UI hotkey , which as the name states, hides ui (in-game only). I still need to implement that the setting saves, but overall it works just fine. It’s made to only apply a keybind if you’re playing on PC, though. Fixes: autosaveUI loading/saving icon was still spinning when not visible. Fixed by seeing if the frame is actually visible (instead of if the frame exists, small typo) Shadow button now just changes immediately instead of waiting for the server to change the variable, now it just fires the remoteEvent only to save the setting autosaveUI UIstroke clipping fixed by changing it to apply inner instead of outer Tree sway intensity has been changed to be a bit lower, otherwise it’d look unnatural. Tree pivots fixed to be on the bottom for tree sway (this was a pain) Tree pivot issues: Changing tree pivots manually always broke for some reason. It took a few hours to fix them, then when I dragged the trees down it reset them. Upon pressing undo the pivots were still reset, not like they were before. Then, I tried fixing them without dragging anything, and the next time I opened studio it reset again. I found that ctrl+l may work, but that didn’t work either. Had to end up cloning everything over again, which somehow has made the shadows more intense in the dense tree areas, even though nothing changed between the two. This was NOT fun When writing this devlog, I found out that the oak trees have decided to fly in the air, so that’s great
New camera mode for the main menu! Demo is in the video! Before remaking/overhauling the main menu UI into light/dark mode (and, to look nice, of course), I’ve decided to rework the camera as it’s a bit of a weak point in the menu. It features: Camera sway Camera switching between points 15 different points for the camera Now, this has also reminded me that the main menu needs a little bit different of a song selection, as drum and bass for a gentle camera sway obviously doesn’t work. Miscellanous changes/fixes: Flying trees fixed statsGui (naming fix soonTM) bgcolor and background transparency changed in light mode to that of the old UI.
Overhauled main menu GUI including new songs and animations! Demo is in the attached video as usual! So, I’ve spent a bit of time reworking the main menu , since the old one looked “temporary” instead of finished. In my opinion, the result seems to be pretty nice . I’ve made/added/reworked: Esentially every menu New animations when moving pages or when going in-game Added hover effects for buttons Icons for the main buttons Added fake shadows to text instead of the bad-looking UIStroke like before Added image backgrounds Replaced (most) old songs! (song 1, song 3-5) It still isn’t fully finished, as I need to implement a light mode for it, but otherwise it’s fully functional! When light mode for the main menu and (maybe) loadUI is done, the focus will likely shift back to building the arcade map. Every time I test the game I somehow find bugs on accident, whoops! Anyway, there were a “few” fixes/updates that were made during development of this overhaul: Fixed spinnyCamera (script) to not repeat points Updated generateNumber for spinnyCamera (script) to go through all the points instead of randomly pick one and look repetitive Fixed autosaveUI appearing in the main menu Fixed hideUIHotkey setting (a lot of things which I won’t describe as this post isn’t meant to be a wall of text) Fixed mainMenuButton UIScale bug by resetting UIScale on click Updated both cameraFolder(s) to be models instead of folders, with ModelStreamingMode to be set to Atomic (fixes delay or infinite yielding on slower devices) Updated mainMenuUI image background transparency to 0.5 for settingsFrame, cameraModeFrame and creditsFrame Updated hideHotkey setting textColor3 when text is “Set Keybind” and added UIPadding to the button for text not to clip Fixed soundLogic volume bug that didn’t reset audio volume when going back to the main menu, in result making the song silent Updated soundLogic to fade in song volume instead of immediately start playing it at full volume And a lot more… (these are just ones found after the overhaul)
Arcade Machines They have interactable buttons (which do nothing, except move up and down) Nothing else to say about them, really.. Changes/additions: Changed song2 (main menu) due to likely being made by AI (cover seems to be aigen) Light mode setting now also changes the main menu Changed buttonFrame in-game to have wrapper frames, in result being affected by the UIListLayout, and now they don’t clip together when using smaller screens, but they can still be animated.
Arcade map update The indoor area is close to being finished! It still, of course needs a few things to be completed (for example, the food area, filling the empty space, etcetera.) Next step is, of course, the outdoors! I assume it shouldn’t take as long to make as the interior was, but who knows Another thing the game still needs is ambiance zones. (and a new ambiance sound for the indoors, of course) I’m thinking of implementing this with just 2 parts for the indoors and outdoors, which should do the trick. Every day this project is (hopefully) coming a bit closer to being shipped, but progress will slow down a bit due to school starting. In an ideal situation this’ll likely be shipped in a week, or atleast I hope to get it sort-of-ship ready by that time.
Arcade map complete! New: the outside has now been fully finished (instead of just being a baseplate) Smaller changes/additions: the arcade map now has seats , shapes on the floor and ambiance zones. As the second map is done, I’m getting closer to (finally) shipping this project, and (hopefully) getting good enough reviews to get my goal from SD. The “Desert” map will likely be a bit shorter compared to the arcade map (or even grass map, undecided.), as I don’t have that much time anymore due to school starting.
Started work on the “Desert” map. All stages are now built! There are only 5 stages due to school taking most of my time, as usual. (and, there’s already 2 other maps in the game, so that’s that)
Desert map complete! Well.. that was way faster compared to the other maps, which makes sense due to a desert.. well, being a desert. Anyway, now that the main game is done*, I’ve also made thumbnails and an icon for the game. I still need to make a README and a proper description for the game, to ship , of course. *Will likely rework the tutorial gui a bit and the ui shown when teleporting between maps Anyway, look forward to seeing a few more updates soon, as the aforementioned updates/additions shouldn’t take a while
FINALLY shipping! (after this devlog) After likely losing a few hairs here and there (/j) after these 3 (almost 3 and 1/2) months, I deem minigolf to be done. I’m kind of suprised myself that the project took so long. I believe that this, by far is the longest project I’ve ever made. During the process, I’ve learned A LOT more about studio and luau overall, which will definetly help make better games (with better implementations). I have to admit, coming closer to the end there was a bit of burnout, but the result, in my opinion, was definetly worth it. I also want to say thank you to everyone that has supported me and this project, it means a lot :) Since the last devlog, I fixed and updated the few rough edges left in the game, GitHub repository and Stardance which are: Stardance: Making a new banner (old one didn’t even match the style of the game anymore) Adding a demo link & github repository link GitHub repository: Made a README that, in my opinion, is nice. It follows the requirements that the shipping guide/README guide Stardance mentions (controls, images, demo link, features, etc) Game: Changing the teleport screen to one that blends in during teleport Changed badges for new ones (icons) and requirements (now 1, 10 and 22 stages) Made the maze in stage 8 (grass map) harder to complete, was too easy before Changed all loading music Removed the funFacts moduleScript (not needed anymore) Stage 9 sign fixed to show status for Arcade_9 instead of Arcade_3 Updated desertMap particles to be thinner Changed loadUI to have fake shadow text instead of a thick UIStroke
After a few prototypes, (a lot) I’ve decided to make another map, which a factory/warehouse type of map. So far, I’ve made these props: Conveyor Structual beam Light Unloading zones At the moment, I’m not really sure how I’ll make the stages in the map, but I have an idea of making them more interactive (somewhat similar to the arcade map.) One small mention, the map will likely be in beta or not fully finished (when or if I ship again), as Stardance is likely going to end soon.
Finished the first room in the new Factory map! What lighting style do you think is better? Realistic or soft? (shadowmap) Realistic is img 1-2, soft is 3-4 At the moment, there won’t be any minigolf courses, as I’d rather finish the building first. Also, I had a few new ideas for the game that may make it a bit more “immersive” to say the least.. Will experiment with them and post something in the future if it works out.
Ships:
I’ve made a minigolf game in Roblox studio, featuring 3 maps and 22 stages in total, with cosmetics that can be bought for your golf club or golf ball, and some nice QoL features like a music menu, or a hide UI hotkey In my opinion, the main challenging thing was building all the maps. I’m not a great map builder, so making even one map or all stages took a lot of time, plus taking on the task of making 3 maps for the first release was, admittedly, a not-so-thought-through idea. Of course, this doesn’t mean that there was just 1 challenge, this was just the main one for me. Please note: due to the Roblox guideline changes, you must have an account that is 16+ Facial Age Estimation or ID verified to play the game. This can only be changed if the game reaches 250 “active” players. There are alternatives, which is either setting up the game yourself in Roblox Studio (takes some time), or just by watching the small feature demo. These restrictions/alternatives are mentioned in the README. (written per default questions)...
|
1792853249.3186958
|
1792939649.3186958
|
|
9570
|
Capital Chaos by @sol4r_on_hackclub | Stardance
|
sol4r_on_hackclub
|
1
|
171.6
|
3336
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T19:42:41Z", "hours": 171.0, "multiplier": 19.54, "payout": 3336, "blessing": "neutral", "text": "Welcome to Capital Chaos! One of Stardance’s most awaited projects ;) (hopefully anyways) We’ve got chaos, a bunch of random events, a boss fight and so much more for you to explore. SKIP if you are on Linux/MacOS (or you can vote based on the videos - completely up to you) as I only have a windows executable for now. I am honestly super proud of this, and the community built around this game. I hope you enjoy it as well. There have been TONNES of challenges, such as pathfinding, the initial grid also seemed really daunting. To the vacancy count which was literally plaguing me for the past MONTH and got fixed today (it was one line… i know.. maybe I should have used AI). But besides, it’s a sick project. I hope you all love it. Unzip the file in the release and it should be good to go. READ THE README FOR INSTRUCTIONS AND CONTROLS!! THERE IS NO TUTORIAL Read the story, watch the videos if you can and just enjoy the game! It will be on steam in 8-9 months so maybe subscribe?", "repo": "https://github.com/Sol4rOnGit/PocketCity", "demo": "https://github.com/Sol4rOnGit/PocketCity/releases"}]...
|
[{"post_id": 57569, "ts": "202 [{"post_id": 57569, "ts": "2026-08-29T19:13:24Z", "hours": 0.5961, "text": "Thank you all so much for the support! Framework 12 is on it’s way (and this wait is painful). After 171 hours! 19.54x is actually insane and I appreciate it a lot. Join the Discord! I made a discord (click above) and i’ll give you all an early supporter role before I put it out on YouTube and stuff for the “wishlist” when the full game comes out (if you want to stay in touch after stardance is done. ALSO IF YOU COMMENTED WHILE THE GAME WAS STILL CALLED POCKET CITY DM ME ILL GIVE U A SPECIAL ROLE The game beta is still up and you can try it out Currently just doing some minor stuff to the game (Fixed some normal/easy mode not settings correct phases. B2 Bomber should destroy itself and stop the nuke siren once launched), and slowly adding a tutorial but I’m like 90% focused on revising for uni entrance exams"}, {"post_id": 52586, "ts": "2026-08-22T19:35:44Z", "hours": 3.4139, "text": "BETA TEST! Nvm I have to devlog my final changes But lemme talk to those stardance reviewers real quick. Scroll down to see the endless content of my story, and all the community feedback (also on my youtube). Playing the game is a bit of a learning curve so you can watch my videos and stuff on it as well. I’d say watch this one: Boss Fight for the boss fight and maybe one of the other ones that you find interesting. Maybe this one because it has over 1,000 views and still climbing! The game is released there but it is windows only for now (i will release linux and maybe mac on the actual release game don’t worry but I’m super restricted for time right now) SKIP IF YOU’RE ON LINUX / MAC For everyone: Changes: Amended GameAudioManager to adjust for max voices which uses a List based system that appends and unappends. Boss fight also toggles and untoggles the game audio dependant on each audio source, because the game could currently have hundreds or even thousands of audio source which is really bad optimisation. So each audio source that I want to track has a ManagedAudioSource attached which automatically registers and unregisters itself from the GameAudioManager. I also edited the boss fight to make it a touch harder and amended the moves ;) And come and beta test NOWWW. leave all your comments, suggestions etc. on THE NEW DISCORD COMMUNITY!! or youtube, i’ll read it all and, again, thank you all for your support . I don’t know what to put as the image so here."}, {"post_id": 51908, "ts": "2026-08-21T20:18:25Z", "hours": 8.8033, "text": "Final DevLog before First Ship - Boss Battle I don’t think words can explain what I made so click here to watch a video on my probably final major addition (no pressure) & also help with a small dilemma I have. NO!! that does not mean this game will stop development, but i think i finally have enough hours (+10-15 more safety) to get a Framework 12! (and then i will be able to crack on with entrance exams - so i guess development will slow a touch). Of course I’ll ship once the game is polished enough. You might see a devlog or two from the “Capital Chaos Website” - follow me ;) I really hope you guys all enjoy it and now I need to do the readme and stuff. I also realised I was one of the most viewed on Stardance which is honestly amazing and I appreciate all of the support :) And thank you to all the new friends I’ve made and all the followers and commenters. It’s honestly been insane."}, {"post_id": 49800, "ts": "2026-08-18T18:52:58Z", "hours": 3.8472, "text": "Game Sountrack? But before I talk about that, lemme just say the game audio is almost finished, we have menu sounds for clicks and stuff, and i added support for main menu music. The firetruck hoses actually do stuff, floods sound like floods, theres some peaceful background nature sounds and yeah it makes the game feel so much nicer. although i forgot place sounds which was a massive oversight. also my wifi is still working. no idea why, but not complaining. and i’m cooking on a soundtrack lowk although none of it seems correlated in any way and idk how i’ll make it fit into this game but you know what maybe it’ll just all go into some random album. None of the hours put into these songs count but its okay. i’m no pro tho so. all i’ll say is i love some bass"}, {"post_id": 49147, "ts": "2026-08-17T19:36:51Z", "hours": 2.6206, "text": "I’m getting new wifi lol, & 150 hours so yeah i won’t be here and probably will have to post a 10 hour thing BUT on the plus side, we got a nice death screen that has a bunch of quotes that you can read below [SerializeField] private string[] quotes = { \"Opportunities multiply as they are seized \\n - Sun Tzu\", \"If you are going through hell, keep going \\n - Winston Churchill\", \"No empire was built on the first draft\", \"Fall seven times, stand up eight\", \"That which does not kill us, makes us stronger \\n - Friedrich Nietzsche\", \"Out of ash, a new foundation\", \"I have not failed. I just found 10,000 ways that don't work \\n - Thomas Edison\", \"A man is not finished when he is defeated. He is finished when he quits \\n - Richard M. Nixon\", \"It does not matter how slowly you go as long as you do not stop \\n - Confucius\", \"Out of difficulties grow miracles \\n - Jean de La Bruyère\", \"The greater the obstactle, the more glory in overcoming it \\n - Molière\", \"A Pocket Sized City is too small for your ambition. Build again \\n - The Dev\", \"Success usually comes to those who are too busy to be looking for it \\n - Henry David Thoreau\", \"Go big or go home\", \"You can't give up just yet. Stay determined... \\n - Undertale\" }; Maybe you’ll catch the little easter egg there as well ;) Working on adding game audio!! and probably finally enough hours to get the framework 12 (btw I wouldn’t recommend this as a daily laptop (f13 better), I just want something I can write on lol)"}, {"post_id": 48073, "ts": "2026-08-16T11:08:59Z", "hours": 3.8794, "text": "INSANE tree optimisations Went from 60-80 fps @ 4K to 400-450 (in game). Yes a 6 to 7x increase. How you ask? GPU Mesh Instance drawing offloading the CPU work of handling thousands of game objects. In English, I’m no longer spawning thousands of tree objects, but instead telling the GPU to draw the tree instances every frame. This seems quite unintuitive because you’re now drawing thousands of things every second. BUT this means that there are no game objects, so the CPU doesn’t even know that these exist. Also the GPU draws it thousands of times anyways. A game object handles transforms, rotations, etc. that the CPU has to keep track of whether it is active or not. This had the added benefit of the trees having no overhead when the trees are disabled, so you regain all of your framerate! Also I used some neat little script that combined the meshes all together in the GameObject prefab. Now it really should be able to run on your potato PC/Laptop. Combine script using UnityEngine; public class MeshCombineUtility : MonoBehaviour { [ContextMenu(\"Combine Children Meshes\")] public void Combine() { MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>(); CombineInstance[] combine = new CombineInstance[meshFilters.Length]; Matrix4x4 matrix = transform.worldToLocalMatrix; for (int i = 0; i < meshFilters.Length; i++) { if (meshFilters[i].gameObject == gameObject) continue; combine[i].mesh = meshFilters[i].sharedMesh; combine[i].transform = matrix * meshFilters[i].transform.localToWorldMatrix; } Mesh combinedMesh = new Mesh(); combinedMesh.CombineMeshes(combine, true, true); #if UNITY_EDITOR string directory = $\"Assets/Assets/Mesh/Tree/{gameObject.name}.asset\"; UnityEditor.AssetDatabase.CreateAsset(combinedMesh, directory); UnityEditor.AssetDatabase.SaveAssets(); Debug.Log($\"Combined mesh saved to {directory}\"); #endif } } Draw section of GPU Mesh Instancing private void DrawTreeMeshes() { if (treeMesh == null || treeMaterial == null) return; foreach (var kvp in generatedChunks) { ChunkData chunk = kvp.Value; if (chunk.spawnedTrees == null || chunk.spawnedTrees.Count == 0) continue; int batchSize = 1023; int totalTrees = chunk.spawnedTrees.Count; for(int i = 0; i < totalTrees; i+=batchSize) { int length = Mathf.Min(batchSize, totalTrees - i); Matrix4x4[] subMatrices = new Matrix4x4[length]; for (int j = 0; j < length; j++) { subMatrices[j] = chunk.spawnedTrees[i + j].matrix; } int meshIndex = Mathf.Abs(chunk.chunkCord.GetHashCode() + i) % treeMesh.Length; Graphics.DrawMeshInstanced(treeMesh[meshIndex], 0, treeMaterial, subMatrices, length); } } }"}, {"post_id": 47547, "ts": "2026-08-15T14:59:51Z", "hours": 1.4756, "text": "You won’t believe it. I got it working FIRST TRY That’s actually crazy to be honest. Tells you how much expirience those 8 hours of menu development have given me. Someone give me a Unity menu doctorate or sum But on a serious note, we have game difficulty selection and its all nice and self contained. With controller support of course. You can see we have Previous Saves but that isn’t really functional yet. One of the things I learnt is to never rely on the UI giving you the data, only the click, so you’d manually add the elements and then call .value or .isOn respective to the component, and the same goes for dropdowns although I didn’t use one here. Let me know if you think it looks clean or any improvements to the UI readability, etc."}, {"post_id": 47161, "ts": "2026-08-14T20:58:41Z", "hours": 10.3042, "text": "I HATE Menus (in Unity at least) Genuinely hate them. But yeah we got settings menu working (which genuinely took like 5-6 hours because of stupid unity legacy stuff vs new stuff and then unity 6 vs 2023 version stuff i was used to) AHHHH I don’t remember it being this painful in Godot to be honest so maybe Godot is better for that? i had to get rid of VSync because it only worked on refresh. Created a debug menu to test performance, just to see that the only useful thing there was FPS and like RAM usage, and some engine stuff like active Rigidbodys. I couldn’t see the CPU utilisation or GPU utilisation which was… the thing I wanted to see. Although don’t worry performance does seem to be reasonable and early to mid game I can push over 1000 FPS on potato settings (specs at bottom if you care about them). It does obviously go down as the game continues on, but I think it’s quite optimised. Even with shadows its on 500+ FPS with a mid sized down. Although adding trees will quarter your FPS numbers. but it looks pretty so there’s your tradeoff. Although problematically if you turn trees off and you had already generated trees the fps stays low even though you’re not rendering it? I don’t know why unity is so weird. The game is quite unbalanced, but we’re in the final polishing stages (my target is 150 hours for the framework and hopefully it’s secure! (vote nice and high thanks - i did put a lot of effort into this game.) Up next: Difficulty selection Polishing Rebalancing updates Release!"}, {"post_id": 45186, "ts": "2026-08-11T14:41:21Z", "hours": 5.9322, "text": "NEW NAME!!! Flash Floods + Main Menu If you remember, Pocket City is a game that already exists so now it’s called Capital Chaos. Thank you YouTube comments! And all of you as well, for the suggestions. Ofc new video to go with it: watch by clicking here! I created flash floods that.. well flood the entire map. It’s meant to be a little toned down of a disaster, thats more survivable because it gives the game a touch more balance. It stops all services from working, so that could be detrimental during a virus attack. But on the other hand, it stops every single fire and prevents new ones and explosions. A lifesaver if theres a nuke, it gets completely nullified. Also new main menu, I think it looks pretty neat. Especially compared to the old one."}, {"post_id": 43501, "ts": "2026-08-08T20:10:46Z", "hours": 9.3828, "text": "Nukes… from a plane A famous plane. The B2 Bomber. Idk gng I got bored. No but it drops a nuke that decimates everything in a decent radius and then sets everything in a bigger radius on fire, and now we have a new rare event called a “military invasion”.. that spawns like 8 helicotpers AS WELL as the b2 bomber. The B2 Bomber starts a few clicks out and then flies toward the set target building. Then it drops the nuke, and you have a few seconds to try and kill the nuke before it kills you, and on impact (yes we are finally using rigidbodys as they are intended) it explodes. You better have that turret system ready. Of course, it’s clearly not enough. So maybe I’ll add a anti-missile system as a YouTube comment said. Speaking of YouTube, thank you for all the support :) 100+ comments goes crazy, and we’re on 73 subs up from the previous 29 literally 3 weeks ago. Not subscribed? Help a fellow dev out: TechScope Channel"}, {"post_id": 36089, "ts": "2026-07-27T23:24:15Z", "hours": 6.7969, "text": "WORKING AIR DEFENCE + ATTACK HELICOPTERS So we got working air defence turrets with some predictive aiming, and attack helicopters that shoot missiles at random buildings. Although you’re unlikely to get 3 attack helicopters at once… for now. The helicopters blades do spin, they bob up and down, they go towards buildings. They shoot out these missiles, which pathfind their way to the targetted building. They all have a healthsystem which means that the turrets do some damage on collisions only though, one turret might take a while but two (or the 7 you see below) will MOW them down. Still have to hook it all up to the Finance Manager, Special Building placement and other boring stuff, but… I need more IDEAS!! (read this thx) …for more Military stuff that can be added. Tank wars? Who knows. I was thinking of a military invasion as being one of the rare events which spawns like 10 missiles and 5 attack helicopters and maybe a B2 bomber or some stuff. I also need more allied options, maybe I’ll add like an anti-bomb turret that is specifically for the B2 bomber or something and does 100000 damage. Or maybe your own airbase that spawns an allied helicopter and now you have dogwars. or maybe your own plane. idk So yes @Adam_Lotfalla this is what the helicopter was for. Yay more things to worry about!!! Still have integrations left! I’ll see you (hopefully) tomorrow once that’s done. but its midnight now so goodbye."}, {"post_id": 35447, "ts": "2026-07-26T21:18:10Z", "hours": 1.8178, "text": "Hmmmm… What’s cooking? (Blender just WON’T count toward my hours but prolly spent 2-3 extra hours here) The helicopter blades actually spin. And W Unity particle system for the missile."}, {"post_id": 33603, "ts": "2026-07-23T17:37:47Z", "hours": 2.6228, "text": "I NEED YOUR HELP Pocket City already exists as a game. I know this is stupid and I should have checked this before starting since I had the intention of publishing it to steam but here we are. If you want more details, or more knowledge about the game check this video out: Video Oops…"}, {"post_id": 32074, "ts": "2026-07-20T23:48:35Z", "hours": 6.6703, "text": "UFOs in an Alien Invasion 💔💔 The second rare event addition to Pocket City! Get a chunk of your population zapped up by some not so friendly aliens… Any more ideas, let me know below! But it was pretty neat to implement. 3D modelled it and everything. 3 hours of doing god knows what. Tried to figure quality settings out and probably did smth else but was too busy with the World Cup to remember what I did. Probably bug fixes and stuff. Oh yeah and you see a pretty cool ripple pulse thing that propogates through the map. Although it is a little weak right now but i’ll fix that next time. Super tired. mb"}, {"post_id": 27226, "ts": "2026-07-12T16:41:03Z", "hours": 4.4661, "text": "Bugs are genuinely taking the life out of me Genuinely the worst thing ever. I STILL can’t figure it out but I had to post my weekly devlog anyways. Can you believe we’re 28 weeks into 2026??! Here’s the chaos where I accidentally created a “Pocket Empire” (Day 1105) Watch the video (click the title) if you wanna see how I ended up here and a minor crash out. very minor."}, {"post_id": 26578, "ts": "2026-07-11T14:19:18Z", "hours": 9.2114, "text": "I’m being forced to post Yeah thanks stardance. 10 hour limit for what. Probably spam filter. Also MASSIVE BUG(s). One is that the game just randomly deletes all the buildings from a chunk. No idea why, I’ve been at it for so long. Another issue is the stupid vacancy counter which has been broken FOREVER but atleast now it doesn’t go negative. I have a serious feeling I will have to spend a week just POLISHING the game. Whatever, Currently working through a new feature of allowing you to use your money that you spent so long accumulating to try and fix the chaos that you went through. This is done through the “Council FX” which I may rename if you guys can think of a better name, and you can see the countless things to do such as: Taking On DEBT!! YAY!! 100k that gains 1% every day. Seems low.. but it will pile up very quickly since it’s compound interest. Overclocking the grid for free placement + infinite water/power Maximising Housing/Business revenue Curing all infections … and many more as well as the ??? at level 100… who knows what that does. £2.5 million btw. Of course, those levels are the XP, which has finally given that a use. And no you wont be at level 11000 just like that, i’m just being lazy for testing. Also rebalanced so that all of the commercial buildings have ~10-15% of their previous employment caps. So that you’re not just spamming residential. It also makes industrial more useful as they have more employers even though they produce less money."}, {"post_id": 23054, "ts": "2026-07-05T19:50:43Z", "hours": 2.3469, "text": "Main menu 👀 I need help. UI clearly isn’t for me"}, {"post_id": 22419, "ts": "2026-07-04T21:33:08Z", "hours": 7.5172, "text": "CRIME!!! + C# Generics I added Arson and added a Police manager that goes out and solves these crimes. Lots more to come, let me know of any ideas you have! But before that let me teach you ALL something. C# Generics. I had a bunch of scripts that all did ABOUT the same thing but with different. This was FindClosestHospital, FindClosestFireStation and the thing I was adding which was FindClosestPoliceStation. It felt quire redundant to copy the same lines but instead of Hopsital it was replaced with FireStation or PoliceStation. //Generic functions private T FindClosestReachableService<T>(Vector2Int targetPos, Func<T, bool> hasAvailableVehicles, out List<Vector2Int> bestRoute) where T : Building { T closestBuilding = null; bestRoute = null; int shortestRouteLength = int.MaxValue; bool foundBuildingOfThisType = false; foreach (var kvp in gridManager.GetMapGrid()) { GridManager.GridTile tile = kvp.Value; if (tile.buildingScript != null && tile.buildingScript is T serviceBuilding) { foundBuildingOfThisType = true; if (!hasAvailableVehicles(serviceBuilding)) continue; List<Vector2Int> testRoute = CalculateRoadPath(tile.buildingScript.gridPos, targetPos); if (testRoute == null || testRoute.Count == 0) continue; if (testRoute.Count < shortestRouteLength) { shortestRouteLength = testRoute.Count; bestRoute = testRoute; closestBuilding = serviceBuilding; } } } if (!foundBuildingOfThisType) { bestRoute = null; return null; } return closestBuilding; } Above is an example of the C# generic. We have “T” type, and I think this is a good place to learn about them. Instead of defining the function as returning something like Building , we make T a type. and you can see it passed in a little <T> after the function name. We can also pass in entire functions like Func<T, bool> which is utilised as shown below: Building bestStation = FindClosestReachableService<PoliceStation>(building.gridPos, ps => ps.HasPolice(), out route); you can see ps => ps.HasPolice() calls that out. And finally, to define what T is meant to be, I’ve added where T : Building . You can do this many times, such as by having both a T as well as a U! and you’d have a repeated where T : Building where U: PotatoChips or something idk what U is meant to be bro. This was my first time using it but it’s pretty cool and if you’re using C# I’d recommend learning it as it saved me like 200 lines of code and changing something 3 times to change the same thing! And yes, I added a third thing which is Arson! which is a crime based thing, and you have a visual that shows up as a timer. if a police doesn’t solve the crime it sets on fire. It’s not too bad but it adds a use for the police, with much more to come for the police to deal with in the future! Also added asteroid BOMBARDMENT as a debuff. Yeah it’s brutal. 3 strikes… thats up to 108 tiles DESTROYED and set on fire. And of course, the image is from a youtube video: Click me!"}, {"post_id": 20327, "ts": "2026-07-01T22:02:59Z", "hours": 4.1806, "text": "BETTER UI + XP At the top of the image you can see a little progress bar… yep I’ve added XP now. Got plans for that, probably going to allow you to unlock stuff later. Like the lockdown ability etc. The UI has been overhauled. The actual images are a touch on the placeholder side apart from the road but it looks pretty good. You cycle between road, zoning and special building placement with 1, 2 and 3. Use R to rotate between the modes like residential, commercial and industrial zoning as well as Utilities & Emergency for the special buildings. Then finally T to rotate between those specific buildings. Complicated? Maybe? But it’s also a lot faster. I have completely lost my muscle memory of spamming R like the “good old days” though. Looks good? Bad? Horrible update and the game should never be changed ever again? Best update in the world and I should win £1 trillion? What do you think?"}, {"post_id": 17186, "ts": "2026-06-27T21:52:31Z", "hours": 9.9433, "text": "MAKE IT RAIN ASTEROIDS Pretty long run honestly. But before that, let’s talk about retrofitting your buildings. Earthquakes are pretty bad. Very bad when you loose your 100k building in a moment. So upgrade it. Yes it’ll cost you 35 to 55k now. But is your peace of mind worth that? And I added asteroids! These fly down and annihilate everything in a 3 unit radius and then set everything else in the 6 unit radius on fire. Lots of minor bug fixes as well, trying to get the game really polished now. Some rejigging of the game’s back end, such as creating a new abstract class for employer and reworking the systems to ensure that they run more smoothly and I believe almost finally fixing the unemployment/vacancy problem. I say almost because every 5 runs I see the game yell at me that it didn’t count something correctly but honestly I’ve spent so long on this I don’t even know if it’d be harder to just rewrite the entire employment system. For more detail, see my video linked below! See if you guys like it, my first proper long form I Added ASTEROIDS that ANNIHILATE your Adorable City And boy will this thing cook your economy."}, {"post_id": 15293, "ts": "2026-06-24T20:46:40Z", "hours": 7.6331, "text": "POLITICS!! + Debugging Hell v2 I mean I guess it is? Not too sure. Event Manager completely overhauled. Double events now no longer have the chance of repeating the same event. Created a new GameEffects script which just takes a bunch of simple code away from EventManager and plays the basic functions such as the “tax revenue increases” which you see below. This was quite a headache to create, and I severely underestimated how much time this would take. I have 2 extra nested classes inside of EventManager for Political Question and Political Scenario. [... inside EventManager.cs ...] public class PoliticalQuestion { public string Question; public TaskCompletionSource<bool> TaskCompletionSource = new TaskCompletionSource<bool>(); public Action onAccept; public PoliticalQuestion(string question, Action onAccept) { Question = question; this.onAccept = onAccept; } } public class PoliticalScenario { public string description; public Action runnable; public PoliticalScenario(string featureDescription, Action functionality) { description = featureDescription; runnable = functionality; } } [Header(\"Political Question Variables\")] public List<PoliticalQuestion> PendingQuestions = new List<PoliticalQuestion>(); public event Action onQueueChanged; private PoliticalScenario[] goodFeatures; private PoliticalScenario[] badFeatures; The political question is sent off to the UI manager, which displays it as shown below. Then it handles user input pressing Y/Enter or N/Esc to accept the user choice, and returns it back to the Event Manager. Seems simple enough, yet there are many ways to do it but I think that the above implementation works the best out of all the ones that I tried. I attempted to use Game Manager as a middleman but that did not work out - so I resorted to passing an entire class. The political scenario allows for the string to actually do something, so that the game knows what to process and what the user agreed to without creating a bunch of variables, and can allow for stacked political question events which is nice. Game’s looking really neat, and the multipliers and stuff can make the game go very crazy very quickly. Too much of a good thing is a bad thing!! Debugged the entire system for like a solid 3 hours it was actually bad. Came first in the UK tho!! I’m back after those 6 exams are done. Yes I know the UI looks pretty bad but it’s good enough for pre-beta testing. Oh yeah, speaking of UI everything is more bold. Figured out how to do that."}, {"post_id": 14641, "ts": "2026-06-23T20:29:50Z", "hours": 2.74, "text": "I HAVE A PLANN For the spinal sprint toward completion. Should end up taking me to hour 70-75? Then we polish the UI and add a main menu… lacking feature I guess. Anyways, reorganised the code base and split game manager up, created folders and fixed dependencies for everything. There is now an event manager, which handles all of the events separately, and as you can see from this simple to-do list (should my next project be the to do list to end all to do lists with calendar integration and stuff???) that I have completed the first bit “Weighted Event system”. So now nothing has an equal chance of happening! Also as a side effect made adding new effects a lot easier due to the nested WeightedEvents class which was similar to an idea I had in my old minecraft mod plugin and transferred the skills across the languages. Quite nice neat code actually, that isn’t 600 lines long, so I can quickly show it to you below. It’s very applicable and I believe I have used it twice or three times in the past 4 months alone. The declarations for the events now look like this, very centralised and easy to add/remove events and modify the weightings. Called in the Start() function. weightedEvents.Add(new WeightedEvent(\"Nothing\", 20, () => { })); weightedEvents.Add(new WeightedEvent(\"Earthquake\", 5, Earthquake)); weightedEvents.Add(new WeightedEvent(\"Fire\", 40, SetBuildingOnFire)); weightedEvents.Add(new WeightedEvent(\"Virus\", 20, () => { TriggerVirusOutbreak(); } )); and the class is just simply storing the name, the weight and a weighted Event. public class WeightedEvent { public string name; public int weight; public Action weightedEvent; public WeightedEvent(string name, int weight, Action weightedEvent) { this.name = name; this.weight = weight; this.weightedEvent = weightedEvent; } } we do need to store the total weight which happens on the Start() function currently. When playRandomEvent() is called, we increase the cursor by the event’s weight until it is greater than the rolled random number between 0 and the total weight, at which point the class’ event is called. Broke nothing in the end! That’s great isn’t it, especially after migrating a bunch of “legacy” code. Hopefully didn’t jinx it."}, {"post_id": 12737, "ts": "2026-06-20T20:33:13Z", "hours": 4.3403, "text": "Okay now i SUCK at my own video game. Don’t worry it’s hard mode. Also lost 2 hours of work somewhere cuz it didn’t save? Don’t understand how. That’s always great isn’t it. But still, 62 days in and I’m fried because of one silly mistake I made 40 days ago. Really teaches you consequences I guess. Spent my time completely overhauling how everything works. You used to make too much money, so I made the revenue even more population based, by making the max revenue a multiplier of the max population. Completely rewrote the losing population, unemployment and vacancy calculations to prevent strange negative numbers which was irritating me for the past one and a half weeks. Also overhauled the inflation to use a formula instead of a very rudimentary lookup table from if statements which is staged into a end-game (130 days+) and early game stage with 20% and 2% simple interest respectively (no not compound for once - that would make the game too hard. Extreme mode?) The game is actually like a good game now. I don’t know how to explain apart from that though."}, {"post_id": 11524, "ts": "2026-06-18T20:22:52Z", "hours": 2.1214, "text": "I FINALLY LOST IN MY OWN GAME!! Rebalancing the game slowly but surely. Currently added inflation, which increases the price of everything as the days go by. It gets less severe the longer you play but the inflation rate stays high. The game days now vary, take 5 seconds at the start and slowly get faster and faster toward 1.5s linearly. The inflation rate also increases with bands as the game progresses so you need to keep up. This makes the game a good progression, but make one mistake during an earthquake and it might be ggs for you. There is now finally a game over function… although no restart but don’t worry about it. It just pauses the game and tells you that the game is finished. Next up: Detailed Finances, Rubbish? (follow thx)"}, {"post_id": 10848, "ts": "2026-06-17T19:53:45Z", "hours": 1.2564, "text": "Currently rebalancing the video game to make the game progression more realistic as it is currently extremely difficult at the start and stupidly impossible to die toward the end. Completely forgot to tell you guys that you can follow my projects on my YouTube: Video Like & sub if you can… mb for the self promo though. Sadly I have 6 exams next week so the next 2 weeks are most likely going to be slow ones… not dominating the leaderboards anymore."}, {"post_id": 10754, "ts": "2026-06-17T17:25:21Z", "hours": 4.8722, "text": "Working healthcare! The game now has a virus… and it spreads pretty quickly. Houses get infected, added to the random event chances on top of earthquakes and fires. I created hospitals that dispatch ambulances as required. Now all services cost money. Using the same A* algorithm from last time, but a little more complex due to the nature of the virus spreading to random buildings. This requires the game to check for any viruses. I created an UI that displays the day progression, using actions & delegates again. The day length is now no longer fixed, but instead it becomes smaller the longer you stay on the map, to try and add difficulty ramping. The game is currently very difficult at the start and incredibly easy at the end, so I’m trying to reverse this a bit and make it hard at the start but terrible towards the end. Also just realised there’s no ending lol - you just become broke and softlock yourself. Never done it to myself which really speaks out about how UNBALANCED the game is. I think it’s time to work on game balancing now before implementing new features, and over half way to shipping? maybe at 65-80 hours in at this rate?"}, {"post_id": 8771, "ts": "2026-06-14T16:10:08Z", "hours": 4.5692, "text": "WORKING PATHFINDING ON THE GRID! Created new assets so the game looks complete now! You can see the firetruck going from the Fire station all the way to the burning building where it will extinguish it. Yes, it follows the roads as intended and uses the A* algorithm to figure out the best path. And they shoot water out, so visual feedback for everything. This was super fun as it was the first time I’ve implemented the A* in a video game on a grid that procedurally generated. The coal power generator, fire station and fire trucks have models now, I think I made them good enough to fit with the game. Police station and healthcare to still be implemented but it’s looking good so far. This required creating a new services manager, creating a pathfinding script, updating global services and how everything interacts with the fire, and creating reverse pathfinding and small details. It’s coming together really cleanly now."}, {"post_id": 8393, "ts": "2026-06-13T23:23:02Z", "hours": 7.1706, "text": "Debugging HELL I added fires, which you can see in the corner. Unity Particle system actually really cool for that by the way. This forced me to rewrite how fires work and add new bits to the Building parent class. That was fine. Had to update the UI to show you that an earthquake was happening, which works more reliably than last time and I figured the ghost error out. I decided to implement water & energy requirements. Overhauled ChunkManager to allow for this, as each chunk needs enough. If it doesn’t produce enough, it imports from other chunks. If it can’t do that, everyone starts packing it up and leaving. Added this to city stats. Then modelled a cute little water tower as you can see below. Then I added energy, lots of chaos. Trying really hard to avoid circular loops to avoid a stack overflow, but it’s looking pretty good. User warnings now show up, like when an earthquake happens, or if a building burns down or if you can’t do something or don’t have money for something. Now I think I have time to do the fun part - creating chaotic fun stuff to make the city feel even more alive. But it’s looking pretty good right now. It’s getting close to being shipped, almost 40 hours in. Like & follow for the link ;) Now I really need to sleep. OH NO AND REVISE FOR THE PHYSICS TEST ON TUESDAY"}, {"post_id": 8051, "ts": "2026-06-13T13:04:47Z", "hours": 2.0944, "text": "It’s been a really long time since I’ve posted. Some progress going on here. Little sneak peak of the fires… yep. You thought the game was gonna be peaceful? On another 7+ hour sprint today"}, {"post_id": 7093, "ts": "2026-06-11T21:27:16Z", "hours": 4.3672, "text": "Clean codebase always pays off (unless you want to keep your job apparently?) Fixed the vacancies counter, as before I was using = instead of +=. Told you it’s the little things that catch you out. Created a safer version of the draft forceRemoveElement() that accounts for jobs and residents when destroying a building (houses/shops/industry). This now updates the game realistically, e.g. if you destroy a house, then you reduce from the population. If the residents were employed, then it removes positions from buildings. If they were unemployed, then we remove it from the stats. Since I am not storing direct references between buildings but creating a game pool for performance, this makes the operations require lots of calling. This could probably be optimised in the future but I will do that near the first release due to the ever-changing code base. This required updating GameManager.cs to have LosePopulation(), LoseJobs() with a helper RemoveWorkersFromBuildings() function. Luckily the lists in GridMananger that I made like 20 hours ago for “future proofing” came in useful. Finally, you can press F to show city statistics and it updates in real time."}, {"post_id": 6481, "ts": "2026-06-10T22:00:31Z", "hours": 1.0161, "text": "What’s the difference between these two: int maxEmployees = 50; int employees = 25; float taxRevenue = 1500.0f; ONE : float revenue = (employees / maxEmployees) * taxRevenue; TWO: float revenue = (employees * taxRevenue) / maxEmployees; Mathematically, they’re the same. a/b * c = c/b * a However, I missed one thing while coding (a lot harder to see when it’s not just this). They’re both integers. now what C# does is it divides 25/50. we get 0.5. but they’re both integers, so it tries to store it as an integer, which floors it to a 0. Therefore, it’ll suddenly jump to max revenue when the company is full. obviously not what was intended. Option 2 makes you multiply the integer with a float, and stores 25 * 1500 as a float, which can now be nicely divided by 50 to get the value that we inteded. Sometimes… actually, no MOST of the time it’s the little things that catch you out. Anyways, this has very much balanced the game. The companies get as many employees as they can, then grow by 1 employee each day. Their revenue scales with the employee count, so now residential houses are useful for once. If anything, essential. Next up: Road tax, Land tax. This might be the one time you want tax… or maybe it’s too much?"}, {"post_id": 6445, "ts": "2026-06-10T20:48:12Z", "hours": 1.1464, "text": "Sometimes, the most productive thing you can do is destroying everything for a clean slate. So that’s what I did and refactored my codebase, painting my GitHub red. The old city generation code ended up becoming messy spaghetti code that made it difficult to debug and work on it. And that sort of legacy code when I look back in a month is what ends up shelving projects for years on end. This half an hour will save me many in the future. I also removed the cluster expansion method of building expansion completely as it created annoying expansions that didn’t make sense of everything being 1 square off a road. Also created a GameManager and moved aspects of GridManager and FinanceManager to the new script, to try and centralise the logic and stop having random bits such as the day manager in the FinanceMananger, which didn’t make an sense. Also yes, I wasted 20 minutes trying to figure out what was going wrong when I forgot to add GameManager.cs to the scene 💔"}, {"post_id": 6367, "ts": "2026-06-10T18:39:39Z", "hours": 3.0794, "text": "It can’t POSSIBLY BE THAT HARD CAN IT? No but you have to mix up TAGS AND LAYERS. There’s some error you got 5 builds ago but NEVER APPEARED AGAIN. EVEN HOURS INTO TESTING. HOW DID IT FIX ITSELF?! The UI now updates how much you gained in the past day! But anyways, you can finally toggle between the layers… after too much debugging (and realising it was just me being stupid). But it’s okay I’ll hopefully get that laptop from this blood sweat and tears. Look how gorgeous it looks now!"}, {"post_id": 5918, "ts": "2026-06-09T22:00:15Z", "hours": 5.0561, "text": "Did you know it costs more to remove a road than create one?! Strange… Finally have a working economy in the game now! It’s VERY unbalanced. You WILL become very rich. And residential is currently useless, and everything just has a set employee count for now. But that will change soon, and we’ll make the game intelligent. Also the game clock is currently in the Finance Manager which is a little odd so maybe I’ll fix that later. But, I have used actions & delegates to optimise the game handling of the ridiculous amount of scripts for each building that will be running once the cities become larger and larger. Created a UI manager to update the script, which uses the above actions & delegates from the script manager. Created a Finance Manager which led me to have to recode GridManager for monetary support, but that was honestly less painful than it sounds. I also spent a considerable amount of time debugging last post’s Zoning. The code has multiple ways of producing a building and this caused me to have to go back and go through all of the code line by line to figure all the pathways out and debug it eventually. And yes, as promised I made it cost money to zone. Every action, such as creating a road and destroying them cost money and using my amazing research skills of using the first google result, destroying a road costs double placing a road! I think I should sleep. See you soon!"}, {"post_id": 5134, "ts": "2026-06-08T20:27:14Z", "hours": 2.4142, "text": "CITY ZONING! Annoyed that a massive skyscraper decided to spawn right next to a nice cozy cottage? Not anymore! You can zone areas by residential, commercial and industrial. There is also a “No Build” zone for areas that you just want to keep clear for now. This will eventually cost you money, because paperwork is really expensive apparently. (And to keep the game balanced of course). But there’s no money yet. I think you should like & follow to see how the game’s economy works."}, {"post_id": 4989, "ts": "2026-06-08T17:13:15Z", "hours": 2.5267, "text": "Pocket City Dev 5 The terrain was a little bland, so I decided to spice it up with nature. To fill the grid up, I decided to implement trees. Created a few basic tree grid varieties and implemented it into GridManager.cs. However, this forced me to spawn all of the trees in the Start() function which causes a longer loading time, CPU spike and worst of all it makes it so that after the initial radius no more trees spawn. Increasing the radius exponentially increases the amount of trees being added (because each ring has more grid sections to cover). So i had to pivot. I created a new Chunk Manager, split the main grid up into 16x16 chunks, and checked the player camera and only loaded the surrounding chunks. This makes trees spawn around the player continuously. However, this would become laggy as it would happen every frame. Two ways I decided to prevent this: Check if the player had changed chunks. If it’s still the same chunk, early return to skip the entire code process. Check if the nature has already been loaded. Only load if not loaded. This obviously saves on time complexity, and allows me to have the freedom of creating varying tree density. It also makes it so that the trees do not regenerate constantly. And that completes the visuals for now. Probably will add more foliage and other variety in the future, but for now this will suffice. Finally, this has a severe performance penalty. To cater for lower-end devices, I added a toggle which will later come to a settings menu for ~4x the performance without impacting gameplay. Optimisations, such as chunkloading and LODs will be added later to increase the performance with trees, but that will come after the core game is finalised."}, {"post_id": 3868, "ts": "2026-06-06T23:09:38Z", "hours": 2.8567, "text": "Hello everyone! The city is finally generating. They automatically generate alongside roads or try grow in clusters with each other. Game looks pretty sweet. Almost 9 hours in, I think it’s time to get some sleep now."}, {"post_id": 3730, "ts": "2026-06-06T19:33:02Z", "hours": 4.095, "text": "Coming first in the UK leaderboard is pretty honourable. Anyways, working on Pocket City and we’ve almost got generation of buildings and I’ve got a lot of things lined up for this project. I really need that framework 12 💔. The roads have a cursor and you can destroy and create them in a row as well, camera movement is more polished with a sprint key. Got all the building assets and everything ready. What a entry to stardance & hackclub!"}, {"post_id": 3473, "ts": "2026-06-06T12:53:43Z", "hours": 1.3806, "text": "Procedural road addition, so that when you add a tile (which is still done through code currently), it will decide which road layout to add, be it an intersection, 4 way, 3 way, a road turn or anything else. Added clean camera movement with WSAD + scroll as well."}, {"post_id": 3429, "ts": "2026-06-06T11:20:47Z", "hours": 1.0264, "text": "Hello! I’m working on creating a top-down 2D-styled but 3D game where you control a city. I’ve got this grid layout so far and it works fabulously and I somehow got the rotations correct on the first try 🤣"}]...
|
Title: Capital Chaos by @sol4r_on_hackclub | Stard Title: Capital Chaos by @sol4r_on_hackclub | Stardance
Devlogs:
Hello! I’m working on creating a top-down 2D-styled but 3D game where you control a city. I’ve got this grid layout so far and it works fabulously and I somehow got the rotations correct on the first try 🤣
Procedural road addition, so that when you add a tile (which is still done through code currently), it will decide which road layout to add, be it an intersection, 4 way, 3 way, a road turn or anything else. Added clean camera movement with WSAD + scroll as well.
Coming first in the UK leaderboard is pretty honourable. Anyways, working on Pocket City and we’ve almost got generation of buildings and I’ve got a lot of things lined up for this project. I really need that framework 12 💔. The roads have a cursor and you can destroy and create them in a row as well, camera movement is more polished with a sprint key. Got all the building assets and everything ready. What a entry to stardance & hackclub!
Hello everyone! The city is finally generating. They automatically generate alongside roads or try grow in clusters with each other. Game looks pretty sweet. Almost 9 hours in, I think it’s time to get some sleep now.
Pocket City Dev 5 The terrain was a little bland, so I decided to spice it up with nature. To fill the grid up, I decided to implement trees. Created a few basic tree grid varieties and implemented it into GridManager.cs. However, this forced me to spawn all of the trees in the Start() function which causes a longer loading time, CPU spike and worst of all it makes it so that after the initial radius no more trees spawn. Increasing the radius exponentially increases the amount of trees being added (because each ring has more grid sections to cover). So i had to pivot. I created a new Chunk Manager, split the main grid up into 16x16 chunks, and checked the player camera and only loaded the surrounding chunks. This makes trees spawn around the player continuously. However, this would become laggy as it would happen every frame. Two ways I decided to prevent this: Check if the player had changed chunks. If it’s still the same chunk, early return to skip the entire code process. Check if the nature has already been loaded. Only load if not loaded. This obviously saves on time complexity, and allows me to have the freedom of creating varying tree density. It also makes it so that the trees do not regenerate constantly. And that completes the visuals for now. Probably will add more foliage and other variety in the future, but for now this will suffice. Finally, this has a severe performance penalty. To cater for lower-end devices, I added a toggle which will later come to a settings menu for ~4x the performance without impacting gameplay. Optimisations, such as chunkloading and LODs will be added later to increase the performance with trees, but that will come after the core game is finalised.
CITY ZONING! Annoyed that a massive skyscraper decided to spawn right next to a nice cozy cottage? Not anymore! You can zone areas by residential, commercial and industrial. There is also a “No Build” zone for areas that you just want to keep clear for now. This will eventually cost you money, because paperwork is really expensive apparently. (And to keep the game balanced of course). But there’s no money yet. I think you should like & follow to see how the game’s economy works.
Did you know it costs more to remove a road than create one?! Strange… Finally have a working economy in the game now! It’s VERY unbalanced. You WILL become very rich. And residential is currently useless, and everything just has a set employee count for now. But that will change soon, and we’ll make the game intelligent. Also the game clock is currently in the Finance Manager which is a little odd so maybe I’ll fix that later. But, I have used actions & delegates to optimise the game handling of the ridiculous amount of scripts for each building that will be running once the cities become larger and larger. Created a UI manager to update the script, which uses the above actions & delegates from the script manager. Created a Finance Manager which led me to have to recode GridManager for monetary support, but that was honestly less painful than it sounds. I also spent a considerable amount of time debugging last post’s Zoning. The code has multiple ways of producing a building and this caused me to have to go back and go through all of the code line by line to figure all the pathways out and debug it eventually. And yes, as promised I made it cost money to zone. Every action, such as creating a road and destroying them cost money and using my amazing research skills of using the first google result, destroying a road costs double placing a road! I think I should sleep. See you soon!
It can’t POSSIBLY BE THAT HARD CAN IT? No but you have to mix up TAGS AND LAYERS. There’s some error you got 5 builds ago but NEVER APPEARED AGAIN. EVEN HOURS INTO TESTING. HOW DID IT FIX ITSELF?! The UI now updates how much you gained in the past day! But anyways, you can finally toggle between the layers… after too much debugging (and realising it was just me being stupid). But it’s okay I’ll hopefully get that laptop from this blood sweat and tears. Look how gorgeous it looks now!
Sometimes, the most productive thing you can do is destroying everything for a clean slate. So that’s what I did and refactored my codebase, painting my GitHub red. The old city generation code ended up becoming messy spaghetti code that made it difficult to debug and work on it. And that sort of legacy code when I look back in a month is what ends up shelving projects for years on end. This half an hour will save me many in the future. I also removed the cluster expansion method of building expansion completely as it created annoying expansions that didn’t make sense of everything being 1 square off a road. Also created a GameManager and moved aspects of GridManager and FinanceManager to the new script, to try and centralise the logic and stop having random bits such as the day manager in the FinanceMananger, which didn’t make an sense. Also yes, I wasted 20 minutes trying to figure out what was going wrong when I forgot to add GameManager.cs to the scene 💔
What’s the difference between these two: int maxEmployees = 50; int employees = 25; float taxRevenue = 1500.0f; ONE : float revenue = (employees / maxEmployees) * taxRevenue; TWO: float revenue = (employees * taxRevenue) / maxEmployees; Mathematically, they’re the same. a/b * c = c/b * a However, I missed one thing while coding (a lot harder to see when it’s not just this). They’re both integers. now what C# does is it divides 25/50. we get 0.5. but they’re both integers, so it tries to store it as an integer, which floors it to a 0. Therefore, it’ll suddenly jump to max revenue when the company is full. obviously not what was intended. Option 2 makes you multiply the integer with a float, and stores 25 * 1500 as a float, which can now be nicely divided by 50 to get the value that we inteded. Sometimes… actually, no MOST of the time it’s the little things that catch you out. Anyways, this has very much balanced the game. The companies get as many employees as they can, then grow by 1 employee each day. Their revenue scales with the employee count, so now residential houses are useful for once. If anything, essential. Next up: Road tax, Land tax. This might be the one time you want tax… or maybe it’s too much?
Clean codebase always pays off (unless you want to keep your job apparently?) Fixed the vacancies counter, as before I was using = instead of +=. Told you it’s the little things that catch you out. Created a safer version of the draft forceRemoveElement() that accounts for jobs and residents when destroying a building (houses/shops/industry). This now updates the game realistically, e.g. if you destroy a house, then you reduce from the population. If the residents were employed, then it removes positions from buildings. If they were unemployed, then we remove it from the stats. Since I am not storing direct references between buildings but creating a game pool for performance, this makes the operations require lots of calling. This could probably be optimised in the future but I will do that near the first release due to the ever-changing code base. This required updating GameManager.cs to have LosePopulation(), LoseJobs() with a helper RemoveWorkersFromBuildings() function. Luckily the lists in GridMananger that I made like 20 hours ago for “future proofing” came in useful. Finally, you can press F to show city statistics and it updates in real time.
It’s been a really long time since I’ve posted. Some progress going on here. Little sneak peak of the fires… yep. You thought the game was gonna be peaceful? On another 7+ hour sprint today
Debugging HELL I added fires, which you can see in the corner. Unity Particle system actually really cool for that by the way. This forced me to rewrite how fires work and add new bits to the Building parent class. That was fine. Had to update the UI to show you that an earthquake was happening, which works more reliably than last time and I figured the ghost error out. I decided to implement water & energy requirements. Overhauled ChunkManager to allow for this, as each chunk needs enough. If it doesn’t produce enough, it imports from other chunks. If it can’t do that, everyone starts packing it up and leaving. Added this to city stats. Then modelled a cute little water tower as you can see below. Then I added energy, lots of chaos. Trying really hard to avoid circular loops to avoid a stack overflow, but it’s looking pretty good. User warnings now show up, like when an earthquake happens, or if a building burns down or if you can’t do something or don’t have money for something. Now I think I have time to do the fun part - creating chaotic fun stuff to make the city feel even more alive. But it’s looking pretty good right now. It’s getting close to being shipped, almost 40 hours in. Like & follow for the link ;) Now I really need to sleep. OH NO AND REVISE FOR THE PHYSICS TEST ON TUESDAY
WORKING PATHFINDING ON THE GRID! Created new assets so the game looks complete now! You can see the firetruck going from the Fire station all the way to the burning building where it will extinguish it. Yes, it follows the roads as intended and uses the A* algorithm to figure out the best path. And they shoot water out, so visual feedback for everything. This was super fun as it was the first time I’ve implemented the A* in a video game on a grid that procedurally generated. The coal power generator, fire station and fire trucks have models now, I think I made them good enough to fit with the game. Police station and healthcare to still be implemented but it’s looking good so far. This required creating a new services manager, creating a pathfinding script, updating global services and how everything interacts with the fire, and creating reverse pathfinding and small details. It’s coming together really cleanly now.
Working healthcare! The game now has a virus… and it spreads pretty quickly. Houses get infected, added to the random event chances on top of earthquakes and fires. I created hospitals that dispatch ambulances as required. Now all services cost money. Using the same A* algorithm from last time, but a little more complex due to the nature of the virus spreading to random buildings. This requires the game to check for any viruses. I created an UI that displays the day progression, using actions & delegates again. The day length is now no longer fixed, but instead it becomes smaller the longer you stay on the map, to try and add difficulty ramping. The game is currently very difficult at the start and incredibly easy at the end, so I’m trying to reverse this a bit and make it hard at the start but terrible towards the end. Also just realised there’s no ending lol - you just become broke and softlock yourself. Never done it to myself which really speaks out about how UNBALANCED the game is. I think it’s time to work on game balancing now before implementing new features, and over half way to shipping? maybe at 65-80 hours in at this rate?
Currently rebalancing the video game to make the game progression more realistic as it is currently extremely difficult at the start and stupidly impossible to die toward the end. Completely forgot to tell you guys that you can follow my projects on my YouTube: Video Like & sub if you can… mb for the self promo though. Sadly I have 6 exams next week so the next 2 weeks are most likely going to be slow ones… not dominating the leaderboards anymore.
I FINALLY LOST IN MY OWN GAME!! Rebalancing the game slowly but surely. Currently added inflation, which increases the price of everything as the days go by. It gets less severe the longer you play but the inflation rate stays high. The game days now vary, take 5 seconds at the start and slowly get faster and faster toward 1.5s linearly. The inflation rate also increases with bands as the game progresses so you need to keep up. This makes the game a good progression, but make one mistake during an earthquake and it might be ggs for you. There is now finally a game over function… although no restart but don’t worry about it. It just pauses the game and tells you that the game is finished. Next up: Detailed Finances, Rubbish? (follow thx)
Okay now i SUCK at my own video game. Don’t worry it’s hard mode. Also lost 2 hours of work somewhere cuz it didn’t save? Don’t understand how. That’s always great isn’t it. But still, 62 days in and I’m fried because of one silly mistake I made 40 days ago. Really teaches you consequences I guess. Spent my time completely overhauling how everything works. You used to make too much money, so I made the revenue even more population based, by making the max revenue a multiplier of the max population. Completely rewrote the losing population, unemployment and vacancy calculations to prevent strange negative numbers which was irritating me for the past one and a half weeks. Also overhauled the inflation to use a formula instead of a very rudimentary lookup table from if statements which is staged into a end-game (130 days+) and early game stage with 20% and 2% simple interest respectively (no not compound for once - that would make the game too hard. Extreme mode?) The game is actually like a good game now. I don’t know how to explain apart from that though.
I HAVE A PLANN For the spinal sprint toward completion. Should end up taking me to hour 70-75? Then we polish the UI and add a main menu… lacking feature I guess. Anyways, reorganised the code base and split game manager up, created folders and fixed dependencies for everything. There is now an event manager, which handles all of the events separately, and as you can see from this simple to-do list (should my next project be the to do list to end all to do lists with calendar integration and stuff???) that I have completed the first bit “Weighted Event system”. So now nothing has an equal chance of happening! Also as a side effect made adding new effects a lot easier due to the nested WeightedEvents class which was similar to an idea I had in my old minecraft mod plugin and transferred the skills across the languages. Quite nice neat code actually, that isn’t 600 lines long, so I can quickly show it to you below. It’s very applicable and I believe I have used it twice or three times in the past 4 months alone. The declarations for the events now look like this, very centralised and easy to add/remove events and modify the weightings. Called in the Start() function. weightedEvents.Add(new WeightedEvent("Nothing", 20, () => { })); weightedEvents.Add(new WeightedEvent("Earthquake", 5, Earthquake)); weightedEvents.Add(new WeightedEvent("Fire", 40, SetBuildingOnFire)); weightedEvents.Add(new WeightedEvent("Virus", 20, () => { TriggerVirusOutbreak(); } )); and the class is just simply storing the name, the weight and a weighted Event. public class WeightedEvent { public string name; public int weight; public Action weightedEvent; public WeightedEvent(string name, int weight, Action weightedEvent) { this.name = name; this.weight = weight; this.weightedEvent = weightedEvent; } } we do need to store the total weight which happens on the Start() function currently. When playRandomEvent() is called, we increase the cursor by the event’s weight until it is greater than the rolled random number between 0 and the total weight, at which point the class’ event is called. Broke nothing in the end! That’s great isn’t it, especially after migrating a bunch of “legacy” code. Hopefully didn’t jinx it.
POLITICS!! + Debugging Hell v2 I mean I guess it is? Not too sure. Event Manager completely overhauled. Double events now no longer have the chance of repeating the same event. Created a new GameEffects script which just takes a bunch of simple code away from EventManager and plays the basic functions such as the “tax revenue increases” which you see below. This was quite a headache to create, and I severely underestimated how much time this would take. I have 2 extra nested classes inside of EventManager for Political Question and Political Scenario. [... inside EventManager.cs ...] public class PoliticalQuestion { public string Question; public TaskCompletionSource<bool> TaskCompletionSource = new TaskCompletionSource<bool>(); public Action onAccept; public PoliticalQuestion(string question, Action onAccept) { Question = question; this.onAccept = onAccept; } } public class PoliticalScenario { public string description; public Action runnable; public PoliticalScenario(string featureDescription, Action functionality) { description = featureDescription; runnable = functionality; } } [Header("Political Question Variables")] public List<PoliticalQuestion> PendingQuestions = new List<PoliticalQuestion>(); public event Action onQueueChanged; private PoliticalScenario[] goodFeatures; private PoliticalScenario[] badFeatures; The political question is sent off to the UI manager, which displays it as shown below. Then it handles user input pressing Y/Enter or N/Esc to accept the user choice, and returns it back to the Event Manager. Seems simple enough, yet there are many ways to do it but I think that the above implementation works the best out of all the ones that I tried. I attempted to use Game Manager as a middleman but that did not work out - so I resorted to passing an entire class. The political scenario allows for the string to actually do something, so that the game knows what to process and what the user agreed to without creating a bunch of variables, and can allow for stacked political question events which is nice. Game’s looking really neat, and the multipliers and stuff can make the game go very crazy very quickly. Too much of a good thing is a bad thing!! Debugged the entire system for like a solid 3 hours it was actually bad. Came first in the UK tho!! I’m back after those 6 exams are done. Yes I know the UI looks pretty bad but it’s good enough for pre-beta testing. Oh yeah, speaking of UI everything is more bold. Figured out how to do that.
MAKE IT RAIN ASTEROIDS Pretty long run honestly. But before that, let’s talk about retrofitting your buildings. Earthquakes are pretty bad. Very bad when you loose your 100k building in a moment. So upgrade it. Yes it’ll cost you 35 to 55k now. But is your peace of mind worth that? And I added asteroids! These fly down and annihilate everything in a 3 unit radius and then set everything else in the 6 unit radius on fire. Lots of minor bug fixes as well, trying to get the game really polished now. Some rejigging of the game’s back end, such as creating a new abstract class for employer and reworking the systems to ensure that they run more smoothly and I believe almost finally fixing the unemployment/vacancy problem. I say almost because every 5 runs I see the game yell at me that it didn’t count something correctly but honestly I’ve spent so long on this I don’t even know if it’d be harder to just rewrite the entire employment system. For more detail, see my video linked below! See if you guys like it, my first proper long form I Added ASTEROIDS that ANNIHILATE your Adorable City And boy will this thing cook your economy.
BETTER UI + XP At the top of the image you can see a little progress bar… yep I’ve added XP now. Got plans for that, probably going to allow you to unlock stuff later. Like the lockdown ability etc. The UI has been overhauled. The actual images are a touch on the placeholder side apart from the road but it looks pretty good. You cycle between road, zoning and special building placement with 1, 2 and 3. Use R to rotate between the modes like residential, commercial and industrial zoning as well as Utilities & Emergency for the special buildings. Then finally T to rotate between those specific buildings. Complicated? Maybe? But it’s also a lot faster. I have completely lost my muscle memory of spamming R like the “good old days” though. Looks good? Bad? Horrible update and the game should never be changed ever again? Best update in the world and I should win £1 trillion? What do you think?
CRIME!!! + C# Generics I added Arson and added a Police manager that goes out and solves these crimes. Lots more to come, let me know of any ideas you have! But before that let me teach you ALL something. C# Generics. I had a bunch of scripts that all did ABOUT the same thing but with different. This was FindClosestHospital, FindClosestFireStation and the thing I was adding which was FindClosestPoliceStation. It felt quire redundant to copy the same lines but instead of Hopsital it was replaced with FireStation or PoliceStation. //Generic functions private T FindClosestReachableService<T>(Vector2Int targetPos, Func<T, bool> hasAvailableVehicles, out List<Vector2Int> bestRoute) where T : Building { T closestBuilding = null; bestRoute = null; int shortestRouteLength = int.MaxValue; bool foundBuildingOfThisType = false; foreach (var kvp in gridManager.GetMapGrid()) { GridManager.GridTile tile = kvp.Value; if (tile.buildingScript != null && tile.buildingScript is T serviceBuilding) { foundBuildingOfThisType = true; if (!hasAvailableVehicles(serviceBuilding)) continue; List<Vector2Int> testRoute = CalculateRoadPath(tile.buildingScript.gridPos, targetPos); if (testRoute == null || testRoute.Count == 0) continue; if (testRoute.Count < shortestRouteLength) { shortestRouteLength = testRoute.Count; bestRoute = testRoute; closestBuilding = serviceBuilding; } } } if (!foundBuildingOfThisType) { bestRoute = null; return null; } return closestBuilding; } Above is an example of the C# generic. We have “T” type, and I think this is a good place to learn about them. Instead of defining the function as returning something like Building , we make T a type. and you can see it passed in a little <T> after the function name. We can also pass in entire functions like Func<T, bool> which is utilised as shown below: Building bestStation = FindClosestReachableService<PoliceStation>(building.gridPos, ps => ps.HasPolice(), out route); you can see ps => ps.HasPolice() calls that out. And finally, to define what T is meant to be, I’ve added where T : Building . You can do this many times, such as by having both a T as well as a U! and you’d have a repeated where T : Building where U: PotatoChips or something idk what U is meant to be bro. This was my first time using it but it’s pretty cool and if you’re using C# I’d recommend learning it as it saved me like 200 lines of code and changing something 3 times to change the same thing! And yes, I added a third thing which is Arson! which is a crime based thing, and you have a visual that shows up as a timer. if a police doesn’t solve the crime it sets on fire. It’s not too bad but it adds a use for the police, with much more to come for the police to deal with in the future! Also added asteroid BOMBARDMENT as a debuff. Yeah it’s brutal. 3 strikes… thats up to 108 tiles DESTROYED and set on fire. And of course, the image is from a youtube video: Click me!
Main menu 👀 I need help. UI clearly isn’t for me
I’m being forced to post Yeah thanks stardance. 10 hour limit for what. Probably spam filter. Also MASSIVE BUG(s). One is that the game just randomly deletes all the buildings from a chunk. No idea why, I’ve been at it for so long. Another issue is the stupid vacancy counter which has been broken FOREVER but atleast now it doesn’t go negative. I have a serious feeling I will have to spend a week just POLISHING the game. Whatever, Currently working through a new feature of allowing you to use your money that you spent so long accumulating to try and fix the chaos that you went through. This is done through the “Council FX” which I may rename if you guys can think of a better name, and you can see the countless things to do such as: Taking On DEBT!! YAY!! 100k that gains 1% every day. Seems low.. but it will pile up very quickly since it’s compound interest. Overclocking the grid for free placement + infinite water/power Maximising Housing/Business revenue Curing all infections … and many more as well as the ??? at level 100… who knows what that does. £2.5 million btw. Of course, those levels are the XP, which has finally given that a use. And no you wont be at level 11000 just like that, i’m just being lazy for testing. Also rebalanced so that all of the commercial buildings have ~10-15% of their previous employment caps. So that you’re not just spamming residential. It also makes industrial more useful as they have more employers even though they produce less money.
Bugs are genuinely taking the life out of me Genuinely the worst thing ever. I STILL can’t figure it out but I had to post my weekly devlog anyways. Can you believe we’re 28 weeks into 2026??! Here’s the chaos where I accidentally created a “Pocket Empire” (Day 1105) Watch the video (click the title) if you wanna see how I ended up here and a minor crash out. very minor.
UFOs in an Alien Invasion 💔💔 The second rare event addition to Pocket City! Get a chunk of your population zapped up by some not so friendly aliens… Any more ideas, let me know below! But it was pretty neat to implement. 3D modelled it and everything. 3 hours of doing god knows what. Tried to figure quality settings out and probably did smth else but was too busy with the World Cup to remember what I did. Probably bug fixes and stuff. Oh yeah and you see a pretty cool ripple pulse thing that propogates through the map. Although it is a little weak right now but i’ll fix that next time. Super tired. mb
I NEED YOUR HELP Pocket City already exists as a game. I know this is stupid and I should have checked this before starting since I had the intention of publishing it to steam but here we are. If you want more details, or more knowledge about the game check this video out: Video Oops…
Hmmmm… What’s cooking? (Blender just WON’T count toward my hours but prolly spent 2-3 extra hours here) The helicopter blades actually spin. And W Unity particle system for the missile.
WORKING AIR DEFENCE + ATTACK HELICOPTERS So we got working air defence turrets with some predictive aiming, and attack helicopters that shoot missiles at random buildings. Although you’re unlikely to get 3 attack helicopters at once… for now. The helicopters blades do spin, they bob up and down, they go towards buildings. They shoot out these missiles, which pathfind their way to the targetted building. They all have a healthsystem which means that the turrets do some damage on collisions only though, one turret might take a while but two (or the 7 you see below) will MOW them down. Still have to hook it all up to the Finance Manager, Special Building placement and other boring stuff, but… I need more IDEAS!! (read this thx) …for more Military stuff that can be added. Tank wars? Who knows. I was thinking of a military invasion as being one of the rare events which spawns like 10 missiles and 5 attack helicopters and maybe a B2 bomber or some stuff. I also need more allied options, maybe I’ll add like an anti-bomb turret that is specifically for the B2 bomber or something and does 100000 damage. Or maybe your own airbase that spawns an allied helicopter and now you have dogwars. or maybe your own plane. idk So yes @Adam_Lotfalla this is what the helicopter was for. Yay more things to worry about!!! Still have integrations left! I’ll see you (hopefully) tomorrow once that’s done. but its midnight now so goodbye.
Nukes… from a plane A famous plane. The B2 Bomber. Idk gng I got bored. No but it drops a nuke that decimates everything in a decent radius and then sets everything in a bigger radius on fire, and now we have a new rare event called a “military invasion”.. that spawns like 8 helicotpers AS WELL as the b2 bomber. The B2 Bomber starts a few clicks out and then flies toward the set target building. Then it drops the nuke, and you have a few seconds to try and kill the nuke before it kills you, and on impact (yes we are finally using rigidbodys as they are intended) it explodes. You better have that turret system ready. Of course, it’s clearly not enough. So maybe I’ll add a anti-missile system as a YouTube comment said. Speaking of YouTube, thank you for all the support :) 100+ comments goes crazy, and we’re on 73 subs up from the previous 29 literally 3 weeks ago. Not subscribed? Help a fellow dev out: TechScope Channel
NEW NAME!!! Flash Floods + Main Menu If you remember, Pocket City is a game that already exists so now it’s called Capital Chaos. Thank you YouTube comments! And all of you as well, for the suggestions. Ofc new video to go with it: watch by clicking here! I created flash floods that.. well flood the entire map. It’s meant to be a little toned down of a disaster, thats more survivable because it gives the game a touch more balance. It stops all services from working, so that could be detrimental during a virus attack. But on the other hand, it stops every single fire and prevents new ones and explosions. A lifesaver if theres a nuke, it gets completely nullified. Also new main menu, I think it looks pretty neat. Especially compared to the old one.
I HATE Menus (in Unity at least) Genuinely hate them. But yeah we got settings menu working (which genuinely took like 5-6 hours because of stupid unity legacy stuff vs new stuff and then unity 6 vs 2023 version stuff i was used to) AHHHH I don’t remember it being this painful in Godot to be honest so maybe Godot is better for that? i had to get rid of VSync because it only worked on refresh. Created a debug menu to test performance, just to see that the only useful thing there was FPS and like RAM usage, and some engine stuff like active Rigidbodys. I couldn’t see the CPU utilisation or GPU utilisation which was… the thing I wanted to see. Although don’t worry performance does seem to be reasonable and early to mid game I can push over 1000 FPS on potato settings (specs at bottom if you care about them). It does obviously go down as the game continues on, but I think it’s quite optimised. Even with shadows its on 500+ FPS with a mid sized down. Although adding trees will quarter your FPS numbers. but it looks pretty so there’s your tradeoff. Although problematically if you turn trees off and you had already generated trees the fps stays low even though you’re not rendering it? I don’t know why unity is so weird. The game is quite unbalanced, but we’re in the final polishing stages (my target is 150 hours for the framework and hopefully it’s secure! (vote nice and high thanks - i did put a lot of effort into this game.) Up next: Difficulty selection Polishing Rebalancing updates Release!
You won’t believe it. I got it working FIRST TRY That’s actually crazy to be honest. Tells you how much expirience those 8 hours of menu development have given me. Someone give me a Unity menu doctorate or sum But on a serious note, we have game difficulty selection and its all nice and self contained. With controller support of course. You can see we have Previous Saves but that isn’t really functional yet. One of the things I learnt is to never rely on the UI giving you the data, only the click, so you’d manually add the elements and then call .value or .isOn respective to the component, and the same goes for dropdowns although I didn’t use one here. Let me know if you think it looks clean or any improvements to the UI readability, etc.
INSANE tree optimisations Went from 60-80 fps @ 4K to 400-450 (in game). Yes a 6 to 7x increase. How you ask? GPU Mesh Instance drawing offloading the CPU work of handling thousands of game objects. In English, I’m no longer spawning thousands of tree objects, but instead telling the GPU to draw the tree instances every frame. This seems quite unintuitive because you’re now drawing thousands of things every second. BUT this means that there are no game objects, so the CPU doesn’t even know that these exist. Also the GPU draws it thousands of times anyways. A game object handles transforms, rotations, etc. that the CPU has to keep track of whether it is active or not. This had the added benefit of the trees having no overhead when the trees are disabled, so you regain all of your framerate! Also I used some neat little script that combined the meshes all together in the GameObject prefab. Now it really should be able to run on your potato PC/Laptop. Combine script using UnityEngine; public class MeshCombineUtility : MonoBehaviour { [ContextMenu("Combine Children Meshes")] public void Combine() { MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>(); CombineInstance[] combine = new CombineInstance[meshFilters.Length]; Matrix4x4 matrix = transform.worldToLocalMatrix; for (int i = 0; i < meshFilters.Length; i++) { if (meshFilters[i].gameObject == gameObject) continue; combine[i].mesh = meshFilters[i].sharedMesh; combine[i].transform = matrix * meshFilters[i].transform.localToWorldMatrix; } Mesh combinedMesh = new Mesh(); combinedMesh.CombineMeshes(combine, true, true); #if UNITY_EDITOR string directory = $"Assets/Assets/Mesh/Tree/{gameObject.name}.asset"; UnityEditor.AssetDatabase.CreateAsset(combinedMesh, directory); UnityEditor.AssetDatabase.SaveAssets(); Debug.Log($"Combined mesh saved to {directory}"); #endif } } Draw section of GPU Mesh Instancing private void DrawTreeMeshes() { if (treeMesh == null || treeMaterial == null) return; foreach (var kvp in generatedChunks) { ChunkData chunk = kvp.Value; if (chunk.spawnedTrees == null || chunk.spawnedTrees.Count == 0) continue; int batchSize = 1023; int totalTrees = chunk.spawnedTrees.Count; for(int i = 0; i < totalTrees; i+=batchSize) { int length = Mathf.Min(batchSize, totalTrees - i); Matrix4x4[] subMatrices = new Matrix4x4[length]; for (int j = 0; j < length; j++) { subMatrices[j] = chunk.spawnedTrees[i + j].matrix; } int meshIndex = Mathf.Abs(chunk.chunkCord.GetHashCode() + i) % treeMesh.Length; Graphics.DrawMeshInstanced(treeMesh[meshIndex], 0, treeMaterial, subMatrices, length); } } }
I’m getting new wifi lol, & 150 hours so yeah i won’t be here and probably will have to post a 10 hour thing BUT on the plus side, we got a nice death screen that has a bunch of quotes that you can read below [SerializeField] private string[] quotes = { "Opportunities multiply as they are seized \n - Sun Tzu", "If you are going through hell, keep going \n - Winston Churchill", "No empire was built on the first draft", "Fall seven times, stand up eight", "That which does not kill us, makes us stronger \n - Friedrich Nietzsche", "Out of ash, a new foundation", "I have not failed. I just found 10,000 ways that don't work \n - Thomas Edison", "A man is not finished when he is defeated. He is finished when he quits \n - Richard M. Nixon", "It does not matter how slowly you go as long as you do not stop \n - Confucius", "Out of difficulties grow miracles \n - Jean de La Bruyère", "The greater the obstactle, the more glory in overcoming it \n - Molière", "A Pocket Sized City is too small for your ambition. Build again \n - The Dev", "Success usually comes to those who are too busy to be looking for it \n - Henry David Thoreau", "Go big or go home", "You can't give up just yet. Stay determined... \n - Undertale" }; Maybe you’ll catch the little easter egg there as well ;) Working on adding game audio!! and probably finally enough hours to get the framework 12 (btw I wouldn’t recommend this as a daily laptop (f13 better), I just want something I can write on lol)
Game Sountrack? But before I talk about that, lemme just say the game audio is almost finished, we have menu sounds for clicks and stuff, and i added support for main menu music. The firetruck hoses actually do stuff, floods sound like floods, theres some peaceful background nature sounds and yeah it makes the game feel so much nicer. although i forgot place sounds which was a massive oversight. also my wifi is still working. no idea why, but not complaining. and i’m cooking on a soundtrack lowk although none of it seems correlated in any way and idk how i’ll make it fit into this game but you know what maybe it’ll just all go into some random album. None of the hours put into these songs count but its okay. i’m no pro tho so. all i’ll say is i love some bass
Final DevLog before First Ship - Boss Battle I don’t think words can explain what I made so click here to watch a video on my probably final major addition (no pressure) & also help with a small dilemma I have. NO!! that does not mean this game will stop development, but i think i finally have enough hours (+10-15 more safety) to get a Framework 12! (and then i will be able to crack on with entrance exams - so i guess development will slow a touch). Of course I’ll ship once the game is polished enough. You might see a devlog or two from the “Capital Chaos Website” - follow me ;) I really hope you guys all enjoy it and now I need to do the readme and stuff. I also realised I was one of the most viewed on Stardance which is honestly amazing and I appreciate all of the support :) And thank you to all the new friends I’ve made and all the followers and commenters. It’s honestly been insane.
BETA TEST! Nvm I have to devlog my final changes But lemme talk to those stardance reviewers real quick. Scroll down to see the endless content of my story, and all the community feedback (also on my youtube). Playing the game is a bit of a learning curve so you can watch my videos and stuff on it as well. I’d say watch this one: Boss Fight for the boss fight and maybe one of the other ones that you find interesting. Maybe this one because it has over 1,000 views and still climbing! The game is released there but it is windows only for now (i will release linux and maybe mac on the actual release game don’t worry but I’m super restricted for time right now) SKIP IF YOU’RE ON LINUX / MAC For everyone: Changes: Amended GameAudioManager to adjust for max voices which uses a List based system that appends and unappends. Boss fight also toggles and untoggles the game audio dependant on each audio source, because the game could currently have hundreds or even thousands of audio source which is really bad optimisation. So each audio source that I want to track has a ManagedAudioSource attached which automatically registers and unregisters itself from the GameAudioManager. I also edited the boss fight to make it a touch harder and amended the moves ;) And come and beta test NOWWW. leave all your comments, suggestions etc. on THE NEW DISCORD COMMUNITY!! or youtube, i’ll read it all and, again, thank you all for your support . I don’t know what to put as the image so here.
Thank you all so much for the support! Framework 12 is on it’s way (and this wait is painful). After 171 hours! 19.54x is actually insane and I appreciate it a lot. Join the Discord! I made a discord (click above) and i’ll give you all an early supporter role before I put it out on YouTube and stuff for the “wishlist” when the full game comes out (if you want to stay in touch after stardance is done. ALSO IF YOU COMMENTED WHILE THE GAME WAS STILL CALLED POCKET CITY DM ME ILL GIVE U A SPECIAL ROLE The game beta is still up and you can try it out Currently just doing some minor stuff to the game (Fixed some normal/easy mode not settings correct phases. B2 Bomber should destroy itself and stop the nuke siren once launched), and slowly adding a tutorial but I’m like 90% focused on revising for uni entrance exams
Ships:
Welcome to Capital Chaos! One of Stardance’s most awaited projects ;) (hopefully anyways) We’ve got chaos, a bunch of random events, a boss fight and so much more for you to explore. SKIP if you are on Linux/MacOS (or you can vote based on the videos - completely up to you) as I only have a windows executable for now. I am honestly super proud of this, and the community built around this game. I hope you enjoy it as well. There have been TONNES of challenges, such as pathfinding, the initial grid also seemed really daunting. To the vacancy count which was literally plaguing me for the past MONTH and got fixed today (it was one line… i know.. maybe I should have used AI). But besides, it’s a sick project. I hope you all love it. Unzip the file in the release and it should be good to go. READ THE README FOR INSTRUCTIONS AND CONTROLS!! THERE IS NO TUTORIAL Read the story, watch the videos if you can and just enjoy the game! It will be on steam in 8-9 months so maybe subscribe?...
|
1792842667.2298918
|
1792929067.2298918
|
|
29287
|
le-fat-chaton by @unknown_lizzard | Stardance
|
unknown_lizzard
|
1
|
172.0
|
1818
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-20T09:10:04Z", "hours": 172.0, "multiplier": 14.88, "payout": 1818, "blessing": "neutral", "text": "at first I wanted to make a normal text model to try and learn more about llms, but I wanted to go further, agentic coding is a big thing so what better way to learn about llms than trying to make an agentic coding ai model. So thats how le gros chaton was born, the name originated from a joke on x about a fake huge mistral model coming out. to train this model I used already made datasets on hugging face, like fable5 traces, I also used kimi k3 as a teacher model to teach my smaller model to be good at coding and running commands, it kind of worked? but i’m not completely satisfied with the result, but at least i have learned some things and soon enough I will trying making an even better model! I dont have a demo url for you guys to try the model out since it was too expensive to run on a gpu so you’ll need to run it yourself, check it out on hugging face, follow the instructions and have fun.", "repo": "https://github.com/Mateooo93/le-gros-chaton", "demo": "https://mateooo93.github.io/le-gros-chaton/"}]...
|
[{"post_id": 50841, "ts": "202 [{"post_id": 50841, "ts": "2026-08-20T08:57:48Z", "hours": 3.2394, "text": "devlog #17 MI300X vLLM serving The old GPU box got destroyed, so I spun up a new MI300X with the same SSH key. ROCm 6.2 and Torch 2.5.1 were already set up, so getting the machine ready was easy. The hard part was vLLM. The pip version is CUDA only, and the ROCm Docker image only supported the multimodal version of Qwen3.5. Our model is text-only, so I had to patch the image. I added Qwen3_5ForCausalLM, fixed the hybrid KV-cache setup, added the missing Mamba state methods, and mapped the weight names so the text-only safetensors loaded correctly. I also patched the merged config to remove the M-RoPE and dtype fields. After that, the model served normally. I ran a one-task test with fix-git. The pipeline worked, but the model got stuck repeating git show until it ran out of turns. ##Shipped The merged model is now public on Hugging Face as mateo0093/le-gros-chaton under Apache-2.0. The 5×5 Terminal-Bench pilot finished at 3/25 (25%). All three successes were on fix-git, which shows that the SFT data was too focused on git tasks. I also tested RLVR with GRPO and a novelty bonus. The reward had almost no variance, so the training signal was basically useless. I saved the step-10 adapter but didn’t merge it. The GPU used about 12 hours of the 50 hour budget. All the vLLM patches and harness changes are in the repo. Main lesson: Qwen3.5’s hybrid model is a bit annoying to serve as text-only on ROCm. The model works but i think this was more of a learning opportunity, i know what i’ve done wrong and what i would have done differently, I will be working on a new model in a few weeks once I do a bit more research."}, {"post_id": 49761, "ts": "2026-08-18T18:01:12Z", "hours": 0.7992, "text": "Devlog #16, t4gpu The T4 16GB fought us the whole way. BF16 was baked into a pre quantized checkpoint, which made each step take 668 seconds because it had to use FP32 emulation. 2K context ran out of memory, the 248K logits ran out of memory too, FP16 started producing NaNs, Kaggle session limits locked us out, and the paged optimizer crashed last. Every fix seemed to create another problem. We eventually got it working with FP16 compute, chunked assistant token loss, autocast, and plain AdamW. Then we got access to an AMD MI300X with 192GB of memory. No quantization, 16K context, and enough memory to train full traces instead of cutting them off halfway through a message. Right now the 16K BF16 SFT run is training on the MI300X. Next up is merging the model, running Terminal Bench, and then RLVR."}, {"post_id": 49140, "ts": "2026-08-17T19:31:53Z", "hours": 16.24, "text": "Devlog 15 Traces are done The trace generator finally hit the target and went past it. We got 474 verified trajectories, zero malformed, zero duplicates, 19 templates, and a 95 percent self review pass rate. We were aiming for 450, so we ended up with 474. The dataset is synced to Hugging Face in two versions: raw and normalized. That part is finally done. It was the longest part of the project, and the model is only going to be as good as the traces, so getting this right was important The Kimi endpoint also stopped working. The old teacher account started returning 503 errors during generation and eventually died completely. We switched to a second Kimi account, which needed an extra header that we did not have at first. After figuring that out, generation resumed without losing any progress For GPUs, the 2070 still cannot realistically train the 9B. Kaggle hours are back, so we have 30 hours on a T4. The 4090 from my dad should arrive next week. The plan is to use the T4 for trajectory SFT, then the 4090 for merging, Terminal Bench evaluation, and RLVR. Status: 474 out of 474 traces done,"}, {"post_id": 42823, "ts": "2026-08-07T19:01:50Z", "hours": 8.9192, "text": "Devlog #14 worked a lot, still not done we worked a lot this week. honestly the main takeaway is that the fable5 sft was good but its traces alone weren’t enough the model needs way more verified agent trajectories, so we’ve been grinding those out (target is 450). we also ran out of credits mid-generation (the modal endpoint started failing with 503s) and had to switch to a second kimi account. took a minute to get the auth right the new endpoint wanted an extra header we didn’t have. after that the generator resumed fine and it’s been adding verified traces since (~340/450 now). biggest scare: we found out peft 0.20 silently drops the second adapter when you merge two at once. tested it and yeah, the outputs were identical with one or two adapters so our trajectory sft would have been lost in the merge. fixed it by merging sequentially (base first, then the second adapter). checked against the live model and it matches, so we’re good. my 2070 couldn’t fit the 9b model for real training, so we’re waiting on a 4090 (my dad’s) next week. all the scripts are ready sft, merge, rlvr, eval, even a setup script for the gpu box. just need the hardware. status: 340/450 traces, everything ready, waiting on the 4090. we’ve worked a lot, but the real run hasn’t happened yet :/."}, {"post_id": 41470, "ts": "2026-08-05T18:10:35Z", "hours": 18.5394, "text": "Devlog #13 we worked ALOT so this was the grind day. 18 hours of training babysitting and honestly it felt like 40. the modal training kept dying every hour. the client would crash and take the whole run with it. we restarted like 3 times before figuring out modal run -d (detached) keeps it alive on their servers even if our computer shits the bed. tested it by literally killing the process and it kept going. ez fix but we worked ALOT to get there. then we ran out of credits at 93% and switched accounts, but the other account “finished” the run in 6 MILLISECONDS which was sus af. turns out it just re-uploaded the old checkpoint and trained nothing. the resume logic had a bug where it thought 6200 >= 3799 meant done. patched it. another lesson learned. also we made the model creative lol. added diversity sampling to the trajectory generator (5 solutions per task, keep the novel ones), a novelty bonus reward for RLVR, and a creativity rule in the self-awareness prompt. so the fat cat will be innovative, not just memorize. current state: SFT is done at 91% (good enough), resume bug fixed, phase 2 (trajectory SFT with creativity + self-awareness baked in) is up next. 18 hours. we worked ALOT. the fat cat will be worth it 😼"}, {"post_id": 40883, "ts": "2026-08-04T18:02:57Z", "hours": 10.0019, "text": "Devlog #12 training kept dying for the last 10 hours the training kept crashing. not the model, not the gp but the modal client. every hour or so it would lose connection and take the whole run down with it. we’d restart, it’d run an hour, crash again. three times. the fix was simple: modal run -d runs detached, so the training lives on modal’s servers and doesn’t care if our local process dies. killed the client on purpose to test — training kept going. that’s it, that’s the fix. also worried the loss wasn’t moving but it was fine. lr had wound down on the crashed run, looked scary, re-warmed fine after restart. loss is 0.668 now and dropping. status: 72% through the fable5 sft. checkpoints safe on hf. after this: trajectory sft with the self-awareness stuff baked in, then rlvr, then real numbers."}, {"post_id": 40601, "ts": "2026-08-04T08:01:50Z", "hours": 11.4342, "text": "** Devlog #11 half way there! ** the training is going pretty well, I fixed a few bugs with the code and added documentation training is at 50%!"}, {"post_id": 40369, "ts": "2026-08-03T20:35:48Z", "hours": 8.8192, "text": "** Devlog #10 the full training is finally running ** ok so phase 1 full training is officially going. 160k rows of fable5 data on modal, resuming from the 12.8k rows we got on kaggle before the session cap killed us. we’re at ~27% and it should take like a day and a half total. big stuff that happened since last time: fast kernels actually work now. the model has hybrid linear-attention layers and transformers kept falling back to a slow torch path. the fix was: nvidia cuda-devel base image (needs nvcc to compile), installing flash-linear-attention[cuda] + causal-conv1d , and pinning torch 2.10. took a couple tries but now training is like 4x faster than it would be without them. had to split across two modal accounts. first account ran out of credits, so we set up a second profile and the script auto-resumes from the huggingface checkpoints when it dies. it’s been rock solid, it happens every 20% plus every hour it saves and uploads. lost zero progress to the account switch. we gave the model a personality. it’s called Le Gros Chaton (the fat cat) and we’re training self-awareness into it, not as a system prompt but baked into the weights. state-sheets ([STATE] goal/known/tried/failed/next), metacognition lines, and self-review at the end of tasks. the trajectory sft masks out the system prompt so the model learns to track its own state as behavior, not as a script it repeats. did some benchmark research too. base qwen3.5-9b scores 9.2% on terminal-bench 2.0. comparable 9b fine-tunes hit 24-28%. that’s our realistic target which is 2.5-3x the baseline. honestly at this point it’s just… waiting. the pipeline works, the checkpoints work, the account switching works. now the model just needs to finish cooking. then trajectory sft, then rlvr, then we actually see the benchmark numbers."}, {"post_id": 40029, "ts": "2026-08-03T11:45:18Z", "hours": 13.3375, "text": "# Devlog #9 — finally training, and now with checkpoints! so last time i was stuck debugging phase 1/2 on kaggle. well, still debugging lol, but we actually got somewhere. the first issue was transformers not knowing what the qwen3.5 model was, had to pin transformers 5.14.1. then tokenizers kept fighting with it (0.22.0 wants old huggingface-hub, 0.22.1 is fine). then torch on kaggle kept giving a p100 which modern pytorch just refuses to run on, so we had to tell it to give us a t4 instead. then the fun one: out of memory on the very first step. batch 2 was too big for the gpu they gave us, so batch 1 it is. also i learned the hard way that kaggle kills your session after 12 hours. the first long run got cancelled at 80% done and i had nothing saved. so now the training script saves a checkpoint every 20% + every hour and uploads it to huggingface, so if it dies we just resume. it actually saved us, the run got cut and we picked right back up from the checkpoint. right now the full 160k sft is running on modal (paying for gpus now, kaggle time ran out). it’s at like 9% and should take a couple days. we’ll see how it goes, and then rlvr after that. the end of the errors… might actually be in sight this time."}, {"post_id": 38292, "ts": "2026-07-31T16:38:26Z", "hours": 5.4886, "text": "Devlog #8 — phase 2 fixes I’ve been getting a lot of issues with the first two for this model. I’ve gotten a lot of errors in Kaggle and Colab. I’ve tried everything, and I’m still fixing the code. It’s taking a good amount of time, but I think I’m almost there. I’ve gone through a lot of errors, and I’m probably right at the end of the errors. I might be able to start actually training it tomorrow, but for now I’ll stop."}, {"post_id": 38079, "ts": "2026-07-31T09:21:05Z", "hours": 10.3872, "text": "Devlog #7 — phase 2 running phase 1 (sft) is done and phase 2 (rlvr) is running now on kaggle. this is the part where the model actually gets trained on solving coding problems with our verifier giving rewards, not just imitating fable data. honestly this is the part i care about more. sft just makes it mimic. rlvr is where it learns to actually fix code. grpo with proportional rewards = the model gets partial credit for getting some tests passing, which is way better than all-or-nothing. while it runs im just waiting tbh. not much to build. the pipeline works, the eval works, the agent works. next after this: full benchmark run. humaneval, swebench, agentic eval. we’ll see if all this actually made the model good at coding or if i just spent a week on a worse qwen lol."}, {"post_id": 37100, "ts": "2026-07-29T16:05:47Z", "hours": 8.4747, "text": "Devlog #6 — training done (phase 1) finally got the qwen finetune to actually run with 625 steps, took like 8 hours on kaggle. it finished. havent run full benchmarks yet cause i was busy building other stuff while it trained. but it trained. thats the main thing. I also built a swebench agent that can actually navigate repos and edit files and make patches. not just the basic agent loop that runs commands. this one actually works for real se tasks. also added swebench eval so we can measure if the model is actually good at fixing bugs and coding then i’ll run the benchmarks on the trained model and see if its actually any good lol."}, {"post_id": 36367, "ts": "2026-07-28T13:16:16Z", "hours": 13.6447, "text": "Devlog #5 — ok so I’m not building a 10B MoE anymore So last time I had this whole plan. 10B MoE, from scratch, SwiGLU, GQA, all that. And I actually built it. Like 60 Python files, tests passing, RL pipeline, self-play data gen, the whole thing. It was kinda sick ngl. But then I was like… wait. I’m building an ENGINE that TRAINS coding agents. Not the agent. And the engine is cool but training a 10B model from zero on $30 of Modal credits is not how you beat GLM-5.2. You know what beats GLM-5.2? Fine-tuning a model that already knows how to code. the pivot (again) Qwen3.5-9B came out. 9B params. Fits on a Kaggle T4 with 4-bit QLoRA. And Kaggle gives me 30 HOURS of free GPU. 2× T4. That’s literally free training. So I had to adapt the entire codebase to work with HuggingFace models instead of my custom GPT. Made like 5 new files. All the verifier/agent/reward stuff I built for the MoE? Now works with Qwen too. Didn’t have to rewrite everything — just slapped a Qwen adapter on top. the dataset Found this dataset on HF: Nexlab/fable5-agentic-coding-sft . 160K rows of Claude Fable 5 output. Like actual coding traces — building games, fixing bugs, writing shell scripts. Not just “write a function that passes a test.” Real agentic stuff. Training right now actually. Qwen3.5-9B on 10K rows. Should take like 8 hours on 2× T4. We’ll see if it doesn’t OOM again lol. While waiting for training I read papers: Routing-Free MoE — what if experts just decide for themselves when to activate? No router, no top-k. Already implemented it in model.py. GLM-5.2 has this IndexShare thing that reuses computation across layers. 2.9× cheaper at 1M context. Maybe later. DeepSWE trained Qwen3-32B with RL only and got 42% SWE-Bench. So our approach is valid. the first phase of training is going on right now, i’ll post another devlog once it’s done!"}, {"post_id": 20759, "ts": "2026-07-02T13:35:48Z", "hours": 5.6175, "text": "Devlog #4 — wait, why am I training on Wikipedia? Last week I got le gros chaton (my from-scratch transformer) to actually train. Ran it on wikitext-103 in a Colab notebook on a free T4, 12k steps, val loss hit 3.73. Felt insane for something I wrote myself from PyTorch primitives. But then I looked at what it generated. It could do English-ish. It knew about Singapore and stuff. The moment I asked it to write code? Total garbage. Fair enough. It has never seen a single line of code. the pivot I thought about what I actually want this thing to do. Answer: a coding agent. Something that mogs on terminal-bench, that you give a task and it runs commands, fixes its own bugs, gets it done. Qwen-coder territory. Wikitext won’t get me there. You can’t learn Python from Wikipedia articles about the snake. So the plan changed. The big project is now le fat chaton, the bigger sibling. And it’s a coder. the architecture stuff I went down a rabbit hole on what frontier coding models do. They’re basically all mixture-of-experts (MoE) now. Qwen3-coder is 480B params / 35B active. Deepseek-coder-v2-lite is 16B / 2.4B active. The trick: big total params (knows a lot) small active params per token (runs fast and cheap) Runs like a small model, knows like a big one. Exactly what I want for a snappy terminal agent. So I rewrote the model. Added an MoE class. A gate routes each token to its top-2 experts out of 8, with a load-balance loss so the router doesn’t pick the same expert every time. Also threw in: SwiGLU — gated MLP, basically free quality, every Llama uses it GQA — smaller KV cache, faster long-context decoding (the agent harness needs this) Shared expert — DeepSeek-style, one always-on expert for common knowledge Fat config math: ~10.25B total / ~3.65B active. Not building that locally, it would crash my PC again. the data question Wikitext was a fine proof. For the coder I need code. Options: smollm-corpus python-edu — 7.6M educational Python files, high quality, but gated behind S3 (slow pull) starcoderdata python — ~50GB Python, streams fast from HF, the Codellama workhorse the-stack-v2 — 900B tokens, overkill for my budget Going with starcoderdata Python, blended with ~15-20% cosmopedia (prose) so it has general knowledge. That blend is the Qwen-coder recipe. am I warm-starting from wikitext? No. Different architecture entirely (17M dense vs 10B MoE, weights don’t fit). Even if they did, warm-starting a coder from prose wastes compute unlearning prose. Fresh random init on the mixed corpus. Clean slate. This went from “lets make a little model that talks” to “lets build a coding agent that mogs the big labs” real fast. Ambitious for a solo student with a 2070 and $30 of Modal credits? Absolutely. Doing it anyway? Yeah. Next: the eval harness so I can measure if this is making the model better at code (pass@1, pass@5 on HumanEval). Val loss going down means nothing if it still can’t write a"}, {"post_id": 20019, "ts": "2026-07-01T14:54:30Z", "hours": 0.3917, "text": "DEVLOG #3: teaching it to talk (fine-tuning) the base model was a completer. ask it “what is 2+2?” and it just continues the sentence. fine-tuning is what makes it actually answer: same model, more training, but on prompt/response pairs. i wrote ~48 Q&A pairs by hand. trivia, math, jokes, hellos. all in the same rigid Q: …\\nA: format. new trick: loss masking. only the response counts toward the loss, not the prompt, so i set prompt targets to -100 (pytorch’s cross_entropy ignores that automatically, zero model changes). tested the mask boundary in isolation first. wrong mask = 400 steps of training the wrong thing. the run: load base weights, 400 steps, lower lr. loss went 12.3 to 0.02.then the reality check. it nails everything in the set. capitals, math, jokes, “who are you,” verbatim. but something NOT in the set? slop. 17M params + 48 examples is a lookup table, not a reasoner. real chat models are billions of params. not a bug, just the scale.but it’s finally coherent. the first base model was word salad. now you type a question and get a real answer back that makes sense. it’s tiny and dumb and can’t generalize, but it actually talks. that’s the win. full pipeline done: tokenizer, model from scratch, pretrain on wikipedia, fine-tune, chat. mine, it talks, i understand every piece."}, {"post_id": 20006, "ts": "2026-07-01T14:16:25Z", "hours": 0.4139, "text": "DEVLOG #2: real data, real loss, and a lesson about memorizing split my data into 90% train / 10% val. before i only had one number, training loss, and it lies to you. you can’t tell learning from memorizing with just that. now i check both every 200 steps. rule: both go down = learning. train down but val up = memorizing = useless.also made the model bigger, 7M -> 17.7M params. immediately ran out of gpu memory lol. dropped batch size to 32 to fit my 8GB card.training: 3000 steps. loss started at 158 (should be ~10 for random , my first pass blew up and made garbage). recovered fast though, didn’t ruin the run. right now the llm is spitting out gibberish and random words but after finetuning it should sound more coherent"}, {"post_id": 19989, "ts": "2026-07-01T13:48:37Z", "hours": 36.31, "text": "DEVLOG #1: wiki text training so i finally got the model to train on actual data instead of that one paragraph about singapore nature reserves lol. before this the whole thing was basically a joke, i trained a 7M parameter transformer on like 134 tokens and it just spat out jumbled fragments of the same sentence over and over. cool proof it worked but definitely not a “language model” in any real sense.anyway. the big move this week was swapping out the tiny json file for wikitext-2. that’s a huggingface dataset of wikipedia text, about 2.4 million tokens once you filter out the empty lines. that’s… a lot more than 134 lol. encoding it took maybe half a minute with tiktoken and the whole tensor fits on my gpu no problem (it’s only like 8MB of ints)."}]...
|
Title: le-fat-chaton by @unknown_lizzard | Stardan Title: le-fat-chaton by @unknown_lizzard | Stardance
Devlogs:
DEVLOG #1: wiki text training so i finally got the model to train on actual data instead of that one paragraph about singapore nature reserves lol. before this the whole thing was basically a joke, i trained a 7M parameter transformer on like 134 tokens and it just spat out jumbled fragments of the same sentence over and over. cool proof it worked but definitely not a “language model” in any real sense.anyway. the big move this week was swapping out the tiny json file for wikitext-2. that’s a huggingface dataset of wikipedia text, about 2.4 million tokens once you filter out the empty lines. that’s… a lot more than 134 lol. encoding it took maybe half a minute with tiktoken and the whole tensor fits on my gpu no problem (it’s only like 8MB of ints).
DEVLOG #2: real data, real loss, and a lesson about memorizing split my data into 90% train / 10% val. before i only had one number, training loss, and it lies to you. you can’t tell learning from memorizing with just that. now i check both every 200 steps. rule: both go down = learning. train down but val up = memorizing = useless.also made the model bigger, 7M -> 17.7M params. immediately ran out of gpu memory lol. dropped batch size to 32 to fit my 8GB card.training: 3000 steps. loss started at 158 (should be ~10 for random , my first pass blew up and made garbage). recovered fast though, didn’t ruin the run. right now the llm is spitting out gibberish and random words but after finetuning it should sound more coherent
DEVLOG #3: teaching it to talk (fine-tuning) the base model was a completer. ask it “what is 2+2?” and it just continues the sentence. fine-tuning is what makes it actually answer: same model, more training, but on prompt/response pairs. i wrote ~48 Q&A pairs by hand. trivia, math, jokes, hellos. all in the same rigid Q: …\nA: format. new trick: loss masking. only the response counts toward the loss, not the prompt, so i set prompt targets to -100 (pytorch’s cross_entropy ignores that automatically, zero model changes). tested the mask boundary in isolation first. wrong mask = 400 steps of training the wrong thing. the run: load base weights, 400 steps, lower lr. loss went 12.3 to 0.02.then the reality check. it nails everything in the set. capitals, math, jokes, “who are you,” verbatim. but something NOT in the set? slop. 17M params + 48 examples is a lookup table, not a reasoner. real chat models are billions of params. not a bug, just the scale.but it’s finally coherent. the first base model was word salad. now you type a question and get a real answer back that makes sense. it’s tiny and dumb and can’t generalize, but it actually talks. that’s the win. full pipeline done: tokenizer, model from scratch, pretrain on wikipedia, fine-tune, chat. mine, it talks, i understand every piece.
Devlog #4 — wait, why am I training on Wikipedia? Last week I got le gros chaton (my from-scratch transformer) to actually train. Ran it on wikitext-103 in a Colab notebook on a free T4, 12k steps, val loss hit 3.73. Felt insane for something I wrote myself from PyTorch primitives. But then I looked at what it generated. It could do English-ish. It knew about Singapore and stuff. The moment I asked it to write code? Total garbage. Fair enough. It has never seen a single line of code. the pivot I thought about what I actually want this thing to do. Answer: a coding agent. Something that mogs on terminal-bench, that you give a task and it runs commands, fixes its own bugs, gets it done. Qwen-coder territory. Wikitext won’t get me there. You can’t learn Python from Wikipedia articles about the snake. So the plan changed. The big project is now le fat chaton, the bigger sibling. And it’s a coder. the architecture stuff I went down a rabbit hole on what frontier coding models do. They’re basically all mixture-of-experts (MoE) now. Qwen3-coder is 480B params / 35B active. Deepseek-coder-v2-lite is 16B / 2.4B active. The trick: big total params (knows a lot) small active params per token (runs fast and cheap) Runs like a small model, knows like a big one. Exactly what I want for a snappy terminal agent. So I rewrote the model. Added an MoE class. A gate routes each token to its top-2 experts out of 8, with a load-balance loss so the router doesn’t pick the same expert every time. Also threw in: SwiGLU — gated MLP, basically free quality, every Llama uses it GQA — smaller KV cache, faster long-context decoding (the agent harness needs this) Shared expert — DeepSeek-style, one always-on expert for common knowledge Fat config math: ~10.25B total / ~3.65B active. Not building that locally, it would crash my PC again. the data question Wikitext was a fine proof. For the coder I need code. Options: smollm-corpus python-edu — 7.6M educational Python files, high quality, but gated behind S3 (slow pull) starcoderdata python — ~50GB Python, streams fast from HF, the Codellama workhorse the-stack-v2 — 900B tokens, overkill for my budget Going with starcoderdata Python, blended with ~15-20% cosmopedia (prose) so it has general knowledge. That blend is the Qwen-coder recipe. am I warm-starting from wikitext? No. Different architecture entirely (17M dense vs 10B MoE, weights don’t fit). Even if they did, warm-starting a coder from prose wastes compute unlearning prose. Fresh random init on the mixed corpus. Clean slate. This went from “lets make a little model that talks” to “lets build a coding agent that mogs the big labs” real fast. Ambitious for a solo student with a 2070 and $30 of Modal credits? Absolutely. Doing it anyway? Yeah. Next: the eval harness so I can measure if this is making the model better at code (pass@1, pass@5 on HumanEval). Val loss going down means nothing if it still can’t write a
Devlog #5 — ok so I’m not building a 10B MoE anymore So last time I had this whole plan. 10B MoE, from scratch, SwiGLU, GQA, all that. And I actually built it. Like 60 Python files, tests passing, RL pipeline, self-play data gen, the whole thing. It was kinda sick ngl. But then I was like… wait. I’m building an ENGINE that TRAINS coding agents. Not the agent. And the engine is cool but training a 10B model from zero on $30 of Modal credits is not how you beat GLM-5.2. You know what beats GLM-5.2? Fine-tuning a model that already knows how to code. the pivot (again) Qwen3.5-9B came out. 9B params. Fits on a Kaggle T4 with 4-bit QLoRA. And Kaggle gives me 30 HOURS of free GPU. 2× T4. That’s literally free training. So I had to adapt the entire codebase to work with HuggingFace models instead of my custom GPT. Made like 5 new files. All the verifier/agent/reward stuff I built for the MoE? Now works with Qwen too. Didn’t have to rewrite everything — just slapped a Qwen adapter on top. the dataset Found this dataset on HF: Nexlab/fable5-agentic-coding-sft . 160K rows of Claude Fable 5 output. Like actual coding traces — building games, fixing bugs, writing shell scripts. Not just “write a function that passes a test.” Real agentic stuff. Training right now actually. Qwen3.5-9B on 10K rows. Should take like 8 hours on 2× T4. We’ll see if it doesn’t OOM again lol. While waiting for training I read papers: Routing-Free MoE — what if experts just decide for themselves when to activate? No router, no top-k. Already implemented it in model.py. GLM-5.2 has this IndexShare thing that reuses computation across layers. 2.9× cheaper at 1M context. Maybe later. DeepSWE trained Qwen3-32B with RL only and got 42% SWE-Bench. So our approach is valid. the first phase of training is going on right now, i’ll post another devlog once it’s done!
Devlog #6 — training done (phase 1) finally got the qwen finetune to actually run with 625 steps, took like 8 hours on kaggle. it finished. havent run full benchmarks yet cause i was busy building other stuff while it trained. but it trained. thats the main thing. I also built a swebench agent that can actually navigate repos and edit files and make patches. not just the basic agent loop that runs commands. this one actually works for real se tasks. also added swebench eval so we can measure if the model is actually good at fixing bugs and coding then i’ll run the benchmarks on the trained model and see if its actually any good lol.
Devlog #7 — phase 2 running phase 1 (sft) is done and phase 2 (rlvr) is running now on kaggle. this is the part where the model actually gets trained on solving coding problems with our verifier giving rewards, not just imitating fable data. honestly this is the part i care about more. sft just makes it mimic. rlvr is where it learns to actually fix code. grpo with proportional rewards = the model gets partial credit for getting some tests passing, which is way better than all-or-nothing. while it runs im just waiting tbh. not much to build. the pipeline works, the eval works, the agent works. next after this: full benchmark run. humaneval, swebench, agentic eval. we’ll see if all this actually made the model good at coding or if i just spent a week on a worse qwen lol.
Devlog #8 — phase 2 fixes I’ve been getting a lot of issues with the first two for this model. I’ve gotten a lot of errors in Kaggle and Colab. I’ve tried everything, and I’m still fixing the code. It’s taking a good amount of time, but I think I’m almost there. I’ve gone through a lot of errors, and I’m probably right at the end of the errors. I might be able to start actually training it tomorrow, but for now I’ll stop.
# Devlog #9 — finally training, and now with checkpoints! so last time i was stuck debugging phase 1/2 on kaggle. well, still debugging lol, but we actually got somewhere. the first issue was transformers not knowing what the qwen3.5 model was, had to pin transformers 5.14.1. then tokenizers kept fighting with it (0.22.0 wants old huggingface-hub, 0.22.1 is fine). then torch on kaggle kept giving a p100 which modern pytorch just refuses to run on, so we had to tell it to give us a t4 instead. then the fun one: out of memory on the very first step. batch 2 was too big for the gpu they gave us, so batch 1 it is. also i learned the hard way that kaggle kills your session after 12 hours. the first long run got cancelled at 80% done and i had nothing saved. so now the training script saves a checkpoint every 20% + every hour and uploads it to huggingface, so if it dies we just resume. it actually saved us, the run got cut and we picked right back up from the checkpoint. right now the full 160k sft is running on modal (paying for gpus now, kaggle time ran out). it’s at like 9% and should take a couple days. we’ll see how it goes, and then rlvr after that. the end of the errors… might actually be in sight this time.
** Devlog #10 the full training is finally running ** ok so phase 1 full training is officially going. 160k rows of fable5 data on modal, resuming from the 12.8k rows we got on kaggle before the session cap killed us. we’re at ~27% and it should take like a day and a half total. big stuff that happened since last time: fast kernels actually work now. the model has hybrid linear-attention layers and transformers kept falling back to a slow torch path. the fix was: nvidia cuda-devel base image (needs nvcc to compile), installing flash-linear-attention[cuda] + causal-conv1d , and pinning torch 2.10. took a couple tries but now training is like 4x faster than it would be without them. had to split across two modal accounts. first account ran out of credits, so we set up a second profile and the script auto-resumes from the huggingface checkpoints when it dies. it’s been rock solid, it happens every 20% plus every hour it saves and uploads. lost zero progress to the account switch. we gave the model a personality. it’s called Le Gros Chaton (the fat cat) and we’re training self-awareness into it, not as a system prompt but baked into the weights. state-sheets ([STATE] goal/known/tried/failed/next), metacognition lines, and self-review at the end of tasks. the trajectory sft masks out the system prompt so the model learns to track its own state as behavior, not as a script it repeats. did some benchmark research too. base qwen3.5-9b scores 9.2% on terminal-bench 2.0. comparable 9b fine-tunes hit 24-28%. that’s our realistic target which is 2.5-3x the baseline. honestly at this point it’s just… waiting. the pipeline works, the checkpoints work, the account switching works. now the model just needs to finish cooking. then trajectory sft, then rlvr, then we actually see the benchmark numbers.
** Devlog #11 half way there! ** the training is going pretty well, I fixed a few bugs with the code and added documentation training is at 50%!
Devlog #12 training kept dying for the last 10 hours the training kept crashing. not the model, not the gp but the modal client. every hour or so it would lose connection and take the whole run down with it. we’d restart, it’d run an hour, crash again. three times. the fix was simple: modal run -d runs detached, so the training lives on modal’s servers and doesn’t care if our local process dies. killed the client on purpose to test — training kept going. that’s it, that’s the fix. also worried the loss wasn’t moving but it was fine. lr had wound down on the crashed run, looked scary, re-warmed fine after restart. loss is 0.668 now and dropping. status: 72% through the fable5 sft. checkpoints safe on hf. after this: trajectory sft with the self-awareness stuff baked in, then rlvr, then real numbers.
Devlog #13 we worked ALOT so this was the grind day. 18 hours of training babysitting and honestly it felt like 40. the modal training kept dying every hour. the client would crash and take the whole run with it. we restarted like 3 times before figuring out modal run -d (detached) keeps it alive on their servers even if our computer shits the bed. tested it by literally killing the process and it kept going. ez fix but we worked ALOT to get there. then we ran out of credits at 93% and switched accounts, but the other account “finished” the run in 6 MILLISECONDS which was sus af. turns out it just re-uploaded the old checkpoint and trained nothing. the resume logic had a bug where it thought 6200 >= 3799 meant done. patched it. another lesson learned. also we made the model creative lol. added diversity sampling to the trajectory generator (5 solutions per task, keep the novel ones), a novelty bonus reward for RLVR, and a creativity rule in the self-awareness prompt. so the fat cat will be innovative, not just memorize. current state: SFT is done at 91% (good enough), resume bug fixed, phase 2 (trajectory SFT with creativity + self-awareness baked in) is up next. 18 hours. we worked ALOT. the fat cat will be worth it 😼
Devlog #14 worked a lot, still not done we worked a lot this week. honestly the main takeaway is that the fable5 sft was good but its traces alone weren’t enough the model needs way more verified agent trajectories, so we’ve been grinding those out (target is 450). we also ran out of credits mid-generation (the modal endpoint started failing with 503s) and had to switch to a second kimi account. took a minute to get the auth right the new endpoint wanted an extra header we didn’t have. after that the generator resumed fine and it’s been adding verified traces since (~340/450 now). biggest scare: we found out peft 0.20 silently drops the second adapter when you merge two at once. tested it and yeah, the outputs were identical with one or two adapters so our trajectory sft would have been lost in the merge. fixed it by merging sequentially (base first, then the second adapter). checked against the live model and it matches, so we’re good. my 2070 couldn’t fit the 9b model for real training, so we’re waiting on a 4090 (my dad’s) next week. all the scripts are ready sft, merge, rlvr, eval, even a setup script for the gpu box. just need the hardware. status: 340/450 traces, everything ready, waiting on the 4090. we’ve worked a lot, but the real run hasn’t happened yet :/.
Devlog 15 Traces are done The trace generator finally hit the target and went past it. We got 474 verified trajectories, zero malformed, zero duplicates, 19 templates, and a 95 percent self review pass rate. We were aiming for 450, so we ended up with 474. The dataset is synced to Hugging Face in two versions: raw and normalized. That part is finally done. It was the longest part of the project, and the model is only going to be as good as the traces, so getting this right was important The Kimi endpoint also stopped working. The old teacher account started returning 503 errors during generation and eventually died completely. We switched to a second Kimi account, which needed an extra header that we did not have at first. After figuring that out, generation resumed without losing any progress For GPUs, the 2070 still cannot realistically train the 9B. Kaggle hours are back, so we have 30 hours on a T4. The 4090 from my dad should arrive next week. The plan is to use the T4 for trajectory SFT, then the 4090 for merging, Terminal Bench evaluation, and RLVR. Status: 474 out of 474 traces done,
Devlog #16, t4gpu The T4 16GB fought us the whole way. BF16 was baked into a pre quantized checkpoint, which made each step take 668 seconds because it had to use FP32 emulation. 2K context ran out of memory, the 248K logits ran out of memory too, FP16 started producing NaNs, Kaggle session limits locked us out, and the paged optimizer crashed last. Every fix seemed to create another problem. We eventually got it working with FP16 compute, chunked assistant token loss, autocast, and plain AdamW. Then we got access to an AMD MI300X with 192GB of memory. No quantization, 16K context, and enough memory to train full traces instead of cutting them off halfway through a message. Right now the 16K BF16 SFT run is training on the MI300X. Next up is merging the model, running Terminal Bench, and then RLVR.
devlog #17 MI300X vLLM serving The old GPU box got destroyed, so I spun up a new MI300X with the same SSH key. ROCm 6.2 and Torch 2.5.1 were already set up, so getting the machine ready was easy. The hard part was vLLM. The pip version is CUDA only, and the ROCm Docker image only supported the multimodal version of Qwen3.5. Our model is text-only, so I had to patch the image. I added Qwen3_5ForCausalLM, fixed the hybrid KV-cache setup, added the missing Mamba state methods, and mapped the weight names so the text-only safetensors loaded correctly. I also patched the merged config to remove the M-RoPE and dtype fields. After that, the model served normally. I ran a one-task test with fix-git. The pipeline worked, but the model got stuck repeating git show until it ran out of turns. ##Shipped The merged model is now public on Hugging Face as mateo0093/le-gros-chaton under Apache-2.0. The 5×5 Terminal-Bench pilot finished at 3/25 (25%). All three successes were on fix-git, which shows that the SFT data was too focused on git tasks. I also tested RLVR with GRPO and a novelty bonus. The reward had almost no variance, so the training signal was basically useless. I saved the step-10 adapter but didn’t merge it. The GPU used about 12 hours of the 50 hour budget. All the vLLM patches and harness changes are in the repo. Main lesson: Qwen3.5’s hybrid model is a bit annoying to serve as text-only on ROCm. The model works but i think this was more of a learning opportunity, i know what i’ve done wrong and what i would have done differently, I will be working on a new model in a few weeks once I do a bit more research.
Ships:
at first I wanted to make a normal text model to try and learn more about llms, but I wanted to go further, agentic coding is a big thing so what better way to learn about llms than trying to make an agentic coding ai model. So thats how le gros chaton was born, the name originated from a joke on x about a fake huge mistral model coming out. to train this model I used already made datasets on hugging face, like fable5 traces, I also used kimi k3 as a teacher model to teach my smaller model to be good at coding and running commands, it kind of worked? but i’m not completely satisfied with the result, but at least i have learned some things and soon enough I will trying making an even better model! I dont have a demo url for you guys to try the model out since it was too expensive to run on a gpu so you’ll need to run it yourself, check it out on hugging face, follow the instructions and have fun....
|
1792878632.7358682
|
1793742632.7358682
|
|
21987
|
off-road autonomous robot by @leila | Stardance
|
leila
|
0
|
173.99
|
0
|
[]
|
[{"post_id": 79978, "ts": "202 [{"post_id": 79978, "ts": "2026-08-13T00:00:00Z", "hours": 7.0, "text": "ok so from here on we just started placing the robots at different places trying to show what they could do if the washboard didnt always destroy their runs Exhibition 1: Team Big Fish and THE HILL … for our first exhibition, the other team set up the robot before the hill and took some stabs and speeding their way over it. in the end, none of the attempts made it, but i have video of the third one where they got so close that one of the wheels drove onto the other side of the hill and kept the robot there, until their driver let go of the throttle and let it down. it was super cool!! Exhibition 2: Team 10 and THE HOOK finally it was time for my teammates magnum opus of the past two weeks to be revealed and truly tested, and that of course was THE CLIMB!!!! and by the climb i mean a big pink plastic hook on the end of a measuring tape roll taken out of its case that we lovingly call “the bomb” (because it WILL explode if not handled properly). like i said a while ago though, the climb didnt have enough force to pull up the robot, but thats fine! theres still partial points for hooking, so all this exhibition really was was the hook rising at an almost comedically slow pace, before i carefully drove the robot over to the bar (as to not fold over the tape from the velocity) and gingerly brought the hook down on it. and everybody clapped! Exhibition 3: Team Big Fish and THE DUNK aka they used their shooter. it was super cool actually! they have a whole system with conveyor belt squeezing balls forward from above a slanted metal sheet, with flywheels at the end that can block balls for storage purposes until the gate is opened and the conveyor belts are forwarded to shoot them! it was suprisingly good and consistent, shooting from behind the second-to-last line. i wish we could do that… its okay they dont have a climb so we’re better and that was pretty much it! this experience has been so incredibly helpful for my learning and for me in general, and it really was(😢) one of the most fun times of my life. i dont even think i could near catalogue how much fun i had and how many things i learned. i really cant put it into words. thank you lucas, carlos, jade, maanya, patrick, alfonso, and trina for making this what it was, and of course thank you big zrl for sponsoring my attendance. if you’re reviewing this project, i recommend looking at devlogs further down if you’re missing context. the photos should hopefully help see the progression as well (if i can get those uploaded…) i leave you with 3 photos: the state of the robot right before i turned it off for the last time, the absolute state of our whiteboard after we used for brainstorming, and a last minute photo of the hallway i knew i would never walk again. happy hack clubbing!"}, {"post_id": 79977, "ts": "2026-08-12T00:00:00Z", "hours": 7.0, "text": "ladies, gentlemen, and my beautiful enbies * ITS TIME!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! *(ok so i admit this entry was written days later cause i had to go to school next day so my memory is foggy but! its still cool :3) basically the first half of the day (before everyone came in) was spent finalizing somethings we’d waved off earlier, like cable management and wiring in general, especially the motor wires were dangerously close to the suspension rods and a bunch of other things like that power and attaching the battery, since we really needed to keep the batteries charged properly to prevent the pi being underpowered and the battery needed to be held on with something a little less flimsy than straight up velcro 😭 THE GOD DAMN SET SCREWS HOLY TUNA THESE THINGS WILL NOT STAY TIGHT NO MATTER WHAT WE ARE NEVER GOING UP THAT HILL AGAIN ISTG (subtle foreshadowing) keeping the kill switch always accessible from the top and attaching it with a little more than tape and prayers making sure the wheels are attached properly and wont jut out weirdly as it has in the past, throwing the driving off balance as it getting the climb to actually work which is lowk a lost cause but we ball praying theres something we can do about the intake situation 😭🙏 among much more of course, the time eventually came when people started arriving (like alfonso, shoutout my goat) including a whole lot of parents. we started by showing them our robots as we made some final tweaks, like making sure the pi wouldnt fall off of our beautiful, incredibly complex attachment scheme (velcro mounting strips) until it finally happened… COMPETITION START‼️ so the way this ended up going is that each team alternated runs, usually getting progressively further (keyword usually …) Run 1: Team Big Fish (not us) their first run didn’t go too bad!! their ball intake was suprisingly functional (and by suprisingly i mean at all) (better than us tho) and they were almost able to get around the cones autonomously without hitting one! however, when it came to the washboard, it didnt really work out… their bot very quickly got stuck on a pipe and was ill equipped to unstuck itself, ending the first run. Run 2: Team 10 (US!!!!!!!!‼️!!!!!) also not too bad somehow!!!!!!!!!! of course there was no ball intake so we just drove over them, but we were able to slowly but surely get past the slalom with wide margins and very very slow turns in place. as for the washboard though, our run wasnt much better… i took the robot off of the ramp at the start rather fast, making sure to turn up the throttle limit in the hopes it would get us over a few obstacles. spoiler alert: it didnt. we pretty quickly just crashed into a full cinder block, bending the sheet metal base and unsurprisingly making it hard to continue the run! but whatever it was not too bad for a first attempt Run 3: Team Big Fish this one was probably their best! the ball intake was great, and they were able to carry them all through a perfect no-hit slalom! unfortunately, a similar fate to last time met them at the washboard. third times the charm hopefully… Run 4: Team 10 although the robot was slightly banged up now, it was still totally good to go! this slalom attempt was not nearly as graceful, and that certainly applies to the washboard too: i turned up the throttle limit more on the ramp and really just sent it, only to get stuck on top of that cinderblock instead of past it. fun stuff!"}, {"post_id": 79976, "ts": "2026-08-11T00:00:00Z", "hours": 7.0, "text": "and i call it frickmas cause THE COMPETITIONS TOMORROW OMG OMG OMG OMG OK SO here’s what on the agenda: making sure the set screws dont destroy themselves on the field getting the climb attached and making sure it maintains enough torque to actually pull the robot figuring out some sort of system for intake lining up all the suspension to prevent it from getting stuck, damaging the metal, or crapping out on the washboard section making sure the pi mount, buck converter, code, suspension actuation, and every other subsystem actually work testing!!! lots of testing of all of everything!!!!!!! for the first one, my partner had already spent so long on the set screws so some testing was all it took to see that they were fine, and that was enough cause they were not really going to get any better. my other partner finally got around to actually finishing up the climb and attaching it to the front of the bot. good news: it hooks! bad news: it doesn’t even remotely pull back! luckily, the rules still gove points for hook but no lift, so we decided to leave it there since his effort could be best spent elsewhere with this little time left the intake system was determined to be pretty much a dud by the end of the day, cause of course cardboard couldn’t really carry anything, and we didn’t have time to design something better since the last system fully failed lining up the suspension was pretty easy, just took a bit of manual adjustment and a good amount of testing on the field each of these were kind of annoying to address but i have a feeling itll be rather important at the end of the day (which is basically how long until handling all the wiring and subsystems took us) lastly for the testing, we just drove like a bunch of times! honestly the runs went like okayish ig, we rarely made it past the washboard and of course NEVER made it over the hill ever since we did it first a couple weeks ago. otherwise though, the robot was stable the entire time and didnt have any weird glitches or hardware malfunctions (thank god we taped down the battery this time) so we were good(ish) to go! below is basically what our final robot is gonna look like (minus the climb)"}, {"post_id": 79974, "ts": "2026-08-10T00:00:00Z", "hours": 7.0, "text": "OKAY it is time to get down to business we do NOT have much time. first order of business was looking at the TPU wheels reflect printed! they had come in while i was gone, and compared to our flywheels they were actually suprisingly good (although they lowk had their heads blown shmoove off (the tops were weirdly disconnected and ripped off)). most of all, our wheels were much too stiff and theirs were relatively soft, so we decided to go with theirs. we’d also gotten metal parts back from lucas; unfortunately, lucas’ parts were cut kinda incorrectly and for whatever reason the machine shop didn’t make them!! so, i spent today primarily trying to figure out how to do intake while one partner was working on (OF COURSE) retightening and loctite-ing the set screws and the other partner was working on finishing/testing the climb with a smaller motor he bought online over my hiatus. and by figuring out the intake, i mean taping a cardboard box to the bottom of the robot and letting it flap down while desperately PRAYING that the balls go in. i was also driving around a bunch trying to figure out why the robot was still really struggling to take turns, especially on the foam. eventually i had the insight that the friction on the wheels was simply too much, and Lucas came up with the idea of wrapping tape around the wheels to reduce it!! after that it was insane how well it drove and took turns, especially off of the foam floor. i lowk drove it around for like 45 mins straight it was so insanely fun to see something we made acting like a real machine, cause it was driving at a quality i could actually expect in like a real product! it was so cool and gratifying :3 of course i forgot to get a picture of video of it, which i have a feeling im gonna regret…"}, {"post_id": 79971, "ts": "2026-08-04T00:00:00Z", "hours": 7.0, "text": "okay so like i said last entry ill be leaving for three days, which means that i had to finish up some things today! i decided at this point that we were not going to able to mount a plate in the front for the intake (rip that idea and the whole bunch of filament we wasted on it 😭) so i spent the entire day pivoting on that idea and making the articulated suspension!!!! this was a really cool idea i talked with carlos about for like an hour, although we were thinking about only servos for suspension. this time around, i modified those servo mounts to place the head of of the edge of the main plate and used a bit of kevlar string Trina donated (ty Trina!) and tied it to the servo head and around the wheels hub. this means that when the servo is drawn up, the string pulls on the wheel, compresses the spring, and brings the robot down. for context, there is an 8 inch height requirement* that we had yet to succesfully get under. by that i mean the robot was like 11in. so, to get around that, these servo mounts could effectively deactivate the suspension at will, not only making driving more stable in the ball collection phase, but also actually getting under the height requirement! (since it was only a starting height requirement, we were allowed to expand after) anyways i made one mount, tested it, it didnt fully work, designed another and printed two of them, codexed while that was printing, tested one (it worked perfectly), printed 2 more, codexed the code for different states and positions for the servos and configuration stuff ofc, assembled the rest, tested all 4 of them out at the same time, actually tied good knots, and it was done by the end of the day!! im really proud of finishing this subsytem in one day before i left, it was suprisingly fun to see the robot dancing and doing pushups as it drove. and honestly, i think today really gave me that feeling of how incredible it is to see something like this just come to life, the way i feel when i make progress on a good coding project. i lowk want a 3d printer now… maybe that radish jam money could really come in handy……."}, {"post_id": 79970, "ts": "2026-08-03T00:00:00Z", "hours": 7.0, "text": "i am gonna be gone wednesday, thursday, and friday this week due to my schools orientation happening right before CalTech’s WiSTEM (which i am indeed going to :3), both of which are on weekdays. thus, with the intake challenge pushed even further to this wednesday (marking a full week delay), i will need to spend some time getting our existing systems to a good place and helping my partners with whatever they need over today and tomorrow before im gone. that being said, we did very little locking in today (hence calling it the dawn) because we had both a speaker and a tour!! Will Heltsley, former VP of Propulsion of SpaceX and an insanely knowledgable engineer, talked to us about different engineering concepts and some strategies for finding a stable job and a community of like-minded nerds that are fun to work beside. i asked a few questions about working with teams (because this program has shown me that it’ll be a very valuable skill to learn), especially since Will has done everything from working on a 3-person team to managing a group of 350 engineers. he was really helpful!! we also got to tour another startup, Forge Atomics, and it was awesome to see the inner workings of a company that is just getting of the ground! they had a really cool concept and i loved their mission, which in talking to one of the co-founders (Rex the goat) i learned was one of the most important things in finding a team that is going to work well: your missions need to align. also i learned from both mentors that, unless you plan on doing something research heavy like quantum computing, you should NOT get a PhD. guess what i want to do!"}, {"post_id": 79969, "ts": "2026-07-31T00:00:00Z", "hours": 7.0, "text": "okay this day was an experience fs. the start of the day was relatively normal, i was working a bit on ball detection while my partners assembled the intake/outtake thingy, and all of a sudden the pi turns off . this happened before when the power draw was low and peripherals were connected, so i just took out the camera and turned it on. yup, works fine. ok so lets plug the camera in while its on and it turns off . odd, looks like its probably some random bug or connection issue, so i just unplugged it, reseated it, and restarted the Pi. and it doesnt even turn on. ok, well theres another port. idk whats going on, but maybe thatll fix it? nothing. theres spare cables, lets try those ig? nope. ok what the hell the camera must be broken, so lets try a spare camera. doesnt turn on. ok what the actual ****???? lets try it on their robot and then theirs doesnt turn on either . at this point i am positively destroyed and fuming, luckily we have some very good food coming from a place nearby called the melt, so hopefully having a nice gooey cheesesteak can help me calm down, lock in, and figure out whats going on. big mistake. an hour passes. the adults have put on a movie, a fast and furious movie. you dont feel delirious, nor subdued, but simply off. its almost as if you are both more aware of your environment and slowly less aware of yourself. an hour passes. the car noises are still going. focus was a lost cause. one adult is stretching on the floor. the other is sitting at a table, still watching. you’re on the floor too. you’re not getting anything done. it was a lost cause anyways. an hour passes. carlos is sleeping on the slanted wooden plank of the hill. jade is lying on the floor and staring straight up. somehow your partner is locked in. the car noises continue. you are two inches away from meeting God, before you start laughing. shes laughing too, as well as your partner. presumably at carlos. sanity was a lost cause, and you lost it four and a half hours ago. cant believe its somehow 3:30. long story short, we slowly went insane with tokyo drift in the background as i pulled my hair out from the pi frying our cameras and the movie making it hard to focus, while one of my partners locked in to an unprecedented level, one just watched the movie casually, and the rest of us went crazy for no particular reason at all. this was a wild day (hence why im writing this the day after) never eating at the melt again bruh 😭"}, {"post_id": 79968, "ts": "2026-07-30T00:00:00Z", "hours": 7.0, "text": "I FORGOT TO PUT THE PRINT PLATE IN THE PRINTER YESTERDAY GOD DAMN IT 😭😭😭😭😭 its fine. ok so today was generally pretty mundane BUT!!! WE DROVE UP THE HILL LITERALLY ONCE!!!!! just on a whim my partner decided to go full power up the hill after my other partner had just loctited every set screw to see if we could make it, and we did!!!!!!!!!!!!!!!!!!!!!! …….unfortunately……… nobody filmed it…………………………….. -# god damn it…………………………. it was really cool though! i think it represents that we’re really nearing a functionally useful robot and that were actually overcoming the challenges that have plagued us for like weeks anyways heres a picture of our bot looking super duper cool"}, {"post_id": 79967, "ts": "2026-07-29T00:00:00Z", "hours": 7.0, "text": "so my GOATED teammate whose shall not be named figured out the TPU problem: the printer just wasnt strong enough to feed it in! i honestly have some doubt that that was THE problem, considering how easy the solution is (just unspool a bunch of filament onto the ground), but whatever we ball‼️ anyways the first third of today was spent working on that servo mount and arms CAD file i mentioned before as my partners finished up cutting the shafts and legs for the new tensioners. i also got the tensioners printed, but that was pretty quick since its just a few ~1x0.5” pieces the second third was spent doing the assembly for all the pieces, since we had to take apart each leg completely, and then go down the assembly line to put it together. i was responsible for putting on the tensioners and then the motors with these really handy alligator clips Carlos graciously gave us that allowed me to get short screws into holes that were far into the leg. then, once the motor is attached, my partner would attach the wheel and get the belt on there. i think he used some like dark magic cause the belt was really hard to get on before it was tensioned, idek how he did it now… my other partner would then put on the insert, bearings, and shaft for attaching the leg to the chassis. once we were done, we all spent some time getting the legs on the chassis but we didnt finish. i rushed to start the flywheel TPU print we designed a while ago before we left and spent the rest of the day on… THE SPACE X TOUR!!!!!!!!!!!!!!!!!!!!!!!!!! we got to go to spacex and have a little tour with one of patricks friends!!!!!!!!!! it was really really really cool, the facility was huge and we such a bunch of fuel tanks, satellites, an engine actively being built, and a phased antenna array. that last thing nerdsniped me so hard, and because Simon (one of our “tour guides”) was an engineer that worked on the Starlink user terminals (which also had the same type of antenna array as the Starlink satellites) i was able to ask a bunch of questions about it. apparently, they both have a bunch of antenna put together and arranged such that, by controlling the phase of the signal coming through each of the ~50 antennae, can focus on a narrow beam of EMF waves and effectively filter out signal to only a specific Starlink satellite in the sky. super cool!!!! no photo(s) cause we weren’t allowed to take any but its chill"}, {"post_id": 79966, "ts": "2026-07-28T00:00:00Z", "hours": 7.0, "text": "the TPU arrived! guess what though: it lowk doesnt work with the X1c (our printer)!!!!!!! we refined the design for the flywheel a bit, but after figuring out the TPU settings in the printer, our test prints didn’t work at all. at some point, it just seems to run out of filament (usually before the first layer finishes) and leaves these dots of plastic where its supposed to be entirely filled in. no TPU ig!! my teammates spent most of the day figuring out where to cut holes for the tensioner and then actually drilling those holes for the eventual assembly (prob tomorrow). it looked really sucky cause the hacksaw is time-consuming and lowk rather annoying, especially when we need to cut 3 shafts into like 12 pieces, so thank you teammates that was very nice 🙏 i spent the whole rest of the day on the CAD for the articulated arms that we’re gonna have in front and on top of the entire robot, and i designed a servo mount that’ll keep the servos attached to the robot at the exact height we need them to be to make a plate that hits the ground, settles at a nice angle, holds the flywheels, and all the while still fits on the print bed. i tried to print one of those mounts but after like 5 prints that failed on the first layer, the only succesful print ran out of filament on the second to last layer 😭 its lowk chill though cause it looks kinda cool so im gonna keep it attached is the lowk awesome lowk cooked servo mount that i lowk made and printed lowk"}, {"post_id": 79965, "ts": "2026-07-27T00:00:00Z", "hours": 7.0, "text": "GUESS WHAT!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! the belt is skipping. turns out the belt needs to be tensioned to not yknow skip horribly. any real torque that the wheel experiences back on it, including the torque inherently present in turning with tank drive (which is really high cause we have really grippy wheels and their laid out in a rectangle), makes the belt slip on the teeth and not drive the tire at all, leaving the motor spinning but the robot not moving. basically, we’re gonna need a tensioner to slot into the legs. in other news, we still have to get intake/outtake working by friday hopefully. i’ve ordered TPU filament online and got on of my teammates to start on a design for a flywheel that has a PLA hub and TPU tire, maybe we’ll print it tomorrow? although one good thing about this is that the robot looks super cool awesome now (source: see below)"}, {"post_id": 79964, "ts": "2026-07-24T00:00:00Z", "hours": 7.0, "text": "the parts came! literally all of today was spent assembling the drive system as my partners were drilling the holes and cutting the shafts for the wheels, pivots, and spring dowels. we’ve unfortunately found out that the belt drives skip kind of a lot, so hopefully this doesn’t cause issues with driving under torque when we get to that… (i swear if this is foreshadowing) we also went out to Reflect Orbital today!! seeing the mirrors was incredibly cool, and the material they made it out of felt really interesting. something about its very small thickness (2.8 microns!!) made it feel like it was barely on your finger if you weren’t looking at it. In addition, I talked to one of the software engineers (shoutout Alfonso) about how they get the software done, including things like: Double buffering updates (seemingly called ABing) to make sure that no update permanently breaks the system Using the Yocto project to make a custom Linux kernel for their embedded systems Monolithic applications vs. a more service based approach that also goes hand in hand with… Error handling and making sure that something like an illegal instruction won’t crash your expensive space satellite Testing with the ground-sat (all of the components on the real satellite connected together on a table in a room) and an approach that involves uploading the changed code to the ground-sat every night and running a whole test suite to make sure none of the changes broke anything and that they (hopefully) achieved what they were written for overall it was pretty damn cool you should check out Reflect :3 below is one of the legs, and as you can see theres a whole belt going from the motor to the wheel!"}, {"post_id": 79963, "ts": "2026-07-23T00:00:00Z", "hours": 7.0, "text": "guess what THE BEARINGS AND SHAFTS GOT DELAYED!!!! YAAAAAAAAAAAYYYYY its fine. we spent today CADing and printing new designs for both the leg inserts and one piece of the rod-ends, and i think they’re in a pretty good place (for not having the actual components needed). I also did some testing with the ball/cone detection and came to the conclusion that it simply sucks and just isn’t good enough, so I got Codex to give me suggestions for an overhaul and I picked which approach would be the best to go for. The demo it produced for me using new shape detection and differentiating objects from its surroundings (in camera space) was so bad that I’ve decided on a completely different approach altogether: ML!! I got it to do another overhaul that would add a mode to the existing code that allowed camera snapshots to be taken and put in a folder with a press of a button on the controller. Then, it made a tool that could be run on my laptop that would bring the images up one by one, I would mark balls and cones on there, and then that data would be used to train an ONNX model (with ROCM acceleration on my Radeon 890M iGPU, of course) that could then be uploaded onto the Pi and ran as the new detection backend!! we’ll see if it works, cause I did all this at the end of the day and had no time to gather training data (of course i came up with this after two days of having very little to do)."}, {"post_id": 79949, "ts": "2026-07-22T00:00:00Z", "hours": 8.0169, "text": "7/21 - EVERYTHING GOT DELAYED VERY BAD NEWS: every single thing we needed to order for the drive train and suspension got delayed by a day 😭 anyways completely unrelated but the second competition is being moved to thursday, cause we cant drive through the course with literally 0 suspension the first 2 hours of today was spent rushing out an onshape sketch to get our metal legs cut by Lucas cause he (reasonably enough) wanted the drawing by 11 before he left the shop. i had to remember how to do drawings, with a lottt of help from carlos. unfortunately, i forgot the holes for the spring on the top so we’ll have to figure that eventually. i also forgot to put holes that would make screwing in the motor remotely possible but lucas the GOAT put those in for us. could not appreciate it more we might be lowk cooked now, cause the bearings say they’re gonna arrive thursday night so we may not even have the robot driving again until next week 😭😭 that being said we ball‼️ also ill be posting a devlog every weekday now cause i need to journal every day anyways attached below are 2 of the legs we got cut with the motors on them"}, {"post_id": 79948, "ts": "2026-07-22T00:00:00Z", "hours": 0.5692, "text": "7/22 - not much we can do about it much of today was spent moping about how everything would be arriving tonight (and of course the belts are arriving tomorrow night, one of the parts that is literally necessary to drive the thing at all). so much of today was spent just trying to design, cad, and otherwise figure out details for the legs before we actually had the components necessary to make them. i spent some time with one of my teammates figuring out where specifically the springs for the legs are gonna go, and he made a quick 3d printed rod-end that’ll hold in the shaft that acts as the spring dowel. we also planned out where we could put the legs’ pivot point on the chassis and just generally planned every element of assembly that we could. this also involved figuring out last second that i had no idea how we were gonna mount the springs and chassis on the leg at all and that my teammates didn’t know too much either, but its cool we figured it out and started the print by the end of the day 👍 attached: us figuring out where we’re gonna mount both the leg and the spring on the chassis and me drawing the top view of all the drive train stuff going on inside the leg (ignore my horrible handwriting its the board i swear)"}, {"post_id": 79960, "ts": "2026-07-20T00:00:00Z", "hours": 7.0, "text": "almost all of today was spent discussing and weighing different suspension designs and drive train implementations, culminating us in finally buying some parts and basically finishing out our $1000 budget from the start of the program to the end of this week. we settled on the 4 independent legs early, so the options were between: mounting the motor on the chassis on the same pivot point as the leg itself mounting the motor on the chassis and using a u-joint articulated axle mounting the motor high up on the leg and using a belt drive eventually we arrived on that last option because the other ones didnt really pose a benefit that was worth the complexity they would introduce (especially the first one) towards the end of the day, we ordered all the parts we needed to install it hopefully over tomorrow and wednesday also! we finished printing the finalized(…) wheel design so now we have four rigidly attached and bead-locked wheels+tires!! turns out the robot is like significantly faster than we thought so uhhh throttle limit is gonna have to be pretty low for a bit. below is a sample of our mad drawings (mostly mine 😭) trying to figure out how the hell this thing is gonna work"}, {"post_id": 79959, "ts": "2026-07-17T00:00:00Z", "hours": 7.0, "text": "my day was spent entirely on programming two things: the controls - i (codex) spent a bunch of time setting up: the tank controls to individually drive each motor making the motor channels and configuration set in environment variables, and making a shell script that loads those environment variables from a shell script, enters the py venv, and runs the program adding different modes/states to the program and a radial menu to switch between them (all in a TUI by the way) adding a throttle limit and button presses to change it on the fly adding a button to start driving and making it so that every unrecognized button press stops it as a safety measure it wasnt alllll codex tho, i came up with the all ideas for these and usually gave rather specific details for how i wanted them implemented i also worked on the ball detection , which mostly involved sitting down and just adjusting parameters until the detection was like maybe almost passable, adding (asking codex to) add new parameters when the existing ones didn’t encompass the mistaks the detector was making. needless to say this lowk took a while but we’re in a good place rn i think!!! we have a moving robot with some kinda maybe working ball detection, which is like half of the first phase (the easiest part). so were slightly cooked but still yay it works!!"}, {"post_id": 79958, "ts": "2026-07-16T00:00:00Z", "hours": 7.0, "text": "ok sooooo turned out the wheels actually highkey sucked. the shaft was circular, so of course the motor didn’t rotate it well (its a d-shaft motor so its shaft output has a chunk taken out of it), but even once we added the d-shaft it just turned the hole circular by itself anyways 😭 luckily Lucas told us about these things called shaft hubs that dig in to the shaft with set screws and provide screw holes perpendicular to the shaft that can be a lot better at transferring the rotational power without yknow slipping. so we bought those on amazon ofc! but still the assembly went really well!! all the ports worked together, including the motor holes on the legs, and we were able to put the pi on top and connect all the electronics, eventually getting the motors actually moving while in the air by the end of the day! (with a lot lot of codexing ofc) this is what the robot btw!! its super duper duper cool isnt it :3"}, {"post_id": 79957, "ts": "2026-07-15T00:00:00Z", "hours": 7.0, "text": "by that i mean we cut holes in a cardboard box, screwed the motors into them, stuck the wheels on, and codexed like no tomorrow until the motors somehow worked (THANK YOU SO MUCH LUCAS and also gpt luna), but our stupid dingy two-wheeled cardboard box actually moved! baby steps i swear ok but more important we’ve actually designed a metal base for the robot!! its literally a flat metal sheet with holes cut in it + 2 bent sheet metal pieces with motor holes cut out in them but! we learned about onshape a bunch more, the process of sheet metal modeling, and especially how to work with a machine shop. you heard that right, we’re getting our parts sent to a machine shop!!!! im really excited to see this piece come to life after we bumbled around on an onshape tab for like 3 hours trying to design it, i have a feeling its gonna be really cool. oh also were getting it tomorrow afternoon yay!!!! attached is that slightly cooked “robot”"}, {"post_id": 79956, "ts": "2026-07-14T00:00:00Z", "hours": 7.0, "text": "luckily the tires were able to arrive this morning, so Jade (one of the adults at the program) brought them in and we got to designing + 3d printing wheels for them! luckily we have full access to a bambu lab x1 carbon here, so we took some lessons from Carlos (one of the mentors) in Onshape and tried to design a preliminary wheel. of course it didnt fit cause we have no idea how to use calipers seemingly, but the second attempt actually worked pretty well! you could try to turn the tire and stop the wheel, and it wouldnt move unless you put a lot of force. we left a shaft hole in it ofc so we can put it on the motors when we recieve them tomorrow. very awesome very cool!!"}, {"post_id": 79950, "ts": "2026-07-14T00:00:00Z", "hours": 4.4017, "text": "so i may have forgotten to make a project when we started this a week ago but! the motors and camera are all connected successfully to the pi and it has a gh repo set up with a Codex’d ball/cone detector that automatically drives the motors (or manually with a usb xbox controller clone). all we need now is for the sheet metal chassis we designed friday to arrive and the bidirectional ESCs we ordered to replace the small and kinda inconsistent generic ESCs we have now"}, {"post_id": 79955, "ts": "2026-07-13T00:00:00Z", "hours": 7.0, "text": "we’ve finally formed our real groups! i got placed with two dudes, one my age and the other surprisingly young for the caliber of challenge we had ahead we also got $1000 to spend at our discretion for the next two weeks!!!!!🤑!!!!!!! we immediately made an amazon account and ordered some fundamental stuff, like: a controller! i just bought a cheap usb xbox controller clone, since we dont really need quality but we do need a reliable connection that works on startup. most importantly, motors!!!! this took a lot lot lot of deliberation (the whole day basically) and talking to our motors, but we eventually decided on these Maxynos planetary gear motors cause they have really good torque, theyre not too expensive, and we can easily buy some ESCs to connect to them. speaking off… ESCs and power distribution cables: this constisted of the motor speed controllers that were very specifically bought for their XT60 plugs, and then 3 splitter cables (2 2-way and 1 3-way) to distribute the power to each of the 4 motors and the pi as well. battery: at the advice of Lucas, one of our mentors who clearly knows a lot about projects like this, recommended Spektrum smart batteries so we bought a few of those + a brand smart charger for both teams 5V converter: to feed battery power to the Pi without literally kabooming it up (and to connect it in the first place). tires: we spent a lot of time on this decision! once again, lucas came in clutch suggesting rc car crawlers wheels because they have a lot of friction but also are very bendy. plus they have listed dimensions and a lip to attach a “bead-locked” wheel to, so we can just design our own wheel and put it in once it arrives and that was the day! whole lot of money spent for sure but its fineeeeeee (probably) (hopefully)"}, {"post_id": 79954, "ts": "2026-07-10T00:00:00Z", "hours": 7.0, "text": "one of my partners had already been working on a ball detection demo over the last couple of days that worked with their laptop camera, so i (Codex) took some time to add a picamera2 backend along with the existing opencv2 one and getting the code actually uploaded to the pi. there were a bunch of issues with libraries and venvs and maintaining stable input and output to and from the pi, but eventually we got some kind of a demo working. we had to plug in the pi’s power supply in the corner of the room and partially covered by like 20 chairs, but the ball detection kind of almost maybe worked a bit! one problem was that they made the program assuming manual mouse input for initially cataloging the different colored balls under those lighting conditions, but that had to be removed because there was no good way to have mouse input and realtime monitor output for the pi *and we certainly wouldn’t have that on the course itself)"}, {"post_id": 79953, "ts": "2026-07-09T00:00:00Z", "hours": 7.0, "text": "the start of the day was spent with all of us drawing our ideas for how we’d design a robot that could complete the course and then discussing what we drew, which was pretty helpful since i changed my design a few times based on what other people drew. i spent some time trying to get the IMX708 camera they bought to connect, which of course took the entire day 😭 the problem was that i was plugging it into port zero but the line in /boot/firmware/config.txt was dtoverlay=imx708 . of course it was supposed to be include cam0 to specify it was plugged into port 0 and not the apparent default of port 1(?!?). but whatever, i got the camera plugged in and showing stills by the end of the day"}, {"post_id": 79952, "ts": "2026-07-08T00:00:00Z", "hours": 7.0, "text": "finished setting up the Pis (finally), despite the train of issues that tried to stop us: the first problem was that the college wifi required sign in, so setting it up headless wasnt working. i tried to use lynx , but the website required js on its sign-in page(??) so i couldnt do that. i tried to use my tether (basically a hotspot but without hotspot data) but wpa_supplicant wasn’t authenticating properly. i tried to use my real hotspot, but the wifi didn’t work with that either. on a whim i switched to 2.4GHz and WPA2 and it worked magically? of course rpi connect still didn’t work and ssh wasn’t allowed over my hotspot for some reason so i just had them buy us a monitor, reformatted with a desktop installed, and plugged in a usb mouse and keyboard to authenticate manually. of course ssh is blocked on the school wifi (what im using now), but rpi connect works enough. that was pretty much the entire day though, the only other thing i did was getting a git repository set up on the pi"}, {"post_id": 79951, "ts": "2026-07-07T00:00:00Z", "hours": 7.0, "text": "we met each other, got a look at the course, and all drove the RC car through it one at a time. we also made accounts and signed up for Onshape and ChatGPT Plus, then Patrick showed us how to use Codex since that’s how we’ll be “coding” the entire project. another classmate and i then proceeded to spend the rest of the day setting up the Raspberry Pis that we’re going to use as our robots’ brains (we didn’t finish that day) attaached is a picture of that rc car"}]...
|
Title: off-road autonomous robot by @leila | Stard Title: off-road autonomous robot by @leila | Stardance
Devlogs:
we met each other, got a look at the course, and all drove the RC car through it one at a time. we also made accounts and signed up for Onshape and ChatGPT Plus, then Patrick showed us how to use Codex since that’s how we’ll be “coding” the entire project. another classmate and i then proceeded to spend the rest of the day setting up the Raspberry Pis that we’re going to use as our robots’ brains (we didn’t finish that day) attaached is a picture of that rc car
finished setting up the Pis (finally), despite the train of issues that tried to stop us: the first problem was that the college wifi required sign in, so setting it up headless wasnt working. i tried to use lynx , but the website required js on its sign-in page(??) so i couldnt do that. i tried to use my tether (basically a hotspot but without hotspot data) but wpa_supplicant wasn’t authenticating properly. i tried to use my real hotspot, but the wifi didn’t work with that either. on a whim i switched to 2.4GHz and WPA2 and it worked magically? of course rpi connect still didn’t work and ssh wasn’t allowed over my hotspot for some reason so i just had them buy us a monitor, reformatted with a desktop installed, and plugged in a usb mouse and keyboard to authenticate manually. of course ssh is blocked on the school wifi (what im using now), but rpi connect works enough. that was pretty much the entire day though, the only other thing i did was getting a git repository set up on the pi
the start of the day was spent with all of us drawing our ideas for how we’d design a robot that could complete the course and then discussing what we drew, which was pretty helpful since i changed my design a few times based on what other people drew. i spent some time trying to get the IMX708 camera they bought to connect, which of course took the entire day 😭 the problem was that i was plugging it into port zero but the line in /boot/firmware/config.txt was dtoverlay=imx708 . of course it was supposed to be include cam0 to specify it was plugged into port 0 and not the apparent default of port 1(?!?). but whatever, i got the camera plugged in and showing stills by the end of the day
one of my partners had already been working on a ball detection demo over the last couple of days that worked with their laptop camera, so i (Codex) took some time to add a picamera2 backend along with the existing opencv2 one and getting the code actually uploaded to the pi. there were a bunch of issues with libraries and venvs and maintaining stable input and output to and from the pi, but eventually we got some kind of a demo working. we had to plug in the pi’s power supply in the corner of the room and partially covered by like 20 chairs, but the ball detection kind of almost maybe worked a bit! one problem was that they made the program assuming manual mouse input for initially cataloging the different colored balls under those lighting conditions, but that had to be removed because there was no good way to have mouse input and realtime monitor output for the pi *and we certainly wouldn’t have that on the course itself)
we’ve finally formed our real groups! i got placed with two dudes, one my age and the other surprisingly young for the caliber of challenge we had ahead we also got $1000 to spend at our discretion for the next two weeks!!!!!🤑!!!!!!! we immediately made an amazon account and ordered some fundamental stuff, like: a controller! i just bought a cheap usb xbox controller clone, since we dont really need quality but we do need a reliable connection that works on startup. most importantly, motors!!!! this took a lot lot lot of deliberation (the whole day basically) and talking to our motors, but we eventually decided on these Maxynos planetary gear motors cause they have really good torque, theyre not too expensive, and we can easily buy some ESCs to connect to them. speaking off… ESCs and power distribution cables: this constisted of the motor speed controllers that were very specifically bought for their XT60 plugs, and then 3 splitter cables (2 2-way and 1 3-way) to distribute the power to each of the 4 motors and the pi as well. battery: at the advice of Lucas, one of our mentors who clearly knows a lot about projects like this, recommended Spektrum smart batteries so we bought a few of those + a brand smart charger for both teams 5V converter: to feed battery power to the Pi without literally kabooming it up (and to connect it in the first place). tires: we spent a lot of time on this decision! once again, lucas came in clutch suggesting rc car crawlers wheels because they have a lot of friction but also are very bendy. plus they have listed dimensions and a lip to attach a “bead-locked” wheel to, so we can just design our own wheel and put it in once it arrives and that was the day! whole lot of money spent for sure but its fineeeeeee (probably) (hopefully)
so i may have forgotten to make a project when we started this a week ago but! the motors and camera are all connected successfully to the pi and it has a gh repo set up with a Codex’d ball/cone detector that automatically drives the motors (or manually with a usb xbox controller clone). all we need now is for the sheet metal chassis we designed friday to arrive and the bidirectional ESCs we ordered to replace the small and kinda inconsistent generic ESCs we have now
luckily the tires were able to arrive this morning, so Jade (one of the adults at the program) brought them in and we got to designing + 3d printing wheels for them! luckily we have full access to a bambu lab x1 carbon here, so we took some lessons from Carlos (one of the mentors) in Onshape and tried to design a preliminary wheel. of course it didnt fit cause we have no idea how to use calipers seemingly, but the second attempt actually worked pretty well! you could try to turn the tire and stop the wheel, and it wouldnt move unless you put a lot of force. we left a shaft hole in it ofc so we can put it on the motors when we recieve them tomorrow. very awesome very cool!!
by that i mean we cut holes in a cardboard box, screwed the motors into them, stuck the wheels on, and codexed like no tomorrow until the motors somehow worked (THANK YOU SO MUCH LUCAS and also gpt luna), but our stupid dingy two-wheeled cardboard box actually moved! baby steps i swear ok but more important we’ve actually designed a metal base for the robot!! its literally a flat metal sheet with holes cut in it + 2 bent sheet metal pieces with motor holes cut out in them but! we learned about onshape a bunch more, the process of sheet metal modeling, and especially how to work with a machine shop. you heard that right, we’re getting our parts sent to a machine shop!!!! im really excited to see this piece come to life after we bumbled around on an onshape tab for like 3 hours trying to design it, i have a feeling its gonna be really cool. oh also were getting it tomorrow afternoon yay!!!! attached is that slightly cooked “robot”
ok sooooo turned out the wheels actually highkey sucked. the shaft was circular, so of course the motor didn’t rotate it well (its a d-shaft motor so its shaft output has a chunk taken out of it), but even once we added the d-shaft it just turned the hole circular by itself anyways 😭 luckily Lucas told us about these things called shaft hubs that dig in to the shaft with set screws and provide screw holes perpendicular to the shaft that can be a lot better at transferring the rotational power without yknow slipping. so we bought those on amazon ofc! but still the assembly went really well!! all the ports worked together, including the motor holes on the legs, and we were able to put the pi on top and connect all the electronics, eventually getting the motors actually moving while in the air by the end of the day! (with a lot lot of codexing ofc) this is what the robot btw!! its super duper duper cool isnt it :3
my day was spent entirely on programming two things: the controls - i (codex) spent a bunch of time setting up: the tank controls to individually drive each motor making the motor channels and configuration set in environment variables, and making a shell script that loads those environment variables from a shell script, enters the py venv, and runs the program adding different modes/states to the program and a radial menu to switch between them (all in a TUI by the way) adding a throttle limit and button presses to change it on the fly adding a button to start driving and making it so that every unrecognized button press stops it as a safety measure it wasnt alllll codex tho, i came up with the all ideas for these and usually gave rather specific details for how i wanted them implemented i also worked on the ball detection , which mostly involved sitting down and just adjusting parameters until the detection was like maybe almost passable, adding (asking codex to) add new parameters when the existing ones didn’t encompass the mistaks the detector was making. needless to say this lowk took a while but we’re in a good place rn i think!!! we have a moving robot with some kinda maybe working ball detection, which is like half of the first phase (the easiest part). so were slightly cooked but still yay it works!!
almost all of today was spent discussing and weighing different suspension designs and drive train implementations, culminating us in finally buying some parts and basically finishing out our $1000 budget from the start of the program to the end of this week. we settled on the 4 independent legs early, so the options were between: mounting the motor on the chassis on the same pivot point as the leg itself mounting the motor on the chassis and using a u-joint articulated axle mounting the motor high up on the leg and using a belt drive eventually we arrived on that last option because the other ones didnt really pose a benefit that was worth the complexity they would introduce (especially the first one) towards the end of the day, we ordered all the parts we needed to install it hopefully over tomorrow and wednesday also! we finished printing the finalized(…) wheel design so now we have four rigidly attached and bead-locked wheels+tires!! turns out the robot is like significantly faster than we thought so uhhh throttle limit is gonna have to be pretty low for a bit. below is a sample of our mad drawings (mostly mine 😭) trying to figure out how the hell this thing is gonna work
7/22 - not much we can do about it much of today was spent moping about how everything would be arriving tonight (and of course the belts are arriving tomorrow night, one of the parts that is literally necessary to drive the thing at all). so much of today was spent just trying to design, cad, and otherwise figure out details for the legs before we actually had the components necessary to make them. i spent some time with one of my teammates figuring out where specifically the springs for the legs are gonna go, and he made a quick 3d printed rod-end that’ll hold in the shaft that acts as the spring dowel. we also planned out where we could put the legs’ pivot point on the chassis and just generally planned every element of assembly that we could. this also involved figuring out last second that i had no idea how we were gonna mount the springs and chassis on the leg at all and that my teammates didn’t know too much either, but its cool we figured it out and started the print by the end of the day 👍 attached: us figuring out where we’re gonna mount both the leg and the spring on the chassis and me drawing the top view of all the drive train stuff going on inside the leg (ignore my horrible handwriting its the board i swear)
7/21 - EVERYTHING GOT DELAYED VERY BAD NEWS: every single thing we needed to order for the drive train and suspension got delayed by a day 😭 anyways completely unrelated but the second competition is being moved to thursday, cause we cant drive through the course with literally 0 suspension the first 2 hours of today was spent rushing out an onshape sketch to get our metal legs cut by Lucas cause he (reasonably enough) wanted the drawing by 11 before he left the shop. i had to remember how to do drawings, with a lottt of help from carlos. unfortunately, i forgot the holes for the spring on the top so we’ll have to figure that eventually. i also forgot to put holes that would make screwing in the motor remotely possible but lucas the GOAT put those in for us. could not appreciate it more we might be lowk cooked now, cause the bearings say they’re gonna arrive thursday night so we may not even have the robot driving again until next week 😭😭 that being said we ball‼️ also ill be posting a devlog every weekday now cause i need to journal every day anyways attached below are 2 of the legs we got cut with the motors on them
guess what THE BEARINGS AND SHAFTS GOT DELAYED!!!! YAAAAAAAAAAAYYYYY its fine. we spent today CADing and printing new designs for both the leg inserts and one piece of the rod-ends, and i think they’re in a pretty good place (for not having the actual components needed). I also did some testing with the ball/cone detection and came to the conclusion that it simply sucks and just isn’t good enough, so I got Codex to give me suggestions for an overhaul and I picked which approach would be the best to go for. The demo it produced for me using new shape detection and differentiating objects from its surroundings (in camera space) was so bad that I’ve decided on a completely different approach altogether: ML!! I got it to do another overhaul that would add a mode to the existing code that allowed camera snapshots to be taken and put in a folder with a press of a button on the controller. Then, it made a tool that could be run on my laptop that would bring the images up one by one, I would mark balls and cones on there, and then that data would be used to train an ONNX model (with ROCM acceleration on my Radeon 890M iGPU, of course) that could then be uploaded onto the Pi and ran as the new detection backend!! we’ll see if it works, cause I did all this at the end of the day and had no time to gather training data (of course i came up with this after two days of having very little to do).
the parts came! literally all of today was spent assembling the drive system as my partners were drilling the holes and cutting the shafts for the wheels, pivots, and spring dowels. we’ve unfortunately found out that the belt drives skip kind of a lot, so hopefully this doesn’t cause issues with driving under torque when we get to that… (i swear if this is foreshadowing) we also went out to Reflect Orbital today!! seeing the mirrors was incredibly cool, and the material they made it out of felt really interesting. something about its very small thickness (2.8 microns!!) made it feel like it was barely on your finger if you weren’t looking at it. In addition, I talked to one of the software engineers (shoutout Alfonso) about how they get the software done, including things like: Double buffering updates (seemingly called ABing) to make sure that no update permanently breaks the system Using the Yocto project to make a custom Linux kernel for their embedded systems Monolithic applications vs. a more service based approach that also goes hand in hand with… Error handling and making sure that something like an illegal instruction won’t crash your expensive space satellite Testing with the ground-sat (all of the components on the real satellite connected together on a table in a room) and an approach that involves uploading the changed code to the ground-sat every night and running a whole test suite to make sure none of the changes broke anything and that they (hopefully) achieved what they were written for overall it was pretty damn cool you should check out Reflect :3 below is one of the legs, and as you can see theres a whole belt going from the motor to the wheel!
GUESS WHAT!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! the belt is skipping. turns out the belt needs to be tensioned to not yknow skip horribly. any real torque that the wheel experiences back on it, including the torque inherently present in turning with tank drive (which is really high cause we have really grippy wheels and their laid out in a rectangle), makes the belt slip on the teeth and not drive the tire at all, leaving the motor spinning but the robot not moving. basically, we’re gonna need a tensioner to slot into the legs. in other news, we still have to get intake/outtake working by friday hopefully. i’ve ordered TPU filament online and got on of my teammates to start on a design for a flywheel that has a PLA hub and TPU tire, maybe we’ll print it tomorrow? although one good thing about this is that the robot looks super cool awesome now (source: see below)
the TPU arrived! guess what though: it lowk doesnt work with the X1c (our printer)!!!!!!! we refined the design for the flywheel a bit, but after figuring out the TPU settings in the printer, our test prints didn’t work at all. at some point, it just seems to run out of filament (usually before the first layer finishes) and leaves these dots of plastic where its supposed to be entirely filled in. no TPU ig!! my teammates spent most of the day figuring out where to cut holes for the tensioner and then actually drilling those holes for the eventual assembly (prob tomorrow). it looked really sucky cause the hacksaw is time-consuming and lowk rather annoying, especially when we need to cut 3 shafts into like 12 pieces, so thank you teammates that was very nice 🙏 i spent the whole rest of the day on the CAD for the articulated arms that we’re gonna have in front and on top of the entire robot, and i designed a servo mount that’ll keep the servos attached to the robot at the exact height we need them to be to make a plate that hits the ground, settles at a nice angle, holds the flywheels, and all the while still fits on the print bed. i tried to print one of those mounts but after like 5 prints that failed on the first layer, the only succesful print ran out of filament on the second to last layer 😭 its lowk chill though cause it looks kinda cool so im gonna keep it attached is the lowk awesome lowk cooked servo mount that i lowk made and printed lowk
so my GOATED teammate whose shall not be named figured out the TPU problem: the printer just wasnt strong enough to feed it in! i honestly have some doubt that that was THE problem, considering how easy the solution is (just unspool a bunch of filament onto the ground), but whatever we ball‼️ anyways the first third of today was spent working on that servo mount and arms CAD file i mentioned before as my partners finished up cutting the shafts and legs for the new tensioners. i also got the tensioners printed, but that was pretty quick since its just a few ~1x0.5” pieces the second third was spent doing the assembly for all the pieces, since we had to take apart each leg completely, and then go down the assembly line to put it together. i was responsible for putting on the tensioners and then the motors with these really handy alligator clips Carlos graciously gave us that allowed me to get short screws into holes that were far into the leg. then, once the motor is attached, my partner would attach the wheel and get the belt on there. i think he used some like dark magic cause the belt was really hard to get on before it was tensioned, idek how he did it now… my other partner would then put on the insert, bearings, and shaft for attaching the leg to the chassis. once we were done, we all spent some time getting the legs on the chassis but we didnt finish. i rushed to start the flywheel TPU print we designed a while ago before we left and spent the rest of the day on… THE SPACE X TOUR!!!!!!!!!!!!!!!!!!!!!!!!!! we got to go to spacex and have a little tour with one of patricks friends!!!!!!!!!! it was really really really cool, the facility was huge and we such a bunch of fuel tanks, satellites, an engine actively being built, and a phased antenna array. that last thing nerdsniped me so hard, and because Simon (one of our “tour guides”) was an engineer that worked on the Starlink user terminals (which also had the same type of antenna array as the Starlink satellites) i was able to ask a bunch of questions about it. apparently, they both have a bunch of antenna put together and arranged such that, by controlling the phase of the signal coming through each of the ~50 antennae, can focus on a narrow beam of EMF waves and effectively filter out signal to only a specific Starlink satellite in the sky. super cool!!!! no photo(s) cause we weren’t allowed to take any but its chill
I FORGOT TO PUT THE PRINT PLATE IN THE PRINTER YESTERDAY GOD DAMN IT 😭😭😭😭😭 its fine. ok so today was generally pretty mundane BUT!!! WE DROVE UP THE HILL LITERALLY ONCE!!!!! just on a whim my partner decided to go full power up the hill after my other partner had just loctited every set screw to see if we could make it, and we did!!!!!!!!!!!!!!!!!!!!!! …….unfortunately……… nobody filmed it…………………………….. -# god damn it…………………………. it was really cool though! i think it represents that we’re really nearing a functionally useful robot and that were actually overcoming the challenges that have plagued us for like weeks anyways heres a picture of our bot looking super duper cool
okay this day was an experience fs. the start of the day was relatively normal, i was working a bit on ball detection while my partners assembled the intake/outtake thingy, and all of a sudden the pi turns off . this happened before when the power draw was low and peripherals were connected, so i just took out the camera and turned it on. yup, works fine. ok so lets plug the camera in while its on and it turns off . odd, looks like its probably some random bug or connection issue, so i just unplugged it, reseated it, and restarted the Pi. and it doesnt even turn on. ok, well theres another port. idk whats going on, but maybe thatll fix it? nothing. theres spare cables, lets try those ig? nope. ok what the hell the camera must be broken, so lets try a spare camera. doesnt turn on. ok what the actual ****???? lets try it on their robot and then theirs doesnt turn on either . at this point i am positively destroyed and fuming, luckily we have some very good food coming from a place nearby called the melt, so hopefully having a nice gooey cheesesteak can help me calm down, lock in, and figure out whats going on. big mistake. an hour passes. the adults have put on a movie, a fast and furious movie. you dont feel delirious, nor subdued, but simply off. its almost as if you are both more aware of your environment and slowly less aware of yourself. an hour passes. the car noises are still going. focus was a lost cause. one adult is stretching on the floor. the other is sitting at a table, still watching. you’re on the floor too. you’re not getting anything done. it was a lost cause anyways. an hour passes. carlos is sleeping on the slanted wooden plank of the hill. jade is lying on the floor and staring straight up. somehow your partner is locked in. the car noises continue. you are two inches away from meeting God, before you start laughing. shes laughing too, as well as your partner. presumably at carlos. sanity was a lost cause, and you lost it four and a half hours ago. cant believe its somehow 3:30. long story short, we slowly went insane with tokyo drift in the background as i pulled my hair out from the pi frying our cameras and the movie making it hard to focus, while one of my partners locked in to an unprecedented level, one just watched the movie casually, and the rest of us went crazy for no particular reason at all. this was a wild day (hence why im writing this the day after) never eating at the melt again bruh 😭
i am gonna be gone wednesday, thursday, and friday this week due to my schools orientation happening right before CalTech’s WiSTEM (which i am indeed going to :3), both of which are on weekdays. thus, with the intake challenge pushed even further to this wednesday (marking a full week delay), i will need to spend some time getting our existing systems to a good place and helping my partners with whatever they need over today and tomorrow before im gone. that being said, we did very little locking in today (hence calling it the dawn) because we had both a speaker and a tour!! Will Heltsley, former VP of Propulsion of SpaceX and an insanely knowledgable engineer, talked to us about different engineering concepts and some strategies for finding a stable job and a community of like-minded nerds that are fun to work beside. i asked a few questions about working with teams (because this program has shown me that it’ll be a very valuable skill to learn), especially since Will has done everything from working on a 3-person team to managing a group of 350 engineers. he was really helpful!! we also got to tour another startup, Forge Atomics, and it was awesome to see the inner workings of a company that is just getting of the ground! they had a really cool concept and i loved their mission, which in talking to one of the co-founders (Rex the goat) i learned was one of the most important things in finding a team that is going to work well: your missions need to align. also i learned from both mentors that, unless you plan on doing something research heavy like quantum computing, you should NOT get a PhD. guess what i want to do!
okay so like i said last entry ill be leaving for three days, which means that i had to finish up some things today! i decided at this point that we were not going to able to mount a plate in the front for the intake (rip that idea and the whole bunch of filament we wasted on it 😭) so i spent the entire day pivoting on that idea and making the articulated suspension!!!! this was a really cool idea i talked with carlos about for like an hour, although we were thinking about only servos for suspension. this time around, i modified those servo mounts to place the head of of the edge of the main plate and used a bit of kevlar string Trina donated (ty Trina!) and tied it to the servo head and around the wheels hub. this means that when the servo is drawn up, the string pulls on the wheel, compresses the spring, and brings the robot down. for context, there is an 8 inch height requirement* that we had yet to succesfully get under. by that i mean the robot was like 11in. so, to get around that, these servo mounts could effectively deactivate the suspension at will, not only making driving more stable in the ball collection phase, but also actually getting under the height requirement! (since it was only a starting height requirement, we were allowed to expand after) anyways i made one mount, tested it, it didnt fully work, designed another and printed two of them, codexed while that was printing, tested one (it worked perfectly), printed 2 more, codexed the code for different states and positions for the servos and configuration stuff ofc, assembled the rest, tested all 4 of them out at the same time, actually tied good knots, and it was done by the end of the day!! im really proud of finishing this subsytem in one day before i left, it was suprisingly fun to see the robot dancing and doing pushups as it drove. and honestly, i think today really gave me that feeling of how incredible it is to see something like this just come to life, the way i feel when i make progress on a good coding project. i lowk want a 3d printer now… maybe that radish jam money could really come in handy…….
OKAY it is time to get down to business we do NOT have much time. first order of business was looking at the TPU wheels reflect printed! they had come in while i was gone, and compared to our flywheels they were actually suprisingly good (although they lowk had their heads blown shmoove off (the tops were weirdly disconnected and ripped off)). most of all, our wheels were much too stiff and theirs were relatively soft, so we decided to go with theirs. we’d also gotten metal parts back from lucas; unfortunately, lucas’ parts were cut kinda incorrectly and for whatever reason the machine shop didn’t make them!! so, i spent today primarily trying to figure out how to do intake while one partner was working on (OF COURSE) retightening and loctite-ing the set screws and the other partner was working on finishing/testing the climb with a smaller motor he bought online over my hiatus. and by figuring out the intake, i mean taping a cardboard box to the bottom of the robot and letting it flap down while desperately PRAYING that the balls go in. i was also driving around a bunch trying to figure out why the robot was still really struggling to take turns, especially on the foam. eventually i had the insight that the friction on the wheels was simply too much, and Lucas came up with the idea of wrapping tape around the wheels to reduce it!! after that it was insane how well it drove and took turns, especially off of the foam floor. i lowk drove it around for like 45 mins straight it was so insanely fun to see something we made acting like a real machine, cause it was driving at a quality i could actually expect in like a real product! it was so cool and gratifying :3 of course i forgot to get a picture of video of it, which i have a feeling im gonna regret…
and i call it frickmas cause THE COMPETITIONS TOMORROW OMG OMG OMG OMG OK SO here’s what on the agenda: making sure the set screws dont destroy themselves on the field getting the climb attached and making sure it maintains enough torque to actually pull the robot figuring out some sort of system for intake lining up all the suspension to prevent it from getting stuck, damaging the metal, or crapping out on the washboard section making sure the pi mount, buck converter, code, suspension actuation, and every other subsystem actually work testing!!! lots of testing of all of everything!!!!!!! for the first one, my partner had already spent so long on the set screws so some testing was all it took to see that they were fine, and that was enough cause they were not really going to get any better. my other partner finally got around to actually finishing up the climb and attaching it to the front of the bot. good news: it hooks! bad news: it doesn’t even remotely pull back! luckily, the rules still gove points for hook but no lift, so we decided to leave it there since his effort could be best spent elsewhere with this little time left the intake system was determined to be pretty much a dud by the end of the day, cause of course cardboard couldn’t really carry anything, and we didn’t have time to design something better since the last system fully failed lining up the suspension was pretty easy, just took a bit of manual adjustment and a good amount of testing on the field each of these were kind of annoying to address but i have a feeling itll be rather important at the end of the day (which is basically how long until handling all the wiring and subsystems took us) lastly for the testing, we just drove like a bunch of times! honestly the runs went like okayish ig, we rarely made it past the washboard and of course NEVER made it over the hill ever since we did it first a couple weeks ago. otherwise though, the robot was stable the entire time and didnt have any weird glitches or hardware malfunctions (thank god we taped down the battery this time) so we were good(ish) to go! below is basically what our final robot is gonna look like (minus the climb)
ladies, gentlemen, and my beautiful enbies * ITS TIME!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! *(ok so i admit this entry was written days later cause i had to go to school next day so my memory is foggy but! its still cool :3) basically the first half of the day (before everyone came in) was spent finalizing somethings we’d waved off earlier, like cable management and wiring in general, especially the motor wires were dangerously close to the suspension rods and a bunch of other things like that power and attaching the battery, since we really needed to keep the batteries charged properly to prevent the pi being underpowered and the battery needed to be held on with something a little less flimsy than straight up velcro 😭 THE GOD DAMN SET SCREWS HOLY TUNA THESE THINGS WILL NOT STAY TIGHT NO MATTER WHAT WE ARE NEVER GOING UP THAT HILL AGAIN ISTG (subtle foreshadowing) keeping the kill switch always accessible from the top and attaching it with a little more than tape and prayers making sure the wheels are attached properly and wont jut out weirdly as it has in the past, throwing the driving off balance as it getting the climb to actually work which is lowk a lost cause but we ball praying theres something we can do about the intake situation 😭🙏 among much more of course, the time eventually came when people started arriving (like alfonso, shoutout my goat) including a whole lot of parents. we started by showing them our robots as we made some final tweaks, like making sure the pi wouldnt fall off of our beautiful, incredibly complex attachment scheme (velcro mounting strips) until it finally happened… COMPETITION START‼️ so the way this ended up going is that each team alternated runs, usually getting progressively further (keyword usually …) Run 1: Team Big Fish (not us) their first run didn’t go too bad!! their ball intake was suprisingly functional (and by suprisingly i mean at all) (better than us tho) and they were almost able to get around the cones autonomously without hitting one! however, when it came to the washboard, it didnt really work out… their bot very quickly got stuck on a pipe and was ill equipped to unstuck itself, ending the first run. Run 2: Team 10 (US!!!!!!!!‼️!!!!!) also not too bad somehow!!!!!!!!!! of course there was no ball intake so we just drove over them, but we were able to slowly but surely get past the slalom with wide margins and very very slow turns in place. as for the washboard though, our run wasnt much better… i took the robot off of the ramp at the start rather fast, making sure to turn up the throttle limit in the hopes it would get us over a few obstacles. spoiler alert: it didnt. we pretty quickly just crashed into a full cinder block, bending the sheet metal base and unsurprisingly making it hard to continue the run! but whatever it was not too bad for a first attempt Run 3: Team Big Fish this one was probably their best! the ball intake was great, and they were able to carry them all through a perfect no-hit slalom! unfortunately, a similar fate to last time met them at the washboard. third times the charm hopefully… Run 4: Team 10 although the robot was slightly banged up now, it was still totally good to go! this slalom attempt was not nearly as graceful, and that certainly applies to the washboard too: i turned up the throttle limit more on the ramp and really just sent it, only to get stuck on top of that cinderblock instead of past it. fun stuff!
ok so from here on we just started placing the robots at different places trying to show what they could do if the washboard didnt always destroy their runs Exhibition 1: Team Big Fish and THE HILL … for our first exhibition, the other team set up the robot before the hill and took some stabs and speeding their way over it. in the end, none of the attempts made it, but i have video of the third one where they got so close that one of the wheels drove onto the other side of the hill and kept the robot there, until their driver let go of the throttle and let it down. it was super cool!! Exhibition 2: Team 10 and THE HOOK finally it was time for my teammates magnum opus of the past two weeks to be revealed and truly tested, and that of course was THE CLIMB!!!! and by the climb i mean a big pink plastic hook on the end of a measuring tape roll taken out of its case that we lovingly call “the bomb” (because it WILL explode if not handled properly). like i said a while ago though, the climb didnt have enough force to pull up the robot, but thats fine! theres still partial points for hooking, so all this exhibition really was was the hook rising at an almost comedically slow pace, before i carefully drove the robot over to the bar (as to not fold over the tape from the velocity) and gingerly brought the hook down on it. and everybody clapped! Exhibition 3: Team Big Fish and THE DUNK aka they used their shooter. it was super cool actually! they have a whole system with conveyor belt squeezing balls forward from above a slanted metal sheet, with flywheels at the end that can block balls for storage purposes until the gate is opened and the conveyor belts are forwarded to shoot them! it was suprisingly good and consistent, shooting from behind the second-to-last line. i wish we could do that… its okay they dont have a climb so we’re better and that was pretty much it! this experience has been so incredibly helpful for my learning and for me in general, and it really was(😢) one of the most fun times of my life. i dont even think i could near catalogue how much fun i had and how many things i learned. i really cant put it into words. thank you lucas, carlos, jade, maanya, patrick, alfonso, and trina for making this what it was, and of course thank you big zrl for sponsoring my attendance. if you’re reviewing this project, i recommend looking at devlogs further down if you’re missing context. the photos should hopefully help see the progression as well (if i can get those uploaded…) i leave you with 3 photos: the state of the robot right before i turned it off for the last time, the absolute state of our whiteboard after we used for brainstorming, and a last minute photo of the hallway i knew i would never walk again. happy hack clubbing!...
|
1792752594.3365576
|
1793357394.3365576
|
|
12178
|
Reclaim - A 3D extraction tower defence by @andrew Reclaim - A 3D extraction tower defence by @andrewp_silker | Stardance...
|
andrewp_silker
|
0
|
174.24
|
0
|
[]
|
[{"post_id": 76367, "ts": "202 [{"post_id": 76367, "ts": "2026-10-03T10:01:44Z", "hours": 4.7403, "text": "Devlog 🐟 (its str(2) + str(2)) Hope you all are having wonderful time making cool stuff we dont got long till the end of Stardance. Thing 1 added a top down building mode to make building easier or im just to lazy to add council auth values. Comes with cool 2D shader Thing 2 finilized how the council auth upgrades work they start at 0 then go up. need to all all the values for other authorisatoin levels apart from ship tier. Thing 3 SHIPING ON THE 17TH of oct."}, {"post_id": 75517, "ts": "2026-09-30T10:39:00Z", "hours": 7.2031, "text": "# Devlog #whats 9 + 10? DID HE SHIP. NO HE DIDN’T. What is he doing he dosn’t even know (i do). i know i said id ship but like its not ready… sorry THIS is a promise I WILL SHIP AFTER TUTORAL IS DONE. please stay everyone : P Thing 1 95% implementation of council auth Thing 2 fixed alot of scripts using my custom made script fix skill. its a skill that checks code for conventions, bugs, formatting issues and fixes them**. Purely used as a debugging tool and i will change my project information. Thing 3 Re designed turret and base placement to use one mode and not multiple as it confuses people. Cool Thing if you want to play test comment “GIVE IT TO ME :]” Also this project is now going to be assisted by ai as my school assignment is over and I need to get it done as well as keep my code robust though I dont have the time to read and consider my code in abstract ways."}, {"post_id": 73071, "ts": "2026-09-24T10:05:44Z", "hours": 10.7569, "text": "Devlog #20 Sup everyone hope you are a buku buku and not the other. There have been some interesting changes. Thing one Persistent storage fully works saving settings stored items and other important game values. Thing TWO COUNCIL AUTHORISATION This has taken way to long to get done. designed the full UI and made some icons images below. IM GOING TO SHIP 160 hours : ). Making assets also takes a long time and other stuff so i probably have at least 200."}, {"post_id": 69553, "ts": "2026-09-17T09:33:29Z", "hours": 6.3356, "text": "Dev log #19 EXAM MOCKS ARE OVER : ) Almost done with the pause menu. I’m going to ship this Saturday I swear. Completely changed the camera system to account for double axis collision with spring arms with lerping (not larping) the camera position to markers for smooth camera movement. I need to lock in now how about you?"}, {"post_id": 61401, "ts": "2026-09-04T09:14:54Z", "hours": 6.3886, "text": "Devlog #18 I am so back we are locked in everyone that in reading this WE are locked in. Brand new queueing system, full remote island enemy spawning pattern. ZERO balencing there are still a lot of issues but expect me to put in a lot of hours when im suppose to be studying for exams Love you all and the song im listening to right now is “Better Off Alone - Mckyyy” Thing 2 Major refactor to the building logic because I was just looking at the build_handeling function and it was like 140 lines so i put it into a bunch of helper functions. My OCD/perfectionism goes hard. like m… calm down i don’t know why I am literally. Thing 3 Yea I know i said I’d ship b4 but i need to get the council authorization done hopefully in the next week. GG all I am feeling unnecessary ecstatic bout to do a front lever."}, {"post_id": 58518, "ts": "2026-08-30T23:08:28Z", "hours": 15.7625, "text": "Devlog #17 Small changes to the wave mechanics, new recipe pinning, starting to work on tutorial"}, {"post_id": 45672, "ts": "2026-08-12T09:49:11Z", "hours": 8.3053, "text": "devlog #16 Completely changed spawning mechanics to be extremely customizable, added pickup notifications in the bottom right, added 4 other types of enemies. next work on Wave/Run ui and Tutorial and council authorization. also played around with some ai generated textures. all code is written by me not assets."}, {"post_id": 43867, "ts": "2026-08-09T09:56:31Z", "hours": 2.6447, "text": "Devlog #15 Just push a playable ish version to the itch page please brutally critque it in the comment section if you are bothered. then after i pushed it made alot of the item assets. tweaked some spawning and then pushed it back to itch. I will ship this MVP and start a new project. did hella bug fix’s and code robustness (is that even a word) What you can do walk around, shoot enemies, craft, extract, build up ship storage, access all craftable items in the game What you can’t do the game dosn’t save or load any persistant data but there will be in the future, drop down to the sector with ship resources. Future plans Add saveing and loading, deploy UI, Tutorial, Council Authroisatoin (persistant upgrades), modules, revamp enemy spawning logic, and more here is the itch link https://silverkeybord.itch.io/reclaim tutorial drop down to the sector, kill enemies, get one plate, craft 2 basic material, craft one single turret then get more."}, {"post_id": 42558, "ts": "2026-08-07T11:42:37Z", "hours": 16.1831, "text": "Devlog 13, 14# omg i forgot to post devlog 13 so this is kinda both. a lot of polishing done to gameplay and implementing animations to make the game more fun. making it easier to start with lower enemy health. shield fix’s, extraction preset are fully working and items are now taken back to the ship. just a little more balencing and ill have a playable base game posted on itch for devlog 15# wooo. not bothered to record a video of the animations in this devlog here is a screen shot though"}, {"post_id": 38804, "ts": "2026-08-01T11:20:55Z", "hours": 9.675, "text": "Devlog #12 – Extraction UI mostly implemented just need to work on the preset buttons. but it looks really nice. the sector shield got a shader and the extraction UI animation works. somthing is currenly broken. planning to have a fully working mvp by next week should be able to ship : )."}, {"post_id": 36921, "ts": "2026-07-29T10:06:11Z", "hours": 3.6575, "text": "Devlog #11. i dont know how to write on new lines when i press enter it dosn’t do anything so thats why this is all on one line can somone tell me how to format these post thanks. working on extraction ui. just added the changing colors to the extraction limit bar in the middle the left screen shot is in figma and then i put it into godot. i probably have like 4 hours of planning and iterating on the design of the extraction UI so thats why this dev log only has 3 hours. idk what im typing so yea. have a nice day."}, {"post_id": 33688, "ts": "2026-07-23T20:14:01Z", "hours": 8.4569, "text": "Devlog - 10# I have been working on polishing up the code making it a lot more robust. added shield, health, changed crafting ui to be less cluttered, an amazing looking health bar that works, forced extraction and damage numbers."}, {"post_id": 31141, "ts": "2026-07-19T09:46:12Z", "hours": 4.0261, "text": "DEVLOG #9 – Shield added, shield health added and the building selectoin is finally fully working took me way to long. need to lock in on this project bc i dont got that much time. this is like dev long 9???"}, {"post_id": 30061, "ts": "2026-07-17T10:37:54Z", "hours": 7.5172, "text": "Global scrip refactor new Helperfunctions scrips with static functions. polishing the build selectoin UI not finished but its going not smoothly taking way to long i need to lock in bc this is killing me"}, {"post_id": 26941, "ts": "2026-07-12T00:55:28Z", "hours": 10.3906, "text": "made the scrolling selection for changing builds, some optimizations, added another turret, critical damage, and build plate foundations"}, {"post_id": 19915, "ts": "2026-07-01T10:59:42Z", "hours": 16.7642, "text": "Crafting is fully working now working on polishing the item tips, extraction/deploying limits, Build selection and better visibility of system status. Feed back on the UI would be greatly appreciated"}, {"post_id": 15577, "ts": "2026-06-25T10:31:47Z", "hours": 5.7419, "text": "crafting system is 80% complete just need to call a check for all inventory slots and requirements for when something is crafted."}, {"post_id": 14978, "ts": "2026-06-24T10:11:05Z", "hours": 11.9461, "text": "creating a inventory, crafting, and implementing sounds took way to long. I ain’t explaining all my code it took 12 hours"}, {"post_id": 12461, "ts": "2026-06-20T10:51:07Z", "hours": 7.4831, "text": "refactored drops, did like 3 hours of planning game lore, drops reasons, market logic, fleshed out all future drops, started designing crafting system."}, {"post_id": 9087, "ts": "2026-06-15T05:51:37Z", "hours": 9.3872, "text": "fixed some bugs and improved structure for future development. starting to work on inventory, sounds, and basic modles."}, {"post_id": 4729, "ts": "2026-06-08T05:14:51Z", "hours": 0.8747, "text": "finished basic prototyping and MVP components"}]...
|
Title: Reclaim - A 3D extraction tower defence by Title: Reclaim - A 3D extraction tower defence by @andrewp_silker | Stardance
Devlogs:
finished basic prototyping and MVP components
fixed some bugs and improved structure for future development. starting to work on inventory, sounds, and basic modles.
refactored drops, did like 3 hours of planning game lore, drops reasons, market logic, fleshed out all future drops, started designing crafting system.
creating a inventory, crafting, and implementing sounds took way to long. I ain’t explaining all my code it took 12 hours
crafting system is 80% complete just need to call a check for all inventory slots and requirements for when something is crafted.
Crafting is fully working now working on polishing the item tips, extraction/deploying limits, Build selection and better visibility of system status. Feed back on the UI would be greatly appreciated
made the scrolling selection for changing builds, some optimizations, added another turret, critical damage, and build plate foundations
Global scrip refactor new Helperfunctions scrips with static functions. polishing the build selectoin UI not finished but its going not smoothly taking way to long i need to lock in bc this is killing me
DEVLOG #9 – Shield added, shield health added and the building selectoin is finally fully working took me way to long. need to lock in on this project bc i dont got that much time. this is like dev long 9???
Devlog - 10# I have been working on polishing up the code making it a lot more robust. added shield, health, changed crafting ui to be less cluttered, an amazing looking health bar that works, forced extraction and damage numbers.
Devlog #11. i dont know how to write on new lines when i press enter it dosn’t do anything so thats why this is all on one line can somone tell me how to format these post thanks. working on extraction ui. just added the changing colors to the extraction limit bar in the middle the left screen shot is in figma and then i put it into godot. i probably have like 4 hours of planning and iterating on the design of the extraction UI so thats why this dev log only has 3 hours. idk what im typing so yea. have a nice day.
Devlog #12 – Extraction UI mostly implemented just need to work on the preset buttons. but it looks really nice. the sector shield got a shader and the extraction UI animation works. somthing is currenly broken. planning to have a fully working mvp by next week should be able to ship : ).
Devlog 13, 14# omg i forgot to post devlog 13 so this is kinda both. a lot of polishing done to gameplay and implementing animations to make the game more fun. making it easier to start with lower enemy health. shield fix’s, extraction preset are fully working and items are now taken back to the ship. just a little more balencing and ill have a playable base game posted on itch for devlog 15# wooo. not bothered to record a video of the animations in this devlog here is a screen shot though
Devlog #15 Just push a playable ish version to the itch page please brutally critque it in the comment section if you are bothered. then after i pushed it made alot of the item assets. tweaked some spawning and then pushed it back to itch. I will ship this MVP and start a new project. did hella bug fix’s and code robustness (is that even a word) What you can do walk around, shoot enemies, craft, extract, build up ship storage, access all craftable items in the game What you can’t do the game dosn’t save or load any persistant data but there will be in the future, drop down to the sector with ship resources. Future plans Add saveing and loading, deploy UI, Tutorial, Council Authroisatoin (persistant upgrades), modules, revamp enemy spawning logic, and more here is the itch link https://silverkeybord.itch.io/reclaim tutorial drop down to the sector, kill enemies, get one plate, craft 2 basic material, craft one single turret then get more.
devlog #16 Completely changed spawning mechanics to be extremely customizable, added pickup notifications in the bottom right, added 4 other types of enemies. next work on Wave/Run ui and Tutorial and council authorization. also played around with some ai generated textures. all code is written by me not assets.
Devlog #17 Small changes to the wave mechanics, new recipe pinning, starting to work on tutorial
Devlog #18 I am so back we are locked in everyone that in reading this WE are locked in. Brand new queueing system, full remote island enemy spawning pattern. ZERO balencing there are still a lot of issues but expect me to put in a lot of hours when im suppose to be studying for exams Love you all and the song im listening to right now is “Better Off Alone - Mckyyy” Thing 2 Major refactor to the building logic because I was just looking at the build_handeling function and it was like 140 lines so i put it into a bunch of helper functions. My OCD/perfectionism goes hard. like m… calm down i don’t know why I am literally. Thing 3 Yea I know i said I’d ship b4 but i need to get the council authorization done hopefully in the next week. GG all I am feeling unnecessary ecstatic bout to do a front lever.
Dev log #19 EXAM MOCKS ARE OVER : ) Almost done with the pause menu. I’m going to ship this Saturday I swear. Completely changed the camera system to account for double axis collision with spring arms with lerping (not larping) the camera position to markers for smooth camera movement. I need to lock in now how about you?
Devlog #20 Sup everyone hope you are a buku buku and not the other. There have been some interesting changes. Thing one Persistent storage fully works saving settings stored items and other important game values. Thing TWO COUNCIL AUTHORISATION This has taken way to long to get done. designed the full UI and made some icons images below. IM GOING TO SHIP 160 hours : ). Making assets also takes a long time and other stuff so i probably have at least 200.
# Devlog #whats 9 + 10? DID HE SHIP. NO HE DIDN’T. What is he doing he dosn’t even know (i do). i know i said id ship but like its not ready… sorry THIS is a promise I WILL SHIP AFTER TUTORAL IS DONE. please stay everyone : P Thing 1 95% implementation of council auth Thing 2 fixed alot of scripts using my custom made script fix skill. its a skill that checks code for conventions, bugs, formatting issues and fixes them**. Purely used as a debugging tool and i will change my project information. Thing 3 Re designed turret and base placement to use one mode and not multiple as it confuses people. Cool Thing if you want to play test comment “GIVE IT TO ME :]” Also this project is now going to be assisted by ai as my school assignment is over and I need to get it done as well as keep my code robust though I dont have the time to read and consider my code in abstract ways.
Devlog 🐟 (its str(2) + str(2)) Hope you all are having wonderful time making cool stuff we dont got long till the end of Stardance. Thing 1 added a top down building mode to make building easier or im just to lazy to add council auth values. Comes with cool 2D shader Thing 2 finilized how the council auth upgrades work they start at 0 then go up. need to all all the values for other authorisatoin levels apart from ship tier. Thing 3 SHIPING ON THE 17TH of oct....
|
1792702083.5406353
|
1793306883.5406353
|
|
3602
|
3d gdot fps game by @jonathanwillner | Stardance
|
jonathanwillner
|
2
|
175.0
|
676
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-16T19:46:46Z", "hours": 36.0, "multiplier": 4.42, "payout": 81, "blessing": "cursed", "text": "Its a 3d fps made in Godot with a level that has interactable ncps because i lost the plot . It was fairly challenging since i have never used Godot but I’m proud of it. Even if there were times where this project made me want to yeet my computer out the second story window of my house and then follow after it but it was \"fun\" and \"rewording\" to get it work I hope you enjoy", "repo": "https://github.com/jonwill12/3d-hackclub-game", "demo": "https://jonwill12.itch.io/hackclub3dgame"}, {"ship_num": 2, "ts": "2026-06-17T15:18:07Z", "hours": 139.0, "multiplier": 7.24, "payout": 595, "blessing": "neutral", "text": "Its a 3d fps in godot it was fairly challenging since iv never used godot but I’m somewhat proud of it", "repo": "https://github.com/jonwill12/3d-hackclub-game", "demo": "https://jonwill12.itch.io/hackclub3dgame"}]...
|
[{"post_id": 29693, "ts": "202 [{"post_id": 29693, "ts": "2026-07-16T19:35:42Z", "hours": 6.0, "text": "i worked on getting the death and health system working cus thay broke agian than i adden the new level to the level select and fixed some bugs"}, {"post_id": 27389, "ts": "2026-07-12T22:22:55Z", "hours": 7.0, "text": "Dev Log: Fixing NPC Door Navigation IssueProblemWhile testing the new NPC AI system, I noticed that enemies were able to find the correct path using the NavigationAgent3D, but they would get stuck when trying to walk through doors.The NPC was not failing to find a path. The navigation debug showed:Navigation map was readyPath count was validThe NPC had a target positionThis meant the problem was not with the NavigationAgent3D or the navigation mesh.InvestigationI tested multiple possible causes:Rebuilt the navigation meshChecked NavigationAgent3D settingsChecked the NPC movement codeChecked collision sizesChecked the NPC pathingAfter debugging, I found that the issue was caused by collision layers.The NPC and the door were using the same collision layer, causing the NPC’s collision body to interfere with the door collision. The navigation system could see a valid path through the door, but the physics engine was stopping the NPC from moving through it.SolutionI separated the collision layers so the NPC and the door no longer incorrectly blocked each other.After changing the collision settings:NPCs could correctly enter and leave housesNavigation paths continued workingDoors no longer trapped enemiesMultiple NPCs could navigate the level correctlyNew Level ProgressI the Current AI Features The NPC system now includes: NavigationAgent3D pathfinding Enemy chasing and a behavior Anger system based on player messages that NPC can respond to in the chat UIMultiple NPC support with name targeting i agian cant uplode a video"}, {"post_id": 26292, "ts": "2026-07-11T00:27:50Z", "hours": 8.0, "text": "devlog Building the Next Level Today I made more progresson the game by adding a new AI npc and started working on a brand-new level. First,I fixed several bugs with command handling and NPC responses, Then I startedbuilding the new level for the game and began creating and placing some simplehouses around the map to make the environment feel more realistic. Then I plannedout where the NPCs and points of interest will be located inside and around thehouses. The Next Step is to Finish building the houses and add moreenvironmental details, create interiors so players can explore inside thebuildings, and add the NPCs so they can interact with the player as well as continuingto improve the AI so the npcs react naturally to what the player says and does,and keep testing and fixing bugs as development continues. and AI Improvements & New Dialogue System witch was focused on improving the AI and laying the groundwork for more immersive NPC interactions. AI Improvements Continued working on the enemy AI that reacts to what the player says. Improved the NPC anger system and fixed navmesh i can only add one video tho"}, {"post_id": 24290, "ts": "2026-07-07T19:16:19Z", "hours": 0.0, "text": "i have given up on getting the stt to work cause the auido godot outputs is to hard for stt models to understand so im just going to do a text box"}, {"post_id": 23581, "ts": "2026-07-06T16:53:27Z", "hours": 2.0, "text": "i cant do a video because it will casue a feedback loop Today I finally got a working voice-controlled AI system inside my Godot project. The goal was to let the player speak naturally to NPCs and have the game react in real time. First I set up a full voice pipeline: with a Microphone input capture inside Godot Real-time voice detection using audio thresholds Automatic recording when the player starts speaking Silence detection to stop recording Exporting audio chunks as .wav files Sending audio to Whisper (whisper.cpp) locally Receiving transcribed text for game logic This allows players to literally talk to the game than i added the audio improvements At first, the audio was messy and hard for Whisper to understand. The main issues were Muddy frequencies, Missing clarity in speech , and Some words being cut off at the start To fix this, I added audio processing directly in Godot: using a Compressor to balanced loud/quiet parts of speech and a band-Pass Filter to removed low rumble + high noise and Improve microphone sensitivity tuning. After these changes, the speech became much cleaner and Whisper started producing more accurate transcriptions."}, {"post_id": 23033, "ts": "2026-07-05T19:25:46Z", "hours": 2.0, "text": "made jumping work smother and am starting on ai thingy that when you say something reacts to what you said so if you say something mean it attacts and you can give it camands like go over thare or get me that item ect"}, {"post_id": 22404, "ts": "2026-07-04T21:24:43Z", "hours": 3.0, "text": "the game isnt as laggy as it lookes in the video my wifi is just buns Today I revamped my enemy’s navigation system and got the NavAgent working properly again after a lot of debugging. Before this update, the enemies would either get stuck on walls or fail to properly detect paths, which made the AI feel broken and inconsistent during gameplay. The main issue came from how the that i wasn’t using a NavigationAgent3D and instead just making the enemy go to the player one issue i ran into was how velocity was handled in the enemy movement code. Once I corrected the movement logic to properly use get_next_path_position () and only apply navigation to the X/Z axis while keeping gravity separate and added the floor walls and barrel nodes to the nav region the enemies started moving smoothly again and actually path around obstacles instead of bumping into them. After fixing the movement system, I also cleaned up the enemy AI script to make it more stable. The enemy now: Finds the player using groups Uses NavigationAgent3D to calculate paths Chases the player correctly around walls Maintains gravity properly while moving Attacks when close to the player This made the enemy feel way more alive and less “robotic,” since it can now properly navigate the level instead of just walking into geometry. Overall, this was a big improvement to the AI system and a solid step toward making the enemies feel more intelligent and fun to fight. I also fixed an issue where if you were touching the enemy and shot it you would get damaged and not the enemy."}, {"post_id": 21878, "ts": "2026-07-04T01:40:33Z", "hours": 5.0, "text": "also it was 2 hours and 50 minets idk why it says 5 hours and 55 minutes it may have been something else as well. This update was all about adding the fps arms and getting them to work in my game Aswell as redoing the player health and death systems. I had to redo the health system, so I made it into a more proper system that tracks the player’s health and detects when it reaches zero. Once the player’s healthreaches zero, they die, and the game displays the dedicated death screen instead of just leaving the player in the world. Getting this working was notas simple as I expected. I ran into several issues while connecting the player script to the death screen. At first, Godot could not find the custom health class because I had the wrong type name. After fixing that, I ran into errors where the death screen function expected different arguments than I was providing. Later, I hit another problem where the game tried to call the deathscreen on a null instance because the node reference was not set correctly. Each error pointed me toward another part of the system that needed attention. Once I fixed the node references and cleaned up the function calls, the deathscreen finally appeared correctly when the player’s health reached zero. Although it took several debugging sessions with chat gpt I know I used ai sue me I had no idea what I was doing and now I kind of know what I am doing, I nowhave a much more reliable player death system. my recodeing software dosnt recod the game aprently i cant add video"}, {"post_id": 10658, "ts": "2026-06-17T14:53:44Z", "hours": 1.0, "text": "finished fixing it made it ready to ship"}, {"post_id": 10389, "ts": "2026-06-17T02:16:51Z", "hours": 5.0, "text": "i added the tutorial, made the level select work as well as added the finishing touches to the game, because I’m taking a break because this game is bad for my mental and physical health. I haven’t slept in 5 days and I haven’t had a good sleep in 2 weeks, not because of the game, but it’s not helping"}, {"post_id": 9293, "ts": "2026-06-15T16:42:06Z", "hours": 15.0, "text": "At first, I created a UI using standard Button nodes and tried to assign images using level data. However, I ran into multiple issues where: • Images were not appearing at all • Buttons were scaling too large inside the GridContainer • Size settings like custom_minimum_size were being ignored • Some invalid properties (like icon_max_width) caused errors After debugging, I found that I could overrides manual sizing along size flags are properly configured. Now the level select system successfully generates buttons dynamically from an array of level data, including: • Level name • Level image icon • Locked/unlocked state • Scene loading when clicked and made a new level"}, {"post_id": 8992, "ts": "2026-06-15T00:00:02Z", "hours": 5.0, "text": "working on finishing touches and my hack time broke yaaaaaaaa"}, {"post_id": 8504, "ts": "2026-06-14T04:16:19Z", "hours": 37.0, "text": "i loki forgot to make a devlog yesterday i fixed the guns had a midlife crisis about whare i want to go with the game next added objectives and recoded the enimy and player and now im going to take a nap"}, {"post_id": 6953, "ts": "2026-06-11T17:42:07Z", "hours": 13.0, "text": "made new light system added FPS multiplayer template multIplayer and they’re back no oh god noooooooooooooooooooooooooooooooooooo not again"}, {"post_id": 5906, "ts": "2026-06-09T21:39:21Z", "hours": 16.0, "text": "made animation for enemy and rewrote entire code because gdot decided it wanted me to"}, {"post_id": 4961, "ts": "2026-06-08T16:30:38Z", "hours": 17.0, "text": "i fixed the guns and the enemy cus he stoped working"}, {"post_id": 4453, "ts": "2026-06-07T19:35:09Z", "hours": 1.0, "text": "trying to fix what ever the fuck this shit is no luck so far"}, {"post_id": 3911, "ts": "2026-06-07T00:51:38Z", "hours": 1.0, "text": "lo key i give up"}, {"post_id": 3871, "ts": "2026-06-06T23:12:55Z", "hours": 2.0, "text": "added guns and death"}, {"post_id": 3667, "ts": "2026-06-06T18:26:28Z", "hours": 17.0, "text": "game got corrupted had to start over :("}, {"post_id": 1778, "ts": "2026-06-03T23:43:28Z", "hours": 2.0, "text": "adding enemy"}, {"post_id": 1113, "ts": "2026-06-02T22:51:41Z", "hours": 1.0, "text": "learning gdot"}]...
|
Title: 3d gdot fps game by @jonathanwillner | Star Title: 3d gdot fps game by @jonathanwillner | Stardance
Devlogs:
learning gdot
adding enemy
game got corrupted had to start over :(
added guns and death
lo key i give up
trying to fix what ever the fuck this shit is no luck so far
i fixed the guns and the enemy cus he stoped working
made animation for enemy and rewrote entire code because gdot decided it wanted me to
made new light system added FPS multiplayer template multIplayer and they’re back no oh god noooooooooooooooooooooooooooooooooooo not again
i loki forgot to make a devlog yesterday i fixed the guns had a midlife crisis about whare i want to go with the game next added objectives and recoded the enimy and player and now im going to take a nap
working on finishing touches and my hack time broke yaaaaaaaa
At first, I created a UI using standard Button nodes and tried to assign images using level data. However, I ran into multiple issues where: • Images were not appearing at all • Buttons were scaling too large inside the GridContainer • Size settings like custom_minimum_size were being ignored • Some invalid properties (like icon_max_width) caused errors After debugging, I found that I could overrides manual sizing along size flags are properly configured. Now the level select system successfully generates buttons dynamically from an array of level data, including: • Level name • Level image icon • Locked/unlocked state • Scene loading when clicked and made a new level
i added the tutorial, made the level select work as well as added the finishing touches to the game, because I’m taking a break because this game is bad for my mental and physical health. I haven’t slept in 5 days and I haven’t had a good sleep in 2 weeks, not because of the game, but it’s not helping
finished fixing it made it ready to ship
also it was 2 hours and 50 minets idk why it says 5 hours and 55 minutes it may have been something else as well. This update was all about adding the fps arms and getting them to work in my game Aswell as redoing the player health and death systems. I had to redo the health system, so I made it into a more proper system that tracks the player’s health and detects when it reaches zero. Once the player’s healthreaches zero, they die, and the game displays the dedicated death screen instead of just leaving the player in the world. Getting this working was notas simple as I expected. I ran into several issues while connecting the player script to the death screen. At first, Godot could not find the custom health class because I had the wrong type name. After fixing that, I ran into errors where the death screen function expected different arguments than I was providing. Later, I hit another problem where the game tried to call the deathscreen on a null instance because the node reference was not set correctly. Each error pointed me toward another part of the system that needed attention. Once I fixed the node references and cleaned up the function calls, the deathscreen finally appeared correctly when the player’s health reached zero. Although it took several debugging sessions with chat gpt I know I used ai sue me I had no idea what I was doing and now I kind of know what I am doing, I nowhave a much more reliable player death system. my recodeing software dosnt recod the game aprently i cant add video
the game isnt as laggy as it lookes in the video my wifi is just buns Today I revamped my enemy’s navigation system and got the NavAgent working properly again after a lot of debugging. Before this update, the enemies would either get stuck on walls or fail to properly detect paths, which made the AI feel broken and inconsistent during gameplay. The main issue came from how the that i wasn’t using a NavigationAgent3D and instead just making the enemy go to the player one issue i ran into was how velocity was handled in the enemy movement code. Once I corrected the movement logic to properly use get_next_path_position () and only apply navigation to the X/Z axis while keeping gravity separate and added the floor walls and barrel nodes to the nav region the enemies started moving smoothly again and actually path around obstacles instead of bumping into them. After fixing the movement system, I also cleaned up the enemy AI script to make it more stable. The enemy now: Finds the player using groups Uses NavigationAgent3D to calculate paths Chases the player correctly around walls Maintains gravity properly while moving Attacks when close to the player This made the enemy feel way more alive and less “robotic,” since it can now properly navigate the level instead of just walking into geometry. Overall, this was a big improvement to the AI system and a solid step toward making the enemies feel more intelligent and fun to fight. I also fixed an issue where if you were touching the enemy and shot it you would get damaged and not the enemy.
made jumping work smother and am starting on ai thingy that when you say something reacts to what you said so if you say something mean it attacts and you can give it camands like go over thare or get me that item ect
i cant do a video because it will casue a feedback loop Today I finally got a working voice-controlled AI system inside my Godot project. The goal was to let the player speak naturally to NPCs and have the game react in real time. First I set up a full voice pipeline: with a Microphone input capture inside Godot Real-time voice detection using audio thresholds Automatic recording when the player starts speaking Silence detection to stop recording Exporting audio chunks as .wav files Sending audio to Whisper (whisper.cpp) locally Receiving transcribed text for game logic This allows players to literally talk to the game than i added the audio improvements At first, the audio was messy and hard for Whisper to understand. The main issues were Muddy frequencies, Missing clarity in speech , and Some words being cut off at the start To fix this, I added audio processing directly in Godot: using a Compressor to balanced loud/quiet parts of speech and a band-Pass Filter to removed low rumble + high noise and Improve microphone sensitivity tuning. After these changes, the speech became much cleaner and Whisper started producing more accurate transcriptions.
i have given up on getting the stt to work cause the auido godot outputs is to hard for stt models to understand so im just going to do a text box
devlog Building the Next Level Today I made more progresson the game by adding a new AI npc and started working on a brand-new level. First,I fixed several bugs with command handling and NPC responses, Then I startedbuilding the new level for the game and began creating and placing some simplehouses around the map to make the environment feel more realistic. Then I plannedout where the NPCs and points of interest will be located inside and around thehouses. The Next Step is to Finish building the houses and add moreenvironmental details, create interiors so players can explore inside thebuildings, and add the NPCs so they can interact with the player as well as continuingto improve the AI so the npcs react naturally to what the player says and does,and keep testing and fixing bugs as development continues. and AI Improvements & New Dialogue System witch was focused on improving the AI and laying the groundwork for more immersive NPC interactions. AI Improvements Continued working on the enemy AI that reacts to what the player says. Improved the NPC anger system and fixed navmesh i can only add one video tho
Dev Log: Fixing NPC Door Navigation IssueProblemWhile testing the new NPC AI system, I noticed that enemies were able to find the correct path using the NavigationAgent3D, but they would get stuck when trying to walk through doors.The NPC was not failing to find a path. The navigation debug showed:Navigation map was readyPath count was validThe NPC had a target positionThis meant the problem was not with the NavigationAgent3D or the navigation mesh.InvestigationI tested multiple possible causes:Rebuilt the navigation meshChecked NavigationAgent3D settingsChecked the NPC movement codeChecked collision sizesChecked the NPC pathingAfter debugging, I found that the issue was caused by collision layers.The NPC and the door were using the same collision layer, causing the NPC’s collision body to interfere with the door collision. The navigation system could see a valid path through the door, but the physics engine was stopping the NPC from moving through it.SolutionI separated the collision layers so the NPC and the door no longer incorrectly blocked each other.After changing the collision settings:NPCs could correctly enter and leave housesNavigation paths continued workingDoors no longer trapped enemiesMultiple NPCs could navigate the level correctlyNew Level ProgressI the Current AI Features The NPC system now includes: NavigationAgent3D pathfinding Enemy chasing and a behavior Anger system based on player messages that NPC can respond to in the chat UIMultiple NPC support with name targeting i agian cant uplode a video
i worked on getting the death and health system working cus thay broke agian than i adden the new level to the level select and fixed some bugs
Ships:
Its a 3d fps in godot it was fairly challenging since iv never used godot but I’m somewhat proud of it
Its a 3d fps made in Godot with a level that has interactable ncps because i lost the plot . It was fairly challenging since i have never used Godot but I’m proud of it. Even if there were times where this project made me want to yeet my computer out the second story window of my house and then follow after it but it was "fun" and "rewording" to get it work I hope you enjoy...
|
1792878850.189505
|
1793742850.189505
|
|
12747
|
Hack-A-Gent by @to_aarav_g | Stardance
|
to_aarav_g
|
1
|
177.01
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-29T13:09:15Z", "hours": 141.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What did you make? Hack-A-Gent — an AI coding agent that can plan, write, test and fix code for a hackathon project. What was challenging? Getting the agent to fix its own mistakes without breaking existing code. Cross-file dependencies and keeping shared code safe were probably the hardest parts. What are you proud of? I got it to go beyond just generating code and actually test and repair what it creates. How do I run it? Clone the repo, run npm install , create a .env with your Gemini API key, then run npm run dev . Start with a small coding task and let the agent work through it.", "repo": "https://github.com/Theuser1211/Hack-A-Gent", "demo": "https://github.com/Theuser1211/Hack-A-Gent/releases/"}]...
|
[{"post_id": 77987, "ts": "202 [{"post_id": 77987, "ts": "2026-10-09T03:55:17Z", "hours": 3.6219, "text": "Greeting! I have made 1 bid decision and ported the whole hag to python scipt using external libraries instead of building every agent myself. But for this we need gemini-cli configured with a paid account(which I dont have!). Sad, but I am happy rest all of hag works without any issues"}, {"post_id": 76687, "ts": "2026-10-04T10:37:59Z", "hours": 3.055, "text": "Got 208/208 tests to pass. Also I have implemented the providor for LLM as Gemini(Primary) -> Openrouter -> NVIDIA. So that maximum success rates can be achived. Also for anyone to test out HAG, just use README.md from github to install HAG, then setup up your API keys in the .env (don’t worry it’s all local), and you are ready to go."}, {"post_id": 76124, "ts": "2026-10-02T12:50:50Z", "hours": 3.5364, "text": "Heyyy, I have updated my README.md and also fixed my failing tests by now. I guess I am ready to ship Hack-A-Gent for Ship#1"}, {"post_id": 75504, "ts": "2026-09-30T09:17:25Z", "hours": 25.7925, "text": "I have realised that using NVIDIA NIMS is the issue, my app is almost working. , but the providors is failing at this point. I will try using gemini and openrouter to chek if it will work or not. I guess I will not be able to. And I also need to update my README.md for some reason it looks like AI written, I will write it in a funny way now."}, {"post_id": 72689, "ts": "2026-09-23T14:43:47Z", "hours": 20.6364, "text": "Fixed a pretty annoying bug today. HAG can now actually reach Nemotron during auto-repair after NVIDIA 503s. One step closer to a full successful run."}, {"post_id": 42039, "ts": "2026-08-06T16:28:40Z", "hours": 8.8503, "text": "Major progress today! I completed the Phase 1 stabilization of Hack-A-Gent by resolving all remaining test and build issues (1721/1721 tests passing, clean TypeScript build). I also performed a deep forensic investigation into the AI generation pipeline and discovered a critical issue where the router was rejecting recoverable LLM responses before they reached the JSON extraction layer. With the core architecture now stable, the focus shifts to eliminating unnecessary template fallbacks and improving the quality of AI-generated hackathon projects."}, {"post_id": 41361, "ts": "2026-08-05T15:03:39Z", "hours": 13.7719, "text": "Today’s work focused on stabilizing Hack-A-Gent for a production-ready release. I fixed the Improvement Pass so it now completes the full critique -> patch -> build -> judge cycle with measurable score improvements, strengthened template fallback generation with complete project scaffolding and improved styling, added automatic generation of deployment assets like LICENSE and vercel.json, and implemented comprehensive child-process lifecycle management to ensure the CLI exits cleanly after execution. I also streamlined the interview flow by removing unnecessary prompts, improved validation, and verified the project with a clean TypeScript build and extensive unit and feature test coverage."}, {"post_id": 39997, "ts": "2026-08-03T10:51:49Z", "hours": 8.8792, "text": "This is session I added a better parser so I get almost 99% accuracy and also made many improvements in the code generation. Almost done and drained out from all this"}, {"post_id": 39011, "ts": "2026-08-01T17:39:57Z", "hours": 14.4528, "text": "Spent this session improving Hack-A-Gent’s reliability and generation pipeline. Fixed a major architectural issue where generated apps were being overwritten by fallback templates, allowing AI-generated pages to be preserved correctly. Also resolved several runtime and build issues, improved validation, and verified the full pipeline by generating, building, and running a real hackathon project successfully. The next focus is improving project quality so the generated apps are more original, context-aware, and competitive in real hackathons."}, {"post_id": 35101, "ts": "2026-07-26T09:58:01Z", "hours": 11.1589, "text": "Today was mostly about making Hack-A-Gent more reliable instead of adding new features. I finally tracked down a long-standing parser issue that turned out to be an architectural problem: the CLI and the analysis pipeline were using two completely different parsers. I merged everything into a single parser, updated the production build to include it, and verified that all parser regression tests and the full test suite still pass. After that, I confirmed the CLI now extracts real judging criteria like Impact and Innovation instead of mistakenly treating navigation links as judging criteria. With parsing in a much better place, I shifted focus toward hardening the overall pipeline by planning phased reliability work around generation, auto-repair, validation, and recovery so the goal is no longer just generating code, but consistently producing projects that typecheck, build, run, and are ready for submission."}, {"post_id": 33322, "ts": "2026-07-23T04:04:01Z", "hours": 8.9597, "text": "This week I focused on making Hack-A-Gent stable and release-ready instead of adding new features. I cleaned up dead code, removed unused files, improved CLI logging and error messages, and verified the project with a full build and test pass. The CLI now parses real hackathon pages, plans projects, and gracefully falls back when AI providers are unavailable. I also ran end-to-end tests on real hackathon URLs to identify the final issues before release. The remaining work is improving template fallback and validation so every generated project is immediately usable, bringing Hack-A-Gent closer to its first stable release."}, {"post_id": 27158, "ts": "2026-07-12T13:41:30Z", "hours": 6.4664, "text": "Might be on final stages, making sure the agent doesn’t blows up in users hands. Taking time but needs to be done, Hope I can ship it by this week"}, {"post_id": 26029, "ts": "2026-07-10T16:39:54Z", "hours": 22.7653, "text": "Spent today improving Hack-A-Gent’s long-term direction instead of just fixing bugs. I mapped out a roadmap to turn it into a real Devpost hackathon agent, including a hackathon qualification engine, real Devpost benchmark suite, autonomous repair loop, browser validation, and organizational learning. Also audited the current architecture to identify what already exists, what needs refactoring, and what should be built next before writing more code."}, {"post_id": 21958, "ts": "2026-07-04T05:04:47Z", "hours": 25.1944, "text": "Hack-A-Gent I built Hack-A-Gent , a CLI-based AI agent that helps developers turn a Devpost hackathon challenge into a working project in minutes. Simply paste a Devpost competition URL into the terminal, and Hack-A-Gent analyzes the challenge, extracts the judging criteria and submission requirements, plans an appropriate architecture, and generates a production-ready project scaffold. You bring your own LLM API key (Anthropic, OpenAI, Google Gemini, NVIDIA NIMs, Ollama, and more), and Hack-A-Gent orchestrates the rest—from understanding the hackathon prompt to generating code, documentation, and a submission-ready starting point. The goal isn’t to replace developers, but to eliminate the repetitive setup work so builders can spend more time refining their ideas, polishing their projects, and creating a great demo."}]...
|
Title: Hack-A-Gent by @to_aarav_g | Stardance
Dev Title: Hack-A-Gent by @to_aarav_g | Stardance
Devlogs:
Hack-A-Gent I built Hack-A-Gent , a CLI-based AI agent that helps developers turn a Devpost hackathon challenge into a working project in minutes. Simply paste a Devpost competition URL into the terminal, and Hack-A-Gent analyzes the challenge, extracts the judging criteria and submission requirements, plans an appropriate architecture, and generates a production-ready project scaffold. You bring your own LLM API key (Anthropic, OpenAI, Google Gemini, NVIDIA NIMs, Ollama, and more), and Hack-A-Gent orchestrates the rest—from understanding the hackathon prompt to generating code, documentation, and a submission-ready starting point. The goal isn’t to replace developers, but to eliminate the repetitive setup work so builders can spend more time refining their ideas, polishing their projects, and creating a great demo.
Spent today improving Hack-A-Gent’s long-term direction instead of just fixing bugs. I mapped out a roadmap to turn it into a real Devpost hackathon agent, including a hackathon qualification engine, real Devpost benchmark suite, autonomous repair loop, browser validation, and organizational learning. Also audited the current architecture to identify what already exists, what needs refactoring, and what should be built next before writing more code.
Might be on final stages, making sure the agent doesn’t blows up in users hands. Taking time but needs to be done, Hope I can ship it by this week
This week I focused on making Hack-A-Gent stable and release-ready instead of adding new features. I cleaned up dead code, removed unused files, improved CLI logging and error messages, and verified the project with a full build and test pass. The CLI now parses real hackathon pages, plans projects, and gracefully falls back when AI providers are unavailable. I also ran end-to-end tests on real hackathon URLs to identify the final issues before release. The remaining work is improving template fallback and validation so every generated project is immediately usable, bringing Hack-A-Gent closer to its first stable release.
Today was mostly about making Hack-A-Gent more reliable instead of adding new features. I finally tracked down a long-standing parser issue that turned out to be an architectural problem: the CLI and the analysis pipeline were using two completely different parsers. I merged everything into a single parser, updated the production build to include it, and verified that all parser regression tests and the full test suite still pass. After that, I confirmed the CLI now extracts real judging criteria like Impact and Innovation instead of mistakenly treating navigation links as judging criteria. With parsing in a much better place, I shifted focus toward hardening the overall pipeline by planning phased reliability work around generation, auto-repair, validation, and recovery so the goal is no longer just generating code, but consistently producing projects that typecheck, build, run, and are ready for submission.
Spent this session improving Hack-A-Gent’s reliability and generation pipeline. Fixed a major architectural issue where generated apps were being overwritten by fallback templates, allowing AI-generated pages to be preserved correctly. Also resolved several runtime and build issues, improved validation, and verified the full pipeline by generating, building, and running a real hackathon project successfully. The next focus is improving project quality so the generated apps are more original, context-aware, and competitive in real hackathons.
This is session I added a better parser so I get almost 99% accuracy and also made many improvements in the code generation. Almost done and drained out from all this
Today’s work focused on stabilizing Hack-A-Gent for a production-ready release. I fixed the Improvement Pass so it now completes the full critique -> patch -> build -> judge cycle with measurable score improvements, strengthened template fallback generation with complete project scaffolding and improved styling, added automatic generation of deployment assets like LICENSE and vercel.json, and implemented comprehensive child-process lifecycle management to ensure the CLI exits cleanly after execution. I also streamlined the interview flow by removing unnecessary prompts, improved validation, and verified the project with a clean TypeScript build and extensive unit and feature test coverage.
Major progress today! I completed the Phase 1 stabilization of Hack-A-Gent by resolving all remaining test and build issues (1721/1721 tests passing, clean TypeScript build). I also performed a deep forensic investigation into the AI generation pipeline and discovered a critical issue where the router was rejecting recoverable LLM responses before they reached the JSON extraction layer. With the core architecture now stable, the focus shifts to eliminating unnecessary template fallbacks and improving the quality of AI-generated hackathon projects.
Fixed a pretty annoying bug today. HAG can now actually reach Nemotron during auto-repair after NVIDIA 503s. One step closer to a full successful run.
I have realised that using NVIDIA NIMS is the issue, my app is almost working. , but the providors is failing at this point. I will try using gemini and openrouter to chek if it will work or not. I guess I will not be able to. And I also need to update my README.md for some reason it looks like AI written, I will write it in a funny way now.
Heyyy, I have updated my README.md and also fixed my failing tests by now. I guess I am ready to ship Hack-A-Gent for Ship#1
Got 208/208 tests to pass. Also I have implemented the providor for LLM as Gemini(Primary) -> Openrouter -> NVIDIA. So that maximum success rates can be achived. Also for anyone to test out HAG, just use README.md from github to install HAG, then setup up your API keys in the .env (don’t worry it’s all local), and you are ready to go.
Greeting! I have made 1 bid decision and ported the whole hag to python scipt using external libraries instead of building every agent myself. But for this we need gemini-cli configured with a paid account(which I dont have!). Sad, but I am happy rest all of hag works without any issues
Ships:
What did you make? Hack-A-Gent — an AI coding agent that can plan, write, test and fix code for a hackathon project. What was challenging? Getting the agent to fix its own mistakes without breaking existing code. Cross-file dependencies and keeping shared code safe were probably the hardest parts. What are you proud of? I got it to go beyond just generating code and actually test and repair what it creates. How do I run it? Clone the repo, run npm install , create a .env with your Gemini API key, then run npm run dev . Start with a small coding task and let the agent work through it....
|
1792856879.2042353
|
1792943279.2042353
|
|
15657
|
Telemetry LMU by @Karlito | Stardance
|
Karlito
|
1
|
178.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T18:45:37Z", "hours": 178.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Telemetry LMU An application for both Windows and Linux to visualize the telemetry data from Le Mans Ultimate What it does: This application collects, stores, and visualizes data from a racing simulator called Le Mans Ultimate. The main goal: Allow users to analyze their driving and learn from their data through an easy-to-use interface. The requirements: Performance, nice and simple UI, expandability, minimal setup. Results: Main goal: Achieved. (I wouldn’t be shipping this app otherwise) Performance: On average the app uses 4% of CPU and 250Mb of RAM under full load. That is less RAM usage than running Spotify in the background. Nice and simple UI: This is personal preference, however in my opinion I think i succeeded. Expandability: The architecture of the app is very modular so this also isn’t a problem. Setup: On windows there is none (except installing the app), on linux there is one dependency (this is sadly unavoidable.) Some stats: 200+ hours of development time (including the time before Stardance) 250+ commits 6 000+ lines of Rust", "repo": "https://github.com/Karlito05/TelemetryLMU", "demo": "https://github.com/Karlito05/TelemetryLMU/releases/tag/v1.0.1"}]...
|
[{"post_id": 71364, "ts": "202 [{"post_id": 71364, "ts": "2026-09-20T18:08:56Z", "hours": 1.2894, "text": "Devlog 29 - The end So this is the last one, huh. Here is the full write up on this project as I promised. Chapter 1 - The beginnings This project started about 3 months ago. I started experimenting with just getting the data and plotting it. Just for fun as an exercise to learn rust. Then I realized that there actually isn’t a proper working telemetry tool that works on linux. So I did some research… and I decided that I am going to make the app in Dioxus. Chapter 2 - The Dioxus era This leads us to the shortest of eras. The Dioxus era. Nothing really happened here and quite frankly I don’t even remember it that much. There aren’t really any git commits because I didn’t have that setup yet. One thing i remember tho is that I couldn’t figure out how to draw the garphs, because Dioxus is based on web technologies but weirdly becuase you are writing HTLM like syntax but in rust. And that was the main reason I decided to switch to Tauri. Chapter 3 - The Tauri era At first Tauri was the best framework ever made for me. That is because I already kinda knew react, it was simple to understand and I could really lean into the split frontend and backend architecture. This sadly proved very inefficient for the graph view which needs to render thousands of points each frame. Since it was too much for the basic HTML canvas I have switched to using WebGL with numerous downsampling techniques. This was just a bandaid fix though. I have also ran into bunch of architectural issues with the whole split frontend and backend thing. Accessing the telemetry data proved to be very difficult and inefficient. I remember that I ran each of the graphs on a separate thread. This was so stupid. I don’t even remember how I could’ve come up with such a stupid idea :D. It just led to memory leaks and threads uncontrollably spinning up and not stopping. I am sure that all of that could’ve been easily avoided with simpler architecture but at that point I was at my lowest point of this project, so I didn’t even have the energy to do it. I also had the state of the frontend so fragmented which didn’t help. And the whole retained mode GUI thing just wasn’t well suited for this kind of app. And that is when I decided to do a complete rewrite in pure rust! Chapter 4 - The sweet EGUI I didn’t know it at the time, but this was the best idea on what to do with the project. I remember that I was very split between just shipping it half done and finishing it just because of how bad the development experience with Tauri was (sorry Tauri devs, it’s not a you thing, it’s a me thing). It took about 30h to fully rewrite the app with EGUI, which looking back at it isn’t too bad. It felt like ages though. It didn’t help that almost none of the work in this “chapter” did AI. Which at the end of the day is better! Although my style of writing EGUI code was let’s say original… I have just put everything into one file and that grew very fast :D. I had like 5 files that were about 800 lines each. That has since luckily changed. (I have adopted more of a React style file structure.) Anyway at the end of the rewrite I kinda started loving EGUI and that hasn’t stopped since. I continued to develop the Map page in EASY which was pretty easy. But then I needed the track limits data for the map page. This was a bit of a roadblock… First I have tried to extract the data directly from the game, however this was inaccurate and the track width was missing entirely. So then I tried to download an up to date image of the top down view of the track and extract the inside and outside line from it and match it to the in game data. This partially worked better, still not great tho. So there was only one option left. And that was to painfully drive each layout of each track by hand. This took almost 7h of just driving in circles. After that it was smooth and buggy sailing until the ship. Everyone who read this, have a beautiful day."}, {"post_id": 71172, "ts": "2026-09-20T12:02:04Z", "hours": 7.2817, "text": "Devlog 28 Today is gonna be a big day, because I will ship the project. There is a few things left to do tho. Mainly the readme and the demo video! In my last and next devlog I will also make a write up on the story of the whole project so far. Besides that I have yesterday refactored the whole codebase so now there aren’t just 5 monolithic files. I went for a more react like approach with the structure being divided into pages and components. Sadly there isn’t enough time until the ship to touch up on some old UI and UX problems in the edit view of the graphs, neither is there time to add more fields. This will be done in the near future! Overall I am very happy how the app turned out. But this is not the end of the development this is just the end of the stardance journey!"}, {"post_id": 70125, "ts": "2026-09-18T14:50:07Z", "hours": 4.7625, "text": "Devlog 27 For the past few hours I have been polishing the app up. The main you’ll probably see are the onboarding dialogs. A global one pops up when you first launch the app and then one for each page when you first enter them. Another change I have done is that I made the ghosts on the map page be based on time and not data point index."}, {"post_id": 68694, "ts": "2026-09-15T15:37:09Z", "hours": 9.5181, "text": "Devlog 26 Hiiiii For the past few hours I have been working on polishing the app and get it to a shippable state overall. There is still work left to do, but I am getting there. I have set up a simple packager, and a simple script to use it. It automatically compiles the release version of the app and packages it into a windows installer a Debian .deb package and a pacman package. I have also (after like 2 hours of struggeling with it) added an Icon for the app. So now it looks nice!There has been a lot of new bugfixes as well and the app has been tested by my friend so it should be somwhat usable, tho the setup UX should be improved upon. If you wish you can download the app from here: https://github.com/Karlito05/TelemetryLMU/releases/tag/v0.2.3 Well that is all I have for you all today, so have a nice one :)"}, {"post_id": 66482, "ts": "2026-09-12T10:09:34Z", "hours": 5.3067, "text": "Devlog 25 I know I have just made a devlog like yesterday but holy s*** the track references work so well. They are practically perfect . Besides the references I have also implemented the delta time between the 2 cars! That has really tied the page together. If I can say so myself, we are getting pretty close to the final ship . There is not much needed to implement. The obvious are bugfixes, and some simple onboarding. But really, that’s it! Everyone who is following or caring about this project can expect a ship in the next week or so. In my final devlog I will also do a writeup on this project as a whole, from the coarse beginnings in Dyoxys, trough Tauri, to the sweet home of EGUI. There will also be a trailer video and a demo for all the raters :D Anyway for now you can have this preview of the map page! Stay tuned!"}, {"post_id": 65936, "ts": "2026-09-11T12:33:33Z", "hours": 6.7664, "text": "Devlog 24 HI! All of the time on this devlog was basically just driving in circles. And I mean that. I have recorded all of the outsides and insides of all tracks in the game to get the data for the map page. It was very teidius and very boring. Like very very boring. There are 31 tracks in LMU (including each layout) and on every one of them I had to do an out lap, the ouside, another out lap and the inside. So 4laps for each. That is about 15min per layout. Yeah it was a long one. And the recordings aren’t perfect either! I will now have to somehow process them all to get them ready for the ship. You can watch the timelapses of this process here if you wish. https://lapse.hackclub.com/timelapse/OQcismBwxbBB https://lapse.hackclub.com/timelapse/le3Lta0RxcUA https://lapse.hackclub.com/timelapse/XRf98OimmUk9 Anyway. Have a nice day!"}, {"post_id": 63016, "ts": "2026-09-06T16:07:27Z", "hours": 7.12, "text": "Devlog 23 - More Refactoring Hi! In the past few days I have been making some core architectural changes to the project and I would like to explain them now. Telemetry Provider I have finally decided on how I am gonna handle telemetry in the long term. It’s a pretty simple concept but the implementation is pretty hard. I have one object (the TelemetryProvider struct) that is in charge of getting and managing the telemetry. Right now it logs data from all cars and stores the best, last and current laps. If you wish it can save only your laps or laps of everybody. Each lap is a json file about 500kB - 1MB in size and holds all the data that can be displayed in the app. Notably the position ( so you can load that lap directly into the map page ) and the data displayed by the graphs (so you can load it as a reference there as well.) Pointer to this struct is distributed to pages that need it so they can access it! The provider has a core logging loop that is running on another thread so the whole UI doesn’t have to redraw each time you log new data. (About 60 times a second.) State and Settings Providers Next, I have implemented a StateProvider and an SettingsProvider . These two are basically a drop in replacement of what was stored in the Sidebar and SettingsPage respectively. Difference between the two is that the StateProvider isn’t stored between app restarts. Similarly to how the TelemetryProvider works, each of the pages that need these values get a shared pointer (or an Arc in rust) and can access the values. What’s next Going further I will keep my focus on the map page. Finish it, and then start polishing the app for the final ship! Wish me luck and have a nice day!"}, {"post_id": 61727, "ts": "2026-09-04T19:26:10Z", "hours": 9.5394, "text": "Devlog 22 Hiiiiiiiiiiiii I have some huge news to tell you. I have just made the MOST complex addition yet. And I love it! I have completely overhauled the accessing and managing the telemetry! I have designed a thread safe way to have it run on a separate thread and be accessible from *every place in the app. One unified API for everything! I now store the current lap and the last lap for each of the cars. Tho this takes up a massive 140mb of just floats (in the worst case scenario) I believe its worth the RAM! (Let’s be real, we have saved over 400mb from the tauri implementation so we can now use some of that!) Next I will continue on further implementing these features around the tool. Anyway have a nice day people and bye bye. Some context to that meme: I have a type in my app that is literally Arc<Mutex<[([f64; TelemetryValueType::Max as usize], Option); 104]»"}, {"post_id": 60204, "ts": "2026-09-02T13:06:23Z", "hours": 9.4931, "text": "Devlog 21 For the past few days I have been working on a new feature. The map page. It is turning out great, however it has a lot of bugs. These will get fix over the next few days. I promise :) There have also been changes made to the lap logging system and some other systems as well. As you can see on the image you select 2 saved laps and can crosscompare the lines you drove. Obviously this is completly useless if you loaded 2 different track like I did here. This will get checked for and prohibited in the future. Next I will add the underlying lap overlay which I will somehow extract from the game or from somewhere else. I don’t really know yet. Well that is it for today. Have a great day and bye bye!"}, {"post_id": 57444, "ts": "2026-08-29T16:23:51Z", "hours": 8.955, "text": "Devlog 20 So I have been polishing up the current features a bit and they are far from done. I am starting to question if i will make it to shipping this app one day :D. Anyway I have fixed numerous bugs, added an settings page and implemnted although very crudly a lap logger. But there is still a lot work that needs to be done. I have also added persistancy so the app remembers your choices. I am almost ready to replace the main branch with the fully rusted version, but like I said more work has to be done to go trough with that! I have probably never shown how the Car info page turned out and IMO it did really well. (The empty space is for inputs. That will be implemented soon!)"}, {"post_id": 55542, "ts": "2026-08-27T13:46:52Z", "hours": 8.0039, "text": "Devlog 19 Hello hello! Today I have some exciting news. The rewrite is complete That’s right, after about 30 hours of porting this code from tauri into EGUI it is finally finished! So let’s take a look at some stats, shall we ? | | Tauri | EGUI | |----------------------|-------------|--------------- | | Dev time | 80h | 30h | | Lines of code written | 6k | 3k | | Enjoyability | suboptimal | above average | And some perofrmance stuff as well: | | Tauri | EGUI | |----------------------|-------------|--------------- | | Ram idle | ~700Mb | ~150Mb | | CPU % idle | ~5% | ~5% | | FPS under load | ~29fps | stable 60 | Some other perks also include that EGUI doesn’t need a browser installed on the system to work. Overall I think this was a very successful rewrite! I wouldn’t do it again tho Next I will refactor the code a bit, do a bit off the good ’ol cleanup and then get to work on the map feature."}, {"post_id": 54543, "ts": "2026-08-25T15:54:21Z", "hours": 4.4164, "text": "Devlog 18 - 100h on the project So it’s been a hundred hours huh ? I also can’t believe it! I have also just now finished* the graph view which will be newly called Telemetry (page) Now I will move onto making the car info page previously known as the championship view. I expect this to be very easy!"}, {"post_id": 53875, "ts": "2026-08-24T16:07:03Z", "hours": 6.4811, "text": "Devlog 17 Hello guys. Its me again :D I am continuing to rewrite the UI into egui. I have completed the Graph view’s UI and now I am moving onto implementing it. One thing I have noticed is just how much more “code efficient” egui is. I understand that I didn’t make the logic behind the code yet but even with that I made the same thing with 3k less lines of code. Here is how the layout edit mode is looking for now."}, {"post_id": 51324, "ts": "2026-08-20T22:11:51Z", "hours": 5.83, "text": "Devlog 16 Another 6 hours, another devlog… Hi people. For the last 2 days I took a bit of a break from the project. I have played Approximately up with the boys and it was so fun. Y’all should try the game. It has a free demo 😉 But we are not here to talk about games, are we… I am continuing the implementation of the frontend and its coming along nicely. I’ve just noticed one thing, making the UI itself in egui is kinda slow however the state is very easy. Whilst this not being completely ideal i can push trough that. Since the last devlog, I have finished the implementation of the sidebar, and started working on the telemetry page. I have the graphs sorted and now I am working on the top bar. It’s having a couple of issues at the moment but nothing hard to fix really. I am hopefully gonna continue tomorrow and have the page finished by the end of the week. Welp, I guess that’s it for today. Everybody have a beautiful day, and bye bye!"}, {"post_id": 48473, "ts": "2026-08-16T20:40:29Z", "hours": 6.3456, "text": "Devlog 15 For the last few days, I have been remaking the UI in EGUI and I am enjoying it so far. I’ve been working on the graphs in the graph view and also the sidebar. The sidebar is turning out very well and I am also pretty pleased with the graphs. I have only this for now, so enjoy :D"}, {"post_id": 46562, "ts": "2026-08-13T21:40:19Z", "hours": 2.9933, "text": "Devlog 14 I have done some research and decided that moving forward the app will use eGPU as the main GUI library. I have chosen this over the competitors due to a few reasons. The main being that its rendered natively and that its a intermediate mode library. This will make it very easy to work with the graphs and hopefully other stuff too. I am enjoying working with it so far. There are some concepts that I really like, like that everything that has state is just a simple struct that is initialized somewhere and you do most of the implementation. The widget system is also pretty cool. I was at first worried that I would hate it due to my experiences from TKInter that was forced on me in school :D but its pretty intuitive how they did it. Going further I will need to think about the architecture of the app a bit to not have it fall apart. Right now I am thinking that one thread will be the main “logger thread” which will gather data from the telemetry and then there will be the UI thread. I think that is what pretty much everyone is doing so it might work . With this approach i am worried that its gonna be a pain, but what isn’t these days… I don’t really have that much more to say so at least enjoy this screenshot of a pretty much not working app Fun fact: due to how the lib works there is a bug now that you have to move your cursor on the app for it to log data :DDD"}, {"post_id": 46009, "ts": "2026-08-12T21:29:42Z", "hours": 2.5956, "text": "Devlog 13 Okay so I might have found a solution for me not liking react and web technologies but still wanting to finish this project. And I don’t like it…. but it has to be done. But before I tell you what it is you have to understand my problems. The good React in combination with typescript is a very easy thing to understand. They are everywhere, the skill of knowing these is very valuable. They have a huge ecosystem because they are everywhere. And I am sure that I have forgotten many other cool and interesting features and perks but I picked them for mainly these 3. The Bad They are slow (in comparison to something like rust) They rely too heavily on browsers (I mean it’s basically their runtime) You have to be “hacky” to do some things. They are not suitable to develop desktop apps I mean in hindsight those are so obvious but until you are balls deep into some specific project you don’t really think about those. The main problem is that the performance is, for the lack of a better word, sh*t. And normally that isn’t a problem however when you are processing a memory object of about 300kb 60 times per second it adds up fast. Even on my pretty beefy PC (r7 9800x3d and n5070ti) it hardly gets 30 fps. I know this could probably be fixed with “more hacky workarounds” but I am tired of those. The solution I am going to REWRITE The project I have spent 70h on already in some rust native GUI framework such as ICED. I have not yet decided which one to chose and I will do that research tomorrow and report back Literally me RN ⬇️"}, {"post_id": 45715, "ts": "2026-08-12T11:49:22Z", "hours": 2.1014, "text": "Devlog 12 This will be more of like a quick update on the championships feature. So what has happened is that I have implemented the feature, and assumed that the data will be there for all players… which there isn’t. The other players show up and everything but the details like tire data, damage data and fuel data just isn’t there. So I am kinda stuck if I should just scrap the feature or recreate it into a personal data panel which would just not be fun I think. Also the damages data is very very limited, so I just don’t know what to do."}, {"post_id": 45217, "ts": "2026-08-11T15:31:51Z", "hours": 9.4839, "text": "Devlog 11 Hello guys. I have some good news and some bad news… Let’s start with the not so good news. After thinking about it, I have decided, that I don’t really enjoy working on this project. It’s not that the project it self is bad, it’s more about the tech stack I chose… Don’t get me wrong typescript and react are both phenomenal choices and great tools but, I guess the web is just not for me. I realized that I like the lower end of the spectrum better. So I have decided to cut this project short. The map view will not be included in the final ship for the time being and the profile stats also will not be there. On the bright side, I have started working on the championships page with that nearing its completion. Next I will start to work on the onboarding and settings pages."}, {"post_id": 23759, "ts": "2026-07-06T21:48:28Z", "hours": 10.0158, "text": "Devlog 10 - We are in the double digits 🎊 UI Redesign Progress I am slowly redesigning the app to look like the design I made. I started with the sidebar and then the top control panel. All that went well. The Graphs… 😅 But then I got to the Graphs . *Oh, the graphs… *I wanted to redo the backend for them because the multiple-thread approach was just straight up stupid. It was a pain to develop and would be a pain to maintain. So, in my infinite wisdom , I have gone for just a simple async function. That means that right now the frontend is requesting each data point instead of subscribing to a stream. After that, I needed to revise the frontend graph component itself. At first I just wanted to make a non-messy implementation of the old version. However, it turned out that the HTML <canvas> element is really slow. And I mean realllllllllly slow. So after I wasted like 2 hours trying to optimize the design with no success, I rage quit and went to watch a movie. WebGL to the Rescue But I don’t give up that easily. After the movie, I reimplemented the graph view with WebGL through Pixi.js , which wasn’t even that hard like I expected and overall had much better performance. Well… at least after I fixed one very stupid bug . The Bug That Ate 10 GB of RAM I had forgotten everything from the first GraphView.tsx implementation, so I was just mindlessly copying over the code and renaming the variables to what I thought they meant when I first made it. Then I got to the part which draws the lap (aka the big loop over all the points-up to 10,000 points at a time). There was an error on one of the variables. It was the length of some array. I just renamed it to the main array length because… *what other thing would it be, right? *Well…It was the length of the values array , which was always 1 or 2 .So I accidentally turned 1 × 10,000 iterations into 10,000^2 iterations . Somehow the app still wasn’t lagging that much. It just took like 10 GB of RAM . The Result Thankfully, the new WebGL + Pixi.js approach is way more efficient , so after fixing that bug the graph rendering performs much better. It still isn’t perfect on the UI side of things but I am getting there!"}, {"post_id": 22818, "ts": "2026-07-05T12:34:46Z", "hours": 6.9447, "text": "Devlog 9 - THE REDESIGN For the past few days I’ve been working on a new design for the app. I am not the best designer and to be real I didn’t enjoy it :D. Designing is just too illogical for me. There’s not really much more to say about this. Enjoy the design:"}, {"post_id": 20110, "ts": "2026-07-01T17:12:04Z", "hours": 9.2647, "text": "Devlog 8 Do you guys remember how I said that I will take a break ? Yeah… That didn’t happen. Instead I have made a plan for myself on how I am gonna continue in the tool’s development. Da plan The plan Is pretty simple: Design the app in Figma, then build it! I have also made a list of features that will be added. You can find the plan on Github. You can also suggest features if you’re interested! …oh and before making the plan I have implemented a pretty cool logging feature. Basically it records the currently selected driver and saves all his data to a file along with the lap time and date. It does this only for laps that the game considers valid (aka gives a lap time to.)"}, {"post_id": 17764, "ts": "2026-06-28T18:11:51Z", "hours": 6.7406, "text": "DevLog 7 This will be just a quick update on how things are looking right now, what’s happening, and the overall state of the project. Good news The rewrite is complete The sole UI library is now ShadCN. There have also been some minor bugfixes and ux improvements. The main being that the app is now working on lower resolutions. We’ve got a readme. It’s basic, but its there. Also I have added installation instructions and released the 1st alpha version. You can find it in the releases! Both windows and linux packages are there! Bad news I will take a break for the next few days. I will be working on a smaller project for android and I hope that by the time I return I will be full of energy and ideas! What’s next I will continue working on the graph view. Mainly saving and loading reference laps, and overall better UI and UX."}, {"post_id": 12606, "ts": "2026-06-20T16:24:29Z", "hours": 9.7894, "text": "DevLog 6 - Windows support and the first rewrite! Windows support There’s not really much to say about this. You just get a handle on the game’s memory. This was vibecoded but it’s below 100 lines of windows specific code, so I’m gonna allow it. (It was just the 2 function that handle updating the telemetry and the rest is the same.) Rewrite After adding windows support, and sending it to a friend to test, I have discovered a massive problem. The app just didn’t work on a lower resolution. Since I have a QHD monitor, I didn’t notice it. Also when I started writing the app, I did it in pure React without any UI libraries, then I started to use Antd and then MUI and it became a mess. So I have done some research and decided to rewrite the app using ShadcnUI. I did this because Shadcn has one massive advantage - the code that you use is in your codebase. This means that you can modify the components however you want. It is also one of the more popular ones out there. For icons, I will be using Tabular, because they have a lot of them, and I like their look."}, {"post_id": 10767, "ts": "2026-06-17T17:54:53Z", "hours": 4.4767, "text": "DevLog 5 - Introducing the Layouts feature! So for the past few days I was implementing a layouts feature for the Graphs view in my app. Features: Adding layouts Removing layouts Managing layouts change what graphs they display change the properties of those graphs aka their number of gridlines, color and type How many graphs there are and what sizes they have You can do all of that in the Edit Mode . This mode is accessible via the layout selection dropdown. In edit mode you have options to change the graphs as said, remove the layout you’re editing, to save it as a new one or to save it (basically override the last one). All of this is persistent between sessions. Note that the UI in the screenshots is probably gonna be changed in the future and is just a development placeholder :)"}, {"post_id": 8829, "ts": "2026-06-14T18:01:40Z", "hours": 5.2161, "text": "DevLog 4 Today I have started implementing the layouts feature. There’s not much to really say. The graphs can be vertically adjusted in size, their color and type can be changed and there is a whole new edit mode for that. And that’s what I did for 5h today… (I really hate frontend :D) The design of the whole thing is unfinished but hey, it works. Even though some features (mainly saving and loading layouts) are missing its turning out great. I will continue developing this feature for the time being."}, {"post_id": 8235, "ts": "2026-06-13T18:14:25Z", "hours": 4.1997, "text": "DevLog 3 This one will be more about the organization of the project. New folder structure I have split up the src directory into a few different subdirectories mainly pages directory which is further split up into directories for each page and a components directory for reusable components like the sidebar. Logging Furthermore I have implemented logging on the backend. (It’s also callable from the frontend but that’s not that convenient at least in case of debugging so I won’t be using it as much.) The top bar Next I have started implementing a top bar for the telemetry view . On there will be some important controls and information regarding that view. Just note that in the screenshot the game is not open therefore the driver dropdown isn’t populated with any text. This will probably change in the future. And the layout dropdown is there just for the looks for now ;)"}, {"post_id": 6907, "ts": "2026-06-11T16:08:05Z", "hours": 2.7908, "text": "DevLog 2 Today i have fixed a bug where threads would spawn infinitely. I’ve been at it for 3h… Yeah it was kinda pain. So I basically have this architecture, where my backend spawns a new thread for each graph ( to provide information more responsibly. ) However whenever the graph element unloaded, it didn’t unsubscribe from that thread. A simple fix, just unsubscribe it, right ? Yup basically. However my lack of expertise in this kind of stuff led me on a wild goose chase. After I realized that what I am doing is stupid, it was just a simple hook that the spawn function returned, when spawning the new thread. Well we all make mistakes :D"}, {"post_id": 6797, "ts": "2026-06-11T12:14:18Z", "hours": 0.4275, "text": "DevLog 1 — An Introduction to My Project Hi! I’m Karlito, and this is my first devlog. I’d like to use this devlog to introduce my project, explain its current state, and share my plans for the future. So, what actually is LMU Telemetry? The TL;DR is that it’s a telemetry tool for Le Mans Ultimate. However, many people don’t know what that means, so I’ll explain it here. What is Le Mans Ultimate? In short, Le Mans Ultimate is a racing simulator. Unlike traditional racing games, it doesn’t simply say “the car accelerates when you press W.” Instead, it simulates the engine, tires, driveshafts, brakes, track grip, and many other factors to provide a realistic driving experience. What is telemetry? Telemetry is a way for simulators to output simulation data, such as speed, position, engine temperature, and much more. At a lower level, it’s essentially a chunk of memory containing numbers that are constantly updated with current information. What LMU Telemetry actually does LMU Telemetry aims to visualize these data points in a way that’s easy to understand and can help users improve their driving. It does this in several ways. For example, one feature draws real-time graphs of various metrics such as speed or delta time compared to your best lap. The current state of development The app is currently little more than a glorified demo. It has some rough UI elements and only plots graphs for a hardcoded car (index 0). While this works in private lobbies, where you’re always the first car, the system fails in most other situations. In short, the app isn’t very useful yet, but it’s a start. Main goals Live telemetry view Real-time graphs Map view A view showing the track layout and the line you drove Sharing features Exporting laps and comparing them with laps driven by other users Requirements The app must be performant Running LMU can already be demanding on some systems, so the app shouldn’t use more resources than necessary Linux support A reactive and polished UI Future plans Windows support Depending on how difficult this turns out to be, it may be implemented sooner Strategy mode Useful for endurance and team events, allowing you to monitor the tire and fuel status of other drivers So, what now? Right now, I’ll focus on getting the app to its MVP state. This means refining the UI, fixing bugs, and, most importantly, making the app genuinely useful. Well, that was quite a long one, wasn’t it? Thank you for reading all the way to the end, and have a wonderful rest of your day!"}]...
|
Title: Telemetry LMU by @Karlito | Stardance
Devl Title: Telemetry LMU by @Karlito | Stardance
Devlogs:
DevLog 1 — An Introduction to My Project Hi! I’m Karlito, and this is my first devlog. I’d like to use this devlog to introduce my project, explain its current state, and share my plans for the future. So, what actually is LMU Telemetry? The TL;DR is that it’s a telemetry tool for Le Mans Ultimate. However, many people don’t know what that means, so I’ll explain it here. What is Le Mans Ultimate? In short, Le Mans Ultimate is a racing simulator. Unlike traditional racing games, it doesn’t simply say “the car accelerates when you press W.” Instead, it simulates the engine, tires, driveshafts, brakes, track grip, and many other factors to provide a realistic driving experience. What is telemetry? Telemetry is a way for simulators to output simulation data, such as speed, position, engine temperature, and much more. At a lower level, it’s essentially a chunk of memory containing numbers that are constantly updated with current information. What LMU Telemetry actually does LMU Telemetry aims to visualize these data points in a way that’s easy to understand and can help users improve their driving. It does this in several ways. For example, one feature draws real-time graphs of various metrics such as speed or delta time compared to your best lap. The current state of development The app is currently little more than a glorified demo. It has some rough UI elements and only plots graphs for a hardcoded car (index 0). While this works in private lobbies, where you’re always the first car, the system fails in most other situations. In short, the app isn’t very useful yet, but it’s a start. Main goals Live telemetry view Real-time graphs Map view A view showing the track layout and the line you drove Sharing features Exporting laps and comparing them with laps driven by other users Requirements The app must be performant Running LMU can already be demanding on some systems, so the app shouldn’t use more resources than necessary Linux support A reactive and polished UI Future plans Windows support Depending on how difficult this turns out to be, it may be implemented sooner Strategy mode Useful for endurance and team events, allowing you to monitor the tire and fuel status of other drivers So, what now? Right now, I’ll focus on getting the app to its MVP state. This means refining the UI, fixing bugs, and, most importantly, making the app genuinely useful. Well, that was quite a long one, wasn’t it? Thank you for reading all the way to the end, and have a wonderful rest of your day!
DevLog 2 Today i have fixed a bug where threads would spawn infinitely. I’ve been at it for 3h… Yeah it was kinda pain. So I basically have this architecture, where my backend spawns a new thread for each graph ( to provide information more responsibly. ) However whenever the graph element unloaded, it didn’t unsubscribe from that thread. A simple fix, just unsubscribe it, right ? Yup basically. However my lack of expertise in this kind of stuff led me on a wild goose chase. After I realized that what I am doing is stupid, it was just a simple hook that the spawn function returned, when spawning the new thread. Well we all make mistakes :D
DevLog 3 This one will be more about the organization of the project. New folder structure I have split up the src directory into a few different subdirectories mainly pages directory which is further split up into directories for each page and a components directory for reusable components like the sidebar. Logging Furthermore I have implemented logging on the backend. (It’s also callable from the frontend but that’s not that convenient at least in case of debugging so I won’t be using it as much.) The top bar Next I have started implementing a top bar for the telemetry view . On there will be some important controls and information regarding that view. Just note that in the screenshot the game is not open therefore the driver dropdown isn’t populated with any text. This will probably change in the future. And the layout dropdown is there just for the looks for now ;)
DevLog 4 Today I have started implementing the layouts feature. There’s not much to really say. The graphs can be vertically adjusted in size, their color and type can be changed and there is a whole new edit mode for that. And that’s what I did for 5h today… (I really hate frontend :D) The design of the whole thing is unfinished but hey, it works. Even though some features (mainly saving and loading layouts) are missing its turning out great. I will continue developing this feature for the time being.
DevLog 5 - Introducing the Layouts feature! So for the past few days I was implementing a layouts feature for the Graphs view in my app. Features: Adding layouts Removing layouts Managing layouts change what graphs they display change the properties of those graphs aka their number of gridlines, color and type How many graphs there are and what sizes they have You can do all of that in the Edit Mode . This mode is accessible via the layout selection dropdown. In edit mode you have options to change the graphs as said, remove the layout you’re editing, to save it as a new one or to save it (basically override the last one). All of this is persistent between sessions. Note that the UI in the screenshots is probably gonna be changed in the future and is just a development placeholder :)
DevLog 6 - Windows support and the first rewrite! Windows support There’s not really much to say about this. You just get a handle on the game’s memory. This was vibecoded but it’s below 100 lines of windows specific code, so I’m gonna allow it. (It was just the 2 function that handle updating the telemetry and the rest is the same.) Rewrite After adding windows support, and sending it to a friend to test, I have discovered a massive problem. The app just didn’t work on a lower resolution. Since I have a QHD monitor, I didn’t notice it. Also when I started writing the app, I did it in pure React without any UI libraries, then I started to use Antd and then MUI and it became a mess. So I have done some research and decided to rewrite the app using ShadcnUI. I did this because Shadcn has one massive advantage - the code that you use is in your codebase. This means that you can modify the components however you want. It is also one of the more popular ones out there. For icons, I will be using Tabular, because they have a lot of them, and I like their look.
DevLog 7 This will be just a quick update on how things are looking right now, what’s happening, and the overall state of the project. Good news The rewrite is complete The sole UI library is now ShadCN. There have also been some minor bugfixes and ux improvements. The main being that the app is now working on lower resolutions. We’ve got a readme. It’s basic, but its there. Also I have added installation instructions and released the 1st alpha version. You can find it in the releases! Both windows and linux packages are there! Bad news I will take a break for the next few days. I will be working on a smaller project for android and I hope that by the time I return I will be full of energy and ideas! What’s next I will continue working on the graph view. Mainly saving and loading reference laps, and overall better UI and UX.
Devlog 8 Do you guys remember how I said that I will take a break ? Yeah… That didn’t happen. Instead I have made a plan for myself on how I am gonna continue in the tool’s development. Da plan The plan Is pretty simple: Design the app in Figma, then build it! I have also made a list of features that will be added. You can find the plan on Github. You can also suggest features if you’re interested! …oh and before making the plan I have implemented a pretty cool logging feature. Basically it records the currently selected driver and saves all his data to a file along with the lap time and date. It does this only for laps that the game considers valid (aka gives a lap time to.)
Devlog 9 - THE REDESIGN For the past few days I’ve been working on a new design for the app. I am not the best designer and to be real I didn’t enjoy it :D. Designing is just too illogical for me. There’s not really much more to say about this. Enjoy the design:
Devlog 10 - We are in the double digits 🎊 UI Redesign Progress I am slowly redesigning the app to look like the design I made. I started with the sidebar and then the top control panel. All that went well. The Graphs… 😅 But then I got to the Graphs . *Oh, the graphs… *I wanted to redo the backend for them because the multiple-thread approach was just straight up stupid. It was a pain to develop and would be a pain to maintain. So, in my infinite wisdom , I have gone for just a simple async function. That means that right now the frontend is requesting each data point instead of subscribing to a stream. After that, I needed to revise the frontend graph component itself. At first I just wanted to make a non-messy implementation of the old version. However, it turned out that the HTML <canvas> element is really slow. And I mean realllllllllly slow. So after I wasted like 2 hours trying to optimize the design with no success, I rage quit and went to watch a movie. WebGL to the Rescue But I don’t give up that easily. After the movie, I reimplemented the graph view with WebGL through Pixi.js , which wasn’t even that hard like I expected and overall had much better performance. Well… at least after I fixed one very stupid bug . The Bug That Ate 10 GB of RAM I had forgotten everything from the first GraphView.tsx implementation, so I was just mindlessly copying over the code and renaming the variables to what I thought they meant when I first made it. Then I got to the part which draws the lap (aka the big loop over all the points-up to 10,000 points at a time). There was an error on one of the variables. It was the length of some array. I just renamed it to the main array length because… *what other thing would it be, right? *Well…It was the length of the values array , which was always 1 or 2 .So I accidentally turned 1 × 10,000 iterations into 10,000^2 iterations . Somehow the app still wasn’t lagging that much. It just took like 10 GB of RAM . The Result Thankfully, the new WebGL + Pixi.js approach is way more efficient , so after fixing that bug the graph rendering performs much better. It still isn’t perfect on the UI side of things but I am getting there!
Devlog 11 Hello guys. I have some good news and some bad news… Let’s start with the not so good news. After thinking about it, I have decided, that I don’t really enjoy working on this project. It’s not that the project it self is bad, it’s more about the tech stack I chose… Don’t get me wrong typescript and react are both phenomenal choices and great tools but, I guess the web is just not for me. I realized that I like the lower end of the spectrum better. So I have decided to cut this project short. The map view will not be included in the final ship for the time being and the profile stats also will not be there. On the bright side, I have started working on the championships page with that nearing its completion. Next I will start to work on the onboarding and settings pages.
Devlog 12 This will be more of like a quick update on the championships feature. So what has happened is that I have implemented the feature, and assumed that the data will be there for all players… which there isn’t. The other players show up and everything but the details like tire data, damage data and fuel data just isn’t there. So I am kinda stuck if I should just scrap the feature or recreate it into a personal data panel which would just not be fun I think. Also the damages data is very very limited, so I just don’t know what to do.
Devlog 13 Okay so I might have found a solution for me not liking react and web technologies but still wanting to finish this project. And I don’t like it…. but it has to be done. But before I tell you what it is you have to understand my problems. The good React in combination with typescript is a very easy thing to understand. They are everywhere, the skill of knowing these is very valuable. They have a huge ecosystem because they are everywhere. And I am sure that I have forgotten many other cool and interesting features and perks but I picked them for mainly these 3. The Bad They are slow (in comparison to something like rust) They rely too heavily on browsers (I mean it’s basically their runtime) You have to be “hacky” to do some things. They are not suitable to develop desktop apps I mean in hindsight those are so obvious but until you are balls deep into some specific project you don’t really think about those. The main problem is that the performance is, for the lack of a better word, sh*t. And normally that isn’t a problem however when you are processing a memory object of about 300kb 60 times per second it adds up fast. Even on my pretty beefy PC (r7 9800x3d and n5070ti) it hardly gets 30 fps. I know this could probably be fixed with “more hacky workarounds” but I am tired of those. The solution I am going to REWRITE The project I have spent 70h on already in some rust native GUI framework such as ICED. I have not yet decided which one to chose and I will do that research tomorrow and report back Literally me RN ⬇️
Devlog 14 I have done some research and decided that moving forward the app will use eGPU as the main GUI library. I have chosen this over the competitors due to a few reasons. The main being that its rendered natively and that its a intermediate mode library. This will make it very easy to work with the graphs and hopefully other stuff too. I am enjoying working with it so far. There are some concepts that I really like, like that everything that has state is just a simple struct that is initialized somewhere and you do most of the implementation. The widget system is also pretty cool. I was at first worried that I would hate it due to my experiences from TKInter that was forced on me in school :D but its pretty intuitive how they did it. Going further I will need to think about the architecture of the app a bit to not have it fall apart. Right now I am thinking that one thread will be the main “logger thread” which will gather data from the telemetry and then there will be the UI thread. I think that is what pretty much everyone is doing so it might work . With this approach i am worried that its gonna be a pain, but what isn’t these days… I don’t really have that much more to say so at least enjoy this screenshot of a pretty much not working app Fun fact: due to how the lib works there is a bug now that you have to move your cursor on the app for it to log data :DDD
Devlog 15 For the last few days, I have been remaking the UI in EGUI and I am enjoying it so far. I’ve been working on the graphs in the graph view and also the sidebar. The sidebar is turning out very well and I am also pretty pleased with the graphs. I have only this for now, so enjoy :D
Devlog 16 Another 6 hours, another devlog… Hi people. For the last 2 days I took a bit of a break from the project. I have played Approximately up with the boys and it was so fun. Y’all should try the game. It has a free demo 😉 But we are not here to talk about games, are we… I am continuing the implementation of the frontend and its coming along nicely. I’ve just noticed one thing, making the UI itself in egui is kinda slow however the state is very easy. Whilst this not being completely ideal i can push trough that. Since the last devlog, I have finished the implementation of the sidebar, and started working on the telemetry page. I have the graphs sorted and now I am working on the top bar. It’s having a couple of issues at the moment but nothing hard to fix really. I am hopefully gonna continue tomorrow and have the page finished by the end of the week. Welp, I guess that’s it for today. Everybody have a beautiful day, and bye bye!
Devlog 17 Hello guys. Its me again :D I am continuing to rewrite the UI into egui. I have completed the Graph view’s UI and now I am moving onto implementing it. One thing I have noticed is just how much more “code efficient” egui is. I understand that I didn’t make the logic behind the code yet but even with that I made the same thing with 3k less lines of code. Here is how the layout edit mode is looking for now.
Devlog 18 - 100h on the project So it’s been a hundred hours huh ? I also can’t believe it! I have also just now finished* the graph view which will be newly called Telemetry (page) Now I will move onto making the car info page previously known as the championship view. I expect this to be very easy!
Devlog 19 Hello hello! Today I have some exciting news. The rewrite is complete That’s right, after about 30 hours of porting this code from tauri into EGUI it is finally finished! So let’s take a look at some stats, shall we ? | | Tauri | EGUI | |----------------------|-------------|--------------- | | Dev time | 80h | 30h | | Lines of code written | 6k | 3k | | Enjoyability | suboptimal | above average | And some perofrmance stuff as well: | | Tauri | EGUI | |----------------------|-------------|--------------- | | Ram idle | ~700Mb | ~150Mb | | CPU % idle | ~5% | ~5% | | FPS under load | ~29fps | stable 60 | Some other perks also include that EGUI doesn’t need a browser installed on the system to work. Overall I think this was a very successful rewrite! I wouldn’t do it again tho Next I will refactor the code a bit, do a bit off the good ’ol cleanup and then get to work on the map feature.
Devlog 20 So I have been polishing up the current features a bit and they are far from done. I am starting to question if i will make it to shipping this app one day :D. Anyway I have fixed numerous bugs, added an settings page and implemnted although very crudly a lap logger. But there is still a lot work that needs to be done. I have also added persistancy so the app remembers your choices. I am almost ready to replace the main branch with the fully rusted version, but like I said more work has to be done to go trough with that! I have probably never shown how the Car info page turned out and IMO it did really well. (The empty space is for inputs. That will be implemented soon!)
Devlog 21 For the past few days I have been working on a new feature. The map page. It is turning out great, however it has a lot of bugs. These will get fix over the next few days. I promise :) There have also been changes made to the lap logging system and some other systems as well. As you can see on the image you select 2 saved laps and can crosscompare the lines you drove. Obviously this is completly useless if you loaded 2 different track like I did here. This will get checked for and prohibited in the future. Next I will add the underlying lap overlay which I will somehow extract from the game or from somewhere else. I don’t really know yet. Well that is it for today. Have a great day and bye bye!
Devlog 22 Hiiiiiiiiiiiii I have some huge news to tell you. I have just made the MOST complex addition yet. And I love it! I have completely overhauled the accessing and managing the telemetry! I have designed a thread safe way to have it run on a separate thread and be accessible from *every place in the app. One unified API for everything! I now store the current lap and the last lap for each of the cars. Tho this takes up a massive 140mb of just floats (in the worst case scenario) I believe its worth the RAM! (Let’s be real, we have saved over 400mb from the tauri implementation so we can now use some of that!) Next I will continue on further implementing these features around the tool. Anyway have a nice day people and bye bye. Some context to that meme: I have a type in my app that is literally Arc<Mutex<[([f64; TelemetryValueType::Max as usize], Option); 104]»
Devlog 23 - More Refactoring Hi! In the past few days I have been making some core architectural changes to the project and I would like to explain them now. Telemetry Provider I have finally decided on how I am gonna handle telemetry in the long term. It’s a pretty simple concept but the implementation is pretty hard. I have one object (the TelemetryProvider struct) that is in charge of getting and managing the telemetry. Right now it logs data from all cars and stores the best, last and current laps. If you wish it can save only your laps or laps of everybody. Each lap is a json file about 500kB - 1MB in size and holds all the data that can be displayed in the app. Notably the position ( so you can load that lap directly into the map page ) and the data displayed by the graphs (so you can load it as a reference there as well.) Pointer to this struct is distributed to pages that need it so they can access it! The provider has a core logging loop that is running on another thread so the whole UI doesn’t have to redraw each time you log new data. (About 60 times a second.) State and Settings Providers Next, I have implemented a StateProvider and an SettingsProvider . These two are basically a drop in replacement of what was stored in the Sidebar and SettingsPage respectively. Difference between the two is that the StateProvider isn’t stored between app restarts. Similarly to how the TelemetryProvider works, each of the pages that need these values get a shared pointer (or an Arc in rust) and can access the values. What’s next Going further I will keep my focus on the map page. Finish it, and then start polishing the app for the final ship! Wish me luck and have a nice day!
Devlog 24 HI! All of the time on this devlog was basically just driving in circles. And I mean that. I have recorded all of the outsides and insides of all tracks in the game to get the data for the map page. It was very teidius and very boring. Like very very boring. There are 31 tracks in LMU (including each layout) and on every one of them I had to do an out lap, the ouside, another out lap and the inside. So 4laps for each. That is about 15min per layout. Yeah it was a long one. And the recordings aren’t perfect either! I will now have to somehow process them all to get them ready for the ship. You can watch the timelapses of this process here if you wish. https://lapse.hackclub.com/timelapse/OQcismBwxbBB https://lapse.hackclub.com/timelapse/le3Lta0RxcUA https://lapse.hackclub.com/timelapse/XRf98OimmUk9 Anyway. Have a nice day!
Devlog 25 I know I have just made a devlog like yesterday but holy s*** the track references work so well. They are practically perfect . Besides the references I have also implemented the delta time between the 2 cars! That has really tied the page together. If I can say so myself, we are getting pretty close to the final ship . There is not much needed to implement. The obvious are bugfixes, and some simple onboarding. But really, that’s it! Everyone who is following or caring about this project can expect a ship in the next week or so. In my final devlog I will also do a writeup on this project as a whole, from the coarse beginnings in Dyoxys, trough Tauri, to the sweet home of EGUI. There will also be a trailer video and a demo for all the raters :D Anyway for now you can have this preview of the map page! Stay tuned!
Devlog 26 Hiiiii For the past few hours I have been working on polishing the app and get it to a shippable state overall. There is still work left to do, but I am getting there. I have set up a simple packager, and a simple script to use it. It automatically compiles the release version of the app and packages it into a windows installer a Debian .deb package and a pacman package. I have also (after like 2 hours of struggeling with it) added an Icon for the app. So now it looks nice!There has been a lot of new bugfixes as well and the app has been tested by my friend so it should be somwhat usable, tho the setup UX should be improved upon. If you wish you can download the app from here: https://github.com/Karlito05/TelemetryLMU/releases/tag/v0.2.3 Well that is all I have for you all today, so have a nice one :)
Devlog 27 For the past few hours I have been polishing the app up. The main you’ll probably see are the onboarding dialogs. A global one pops up when you first launch the app and then one for each page when you first enter them. Another change I have done is that I made the ghosts on the map page be based on time and not data point index.
Devlog 28 Today is gonna be a big day, because I will ship the project. There is a few things left to do tho. Mainly the readme and the demo video! In my last and next devlog I will also make a write up on the story of the whole project so far. Besides that I have yesterday refactored the whole codebase so now there aren’t just 5 monolithic files. I went for a more react like approach with the structure being divided into pages and components. Sadly there isn’t enough time until the ship to touch up on some old UI and UX problems in the edit view of the graphs, neither is there time to add more fields. This will be done in the near future! Overall I am very happy how the app turned out. But this is not the end of the development this is just the end of the stardance journey!
Devlog 29 - The end So this is the last one, huh. Here is the full write up on this project as I promised. Chapter 1 - The beginnings This project started about 3 months ago. I started experimenting with just getting the data and plotting it. Just for fun as an exercise to learn rust. Then I realized that there actually isn’t a proper working telemetry tool that works on linux. So I did some research… and I decided that I am going to make the app in Dioxus. Chapter 2 - The Dioxus era This leads us to the shortest of eras. The Dioxus era. Nothing really happened here and quite frankly I don’t even remember it that much. There aren’t really any git commits because I didn’t have that setup yet. One thing i remember tho is that I couldn’t figure out how to draw the garphs, because Dioxus is based on web technologies but weirdly becuase you are writing HTLM like syntax but in rust. And that was the main reason I decided to switch to Tauri. Chapter 3 - The Tauri era At first Tauri was the best framework ever made for me. That is because I already kinda knew react, it was simple to understand and I could really lean into the split frontend and backend architecture. This sadly proved very inefficient for the graph view which needs to render thousands of points each frame. Since it was too much for the basic HTML canvas I have switched to using WebGL with numerous downsampling techniques. This was just a bandaid fix though. I have also ran into bunch of architectural issues with the whole split frontend and backend thing. Accessing the telemetry data proved to be very difficult and inefficient. I remember that I ran each of the graphs on a separate thread. This was so stupid. I don’t even remember how I could’ve come up with such a stupid idea :D. It just led to memory leaks and threads uncontrollably spinning up and not stopping. I am sure that all of that could’ve been easily avoided with simpler architecture but at that point I was at my lowest point of this project, so I didn’t even have the energy to do it. I also had the state of the frontend so fragmented which didn’t help. And the whole retained mode GUI thing just wasn’t well suited for this kind of app. And that is when I decided to do a complete rewrite in pure rust! Chapter 4 - The sweet EGUI I didn’t know it at the time, but this was the best idea on what to do with the project. I remember that I was very split between just shipping it half done and finishing it just because of how bad the development experience with Tauri was (sorry Tauri devs, it’s not a you thing, it’s a me thing). It took about 30h to fully rewrite the app with EGUI, which looking back at it isn’t too bad. It felt like ages though. It didn’t help that almost none of the work in this “chapter” did AI. Which at the end of the day is better! Although my style of writing EGUI code was let’s say original… I have just put everything into one file and that grew very fast :D. I had like 5 files that were about 800 lines each. That has since luckily changed. (I have adopted more of a React style file structure.) Anyway at the end of the rewrite I kinda started loving EGUI and that hasn’t stopped since. I continued to develop the Map page in EASY which was pretty easy. But then I needed the track limits data for the map page. This was a bit of a roadblock… First I have tried to extract the data directly from the game, however this was inaccurate and the track width was missing entirely. So then I tried to download an up to date image of the top down view of the track and extract the inside and outside line from it and match it to the in game data. This partially worked better, still not great tho. So there was only one option left. And that was to painfully drive each layout of each track by hand. This took almost 7h of just driving in circles. After that it was smooth and buggy sailing until the ship. Everyone who read this, have a beautiful day.
Ships:
Telemetry LMU An application for both Windows and Linux to visualize the telemetry data from Le Mans Ultimate What it does: This application collects, stores, and visualizes data from a racing simulator called Le Mans Ultimate. The main goal: Allow users to analyze their driving and learn from their data through an easy-to-use interface. The requirements: Performance, nice and simple UI, expandability, minimal setup. Results: Main goal: Achieved. (I wouldn’t be shipping this app otherwise) Performance: On average the app uses 4% of CPU and 250Mb of RAM under full load. That is less RAM usage than running Spotify in the background. Nice and simple UI: This is personal preference, however in my opinion I think i succeeded. Expandability: The architecture of the app is very modular so this also isn’t a problem. Setup: On windows there is none (except installing the app), on linux there is one dependency (this is sadly unavoidable.) Some stats: 200+ hours of development time (including the time before Stardance) 250+ commits 6 000+ lines of Rust...
|
1792856986.9583683
|
1792943386.9583683
|
|
8111
|
Poorup.io by @jeremy | Stardance
|
jeremy
|
3
|
179.0
|
2137
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-06T17:48:41Z", "hours": 135.0, "multiplier": 18.44, "payout": 1778, "blessing": "neutral", "text": "Poorup — Biggest Update to date I’ve given the project a major overhaul, from its visual identity and everything else. This is geninuly one of the best projects i have created and iam proud to announce it I first started Poorup 3 and 1/2 months ago as a project to get introcude into webdesing and since then i have created 4 more website and revesiting it really shows my growth. Of course Ai was used by even then I could really feel my growth What was challening i decide to stay on CSS, html, and js instead of transferring it into another language for a simple reason i wanted to test how far i can push these 3 languages( i was just to lazy to learn a new language) How I used AI AI WAS USED IN THIS PROJECT for debugging and coding no UI or art generation. AI was a substantial coding and debugging tool, especially for backend work, bot logic, and tricky multiplayer edge cases. I used CodeScene to identify code-health hotspots. I wrote many page-specific backend features myself, then used GPT/Codex to help debug or split some larger hotspot files into smaller modules. Ai was also used to fix bugs in the Ipad Ui I created Poorup’s frontend UI and its SVG and art assets myself. AI helped in coding but never touched art. I didn’t compose the soundtrack. I selected open-source and other openly licensed tracks; their sources and license details are in the audio credits . I also rewrote the Git history to make the repository cleaner, so the current commit log isn’t a complete record of the project’s development. Also after around the 6th or 7th devlog i turned ai traccking of as to not fraud myself hours So if needed deplete hours. What’s new in this patch UI Full ui rework of everything nothing was left out every single Ui elemt was redone by scratch, with upto 6 themse each with their own custom soundtrack and background, this was the largest wish people had wished for when they reviewed my game and iam so proud of the UI. Boards and multiplayer New 40 and Metro-52 boards, with custom visual themes. Public rooms and private rooms with shareable codes; people can join as guests. Configurable rules, including double rent, vacation cash, even building, and randomized turn order. A deeper economy system Bank loans, player-to-player loans, equity deals, and hybrid contracts, with collateral and default consequences. Sponsored purchases: one player can fund another player’s property purchase in exchange for an agreed share. Negotiating now youre able to negotiate all offers you get instead of accepting or declining on the spot you can also keep them on hold An optional stock market for all the quant bros(gamblers) casino so now youre able to gamble Social I also added a full social systems with achievements, friends inviting people to lobbys seeing match history and more, also added the option to create your own 16x16 user icon Events one of the biggest features I decided to add global events which appear under certain conditions like to many houses standing which should reference the 2008 housing crises i also added stock market crash and alot more. Also global events can also combine to create seacil ones Parlor patrol this was supposed to be a cool minigame while waiting for your friends but it doesnt work and i cant fix the bug for the life of me so you can test it out but it doesnt work correclty all svg assets for it exist", "repo": "https://github.com/jeremy341/Poorup/", "demo": "https://poorup.jeremy-d.hackclub.app/"}, {"ship_num": 2, "ts": "2026-08-11T21:30:56Z", "hours": 7.0, "multiplier": 15.34, "payout": 115, "blessing": "neutral", "text": "Project Update I didnt even notice but all the changes i did i the last patches never got shipped so this one is about the last to changes which were adding modals, creating new UI and removing AI code check it out https://poorup.jeremy-d.hackclub.app/", "repo": "https://github.com/jeremy341/Poorup/", "demo": "https://poorup.jeremy-d.hackclub.app/"}, {"ship_num": 3, "ts": "2026-06-17T14:42:48Z", "hours": 17.0, "multiplier": 14.39, "payout": 244, "blessing": "neutral", "text": "Poorup Poorup is a real-time multiplayer board game inspired by Richup(Monopoly), playable entirely in the browser What did I make? A full multiplayer board game running on a Node.js server with Socket.IO for real-time communication. The client is pure HTML, CSS, and JavaScript, no frameworks which is stupid if I look back on it . Features include: Room-based lobbies with a shareable room code Full Monopoly-style rules: buying, renting, building houses and hotels, mortgaging, and trading Live auctions with a countdown timer when a property is declined Configurable game rules per room (double rent, vacation cash, even build, auction, mortgage, randomized turn order, no rent in jail) Reconnect support — if you disconnect mid-turn, you can rejoin and resume In-game chat Automatic room cleanup when everyone leaves What was challenging? Shared states across multiple clients. Every player action, rolling dice, buying a property, placing a bid, has to be read server-side, broadcast to everyone, and reflected correctly on each client without race conditions or desync. Getting that right, especially during edge cases, took a lot of work. Edge cases in disconnects. A player disconnecting mid-auction is a different problem than disconnecting on their turn, which is different from the host disconnecting entirely. Each case needed its own handling: timers need to be cleared, pending actions need to be resolved, and remaining players need to stay in a valid game state. and i need alot of time and a bit of AI to fix that for me. Building a complete game UI with vanilla CSS. No component library, no utility framework — every modal, toggle, property card, and animation is hand-written. Honestly needed a lot of AI help here. Probally should have used a libary if I look back at it but it was fun to do it in plain CSS also for anyone wondering why the favicon is the one from vite i never deleted it and i wasnt in the mode to redesign a new one and tried to use the board map but that didnt work for some reason. What am I proud of? The architecture. The game logic lives entirely in gameLogic.js and has no knowledge of sockets or HTTP. The server in server.js wires events to logic calls and broadcasts the results. That separation made the codebase much easier to debug than it would have been otherwise but i needed AI to implement the idea i had the idea but wasnt quite able to do it. How to test it git clone https://github.com/jeremy341/Poorup.git cd Poorup npm install npm start Then open http://localhost:8080 in two separate tabs or browser windows.", "repo": "https://github.com/jeremy341/Poorup/", "demo": "https://poorup.jeremy-d.hackclub.app/"}]...
|
[{"post_id": 81740, "ts": "202 [{"post_id": 81740, "ts": "2026-10-22T09:55:56Z", "hours": 9.6928, "text": "Rework #1 Now you could be asking yourself? What have i done in the last 8 days to not post? Well Iam nearly finished with the full rework off all UI, Bug fixing and introducing new features, Chart Engine So i redid the whole system for charts and decided to build my own, because though i had one which worked it looked horrendous and really didnt fit poorup, you can see the new chart engine in the screenshot Game history I redid the whole entire game history system, because to be honest it was heavily vibed including its Ui and while cheking it, it looked like trash so I sat myself down and worked tiresly to fully redo it, and I even implemented the new chart system into it, Modals, Modals, Modals So I REDID NEARLY EVERY SINGLE MODAL IN THE GAME to provide a better User experience this took hella long and while doing it i noticed i had hackatime tracking off, because i had been working on some personal projects, hence the reason I only posted now because I lost so many hours, #Next Features Well to be honest there really arent anymore features i can add, the only thing left is fixing bugs and preparing it for the release and advertising it on reddit"}, {"post_id": 79607, "ts": "2026-10-14T18:07:25Z", "hours": 10.3072, "text": "Devlog after ship So after getting hella positive feedback regarding poorup which i highly appreciate my aim is to now make it have an even better user experience and etc. why? cause from the feedback i got, there are 3 areas I need to tackle, UI, game logic which is to complex and the User experience including rules and etc, Full redesign of the ingame lobby So after getting feedback that the board was to smallwhich was kinda expected and that the whole game is just clutered which i also assumed would happen cause all the features dont fit into the game i have done the following. I have redesigned the full ingame lobby with a new layout further inspired by richup(didnt want to do this but they have the most optimial layout) I have also redone the whole entire admin window cause to be honest it was horrondous and hard to use, and also just some small changes all around full redesign of modals so after doing the lobby i have now decided to fully redo a lot of the modal to have a better layout and etc so they are way more user friendly and acttually easy to understand, this also included cutting alot of features from certain modals because they just made them to complex and hard to use Cards and airpots this was something i was orrignally planning to release in the last ship but i just decided to ship it with this one i have finnaly added the option to buy new bank cards which you can use to get benefits like cashback of 10% on purchsees like rent payment suprise cards and other stuff, and I also added the option to use airpots to fly from one point to another and allow players to set the prices, Bots After reflecting a bit on my ai usage for the bots i decided to fully plug the whole programm into a repo which visualises it to see if it checks out with my mental map and I noticed so much slop which I would have never noticed before, this includes the whole Bot logic which i have probally never looked at cause i knew i wouldnt be able to code them. Though i probally should have cause this is the biggest slop i have ever seen and It introduced so many bugs which the ai couldnt find Next steps Right now all these changes are locally and not on github which are around +17000 lines of code and my aim is to further clean this up and fully push it with a new domain which is alredy online but will be kept hidden. here are soem before and afters, the more clutterd ones are the befores and the simplifyed ones after"}, {"post_id": 75006, "ts": "2026-09-28T20:36:43Z", "hours": 10.8294, "text": "Poorup Redesign - Devlog #11 (FUCK MY LIFE) I am geniunly so tired of this project and my life in general i was so busy in the last few days cause of school and after shool clubs. This phase was mainly about recoding the Bot engine by hand, and updating the stock market modal inside the game also added New Ui for theme chooser and music and also added more sound tracks. I also redid statistics tabs in profile by hand and added better match history tracking Bot engine To be honest to Bot engine was so much AI stuff that i genuinly didnt understand what it was build on and how that is why I decided to take some time to read and research all the papers its build on and how it works. I then rewrote large parts of it to improve it and also found mutipile bugs in the logic of how it works and how it assigns values New account and preferences tab I fully redid some parts of the accounts and prefences tab to now allow for easier choosing of themes and also worked on the music engine so the music loops and youre able to choose different music depending on the theme. #Statsics tab I redid the whole tab as I found it quite stacked with 12 boxes for statsics and decicd to now add internal tabs to make it look cleaner this was a quick 30 minute changes as I didnt change logic but just frontend Next Steps Hopefully shipping adding HCAI and testing the AI bots and further UI refinement on tablet UI and 1440px desktop cause these are 2 of the most weirdest sizes https://poorup.jeremy-d.hackclub.app/ also if anybody wants to check it our but it is nowhere near finished so dont expect anything"}, {"post_id": 73301, "ts": "2026-09-24T20:06:52Z", "hours": 28.7353, "text": "Poorup Redesign - Devlog #10 Iam aware this phase is 30 hours this is just cause i used hella AI and didnt want to count it towards my payout. this phase mainly about finishing touches running mutipile tests suits playing some games and finishing some things also fixing Ui and redoing the Ui of the Music First of all I added music for each of the 6 theme with a secondary theme which you can select under account and preferences I also made it easier to spot the different themes as they were hella hidden to be honest. Deactivation of palor patrol Though i didnt want to this I needed to deactivate palor patrol as it was simply impossible to use I checked m code in detail used and really did everything but I couldnt find the bug which makes it unplayablle so as long as I cant manage to fix it I have to deacitvate it. Next Phase pushing everything on nest setting up a piepleine so nest automatticaly pulls everything I push onto main in my repo and finnaly realsing it with thhe bots for players to use."}, {"post_id": 70576, "ts": "2026-09-19T11:55:06Z", "hours": 11.6328, "text": "Poorup Redesign - Devlog #9 this phase was mainly about adding some missing things fully balancing everything also used the new model jev from typesafe as it was a perfect fit for the task. Admin Dashboard I now added a section in the admin Dashboard fully centered around the Bots which allows for dropping in any provider and choosing the model and see the request if theyre failing or not and etc this took quite a while as I coded this myself again as I wanted to practice a bit though I still needed Ai help as Iam so trash at js Removing TOS pages As i mentioned in the last devlog i have now decided to remove the TOS pages as they were jst not good looking and not complete and not needed. Music system I decided to remove the music player and rather make it so 1 music track is there for each theme and my next step ix expanding the profile page to allow choosing another music track as 12 are available in total but only 6 are used rn. I also decided that I am going to move the Theme chooser somewhere else as people get no indicator rn to find it New Idea for the Future Also I had a great Idea which i can incoperate into this but after the next ship. Its training a custom ml model on all the matches played by people and then incoperating it in the game. Because essentialy it would be a custom AI/Bot that is able to play monopoly as good as possible new features I also added the option to download all the data cause i noticed its saved on the server and maybe smb wants to download it will then be in a json. I also added the option to add an recovery email, because my plan is to allow people to sign up without email but they still need an option to recover data if needed I also added the option to rovoke all otehr session tokens then the onnes youre logged into rn, so essentially log out of all other devices and server sessions Next steps Cleaning up Ai code and reading through it all, 1 or 2 adjustments in Ui for example the global event banner needs to be relocated or the graphs for match history need to remade. Also the ranking page needs a little redesing. The next one will be the LAST ONE cause i cant deal with stardance anymore all my projects are getting rejected for dumb reasons, so this will be the last devlog and if it does not get accepted iam relocating somewhere else."}, {"post_id": 68664, "ts": "2026-09-15T14:29:22Z", "hours": 15.3047, "text": "Poorup Redesign - Devlog #8 this phase mainly about consolidating the backend and adding a New admin only dashboard which will allow to analyze things easier for balane patches and etc in the future. This Phase was written only by hand hence the long time, normally I would use AI to speed up the process but I wanted to get some practice in. Also added legal and TOS pages Backend I found mutipile bugs such as simple Game bugs to not so simple leackage problems and other stuff which took quite some time to fix by hand and this really shows how I will probally pause using AI for coding after this project for a while Admin Dashboard I created this Dashboard so I would be allowed to pracitally analyze everything from how certain things affect the game and for example analyze them to see if they need fixes, balances or even remove them entirly. I also added things like seeing a rough strucutre of where my player base is from. If anybody is abusing the game somehow or bot traffic. Tos Pages These took quite long and were quite the hassle but I did it. though i am debating jus tdeleting them as I couldnt fill them out entirley as certain information is needed which would then make them 100% fool proof I forgot I also updated the Snow Theme and added music for each theme with a small music player in the bottom left though I just noticed I placed the icons wrong should be a quick 2 line fix Next Steps do the last fixes finnaly test the AI bots as they are fully setup but not setup do some balancing and realese it The next post should really be the last. Hopefully."}, {"post_id": 66650, "ts": "2026-09-12T14:36:54Z", "hours": 16.8883, "text": "Poorup Redesign - Devlog #7 This phase was mainly about doing a full audit over the game, fixing bugs which were still hidden inside the server and UI, and making the whole project easier to trust before the next merge. Finalising Bots, adding, themes adding new suprise features and more. Themes I decided to create 5 more themes which will fully change the look of the game, for the 5 i decided on 5 directions first of light mode, and then the 4 seasons so summer,autumm, winter, and spring. These took quite some time to create but I think they came out quite decent though they still need cleaning up Ranking Seasons I have now added ranking seasons which are 1 month each if you manage to rank on the leaderbaord at the end of the season you get a special cosmetic(newly added system) and a special Title Cosmetics I added a full cosmetics system and the ranking system so you can now get cosmetics from 2 places, either by getting them at the end of the season form the leaderboard or by getting them from achievements Card Upgrade I also now added the features to upgrade your bank account, if you pay enough money you can upgrade your card for 1000$ this gives you a card with 5% cashback which is the Spaarkasse karte(german Bank) and the nex level is the amex black card wich give you 10$ cashback and amex points which you can use for flying. Gambling UI I also decided to now give the gambling UI an animation it now has the same kind of case opening animation as CS2 so the roulette which goes form right to left. Plane station card Also made it so that you can now use the airplanes to skip things so you can fly to another station but of course you will have to pay alot and you have to pay a landing fee. If a player owns an Airpot he can decide the flying fee himeslf and the landing fee which means he could extort people if he is smart enough Quick Table I did some changes to Quick Table as it used to create a new public room every time. It now checks the live public room directory first, joins the most suitable open table, retries if somebody fills it during the join, and only creates a new Standard-40 room when no table can be joined. Private room codes are never exposed and the server still makes the final decision. Favicon I also designed a quick little favicon which is Just a P with a box around it but it looks quite good Music Candidates I am now searching for new Music for each theme so music changes with the theme Next Steps Cleaning up the UI one final time trying everything out and finally realsing the Beta and promoting it on reddit."}, {"post_id": 63820, "ts": "2026-09-07T19:51:24Z", "hours": 5.0128, "text": "Poorup Redesign - Devlog #6 This phase was mainly about adding more depth to the player interactions, improving the bot system, and making the rankings feel more alive. Deal Negotiation I redesigned the deal flow so trades, loans, equity, and hybrid deals all work in the same way. When you receive a deal, a modal appears with accept and negotiate. If you close it, the deal does not get declined and stays inside the Finance rail. Both players can now see the same deal collapsed in Finance. The receiver can negotiate, while the sender can adjust or cancel the deal. You can open a full read-only view, change the parameters, and send the new version back. The server also checks old deal IDs so an outdated modal cannot change a newer deal. Sponsored Purchases I also added sponsored purchases. If a player cannot afford a property, they can ask the table for help. Other players can reserve contributions, and once the full amount is available, the buyer accepts and is forced to buy that exact property. The money is automatically returned if the request is canceled, the property changes owner, or a player disconnects. It is not a loan and does not create equity. Bots I continued improving the AI and no-AI bots. The bots now receive more context about the board, current obligations, loans, events, opponents, future rent risk, expected cash flow, and their own previous decisions.AI bots can now also counter trades, negotiate player contracts, choose debt rescue actions, and make auction decisions. If the AI provider runs out of credits or fails, the no api key AI takes over Rankings I added recent trend indicators to the ranking rows, so you can see if a player is moving up, down, or staying flat. I also added a seasonal ranking scope based on the current calendar season. Rules Fixes I also fixed the Double GO setting so landing exactly on GO now pays the boosted amount, while simply passing GO still pays the normal amount.TestingI expanded the tests and ran long bot campaigns with auctions, loans, casino, market, global events, sponsorships, and negotiations. The latest regression suite passes and the longer 2,500-game campaign had zero stalled games. Next Steps The next major step is making the bots simulate several complete future turns and improving long-term negotiation behavior. After that I want to add deeper browser testing and seasonal ranking rewards. Also to lazy to do screenshots of new UI so you will get everything in the next devpost"}, {"post_id": 63109, "ts": "2026-09-06T18:42:52Z", "hours": 11.5353, "text": "Poorup Redesign - Devlog #5 This phase was mainly about fixing all bugs still exisitng, refactoring further with codescene and letting AI run over my code, also fixed some small missing features and simple bugs myself. Choosing Icon I noticed a bug in which because of logic I made before setting up custom icons the programm mapped custom icons people created onto persets and blocked them so for example your icon had red in it, the game decided to map it onto the red preset in the backend blocking it but showing yours in game, this came because I never rewrote this section after introducing custom icons. Ownership icon Before this change owenship on board was only shown with a simple like quadrat in the top right corner of the tile in the color you picked this is also something left over from the old preset logic. I decided to make it so It shows a smaller version of the face of the player which makes it look a lot cleaner. Missing Buttons This was mainly because I let AI write to much of my code, the finical trading tab which is centered around equity and everything missed a dropdown to choose who you send the trade to and even the button to send the trade which was a dumb oversight on my end. I also added a simple backend system for the dropdown inside that modal to only show the propertys a person owns. Bots I also continued working on the bot system though this was mainly watching tutorials and brainstorming further Next Steps Fix last bugs, fully add bot system and make sure UI looks good to release the first beta test hopefully the next post will be the last"}, {"post_id": 62110, "ts": "2026-09-05T11:15:14Z", "hours": 13.0397, "text": "Poorup Redesign - Devlog #4 This phase was mainly about setting up codescene doing a full restructuing with the help of AI and fixing bugs and adding missing features. I also added a simple, gambling and stock market system. Bots I first started with setting up the initial idea of bots so to the UI and a bit of the backend logic for bots and how they will interact with the game iam nowhere finished and I havent tried it out yet. Codescene After checking out the github studentpack again after a while I saw codescene, which is a code reviewer similar to coderabbit. I struggled a bit with the Setup but after running an analysisi I noticed how abysmall my codebase really is and how its missing structure, archtiectuer and etc, for example sepearting certain getures from game logic.js and creating their own thread for it. I also setup a full pr pipieline which I can use with my AI agents which aim will be fixing my architecture, and finding bugs before i push them. bugs I ran Qwen 3.8 flash on my pr pipileine with codescene and let it work indepnedlty to full restructer my codebase so the results are better and I have better architectural design I also let it fix any bugs it found. Bugs I found While trying out the game i found mutipile BUGS one of them affecting my secret minigame palor patrol. For some reason I was losing hearts for no appearent reason. The reason behind it was that even though UI was hidden the helicopters were still flying through. For some reason the heart bug still exists afterwards and even the AI isnt able to find out what it is so Iam completating making architecture changes to it. #Gambling I added a smile gambling system where you can bet money on a roulete on red, black, and green I didnt add any animation for it as I found it unecessary and I also made sure iam legally clear to make sth like this Stock market I created a simple stock market tab and backend which allows people to buy indexes of a property and made sure to connect it with global events so global events can affect the stock market but that is nowhere near usable. Next Steps Iam going to let my AI continue improving my codebase with codescene and continue the Stock market and afterwards add the bots."}, {"post_id": 60301, "ts": "2026-09-02T16:03:55Z", "hours": 10.9608, "text": "Poorup Redesign – Devlog #3 This phase was about expanding the social side of Poorup, adding more depth to the game, and planning future systems that make every round feel more alive. Social, Rankings, Achievements I added a complete friend system. Players can search for unique usernames, send and accept friend requests, remove or block players, report users, invite friends to rooms, and view public profiles without leaving the lobby. Profiles now include statistics such as wins, win rate, games played, average money, bankruptcies, achievements, and match history. I also added global rankings for wins, win rate, games played, achievements, and other statistics. Rankings and Social are now independent tabs instead of modals, with wider layouts that use the available screen space more effectively. Achievements now have custom pixel-art and SVG icons, rarity levels from Common to Mythical, filters, dates, categories, and clickable detail modals. Mythical achievements are extremely rare and can trigger a server-wide announcement for every player. Easter Egg I added the hidden Parlor Patrol minigame. Pressing CTRL + P on the home screen opens a secret mode where you shoot down police helicopters, planes, and drones. It includes custom explosions, animations, sounds, score tracking, and a secret achievement. Global Events Global Events are rare events that affect every player instead of only the person who landed on a tile. They can be triggered by round conditions or Surprise cards and can last several rounds. Ideas include: Housing Bubble Pop Credit Freeze Inflation Spiral Bank Run Interest Rate Shock Airport Strike Energy Crisis Tax Scandal City Election Rent Control Tourism Boom Supply Chain Breakdown Events can combine with each other, create unexpected situations, and unlock secret achievements. I also want a global-event setting that is simply on or off, while event strength and duration scale with the round length. Rules Page I added a complete Rules tab designed like a pixel-art game manual. It explains the board, movement, properties, loans, cards, achievements, global events, social features, and settings. It uses an internal book-style scroll so the main application does not become a long scrolling page. Future Systems I am also planning a casino system using virtual money, with red, black, and green bets where the odds are not equal. Another planned feature is a fictional stock market connected to properties, countries, airports, utilities, and global events. Events could crash markets, increase rent values, affect airports, or create temporary investment opportunities. I also want to add unethical and outrages bank loans with high interest, strict repayment rules, and serious consequences. Music/sound icons I also added simple music and sound icons for the buttons instead of having the music on/off text Next Steps The next phase will be making these systems work together while keeping the game balanced, and also adding AI bots which utilise AI like deepseek v4 and so on so they able to actually judge the situation and think of possible ways for them to win. The aim is to use hcai to power them. I will also add normal BOTS as a fallback if my usage runs out"}, {"post_id": 58798, "ts": "2026-08-31T11:42:39Z", "hours": 9.8108, "text": "Poorup Redesign – Devlog #2 This phase was about continuing the complete redesign of the website, deciding on a UI theme, and implementing a new feature that I had wanted from the start but was not advanced enough to create before. New UI I am very proud to announce a complete redesign of the application. I decided to fully embrace a pixelated theme, and I personally think it looks great. It is genuinely one of the best UI systems I have ever designed. New Feature I decided to expand the trading system. You can now give out loans in exchange for premiums, equity, money, and more. This allows you to create fully customizable loans, such as: I give you $200 for 30% permanent equity in this spot. This means that you have to pay 30% less rent when you land on it and gain 30% of all rent paid on that plot. This is a system I have never seen in a Monopoly game, and I wanted to implement it from the start when I first had the idea for Poorup. New Feature #2 I have also decided to take the advice I was given and implement a room system. This allows players to join and create rooms, as well as make them public or private. I also added a quick-table feature that matches you with other people who have pressed the button, allowing you to play a quick round with random players. New Feature #3 I have created a complete profile system. You can now create a profile, view your statistics, win percentage, average money, and more. You are also able to create custom 32×32 icons to use while playing the game. New Feature #4 I also decided to add sounds and an open-source soundtrack I found called Pondering the Cosmos . which i think fits my new theme perfectly but maybe iam going to change it Next Step AI Bots The next Step will be adding bots but normal bots are boring they are just glofired search engines why i want to be a bit creative. I will use hackclub ai provider and give the bot a brain by combinging them with an AI like deepseek v4 flash this means the bot will be able to check how is he performing what are the most logical steps sell buy properties and trade and if wanted even chat with the user to make a deal would anybody like that?"}, {"post_id": 57234, "ts": "2026-08-29T10:31:03Z", "hours": 1.5744, "text": "Poorup Redesign So after my last ship i read through all the reviews and have decided to continue this project even though i really didnt plan for that. So there were 3 addition people wanted. A new UI, being able to join random people, better Animations and a Dev mode to test in solo player possibly with mods. What did i do? So i first started with thinking of a new design route so i asked chatgpt for some references of a good design. I decided on making the Whole Ui pixellated similar to the Arcade style and fully redesingen the SVG witth and now iam going to go over it and adjust it to fit ours. Of course this took like around 6 hours but I use figma on desktop and the browser tracking of hackatime doesnt seem to work how do you like the new svg? Next Steps Next Steps i redesignen the Full Ui to fit this pexelated style and making sure it looks good"}, {"post_id": 14594, "ts": "2026-06-23T19:20:12Z", "hours": 5.6261, "text": "Project Update: Bug Fixes Overview This phase was all about polishing the user experience, squashing gameplay bugs, and adding new repository documentation. After getting feedback I decided to change The whole UI Dynamic Theming & UI Improvements One of the major frontend improvements in this sprint was fixing the player icon chooser button functionality in the web interface. Fully redesignen the Front-End and more. I first of all started with replacing my .root with some new colors which are greenish. I also added some simple fade in/out animations to all Popups. Another bug was that it couldn’t quite fit in a screen of the size 1980 x 1080. I fixed that by making it possible to scroll down so everything you need for the game is shown on your screen. The way i tested it is by local hosting it and then pressin F12 in the browser and then you could adjust the size of the Window which was pretty neat. Also fixed a lot more of UI bugs such as weird buttons and more but this was the important stuff. Squashing Gameplay Bugs I knocked out two major bugs in this update: Trading System Fix: There was a bug where it wasnt possible for people to only request something without giving anything or make only money transactions so I fixed this. Special Property Popups: I resolved a rendering issue with the popups for special properties, specifically the Airports and Companies (Utilities). Now, when a player interacts with these tiles, the modal correctly pulls the specific data object and displays the unique rent calculations and purchase prices. Documentation Revamp I updated the README.md to ensure the decumentation was on point for anyone cloning the repo. I refactored and renamed SHOWCASE.md to Instructions.md . This provides a much clearer, step-by-step guide on how the game operates and how to get the local server running instead of just showcasing the Repo more. Conclusion The feedback was essential and really showed me how sloppy I worked it should now work perfectly even though i couldnt test it for 4 people"}, {"post_id": 11340, "ts": "2026-06-18T15:32:39Z", "hours": 1.8406, "text": "Update: UI/UX Fixes, Auction System Fixes, and Property Manager Integration FInal This update focused on providing a better user experience and just making it less buggy Key Changes 1. UI/UX Improvements Refactored layout components to improve visual consistency. Updated navigation paths so it makes more sense for the User and is just more logical Adjusted CSS rules to improve the game across different screen sizes. 2. Auction System Fixes Addressed synchronization issues with the auction state. Fixed logical errors in bid processing and countdown timers. 3. Property Manager Integration Fixed the Property Manager feature, allowing users to track and organize their properties. Integrated the property database schema with the existing auction mechanisms. Created user views for listing and editing properties. So just new UI 4. General Bug Fixes & Stability Cleaned up left over parts of old system"}, {"post_id": 10630, "ts": "2026-06-17T14:13:23Z", "hours": 2.5769, "text": "Poorup — Production Ready Over the past few days I’ve been doing a full production-readiness pass on Poorup . Here’s what I worked on: Bug fixes — Fixed auction edge cases where a disconnecting player would leave a ghost bid, locking the game Memory leak prevention — Added a garbage collector on the server to clean up empty rooms after 10 minutes UI polish — Fixed text cut-off in buttons and settings toggles, improved layout consistency across screen sizes Layout centering — The game board is now properly centered vertically and horizontally in the viewport Accessibility — Added focus-visible styles for keyboard navigation New setting — Exposed the “Double rent” toggle in the UI (the rule already existed in the engine) Code quality — Added JSDoc comments to core server classes, removed dead code The game is now polished and stable. Im shipping it"}, {"post_id": 8803, "ts": "2026-06-14T16:57:35Z", "hours": 0.465, "text": "Overview Today I worked on the front end an am basically finished with the easy stuff Iam now going to add the player icon and etc Front End I designed my front end and i think i can say that I am pretty good at basic JS/HTML/CSS and this project teached me alot Iam probally going to wrap it up in the next 2 post and focus on smth else. Monopoly repo After resarching a bit i found another open source monopoly game and my plan is now to copy some backend logic from it but i need to adjust it because his game is made to be playable localy and mine online so it will take same adjustment #Backend I added a Room system with the help of mutipile videos in which a random room code is generated and the server saves the generated room code making it possible for another use to insert it. The code will be if the round was ended."}, {"post_id": 8249, "ts": "2026-06-13T18:30:59Z", "hours": 2.8419, "text": "Overview Over the last few days, I’ve been triying to refactor my project, but i realised something I killed it i refactored it so often that i lost sight of the real goal and will proablly start from scratch restarting it from 0 i designed and svg file but just couldnt implement the right way. Cleaning the SVG My biggest headache was the game board. I designed a beautiful, detailed map in Figma, but exporting it as an SVG just made things difficult i tried making i clickable but i didnt know how to and i found no totorials regarding this so i will probally just create a board using html and css or maybe look for solution using ai Current System Status At the moment i have decided to refractor to vue by advice of some friends and ai because it makes the backend easier but i will proablly change back, because iam realising Iam making the project more complex than it has to be also. Conclusion I just wasted time trying to learn new stuff an refractoring and trying to not use ai. I would like for some adivice which ai I should use and if I should stick with vue or stay with or change back to default also this made me reflect on what kind of perfectionist iam an I will probally wrap up this project in the next few days because I realised front end is not for me I will continue learning it but will soon work on either python or C project after. I will just add the missing features with Ai"}, {"post_id": 6430, "ts": "2026-06-10T20:16:01Z", "hours": 0.6117, "text": "#Overview So today i didnt really code just refactored again and went back to css and decided to design all design elements in figma. It was pretty easy and II am now qustoning why i didnt do that instead also i only copied these 2. I will make my own streets afterwards and i also decided to redesign the website because it realy just a copy and i dont want to be sued but the board will probally look the same just different countries and maybe prices need to look for balancing and how it is normally in monopoly. But this probally going to take 2 to 3 days cause i really dont got any time in the next few days."}, {"post_id": 5789, "ts": "2026-06-09T18:22:00Z", "hours": 0.7531, "text": "Project Update: The Great Refactor & React Integration 📋 Overview Damn this looks trash just a small update and i jsut noticed tailwind actaully looks like trash are there any alternatives because i didnt expect it to look this bad in comparison to before and yes i do know its looks aigenrerated but i did myslef also tailwind is pretty easy if you get the hang of it just looks trash maybe going to watch some tuts cause i cant upload the final product like this."}, {"post_id": 5743, "ts": "2026-06-09T17:20:02Z", "hours": 1.3414, "text": "Overview This phase was a major point for the project. After successfully implementing the lobby chat and the 11x11 Monopoly board using Vanilla JS and CSS Grid, I realized that managing the game states (turns, money, properties, transactions) in Vanilla JS was going to lead to unmanageable spaghetti code and was way to hard. To keep the project clean and professional, I decided to perform a complete “hard reset” and refactor the entire frontend into a modern React Single Page Application (SPA) utilizing Tailwind CSS v4 [1.1.1, 1.1.8]. I always though about using it but found it weird and dififult for a beginer The Great Redesign Instead of keeping duplicate file structures or nesting my React app in a subfolder, I decided to do a complete wipe of the repository and initialize Vite directly at the root of my Poorup folder [1.1.1]. My backend directory ( server/ ) with the working Socket.io logic stays at the root level, sitting side-by-side with my brand-new React source directory ( src/ ).Because i didnt want to rewrite that all Tailwind v4 & Vite Setup (React Redesign - Lab 1) I verified that the setup is 100% correct by creating a basic functional component in src/App.jsx and rendering a test heading styled in large, bold, violet text using Tailwind v4 utility classes [1.1.8]. It compiled instantly and loaded perfectly in the browser. Next Steps Now that the modern React + Tailwind ecosystem is up and running at the root, I am starting Lab Challenge 2 (React Redesign) . I’ll be creating a dedicated <LandingScreen /> component, managing the nickname input using React useState hooks, and connecting Socket.io to React to emit player connection data back to the server [1.1.1, 1.2.6]. You know lab challenges for this i will watch some more videos leanr more js and learn react if possible Conclusion Deciding to start over from a blank folder was tough, but it was absolutely necessary. The codebase feels incredibly clean and changing to React will save me massive amounts of time as I start building out the actual Monopoly gameplay. But i now learned alot in the time i decided to atleast built the lobby and board in vanilla js,css and html. Also anybody knows an ki which is good in front end because i just realised iam trash in front end and ki is too"}, {"post_id": 5131, "ts": "2026-06-08T20:23:58Z", "hours": 1.7286, "text": "Overview This phase was important even though it was short. I transitioned from basic static mockups to building a fully functional, real-time multiplayer lobby system. I resolved tricky logical bugs and fought port conflicts, I also expanded my knowledge on js and am probally going to need to take a break to really learn all of js and will soon watch a 22 hour tut. Fixing the SPA Screen Switch (Lab 9) I started by tackling the dynamic transition from the login screen ( #landing-screen ) to the lobby screen ( #lobby-screen ). Space in HTML ID: I accidentally wrote id=\"landing screen\" (with a space) in my HTML, which broke my JavaScript’s querySelector because IDs cannot have spaces. Once I replaced the space with a dash ( id=\"landing-screen\" ) Now it works perfectly fine. Port Conflicts Right after getting the transitions working, my local server crashed on Port 3000. My terminal crashed and restored its history, leaving a Node process running in the background and locking the port i still dont know why it does that just looked on reddit and youtube. To easily bypass this without fighting Windows process managers, I updated my server.js and local client connection to run on Port 3005 . It started up instantly. Designing the 3-Column Lobby (Lab 10) With the screen switching working, I redesigned the lobby HTML to match the responsive 3-column layout of Richup.io [1]. I used Flexbox ( flex: 1 and flex: 2 for the center) to align: Left Column: A placeholder invite link input and a scrollable chat area [1]. Center Column: The player greeting, token color picker, and “Join Game” button [1]. Right Column: Game settings (dropdowns for starting cash) [1]. Structuring this required a bit of tweaking but not to hard. Interactive Color Picker & Socket Events (Lab 11) Next, I tackled the token selection grid [1]. I styled four distinct color circles (Red, Blue, Green, Yellow) in CSS and set up a .selected class that applies a thick white border and a glowing shadow. In client.js , I wrote a forEach loop that listens for clicks on each circle, removes the .selected class from all others, adds it to the active circle, and stores the selection in a global variable. On the server side, I set up a 'join-room' socket listener. Now, when a player selects a color and clicks “Join Game”, the client emits the color choice, and the backend successfully receives and logs it in the terminal [1]. Server-Side Multiplayer Sync (Lab 12) The most exciting part and hard part today was implementing real-time state synchronization. I declared a global activePlayers dictionary on the server to keep track of active sessions. When a user logs in, they are registered in the dictionary. When they choose a color and click “Join Game”, their color is updated, and the server broadcasts the entire updated list to all active clients via io.emit(\"update-players\") [1]. On the client side, I wrote a listener that clears out the #player-list and dynamically rebuilds it, coloring each player’s username text to match their selected token color. I also handled the 'disconnect' socket event to delete players from the dictionary when they close it. You can see the messaged in the terminal and yes it is antigravity but i dont use the ai and have only used it to refractor my notes, so i dont even have tokens anymore cause of the amount of notes i had. So i also decided i probally need to expand my file directory and iam thinking of using tailwind css or just using css and making custom icons using favicons and etc by using figma also i got approved for the Student github :)."}, {"post_id": 4397, "ts": "2026-06-07T18:32:25Z", "hours": 3.6853, "text": "Overview Today was massive for Poorup. I officially made the first steps into the website, creating the backend for the hompage and creating the CSS.. Transitioning From HTML to CSS I officially finished the basic HTML path on freeCodeCamp! It feels great to have the basic foundation down. I am still missing a lot of depth in semantic HTML and more advanced stuff, but I have enough of experienc to now build on it. I just need to learn some more js and CSS. I then watched some video regarding CSS and worked on it. I realised that CSS is really simple but involes alot of googling to find certain functions . I did one rooky mistake which was having the css file not in the right folder so it wasnt loading correctly and i was quite suprised Backend & Real-Time Socket.io Integration This is where the real engineering started today. Since Poorup is a real-time multiplayer board game, I can’t just use standard HTTP requests where the browser has to reload every time a player moves. I needed a permanent, open connection between the browser and the server. I set up a Node.js server with Express in server/server.js to serve my static folder. Then, I integrated Socket.io: Express Server: Serving the public folder on http://localhost:3000 . Socket.io Setup: Wrapped the Express app in an HTTP server and configured the connection listeners. Client-Side JS: Wrote client.js to capture input data and handle form events. The Struggle: I ran into a bug where clicking “Play” triggered the server connection even when the username field was completely empty, which bypassed my HTML required attribute. After digging into my event listeners, I realized I was listening to the click event on the button instead of the submit event on the form . Since the browser’s native validation only checks fields during a form submission, the click listener was bypassing it. Switching my listener to form.addEventListener(\"submit\") fixed the empty-name validation instantly. When I run node server/server.js now and type a name in the browser, the server terminal immediately logs the connection and prints the player’s name in real-time. Next Steps & Screen Switching Now that the backend is running and successfully communicating with the client, my next step is handling the UI transitions. Since we don’t want a full page reload (which would kill the WebSocket connection), I am working on setting up a Single Page Application (SPA) structure ,aksed ki what to do next by usign my earlier stated Lab approach in which i dont get code but how to do stuff and have to implement it. I am currently working on Lab Challenge 9 , where I will be wrapping the login screen in a #landing-screen div and the lobby in a #lobby-screen div. I’ll use JS to dynamically swap the .hidden class as soon as the server acknowledges that a player has successfully joined. Conclusion Overall, this phase was a huge step up from just writing static tags. I’m taking active notes on everything which you will later find in a second repo so you can build it your own with all the Lab challenges. I find it to be quite rewarding but now i have to lock in for school cause i got a vocabulary test in 2 days. I will probally upload a demo soon an do some major changes to color, theme, name and etc for copyright reasons"}, {"post_id": 3686, "ts": "2026-06-06T18:51:12Z", "hours": 2.2747, "text": "Stardance Progress Log: Poorup Development Current Progress Learning Path: Almost completed the Basic HTML section on freeCodeCamp. Note-taking: Iam taking personal notes on semantic HTML, document structures, tags, and form elements. My Learning Methodology (AI as a Mentor) To make sure I actually understand every line of code I write, I am using a strict, self-guided approach to learning: First of all i have strictly said to the ai to never write code for me and never give me the answer and just show me how i could achieve it. Also the ai acts strictly as a mentor. It analyzes my goals and designs custom “Lab Challenges” formatted exactly like freeCodeCamp exercises (with Objectives, User Stories, and Test suites). Because i found this to be quite efective. Also i decided to install the live preview extenstion to see my code in person and debug it easiear. What I’ve Built So Far Landing Page Structure: Created a solid textual game menu and lobby framework in public/index.html using headings ( h1 , h2 ), paragraphs, an unordered list for features, and an ordered list for instructions. Interactive Elements: Added call-to-action buttons for joining and creating lobbies. Next Steps Currently working on Lab Challenge 2 given by the ai: The Player Registration Form to practice form validation, input types (text, radio, checkbox), and connecting labels with inputs via attributes. Once HTML basics are solid, I will start exploring basic CSS styling."}, {"post_id": 2926, "ts": "2026-06-05T20:35:05Z", "hours": 0.7811, "text": "I have now started with creating the Github and also learning some HTML with free Code Camp. I also decided to take some notes in a md file reading through the guides"}]...
|
Title: Poorup.io by @jeremy | Stardance
Devlogs:
Title: Poorup.io by @jeremy | Stardance
Devlogs:
I have now started with creating the Github and also learning some HTML with free Code Camp. I also decided to take some notes in a md file reading through the guides
Stardance Progress Log: Poorup Development Current Progress Learning Path: Almost completed the Basic HTML section on freeCodeCamp. Note-taking: Iam taking personal notes on semantic HTML, document structures, tags, and form elements. My Learning Methodology (AI as a Mentor) To make sure I actually understand every line of code I write, I am using a strict, self-guided approach to learning: First of all i have strictly said to the ai to never write code for me and never give me the answer and just show me how i could achieve it. Also the ai acts strictly as a mentor. It analyzes my goals and designs custom “Lab Challenges” formatted exactly like freeCodeCamp exercises (with Objectives, User Stories, and Test suites). Because i found this to be quite efective. Also i decided to install the live preview extenstion to see my code in person and debug it easiear. What I’ve Built So Far Landing Page Structure: Created a solid textual game menu and lobby framework in public/index.html using headings ( h1 , h2 ), paragraphs, an unordered list for features, and an ordered list for instructions. Interactive Elements: Added call-to-action buttons for joining and creating lobbies. Next Steps Currently working on Lab Challenge 2 given by the ai: The Player Registration Form to practice form validation, input types (text, radio, checkbox), and connecting labels with inputs via attributes. Once HTML basics are solid, I will start exploring basic CSS styling.
Overview Today was massive for Poorup. I officially made the first steps into the website, creating the backend for the hompage and creating the CSS.. Transitioning From HTML to CSS I officially finished the basic HTML path on freeCodeCamp! It feels great to have the basic foundation down. I am still missing a lot of depth in semantic HTML and more advanced stuff, but I have enough of experienc to now build on it. I just need to learn some more js and CSS. I then watched some video regarding CSS and worked on it. I realised that CSS is really simple but involes alot of googling to find certain functions . I did one rooky mistake which was having the css file not in the right folder so it wasnt loading correctly and i was quite suprised Backend & Real-Time Socket.io Integration This is where the real engineering started today. Since Poorup is a real-time multiplayer board game, I can’t just use standard HTTP requests where the browser has to reload every time a player moves. I needed a permanent, open connection between the browser and the server. I set up a Node.js server with Express in server/server.js to serve my static folder. Then, I integrated Socket.io: Express Server: Serving the public folder on http://localhost:3000 . Socket.io Setup: Wrapped the Express app in an HTTP server and configured the connection listeners. Client-Side JS: Wrote client.js to capture input data and handle form events. The Struggle: I ran into a bug where clicking “Play” triggered the server connection even when the username field was completely empty, which bypassed my HTML required attribute. After digging into my event listeners, I realized I was listening to the click event on the button instead of the submit event on the form . Since the browser’s native validation only checks fields during a form submission, the click listener was bypassing it. Switching my listener to form.addEventListener("submit") fixed the empty-name validation instantly. When I run node server/server.js now and type a name in the browser, the server terminal immediately logs the connection and prints the player’s name in real-time. Next Steps & Screen Switching Now that the backend is running and successfully communicating with the client, my next step is handling the UI transitions. Since we don’t want a full page reload (which would kill the WebSocket connection), I am working on setting up a Single Page Application (SPA) structure ,aksed ki what to do next by usign my earlier stated Lab approach in which i dont get code but how to do stuff and have to implement it. I am currently working on Lab Challenge 9 , where I will be wrapping the login screen in a #landing-screen div and the lobby in a #lobby-screen div. I’ll use JS to dynamically swap the .hidden class as soon as the server acknowledges that a player has successfully joined. Conclusion Overall, this phase was a huge step up from just writing static tags. I’m taking active notes on everything which you will later find in a second repo so you can build it your own with all the Lab challenges. I find it to be quite rewarding but now i have to lock in for school cause i got a vocabulary test in 2 days. I will probally upload a demo soon an do some major changes to color, theme, name and etc for copyright reasons
Overview This phase was important even though it was short. I transitioned from basic static mockups to building a fully functional, real-time multiplayer lobby system. I resolved tricky logical bugs and fought port conflicts, I also expanded my knowledge on js and am probally going to need to take a break to really learn all of js and will soon watch a 22 hour tut. Fixing the SPA Screen Switch (Lab 9) I started by tackling the dynamic transition from the login screen ( #landing-screen ) to the lobby screen ( #lobby-screen ). Space in HTML ID: I accidentally wrote id="landing screen" (with a space) in my HTML, which broke my JavaScript’s querySelector because IDs cannot have spaces. Once I replaced the space with a dash ( id="landing-screen" ) Now it works perfectly fine. Port Conflicts Right after getting the transitions working, my local server crashed on Port 3000. My terminal crashed and restored its history, leaving a Node process running in the background and locking the port i still dont know why it does that just looked on reddit and youtube. To easily bypass this without fighting Windows process managers, I updated my server.js and local client connection to run on Port 3005 . It started up instantly. Designing the 3-Column Lobby (Lab 10) With the screen switching working, I redesigned the lobby HTML to match the responsive 3-column layout of Richup.io [1]. I used Flexbox ( flex: 1 and flex: 2 for the center) to align: Left Column: A placeholder invite link input and a scrollable chat area [1]. Center Column: The player greeting, token color picker, and “Join Game” button [1]. Right Column: Game settings (dropdowns for starting cash) [1]. Structuring this required a bit of tweaking but not to hard. Interactive Color Picker & Socket Events (Lab 11) Next, I tackled the token selection grid [1]. I styled four distinct color circles (Red, Blue, Green, Yellow) in CSS and set up a .selected class that applies a thick white border and a glowing shadow. In client.js , I wrote a forEach loop that listens for clicks on each circle, removes the .selected class from all others, adds it to the active circle, and stores the selection in a global variable. On the server side, I set up a 'join-room' socket listener. Now, when a player selects a color and clicks “Join Game”, the client emits the color choice, and the backend successfully receives and logs it in the terminal [1]. Server-Side Multiplayer Sync (Lab 12) The most exciting part and hard part today was implementing real-time state synchronization. I declared a global activePlayers dictionary on the server to keep track of active sessions. When a user logs in, they are registered in the dictionary. When they choose a color and click “Join Game”, their color is updated, and the server broadcasts the entire updated list to all active clients via io.emit("update-players") [1]. On the client side, I wrote a listener that clears out the #player-list and dynamically rebuilds it, coloring each player’s username text to match their selected token color. I also handled the 'disconnect' socket event to delete players from the dictionary when they close it. You can see the messaged in the terminal and yes it is antigravity but i dont use the ai and have only used it to refractor my notes, so i dont even have tokens anymore cause of the amount of notes i had. So i also decided i probally need to expand my file directory and iam thinking of using tailwind css or just using css and making custom icons using favicons and etc by using figma also i got approved for the Student github :).
Overview This phase was a major point for the project. After successfully implementing the lobby chat and the 11x11 Monopoly board using Vanilla JS and CSS Grid, I realized that managing the game states (turns, money, properties, transactions) in Vanilla JS was going to lead to unmanageable spaghetti code and was way to hard. To keep the project clean and professional, I decided to perform a complete “hard reset” and refactor the entire frontend into a modern React Single Page Application (SPA) utilizing Tailwind CSS v4 [1.1.1, 1.1.8]. I always though about using it but found it weird and dififult for a beginer The Great Redesign Instead of keeping duplicate file structures or nesting my React app in a subfolder, I decided to do a complete wipe of the repository and initialize Vite directly at the root of my Poorup folder [1.1.1]. My backend directory ( server/ ) with the working Socket.io logic stays at the root level, sitting side-by-side with my brand-new React source directory ( src/ ).Because i didnt want to rewrite that all Tailwind v4 & Vite Setup (React Redesign - Lab 1) I verified that the setup is 100% correct by creating a basic functional component in src/App.jsx and rendering a test heading styled in large, bold, violet text using Tailwind v4 utility classes [1.1.8]. It compiled instantly and loaded perfectly in the browser. Next Steps Now that the modern React + Tailwind ecosystem is up and running at the root, I am starting Lab Challenge 2 (React Redesign) . I’ll be creating a dedicated <LandingScreen /> component, managing the nickname input using React useState hooks, and connecting Socket.io to React to emit player connection data back to the server [1.1.1, 1.2.6]. You know lab challenges for this i will watch some more videos leanr more js and learn react if possible Conclusion Deciding to start over from a blank folder was tough, but it was absolutely necessary. The codebase feels incredibly clean and changing to React will save me massive amounts of time as I start building out the actual Monopoly gameplay. But i now learned alot in the time i decided to atleast built the lobby and board in vanilla js,css and html. Also anybody knows an ki which is good in front end because i just realised iam trash in front end and ki is too
Project Update: The Great Refactor & React Integration 📋 Overview Damn this looks trash just a small update and i jsut noticed tailwind actaully looks like trash are there any alternatives because i didnt expect it to look this bad in comparison to before and yes i do know its looks aigenrerated but i did myslef also tailwind is pretty easy if you get the hang of it just looks trash maybe going to watch some tuts cause i cant upload the final product like this.
#Overview So today i didnt really code just refactored again and went back to css and decided to design all design elements in figma. It was pretty easy and II am now qustoning why i didnt do that instead also i only copied these 2. I will make my own streets afterwards and i also decided to redesign the website because it realy just a copy and i dont want to be sued but the board will probally look the same just different countries and maybe prices need to look for balancing and how it is normally in monopoly. But this probally going to take 2 to 3 days cause i really dont got any time in the next few days.
Overview Over the last few days, I’ve been triying to refactor my project, but i realised something I killed it i refactored it so often that i lost sight of the real goal and will proablly start from scratch restarting it from 0 i designed and svg file but just couldnt implement the right way. Cleaning the SVG My biggest headache was the game board. I designed a beautiful, detailed map in Figma, but exporting it as an SVG just made things difficult i tried making i clickable but i didnt know how to and i found no totorials regarding this so i will probally just create a board using html and css or maybe look for solution using ai Current System Status At the moment i have decided to refractor to vue by advice of some friends and ai because it makes the backend easier but i will proablly change back, because iam realising Iam making the project more complex than it has to be also. Conclusion I just wasted time trying to learn new stuff an refractoring and trying to not use ai. I would like for some adivice which ai I should use and if I should stick with vue or stay with or change back to default also this made me reflect on what kind of perfectionist iam an I will probally wrap up this project in the next few days because I realised front end is not for me I will continue learning it but will soon work on either python or C project after. I will just add the missing features with Ai
Overview Today I worked on the front end an am basically finished with the easy stuff Iam now going to add the player icon and etc Front End I designed my front end and i think i can say that I am pretty good at basic JS/HTML/CSS and this project teached me alot Iam probally going to wrap it up in the next 2 post and focus on smth else. Monopoly repo After resarching a bit i found another open source monopoly game and my plan is now to copy some backend logic from it but i need to adjust it because his game is made to be playable localy and mine online so it will take same adjustment #Backend I added a Room system with the help of mutipile videos in which a random room code is generated and the server saves the generated room code making it possible for another use to insert it. The code will be if the round was ended.
Poorup — Production Ready Over the past few days I’ve been doing a full production-readiness pass on Poorup . Here’s what I worked on: Bug fixes — Fixed auction edge cases where a disconnecting player would leave a ghost bid, locking the game Memory leak prevention — Added a garbage collector on the server to clean up empty rooms after 10 minutes UI polish — Fixed text cut-off in buttons and settings toggles, improved layout consistency across screen sizes Layout centering — The game board is now properly centered vertically and horizontally in the viewport Accessibility — Added focus-visible styles for keyboard navigation New setting — Exposed the “Double rent” toggle in the UI (the rule already existed in the engine) Code quality — Added JSDoc comments to core server classes, removed dead code The game is now polished and stable. Im shipping it
Update: UI/UX Fixes, Auction System Fixes, and Property Manager Integration FInal This update focused on providing a better user experience and just making it less buggy Key Changes 1. UI/UX Improvements Refactored layout components to improve visual consistency. Updated navigation paths so it makes more sense for the User and is just more logical Adjusted CSS rules to improve the game across different screen sizes. 2. Auction System Fixes Addressed synchronization issues with the auction state. Fixed logical errors in bid processing and countdown timers. 3. Property Manager Integration Fixed the Property Manager feature, allowing users to track and organize their properties. Integrated the property database schema with the existing auction mechanisms. Created user views for listing and editing properties. So just new UI 4. General Bug Fixes & Stability Cleaned up left over parts of old system
Project Update: Bug Fixes Overview This phase was all about polishing the user experience, squashing gameplay bugs, and adding new repository documentation. After getting feedback I decided to change The whole UI Dynamic Theming & UI Improvements One of the major frontend improvements in this sprint was fixing the player icon chooser button functionality in the web interface. Fully redesignen the Front-End and more. I first of all started with replacing my .root with some new colors which are greenish. I also added some simple fade in/out animations to all Popups. Another bug was that it couldn’t quite fit in a screen of the size 1980 x 1080. I fixed that by making it possible to scroll down so everything you need for the game is shown on your screen. The way i tested it is by local hosting it and then pressin F12 in the browser and then you could adjust the size of the Window which was pretty neat. Also fixed a lot more of UI bugs such as weird buttons and more but this was the important stuff. Squashing Gameplay Bugs I knocked out two major bugs in this update: Trading System Fix: There was a bug where it wasnt possible for people to only request something without giving anything or make only money transactions so I fixed this. Special Property Popups: I resolved a rendering issue with the popups for special properties, specifically the Airports and Companies (Utilities). Now, when a player interacts with these tiles, the modal correctly pulls the specific data object and displays the unique rent calculations and purchase prices. Documentation Revamp I updated the README.md to ensure the decumentation was on point for anyone cloning the repo. I refactored and renamed SHOWCASE.md to Instructions.md . This provides a much clearer, step-by-step guide on how the game operates and how to get the local server running instead of just showcasing the Repo more. Conclusion The feedback was essential and really showed me how sloppy I worked it should now work perfectly even though i couldnt test it for 4 people
Poorup Redesign So after my last ship i read through all the reviews and have decided to continue this project even though i really didnt plan for that. So there were 3 addition people wanted. A new UI, being able to join random people, better Animations and a Dev mode to test in solo player possibly with mods. What did i do? So i first started with thinking of a new design route so i asked chatgpt for some references of a good design. I decided on making the Whole Ui pixellated similar to the Arcade style and fully redesingen the SVG witth and now iam going to go over it and adjust it to fit ours. Of course this took like around 6 hours but I use figma on desktop and the browser tracking of hackatime doesnt seem to work how do you like the new svg? Next Steps Next Steps i redesignen the Full Ui to fit this pexelated style and making sure it looks good
Poorup Redesign – Devlog #2 This phase was about continuing the complete redesign of the website, deciding on a UI theme, and implementing a new feature that I had wanted from the start but was not advanced enough to create before. New UI I am very proud to announce a complete redesign of the application. I decided to fully embrace a pixelated theme, and I personally think it looks great. It is genuinely one of the best UI systems I have ever designed. New Feature I decided to expand the trading system. You can now give out loans in exchange for premiums, equity, money, and more. This allows you to create fully customizable loans, such as: I give you $200 for 30% permanent equity in this spot. This means that you have to pay 30% less rent when you land on it and gain 30% of all rent paid on that plot. This is a system I have never seen in a Monopoly game, and I wanted to implement it from the start when I first had the idea for Poorup. New Feature #2 I have also decided to take the advice I was given and implement a room system. This allows players to join and create rooms, as well as make them public or private. I also added a quick-table feature that matches you with other people who have pressed the button, allowing you to play a quick round with random players. New Feature #3 I have created a complete profile system. You can now create a profile, view your statistics, win percentage, average money, and more. You are also able to create custom 32×32 icons to use while playing the game. New Feature #4 I also decided to add sounds and an open-source soundtrack I found called Pondering the Cosmos . which i think fits my new theme perfectly but maybe iam going to change it Next Step AI Bots The next Step will be adding bots but normal bots are boring they are just glofired search engines why i want to be a bit creative. I will use hackclub ai provider and give the bot a brain by combinging them with an AI like deepseek v4 flash this means the bot will be able to check how is he performing what are the most logical steps sell buy properties and trade and if wanted even chat with the user to make a deal would anybody like that?
Poorup Redesign – Devlog #3 This phase was about expanding the social side of Poorup, adding more depth to the game, and planning future systems that make every round feel more alive. Social, Rankings, Achievements I added a complete friend system. Players can search for unique usernames, send and accept friend requests, remove or block players, report users, invite friends to rooms, and view public profiles without leaving the lobby. Profiles now include statistics such as wins, win rate, games played, average money, bankruptcies, achievements, and match history. I also added global rankings for wins, win rate, games played, achievements, and other statistics. Rankings and Social are now independent tabs instead of modals, with wider layouts that use the available screen space more effectively. Achievements now have custom pixel-art and SVG icons, rarity levels from Common to Mythical, filters, dates, categories, and clickable detail modals. Mythical achievements are extremely rare and can trigger a server-wide announcement for every player. Easter Egg I added the hidden Parlor Patrol minigame. Pressing CTRL + P on the home screen opens a secret mode where you shoot down police helicopters, planes, and drones. It includes custom explosions, animations, sounds, score tracking, and a secret achievement. Global Events Global Events are rare events that affect every player instead of only the person who landed on a tile. They can be triggered by round conditions or Surprise cards and can last several rounds. Ideas include: Housing Bubble Pop Credit Freeze Inflation Spiral Bank Run Interest Rate Shock Airport Strike Energy Crisis Tax Scandal City Election Rent Control Tourism Boom Supply Chain Breakdown Events can combine with each other, create unexpected situations, and unlock secret achievements. I also want a global-event setting that is simply on or off, while event strength and duration scale with the round length. Rules Page I added a complete Rules tab designed like a pixel-art game manual. It explains the board, movement, properties, loans, cards, achievements, global events, social features, and settings. It uses an internal book-style scroll so the main application does not become a long scrolling page. Future Systems I am also planning a casino system using virtual money, with red, black, and green bets where the odds are not equal. Another planned feature is a fictional stock market connected to properties, countries, airports, utilities, and global events. Events could crash markets, increase rent values, affect airports, or create temporary investment opportunities. I also want to add unethical and outrages bank loans with high interest, strict repayment rules, and serious consequences. Music/sound icons I also added simple music and sound icons for the buttons instead of having the music on/off text Next Steps The next phase will be making these systems work together while keeping the game balanced, and also adding AI bots which utilise AI like deepseek v4 and so on so they able to actually judge the situation and think of possible ways for them to win. The aim is to use hcai to power them. I will also add normal BOTS as a fallback if my usage runs out
Poorup Redesign - Devlog #4 This phase was mainly about setting up codescene doing a full restructuing with the help of AI and fixing bugs and adding missing features. I also added a simple, gambling and stock market system. Bots I first started with setting up the initial idea of bots so to the UI and a bit of the backend logic for bots and how they will interact with the game iam nowhere finished and I havent tried it out yet. Codescene After checking out the github studentpack again after a while I saw codescene, which is a code reviewer similar to coderabbit. I struggled a bit with the Setup but after running an analysisi I noticed how abysmall my codebase really is and how its missing structure, archtiectuer and etc, for example sepearting certain getures from game logic.js and creating their own thread for it. I also setup a full pr pipieline which I can use with my AI agents which aim will be fixing my architecture, and finding bugs before i push them. bugs I ran Qwen 3.8 flash on my pr pipileine with codescene and let it work indepnedlty to full restructer my codebase so the results are better and I have better architectural design I also let it fix any bugs it found. Bugs I found While trying out the game i found mutipile BUGS one of them affecting my secret minigame palor patrol. For some reason I was losing hearts for no appearent reason. The reason behind it was that even though UI was hidden the helicopters were still flying through. For some reason the heart bug still exists afterwards and even the AI isnt able to find out what it is so Iam completating making architecture changes to it. #Gambling I added a smile gambling system where you can bet money on a roulete on red, black, and green I didnt add any animation for it as I found it unecessary and I also made sure iam legally clear to make sth like this Stock market I created a simple stock market tab and backend which allows people to buy indexes of a property and made sure to connect it with global events so global events can affect the stock market but that is nowhere near usable. Next Steps Iam going to let my AI continue improving my codebase with codescene and continue the Stock market and afterwards add the bots.
Poorup Redesign - Devlog #5 This phase was mainly about fixing all bugs still exisitng, refactoring further with codescene and letting AI run over my code, also fixed some small missing features and simple bugs myself. Choosing Icon I noticed a bug in which because of logic I made before setting up custom icons the programm mapped custom icons people created onto persets and blocked them so for example your icon had red in it, the game decided to map it onto the red preset in the backend blocking it but showing yours in game, this came because I never rewrote this section after introducing custom icons. Ownership icon Before this change owenship on board was only shown with a simple like quadrat in the top right corner of the tile in the color you picked this is also something left over from the old preset logic. I decided to make it so It shows a smaller version of the face of the player which makes it look a lot cleaner. Missing Buttons This was mainly because I let AI write to much of my code, the finical trading tab which is centered around equity and everything missed a dropdown to choose who you send the trade to and even the button to send the trade which was a dumb oversight on my end. I also added a simple backend system for the dropdown inside that modal to only show the propertys a person owns. Bots I also continued working on the bot system though this was mainly watching tutorials and brainstorming further Next Steps Fix last bugs, fully add bot system and make sure UI looks good to release the first beta test hopefully the next post will be the last
Poorup Redesign - Devlog #6 This phase was mainly about adding more depth to the player interactions, improving the bot system, and making the rankings feel more alive. Deal Negotiation I redesigned the deal flow so trades, loans, equity, and hybrid deals all work in the same way. When you receive a deal, a modal appears with accept and negotiate. If you close it, the deal does not get declined and stays inside the Finance rail. Both players can now see the same deal collapsed in Finance. The receiver can negotiate, while the sender can adjust or cancel the deal. You can open a full read-only view, change the parameters, and send the new version back. The server also checks old deal IDs so an outdated modal cannot change a newer deal. Sponsored Purchases I also added sponsored purchases. If a player cannot afford a property, they can ask the table for help. Other players can reserve contributions, and once the full amount is available, the buyer accepts and is forced to buy that exact property. The money is automatically returned if the request is canceled, the property changes owner, or a player disconnects. It is not a loan and does not create equity. Bots I continued improving the AI and no-AI bots. The bots now receive more context about the board, current obligations, loans, events, opponents, future rent risk, expected cash flow, and their own previous decisions.AI bots can now also counter trades, negotiate player contracts, choose debt rescue actions, and make auction decisions. If the AI provider runs out of credits or fails, the no api key AI takes over Rankings I added recent trend indicators to the ranking rows, so you can see if a player is moving up, down, or staying flat. I also added a seasonal ranking scope based on the current calendar season. Rules Fixes I also fixed the Double GO setting so landing exactly on GO now pays the boosted amount, while simply passing GO still pays the normal amount.TestingI expanded the tests and ran long bot campaigns with auctions, loans, casino, market, global events, sponsorships, and negotiations. The latest regression suite passes and the longer 2,500-game campaign had zero stalled games. Next Steps The next major step is making the bots simulate several complete future turns and improving long-term negotiation behavior. After that I want to add deeper browser testing and seasonal ranking rewards. Also to lazy to do screenshots of new UI so you will get everything in the next devpost
Poorup Redesign - Devlog #7 This phase was mainly about doing a full audit over the game, fixing bugs which were still hidden inside the server and UI, and making the whole project easier to trust before the next merge. Finalising Bots, adding, themes adding new suprise features and more. Themes I decided to create 5 more themes which will fully change the look of the game, for the 5 i decided on 5 directions first of light mode, and then the 4 seasons so summer,autumm, winter, and spring. These took quite some time to create but I think they came out quite decent though they still need cleaning up Ranking Seasons I have now added ranking seasons which are 1 month each if you manage to rank on the leaderbaord at the end of the season you get a special cosmetic(newly added system) and a special Title Cosmetics I added a full cosmetics system and the ranking system so you can now get cosmetics from 2 places, either by getting them at the end of the season form the leaderboard or by getting them from achievements Card Upgrade I also now added the features to upgrade your bank account, if you pay enough money you can upgrade your card for 1000$ this gives you a card with 5% cashback which is the Spaarkasse karte(german Bank) and the nex level is the amex black card wich give you 10$ cashback and amex points which you can use for flying. Gambling UI I also decided to now give the gambling UI an animation it now has the same kind of case opening animation as CS2 so the roulette which goes form right to left. Plane station card Also made it so that you can now use the airplanes to skip things so you can fly to another station but of course you will have to pay alot and you have to pay a landing fee. If a player owns an Airpot he can decide the flying fee himeslf and the landing fee which means he could extort people if he is smart enough Quick Table I did some changes to Quick Table as it used to create a new public room every time. It now checks the live public room directory first, joins the most suitable open table, retries if somebody fills it during the join, and only creates a new Standard-40 room when no table can be joined. Private room codes are never exposed and the server still makes the final decision. Favicon I also designed a quick little favicon which is Just a P with a box around it but it looks quite good Music Candidates I am now searching for new Music for each theme so music changes with the theme Next Steps Cleaning up the UI one final time trying everything out and finally realsing the Beta and promoting it on reddit.
Poorup Redesign - Devlog #8 this phase mainly about consolidating the backend and adding a New admin only dashboard which will allow to analyze things easier for balane patches and etc in the future. This Phase was written only by hand hence the long time, normally I would use AI to speed up the process but I wanted to get some practice in. Also added legal and TOS pages Backend I found mutipile bugs such as simple Game bugs to not so simple leackage problems and other stuff which took quite some time to fix by hand and this really shows how I will probally pause using AI for coding after this project for a while Admin Dashboard I created this Dashboard so I would be allowed to pracitally analyze everything from how certain things affect the game and for example analyze them to see if they need fixes, balances or even remove them entirly. I also added things like seeing a rough strucutre of where my player base is from. If anybody is abusing the game somehow or bot traffic. Tos Pages These took quite long and were quite the hassle but I did it. though i am debating jus tdeleting them as I couldnt fill them out entirley as certain information is needed which would then make them 100% fool proof I forgot I also updated the Snow Theme and added music for each theme with a small music player in the bottom left though I just noticed I placed the icons wrong should be a quick 2 line fix Next Steps do the last fixes finnaly test the AI bots as they are fully setup but not setup do some balancing and realese it The next post should really be the last. Hopefully.
Poorup Redesign - Devlog #9 this phase was mainly about adding some missing things fully balancing everything also used the new model jev from typesafe as it was a perfect fit for the task. Admin Dashboard I now added a section in the admin Dashboard fully centered around the Bots which allows for dropping in any provider and choosing the model and see the request if theyre failing or not and etc this took quite a while as I coded this myself again as I wanted to practice a bit though I still needed Ai help as Iam so trash at js Removing TOS pages As i mentioned in the last devlog i have now decided to remove the TOS pages as they were jst not good looking and not complete and not needed. Music system I decided to remove the music player and rather make it so 1 music track is there for each theme and my next step ix expanding the profile page to allow choosing another music track as 12 are available in total but only 6 are used rn. I also decided that I am going to move the Theme chooser somewhere else as people get no indicator rn to find it New Idea for the Future Also I had a great Idea which i can incoperate into this but after the next ship. Its training a custom ml model on all the matches played by people and then incoperating it in the game. Because essentialy it would be a custom AI/Bot that is able to play monopoly as good as possible new features I also added the option to download all the data cause i noticed its saved on the server and maybe smb wants to download it will then be in a json. I also added the option to add an recovery email, because my plan is to allow people to sign up without email but they still need an option to recover data if needed I also added the option to rovoke all otehr session tokens then the onnes youre logged into rn, so essentially log out of all other devices and server sessions Next steps Cleaning up Ai code and reading through it all, 1 or 2 adjustments in Ui for example the global event banner needs to be relocated or the graphs for match history need to remade. Also the ranking page needs a little redesing. The next one will be the LAST ONE cause i cant deal with stardance anymore all my projects are getting rejected for dumb reasons, so this will be the last devlog and if it does not get accepted iam relocating somewhere else.
Poorup Redesign - Devlog #10 Iam aware this phase is 30 hours this is just cause i used hella AI and didnt want to count it towards my payout. this phase mainly about finishing touches running mutipile tests suits playing some games and finishing some things also fixing Ui and redoing the Ui of the Music First of all I added music for each of the 6 theme with a secondary theme which you can select under account and preferences I also made it easier to spot the different themes as they were hella hidden to be honest. Deactivation of palor patrol Though i didnt want to this I needed to deactivate palor patrol as it was simply impossible to use I checked m code in detail used and really did everything but I couldnt find the bug which makes it unplayablle so as long as I cant manage to fix it I have to deacitvate it. Next Phase pushing everything on nest setting up a piepleine so nest automatticaly pulls everything I push onto main in my repo and finnaly realsing it with thhe bots for players to use.
Poorup Redesign - Devlog #11 (FUCK MY LIFE) I am geniunly so tired of this project and my life in general i was so busy in the last few days cause of school and after shool clubs. This phase was mainly about recoding the Bot engine by hand, and updating the stock market modal inside the game also added New Ui for theme chooser and music and also added more sound tracks. I also redid statistics tabs in profile by hand and added better match history tracking Bot engine To be honest to Bot engine was so much AI stuff that i genuinly didnt understand what it was build on and how that is why I decided to take some time to read and research all the papers its build on and how it works. I then rewrote large parts of it to improve it and also found mutipile bugs in the logic of how it works and how it assigns values New account and preferences tab I fully redid some parts of the accounts and prefences tab to now allow for easier choosing of themes and also worked on the music engine so the music loops and youre able to choose different music depending on the theme. #Statsics tab I redid the whole tab as I found it quite stacked with 12 boxes for statsics and decicd to now add internal tabs to make it look cleaner this was a quick 30 minute changes as I didnt change logic but just frontend Next Steps Hopefully shipping adding HCAI and testing the AI bots and further UI refinement on tablet UI and 1440px desktop cause these are 2 of the most weirdest sizes https://poorup.jeremy-d.hackclub.app/ also if anybody wants to check it our but it is nowhere near finished so dont expect anything
Devlog after ship So after getting hella positive feedback regarding poorup which i highly appreciate my aim is to now make it have an even better user experience and etc. why? cause from the feedback i got, there are 3 areas I need to tackle, UI, game logic which is to complex and the User experience including rules and etc, Full redesign of the ingame lobby So after getting feedback that the board was to smallwhich was kinda expected and that the whole game is just clutered which i also assumed would happen cause all the features dont fit into the game i have done the following. I have redesigned the full ingame lobby with a new layout further inspired by richup(didnt want to do this but they have the most optimial layout) I have also redone the whole entire admin window cause to be honest it was horrondous and hard to use, and also just some small changes all around full redesign of modals so after doing the lobby i have now decided to fully redo a lot of the modal to have a better layout and etc so they are way more user friendly and acttually easy to understand, this also included cutting alot of features from certain modals because they just made them to complex and hard to use Cards and airpots this was something i was orrignally planning to release in the last ship but i just decided to ship it with this one i have finnaly added the option to buy new bank cards which you can use to get benefits like cashback of 10% on purchsees like rent payment suprise cards and other stuff, and I also added the option to use airpots to fly from one point to another and allow players to set the prices, Bots After reflecting a bit on my ai usage for the bots i decided to fully plug the whole programm into a repo which visualises it to see if it checks out with my mental map and I noticed so much slop which I would have never noticed before, this includes the whole Bot logic which i have probally never looked at cause i knew i wouldnt be able to code them. Though i probally should have cause this is the biggest slop i have ever seen and It introduced so many bugs which the ai couldnt find Next steps Right now all these changes are locally and not on github which are around +17000 lines of code and my aim is to further clean this up and fully push it with a new domain which is alredy online but will be kept hidden. here are soem before and afters, the more clutterd ones are the befores and the simplifyed ones after
Rework #1 Now you could be asking yourself? What have i done in the last 8 days to not post? Well Iam nearly finished with the full rework off all UI, Bug fixing and introducing new features, Chart Engine So i redid the whole system for charts and decided to build my own, because though i had one which worked it looked horrendous and really didnt fit poorup, you can see the new chart engine in the screenshot Game history I redid the whole entire game history system, because to be honest it was heavily vibed including its Ui and while cheking it, it looked like trash so I sat myself down and worked tiresly to fully redo it, and I even implemented the new chart system into it, Modals, Modals, Modals So I REDID NEARLY EVERY SINGLE MODAL IN THE GAME to provide a better User experience this took hella long and while doing it i noticed i had hackatime tracking off, because i had been working on some personal projects, hence the reason I only posted now because I lost so many hours, #Next Features Well to be honest there really arent anymore features i can add, the only thing left is fixing bugs and preparing it for the release and advertising it on reddit
Ships:
Poorup Poorup is a real-time multiplayer board game inspired by Richup(Monopoly), playable entirely in the browser What did I make? A full multiplayer board game running on a Node.js server with Socket.IO for real-time communication. The client is pure HTML, CSS, and JavaScript, no frameworks which is stupid if I look back on it . Features include: Room-based lobbies with a shareable room code Full Monopoly-style rules: buying, renting, building houses and hotels, mortgaging, and trading Live auctions with a countdown timer when a property is declined Configurable game rules per room (double rent, vacation cash, even build, auction, mortgage, randomized turn order, no rent in jail) Reconnect support — if you disconnect mid-turn, you can rejoin and resume In-game chat Automatic room cleanup when everyone leaves What was challenging? Shared states across multiple clients. Every player action, rolling dice, buying a property, placing a bid, has to be read server-side, broadcast to everyone, and reflected correctly on each client without race conditions or desync. Getting that right, especially during edge cases, took a lot of work. Edge cases in disconnects. A player disconnecting mid-auction is a different problem than disconnecting on their turn, which is different from the host disconnecting entirely. Each case needed its own handling: timers need to be cleared, pending actions need to be resolved, and remaining players need to stay in a valid game state. and i need alot of time and a bit of AI to fix that for me. Building a complete game UI with vanilla CSS. No component library, no utility framework — every modal, toggle, property card, and animation is hand-written. Honestly needed a lot of AI help here. Probally should have used a libary if I look back at it but it was fun to do it in plain CSS also for anyone wondering why the favicon is the one from vite i never deleted it and i wasnt in the mode to redesign a new one and tried to use the board map but that didnt work for some reason. What am I proud of? The architecture. The game logic lives entirely in gameLogic.js and has no knowledge of sockets or HTTP. The server in server.js wires events to logic calls and broadcasts the results. That separation made the codebase much easier to debug than it would have been otherwise but i needed AI to implement the idea i had the idea but wasnt quite able to do it. How to test it git clone https://github.com/jeremy341/Poorup.git cd Poorup npm install npm start Then open http://localhost:8080 in two separate tabs or browser windows.
Project Update I didnt even notice but all the changes i did i the last patches never got shipped so this one is about the last to changes which were adding modals, creating new UI and removing AI code check it out https://poorup.jeremy-d.hackclub.app/
Poorup — Biggest Update to date I’ve given the project a major overhaul, from its visual identity and everything else. This is geninuly one of the best projects i have created and iam proud to announce it I first started Poorup 3 and 1/2 months ago as a project to get introcude into webdesing and since then i have created 4 more website and revesiting it really shows my growth. Of course Ai was used by even then I could really feel my growth What was challening i decide to stay on CSS, html, and js instead of transferring it into another language for a simple reason i wanted to test how far i can push these 3 languages( i was just to lazy to learn a new language) How I used AI AI WAS USED IN THIS PROJECT for debugging and coding no UI or art generation. AI was a substantial coding and debugging tool, especially for backend work, bot logic, and tricky multiplayer edge cases. I used CodeScene to identify code-health hotspots. I wrote many page-specific backend features myself, then used GPT/Codex to help debug or split some larger hotspot files into smaller modules. Ai was also used to fix bugs in the Ipad Ui I created Poorup’s frontend UI and its SVG and art assets myself. AI helped in coding but never touched art. I didn’t compose the soundtrack. I selected open-source and other openly licensed tracks; their sources and license details are in the audio credits . I also rewrote the Git history to make the repository cleaner, so the current commit log isn’t a complete record of the project’s development. Also after around the 6th or 7th devlog i turned ai traccking of as to not fraud myself hours So if needed deplete hours. What’s new in this patch UI Full ui rework of everything nothing was left out every single Ui elemt was redone by scratch, with upto 6 themse each with their own custom soundtrack and background, this was the largest wish people had wished for when they reviewed my game and iam so proud of the UI. Boards and multiplayer New 40 and Metro-52 boards, with custom visual themes. Public rooms and private rooms with shareable codes; people can join as guests. Configurable rules, including double rent, vacation cash, even building, and randomized turn order. A deeper economy system Bank loans, player-to-player loans, equity deals, and hybrid contracts, with collateral and default consequences. Sponsored purchases: one player can fund another player’s property purchase in exchange for an agreed share. Negotiating now youre able to negotiate all offers you get instead of accepting or declining on the spot you can also keep them on hold An optional stock market for all the quant bros(gamblers) casino so now youre able to gamble Social I also added a full social systems with achievements, friends inviting people to lobbys seeing match history and more, also added the option to create your own 16x16 user icon Events one of the biggest features I decided to add global events which appear under certain conditions like to many houses standing which should reference the 2008 housing crises i also added stock market crash and alot more. Also global events can also combine to create seacil ones Parlor patrol this was supposed to be a cool minigame while waiting for your friends but it doesnt work and i cant fix the bug for the life of me so you can test it out but it doesnt work correclty all svg assets for it exist...
|
1792849780.3860598
|
1792936180.3860598
|
|
60085
|
Roblox Sword Game by @OrionB | Stardance
|
OrionB
|
0
|
179.43
|
0
|
[]
|
[{"post_id": 64671, "ts": "202 [{"post_id": 64671, "ts": "2026-09-09T08:12:36Z", "hours": 179.43, "text": "Working on UI and Hidden Boss Fight, also will post more screenshots of the game once its finished I don’t want to leak the concept #girlboss #gatekeep #imaguy. However a lot of time has been put into the systems of this and creating the UI and animations and sounds and makng the game fun and there are also a lot of easter eggs which I’ll actually post some of the easter eggs here."}]...
|
Title: Roblox Sword Game by @OrionB | Stardance
D Title: Roblox Sword Game by @OrionB | Stardance
Devlogs:
Working on UI and Hidden Boss Fight, also will post more screenshots of the game once its finished I don’t want to leak the concept #girlboss #gatekeep #imaguy. However a lot of time has been put into the systems of this and creating the UI and animations and sounds and makng the game fun and there are also a lot of easter eggs which I’ll actually post some of the easter eggs here....
|
1792421710.721326
|
1793026510.721326
|
|
30441
|
Weather Underground Station Status Checker by @Kru Weather Underground Station Status Checker by @Krupam | Stardance...
|
Krupam
|
0
|
180.79
|
0
|
[]
|
[{"post_id": 79620, "ts": "202 [{"post_id": 79620, "ts": "2026-10-14T18:51:09Z", "hours": 9.4867, "text": "Weather Emails, mobile tweaks, map zoom Soooooooooooooo close to shipping. Map Zoom: The Map will now automatically zoom based the center of the points. Humidity and Dew point data collection: The place the data was being scraped from got changed so I had to update the logic. Weather Emails: Created another CRUD for another email list. This list will get a monthly email summarizing the weather for the past 30 days for each of the stations. I created the web page for it, but need to finish cleaning it up, allowing people to sign up for the service and make the emails send automaticcally. Mobile Tweaks: The mobile version of the website did not look good. I spent a lot of time trying to fix it before I was able to get it to look like this!"}, {"post_id": 77451, "ts": "2026-10-07T02:02:30Z", "hours": 7.9642, "text": "Map! And Develop mode Map I used ArcGIS’s JS to create a map tab that show cases all stations that have a latitude and longitude value. I am working on getting them on the first ever scrape but you can also edit them within the settings page. There is a link that takes you to the station page as well. Develop Mode Created a toggle within the .env file. If on, the program will use the SQlite db and be able to run on VS Code for example. When it is off, it needs the PostGRESql db to function. Docker Docker is really infuriating lmao. Spent most of my time fixing tiny bugs."}, {"post_id": 74611, "ts": "2026-09-27T19:29:59Z", "hours": 9.5544, "text": "Docker Deployment (ALMOST finished) Hey guys! Docker: I am using Docker for deployment of this system to make it easy for anyone who has a weather station or network of them to showcase and monitor their own data. Docker is a type of virtualization (similar to VMs but instead sharing the kernel) that is a lot less resource intensive and is used for deploying a lot of small projects as well as any type of home labbing work flow (hosting your own server etc.). (Yes I pulled that explanation from my last devlog lmao). I will have a tutorial in the ReadME. Within the docker stack, there are several containers with different jobs and responsibilities: Web: Hosts the FastAPI webserver. It uses a endpoint (/health) to monitor the servers responses. It is hosted on port 8000 by default (configurable in the .env file). I would forward this through Nginx or a Cloudflare tunnel to host it under your own domain. Scraper: Runs the status and weather scrapers every 15 and 5 minutes (offset by two mins) respectively through a crontab file ( scraper.crontab ). It is run using Supercronic. The scraper waits for the web server as well. Flock is used to prevent two instances of a program. DB: PostgreSQL server that holds all of the data. Weather data, users, etc. All of the other containers wait till the DB is healthy to start. Db_backup: A container created by Prodrigestivill to automate backups of Postgres databases. I have it configured to keep the last month and 14 days of backups. It saves all backups to the /opt/mesonet-backups folder. I wrote scripts in order to test restoring backups (creates test table, restores using latest backup, and deletes it), create a manual backup, and restore the last backup. Email Alerts: Fairly similar to how emails are sent in the status-scraper, it obtains admin recpients from the web sever uses enviroment vairbales to send an email. It asks for subject and text using arguments in the terminal, so the user can send emails manually to admins as well. Health-tests: Runs a couple of health based scripts on a Supercronic schedule. Monthly restore test (runs the restore test mentioned before) and a daily backup health (checks how old the backup is). Emails will be sent to admins if the restore fails or the backup is more than 26 hours old. Persistent Storage: All the containers used volumes that continued even if the containers were deleted to be updated, the data (and the backups) are fine."}, {"post_id": 72413, "ts": "2026-09-22T21:20:07Z", "hours": 8.7489, "text": "Docker and Environment Variables Hey guys! It has been a couple of days… Time Crunch: So I looked on my calendar a week ago and realized that Stardance was almost over, and thought “this is plenty of time”. Then a couple of days ago I really felt the pressure. I wanted to get this out before the program finished so I started on the final bits and deployment to turn this into a usable system. Docker: If you don’t know what docker is, count your lucky stars. Just kidding, its very cool when it works . It is a type of virtualization (similar to VMs but instead sharing the kernal) that is a lot less resource intensive and is used for deploying a lot of small projects as well as any type of home labbing work flow (hosting your own server etc.). I have worked with docker with pre-built images and containers before and never really went into the DIY portion. This was my first intro into it and I had to do a lot of googling and the such. It was really frustrating and required quite a few head banging. NOTE: I did use AI sometimes (tried as little as I could) to get docker working. You can see me sometimes using it in my lapse recordings, but I tried to keep it closed as long as I could to stop me from using it :D. Environment Variables: I was told that hard coding my config values in a config file was a bad idea…and it makes sense. It took a bit, but once I setup environment variables, oh man did it get so much better. This also makes it a lot easier in docker to setup the container. Very happy about this. Help from a friend! I told this story a couple of weeks ago, but one of my friend’s dad found my repo and left a couple of issues on my page and these were my last two. I really gotta thank him for these ideas."}, {"post_id": 69905, "ts": "2026-09-18T01:25:16Z", "hours": 7.5397, "text": "API Email Calls, Hardware specifications, Docker? Hey guys, School started two weeks ago, so my posts will be a little delayed lol… API Email Calls: I originally hard coded my email lists for Reports, station-specific, admin, and global emails, but I wanted to unify them with the rest of the API. I spent a lot of time creating columns in SQL, endpoint CRUD, settings HTML page CRUD, as well as changing the scrapers to pull the lists and use them. Hardware specifications: I added columns in SQL to add Hardware metadata for the stations. It can be seen in all dashboards (see photo) Docker: I was thinking of creating a docker container for this setup to make deployment easier. Would that be something you guys would like to see? Let me know."}, {"post_id": 59930, "ts": "2026-09-01T23:50:25Z", "hours": 5.4425, "text": "Robots.txt, User login error, API security, credit footer, station hardware Whats up? Robots.txt: For those who don’t know, a “robots.txt” tells scrapers and any bots where they allowed to go on your website. I only allowed them to go on public html pages. However this is only a recommendation, the big guys can do whatever they want. User Login Error: I had this error where any public accounts (or not admins) would get a error when logging in. I was searching for permissions with the wrong column in the database 😅. API Security: I made sure there were no open routes and everything was secured. Credit Footer: This was pretty cool. At the end of ever page, I added this little footer with my name and a link to the github repo. Station Hardware: I added a new column to store station hardware info. This is mainly for what weather station model it is. Ex: Davis Vantage Pro2. I am working on making the update form in the settings page allow to update this info as well as more station info."}, {"post_id": 57799, "ts": "2026-08-30T02:58:26Z", "hours": 6.3317, "text": "Some Help and ReadMe! The project is almost done! (why do I feel like I will be saying that a lot…) Some help! Today I saw interesting post on Facebook about a website someone my age built and I commented it on it asking if I could see the code cause I was curious if they used Flask, FastAPI, etc. I also posted my project and to my surprise, the poster is actually my friend’s dad (small world am I right) and he reviewed my code and left a few issues on it. He even downloaded it to update my requirements.txt. I then merged his request. Thank you for all of your help! ReadMe: I spent all of today working on the readme, you can read it here . However here is a little sneak peak: Hey! My name is Krupam, and I am a nerd. If you are reading this, you are most likely one as well. I love weather, and learning about it. Other people who love weather will create and host Personal Weather Stations (PWS) and post the data to websites like Weather Underground. I have used these stations for my own research projects. Check one out!. In my area, there is a mesonet (regional network of PWS’s) from the Save Barnegat Bay non-profit (check them out, they are awesome!). I have used plenty of their stations in my research. I was given the amazing opportunity to present my research at one of their meetings regarding their mesonet. It was eye-opening! As I listened into the meeting, they discussed one of the current issues; they could never tell when a weather station went down. The station owners would find out days after if not weeks. This program is the solution to that and more. The system is a weather-station data platform and monitoring system. The system collects data from Weather Underground (WU), turns it into usable information, and alerts station owners and administrators when a station needs attention. All data is shown on the website in a easy, user-friendly approach. This includes dashboards, graphing, analysis, scientific tests, and admin controls (accessed through JWT-based auth). The system is coded mostly in Python and there are three main systems: The weather and status scrapers, backend, and frontend website."}, {"post_id": 55719, "ts": "2026-08-27T18:10:45Z", "hours": 8.3564, "text": "Settings Page, API Stations List Call for Scraping System Hey! Here is what I have been up to… Settings Page: This is a Admin only page (will pop up in nav bar when admin) that configures, deletes, creates, the main functionalities. This includes stations and users. After every function is run a error/success message will show with detailed intomation depending on the function. These Functions include: Modify User: Change role, username, password Register User: Create Delete User Read User Assigned Stations: Choose a station, the page will reload and show all stations the user can access. Grant User Access: Choose a user, and give them access to a station. This is view only by default Revoke Access: Remove User access to a specific station. On reload after choosing a user it will show any assigned stations Update User Access: Choose a user, on reload it wil show all available stations and when selected, will show what access it has. You then check/uncheck the access you want it to have and submit. Modify Station: Currently only allows to change station name. Create Station: Enter new id and name as well as options to be public and in maintenance mode (default off). Delete Station: Deletes station only from the current stations. Does not delete data. I need to rewrite this to make it so it stops collecting data instead. Read all Stations: Lists all stations and if they are in maintenance or not API Stations List Call I realized around 11 at night that I did something very dumb. All of the stations in the configs for the Weather and Status scrapers were hard coded values and were NOT synced with the current stations database. To combat this, I added a new column to the Stations database table. This column was called collect_active or something of the sort. I plan to migrate the delete function to turning off the collection. I then changed the scrapers to pull a new current list at every run and used that as their truth. I finished this around 3 AM last night 😭 . If you guys have any other ideas, let me know!"}, {"post_id": 54509, "ts": "2026-08-25T15:13:24Z", "hours": 8.2236, "text": "Admin Settings Page (WIP) Settings Page: Now that the main functionality of the site is finished, I started making HTML representations of all the methods I have predefined. This includes CRUD (create, read, update, and delete) functions for several pieces of the website. Here are the ones I started to make: Reset/Update User password, username, role. Register Users Delete User Read User Assigned Stations Grant User Access to a station Revoke User Acccess to a station Modify User Access to a station. Everything uses HTLM forms and when they submit, they will return a pop up success or error message. There are a couple of other features I forgot that I made (Such happens when coding at ungodly hours) but anyone can try out the website (if I am working on it at the same time) at https://sbb.krupamlab.com"}, {"post_id": 54016, "ts": "2026-08-24T19:16:15Z", "hours": 8.4358, "text": "CSV Downloads, Weather Table, Error Details on pages, and a profile indicator! Let’s jump into it! CSV Downloads: For graphing, analysis, tests, and table pages, I created CSV downloads. Graphing: Downloads raw data Analysis: Downloads analysis summary and raw data Tests: Downloads test results and raw data Weather Tables: Downloads raw data Weather Tables: In the public dashboards, there is now a table at the bottom with all data from the current day. There are quick buttons to go forward and back a day as well as a day input and go button. Profile Indicator: It is just a blank profile picture icon with your username next to it. It only shows when logged in. When clicked it sends you to the my-stations page. Error Details: If there are specific error details in the backend, they will be sent to the error page. Otherwise a generic 40X error will be show"}, {"post_id": 47248, "ts": "2026-08-15T01:38:47Z", "hours": 8.2772, "text": "Testing Page Finished! (without csvs…) HTML Form Bug Fixes: Sup guys, here is what I have been up to… Testing Page: Oh man this was pretty hard. I actually had writers block but for code. I just couldn’t think of a solution. I just sat there trying to think of how to implement the system. With enough brute force however and some breaks, I did manage to get it working. What is it? This page allows the user to run scientific tests. These tests include Linear Regressions, ANOVAS, and T-Tests. Linear Regressions look for a relationship between variables. ANOVAS and T-tests determine if there a difference between groups of data (single variable). Functionality: The form will ask the user to choose a test, station, variable, unit, and time range, as well as test-specific inputs to run a test. Once the user submits the test, it will either return a graphical result (for the Linear Regression) or stats of the T-Test or ANOVA. The Tests will only make groups depending on the same time frame but different stations. (I only decided to do one for simplicity) This all works but I need to create the ability to download the csv of the data used for the tests. General Inputs: Test Type (T-test, ANOVA, Linear Regression) Range Type: (Relative or Date) Last ___ (hours, months, etc) Start and end date Units (Imperial or metric) Test Specific Inputs: When a test is chosen, test-specific inputs appear. (this happens for other forms such as graphing and analysis pages. I just forgot to mention it) The appeared inputs are then required (like the other default inputs like time, etc) but when a different test is choosen the required inputs are updated with the new ones. These include: Linear Regression: Station X Variable Y Variable Regression T-Test: Outcome Variable Station A Station B ANOVAS: Outcome Variable Station A Station B Station C HTML Form Fixes: I went through all of the Forms that have inputs that switch and make them work nicely with the backend. I make inputs that switch be required and seen at the right time."}, {"post_id": 42348, "ts": "2026-08-07T00:58:02Z", "hours": 10.1181, "text": "Testing Page (Still WIP), General Bug Fixing, and Site Cleanup Yikes, I got reaaaal close to hitting the 10 hour limit for these devlogs 😅… Site Cleanup I am really proud of this one. I finally took time to go around and get most of the small detailed squared away. I got the site favicon (small icon in the web tab) and other meta data information fixed (like the .webmanifest) working. I also spent a good chunk of time creating the home page and making it look professional. General Bug Fixing I took some time to go through the website and found some tiny bugs. I also had a few of my friends test out the website (they didnt break it!!!!). Small stuff like making it easier to see the graphs, titles on the tabs, etc. Test Page This page is like the ultimate boss for me haha. I would like this page to contain linear regressions (LR), ANOVAS, and T-tests. These are scientific tests used to find statistical differences in data. (see the below screen shot for a better explanation of all of these tests. The user chooses a station, range mode, range, units, and the type of test. Then based on that test, a few options are given: LR: X Variable Y Variable Title Mode A: Choose 1 station but two time ranges (same variable) Mode B: Choose 2 stations with one time range (same variable) ANOVA: Mode a/b Three or more time ranges/station depending on mode Two ranges/station depending on mode"}, {"post_id": 39249, "ts": "2026-08-02T03:01:23Z", "hours": 8.5142, "text": "A Variable Analysis Page and Graphing with a date system! Hey guys! Here is what I have been up to… Graphing Date System: As well as a “last _ ____” system (relative range), I created a version that allows me to choose “Date Range.” Date Range allows you to choose between two dates. It sounds simple but was a lot harder to code 😅. As I wrote most of the code while being really sleep deprived, take a look over at @app.get(\"/graph/weather/{station_id}\") on the project’s github page. (I recommend using ctrl + f to find it) Variable Analysis Page: This page is pretty similar to the graphing page (see previous devlogs) where it uses a HTML form with query variables to create calculations. The user selects a weather station, variable, range mode (relative or date), inputs for that mode (hours/date, etc) and the units. Then the latest, minimum, maximum, mean, median, range, sample value (n value), and the overall trend (falling, steady, rising, insufficient data). The time will also be shown if applicable (latest value). You can then download a csv of all the data the calculations were derived from. Under that is another box showing the full time the data is collected from as well as the units Future: I still need to add a tab for more advanced analysis such as linear regressions, anovas, t-tests, etc. If you guys have any more ideas, Let me know!!!"}, {"post_id": 35547, "ts": "2026-07-27T01:45:56Z", "hours": 5.8625, "text": "#Graphing Page!!! As well as other bug fixes… Graphing Page This page is created by making a HTML form and submitting as a POST request to the same method that creates the dashboard graphs. All the graph information is a query request (the infomation after a question mark in a url, see photo). This means you can bookmark a graph to see the most recent data with your own personal preset. The user must select the station (from a list), type a title, the time range, (last __ unit), and the variables they would like. They can choose as many variables as they would like. There are also variable type presets a user can choose. It will preset everything to make the graph including the time range and title. Once a graph is generated, it will be displayed with the options to download it as a png, download the csv data, or the clear the graph. I am working on a date range next as well as the analysis page with linear regressions, t-tests, ANOVAS, etc. Bug Fixes I had a couple of friends test out the site to find some bugs, and boy did they deliver. They managed to point out some logical errors I had, and I fixed them."}, {"post_id": 34238, "ts": "2026-07-24T19:31:03Z", "hours": 9.2097, "text": "Owner Dashboard (finished), Maintenace and Public Toggles, Dashboard Graphs, and Graph Page (WIP) A lot has happened, lets dive into it: Owner Dashboard: This dashboard may not look very different from the public dashboard but it hold a lot more features: Status widget with the status time and last status. A green check if online or a red X if not. If offline, no weather data/widgets are shown and instead a gear widget with more information is shown. This includes if a alert was sent, last time connected, first time offline, and consecutive offline checks Maintenance and Public toggles Maintenance toggle: If in maintenance mode, no emails will be sent about the status of the station but it will still be logged. Public toggle: If off, the station will not be shown in the public dashboard list. If you try to go to the url directly it will show a “Station Not available” Page. Dashboard Graphs Graphs are created using Matplotlib and show cased on both dashboards. This includes solar, precipitation, pressure, and temperature graphs. Graphing Page (and analysis) This page is currently being worked on but will allow anyone to choose the time range, variables (yes multiple!), station, and unit. I also want to have a section for analysis like regressions and so on. Lmk how this is looking so far!"}, {"post_id": 33234, "ts": "2026-07-22T23:24:27Z", "hours": 8.8756, "text": "Owner Dashboard (WIP) and Maintenance Toggle Welcome back to a episode of me going insane! :D (jk) Owner Dashboard (WIP) The owner dashboard is a dashboard that is separate from the public dashboards. You must log in to access a page called “My Stations”. This page lists all stations that your account has permission to view. The account that you are using must have the station added by a administrator (rn all of those methods are in the docs. I plan on moving them to html soon) Purpose of Owner Dashboard The owner dashboard holds some extra functionalities based on the status: Online It will show a green or red icon based on the status (along with the circle up by the units toggle) and display the exact time and status of the station. The time of status is separate from weather. If you have the permissions to do so, you can then toggle the maintenance and public modes. (Only maintenance mode has been implemented thus far) The maintenance mode stops any emails from being sent about the station Public mode will allow the station’s public dashboard to be listed on the website. Offline: Shows everything in online*. Does not show weather data Displays how many times the station has been shown to be offline. (consecutive offline) The time of last connection. First offline (this is when the station is set as offline) If an alert email was sent Let me know if you guys have any ideas!"}, {"post_id": 30867, "ts": "2026-07-18T20:24:01Z", "hours": 7.3928, "text": "Public Dashboard and dashboard widgets!!! I had a lot of fun with this… Public Dashboard This is a public webpage anyone (no need to log in) for each station, listing the current weather conditions and status in a nice gui. In here are some widgets I made by myself all in CSS and HTML. (I don’t like JS if you couldn’t tell…) These weather values include: Temperature Dew Point Humidity Precipitation Rate Precipitation Accumulation UV Index Solar Radiation Atmospheric Pressure Wind Speed Wind Gusts Wind Direction Dashboard Widgets: I made a couple of widgets that update based on the values: Temperature Pressure Wind Temperature: A small thermometer that fills up as the temperature gets higher. (I have to rescale it for Celsius) Pressure: A small barometer that changes based on the pressure. The center pressure (29.92) is the atmospheric pressure at sea level. Wind Speed: A little compass shows the cardinal through tertiary wind directions (16 directions). The current wind is represented by the blue arrow. The arrow is where the wind is coming from (how wind is properly notated) Let Me know if you guys have any other ideas, I would love to hear em!"}, {"post_id": 29927, "ts": "2026-07-17T03:08:44Z", "hours": 7.7744, "text": "Working Error Pages, User Updates, Logouts, Weather Post/Weather History and a (partial) public dashboard Been a couple of days guys, here is what I have been up to: Error Pages: Whenever there is some sort of error such as 404 (not found), 401 (unauthorized), 403 (Forbidden), you will get forwarded to error pages. These pages will prompt you to return or log in, depending on the error. User Updates: Admins can know easily update usernames, passwords, roles, etc. However this is still in the API and not a webpage yet. Logouts: When you sign in, your menu bar will no longer have a sign in option (shocker) and has an option to log out. This “new” menu bar is created using jinja2 if-statements in the layout.html. Weather/Weather History: A Weather Underground Scraper (I made this for a seperate project, check it out: https://github.com/Krupamc/weather_underground_datascraper ) gathers weather data for each station (returns a null filled json if station is offline) and posts it to the API. The API stores it in the database. We can access the current weather for each station as a well as the history. The default history is 20 entries but can be extended with queries. Public Dashboard: Now this is the fun one. This pulls the current status, weather values, time (as a date and timestamp in a readable format), as well as wind direction in label format (e.g. NNE) and sends it to the public dashboard. The dashboard then takes the values and puts them in an easy format. It is not finished, I plan to have pressure, temperature, and wind widgets that change based on the current values."}, {"post_id": 27946, "ts": "2026-07-13T21:48:30Z", "hours": 4.7169, "text": "Registration Form, Posting Status, Status History Hola guys! Registration There is now a registration form! It takes in a username and password and creates a user. However this user has no permissions and the person has to contact the admin to give them permissions. (in the future, a regular base user will still be able to do more stuff, see more detailed data maybe? But I don’t want to block data based on accounts. Maybe emails of your favorite stations?) Posting Status When the status checker runs, it will send the results over HTTP post to the database (DB) to be saved. The “current” Status DB model is overwritten by new data, but if there is a change in the status in any way, the change will be saved to the Status History DB Model. Time Another tiny detail is that before the status checker would store time in local time, but I changed that to be UTC time. UTC time is now universal and I plan to display the time in the local timezone based on the browser time zone. Easter Egg I added a easter egg in the website, I wonder if someone will find it… Thanks for reading these devlogs, this is not necessarily a fancy/flashy project and it means a lot when someone does ❤️."}, {"post_id": 27422, "ts": "2026-07-12T23:48:53Z", "hours": 2.1436, "text": "LOGIN FORMS!!! And Station Lists… Hey guys! Whats up? I’ll tell you whats up, the moon. 😅 Dad jokes aside, I am really excited to update you. Login forms…how exciting Wait wait I can explain. It is cool I swear. When you input your credentials into the form and submit it, it will check the database (DB) if you have the right ones. If you don’t you will get the invalid screen shown below (I definitely didn’t forget my own password…). But if you put in the right credentials, you will be given a access_token cookie. This cookie will let you stay logged in till the cookie expires (set for 30 mins ). Once you are logged it, it will direct you to your account dashboard and show you all the stations you have access to. (I didn’t make that one yet but shhhhh) Station List When you click on the Weather Station tab, it will show you a list of every single weather station in the network. Something else cool, whenever you hover/click a button, it will change color. Just fun for me. Save Barnegat Bay I am building this system as a idea I had for the Save Barnegat Bay (SBB) non-profit organization. I utilize their weather stations all of the time for my projects that I love giving back to their mesonet! Once I am finished building this, you will be able to access the SBB weather stations and see weather points as well as graphs and stuff. Oop can’t spoil all of my planned features"}, {"post_id": 27355, "ts": "2026-07-12T20:56:47Z", "hours": 8.9144, "text": "Website Backend, JWT, and HTML Front End Ok, these dev logs keep getting exponentially longer and longer ;-; What the hell is JWT? JWT (JSON Web Token) is a way for my authenticate a user. It essentially is how I can do logins. When a user is registered, their username and hashed password is stored in the SQL database (DB). When someone would like to authenticate, their password is hashed and sent with the username. The DB check if the username and hashed password match and send back a JWT token that expires after a set time (30 mins but configurable). During this time the user would be able access their station dashboard, etc. Admin accounts have the same log in procedure. They however have the power to give each user (based on their user id in the DB) access to specific stations. This includes the ability to see the station dashboard, toggle maintenance mode, and toggle if the station is public (on our site). Backend: Added functions for creating accounts and logging in. Most functions now require either a general account or a admin account. If this is not fulfilled a 401 error is sent (Unauthorized error). As of right now, only admins can register accounts. The access to each station can be updated by a admin at any time. I did some more stuff but I honestly forgot :) HTML Front End This was honestly my favorite part so far. I started by getting the Jinja2 template system to work as well as mounting the static directory. The layout.html file allows me to change it slightly for every page. That is a bad explanation but it is a really cool system. I got the home page done (needs some text and description but thats a later me issue). I am working on getting the general station page. It will list every station and allow you to click on them to get forwarded to that stations public dashboard. Sanity Check? I am having so much fun with HTML. It gives a certain gratification that SQL can’t give. I feel very happy :D Any ideas pls let me know!"}, {"post_id": 26761, "ts": "2026-07-11T18:56:34Z", "hours": 4.8619, "text": "SQL Database, Website Backend, Dashboard When I said a lot last time…that was nothing compared to now ;-; What am I going on about? Well, I wanted a way for station owners to be able to be able to toggle maintenance mode without the admin (whoever deploys this for their own mesonet) directly editing a json file every time. One thing led to another and now I am making a website… Website Plan: This website will run on a FastAPI backend with either Jinja2 or Htmx front-end. There will be a public “dashboard” where anyone can take a look at general station stats and current weather conditions. The weather conditions will also be made graphical with Matplotlib. Historical data will also be accessible. However on the same site, people will be able to log in. Logged in users will be able to access only certain stations they are allotted. They will have a more detailed dashboard with more stats. Certain users will be able to toggle maintenance mode and some won’t. Admin accounts will be able to see and toggle for all stations. Usernames and passwords will be hashed and saved in the database. The log in system will also make use of cookies/sessions to keep the user logged in. Planned SQLite Models users: (DONE) id username password_hash role (admin, station staff, etc) user_station_access user_id station_id can_view can_toggle_maintenance stations: id station_id is_in_maintenance is_public station_status: station_id last_status consec_offline first_offline last_conected alert_sent station_current_weather: temp dew humd wind_speed wind_gust wind_dir pressure precip_rate precip_accum uv solar Progress? I have made all the models and created basic routes. There is a CRUD (Create, Read, Update, and Delete) for the stations based on another config file. On start, the program will automatically create database entries for new stations and delete ones not in the config file."}, {"post_id": 23865, "ts": "2026-07-07T01:43:32Z", "hours": 3.6336, "text": "Monthly Reports, CSVs, and a little bit of Insanity Hey guys, I have done so much, I might go insane haha! Reports? Every first of the month at 8 AM, a email will be sent out to any emails configured for them. They contain various stats such as, which stations are down, which have been down for the longest, uptime percentage, etc. Emails So I just realized that I never explained all the different emails haha. Recipients: Admin: Email(s) configured to recieve only system error emails Global Recipients: Email(s) configured to receive all emails sent by system concerning status. Report Recipients: Email(s) configured to receive monthly emails. E.g. Mesonet maintainers Station Recipients: Email(s) configured separately for each station. E.g. station owners. Email Types: Offline: Sent after a station is recorded off 3 (default) times in a row. Recovery: Sent once a station is detected to be online after being considered offline Reminder: Sent after 7 days (default) to remind of the status. Monthly Reports: Sent at the first of the month at 8 AM (default) with statistics such as which stations had outages, the station with longest, uptime percentage for each station, etc. System Errors: Sent to system admins for any errors detected, HTTP, Requests, Time, etc. CSVs All of the data is logged on a csv as well. Not much to say Insanity Something about sitting around staring at a screen doing like 5 projects on and off makes you a little crazy…on the brightside it is my birthday tomorrow. That means more coding time! ;-;"}, {"post_id": 22449, "ts": "2026-07-04T22:24:34Z", "hours": 3.1547, "text": "Monthly Reports, Maintenance mode, and Reminder Emails: Yolo! Reports? Every month (Rn configured to be the first of the month at 8 AM) a report will be sent for all of the stations with a bunch of stats such as: Total downtime Uptime Percentage of outages Table of outages Longest outage Station with most outages etc. Reminder Emails: Once a station goes down and it has not been resolved in a set amount of days, a reminder email will be resent to the owner Maintenance Mode: Once switched on, emails about status will not be sent for that weather station. Checks will still occur in the background however. In the future, I will create an FastAPI app that will let owners trigger this mode on/off for their station. Suggestions? If you guys have any other ideas, please let me know!"}, {"post_id": 21875, "ts": "2026-07-04T01:26:13Z", "hours": 2.4442, "text": "Error Protection and CSV Logging Long time no see haha! Progress Error Protection through try/excepts and error codes Error codes were creates for the failure points. Any time there is an error, it is emailed to the “admin” email. Every whenever there is an error/email sent/status the data like the station id/name, time, status, etc. is saved (appended) to a csv. All error retry logic is modifiable through the config.py."}, {"post_id": 21793, "ts": "2026-07-03T22:06:04Z", "hours": 1.4372, "text": "IT IS WORKING!!!! Oh my god man. The email notifications were a little annoying to get finished but they are working. The image is more redacted than a Call of Duty game but it is fine. Progress Recovery emails have also been made. Everytime a station is checked, it’s “stats” (such as when their last offline was etc) are updated using a seperate json file. I have mostly spent my time on bug fixing and smoothing out the app."}, {"post_id": 21730, "ts": "2026-07-03T20:26:20Z", "hours": 3.375, "text": "Start! Hey guys! This project is all about improving the experience of personal weather station (PWS) owners. It is a webscraper checking for the status of these weather stations. After it detects it has been off for a while it will email the administrator of the network as well as the owner. (This is a summary, take a look at the project page for a better explanation ;) Progress? The station are scraped and their status is recorded Json files for the current and past status as well as other things is updated/created when the program is run Email notifications (in work) Timestamps in the right timezone (config). Several stations can be checked at once And other stuff I kinda forgot ;-;"}]...
|
Title: Weather Underground Station Status Checker Title: Weather Underground Station Status Checker by @Krupam | Stardance
Devlogs:
Start! Hey guys! This project is all about improving the experience of personal weather station (PWS) owners. It is a webscraper checking for the status of these weather stations. After it detects it has been off for a while it will email the administrator of the network as well as the owner. (This is a summary, take a look at the project page for a better explanation ;) Progress? The station are scraped and their status is recorded Json files for the current and past status as well as other things is updated/created when the program is run Email notifications (in work) Timestamps in the right timezone (config). Several stations can be checked at once And other stuff I kinda forgot ;-;
IT IS WORKING!!!! Oh my god man. The email notifications were a little annoying to get finished but they are working. The image is more redacted than a Call of Duty game but it is fine. Progress Recovery emails have also been made. Everytime a station is checked, it’s “stats” (such as when their last offline was etc) are updated using a seperate json file. I have mostly spent my time on bug fixing and smoothing out the app.
Error Protection and CSV Logging Long time no see haha! Progress Error Protection through try/excepts and error codes Error codes were creates for the failure points. Any time there is an error, it is emailed to the “admin” email. Every whenever there is an error/email sent/status the data like the station id/name, time, status, etc. is saved (appended) to a csv. All error retry logic is modifiable through the config.py.
Monthly Reports, Maintenance mode, and Reminder Emails: Yolo! Reports? Every month (Rn configured to be the first of the month at 8 AM) a report will be sent for all of the stations with a bunch of stats such as: Total downtime Uptime Percentage of outages Table of outages Longest outage Station with most outages etc. Reminder Emails: Once a station goes down and it has not been resolved in a set amount of days, a reminder email will be resent to the owner Maintenance Mode: Once switched on, emails about status will not be sent for that weather station. Checks will still occur in the background however. In the future, I will create an FastAPI app that will let owners trigger this mode on/off for their station. Suggestions? If you guys have any other ideas, please let me know!
Monthly Reports, CSVs, and a little bit of Insanity Hey guys, I have done so much, I might go insane haha! Reports? Every first of the month at 8 AM, a email will be sent out to any emails configured for them. They contain various stats such as, which stations are down, which have been down for the longest, uptime percentage, etc. Emails So I just realized that I never explained all the different emails haha. Recipients: Admin: Email(s) configured to recieve only system error emails Global Recipients: Email(s) configured to receive all emails sent by system concerning status. Report Recipients: Email(s) configured to receive monthly emails. E.g. Mesonet maintainers Station Recipients: Email(s) configured separately for each station. E.g. station owners. Email Types: Offline: Sent after a station is recorded off 3 (default) times in a row. Recovery: Sent once a station is detected to be online after being considered offline Reminder: Sent after 7 days (default) to remind of the status. Monthly Reports: Sent at the first of the month at 8 AM (default) with statistics such as which stations had outages, the station with longest, uptime percentage for each station, etc. System Errors: Sent to system admins for any errors detected, HTTP, Requests, Time, etc. CSVs All of the data is logged on a csv as well. Not much to say Insanity Something about sitting around staring at a screen doing like 5 projects on and off makes you a little crazy…on the brightside it is my birthday tomorrow. That means more coding time! ;-;
SQL Database, Website Backend, Dashboard When I said a lot last time…that was nothing compared to now ;-; What am I going on about? Well, I wanted a way for station owners to be able to be able to toggle maintenance mode without the admin (whoever deploys this for their own mesonet) directly editing a json file every time. One thing led to another and now I am making a website… Website Plan: This website will run on a FastAPI backend with either Jinja2 or Htmx front-end. There will be a public “dashboard” where anyone can take a look at general station stats and current weather conditions. The weather conditions will also be made graphical with Matplotlib. Historical data will also be accessible. However on the same site, people will be able to log in. Logged in users will be able to access only certain stations they are allotted. They will have a more detailed dashboard with more stats. Certain users will be able to toggle maintenance mode and some won’t. Admin accounts will be able to see and toggle for all stations. Usernames and passwords will be hashed and saved in the database. The log in system will also make use of cookies/sessions to keep the user logged in. Planned SQLite Models users: (DONE) id username password_hash role (admin, station staff, etc) user_station_access user_id station_id can_view can_toggle_maintenance stations: id station_id is_in_maintenance is_public station_status: station_id last_status consec_offline first_offline last_conected alert_sent station_current_weather: temp dew humd wind_speed wind_gust wind_dir pressure precip_rate precip_accum uv solar Progress? I have made all the models and created basic routes. There is a CRUD (Create, Read, Update, and Delete) for the stations based on another config file. On start, the program will automatically create database entries for new stations and delete ones not in the config file.
Website Backend, JWT, and HTML Front End Ok, these dev logs keep getting exponentially longer and longer ;-; What the hell is JWT? JWT (JSON Web Token) is a way for my authenticate a user. It essentially is how I can do logins. When a user is registered, their username and hashed password is stored in the SQL database (DB). When someone would like to authenticate, their password is hashed and sent with the username. The DB check if the username and hashed password match and send back a JWT token that expires after a set time (30 mins but configurable). During this time the user would be able access their station dashboard, etc. Admin accounts have the same log in procedure. They however have the power to give each user (based on their user id in the DB) access to specific stations. This includes the ability to see the station dashboard, toggle maintenance mode, and toggle if the station is public (on our site). Backend: Added functions for creating accounts and logging in. Most functions now require either a general account or a admin account. If this is not fulfilled a 401 error is sent (Unauthorized error). As of right now, only admins can register accounts. The access to each station can be updated by a admin at any time. I did some more stuff but I honestly forgot :) HTML Front End This was honestly my favorite part so far. I started by getting the Jinja2 template system to work as well as mounting the static directory. The layout.html file allows me to change it slightly for every page. That is a bad explanation but it is a really cool system. I got the home page done (needs some text and description but thats a later me issue). I am working on getting the general station page. It will list every station and allow you to click on them to get forwarded to that stations public dashboard. Sanity Check? I am having so much fun with HTML. It gives a certain gratification that SQL can’t give. I feel very happy :D Any ideas pls let me know!
LOGIN FORMS!!! And Station Lists… Hey guys! Whats up? I’ll tell you whats up, the moon. 😅 Dad jokes aside, I am really excited to update you. Login forms…how exciting Wait wait I can explain. It is cool I swear. When you input your credentials into the form and submit it, it will check the database (DB) if you have the right ones. If you don’t you will get the invalid screen shown below (I definitely didn’t forget my own password…). But if you put in the right credentials, you will be given a access_token cookie. This cookie will let you stay logged in till the cookie expires (set for 30 mins ). Once you are logged it, it will direct you to your account dashboard and show you all the stations you have access to. (I didn’t make that one yet but shhhhh) Station List When you click on the Weather Station tab, it will show you a list of every single weather station in the network. Something else cool, whenever you hover/click a button, it will change color. Just fun for me. Save Barnegat Bay I am building this system as a idea I had for the Save Barnegat Bay (SBB) non-profit organization. I utilize their weather stations all of the time for my projects that I love giving back to their mesonet! Once I am finished building this, you will be able to access the SBB weather stations and see weather points as well as graphs and stuff. Oop can’t spoil all of my planned features
Registration Form, Posting Status, Status History Hola guys! Registration There is now a registration form! It takes in a username and password and creates a user. However this user has no permissions and the person has to contact the admin to give them permissions. (in the future, a regular base user will still be able to do more stuff, see more detailed data maybe? But I don’t want to block data based on accounts. Maybe emails of your favorite stations?) Posting Status When the status checker runs, it will send the results over HTTP post to the database (DB) to be saved. The “current” Status DB model is overwritten by new data, but if there is a change in the status in any way, the change will be saved to the Status History DB Model. Time Another tiny detail is that before the status checker would store time in local time, but I changed that to be UTC time. UTC time is now universal and I plan to display the time in the local timezone based on the browser time zone. Easter Egg I added a easter egg in the website, I wonder if someone will find it… Thanks for reading these devlogs, this is not necessarily a fancy/flashy project and it means a lot when someone does ❤️.
Working Error Pages, User Updates, Logouts, Weather Post/Weather History and a (partial) public dashboard Been a couple of days guys, here is what I have been up to: Error Pages: Whenever there is some sort of error such as 404 (not found), 401 (unauthorized), 403 (Forbidden), you will get forwarded to error pages. These pages will prompt you to return or log in, depending on the error. User Updates: Admins can know easily update usernames, passwords, roles, etc. However this is still in the API and not a webpage yet. Logouts: When you sign in, your menu bar will no longer have a sign in option (shocker) and has an option to log out. This “new” menu bar is created using jinja2 if-statements in the layout.html. Weather/Weather History: A Weather Underground Scraper (I made this for a seperate project, check it out: https://github.com/Krupamc/weather_underground_datascraper ) gathers weather data for each station (returns a null filled json if station is offline) and posts it to the API. The API stores it in the database. We can access the current weather for each station as a well as the history. The default history is 20 entries but can be extended with queries. Public Dashboard: Now this is the fun one. This pulls the current status, weather values, time (as a date and timestamp in a readable format), as well as wind direction in label format (e.g. NNE) and sends it to the public dashboard. The dashboard then takes the values and puts them in an easy format. It is not finished, I plan to have pressure, temperature, and wind widgets that change based on the current values.
Public Dashboard and dashboard widgets!!! I had a lot of fun with this… Public Dashboard This is a public webpage anyone (no need to log in) for each station, listing the current weather conditions and status in a nice gui. In here are some widgets I made by myself all in CSS and HTML. (I don’t like JS if you couldn’t tell…) These weather values include: Temperature Dew Point Humidity Precipitation Rate Precipitation Accumulation UV Index Solar Radiation Atmospheric Pressure Wind Speed Wind Gusts Wind Direction Dashboard Widgets: I made a couple of widgets that update based on the values: Temperature Pressure Wind Temperature: A small thermometer that fills up as the temperature gets higher. (I have to rescale it for Celsius) Pressure: A small barometer that changes based on the pressure. The center pressure (29.92) is the atmospheric pressure at sea level. Wind Speed: A little compass shows the cardinal through tertiary wind directions (16 directions). The current wind is represented by the blue arrow. The arrow is where the wind is coming from (how wind is properly notated) Let Me know if you guys have any other ideas, I would love to hear em!
Owner Dashboard (WIP) and Maintenance Toggle Welcome back to a episode of me going insane! :D (jk) Owner Dashboard (WIP) The owner dashboard is a dashboard that is separate from the public dashboards. You must log in to access a page called “My Stations”. This page lists all stations that your account has permission to view. The account that you are using must have the station added by a administrator (rn all of those methods are in the docs. I plan on moving them to html soon) Purpose of Owner Dashboard The owner dashboard holds some extra functionalities based on the status: Online It will show a green or red icon based on the status (along with the circle up by the units toggle) and display the exact time and status of the station. The time of status is separate from weather. If you have the permissions to do so, you can then toggle the maintenance and public modes. (Only maintenance mode has been implemented thus far) The maintenance mode stops any emails from being sent about the station Public mode will allow the station’s public dashboard to be listed on the website. Offline: Shows everything in online*. Does not show weather data Displays how many times the station has been shown to be offline. (consecutive offline) The time of last connection. First offline (this is when the station is set as offline) If an alert email was sent Let me know if you guys have any ideas!
Owner Dashboard (finished), Maintenace and Public Toggles, Dashboard Graphs, and Graph Page (WIP) A lot has happened, lets dive into it: Owner Dashboard: This dashboard may not look very different from the public dashboard but it hold a lot more features: Status widget with the status time and last status. A green check if online or a red X if not. If offline, no weather data/widgets are shown and instead a gear widget with more information is shown. This includes if a alert was sent, last time connected, first time offline, and consecutive offline checks Maintenance and Public toggles Maintenance toggle: If in maintenance mode, no emails will be sent about the status of the station but it will still be logged. Public toggle: If off, the station will not be shown in the public dashboard list. If you try to go to the url directly it will show a “Station Not available” Page. Dashboard Graphs Graphs are created using Matplotlib and show cased on both dashboards. This includes solar, precipitation, pressure, and temperature graphs. Graphing Page (and analysis) This page is currently being worked on but will allow anyone to choose the time range, variables (yes multiple!), station, and unit. I also want to have a section for analysis like regressions and so on. Lmk how this is looking so far!
#Graphing Page!!! As well as other bug fixes… Graphing Page This page is created by making a HTML form and submitting as a POST request to the same method that creates the dashboard graphs. All the graph information is a query request (the infomation after a question mark in a url, see photo). This means you can bookmark a graph to see the most recent data with your own personal preset. The user must select the station (from a list), type a title, the time range, (last __ unit), and the variables they would like. They can choose as many variables as they would like. There are also variable type presets a user can choose. It will preset everything to make the graph including the time range and title. Once a graph is generated, it will be displayed with the options to download it as a png, download the csv data, or the clear the graph. I am working on a date range next as well as the analysis page with linear regressions, t-tests, ANOVAS, etc. Bug Fixes I had a couple of friends test out the site to find some bugs, and boy did they deliver. They managed to point out some logical errors I had, and I fixed them.
A Variable Analysis Page and Graphing with a date system! Hey guys! Here is what I have been up to… Graphing Date System: As well as a “last _ ____” system (relative range), I created a version that allows me to choose “Date Range.” Date Range allows you to choose between two dates. It sounds simple but was a lot harder to code 😅. As I wrote most of the code while being really sleep deprived, take a look over at @app.get("/graph/weather/{station_id}") on the project’s github page. (I recommend using ctrl + f to find it) Variable Analysis Page: This page is pretty similar to the graphing page (see previous devlogs) where it uses a HTML form with query variables to create calculations. The user selects a weather station, variable, range mode (relative or date), inputs for that mode (hours/date, etc) and the units. Then the latest, minimum, maximum, mean, median, range, sample value (n value), and the overall trend (falling, steady, rising, insufficient data). The time will also be shown if applicable (latest value). You can then download a csv of all the data the calculations were derived from. Under that is another box showing the full time the data is collected from as well as the units Future: I still need to add a tab for more advanced analysis such as linear regressions, anovas, t-tests, etc. If you guys have any more ideas, Let me know!!!
Testing Page (Still WIP), General Bug Fixing, and Site Cleanup Yikes, I got reaaaal close to hitting the 10 hour limit for these devlogs 😅… Site Cleanup I am really proud of this one. I finally took time to go around and get most of the small detailed squared away. I got the site favicon (small icon in the web tab) and other meta data information fixed (like the .webmanifest) working. I also spent a good chunk of time creating the home page and making it look professional. General Bug Fixing I took some time to go through the website and found some tiny bugs. I also had a few of my friends test out the website (they didnt break it!!!!). Small stuff like making it easier to see the graphs, titles on the tabs, etc. Test Page This page is like the ultimate boss for me haha. I would like this page to contain linear regressions (LR), ANOVAS, and T-tests. These are scientific tests used to find statistical differences in data. (see the below screen shot for a better explanation of all of these tests. The user chooses a station, range mode, range, units, and the type of test. Then based on that test, a few options are given: LR: X Variable Y Variable Title Mode A: Choose 1 station but two time ranges (same variable) Mode B: Choose 2 stations with one time range (same variable) ANOVA: Mode a/b Three or more time ranges/station depending on mode Two ranges/station depending on mode
Testing Page Finished! (without csvs…) HTML Form Bug Fixes: Sup guys, here is what I have been up to… Testing Page: Oh man this was pretty hard. I actually had writers block but for code. I just couldn’t think of a solution. I just sat there trying to think of how to implement the system. With enough brute force however and some breaks, I did manage to get it working. What is it? This page allows the user to run scientific tests. These tests include Linear Regressions, ANOVAS, and T-Tests. Linear Regressions look for a relationship between variables. ANOVAS and T-tests determine if there a difference between groups of data (single variable). Functionality: The form will ask the user to choose a test, station, variable, unit, and time range, as well as test-specific inputs to run a test. Once the user submits the test, it will either return a graphical result (for the Linear Regression) or stats of the T-Test or ANOVA. The Tests will only make groups depending on the same time frame but different stations. (I only decided to do one for simplicity) This all works but I need to create the ability to download the csv of the data used for the tests. General Inputs: Test Type (T-test, ANOVA, Linear Regression) Range Type: (Relative or Date) Last ___ (hours, months, etc) Start and end date Units (Imperial or metric) Test Specific Inputs: When a test is chosen, test-specific inputs appear. (this happens for other forms such as graphing and analysis pages. I just forgot to mention it) The appeared inputs are then required (like the other default inputs like time, etc) but when a different test is choosen the required inputs are updated with the new ones. These include: Linear Regression: Station X Variable Y Variable Regression T-Test: Outcome Variable Station A Station B ANOVAS: Outcome Variable Station A Station B Station C HTML Form Fixes: I went through all of the Forms that have inputs that switch and make them work nicely with the backend. I make inputs that switch be required and seen at the right time.
CSV Downloads, Weather Table, Error Details on pages, and a profile indicator! Let’s jump into it! CSV Downloads: For graphing, analysis, tests, and table pages, I created CSV downloads. Graphing: Downloads raw data Analysis: Downloads analysis summary and raw data Tests: Downloads test results and raw data Weather Tables: Downloads raw data Weather Tables: In the public dashboards, there is now a table at the bottom with all data from the current day. There are quick buttons to go forward and back a day as well as a day input and go button. Profile Indicator: It is just a blank profile picture icon with your username next to it. It only shows when logged in. When clicked it sends you to the my-stations page. Error Details: If there are specific error details in the backend, they will be sent to the error page. Otherwise a generic 40X error will be show
Admin Settings Page (WIP) Settings Page: Now that the main functionality of the site is finished, I started making HTML representations of all the methods I have predefined. This includes CRUD (create, read, update, and delete) functions for several pieces of the website. Here are the ones I started to make: Reset/Update User password, username, role. Register Users Delete User Read User Assigned Stations Grant User Access to a station Revoke User Acccess to a station Modify User Access to a station. Everything uses HTLM forms and when they submit, they will return a pop up success or error message. There are a couple of other features I forgot that I made (Such happens when coding at ungodly hours) but anyone can try out the website (if I am working on it at the same time) at https://sbb.krupamlab.com
Settings Page, API Stations List Call for Scraping System Hey! Here is what I have been up to… Settings Page: This is a Admin only page (will pop up in nav bar when admin) that configures, deletes, creates, the main functionalities. This includes stations and users. After every function is run a error/success message will show with detailed intomation depending on the function. These Functions include: Modify User: Change role, username, password Register User: Create Delete User Read User Assigned Stations: Choose a station, the page will reload and show all stations the user can access. Grant User Access: Choose a user, and give them access to a station. This is view only by default Revoke Access: Remove User access to a specific station. On reload after choosing a user it will show any assigned stations Update User Access: Choose a user, on reload it wil show all available stations and when selected, will show what access it has. You then check/uncheck the access you want it to have and submit. Modify Station: Currently only allows to change station name. Create Station: Enter new id and name as well as options to be public and in maintenance mode (default off). Delete Station: Deletes station only from the current stations. Does not delete data. I need to rewrite this to make it so it stops collecting data instead. Read all Stations: Lists all stations and if they are in maintenance or not API Stations List Call I realized around 11 at night that I did something very dumb. All of the stations in the configs for the Weather and Status scrapers were hard coded values and were NOT synced with the current stations database. To combat this, I added a new column to the Stations database table. This column was called collect_active or something of the sort. I plan to migrate the delete function to turning off the collection. I then changed the scrapers to pull a new current list at every run and used that as their truth. I finished this around 3 AM last night 😭 . If you guys have any other ideas, let me know!
Some Help and ReadMe! The project is almost done! (why do I feel like I will be saying that a lot…) Some help! Today I saw interesting post on Facebook about a website someone my age built and I commented it on it asking if I could see the code cause I was curious if they used Flask, FastAPI, etc. I also posted my project and to my surprise, the poster is actually my friend’s dad (small world am I right) and he reviewed my code and left a few issues on it. He even downloaded it to update my requirements.txt. I then merged his request. Thank you for all of your help! ReadMe: I spent all of today working on the readme, you can read it here . However here is a little sneak peak: Hey! My name is Krupam, and I am a nerd. If you are reading this, you are most likely one as well. I love weather, and learning about it. Other people who love weather will create and host Personal Weather Stations (PWS) and post the data to websites like Weather Underground. I have used these stations for my own research projects. Check one out!. In my area, there is a mesonet (regional network of PWS’s) from the Save Barnegat Bay non-profit (check them out, they are awesome!). I have used plenty of their stations in my research. I was given the amazing opportunity to present my research at one of their meetings regarding their mesonet. It was eye-opening! As I listened into the meeting, they discussed one of the current issues; they could never tell when a weather station went down. The station owners would find out days after if not weeks. This program is the solution to that and more. The system is a weather-station data platform and monitoring system. The system collects data from Weather Underground (WU), turns it into usable information, and alerts station owners and administrators when a station needs attention. All data is shown on the website in a easy, user-friendly approach. This includes dashboards, graphing, analysis, scientific tests, and admin controls (accessed through JWT-based auth). The system is coded mostly in Python and there are three main systems: The weather and status scrapers, backend, and frontend website.
Robots.txt, User login error, API security, credit footer, station hardware Whats up? Robots.txt: For those who don’t know, a “robots.txt” tells scrapers and any bots where they allowed to go on your website. I only allowed them to go on public html pages. However this is only a recommendation, the big guys can do whatever they want. User Login Error: I had this error where any public accounts (or not admins) would get a error when logging in. I was searching for permissions with the wrong column in the database 😅. API Security: I made sure there were no open routes and everything was secured. Credit Footer: This was pretty cool. At the end of ever page, I added this little footer with my name and a link to the github repo. Station Hardware: I added a new column to store station hardware info. This is mainly for what weather station model it is. Ex: Davis Vantage Pro2. I am working on making the update form in the settings page allow to update this info as well as more station info.
API Email Calls, Hardware specifications, Docker? Hey guys, School started two weeks ago, so my posts will be a little delayed lol… API Email Calls: I originally hard coded my email lists for Reports, station-specific, admin, and global emails, but I wanted to unify them with the rest of the API. I spent a lot of time creating columns in SQL, endpoint CRUD, settings HTML page CRUD, as well as changing the scrapers to pull the lists and use them. Hardware specifications: I added columns in SQL to add Hardware metadata for the stations. It can be seen in all dashboards (see photo) Docker: I was thinking of creating a docker container for this setup to make deployment easier. Would that be something you guys would like to see? Let me know.
Docker and Environment Variables Hey guys! It has been a couple of days… Time Crunch: So I looked on my calendar a week ago and realized that Stardance was almost over, and thought “this is plenty of time”. Then a couple of days ago I really felt the pressure. I wanted to get this out before the program finished so I started on the final bits and deployment to turn this into a usable system. Docker: If you don’t know what docker is, count your lucky stars. Just kidding, its very cool when it works . It is a type of virtualization (similar to VMs but instead sharing the kernal) that is a lot less resource intensive and is used for deploying a lot of small projects as well as any type of home labbing work flow (hosting your own server etc.). I have worked with docker with pre-built images and containers before and never really went into the DIY portion. This was my first intro into it and I had to do a lot of googling and the such. It was really frustrating and required quite a few head banging. NOTE: I did use AI sometimes (tried as little as I could) to get docker working. You can see me sometimes using it in my lapse recordings, but I tried to keep it closed as long as I could to stop me from using it :D. Environment Variables: I was told that hard coding my config values in a config file was a bad idea…and it makes sense. It took a bit, but once I setup environment variables, oh man did it get so much better. This also makes it a lot easier in docker to setup the container. Very happy about this. Help from a friend! I told this story a couple of weeks ago, but one of my friend’s dad found my repo and left a couple of issues on my page and these were my last two. I really gotta thank him for these ideas.
Docker Deployment (ALMOST finished) Hey guys! Docker: I am using Docker for deployment of this system to make it easy for anyone who has a weather station or network of them to showcase and monitor their own data. Docker is a type of virtualization (similar to VMs but instead sharing the kernel) that is a lot less resource intensive and is used for deploying a lot of small projects as well as any type of home labbing work flow (hosting your own server etc.). (Yes I pulled that explanation from my last devlog lmao). I will have a tutorial in the ReadME. Within the docker stack, there are several containers with different jobs and responsibilities: Web: Hosts the FastAPI webserver. It uses a endpoint (/health) to monitor the servers responses. It is hosted on port 8000 by default (configurable in the .env file). I would forward this through Nginx or a Cloudflare tunnel to host it under your own domain. Scraper: Runs the status and weather scrapers every 15 and 5 minutes (offset by two mins) respectively through a crontab file ( scraper.crontab ). It is run using Supercronic. The scraper waits for the web server as well. Flock is used to prevent two instances of a program. DB: PostgreSQL server that holds all of the data. Weather data, users, etc. All of the other containers wait till the DB is healthy to start. Db_backup: A container created by Prodrigestivill to automate backups of Postgres databases. I have it configured to keep the last month and 14 days of backups. It saves all backups to the /opt/mesonet-backups folder. I wrote scripts in order to test restoring backups (creates test table, restores using latest backup, and deletes it), create a manual backup, and restore the last backup. Email Alerts: Fairly similar to how emails are sent in the status-scraper, it obtains admin recpients from the web sever uses enviroment vairbales to send an email. It asks for subject and text using arguments in the terminal, so the user can send emails manually to admins as well. Health-tests: Runs a couple of health based scripts on a Supercronic schedule. Monthly restore test (runs the restore test mentioned before) and a daily backup health (checks how old the backup is). Emails will be sent to admins if the restore fails or the backup is more than 26 hours old. Persistent Storage: All the containers used volumes that continued even if the containers were deleted to be updated, the data (and the backups) are fine.
Map! And Develop mode Map I used ArcGIS’s JS to create a map tab that show cases all stations that have a latitude and longitude value. I am working on getting them on the first ever scrape but you can also edit them within the settings page. There is a link that takes you to the station page as well. Develop Mode Created a toggle within the .env file. If on, the program will use the SQlite db and be able to run on VS Code for example. When it is off, it needs the PostGRESql db to function. Docker Docker is really infuriating lmao. Spent most of my time fixing tiny bugs.
Weather Emails, mobile tweaks, map zoom Soooooooooooooo close to shipping. Map Zoom: The Map will now automatically zoom based the center of the points. Humidity and Dew point data collection: The place the data was being scraped from got changed so I had to update the logic. Weather Emails: Created another CRUD for another email list. This list will get a monthly email summarizing the weather for the past 30 days for each of the stations. I created the web page for it, but need to finish cleaning it up, allowing people to sign up for the service and make the emails send automaticcally. Mobile Tweaks: The mobile version of the website did not look good. I spent a lot of time trying to fix it before I was able to get it to look like this!...
|
1792799654.0079603
|
1793404454.0079603
|
|
22691
|
Scratcher by @BetterClient | Stardance
|
BetterClient
|
0
|
182.41
|
0
|
[]
|
[{"post_id": 81059, "ts": "202 [{"post_id": 81059, "ts": "2026-10-19T18:13:33Z", "hours": 5.56, "text": "CLI I did some small refactors and added a new CLI, built with Clikt It’s very simple to use: scratcher check file --options //check the file for any compilation errors without compiling scratcher compile file --options outFile //compile into a .sb3 file scratcher standard-library //print out the standard library Clikt also provides easy to use help menus I also added a sort function to the array and list libraries"}, {"post_id": 78430, "ts": "2026-10-10T19:47:24Z", "hours": 7.5478, "text": "PROPER ERRORS Errors are the one thing that I knew were terrible but I could never build up the courage to fix. So I just fixed them. Now all errors in the language are formatted nicely, show you exactly where the error happened and give you a nice description. Along with this, I made a new system for collecting errors, so now the compiler won’t stop at the first error and will continue going and give you all errors at once. This makes fixing code a lot easier. This also opens up the possibility of an LSP server later on (before and after in images)"}, {"post_id": 76716, "ts": "2026-10-04T12:20:48Z", "hours": 6.6447, "text": "More demos and QOL Try it out: https://scratch.mit.edu/projects/1387804691/ Demos Math lexer, parser and interpreter: New demo that lets you input math expressions (eg: 1 + 1 ) and get the result. 3d cube renderer: a spinning 3d cube and player controls QOL Smarter inlining cost calculation A math centered optimization for removing identities Get rid of PromoteToGlobals (temp) GC documentation Codegen fixes (receiver functions generate the same block, causing scratch to get confused) Stack size optimization (reuse stack slots of the same type) Fix crash when the garbage collector is disabled"}, {"post_id": 74467, "ts": "2026-09-27T13:15:50Z", "hours": 7.5128, "text": "Demo programs and general improvements I added demo programs to scratcher, these show the language actually being used Try one out! https://scratch.mit.edu/projects/1385339395/ General improvements Bug fixes Dummy sprite Make the type checker ignored in inlined functions Make topLevelInit smaller and remove unused functions from final compilation TurboWarp specific compilation mode with faster operations on strings/lists (not compatible with vanilla scratch if enabled)"}, {"post_id": 72783, "ts": "2026-09-23T18:48:59Z", "hours": 2.1378, "text": "Indexed repeat and general improvements Added a new indexed for and repeat statement which allows way easier index tracking: //Before: int index = 0; repeat(10) { ... index++; } //After: repeat(10) { index -> ... } I also made the PooledList get garbage collected with the refcount gc Did some really small refactors aswell"}, {"post_id": 71161, "ts": "2026-09-20T11:38:26Z", "hours": 2.5564, "text": "List pools Static lists are cool, but they are very limited expressiveness wise because they must be known at compile time Pools fix this by having a pool of static lists that the user code can allocate at any time PooledList a = allocate(); But because the pool is limited, the pooled list must be freed when not needed, the garbage collector will not handle it(yet) a.free(); Other than that, the PooledList behaves just like a List and can do almost anything a List does I also added proper documentation for Out of memory errors."}, {"post_id": 70752, "ts": "2026-09-19T18:17:22Z", "hours": 10.2792, "text": "QOL I added a shit ton of quality of life stuff: Tons of bug fixes Big array syntax: int[] myArray = [1, 2, 3, 4, 5, 6]; Safe casting for enums(previously a panic): Result.Success? a = res as? Result.Success; Out of memory detection: Scratch caps lists at 200k elements, after that it silently stops adding stuff to the list Compact int list: Store pretty much infinite integers without wasting heap space SHORT CIRCUITS: DONT EXECUTE RIGHT SIDE OF && or || if left side is false/true! If statements without braces: if(a) b++; CONTINUE AND BREAK: while(true) { if(a) break; if(b) continue; } STATIC LISTS: store data outside of the heap in scratch lists so that you dont run out of heap space: static str[] myList; This also allows for file reading: static str[] myList = \"hello.json\"; So you can properly store data(like ROMs) CASE SENSITIVE EQUALS: DID YOU KNOW THAT SCRATCH “=” BLOCK IS CASE INSENSITIVE??? And its pretty hard to make it case sensitive Now you can do “===” and its case sensitive: 'a' === 'A' RETURNS FALSE"}, {"post_id": 65445, "ts": "2026-09-10T16:08:38Z", "hours": 8.1706, "text": "DOCUMENTATION I do not want to touch any markdown ever again"}, {"post_id": 62828, "ts": "2026-09-06T11:04:43Z", "hours": 2.5681, "text": "Privates Added a “private” keyword, anything declared private cannot be accessed from outside the current file. This prevents the user from messing with internal states of libraries they are using For example, the list library from the standard library. Now you can’t directly mess with the list pointer triangles.ptr[5] = ...; This now results in an error because “ptr” is private! I also added some small optimizations for lambdas."}, {"post_id": 60869, "ts": "2026-09-03T14:48:30Z", "hours": 3.9831, "text": "Operator overloading Added operator overloading, now you can define overloads for specific operators so that code looks cleaner Just use the operator keyword with the correct signature and you’re done! You can overload the operators: +, -, /, *, %, [], []= For example: warp operator <T> void T[].set(int index, T item) { self::replace(this, item, index); } //use array[index] = item //compiler translates to set(array, index, item) I also realized that my previous refactor of arrays broke my nullability system: int[] a = Array(int, 5); say(a[3]); This would print null , which my type system missed I fixed this by moving arrays to a standard library module, the same array import works, but you have to change how you create the array: //before: int[] a = Array(int, 5); //doesn't need to be marked as null!!! int[] a = Array(int, 5); a[0] = ...; a[1] = ...; ... //after int?[] a = arrayOfNulls(5); //null filled int[] a = arrayOf(5, (int index) -> { return index * 5; //value of the array at that index });"}, {"post_id": 58837, "ts": "2026-08-31T12:49:12Z", "hours": 1.1706, "text": "Import some import names into unqualified co ntext Before: //import import list; //use list::List<str> myList = list::newList(); After: //import import list::*; //use List<str> myList = newList();"}, {"post_id": 58031, "ts": "2026-08-30T11:39:09Z", "hours": 1.2083, "text": "Pattern matching for sealed enums Previously if you wanted to check sealed enums types and use them, you had to do very ugly syntax for actually getting the variant instance: auto out = tryGet(); when(out) { Result.Success -> { auto suc = out as Result.Success; looks::say(\"Success! ${suc.out.x}\"); Now you don’t have to do all of this: when(tryGet()) { Result.Success suc -> { looks::say(\"Success! ${suc.out.x}\"); This is just syntax improvement, doesn’t change the generated code or anything, just helps the developer"}, {"post_id": 56767, "ts": "2026-08-28T17:36:33Z", "hours": 3.9356, "text": "ACTUAL ARRAYS!! Previously, scratcher “arrays” were just lists, you could add more items, it would dynamically resize, it was written in the kotlin DSL, so technically it was just a list. I removed the previous list code, reused some of it and added a new Array system Along with that, the normal lists got rewritten in 100% scratcher with no internal functions The new system is almost fully backwards compatible in source code, you just have to make a few changes The new implementation is more clear, more expressive and more like regular programming languages"}, {"post_id": 54379, "ts": "2026-08-25T10:59:05Z", "hours": 2.1919, "text": "I’m sorry For over 2 months, scratcher has had an “export” keyword, which was fully unused, until today: I implemented the export keyword on functions, which allows for code written in plain scratch to interact with scratcher code: export warp void myFunction() { ... } Export requires that your function arguments are all primitives and that the return is also a primitive, but other than that, it does not change anything, just exposes the function cleanly to regular scratch code. However, scratcher type checking still applies, so if the native scratch code passes in a string to a float argument, it will still cause a panic Even when you have obfuscation enabled, exports will stay and let native scratch use it with its original name"}, {"post_id": 52903, "ts": "2026-08-23T08:56:58Z", "hours": 3.9047, "text": "Sealed enums and faster GC I added a new type of object, sealed enums: sealed enum Animal { Cat(str name, int age, bool isMeowing), Dog(str name, int age), Unknown } They allow for storing data inside enums, they’re very similar to rust enums: sealed enum Result<T> { Success(T out), Failure } I also refactored lambdas to use a sealed enum instead of a big struct: //before struct LambdaCaptures(Lambda0Captures? c0, Lambda1Captures? c1, Lambda2Captures? c2); //after sealed enum LambdaCaptures { Lambda0Captures(Box$int capture0, ...), Lambda1Captures(Box$float capture0, ...) } Sealed enums only store a tag and a pointer, so if you use a lot of lambdas, this will save a TON of heap space Faster garbage collector! I made the marking phase of the mark and sweep collector faster by using an epoch based cleanup approach Now, instead of clearing and re-populating the marked list, we don’t ever clear it and we invalidate it by just increasing the epoch. This makes the isMarked check go from O(n) to O(1) while also improving marking speed because scratch doesn’t have to resize our list"}, {"post_id": 51327, "ts": "2026-08-20T22:21:05Z", "hours": 5.0097, "text": "MORE FUCKING ABSTRACTIONS!!! I added receiver/extension functions. These allow you to write code that takes in a type as a special argument You define them just like how it works in kotlin: warp <T, R> R T.let((T) -> R action) { return action(this); } It just compiles to a regular function warp <T, R> R let(T this, (T) -> R action) { return action(this); } But the compiler lets you call it with the special argument: thing.let((int a) -> ...); I also added a very big standard library module (written in scratcher!) with a ton of these functions built-in, they allow you to write more expressive code: triangles .filterNotNull() .filter((Triangle<float> t) -> t.x1 > 150) .filter((Triangle<float> t) -> t.y1 < 150) .forEach((Triangle<float> tri) -> ...) I also rewrote the entirety of string lib during this, now you have to use the extensions library to use strings, but its way more powerful (and written in scratcher)! I also added a new “char” type, which stores a single character (wow really???) I also added “safe dot calls” that allow you to use stuff as if they’re not null: triangles.forEach((Triangle<float>? t) -> { t?.x1?.let((float x1) -> { looks::say(\"x1: ${x1}\"); }); }); This only calls the let function if t?.x1 is not null There is a big problem with all this powerful new code though… the garbage collector can no longer keep up, a single mark and sweep takes over 1 second! Which is especially bad because the garbage collector needs the entire application to stop in order to run. You do not want your code to completely stop for a whole second(maybe you do? weirdo), so I have to fix this in my next few devlogs…"}, {"post_id": 49925, "ts": "2026-08-18T21:52:59Z", "hours": 6.2256, "text": "Lambdas I added lambdas to Scratcher! They allow you to write more expressive code like map(list, a -> a + 1) , which literally adds 1 to every element of list I also allow using outer variables within lambdas int a = ...; map(list, b -> { a++; b + a }); I allow this through boxing, the local variables become boxes and the lambdas get the local variable’s box, this makes lambdas more powerful than most languages as this allows for variables to be shared mutable state across lambdas, this also allows the local variables to get garbage collected. Of course, scratch doesn’t support this natively, so lambdas are 100% compiler sugar and just lowers to regular functions and uses function references(which is also 100% compiler sugar). void lambda::defunc@lambad@0(LambdaCaptures c, args...) { ... }"}, {"post_id": 46470, "ts": "2026-08-13T18:15:50Z", "hours": 1.7033, "text": "Fixed the garbage collector… turns out I broke it accidentally while cleaning up code in my last devlog, 3 line change but took a long time to find Made it so the stack allocator doesn’t do redundant operations like 1+1 and inlines them as 2 instead"}, {"post_id": 46037, "ts": "2026-08-12T23:23:02Z", "hours": 1.3453, "text": "100 hours! Evil hack part 4: Death of evil hack So I was using a really terrible hack to implement stuff like FunctionInlining, Safe dot and the elvis expression, the hack is basically (ab)using the when expression to do stuff like run code inside expressions and use local variables inside expressions. So to stop this from becoming a hack, I added it directly to the AST as StatementExpression(not to be confused with ExpressionStatement), which can be used to contain statements inside expressions. All of my evil hacks have been replaced by StatementExpression. I also added some small optimizations for StatementExpressions!"}, {"post_id": 45987, "ts": "2026-08-12T20:32:56Z", "hours": 5.7503, "text": "General language improvements Elvis expressions: If a value is nullable, it is not usable by anything that only accepts non-null values, to solve this, I added the elvis expression, which allows you to give a fallback for null values(compilation in image 2): //int doesn't have to be nullable because we have a fallback value! int x = functionThatReturnsNull()?: 5; String boxing and nullable primitives Previously, scratcher only supported having structs, enums and function references as nullable, now it also supports having primitive types as nullable: str? x = functionThatReturnsNullableString(); //distinguish between literal null and string null if(x == null) looks::say(\"null!\"); if(x == \"null\") looks::say(\"null as string!\"); //the compiler achieves this by boxing the string return with a struct: //struct StringBox(str value) //the actual type behind the scenes is: //StringBox? x = ...; Safe dot traversal If a struct instance is nullable, you cannot use regular struct.member because that may result in a NullPointerException, to solve this I added ?. which allows for null safe traversal(compilation in image 1): //if nullableTriangle == null, return null //if nullableTriangle != null, return nullableTriangle.x1 int? x1 = nullableTriangle?.x1; Deepseek fix I noticed that FunctionInlining completely ignored execution order, so I asked deepseek to solve it(this happened after I added string boxing). But I found a better solution to the same problem later on, so I reverted deepseek’s fix and wrote my own, which is 260 lines compared to deepseek’s 360 lines, over 100 lines shorter!"}, {"post_id": 42848, "ts": "2026-08-07T19:46:20Z", "hours": 7.4364, "text": "Second garbage collector! Added a second garbage collector! If your app does not contain any cyclic objects and needs high performance, you can now enable the ARC collector! This garbage collector works by automatically detecting when objects go out of scope and decrementing their reference count, if an object’s reference count goes to 0, it is freed. This is more performant than the mark and sweep collector because the objects are freed at the moment they are unused instead of stopping the entire program to collect garbage. This works for all cases, except for cases where there is a cyclic object. Because the cyclic object owns itself, so its reference count is always at 1."}, {"post_id": 32011, "ts": "2026-07-20T21:29:16Z", "hours": 4.2214, "text": "Even more abstractions please Added generics support, which allows the user to define generic functions/structs that apply with every type, for example: warp <T> void forEach(T[] a, (T) -> void action) { for(T t in a) { action(t); } } Depending on what type you used to call this, a new version of forEach gets generated, if you called it with an integer: warp void forEach@int(int[] a, (int) -> void action) { for(int t in a) { action(t); } } Of course I also allow this on structs: struct Triangle<Num>(Num x1, Num y1, Num x2, Num y2, Num x3, Num y3); Also did some small changes: Added an FPS counter to my test code Better optimizations that actually detect not(not(x)) Optimized triangle::fill even more (+2 fps) Made DynamicDispatchHandler actually use the apply return properly (it was always returning true)"}, {"post_id": 27929, "ts": "2026-07-13T21:08:14Z", "hours": 2.6361, "text": "More abstractions please! Added dynamic function dispatch which allows for functions to take in other functions as arguments, of course, this isn’t possible at all in normal scratch, so actually FunctionLiteral gets turned into an integer and a custom dispatch function gets created for every function literal’s signature which allows for a binary search to call the actual function Also made HeapConversion reuse stack slots instead of allocating one for every variable(mostly by AI)"}, {"post_id": 27608, "ts": "2026-07-13T10:50:48Z", "hours": 1.5486, "text": "Refactored the entire type system to use a sealed interface instead of an unsafe single class Nothing much to say, this doesn’t affect the input code or the output project, I did just cleanup"}, {"post_id": 27567, "ts": "2026-07-13T08:35:21Z", "hours": 0.8472, "text": "Did more syntax improvements Added ++ and – support: index++; Added type inference support: auto a = Triangle(5, 15, 60, -120, 240, 67); //type automatically becomes Triangle auto a = func(); //type automatically becomes the return type of func"}, {"post_id": 27415, "ts": "2026-07-12T23:35:13Z", "hours": 2.3778, "text": "Scratcher is at 100 commits! (Now 104 cause all of these refactors are different commits) Completely refactored all translation steps to use the ASTVisitor. Also did type resolving cleanup. Function Reachability : Went from 117 to 32 lines Function expression lowering : Went from 439 to 293 lines Re Parse Local Variables : Went from 34 to 27 lines Remove Empty Allocations : Went from 97 to 79 lines ConvertToHeapAccess : Biggest refactor of this whole devlog, went from 500 lines to 418, split into 5 files"}, {"post_id": 26200, "ts": "2026-07-10T21:13:19Z", "hours": 3.26, "text": "Fixed a lot of bugs with when expressions, also got deepseek to fix some of them Added If expressions, which allow using if statements inside other expressions, for example, here is some previously invalid code that is now valid: int max = if (a > b) a else b; str message = if (score >= 90) { looks::say(\"something\"); \"You win!\" } else { looks::say(\"something\"); \"You lose :(\" } triangles[15] = Triangle( utils::random(-240, 240), utils::random(-180, 180), utils::random(-240, 240), utils::random(-180, 180), utils::random(-240, 240), if(mode == TriangleRenderMode.OFF) { 5 } else { triangles[14].y3 } ); These still get lowered properly and just look like normal if statements in the final scratch code"}, {"post_id": 25224, "ts": "2026-07-09T10:42:23Z", "hours": 3.3289, "text": "Added more syntax improvements! Else if : Added support for else if, which replaces big blocks //Before: if(triangles[14].y1 >= 15) { looks::say(\">=15\"); } else { if(triangles[14].y2 >= 155) { looks::say(\"<=15\"); } else { looks::say(\"Both false!\"); } } //After: if(triangles[14].y1 >= 15) { looks::say(\">=15\"); } else if(triangles[14].y2 >= 155) { looks::say(\"<=15\"); } else { looks::say(\"Both false!\"); } Compound assignment : Added support for compound assignment //Before: triangles[15].y3 = triangles[15].y3 + 5; //After: triangles[15].y3 += 5; Enums : Added support for enums, which are just fancy integer wrappers enum TriangleRenderMode(OFF, RENDER, ITHINK); TriangleRenderMode mode = TriangleRenderMode.OFF; When : Added support for when expressions/statements that allow for matching a subject: //Before: if(answer == \"off\") { mode = TriangleRenderMode.OFF; } else if(answer == \"render\") { mode = TriangleRenderMode.RENDER; } else { mode = TriangleRenderMode.ITHINK; looks::say(\"If thinking is your power, what are you without it?\"); return; } //After: TriangleRenderMode mode = when(answer) { \"off\" -> TriangleRenderMode.OFF \"render\" -> TriangleRenderMode.RENDER else -> { looks::say(\"If thinking is your power, what are you without it?\"); TriangleRenderMode.ITHINK; } };"}, {"post_id": 24407, "ts": "2026-07-07T22:53:21Z", "hours": 2.6547, "text": "Tried to do turbowarp only return optimization, wasn’t able to make it very good… reverted it Improved the structure of CompilationConstants Added string::split and string::substring Made some of the list functions inlined (itemAt, clear, length)"}, {"post_id": 22179, "ts": "2026-07-04T14:42:02Z", "hours": 1.2922, "text": "Made the garbage collector treat top level variables as roots, this prevents top level variables from getting freed I added 2 modes to this Reflect: This uses a hacked block to read the variables by name and reduce script size if theres a lot of variables(this doesn’t render properly inside the editor but it works) NoReflect: Get all the top level variables at compile time and mark them one by one"}, {"post_id": 22122, "ts": "2026-07-04T12:41:23Z", "hours": 7.6808, "text": "Garbage collection Added a mark and sweep garbage collector to my language, it walks the roots, marks every used object, then frees all unused objects! Most impressive part of this(in my opinion) is that most of the garbage collector is actually written in my language Misc The garbage collector gets called automatically every 1 second, but you can turn it off (CompilationConstants.AUTOMATIC_GC) If you want to manage memory manually, you can turn off the garbage collector entirely (CompilationConstants.MANUAL_MEMORY)"}, {"post_id": 19412, "ts": "2026-06-30T18:41:23Z", "hours": 1.5931, "text": "Added a name parameter to alloc which acts as runtime type metadata, soon to be used."}, {"post_id": 18732, "ts": "2026-06-29T22:21:59Z", "hours": 0.6683, "text": "Added more compiler sugar for lists: list[index] replaces list::itemAt(list, index) list[index] = ...; replaces list::replace(list, item, index) for(type name in list) {} replaces int len = list::length(list); int i = 0; while (i < len) { type name = list::itemAt(list, i); i = i + 1; } (i am not proud of the shitcode that was used to get for(type name in list) working)"}, {"post_id": 18693, "ts": "2026-06-29T21:37:55Z", "hours": 3.1528, "text": "Added list support! A very barebones implementation that allows the user to create, add to, read from and delete items from lists!"}, {"post_id": 18194, "ts": "2026-06-29T08:15:19Z", "hours": 1.2822, "text": "Made “PromoteToGlobals” which is a more powerful version of OptimizeToGlobals which allows for recursive functions to have their locals turned into globals aswell This is something called liveness analysis, the compiler looks at the code paths and decides at which points a variable is “live”, which means it can’t get overwritten by a recursive call Example: warp int fib(int n) { return 0 if n <= 0; return 1 if n == 1; if (n == 2) { int b = n * 2; return otherFunc(b); } return fib(n - 1) + fib(n - 2); } In this function the “b” variable can be turned into a global because it cannot get overwritten by a recursive call, its used too early for that to happen"}, {"post_id": 17754, "ts": "2026-06-28T17:51:46Z", "hours": 1.5667, "text": "Did some compiler testing Fixed function inlining bugs Fixed a single use assignment bug Created a triangle library that allows for triangle rendering using the pen"}, {"post_id": 17603, "ts": "2026-06-28T13:52:43Z", "hours": 1.7214, "text": "Borrowed the “return expr if(cond)” syntax from ruby Implemented Tail call optimization which optimizes away recursion on tail calls Example: Before: str count(int amount) { return \"Done!\" if amount == 1; return count(amount - 1); } After: str count(int amount) { int tco@argument@amount = amount; while (true) { if (tco@argument@amount == 1) return \"Done !\"; tco@argument@amount = tco@argument@amount - 1; } }"}, {"post_id": 17283, "ts": "2026-06-28T00:21:23Z", "hours": 5.7767, "text": "Source code of the image: on GreenFlag { if(a() == 5) { looks::say(\"yo!\"); } int index = 0; index = index + 1; rgb(index, 5, 5); index = 5; while(true) { pen::eraseAll(); render(); } } The image is of the entire flow working perfectly: The index variable had their value propagated to “1” by the Sequential constant propagation optimization The variable got its uses removed by Inline single-use assignments Then the variable got fully removed by Dead store elimination The rgb function got inlined. Then while it was inlined, because the rgb function’s return wasn’t being used, it got fully removed(the inlining preserves side effects while removing its return value, but because it didn’t have any side effects it got fully removed) Same with the a() function: It got inlined Then the if statement became if(5 == 5) { looks::say(\"yo!\"); } Then Constant folding turned 5 == 5 into true Then Dead code elimination turned if(true) into just the then block I know most optimizations look like they aren’t that powerful, but when combined with other optimizations and ran in a loop, they can pile up and actually optimize code Optimizations Simplify boolean equality : Simplifies x == true to x , simplifies x == false to !x Simplify double negation : Simplifies !!x to x , simplifies --x to x Constant folding : Simplifies true == true to true , simplifies 5 + 5 to 10 Repeat to While : Converts repeat(amount) to a while loop Dead code elimination : Removes provably unreachable code blocks, eg: if(true) { ... } else { .. } turns into ... , removing the if and the else block entirely Now the big ones Sequential constant propagation : Analyzes the control flow of your program, removing useless variable assignments and inlining their expressions Inline single use assignment : Self explanatory Dead store elimination : Removes useless “set variable to x” blocks that don’t get used afterwards Function inlining : The compiler evaluates a cost for every function call is inside a function, if that total cost is less than 10,000, it gets inlined inside that function, removing call overhead and allowing for further optimization Other misc stuff: Fixed the while bug (if you called a function inside a while statement, it would only get called once) Made function lowering not allocate a stack slot if we’re ignoring return Made the OptimizeToGlobals optimization be called last to allow variable optimizations to happen first"}, {"post_id": 16526, "ts": "2026-06-26T21:46:14Z", "hours": 2.3836, "text": "Optimizations OptimizeToGlobals : If the compiler can prove that a function is not recursive and runs atomically(single threaded), it gets rid of the function’s primitive local variables, which improves performance as scratch’s list operations are more expensive than local variables InlineSingleUseVariables : Pretty self explanatory, if a variable is only used once, it will be inlined ConvertToHeapAccess : I did optimizations on the normal heap converter so that it doesn’t allocate a stack pointer for functions that don’t need one Images don’t show the OptimizeToGlobals optimization cause the testing function I have for that is too long Before and after on the RGB function"}, {"post_id": 16206, "ts": "2026-06-26T10:29:30Z", "hours": 1.5267, "text": "Created Motion and Pen library Added support for top level variables Made an optimization to get rid of useless “replace with -1” blocks(image 1 is before, image 2 is after), this greatly reduces the code size(images are only one example, it was being put everywhere)"}, {"post_id": 15894, "ts": "2026-06-25T20:34:04Z", "hours": 1.4264, "text": "Did warning cleanup Added a nullability “system”, I allow the ? to be put on struct fields, and you can put null as the argument on those fields, then you have to check if they are null and do !! to use them"}, {"post_id": 15790, "ts": "2026-06-25T17:47:54Z", "hours": 3.6944, "text": "Did a lot of refactors Created SensingLib and CalendarLib Made a system to allow standard libraries to be inlined into your code to reduce file size Added support for structs, Right now you have to manually free your structs"}, {"post_id": 15329, "ts": "2026-06-24T22:06:11Z", "hours": 1.2928, "text": "Created a library for casting primitives to other primitives Expanded the math library a lot Added duplicate function and struct detection(yes I forgot before) Added code to prioritize function(int) over function(float) if calling with an int Added “warp” and “export” modifiers to function declarations, the warp modifier maps to the “Run without screen refresh” field, and export is currently unused, but later it will be used to export a function so that its properly usable from normal scratch code"}, {"post_id": 15271, "ts": "2026-06-24T20:05:11Z", "hours": 1.885, "text": "Did general bug fixes Added more standard library functions Added runtime type checking and exceptions"}, {"post_id": 15169, "ts": "2026-06-24T17:20:15Z", "hours": 2.2017, "text": "Did a small refactor on obfuscation Created a type safe(kinda) kotlin DSL for making standard library functions way more readable and simpler to create I rewrote the Memory library with the kotlin DSL Image 1: Before Image 2: After"}, {"post_id": 15063, "ts": "2026-06-24T14:04:20Z", "hours": 1.6278, "text": "I added an event system, making it so your code can actually run on GreenFlag { main(); } on KeyPressed(W) { looks::say(\"W was pressed!\"); } These events are translated into functions and the compiler generates scratch events that call these on KeyPressed(W) { compiler@eventlistener@F(); } void compiler@eventlistener@F() { looks::say(\"W was pressed!\"); } The compiler also generates a initializer green flag block which clears the heap and reserves an index for every other entrypoint(image 2)"}, {"post_id": 14757, "ts": "2026-06-23T23:45:31Z", "hours": 8.0742, "text": "I finished the pipeline from my language’s AST to scratch, it was pretty mind numbing Stage 1: The code does reachability, from the source file(where the compilation started) and finds all functions that we can call from the source Stage 2: Using those functions, we lower call expressions to statements and returns to heap accesses, here’s how that looks in code: Before : void main() { looks::say(fib(5)); } After : void main() { int fibReturn = -1; fib(5, &fibReturn); looks::say(fibReturn); } Notice how the nested call turned into a seperate statement. Why do we need this? Because scratch does not support returning stuff from functions, only arguments. Stage 3: We re-parse all locals on the reachable functions because the last stage added more locals Stage 4: We add a parameter to all functions named “stack” Stage 5: We add free(stack) calls at the end or before the return statement, this frees our stack automatically. We also add alloc before function calls so that we have a stack to pass to the function Here’s how that looks like in code: Before : void main() { int fibReturn = -1; fib(5, &fibReturn); looks::say(fibReturn); } After : void main(int stack) { int fibReturn = -1; int fibStack = -1; alloc(UNKNOWN, &fibStack); //allocate a stack for fib fib(fibStack, 5, &fibReturn); looks::say(fibReturn); free(stack, UNKNOWN); //free our stack } Notice how we have UNKNOWN in place for a number in the allocation and freeing, this is because we just added more locals for the allocations and we can’t know how many slots we need. Standard library functions are already compiled to scratch statements so they don’t need a stack allocated for them Stage 6: We re-parse local variables so we have a count. Stage 7: We count the re-parsed locals for every function and figure out which local variables can be reached in every function Stage 8: We convert all local variables to heap slots We traverse all statements and expressions, replacing all variable accesses with heap[stack + variableIndex]. While in this process we also convert the unknowns into the actual sizes since we just counted the locals in stage 7 Here’s how this entire stage looks like in code: Before : void main(int stack) { int fibReturn = -1; int fibStack = -1; alloc(UNKNOWN, &fibStack); fib(fibStack, 5, &fibReturn); looks::say(fibReturn); free(stack, UNKNOWN); } After : void main(int stack) { heap[stack] = -1; heap[stack + 1] = -1; alloc(3, stack + 1); //we just pass the index here since alloc will write to that index fib(heap[stack + 1], 5, stack); looks::say(heap[stack]); free(stack, 2); //We have 2 locals } By using a stack we get access to a lot of things like returning, recursion and local variables. Scratch doesn’t even support local variables, so we have to hack it with a global list. Notice how we don’t free the allocation? That’s because all functions are compiled by the same compiler and that compiler added free() to all functions with a stack. Stage 9: If a function doesn’t have any local variables, this is where we delete their allocations and free’s so that they don’t mess up the heap For example : alloc(0, index); and the target function for this allocation will have its free(stack, 0) call removed. Stage 10: Finally we create dummy scratch functions for our very lowered AST And finally in stage 11 we create the code blocks for the scratch functions and write to disk And it successfully calculates fib(9) as 34"}, {"post_id": 13952, "ts": "2026-06-22T22:02:44Z", "hours": 2.9797, "text": "I made a wrapper for the raw opcode classes that make valid code easier to make, then I did a ton of bug fixes and did a small refactor"}, {"post_id": 13260, "ts": "2026-06-21T18:26:43Z", "hours": 0.5228, "text": "Did a refactor, and intellij decided to corrupt some of the files, so I had to fix it"}, {"post_id": 13207, "ts": "2026-06-21T17:10:57Z", "hours": 3.1617, "text": "Implemented 90% of scratch’s blocks in the wrapper"}, {"post_id": 13095, "ts": "2026-06-21T12:57:42Z", "hours": 2.4425, "text": "Worked on a very basic scratch wrapper, it can generate a recursive function, gonna add more scratch blocks so that actual logic can be generated in this wrapper"}, {"post_id": 12772, "ts": "2026-06-20T21:38:46Z", "hours": 0.7953, "text": "Added static type checking, which makes sure the correct types are used everywhere. It prevents the user from using a number in an if statement’s condition. It also prevents you from assigning a string to an integer field"}, {"post_id": 12746, "ts": "2026-06-20T20:50:32Z", "hours": 2.8928, "text": "I added the AST parsing, which is able to parse the ANTLR parse tree into an AST (sorry the image is bad, its all I can show)"}, {"post_id": 12579, "ts": "2026-06-20T15:22:11Z", "hours": 3.0503, "text": "Worked on the first stage of AST parsing: Only parse top level elements (imports, structs, variables) and don’t parse the insides of functions"}]...
|
Title: Scratcher by @BetterClient | Stardance
Dev Title: Scratcher by @BetterClient | Stardance
Devlogs:
Worked on the first stage of AST parsing: Only parse top level elements (imports, structs, variables) and don’t parse the insides of functions
I added the AST parsing, which is able to parse the ANTLR parse tree into an AST (sorry the image is bad, its all I can show)
Added static type checking, which makes sure the correct types are used everywhere. It prevents the user from using a number in an if statement’s condition. It also prevents you from assigning a string to an integer field
Worked on a very basic scratch wrapper, it can generate a recursive function, gonna add more scratch blocks so that actual logic can be generated in this wrapper
Implemented 90% of scratch’s blocks in the wrapper
Did a refactor, and intellij decided to corrupt some of the files, so I had to fix it
I made a wrapper for the raw opcode classes that make valid code easier to make, then I did a ton of bug fixes and did a small refactor
I finished the pipeline from my language’s AST to scratch, it was pretty mind numbing Stage 1: The code does reachability, from the source file(where the compilation started) and finds all functions that we can call from the source Stage 2: Using those functions, we lower call expressions to statements and returns to heap accesses, here’s how that looks in code: Before : void main() { looks::say(fib(5)); } After : void main() { int fibReturn = -1; fib(5, &fibReturn); looks::say(fibReturn); } Notice how the nested call turned into a seperate statement. Why do we need this? Because scratch does not support returning stuff from functions, only arguments. Stage 3: We re-parse all locals on the reachable functions because the last stage added more locals Stage 4: We add a parameter to all functions named “stack” Stage 5: We add free(stack) calls at the end or before the return statement, this frees our stack automatically. We also add alloc before function calls so that we have a stack to pass to the function Here’s how that looks like in code: Before : void main() { int fibReturn = -1; fib(5, &fibReturn); looks::say(fibReturn); } After : void main(int stack) { int fibReturn = -1; int fibStack = -1; alloc(UNKNOWN, &fibStack); //allocate a stack for fib fib(fibStack, 5, &fibReturn); looks::say(fibReturn); free(stack, UNKNOWN); //free our stack } Notice how we have UNKNOWN in place for a number in the allocation and freeing, this is because we just added more locals for the allocations and we can’t know how many slots we need. Standard library functions are already compiled to scratch statements so they don’t need a stack allocated for them Stage 6: We re-parse local variables so we have a count. Stage 7: We count the re-parsed locals for every function and figure out which local variables can be reached in every function Stage 8: We convert all local variables to heap slots We traverse all statements and expressions, replacing all variable accesses with heap[stack + variableIndex]. While in this process we also convert the unknowns into the actual sizes since we just counted the locals in stage 7 Here’s how this entire stage looks like in code: Before : void main(int stack) { int fibReturn = -1; int fibStack = -1; alloc(UNKNOWN, &fibStack); fib(fibStack, 5, &fibReturn); looks::say(fibReturn); free(stack, UNKNOWN); } After : void main(int stack) { heap[stack] = -1; heap[stack + 1] = -1; alloc(3, stack + 1); //we just pass the index here since alloc will write to that index fib(heap[stack + 1], 5, stack); looks::say(heap[stack]); free(stack, 2); //We have 2 locals } By using a stack we get access to a lot of things like returning, recursion and local variables. Scratch doesn’t even support local variables, so we have to hack it with a global list. Notice how we don’t free the allocation? That’s because all functions are compiled by the same compiler and that compiler added free() to all functions with a stack. Stage 9: If a function doesn’t have any local variables, this is where we delete their allocations and free’s so that they don’t mess up the heap For example : alloc(0, index); and the target function for this allocation will have its free(stack, 0) call removed. Stage 10: Finally we create dummy scratch functions for our very lowered AST And finally in stage 11 we create the code blocks for the scratch functions and write to disk And it successfully calculates fib(9) as 34
I added an event system, making it so your code can actually run on GreenFlag { main(); } on KeyPressed(W) { looks::say("W was pressed!"); } These events are translated into functions and the compiler generates scratch events that call these on KeyPressed(W) { compiler@eventlistener@F(); } void compiler@eventlistener@F() { looks::say("W was pressed!"); } The compiler also generates a initializer green flag block which clears the heap and reserves an index for every other entrypoint(image 2)
Did a small refactor on obfuscation Created a type safe(kinda) kotlin DSL for making standard library functions way more readable and simpler to create I rewrote the Memory library with the kotlin DSL Image 1: Before Image 2: After
Did general bug fixes Added more standard library functions Added runtime type checking and exceptions
Created a library for casting primitives to other primitives Expanded the math library a lot Added duplicate function and struct detection(yes I forgot before) Added code to prioritize function(int) over function(float) if calling with an int Added “warp” and “export” modifiers to function declarations, the warp modifier maps to the “Run without screen refresh” field, and export is currently unused, but later it will be used to export a function so that its properly usable from normal scratch code
Did a lot of refactors Created SensingLib and CalendarLib Made a system to allow standard libraries to be inlined into your code to reduce file size Added support for structs, Right now you have to manually free your structs
Did warning cleanup Added a nullability “system”, I allow the ? to be put on struct fields, and you can put null as the argument on those fields, then you have to check if they are null and do !! to use them
Created Motion and Pen library Added support for top level variables Made an optimization to get rid of useless “replace with -1” blocks(image 1 is before, image 2 is after), this greatly reduces the code size(images are only one example, it was being put everywhere)
Optimizations OptimizeToGlobals : If the compiler can prove that a function is not recursive and runs atomically(single threaded), it gets rid of the function’s primitive local variables, which improves performance as scratch’s list operations are more expensive than local variables InlineSingleUseVariables : Pretty self explanatory, if a variable is only used once, it will be inlined ConvertToHeapAccess : I did optimizations on the normal heap converter so that it doesn’t allocate a stack pointer for functions that don’t need one Images don’t show the OptimizeToGlobals optimization cause the testing function I have for that is too long Before and after on the RGB function
Source code of the image: on GreenFlag { if(a() == 5) { looks::say("yo!"); } int index = 0; index = index + 1; rgb(index, 5, 5); index = 5; while(true) { pen::eraseAll(); render(); } } The image is of the entire flow working perfectly: The index variable had their value propagated to “1” by the Sequential constant propagation optimization The variable got its uses removed by Inline single-use assignments Then the variable got fully removed by Dead store elimination The rgb function got inlined. Then while it was inlined, because the rgb function’s return wasn’t being used, it got fully removed(the inlining preserves side effects while removing its return value, but because it didn’t have any side effects it got fully removed) Same with the a() function: It got inlined Then the if statement became if(5 == 5) { looks::say("yo!"); } Then Constant folding turned 5 == 5 into true Then Dead code elimination turned if(true) into just the then block I know most optimizations look like they aren’t that powerful, but when combined with other optimizations and ran in a loop, they can pile up and actually optimize code Optimizations Simplify boolean equality : Simplifies x == true to x , simplifies x == false to !x Simplify double negation : Simplifies !!x to x , simplifies --x to x Constant folding : Simplifies true == true to true , simplifies 5 + 5 to 10 Repeat to While : Converts repeat(amount) to a while loop Dead code elimination : Removes provably unreachable code blocks, eg: if(true) { ... } else { .. } turns into ... , removing the if and the else block entirely Now the big ones Sequential constant propagation : Analyzes the control flow of your program, removing useless variable assignments and inlining their expressions Inline single use assignment : Self explanatory Dead store elimination : Removes useless “set variable to x” blocks that don’t get used afterwards Function inlining : The compiler evaluates a cost for every function call is inside a function, if that total cost is less than 10,000, it gets inlined inside that function, removing call overhead and allowing for further optimization Other misc stuff: Fixed the while bug (if you called a function inside a while statement, it would only get called once) Made function lowering not allocate a stack slot if we’re ignoring return Made the OptimizeToGlobals optimization be called last to allow variable optimizations to happen first
Borrowed the “return expr if(cond)” syntax from ruby Implemented Tail call optimization which optimizes away recursion on tail calls Example: Before: str count(int amount) { return "Done!" if amount == 1; return count(amount - 1); } After: str count(int amount) { int tco@argument@amount = amount; while (true) { if (tco@argument@amount == 1) return "Done !"; tco@argument@amount = tco@argument@amount - 1; } }
Did some compiler testing Fixed function inlining bugs Fixed a single use assignment bug Created a triangle library that allows for triangle rendering using the pen
Made “PromoteToGlobals” which is a more powerful version of OptimizeToGlobals which allows for recursive functions to have their locals turned into globals aswell This is something called liveness analysis, the compiler looks at the code paths and decides at which points a variable is “live”, which means it can’t get overwritten by a recursive call Example: warp int fib(int n) { return 0 if n <= 0; return 1 if n == 1; if (n == 2) { int b = n * 2; return otherFunc(b); } return fib(n - 1) + fib(n - 2); } In this function the “b” variable can be turned into a global because it cannot get overwritten by a recursive call, its used too early for that to happen
Added list support! A very barebones implementation that allows the user to create, add to, read from and delete items from lists!
Added more compiler sugar for lists: list[index] replaces list::itemAt(list, index) list[index] = ...; replaces list::replace(list, item, index) for(type name in list) {} replaces int len = list::length(list); int i = 0; while (i < len) { type name = list::itemAt(list, i); i = i + 1; } (i am not proud of the shitcode that was used to get for(type name in list) working)
Added a name parameter to alloc which acts as runtime type metadata, soon to be used.
Garbage collection Added a mark and sweep garbage collector to my language, it walks the roots, marks every used object, then frees all unused objects! Most impressive part of this(in my opinion) is that most of the garbage collector is actually written in my language Misc The garbage collector gets called automatically every 1 second, but you can turn it off (CompilationConstants.AUTOMATIC_GC) If you want to manage memory manually, you can turn off the garbage collector entirely (CompilationConstants.MANUAL_MEMORY)
Made the garbage collector treat top level variables as roots, this prevents top level variables from getting freed I added 2 modes to this Reflect: This uses a hacked block to read the variables by name and reduce script size if theres a lot of variables(this doesn’t render properly inside the editor but it works) NoReflect: Get all the top level variables at compile time and mark them one by one
Tried to do turbowarp only return optimization, wasn’t able to make it very good… reverted it Improved the structure of CompilationConstants Added string::split and string::substring Made some of the list functions inlined (itemAt, clear, length)
Added more syntax improvements! Else if : Added support for else if, which replaces big blocks //Before: if(triangles[14].y1 >= 15) { looks::say(">=15"); } else { if(triangles[14].y2 >= 155) { looks::say("<=15"); } else { looks::say("Both false!"); } } //After: if(triangles[14].y1 >= 15) { looks::say(">=15"); } else if(triangles[14].y2 >= 155) { looks::say("<=15"); } else { looks::say("Both false!"); } Compound assignment : Added support for compound assignment //Before: triangles[15].y3 = triangles[15].y3 + 5; //After: triangles[15].y3 += 5; Enums : Added support for enums, which are just fancy integer wrappers enum TriangleRenderMode(OFF, RENDER, ITHINK); TriangleRenderMode mode = TriangleRenderMode.OFF; When : Added support for when expressions/statements that allow for matching a subject: //Before: if(answer == "off") { mode = TriangleRenderMode.OFF; } else if(answer == "render") { mode = TriangleRenderMode.RENDER; } else { mode = TriangleRenderMode.ITHINK; looks::say("If thinking is your power, what are you without it?"); return; } //After: TriangleRenderMode mode = when(answer) { "off" -> TriangleRenderMode.OFF "render" -> TriangleRenderMode.RENDER else -> { looks::say("If thinking is your power, what are you without it?"); TriangleRenderMode.ITHINK; } };
Fixed a lot of bugs with when expressions, also got deepseek to fix some of them Added If expressions, which allow using if statements inside other expressions, for example, here is some previously invalid code that is now valid: int max = if (a > b) a else b; str message = if (score >= 90) { looks::say("something"); "You win!" } else { looks::say("something"); "You lose :(" } triangles[15] = Triangle( utils::random(-240, 240), utils::random(-180, 180), utils::random(-240, 240), utils::random(-180, 180), utils::random(-240, 240), if(mode == TriangleRenderMode.OFF) { 5 } else { triangles[14].y3 } ); These still get lowered properly and just look like normal if statements in the final scratch code
Scratcher is at 100 commits! (Now 104 cause all of these refactors are different commits) Completely refactored all translation steps to use the ASTVisitor. Also did type resolving cleanup. Function Reachability : Went from 117 to 32 lines Function expression lowering : Went from 439 to 293 lines Re Parse Local Variables : Went from 34 to 27 lines Remove Empty Allocations : Went from 97 to 79 lines ConvertToHeapAccess : Biggest refactor of this whole devlog, went from 500 lines to 418, split into 5 files
Did more syntax improvements Added ++ and – support: index++; Added type inference support: auto a = Triangle(5, 15, 60, -120, 240, 67); //type automatically becomes Triangle auto a = func(); //type automatically becomes the return type of func
Refactored the entire type system to use a sealed interface instead of an unsafe single class Nothing much to say, this doesn’t affect the input code or the output project, I did just cleanup
More abstractions please! Added dynamic function dispatch which allows for functions to take in other functions as arguments, of course, this isn’t possible at all in normal scratch, so actually FunctionLiteral gets turned into an integer and a custom dispatch function gets created for every function literal’s signature which allows for a binary search to call the actual function Also made HeapConversion reuse stack slots instead of allocating one for every variable(mostly by AI)
Even more abstractions please Added generics support, which allows the user to define generic functions/structs that apply with every type, for example: warp <T> void forEach(T[] a, (T) -> void action) { for(T t in a) { action(t); } } Depending on what type you used to call this, a new version of forEach gets generated, if you called it with an integer: warp void forEach@int(int[] a, (int) -> void action) { for(int t in a) { action(t); } } Of course I also allow this on structs: struct Triangle<Num>(Num x1, Num y1, Num x2, Num y2, Num x3, Num y3); Also did some small changes: Added an FPS counter to my test code Better optimizations that actually detect not(not(x)) Optimized triangle::fill even more (+2 fps) Made DynamicDispatchHandler actually use the apply return properly (it was always returning true)
Second garbage collector! Added a second garbage collector! If your app does not contain any cyclic objects and needs high performance, you can now enable the ARC collector! This garbage collector works by automatically detecting when objects go out of scope and decrementing their reference count, if an object’s reference count goes to 0, it is freed. This is more performant than the mark and sweep collector because the objects are freed at the moment they are unused instead of stopping the entire program to collect garbage. This works for all cases, except for cases where there is a cyclic object. Because the cyclic object owns itself, so its reference count is always at 1.
General language improvements Elvis expressions: If a value is nullable, it is not usable by anything that only accepts non-null values, to solve this, I added the elvis expression, which allows you to give a fallback for null values(compilation in image 2): //int doesn't have to be nullable because we have a fallback value! int x = functionThatReturnsNull()?: 5; String boxing and nullable primitives Previously, scratcher only supported having structs, enums and function references as nullable, now it also supports having primitive types as nullable: str? x = functionThatReturnsNullableString(); //distinguish between literal null and string null if(x == null) looks::say("null!"); if(x == "null") looks::say("null as string!"); //the compiler achieves this by boxing the string return with a struct: //struct StringBox(str value) //the actual type behind the scenes is: //StringBox? x = ...; Safe dot traversal If a struct instance is nullable, you cannot use regular struct.member because that may result in a NullPointerException, to solve this I added ?. which allows for null safe traversal(compilation in image 1): //if nullableTriangle == null, return null //if nullableTriangle != null, return nullableTriangle.x1 int? x1 = nullableTriangle?.x1; Deepseek fix I noticed that FunctionInlining completely ignored execution order, so I asked deepseek to solve it(this happened after I added string boxing). But I found a better solution to the same problem later on, so I reverted deepseek’s fix and wrote my own, which is 260 lines compared to deepseek’s 360 lines, over 100 lines shorter!
100 hours! Evil hack part 4: Death of evil hack So I was using a really terrible hack to implement stuff like FunctionInlining, Safe dot and the elvis expression, the hack is basically (ab)using the when expression to do stuff like run code inside expressions and use local variables inside expressions. So to stop this from becoming a hack, I added it directly to the AST as StatementExpression(not to be confused with ExpressionStatement), which can be used to contain statements inside expressions. All of my evil hacks have been replaced by StatementExpression. I also added some small optimizations for StatementExpressions!
Fixed the garbage collector… turns out I broke it accidentally while cleaning up code in my last devlog, 3 line change but took a long time to find Made it so the stack allocator doesn’t do redundant operations like 1+1 and inlines them as 2 instead
Lambdas I added lambdas to Scratcher! They allow you to write more expressive code like map(list, a -> a + 1) , which literally adds 1 to every element of list I also allow using outer variables within lambdas int a = ...; map(list, b -> { a++; b + a }); I allow this through boxing, the local variables become boxes and the lambdas get the local variable’s box, this makes lambdas more powerful than most languages as this allows for variables to be shared mutable state across lambdas, this also allows the local variables to get garbage collected. Of course, scratch doesn’t support this natively, so lambdas are 100% compiler sugar and just lowers to regular functions and uses function references(which is also 100% compiler sugar). void lambda::defunc@lambad@0(LambdaCaptures c, args...) { ... }
MORE FUCKING ABSTRACTIONS!!! I added receiver/extension functions. These allow you to write code that takes in a type as a special argument You define them just like how it works in kotlin: warp <T, R> R T.let((T) -> R action) { return action(this); } It just compiles to a regular function warp <T, R> R let(T this, (T) -> R action) { return action(this); } But the compiler lets you call it with the special argument: thing.let((int a) -> ...); I also added a very big standard library module (written in scratcher!) with a ton of these functions built-in, they allow you to write more expressive code: triangles .filterNotNull() .filter((Triangle<float> t) -> t.x1 > 150) .filter((Triangle<float> t) -> t.y1 < 150) .forEach((Triangle<float> tri) -> ...) I also rewrote the entirety of string lib during this, now you have to use the extensions library to use strings, but its way more powerful (and written in scratcher)! I also added a new “char” type, which stores a single character (wow really???) I also added “safe dot calls” that allow you to use stuff as if they’re not null: triangles.forEach((Triangle<float>? t) -> { t?.x1?.let((float x1) -> { looks::say("x1: ${x1}"); }); }); This only calls the let function if t?.x1 is not null There is a big problem with all this powerful new code though… the garbage collector can no longer keep up, a single mark and sweep takes over 1 second! Which is especially bad because the garbage collector needs the entire application to stop in order to run. You do not want your code to completely stop for a whole second(maybe you do? weirdo), so I have to fix this in my next few devlogs…
Sealed enums and faster GC I added a new type of object, sealed enums: sealed enum Animal { Cat(str name, int age, bool isMeowing), Dog(str name, int age), Unknown } They allow for storing data inside enums, they’re very similar to rust enums: sealed enum Result<T> { Success(T out), Failure } I also refactored lambdas to use a sealed enum instead of a big struct: //before struct LambdaCaptures(Lambda0Captures? c0, Lambda1Captures? c1, Lambda2Captures? c2); //after sealed enum LambdaCaptures { Lambda0Captures(Box$int capture0, ...), Lambda1Captures(Box$float capture0, ...) } Sealed enums only store a tag and a pointer, so if you use a lot of lambdas, this will save a TON of heap space Faster garbage collector! I made the marking phase of the mark and sweep collector faster by using an epoch based cleanup approach Now, instead of clearing and re-populating the marked list, we don’t ever clear it and we invalidate it by just increasing the epoch. This makes the isMarked check go from O(n) to O(1) while also improving marking speed because scratch doesn’t have to resize our list
I’m sorry For over 2 months, scratcher has had an “export” keyword, which was fully unused, until today: I implemented the export keyword on functions, which allows for code written in plain scratch to interact with scratcher code: export warp void myFunction() { ... } Export requires that your function arguments are all primitives and that the return is also a primitive, but other than that, it does not change anything, just exposes the function cleanly to regular scratch code. However, scratcher type checking still applies, so if the native scratch code passes in a string to a float argument, it will still cause a panic Even when you have obfuscation enabled, exports will stay and let native scratch use it with its original name
ACTUAL ARRAYS!! Previously, scratcher “arrays” were just lists, you could add more items, it would dynamically resize, it was written in the kotlin DSL, so technically it was just a list. I removed the previous list code, reused some of it and added a new Array system Along with that, the normal lists got rewritten in 100% scratcher with no internal functions The new system is almost fully backwards compatible in source code, you just have to make a few changes The new implementation is more clear, more expressive and more like regular programming languages
Pattern matching for sealed enums Previously if you wanted to check sealed enums types and use them, you had to do very ugly syntax for actually getting the variant instance: auto out = tryGet(); when(out) { Result.Success -> { auto suc = out as Result.Success; looks::say("Success! ${suc.out.x}"); Now you don’t have to do all of this: when(tryGet()) { Result.Success suc -> { looks::say("Success! ${suc.out.x}"); This is just syntax improvement, doesn’t change the generated code or anything, just helps the developer
Import some import names into unqualified co ntext Before: //import import list; //use list::List<str> myList = list::newList(); After: //import import list::*; //use List<str> myList = newList();
Operator overloading Added operator overloading, now you can define overloads for specific operators so that code looks cleaner Just use the operator keyword with the correct signature and you’re done! You can overload the operators: +, -, /, *, %, [], []= For example: warp operator <T> void T[].set(int index, T item) { self::replace(this, item, index); } //use array[index] = item //compiler translates to set(array, index, item) I also realized that my previous refactor of arrays broke my nullability system: int[] a = Array(int, 5); say(a[3]); This would print null , which my type system missed I fixed this by moving arrays to a standard library module, the same array import works, but you have to change how you create the array: //before: int[] a = Array(int, 5); //doesn't need to be marked as null!!! int[] a = Array(int, 5); a[0] = ...; a[1] = ...; ... //after int?[] a = arrayOfNulls(5); //null filled int[] a = arrayOf(5, (int index) -> { return index * 5; //value of the array at that index });
Privates Added a “private” keyword, anything declared private cannot be accessed from outside the current file. This prevents the user from messing with internal states of libraries they are using For example, the list library from the standard library. Now you can’t directly mess with the list pointer triangles.ptr[5] = ...; This now results in an error because “ptr” is private! I also added some small optimizations for lambdas.
DOCUMENTATION I do not want to touch any markdown ever again
QOL I added a shit ton of quality of life stuff: Tons of bug fixes Big array syntax: int[] myArray = [1, 2, 3, 4, 5, 6]; Safe casting for enums(previously a panic): Result.Success? a = res as? Result.Success; Out of memory detection: Scratch caps lists at 200k elements, after that it silently stops adding stuff to the list Compact int list: Store pretty much infinite integers without wasting heap space SHORT CIRCUITS: DONT EXECUTE RIGHT SIDE OF && or || if left side is false/true! If statements without braces: if(a) b++; CONTINUE AND BREAK: while(true) { if(a) break; if(b) continue; } STATIC LISTS: store data outside of the heap in scratch lists so that you dont run out of heap space: static str[] myList; This also allows for file reading: static str[] myList = "hello.json"; So you can properly store data(like ROMs) CASE SENSITIVE EQUALS: DID YOU KNOW THAT SCRATCH “=” BLOCK IS CASE INSENSITIVE??? And its pretty hard to make it case sensitive Now you can do “===” and its case sensitive: 'a' === 'A' RETURNS FALSE
List pools Static lists are cool, but they are very limited expressiveness wise because they must be known at compile time Pools fix this by having a pool of static lists that the user code can allocate at any time PooledList a = allocate(); But because the pool is limited, the pooled list must be freed when not needed, the garbage collector will not handle it(yet) a.free(); Other than that, the PooledList behaves just like a List and can do almost anything a List does I also added proper documentation for Out of memory errors.
Indexed repeat and general improvements Added a new indexed for and repeat statement which allows way easier index tracking: //Before: int index = 0; repeat(10) { ... index++; } //After: repeat(10) { index -> ... } I also made the PooledList get garbage collected with the refcount gc Did some really small refactors aswell
Demo programs and general improvements I added demo programs to scratcher, these show the language actually being used Try one out! https://scratch.mit.edu/projects/1385339395/ General improvements Bug fixes Dummy sprite Make the type checker ignored in inlined functions Make topLevelInit smaller and remove unused functions from final compilation TurboWarp specific compilation mode with faster operations on strings/lists (not compatible with vanilla scratch if enabled)
More demos and QOL Try it out: https://scratch.mit.edu/projects/1387804691/ Demos Math lexer, parser and interpreter: New demo that lets you input math expressions (eg: 1 + 1 ) and get the result. 3d cube renderer: a spinning 3d cube and player controls QOL Smarter inlining cost calculation A math centered optimization for removing identities Get rid of PromoteToGlobals (temp) GC documentation Codegen fixes (receiver functions generate the same block, causing scratch to get confused) Stack size optimization (reuse stack slots of the same type) Fix crash when the garbage collector is disabled
PROPER ERRORS Errors are the one thing that I knew were terrible but I could never build up the courage to fix. So I just fixed them. Now all errors in the language are formatted nicely, show you exactly where the error happened and give you a nice description. Along with this, I made a new system for collecting errors, so now the compiler won’t stop at the first error and will continue going and give you all errors at once. This makes fixing code a lot easier. This also opens up the possibility of an LSP server later on (before and after in images)
CLI I did some small refactors and added a new CLI, built with Clikt It’s very simple to use: scratcher check file --options //check the file for any compilation errors without compiling scratcher compile file --options outFile //compile into a .sb3 file scratcher standard-library //print out the standard library Clikt also provides easy to use help menus I also added a sort function to the array and list libraries...
|
1792482509.6003482
|
1793087309.6003482
|
|
2129
|
SuperOrbital by @obedot | Stardance
|
obedot
|
1
|
183.0
|
2657
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-23T00:50:05Z", "hours": 183.0, "multiplier": 14.57, "payout": 2657, "blessing": "neutral", "text": "SUPERORBITAL: The Quest of the Anomaly After months of hard work, @orivio and I finally present to you SUPERORBITAL. What on earth is a SUPERORBITAL? SUPERORBITAL is a 2D platformer where you play as Vitri, the only human born without gravity. After years of being ostracized by society, Vitri sets out on a mission to change things for the better. He decides to take a gamble on a popular story that’s been spreading about all planets having tangible gravity cores at their centers, and decides to find one for himself. Accompanied only by his robot assistant, G.R.A.V. (Great Robot Assistant of Vitri), Vitri flies out into deep space and lands on a planet named Zeta-C5, where he uses special abilities, such as turning gravity on and off, to explore and make his way towards the planet’s core. Difficult obstacles and even unexpected foes block his way, but he’s got to get through no matter what. Dev Messages: orivio: SUPERORBITAL has been a really fun introduction to Godot! Though challenging at times, designing the levels around our unique mechanics was pretty fun, and I think overall the game turned out pretty great! Obviously it is only an alpha release, so I plan on working together with Obe Dot to polish it a ton, in terms of artwork, music, story, etc. Expect lots more content to come! Obe Dot: Developing this game has been an amazing experience. This is my first big gamedev project, and I’ve learned so much. I really hope to work more on this project in the future, while also improving my art and programming skills. Much appreciation to Hack Club for creating this event! Try out the game on our itch, or watch the provided gameplay footage and/or trailer! Trailer: https://www.youtube.com/watch?v=5WPKXYqy1FI Gameplay: https://youtu.be/-zq8ps87daI?si=sUK4_9BedT1OdXU8", "repo": "https://github.com/orivio/super_orbital", "demo": "https://obedh.itch.io/superorbital"}]...
|
[{"post_id": 72452, "ts": "202 [{"post_id": 72452, "ts": "2026-09-23T00:34:22Z", "hours": 3.1192, "text": "Finished Up the GitHub Readme, Game Trailer, and Itch.io page! I did all the last remaining steps to finishing the game before shipping. I made a trailer of about 1 minute, and wrote a section of the GitHub Readme about the making of SuperOrbital. I’m going to ship now!"}, {"post_id": 71290, "ts": "2026-09-20T16:09:42Z", "hours": 4.3556, "text": "FINALLY fixed an annoying physics bug, improved the intro cutscene, and made the black holes look better I’m very happy to say that the dash/platform bug I was experiencing previously has now been solved. The player used to clip out of bounds if you dashed into a moving platform, but now, the player will get teleported back to where they were before. I also did some work on the intro cutscene, and while it isn’t yet finalized, I think it looks much better. Also, I made the center of the black hole a perfect circle now."}, {"post_id": 69415, "ts": "2026-09-17T00:28:27Z", "hours": 4.0075, "text": "THE FINISHING TOUCHES Yo yo yo, I am very close to shipping my game. I only have a little bit more to do. I’ve been working on improving the cutscenes, for example, making the colors look better and improving the perspective. I still have more work to do though, of course. Next up, I’m going to polish some of the movement mechanics some more, and then I’ll get some friends to playtest it."}, {"post_id": 65675, "ts": "2026-09-10T23:59:06Z", "hours": 9.0878, "text": "Greatly Improved Sound and Level Design I found it suprisingly easy to make good sound effects for my game. I dropped a rock on the ground and recorded it, and now, that’s the sound that plays when the player lands on rocky terrain after falling. I took a screwdriver and hit it against a bunch of things until I found something that sounded good. It’s a fun process! I also worked more on level design, by balancing everything so that the progression felt natural. I am almost finished with the final level, which I hope will challenging but fun."}, {"post_id": 63535, "ts": "2026-09-07T13:31:33Z", "hours": 1.2772, "text": "Added checkpoints to the levels If you find that the game is too challenging, you can turn on checkpoints in the settings menu. This lets you respawn at the nearest checkpoint after dying, instead of starting the whole level over again. I hope that this option can make my game playable by more people of different skill levels."}, {"post_id": 63220, "ts": "2026-09-06T22:04:35Z", "hours": 5.6608, "text": "Redesigned Old Levels to Work Better With New Player Movement With player movement out of the way, I can get to making even better levels. This one in particular, which you can see below, is a level I’m quite proud of. I took inspiration from Hollow Knight’s Path of Pain a little bit. I don’t have much left to do, but I definitely want to add some better sound effects."}, {"post_id": 62481, "ts": "2026-09-05T21:00:44Z", "hours": 5.6092, "text": "Finishing the Movement and Experimenting with Dynamic Lighting I finally got all the movement mechanics down. I still might refine the black holes a little bit, but first I want to redesign some of the earlier levels. My teammate suggested dynamic lighting for our game, and while it looks cool, it seems to difficult to set up completely for our Stardance release."}, {"post_id": 61134, "ts": "2026-09-03T21:52:29Z", "hours": 2.725, "text": "Greatly improved the Level Select screen by making animated level buttons I used Godot’s Tweens to make the level select buttons rotate and pop when you select them. The effect isn’t perfect yet, but it’s getting there. What do think of the effect?"}, {"post_id": 60806, "ts": "2026-09-03T12:28:16Z", "hours": 0.8911, "text": "Fixed a Tricky Level Transition Bug I was experiencing this frustrating bug where, if you try to run back and forth between levels too fast, you can fall off the map. I expanded the camera boundaries to see what was happening better, and slowed down the game a bit using Godot’s awesome tools. I solved the bug by reordering the level transition code. On the first slide, you can see the original bug, and on the third slide, you can see the fixed version."}, {"post_id": 60543, "ts": "2026-09-02T23:03:33Z", "hours": 1.2192, "text": "Refined the Gravity Switch Shockwave Even More It made the shockwave effect go by faster, and be properly centered on the player. This makes the shockwave feel just right when playing the game, and gives the gravity switch the perfect amount of impact."}, {"post_id": 60497, "ts": "2026-09-02T21:24:04Z", "hours": 7.9831, "text": "Improved Game Juice and Improved Visual Effects Game Juice I started working on adding the little details to the movement that make the game way more fun to play. I added a few freeze frames when starting a dash, which was inspired by Celeste. I also added a bit of camera shake to give the player even more feedback on their movement. Visual Effects This part was really satisfying. I made a shockwave warp effect around the player when they perform a gravity switch, which looks great. Then I made the black holes look better by distorting the background. Frustrating Bugs I’ve been having a lot of movement bugs that are tricky and inconsistent to replicate, and I can’t figure them out yet. Next Steps I still need to get the AnimationTree to work, but that should really be quite easy. I still have to redesign some levels."}, {"post_id": 59189, "ts": "2026-08-31T20:47:27Z", "hours": 4.8492, "text": "Added more to the opening cutscene I don’t want to give away the intro until the game is ready, but I’ll share parts of what I made. This first frame took me the longest, over 2 hours. I planned to animate the guy standing up and walking, but I now realize that that’s probably not feasible. I think it will look great anyway though. I might improve some little parts of the drawing. Creating a cutscene manager in Godot I set up an AnimationPlayer to direct the cutscene, and it’s actually quite easy. I do need to align my crossfades correctly and sync everything with the music."}, {"post_id": 58502, "ts": "2026-08-30T22:41:57Z", "hours": 6.7444, "text": "Created a rough draft of the intro cutscene, and composed music for it The intro cutscene/storyboard I used libresprite to make a basic idea of what the intro cutscene should look like. I still have more to add, and as you can tell, the text is practically illegible. Yeah, libresprite doesn’t have a text tool. But I’ll fix it soon and it’ll look awesome. The intro music I made this song using FamiStudio with the EPSM expansion and FamiStudio’s default instrument pack. This let me use the instruments I wanted while still sounding retro-ish. My brother helped me work on the song, because he’s way better at music than I am. I still need to revise the song more, this is more of a first draft. Any feedback would be appreciated lol"}, {"post_id": 57575, "ts": "2026-08-29T19:17:53Z", "hours": 2.8072, "text": "Redoing the Player Movement I remade the player movement system from scratch, because my previous implementation just wasn’t working. It was buggy, and the movement didn’t feel good to play. My new movement system is not entirely complete, but it already feels much better. For one thing, the variable jump height is much smoother, and stopping a jump midair doesn’t feel as abrupt. I added coyote time, jump buffering, air friction, and faster falling for game juice. I still need to fine tune the settings, and get some more people to playtest the movement. There are more movement mechanics I need to add, such as dashing, but I want to get the basic movement completely down first."}, {"post_id": 56888, "ts": "2026-08-28T21:33:33Z", "hours": 3.1403, "text": "Started refactoring the player movement script. I’m starting from scratch, so I only have basic horizontal movement yet. I added an input sequence recorder to make it easier to replicate bugs, so you can record a sequence of inputs and then play them back again."}, {"post_id": 56307, "ts": "2026-08-28T01:19:58Z", "hours": 3.0025, "text": "Fully refactored the level manager. After a few hours, I have finally cleaned up all the code for level transitions. Now, the code is easier to understand and maintain, and adding new levels takes significantly less time and effort. I added comments on all the related code to make it even easier to read. I also fixed a few bugs in the process. For example, trying to open the menu during a level transition used to put the game in a glitched state, but I fixed that now. I moved towards a cleaner architecture where the scene root (play.tscn) manages the game state, and the pause menu asks the play scene to open the menu, instead of just going ahead and doing it. It’s possible that this refactor may have broken some other aspects of the game, so I’ll have to look over everything later, but right now, it seems to be working fine."}, {"post_id": 54818, "ts": "2026-08-25T23:28:18Z", "hours": 1.6025, "text": "Polished the levels even more, added new art assets, and fixed some minor tile inconsistencies. I also drew this boulder, which currently doesn’t look that great, but I’ll improve it later and add it somewhere where it fits in the game. I showed this game to my grandma, and she was able to figure out the controls pretty quickly, so I see that as a win."}, {"post_id": 54128, "ts": "2026-08-24T23:06:45Z", "hours": 4.1431, "text": "Greatly improved the facility’s tileset by adding details and more background elements."}, {"post_id": 47770, "ts": "2026-08-15T22:44:25Z", "hours": 5.9028, "text": "Well, I tried to refactor the entire world system, but I gave up. It was just taking way too long. I guess I’ll just have to deal with the spaghetti code for now. I did finish the level select screen, and I think it looks pretty good. I just have to rename some of the levels because they are named very generic things."}, {"post_id": 47113, "ts": "2026-08-14T19:20:03Z", "hours": 9.8889, "text": "I’m redoing the level system to clean up the spaghetti code situation. My teammate redesigned one of the characters, and I added it to the game."}, {"post_id": 44826, "ts": "2026-08-10T21:02:18Z", "hours": 9.2131, "text": "I’m bettering my backgrounds, bettering my visuals, bettering my levels!"}, {"post_id": 43535, "ts": "2026-08-08T21:13:55Z", "hours": 5.8183, "text": "Added some more levels to my platformer game, and pretty much done-iffied the player sprite and sound effects"}, {"post_id": 39099, "ts": "2026-08-01T20:07:54Z", "hours": 9.0683, "text": "I’ve added a few more challenging levels. I also almost finished up the sprite work on the protagonist."}, {"post_id": 36431, "ts": "2026-07-28T15:36:26Z", "hours": 3.005, "text": "Made new run, idle, and jump animations and added the final layer"}, {"post_id": 35254, "ts": "2026-07-26T15:39:00Z", "hours": 1.1678, "text": "Added some great audio settings"}, {"post_id": 35153, "ts": "2026-07-26T12:07:00Z", "hours": 9.5392, "text": "Added a save file system"}, {"post_id": 32506, "ts": "2026-07-21T18:48:48Z", "hours": 10.2469, "text": "I added input control remapping for my platformer game. We also added more dialogue."}, {"post_id": 31328, "ts": "2026-07-19T17:03:06Z", "hours": 9.1842, "text": "I tried adding a parallax effect, but it didn’t turn out how I wanted. I fixed a bug with the camera scale not being a whole number ratio. I’m starting to add the last few mechanics to the game, which involve Black Holes."}, {"post_id": 27351, "ts": "2026-07-12T20:49:33Z", "hours": 6.6386, "text": "I just finished a new tileset for my 2d platformer."}, {"post_id": 20330, "ts": "2026-07-01T22:08:11Z", "hours": 6.9336, "text": "I made better running and jumping animations for my 2D platformer."}, {"post_id": 15865, "ts": "2026-06-25T19:51:18Z", "hours": 7.995, "text": "I made this cool background for my game’s menu. I learned about shaders from the book “The Book of Shaders” by Patricio Gonzalez Vivo and Jen Lowe, and some of my shaders were inspired by the content in that book. The star effect was inspired by this very helpful reddit post: https://www.reddit.com/r/godot/comments/1m0czqd/starry_background_in_this_many_lines_of_shader/"}, {"post_id": 12686, "ts": "2026-06-20T18:43:02Z", "hours": 2.7389, "text": "I added another level with a lot of spikes, platforms and timing!"}, {"post_id": 12003, "ts": "2026-06-19T16:14:06Z", "hours": 1.7231, "text": "I added a level that teaches you the jump cutting mechanic in my 2D platformer game. I’m also experimenting with new character sprites."}, {"post_id": 11513, "ts": "2026-06-18T20:06:11Z", "hours": 4.5739, "text": "I added Jump Cutting, Jump Buffering, and Death to my platformer"}, {"post_id": 5261, "ts": "2026-06-08T23:43:38Z", "hours": 6.7183, "text": "Setting up basic movement and levels for my platformer (guys I KNOW the sprites look bad)"}]...
|
Title: SuperOrbital by @obedot | Stardance
Devlog Title: SuperOrbital by @obedot | Stardance
Devlogs:
Setting up basic movement and levels for my platformer (guys I KNOW the sprites look bad)
I added Jump Cutting, Jump Buffering, and Death to my platformer
I added a level that teaches you the jump cutting mechanic in my 2D platformer game. I’m also experimenting with new character sprites.
I added another level with a lot of spikes, platforms and timing!
I made this cool background for my game’s menu. I learned about shaders from the book “The Book of Shaders” by Patricio Gonzalez Vivo and Jen Lowe, and some of my shaders were inspired by the content in that book. The star effect was inspired by this very helpful reddit post: https://www.reddit.com/r/godot/comments/1m0czqd/starry_background_in_this_many_lines_of_shader/
I made better running and jumping animations for my 2D platformer.
I just finished a new tileset for my 2d platformer.
I tried adding a parallax effect, but it didn’t turn out how I wanted. I fixed a bug with the camera scale not being a whole number ratio. I’m starting to add the last few mechanics to the game, which involve Black Holes.
I added input control remapping for my platformer game. We also added more dialogue.
Added a save file system
Added some great audio settings
Made new run, idle, and jump animations and added the final layer
I’ve added a few more challenging levels. I also almost finished up the sprite work on the protagonist.
Added some more levels to my platformer game, and pretty much done-iffied the player sprite and sound effects
I’m bettering my backgrounds, bettering my visuals, bettering my levels!
I’m redoing the level system to clean up the spaghetti code situation. My teammate redesigned one of the characters, and I added it to the game.
Well, I tried to refactor the entire world system, but I gave up. It was just taking way too long. I guess I’ll just have to deal with the spaghetti code for now. I did finish the level select screen, and I think it looks pretty good. I just have to rename some of the levels because they are named very generic things.
Greatly improved the facility’s tileset by adding details and more background elements.
Polished the levels even more, added new art assets, and fixed some minor tile inconsistencies. I also drew this boulder, which currently doesn’t look that great, but I’ll improve it later and add it somewhere where it fits in the game. I showed this game to my grandma, and she was able to figure out the controls pretty quickly, so I see that as a win.
Fully refactored the level manager. After a few hours, I have finally cleaned up all the code for level transitions. Now, the code is easier to understand and maintain, and adding new levels takes significantly less time and effort. I added comments on all the related code to make it even easier to read. I also fixed a few bugs in the process. For example, trying to open the menu during a level transition used to put the game in a glitched state, but I fixed that now. I moved towards a cleaner architecture where the scene root (play.tscn) manages the game state, and the pause menu asks the play scene to open the menu, instead of just going ahead and doing it. It’s possible that this refactor may have broken some other aspects of the game, so I’ll have to look over everything later, but right now, it seems to be working fine.
Started refactoring the player movement script. I’m starting from scratch, so I only have basic horizontal movement yet. I added an input sequence recorder to make it easier to replicate bugs, so you can record a sequence of inputs and then play them back again.
Redoing the Player Movement I remade the player movement system from scratch, because my previous implementation just wasn’t working. It was buggy, and the movement didn’t feel good to play. My new movement system is not entirely complete, but it already feels much better. For one thing, the variable jump height is much smoother, and stopping a jump midair doesn’t feel as abrupt. I added coyote time, jump buffering, air friction, and faster falling for game juice. I still need to fine tune the settings, and get some more people to playtest the movement. There are more movement mechanics I need to add, such as dashing, but I want to get the basic movement completely down first.
Created a rough draft of the intro cutscene, and composed music for it The intro cutscene/storyboard I used libresprite to make a basic idea of what the intro cutscene should look like. I still have more to add, and as you can tell, the text is practically illegible. Yeah, libresprite doesn’t have a text tool. But I’ll fix it soon and it’ll look awesome. The intro music I made this song using FamiStudio with the EPSM expansion and FamiStudio’s default instrument pack. This let me use the instruments I wanted while still sounding retro-ish. My brother helped me work on the song, because he’s way better at music than I am. I still need to revise the song more, this is more of a first draft. Any feedback would be appreciated lol
Added more to the opening cutscene I don’t want to give away the intro until the game is ready, but I’ll share parts of what I made. This first frame took me the longest, over 2 hours. I planned to animate the guy standing up and walking, but I now realize that that’s probably not feasible. I think it will look great anyway though. I might improve some little parts of the drawing. Creating a cutscene manager in Godot I set up an AnimationPlayer to direct the cutscene, and it’s actually quite easy. I do need to align my crossfades correctly and sync everything with the music.
Improved Game Juice and Improved Visual Effects Game Juice I started working on adding the little details to the movement that make the game way more fun to play. I added a few freeze frames when starting a dash, which was inspired by Celeste. I also added a bit of camera shake to give the player even more feedback on their movement. Visual Effects This part was really satisfying. I made a shockwave warp effect around the player when they perform a gravity switch, which looks great. Then I made the black holes look better by distorting the background. Frustrating Bugs I’ve been having a lot of movement bugs that are tricky and inconsistent to replicate, and I can’t figure them out yet. Next Steps I still need to get the AnimationTree to work, but that should really be quite easy. I still have to redesign some levels.
Refined the Gravity Switch Shockwave Even More It made the shockwave effect go by faster, and be properly centered on the player. This makes the shockwave feel just right when playing the game, and gives the gravity switch the perfect amount of impact.
Fixed a Tricky Level Transition Bug I was experiencing this frustrating bug where, if you try to run back and forth between levels too fast, you can fall off the map. I expanded the camera boundaries to see what was happening better, and slowed down the game a bit using Godot’s awesome tools. I solved the bug by reordering the level transition code. On the first slide, you can see the original bug, and on the third slide, you can see the fixed version.
Greatly improved the Level Select screen by making animated level buttons I used Godot’s Tweens to make the level select buttons rotate and pop when you select them. The effect isn’t perfect yet, but it’s getting there. What do think of the effect?
Finishing the Movement and Experimenting with Dynamic Lighting I finally got all the movement mechanics down. I still might refine the black holes a little bit, but first I want to redesign some of the earlier levels. My teammate suggested dynamic lighting for our game, and while it looks cool, it seems to difficult to set up completely for our Stardance release.
Redesigned Old Levels to Work Better With New Player Movement With player movement out of the way, I can get to making even better levels. This one in particular, which you can see below, is a level I’m quite proud of. I took inspiration from Hollow Knight’s Path of Pain a little bit. I don’t have much left to do, but I definitely want to add some better sound effects.
Added checkpoints to the levels If you find that the game is too challenging, you can turn on checkpoints in the settings menu. This lets you respawn at the nearest checkpoint after dying, instead of starting the whole level over again. I hope that this option can make my game playable by more people of different skill levels.
Greatly Improved Sound and Level Design I found it suprisingly easy to make good sound effects for my game. I dropped a rock on the ground and recorded it, and now, that’s the sound that plays when the player lands on rocky terrain after falling. I took a screwdriver and hit it against a bunch of things until I found something that sounded good. It’s a fun process! I also worked more on level design, by balancing everything so that the progression felt natural. I am almost finished with the final level, which I hope will challenging but fun.
THE FINISHING TOUCHES Yo yo yo, I am very close to shipping my game. I only have a little bit more to do. I’ve been working on improving the cutscenes, for example, making the colors look better and improving the perspective. I still have more work to do though, of course. Next up, I’m going to polish some of the movement mechanics some more, and then I’ll get some friends to playtest it.
FINALLY fixed an annoying physics bug, improved the intro cutscene, and made the black holes look better I’m very happy to say that the dash/platform bug I was experiencing previously has now been solved. The player used to clip out of bounds if you dashed into a moving platform, but now, the player will get teleported back to where they were before. I also did some work on the intro cutscene, and while it isn’t yet finalized, I think it looks much better. Also, I made the center of the black hole a perfect circle now.
Finished Up the GitHub Readme, Game Trailer, and Itch.io page! I did all the last remaining steps to finishing the game before shipping. I made a trailer of about 1 minute, and wrote a section of the GitHub Readme about the making of SuperOrbital. I’m going to ship now!
Ships:
SUPERORBITAL: The Quest of the Anomaly After months of hard work, @orivio and I finally present to you SUPERORBITAL. What on earth is a SUPERORBITAL? SUPERORBITAL is a 2D platformer where you play as Vitri, the only human born without gravity. After years of being ostracized by society, Vitri sets out on a mission to change things for the better. He decides to take a gamble on a popular story that’s been spreading about all planets having tangible gravity cores at their centers, and decides to find one for himself. Accompanied only by his robot assistant, G.R.A.V. (Great Robot Assistant of Vitri), Vitri flies out into deep space and lands on a planet named Zeta-C5, where he uses special abilities, such as turning gravity on and off, to explore and make his way towards the planet’s core. Difficult obstacles and even unexpected foes block his way, but he’s got to get through no matter what. Dev Messages: orivio: SUPERORBITAL has been a really fun introduction to Godot! Though challenging at times, designing the levels around our unique mechanics was pretty fun, and I think overall the game turned out pretty great! Obviously it is only an alpha release, so I plan on working together with Obe Dot to polish it a ton, in terms of artwork, music, story, etc. Expect lots more content to come! Obe Dot: Developing this game has been an amazing experience. This is my first big gamedev project, and I’ve learned so much. I really hope to work more on this project in the future, while also improving my art and programming skills. Much appreciation to Hack Club for creating this event! Try out the game on our itch, or watch the provided gameplay footage and/or trailer! Trailer: https://www.youtube.com/watch?v=5WPKXYqy1FI Gameplay: https://youtu.be/-zq8ps87daI?si=sUK4_9BedT1OdXU8...
|
1792853530.485897
|
1792939930.485897
|
|
2449
|
JARVIS by @venkata_m | Stardance
|
venkata_m
|
1
|
185.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-24T03:43:55Z", "hours": 183.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a windows desktop AI assistant called JARVIS (inspired from Iron Man) with full voice responsiveness. It can control your computer, automate tasks, and works with your favorite apps! It has multi-provider support so you can just plop in a API key of your choice! The parts that were challenging were trying to maintain gpu performance with local AI models running and a whisper model for optimal experience. Another challenge was finding a provider to actually use to start testing as Im poor (I mean I have no money but my parents rich) and just cant spend money on this. Somethings people should know to test. Expect JARVIS to pickup other input if you are talking and incorrect input at times too (whisper medium is the default change to heavy for better experience though slower response). Download JARVIS setup.exe install (run as admin) and make sure to pin to desktop to make sure its always there! You can hit CTRL + SHIFT + J to open JARVIS from anywhere. Overall I think you guys will enjoy this!", "repo": "https://github.com/ONEPUNCHMAN411/Jarvis", "demo": "https://github.com/ONEPUNCHMAN411/Jarvis/releases/tag/v1.0"}]...
|
[{"post_id": 20335, "ts": "202 [{"post_id": 20335, "ts": "2026-07-01T22:14:14Z", "hours": 0.3053, "text": "Updated readme and actually made it my own (used a template before) and then clarified my ai usage in there too cuz it wasnt before. Will reship with some small changes."}, {"post_id": 15797, "ts": "2026-06-25T17:55:55Z", "hours": 1.6942, "text": "Ok so I spent a couple hours Playing with JARVIS cuz I was bored waiting for shipping review and I found out that I used the wrong SDK method for elevenlabs and I know that is a huge deal for people who want the natural JARVIS voice so I went ahead and fixed that. Also got one of the buttons fixed (mcp) because even though I thought I fixed it, it seemed to have still crashed sometimes so I went ahead and changed that. This is the LAST offical devlog hopefully I am going to reship thanks!"}, {"post_id": 14850, "ts": "2026-06-24T03:31:24Z", "hours": 10.1603, "text": "I got a really long session in but its worth it here is all of what I did (PS: this is my last devlog am shipping): Removed test files and patch files Fixed UI lag (the orb made it super laggy) Fixed crashing upon clicking mcp button Fixed Minimized window launching Fixed a lot more but those are the major ones Added direct UI calling for any ui features on your computer Thank you all for following this journey I hope you enjoy this project!"}, {"post_id": 12651, "ts": "2026-06-20T17:48:15Z", "hours": 5.0919, "text": "Got efficent work done today!: Added context window auto compaction so you have less usage but have persistent context Diff Viewer to view any changes JARVIS makes to files Dry Run tools to make sure shell commands are safe Confidence meter to show if JARVIS is sure about its answer/code Style Transfer Rewrite for all your essays and pdfs This was the first offical time JARVIS was hooked up and tested with the new features because I spent so long trying to find a free api provider and I finally did. I will now be testing and showing all features from today!"}, {"post_id": 12047, "ts": "2026-06-19T17:27:56Z", "hours": 10.3764, "text": "I didnt sleep all night for this but here is what I added: Browser bookmark imports and search capability so JARVIS can help you remember important sites Screenshot library so that JARVIS has improved context across sessions Conversation Personas so that the system prompt for JARVIS changes based on what you need Code Review Tool to help you do security, bug, and performance issues Thats it! im gon sleep now"}, {"post_id": 11708, "ts": "2026-06-19T02:11:45Z", "hours": 6.48, "text": "Got more features ! Here is what I added:: Clipboard History Manager to help you remember the thing you wanted 30 days ago Usage analytics so you can track your usage across sessions and make sure you dont get a $5000 api bill"}, {"post_id": 11383, "ts": "2026-06-18T17:01:06Z", "hours": 4.5725, "text": "JARVIS has new features! Added Folder and File cleanup feature to organize all your messes! Added Process watching so that JARVIS can keep an eye on tasks for you Thats the work for today!"}, {"post_id": 11040, "ts": "2026-06-18T02:14:11Z", "hours": 4.8919, "text": "Just got features added here is what was done: App launch sequence so you can start a set of apps depending on what you are doing Window focus history to have better context for JARVIS with the apps you are using Follow for more updates and eventually use it!"}, {"post_id": 10101, "ts": "2026-06-16T18:13:46Z", "hours": 2.2414, "text": "Made some small ui tweaks and fixed a LOT of bugs getting ready to ship in the next week or so"}, {"post_id": 9283, "ts": "2026-06-15T16:13:06Z", "hours": 6.445, "text": "Here is what I got done: Added support for app testing so JARVIS can directly test any apps you make and report back to you Added api testing support to test all your apis Added image editor so you can quick edit you photos Great day looking forward to tommorow!"}, {"post_id": 8963, "ts": "2026-06-14T22:20:52Z", "hours": 6.5175, "text": "Alright here is what was added: Postgresql query tool for all you database nerds out there Password file encryption vault for all your passwords to be stored locally and securely QR Code generator for all your needs Thats it not a lot but progress!"}, {"post_id": 8736, "ts": "2026-06-14T15:12:03Z", "hours": 5.995, "text": "Got a bunch of new features!: Added a smart scheduler program so you can have JARVIS manage time Added contact store so that JARVIS always remembers people Added region watcher so you can have jarvis monitor things while you are away Thats it for today!"}, {"post_id": 8471, "ts": "2026-06-14T02:37:12Z", "hours": 2.4428, "text": "Nothing too much for this log but here is what I added: Phone Voice commands meaning you can open the webserver of JARVIS and have it send commands on your computer or do tasks for you! Smart autofill for when you are filling forms and dont want to keep having to fill them out just fill it out once and never again! Thats it for today!"}, {"post_id": 8154, "ts": "2026-06-13T16:26:34Z", "hours": 7.3447, "text": "I added some new cool features: Global Dictation meaning you can do CTRL+SHIFT+D anywhere and speak and it will type that into the text space Workspace Layouts so you can change your workspace based on what you are doing Screen annotation so that JARVIS can basiclly doodle on your screen to show you things Added small calender to the side for easy access Thats all for today will get back tommorow!"}, {"post_id": 7566, "ts": "2026-06-12T17:26:49Z", "hours": 7.3233, "text": "UI Redesign done will be making some tweaks here and there but also added these: Blender MCP to let JARVIS control blender for you 3D creative work Slack plugin to control your team’s slack work RAG system so you can upload pdfs, docx and more to chat with Thats all for today"}, {"post_id": 6558, "ts": "2026-06-11T00:42:17Z", "hours": 6.9153, "text": "Just finished a good session here is what was added: Automatic Macro Making capabilities by jarvis as long as you describe it Scheduled prompts for repeated tasks that you want to happen at certain times Built in App Viewer so you can view the apps you developed from within jarvis Thats all for now will get back with more!"}, {"post_id": 6218, "ts": "2026-06-10T13:29:23Z", "hours": 7.2811, "text": "Alright! Here is what I got done: Added template prompt system (just to get people ideas) Added bookmark Buttons for specific conversations you may want Added auto named chat sessions so you dont have to! Thats all for right now will continue working!"}, {"post_id": 5976, "ts": "2026-06-10T00:39:16Z", "hours": 5.2711, "text": "Got some things done nothing major but here it is: Added voice memo plugins to record and manage your voice memos VIA jarvis Added Habit & Time Tracker feature for when you need to manage your behavior with JARVIS Added Discord plugin for message management especially if you want to use jarvis in a Non-Profit Situation"}, {"post_id": 5713, "ts": "2026-06-09T16:41:27Z", "hours": 8.9403, "text": "Got a lot done but definetly procrastinated too much because this should not have taken almost 9 hours. So I added a notification alert system so that JARVIS can now remind you of things from the new TO DO list feature OR the calender feature. Also added support for google calender so you can ask JARVIS to control that however you want. And finally I added a small network management system (just to find devices on your network, and be able to help you use them in a Homelab enviornment)."}, {"post_id": 5355, "ts": "2026-06-09T02:58:46Z", "hours": 8.0947, "text": "Just finished a long session but here is what I got done: Added a code executor tool so that JARVIS can directly execute any code it makes or you give it Added a context pin feature so that you can pin files, or important context to all conversations Added themes to let you customize what you do Added chat search (shouldve been here) so that you can search through all your previous chats Added media controller so that jarvis can control music and make reccomendations. Overall productive though I might take a break for 3-4 days soon"}, {"post_id": 4995, "ts": "2026-06-08T17:17:58Z", "hours": 6.7908, "text": "Got a Lot done while watching reddit stories lol! I added a pomodoro timer for students who want to use JARVIS as a study tool. Added ocr so it can read text out of images. Add image generation tab so you can generate your own custom images using dall-e 3. And also added a translate feature for all you language work! Got a lot more days of working ahead wish me good luck!"}, {"post_id": 4607, "ts": "2026-06-07T23:42:36Z", "hours": 8.5611, "text": "Got a lot of things done here! So first I made a quick usage tracker to keep track of your context window and usage on your AI provider. Second I got a browser plugin that can control a browser using playwright meaning it can use urls and use a browser as any human would. Finally, I added a camera vision feature so basiclly you can put any object on your camera (if you have one) and it will be able to tell things about it without you telling it what it is using moondream. Also built a sidepanel (not shown here) that allows you to pull up documents and images on the side of the jarvis app for quick access!"}, {"post_id": 3979, "ts": "2026-06-07T03:46:54Z", "hours": 9.9158, "text": "Just got finished working on elevenlabs compatibility so you can choose your own voice for jarvis and also added a long term memory system using chromaDB. Also added video transcription so you can drag in any file and it will transcribe it and summarize it for you."}, {"post_id": 3624, "ts": "2026-06-06T17:15:11Z", "hours": 5.2022, "text": "Added a local Moondream vision model so non-vision providers can still describe screenshots as text. Added a file converter plugin to convert, batch convert, and resize images between PNG, JPG, WEBP, BMP, TIFF, GIF, and ICO. Jarvis will be able to use these features through key words and convert and will auto use Moondream for providers without vision"}, {"post_id": 3270, "ts": "2026-06-06T03:42:51Z", "hours": 7.8389, "text": "Fixed MCP crash, added SSH manager button, built a vision bridge so blind AI providers can “see” screenshots via text descriptions, added a typing feature that pairs with vision to type things, notes plugin, system monitor, clipboard history tracker, and a conversation summarizer. Productive day."}, {"post_id": 2789, "ts": "2026-06-05T16:31:05Z", "hours": 4.8008, "text": "Finished UI and design thought Im definetly changing fonts. Now just gotta get the buttons working and we will be good until I start working on the features."}, {"post_id": 2517, "ts": "2026-06-05T01:37:56Z", "hours": 4.7686, "text": "Just finished working on a feature to connect remote SSH sessions to JARVIS so it can control your homelabs, Virtual Machines and more!"}, {"post_id": 2203, "ts": "2026-06-04T15:55:41Z", "hours": 19.0556, "text": "Made the main app and Just got mcp dev tools setup so you can attach extra tools if you want! Also made a bunch of bug patches because I realized it didnt work half the time lol."}]...
|
Title: JARVIS by @venkata_m | Stardance
Devlogs:
Title: JARVIS by @venkata_m | Stardance
Devlogs:
Made the main app and Just got mcp dev tools setup so you can attach extra tools if you want! Also made a bunch of bug patches because I realized it didnt work half the time lol.
Just finished working on a feature to connect remote SSH sessions to JARVIS so it can control your homelabs, Virtual Machines and more!
Finished UI and design thought Im definetly changing fonts. Now just gotta get the buttons working and we will be good until I start working on the features.
Fixed MCP crash, added SSH manager button, built a vision bridge so blind AI providers can “see” screenshots via text descriptions, added a typing feature that pairs with vision to type things, notes plugin, system monitor, clipboard history tracker, and a conversation summarizer. Productive day.
Added a local Moondream vision model so non-vision providers can still describe screenshots as text. Added a file converter plugin to convert, batch convert, and resize images between PNG, JPG, WEBP, BMP, TIFF, GIF, and ICO. Jarvis will be able to use these features through key words and convert and will auto use Moondream for providers without vision
Just got finished working on elevenlabs compatibility so you can choose your own voice for jarvis and also added a long term memory system using chromaDB. Also added video transcription so you can drag in any file and it will transcribe it and summarize it for you.
Got a lot of things done here! So first I made a quick usage tracker to keep track of your context window and usage on your AI provider. Second I got a browser plugin that can control a browser using playwright meaning it can use urls and use a browser as any human would. Finally, I added a camera vision feature so basiclly you can put any object on your camera (if you have one) and it will be able to tell things about it without you telling it what it is using moondream. Also built a sidepanel (not shown here) that allows you to pull up documents and images on the side of the jarvis app for quick access!
Got a Lot done while watching reddit stories lol! I added a pomodoro timer for students who want to use JARVIS as a study tool. Added ocr so it can read text out of images. Add image generation tab so you can generate your own custom images using dall-e 3. And also added a translate feature for all you language work! Got a lot more days of working ahead wish me good luck!
Just finished a long session but here is what I got done: Added a code executor tool so that JARVIS can directly execute any code it makes or you give it Added a context pin feature so that you can pin files, or important context to all conversations Added themes to let you customize what you do Added chat search (shouldve been here) so that you can search through all your previous chats Added media controller so that jarvis can control music and make reccomendations. Overall productive though I might take a break for 3-4 days soon
Got a lot done but definetly procrastinated too much because this should not have taken almost 9 hours. So I added a notification alert system so that JARVIS can now remind you of things from the new TO DO list feature OR the calender feature. Also added support for google calender so you can ask JARVIS to control that however you want. And finally I added a small network management system (just to find devices on your network, and be able to help you use them in a Homelab enviornment).
Got some things done nothing major but here it is: Added voice memo plugins to record and manage your voice memos VIA jarvis Added Habit & Time Tracker feature for when you need to manage your behavior with JARVIS Added Discord plugin for message management especially if you want to use jarvis in a Non-Profit Situation
Alright! Here is what I got done: Added template prompt system (just to get people ideas) Added bookmark Buttons for specific conversations you may want Added auto named chat sessions so you dont have to! Thats all for right now will continue working!
Just finished a good session here is what was added: Automatic Macro Making capabilities by jarvis as long as you describe it Scheduled prompts for repeated tasks that you want to happen at certain times Built in App Viewer so you can view the apps you developed from within jarvis Thats all for now will get back with more!
UI Redesign done will be making some tweaks here and there but also added these: Blender MCP to let JARVIS control blender for you 3D creative work Slack plugin to control your team’s slack work RAG system so you can upload pdfs, docx and more to chat with Thats all for today
I added some new cool features: Global Dictation meaning you can do CTRL+SHIFT+D anywhere and speak and it will type that into the text space Workspace Layouts so you can change your workspace based on what you are doing Screen annotation so that JARVIS can basiclly doodle on your screen to show you things Added small calender to the side for easy access Thats all for today will get back tommorow!
Nothing too much for this log but here is what I added: Phone Voice commands meaning you can open the webserver of JARVIS and have it send commands on your computer or do tasks for you! Smart autofill for when you are filling forms and dont want to keep having to fill them out just fill it out once and never again! Thats it for today!
Got a bunch of new features!: Added a smart scheduler program so you can have JARVIS manage time Added contact store so that JARVIS always remembers people Added region watcher so you can have jarvis monitor things while you are away Thats it for today!
Alright here is what was added: Postgresql query tool for all you database nerds out there Password file encryption vault for all your passwords to be stored locally and securely QR Code generator for all your needs Thats it not a lot but progress!
Here is what I got done: Added support for app testing so JARVIS can directly test any apps you make and report back to you Added api testing support to test all your apis Added image editor so you can quick edit you photos Great day looking forward to tommorow!
Made some small ui tweaks and fixed a LOT of bugs getting ready to ship in the next week or so
Just got features added here is what was done: App launch sequence so you can start a set of apps depending on what you are doing Window focus history to have better context for JARVIS with the apps you are using Follow for more updates and eventually use it!
JARVIS has new features! Added Folder and File cleanup feature to organize all your messes! Added Process watching so that JARVIS can keep an eye on tasks for you Thats the work for today!
Got more features ! Here is what I added:: Clipboard History Manager to help you remember the thing you wanted 30 days ago Usage analytics so you can track your usage across sessions and make sure you dont get a $5000 api bill
I didnt sleep all night for this but here is what I added: Browser bookmark imports and search capability so JARVIS can help you remember important sites Screenshot library so that JARVIS has improved context across sessions Conversation Personas so that the system prompt for JARVIS changes based on what you need Code Review Tool to help you do security, bug, and performance issues Thats it! im gon sleep now
Got efficent work done today!: Added context window auto compaction so you have less usage but have persistent context Diff Viewer to view any changes JARVIS makes to files Dry Run tools to make sure shell commands are safe Confidence meter to show if JARVIS is sure about its answer/code Style Transfer Rewrite for all your essays and pdfs This was the first offical time JARVIS was hooked up and tested with the new features because I spent so long trying to find a free api provider and I finally did. I will now be testing and showing all features from today!
I got a really long session in but its worth it here is all of what I did (PS: this is my last devlog am shipping): Removed test files and patch files Fixed UI lag (the orb made it super laggy) Fixed crashing upon clicking mcp button Fixed Minimized window launching Fixed a lot more but those are the major ones Added direct UI calling for any ui features on your computer Thank you all for following this journey I hope you enjoy this project!
Ok so I spent a couple hours Playing with JARVIS cuz I was bored waiting for shipping review and I found out that I used the wrong SDK method for elevenlabs and I know that is a huge deal for people who want the natural JARVIS voice so I went ahead and fixed that. Also got one of the buttons fixed (mcp) because even though I thought I fixed it, it seemed to have still crashed sometimes so I went ahead and changed that. This is the LAST offical devlog hopefully I am going to reship thanks!
Updated readme and actually made it my own (used a template before) and then clarified my ai usage in there too cuz it wasnt before. Will reship with some small changes.
Ships:
I made a windows desktop AI assistant called JARVIS (inspired from Iron Man) with full voice responsiveness. It can control your computer, automate tasks, and works with your favorite apps! It has multi-provider support so you can just plop in a API key of your choice! The parts that were challenging were trying to maintain gpu performance with local AI models running and a whisper model for optimal experience. Another challenge was finding a provider to actually use to start testing as Im poor (I mean I have no money but my parents rich) and just cant spend money on this. Somethings people should know to test. Expect JARVIS to pickup other input if you are talking and incorrect input at times too (whisper medium is the default change to heavy for better experience though slower response). Download JARVIS setup.exe install (run as admin) and make sure to pin to desktop to make sure its always there! You can hit CTRL + SHIFT + J to open JARVIS from anywhere. Overall I think you guys will enjoy this!...
|
1792878734.9896028
|
1793742734.9896028
|
|
25644
|
rlbuddy by @kmdw | Stardance
|
kmdw
|
3
|
185.95
|
2643
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-28T00:20:30Z", "hours": 40.0, "multiplier": 18.76, "payout": 740, "blessing": "neutral", "text": "I made rlbuddy, a rocket league companion app! This is the third ship so far. The big features this time are the asset swapper and Linux support, but I think that the feature I’m most proud of this time is the asset swapper! It inserts the appearance of one item into the file of another, meaning by swapping out assets for others you can make your car look however you like! (Client-side only, of course). I learned a lot about byte-level manipulation and working with raw data streams and encryption/decryption in Rust, and I can read hex (relatively) well now! It’s also great because I think this combined with the doorstop experiment from a while ago gives me a nice base to try some reverse-engineering challenges in the future. I also worked a lot on performance this time, such as tuning loop times/ui fps caps and minimizing ram usage (I achieved around an 80% reduction here!) There are a crap ton more features added than that (totaling almost 100 commits), but I’m pretty sure you’re not supposed to have massive feature-dumps on the ship text. So the full list is on the latest github release! In the image, you can see I have a white fennec. In reality, I don’t actually have a tw trim, and the equipped decal isn’t compatible with the fennec either. But, using the power of asset swapping, I can get a beautiful all-white car. Neat!", "repo": "https://github.com/Kalilamodow/rlbuddy", "demo": "https://github.com/Kalilamodow/rlbuddy/releases/latest/"}, {"ship_num": 2, "ts": "2026-09-07T20:33:21Z", "hours": 27.0, "multiplier": 16.74, "payout": 457, "blessing": "neutral", "text": "rlbutddy is a feature-rich companion for Rocket League, and v1.2 is out. There’s been some big architectural changes meaning it’s faster and bug-free-er, as well as big new features! New!!! Avatars! Now you can see people’s profile pictures even when you’re not on their platform. Custom map loader! You can import maps from a ZIP or download them straight from Bakkesplugins! Gamepad overlay! Show your controls while playing, to show off your bindings or get some help with your speedflips. I think I’ve definitely improved at Rust since the last release. Just in terms of the amount of mistakes I make, I feel like it’s way more smooth sailing than before. For example, I was able to (mostly) write not-so-buggy code and “run the borrow checker in my head” without needing to cargo check a million times, and clippy tends to have a lot less suggestions for me. Pretty great!", "repo": "https://github.com/Kalilamodow/rlbuddy", "demo": "https://github.com/Kalilamodow/rlbuddy/releases/latest/"}, {"ship_num": 3, "ts": "2026-08-25T22:08:36Z", "hours": 109.0, "multiplier": 17.59, "payout": 1446, "blessing": "neutral", "text": "rlbuddy is a feature-filled companion for Rocket League! It shows the skill of everyone in your lobby and has tons of toggleable widgets and features to make your life a lot easier, from Discord integration to music control. This is my first non-tiny Rust project, and I think it was really great! I’ve learned a lot such as proper state management and the ins and outs of Rust’s syntax. You can give it a try by heading to the Github releases section. If you play Rocket League, I hope you use it!", "repo": "https://github.com/Kalilamodow/rlbuddy", "demo": "https://github.com/Kalilamodow/rlbuddy/releases/latest/"}]...
|
[{"post_id": 80191, "ts": "202 [{"post_id": 80191, "ts": "2026-10-16T17:13:05Z", "hours": 3.4819, "text": "more small improvements. i gave the session stats widget an actual service as well which speeds things up a lot since its not recalculating statistics every single frame. the swapper also uses the backup file if one is available and it no longer accepts duplicate custom maps"}, {"post_id": 77292, "ts": "2026-10-06T13:38:54Z", "hours": 0.4772, "text": "A few fixes here and there. Some refactors, caching externally loaded playlists in savedata, and fixing a deadlock when clearing the items cache. And for some reason the decal option was missing from the items list picker."}, {"post_id": 75881, "ts": "2026-10-01T13:48:20Z", "hours": 5.9928, "text": "I made a standalone web-based swapper for the people who don’t want to download an entire app. A lot of people had broken packages after the last update but didn’t want to install a dedicated program just for a few swaps. So, I used the asset swapper backend of rlbuddy to make this thingamabob which runs entirely in the browser! First, I had to find out how to actually share rlbuddy’s asset swapper with other projects. Turns out Cargo has a cool thing called workspaces where you can have multiple crates in the same repo! So I moved the dedicated UPK/AES etc. stuff into a new crate and added it as a dependency in regular rlbuddy. Then, I whipped up a small wasm-compatible eframe app with the template, and included the new crate as a dependency. I made a big state machine of the steps meaning it’s impossible to have an invalid state, which is really nice. The only problem was that Rust’s ownership system isn’t smart enough to deal with it, so the code is a bit repetitive in places but it’s definitely worth it. The WASM restrictions were super annoying, mainly do to with filesystem access and requiring async. I ended up using the egui-async crate and spilling Binds all over the place within the state machine. I couldn’t even figure out how to get the actual swap procedure to run in a different thread. I also spent like 30 minutes debugging why in the world asset swapping was just broken. Even when I verified the same binary data were going in to the Upk object in the webapp and rlbuddy, for some reason the output upk was just different. Turns out I used chosen_replacement.name instead of chosen_replacement.package.name() . Isn’t that great? Anyways, it works fine now and I’m planning on posting it on r/RocketLeagueMods and possible r/RocketLeague."}, {"post_id": 74679, "ts": "2026-09-27T23:46:54Z", "hours": 3.0297, "text": "Not much in terms of super-cool stuff this time. Highlights are: make sure dynamic playlist loading uses the latest cache file (and also fix its loading on normal people’s rocket league installs) loading the cache file on another thread so it doesnt freeze the whole app for a second on the first lazy lock access searching for items in the item swapper moved the error handling of the map loader to anyhow So no ultra-exciting things to talk about. anyhow is really cool though, it really simplifies error handling everywhere in the app, and I’m a big fan of its bail! macro. I’m also using Cow a lot more. Moo!"}, {"post_id": 73444, "ts": "2026-09-25T03:22:46Z", "hours": 4.635, "text": "I got licensee version 34 (encrypted payloads too) to swap finally! Okay, so this was awesome. Rocket League’s been having a bunch of updates lately, which breaks the packages of people trying to get free stuff. So, in a Reddit thread, I ended up dishing out a bunch of swapped asset files for people in this situation. There’s a new boost which everybody wanted really bad since it was really rare (but they decided to make it unlockable at rocket pass lv99 so it doesn’t even matter anymore), and it was UNSWAPPABLE for three reasons: it was encrypted specially i hadnt encountered specially encrypted packages meaning their handling was wrong aes keys werent out for it yet (or so I thought) I’ll start with 3. I had written a tool which looks in the games cache for AES keys, and dumped them, and it worked great. What I didn’t expect is the filename to change between versions. So, I was super confused since yesterday since the AES key for the boost was just… missing. Thankfully, the geniuses at the RLMM discord got it and helped me figure out that the file I was reading from was just outdated. Great! Anyways, not too big of a deal, just a big delay. Now it’s time for the real challenge: figuring out how the hell to handle this type of package. First, I did some research. The twelve bytes of padding in files with licensee version >=33 before the summary are actually a nonce/aes iv, not just padding. Then, the header is encrypted with AES-CTR with the twelve first bytes of the iv just being the nonce. And the compressed chunks are encrypted too here: each one is also AES-CTRed with their own nonces in FCompressedChunkInfo. Thing is, I don’t have an implementation to really go off anymore, meaning there’s a lot more trial and error. For the original implementation, there were one or two existing asset swappers (though they were vibecoded meaning more of a puzzle to figure out what they’re even doing), but this time I was mostly relying on emii’s fork of UEViewer. Anyways, after spending a while figuring out what exactly I had to masquerade (payload, key, swap nonces) I finally got it to work!"}, {"post_id": 72491, "ts": "2026-09-23T02:26:44Z", "hours": 1.8381, "text": "rlbuddy now loads additional playlists straight from the game’s cached webconfig, instead of hardcoding them all! This means that the list of playlists will basically never go out of date. There are actually quite a few services which rely on game files (eg. auto stats api setup, custom maps, asset swapper). So, the first thing I did was to refactor it so make all of these load from the same global value. Then, for playlists, I made it read from a specific file in the game’s http cache directory which contains a bunch of configuration. Then, it parses it into a JSON object, grabs all the values with Class PlaylistSettings_TA, and then extracts the title and playlist id! There are still a bunch of built-in Playlists, since those have internal things like going from a casual playlist type to its respective competitive one or having the hard-coded list of singleplayer playlists. But, all the other ones, like ltms are dynamically loaded. Yay!"}, {"post_id": 72027, "ts": "2026-09-22T00:56:20Z", "hours": 3.9097, "text": "I made a ton of improvements to the asset swapper! And fixed a bug with the music player which is cool technically, so I’ll start with that. The player uses the GSMTC api, which is async, but egui doesn’t really like async. So, I made it so that every time you wanted to run some command on the current session, it would start up a new thread. This was less than ideal for a few reasons: terrible performance race conditions could happen just… in Windows itself The main problem was 2: for example, if you skipped a replay too fast, the Play command from the end of the replay might actually reach Windows before the Pause command from the replay start, leaving your music paused. So instead, it starts one dedicated worker thread which has a channel which receives a Box<dyn FnOnce(Session)> , and executes at most one command every 50ms (only one command per loop, fixed loop time of 50ms). It’s really interesting because you actually end up sending a closure through a channel, which feels funny but when you really think about it it’s just ownership semantics. But, that’s working great now! On to swapper improvements! First, I moved most of the swapper module to anyhow handling (it’s heaven!), and I also modernized the upk api a bit since it was basically dragged directly from the proof-of-concept repo, meaning it was not really application-ready. Also, it previously looked at the game’s webcache to decode the AES keys for header decryption, but now it uses the wonderful Toga-Files repository along with a really nice caching layer for it to load items and their associated API keys. Having access to the actual item data is also way better since you don’t have to manually type in a package name which is kinda weird for any normal person. Now, you can select it from a dropdown instead! I love UX."}, {"post_id": 71420, "ts": "2026-09-20T19:51:05Z", "hours": 4.5228, "text": "rlbuddy now has item swapping! Basically, making one item appear like another to use items you don’t actually own. These hours were spent on a few different things. Firstly, I optimized the thing a bunch! There were a few places that were pretty slow since the original repo was mainly for testing. For example instead of decrypting the entire header and rechecking it to find the right key, it only loads the first 4 blocks and attempts to decrypt the first FString. If it fails, that means the AES key isn’t valid. Also, I improved the error handling with anyhow. It actually makes it so much easier to deal with things and was pretty useful when debugging the move over to the actual app. Now I’m just going to work on polishing the panel UI a bit more, since it’s still kind of ugly."}, {"post_id": 70888, "ts": "2026-09-19T23:20:36Z", "hours": 2.1058, "text": "Apparently there are a bunch of different AES keys rocket league uses, not just one. You can get a list of them from the psynet config url, and then do some weird crc stuff to change them from “content keys” to aes keys. I discovered the rocket league mapmaking discord today and I’m blown away by the amount of information on there, and also apparently my whole thing about the unknown bytes when licensee version > 32 was straight up wrong, which is funny. Anyways it works for all items now, which is great. I’m gonna work on actually putting it in rlbuddy now, hopefully that goes well"}, {"post_id": 69896, "ts": "2026-09-18T01:01:05Z", "hours": 0.9667, "text": "IT WORKS WHEN THE HEADER EXPANDS NOW YAYAYYAYAYAYYAYAYYAYAYAY I’m gonna be honest, the problem might just have been that my testing package was corrupted. I was debugging my deserialization logic, which I thought might have some parsing issue near the header extraction, and noticed that once the encrypted region deserializer’s Cursor reached the end of the region, it was actually FARTHER than the package summary’s total_header_size - by 6 bytes! That’s pretty bad, and I don’t know how something like that even happened. Anyways, I repaired the game and brought over the shiny new upk and… it worked. I’m pretty sure that I only accidentally did this while tidying up my workspace a few hours ago, but if this has genuinely been the thing holding me back for the past few days - I also finally made the poc code public, at https://github.com/kalilamodow/rl-upk-testing/"}, {"post_id": 69850, "ts": "2026-09-17T22:15:40Z", "hours": 1.67, "text": "IT SWAPPED IT SWAPPED IT SWAPPED AHAHAHHAHAHAHHAHAHAHAHHA FINALLY Okay now I gotta make it work for other pairs of boosts. If WHEN that works, I’ll actually put it in rlbuddy. I removed all the code relating to changing offsets to try to give myself a minimal workspace to tinker in, with as little side effects as possible. So, all the current code does is 1. open them 2. replace the name table entries and package guid. Surprisingly simple. Once I make it a bit more generic, I can extend it to support more swaps. If I’m really unable to get it to work for more combinations, I’ll probably end up just publishing the poc repo and not adding swapping to rlbuddy at all. This is a great motivation boost, though. I was honestly dreading coming home to work on it today because I was done with failing over and over, and considering giving up."}, {"post_id": 68661, "ts": "2026-09-15T14:25:29Z", "hours": 2.6667, "text": "I got a name swap! It doesn’t work properly, but I’m glad the game didn’t crash. These hours have been by far the most frustrating because the only way to test is against the real game since it’s really picky, but the game takes like 30 seconds to start, and if it crashes, it gives a cryptic error log, and if it freezes, it doesn’t give any log at all. I spent most of the time messing with moving different offset values forward and backwards, and ended up reverting to a simpler version with no overwriting when the header size changes just to test things. So far, I’ve mostly gleaned that name renaming is possible, but only up to a point. If the name grows too much, the game crashes, and if the name shrinks too much, the game freezes. Additionally, for some reason, total_header_size changes by the padded header size instead of the encrypted header size, which I still don’t understand. It’s seriously weird. I serialize each name properly, and yet the game reads it wrong. This game really does need a new codebase. When UE6 comes out, either the game’s gonna be so good it doesn’t need mods, or it’ll be relatively easily moddable. Or neither, which is the most probable based on Epic Games’ track record. Anyways, enjoy the beautiful screenshot."}, {"post_id": 68281, "ts": "2026-09-14T20:49:26Z", "hours": 3.1181, "text": "I figured out what comes after export tables! And it took way too long, since I DISCOVERED IT MYSELF! At least, as far as I know. I couldn’t find any information online about this portion of the header, so it was basically luck that I noticed a pattern. Before, I was just copying everything after the export table and pasting them back in afterwards, but as you can guess, that stopped working if I adjusted anything within the encrypted region. Compressed chunk info is a known part, and I figured out the AES padding pretty easily, so most of the time was spent trying to figure out what in the world those 24 bytes were. The first four bytes in the compressed chunk info are how many chunks they are. Here, in the Bubbles boost package, there are two (little endian), with 24 bytes of ???. And in Flamethrower, there are three, with 36 bytes of ???. I noticed that the ??? was always n chunks * 12 bytes (actually, it’s lucky that I didn’t test any which ended up having 0, otherwise I probably wouldn’t have figured it out). Since this probably had something to do with chunks, I made a guess that each chunk had some extra data stored in this array, 12 bytes of info per chunk. Using HxD’s highlight-bytes-and-get-the-decimal-value feature, I noticed a pattern where the first 8 bytes looked like an i64 offset and the last 4 looked like an i32 size, which the compressed chunk infos were also like for their matching counterparts. So, I deserialized it as [i64; i32] * n chunks and was able to read it better. These additional chunk infos seem to kinda sorta match up to uncompressed header offsets, but I don’t really understand what they are (and they’re marked as such in the code, lol). So, with that working (and some fiddling with broken serialization of TArrays which I’m surprised I didn’t catch earlier), I now understood the ENTIRE package header! Hooray! Let’s look at another example. body_grain_SF, the Fennec, has 4 chunks. Guess how many bytes of ??? it has. That’s right, zero! For some reason, a few packages just don’t have those things. After going through a bunch of them, I found that if licensee version was 32, there was no ???. But if it was 33, there WAS ???. I basically just added an if statement and it was fixed. I’m going to try to work on figuring out the padding in between the package summary and the start of the name table, but if I can’t, I suppose I’ll finally get to actually doing package swapping. Later!"}, {"post_id": 67059, "ts": "2026-09-13T03:19:34Z", "hours": 2.9378, "text": "I JUST DESERIALIZED AND RESERIALIZED A UPK. OMAIGOD IM SO HAPPY. my brain is so tired. Alright so the payload still doesn’t get transferred but that’s pretty simple, it’s just Vec::extend. What a challenge! Deserialization actually ended up being the easy part, which is opposite of what I expected from starting the project. It went (relatively) fast since there are a few existing implementations which I could kinda just “borrow” structure parsing from. But, mine is unique in that it almost completely reserializes the package itself. I might’ve been able to “borrow” reserialization, but the impl I’ve been looking at is STRAIGHT ai slop and it’s more annoying to read that than to just do it myself. It was useful though, so I have to respect it. The first problem: basically, the first byte of an FString determines how many parts it has, NOT how many bytes it has. Which wasn’t a problem for parsing, since I had some word-based helpers which worked so I didn’t think much about it. But, when reserializing, I made two mistakes: 1. forgot to add the null terminator (which shouldn’t even be necessary) and 2. I accidentally put the wrong offset. I have no clue why there’s a null terminator for FStrings. The format is [n chars][the char bytes], meaning it should already be known how long the string is. Pretty stupid, but whatever. Anyways, when reserializing you’re supposed to include the null terminator in the string length marker. So, my logic was that I should offset it by two since unicode characters are two bytes. Bleh! I should’ve only incremented by one, since it’s in terms of utf16 chars rather than bytes. Yay, that worked! I don’t know how to summarize the next problem, so I’ll explain the reasoning. The package header is file summary + tables + something else (we’ll get to that later). Anyways, there’s some mysterious padding in between the summary and tables. Parsing, it’s easy to skip over because the summary includes the tables start offset ( name_offset , the name table is the first one). But when reserializing, you gotta keep those offsets intact. Well, I’m not totally sure if you actually have to keep them, but just for the sake of simplicity I tried to (which ended up adding more complexity, which I’ll see if I can remove now). So, I serialize/push the summary to the big Vec. Then, I make a new Vec and serialize the name table at (name_offset - summary_size), since the new Vec has to be encrypted and then appended to the big Vec. I do the same thing for imports/exports (placing the table at import/export _table_offset - summary_size ). Oh no! Since name_table_offset isn’t equal to summary_size, there’s some padding in between, which is expected. HOWEVER! The previous logic would skip over it in the table Vec creation, meaning the table Vec would have some 0-padding at the start. This padding needs to be in the SUMMARY part instead, and the name_offset should basically be the ZERO of the tables Vec! I doubt I would’ve been able to solve this part without the beautiful tool HxD . It’s really easy to use and is always helpful when I’m figgling around with binary. So, it does some more math, calculates the spacing, adds it to the big vec, and removes it from the tables Vec. Then, it re-encrypts the tables Vec and pushes it onto the big Vec! Okay, now that’s done. NOPE! There’s a mysterious structure for some reason at the end of the real table part? Yep, it’s that something else I said we’ll get to. I actually still have no idea what it is. From some research, I gathered it must be the dependencies table, but it’s really poorly documented. So, I ended up just cutting the bytes out from after the export table to the end of the tables part, and “pasting” it back before re-encryption. I do hope this devlog was readable. Now I’ll get to including the actual package payload and hopefully simplifying reserialization offsets. See you soon!"}, {"post_id": 66867, "ts": "2026-09-12T20:09:08Z", "hours": 2.0211, "text": "I’ve been putting this off for a while, but I’ve finally decided I’m going to add asset swapping. There’re a few existing implementations, so I’m reading those as well as some pdfs about the upk format. So basically credit to this document and this implementation . All it can do for now is parse the file summary. The implementation wasn’t too bad since I had Google as well as the C# implementation I just talked about. I basically have trait Deserializable : Sized { fn deserialize ( reader : & mut impl Read ) -> AnyResult < Self > ; } Then implement that for the various parts (eg. FGuid , a generic TArray ). Then, I use byteorder to read out numbers into each struct. For example, #[derive(Debug)] struct FCompressedChunkInfo { uncompressed_offset : i64 , uncompressed_size : i32 , compressed_offset : i64 , compressed_size : i32 , } impl Deserializable for FCompressedChunkInfo { fn deserialize ( reader : & mut impl Read ) -> AnyResult < Self > { Ok ( Self { uncompressed_offset : reader .read_i64 :: < LittleEndian > () ? , uncompressed_size : reader .read_i32 :: < LittleEndian > () ? , compressed_offset : reader .read_i64 :: < LittleEndian > () ? , compressed_size : reader .read_i32 :: < LittleEndian > () ? , }) } } I originally prototyped it in Python and then moved to Rust once I got tired of python’s byte shenanigans."}, {"post_id": 66219, "ts": "2026-09-11T22:03:11Z", "hours": 2.5883, "text": "I did lots of performance improvements and also IT WORKS ON LINUX NOW!!! Let’s talk about performance first. Anyways, it has been using around 4% and 220MB of ram, which isn’t really what you’d expect from an overlay! So, I used things like DHAT to profile the memory, and noticed that fonts were doing some shenanigans. So I removed egui_system_fonts and loaded directly from C:\\Windows\\Fonts\\segoeui.ttf and RAM usage dropped to 30mb. That was what the previous devlog was about. I then changed the default logic update rate from 10ms (100/s) to 65ms (15/s approx). This reduced idle cpu usage to under 0.2%. But, doing anything with the UI would spike it to 4%, which is still pretty bad. So, I used a method I found in an egui issue thread where I’d count the frametime since the last render, then sleep until the target frametime was finished. For example, if the frame rendered in 2ms but I want 16ms frametime, it would sleep for 14ms. That way, I could limit how often the UI rendered! This made it stay under around 1% CPU forever! Okay, Linux time! Rust is mostly cross-platform, so support was mostly dealing with dumbass design decisions. Since Music relies on GSMTC, I had to feature-gate the entire thing (as well as the windows/windows-future crates) behind cfg(windows) :( I also had to fix Linux font loading (since like I said earlier, it’s hardcoded to segoe ui). So I install fontdb on Linux and search for some popular fonts from there to load instead. Finally, I fixed up the storage paths since it could only load from AppData. I also made it use AppData\\Local vs. AppData\\Roaming instead of putting everything in Roaming. I first got it working through WSL! ! It took some messing with my GPU drivers but I got it to render. Now was the real challenge: getting it to build on an ACTUAL Linux machine. I had an old, basically broken Surface Pro 3 that I had put Debian+GNOME on for shits and giggles a few months ago. The perfect target! The main problem was getting Rocket League to even launch. I set up Legendary (goated launcher btw, check it out ) and tried to run it. I installed Wine, got Wine Mono, and it failed with a weird cryptic error about the CreateWindow function. The obvious solution to a graphical error: disable EAC. Yay, it launched! Then to get it to build. First I had to fix some filepaths since Linux is case-sensitive (nerds) while I don’t care about case on Windows. Then, rust-lld gave some weird error about simd or something which I didn’t care about. I just ran cargo clean and rebuilt it and it worked fine. Then to run, and it actually worked first try! It’s cool because I went into it expecting to debug a million socket errors, but it actuallly connected and ran. Awesome sauce! Now Linux users can use rlbuddy. More minions to contr- I mean cool users! Cya in the next one! ;) If you check out the rl perf overlay in the screenshot, you’ll be able to guess why this is the laptop I decided to put Linux on."}, {"post_id": 65417, "ts": "2026-09-10T15:25:20Z", "hours": 0.8867, "text": "I’ve been debugging high memory for the past month or so. It was egui_system_fonts. Why would fonts take 170mb of ram????????????????????????????????? help!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! I hate external dependencies!!!!!!!!!!!!!!!!!!!!11 I owe my life to DHAT now. go star https://github.com/nnethercote/dhat-rs"}, {"post_id": 65067, "ts": "2026-09-09T22:28:11Z", "hours": 1.5, "text": "More gamepad overlay buttons!!! Yay!!! In not-so-awesomely-exciting news, I also added a table of contents to the readme (as well as a generator for it). The script’s in Python (I’m sorry for not using Rust) meaning the repository is now 0.5% Python. Takeover incoming? I overcomplicated the script a lot, but it’s really easy to read. There are three whole comments, aka 6% of lines in the whole file! It’s not technically interesting in the slightest. I was thinking of building a tree-like structure before outputting the string, but realized I can just use the header level (h1 vs h2 vs h3 etc) as the amount of spaces / 2. I also refactored it not to use magic PanelId s for the default panel list. I kinda rushed that part when I made it, I’ll be honest. But now each Panel can implement fn open_by_default(&self) -> bool (returns false by default) and if it does it keeps it open when savedata doesn’t exist yet. I don’t get how an entire hour n 27 minutes was spent on like 7 not-even-that-big commits. At least it was a good use of my math class. We reviewed limits for some reason (which everyone should already know for one because they took the prereqs?), and the teacher managed to extend her lecture for the ENTIRE class time. rlbuddy development saving the day, I guess (just like it will in your rocket league games btw, so you should download it)"}, {"post_id": 64822, "ts": "2026-09-09T14:32:38Z", "hours": 1.4469, "text": "I’ve mostly been working on smaller features, improvements, and bugfixes. A cool one I did is fixing weird glitchy movement with the gamepad overlay window! Basically, the window needs to persist its position across disabling it/enabling it. And egui is immediate mode. So, every time it rendered the viewport, it would both set and get its position. So, moving it would update the current position, but because of the weird interop between setting the position in a ViewportBuilder and getting it from the viewport info, it would glitch back and forth, especially when my laptop is lagging. I fixed it by only calling the ViewportBuilder ‘s “ with_position ” method when the overlay had just been enabled ( !was_enabled && currently_enabled ). That way, it only sets it once externally, and lets it move freely while it’s open. Then, while it’s moving, it continues to update the saved position. And upon closing and then reopening it, it sets it again (but only once!) Relatively simple fix but it’s kind of funny. I mainly noticed it when I added a feature that would auto-unmaximize the overlay when the user maximizes it, and it would go crazy and fly around the screen. Very fun! I also fixed a pretty old bug where it would incorrectly detect the local player. Basically, the stats api doesn’t actually tell you who the local player is. So, we have to guess based on who the camera is targeting right now. Usually, it’s on the local player, but during goal replays or spectating a bot when joining a casual game, it would be improperly set at the start and then stay like that. So, I made sure that it always updated as long as the match is 1. in progress 2. not in a replay. It also fixes a thing with inconsistent match toasts, since the toasts only fire if the scoring player is the local player (and if it thinks the wrong player is the local player, everything’s messed up). I’m planning on revamping hotkeys next, to allow you to bind to any controller button and even do custom quickchats in-game. Later!"}, {"post_id": 63368, "ts": "2026-09-07T04:36:35Z", "hours": 1.4131, "text": "Time formatting doesn’t suck anymore! I made the implementation way better so I could make it support stuff even past weeks, like months and years. The new implementation added around 60 lines, but it’s for a good cause. The previous implementation used a match statement with duplicated logic that only supported seconds, minutes, and hours, using a pluralize function and inline if-statements everywhere. If it were sent to any rational code-reviewer, they would likely have a heart attack. Now it’s a bit more complex but less complicated. You have TimeUnit s which format the unit themselves and TimePart s which format a value + a unit. Then, just use some math to build a Vec and format it into a string. Boom! Beautiful, well-formed time formatting. To soak in the new beauty, I added days n weeks. I just had to add 14 lines! The previous one would have probably needed a bunch of stupid magic numbers and weird chains everywhere to accomplish the same thing. Okay, I’m done using your time on reading a way-too-long write-up about fixing a crappy implementation that shouldn’t have been there in the first place. I’m gonna ship right after posting this. If you get it, make sure to give it 10 stars in everything 😉. Haha, jk. Well, not really. Cya later."}, {"post_id": 62559, "ts": "2026-09-06T00:29:40Z", "hours": 1.8697, "text": "Had to remove the tracker.gg widget :( unfortunately they don’t allow scraping and what I had wasn’t allowed anyways. Things that used to open the player info widget now just open tracker in a browser."}, {"post_id": 60965, "ts": "2026-09-03T17:23:52Z", "hours": 2.9253, "text": "I finished the big refactor! I pushed around 25 commits to GitHub at once. I’m really gonna enjoy adding the next feature, basking in how much easier it is ;) Apparently, I never made a service for session stats, so it currently can’t persist its one setting. Actually, writing this I realized that the setting isn’t actually used, so I can delete it. That’s great. After finally kicking out all the annoying legacy panel code, I remembered that I never re-implemented the positioning or its related persistence code for the new panel system. The persistence system was reworked too, something that I don’t think really got included in the previous devlog. Each service can implement save , and there are generic helper methods in a common module for saving/loading serde structs to a file in the app data directory. The actual app now uses this method as well instead of doing all the pathing logic itself, so the persistence module is pretty small and could honestly be moved into app.rs. For new positioning, I store a list of open panels. Weirdly enough, it’s actually a lot easier than adding a position/is_open field to every AppPanel. So, I run the name through a Hasher to make a u64 which is easier to clone/copy and stuff and made a newtype around a PanelId. That way I could reuse the code from the previous paneling system to swap/manage open PanelIds, then just use find on the AppPanel vec to find the corresponding widget. Also, I never mentioned it but I’ve been trying RustRover for the past few devlogs. It’s a lot more stable than Zed, but I sorta miss its snappiness and minimalism. If I end up finding an annoying bug in RustRover, I’ll probably switch back. However, it’s been quite a few days and I don’t think I’ve found a single one. JetBrains is truly awesome at tooling. See ya next time. Probably will do my next ship soon :)"}, {"post_id": 60552, "ts": "2026-09-02T23:31:23Z", "hours": 3.3072, "text": "I’m MASSIVELY refactoring rlbuddy! This, I think is the second (and hopefully the final) major refactor to the codebase. So, basically the current architecture is split into services and widgets. Each service has an update method, which does its stuff (draining subscribers, processing commands, etc). Since egui is immediate mode, this architecture works unlike callbacks/event-based which I actually tried to implement but couldn’t. Every widget is just implements egui::Widget, that holds some state handles (Rc) and command senders (Sender), usually just one for its respective service. Services are alive for the lifetime of the app, while widgets are the openable panels you see. Widgets display the data from service state, and talk back to it by mutating shared state or sending commands. I think music control has been the best for me to wrap my head around to decide about changes, so I’ll explain it with that. Music control had a controller, a service, and a widget file. The controller was a thread pool manager (if you can call the questionable implementation that) around Windows’ GSMTC API to give a single-thread api for it (since the app is basically single-threaded). Then, the service is always alive, syncing a state struct between the controller and its own state handle. Finally, the widget is optionally there as a panel, with next/previous/pause buttons which send commands and the ui which reads service state to display. It also has a mutable service state reference for settings (the “pause during anthems” button). The god object RlbuddyApp struct stores all of this stuff. So it has a music_control_service, music_control_widget, stats_api_service, all of those fields, which kinda sucked. On top of that, I had to maintain an enum of every panel, which was enumerated for the “open panel” popup and to render each one if it’s open. you might think “hey… isn’t that a self referential struct? how does music_control_widget store a reference to music_control_service?” Well, music_control_widget internally only has fields for the music_control_service’s state handles which are Rc/Arcs. So it only needs a reference to the service for it’s Widget::new function lifetime, all is well. Although it doesn’t look horrible, it was HELL to do anything. For example, refactoring the gilrs service out of hotkey and adding the gamepad overlay probably involved just as much fiddling around with Rcs in RlbuddyApp as adding the actual feature. So, I decided to move to a new architecture: services + features! And, after thinking about it for around 8 hours (i slept), I decided on something a bit different. Services + panels! Yeah, basically the same as services + widgets, but I was gonna implement it GOOD this time, and make design decisions that wouldn’t bite me in the ass later on. I wrote my first traits - Service, which requires update and optionally save , and Panel , which requires name() -> &'static str and ui (same as egui::Widget: :ui). Then, I’d change how components are registered: instead of keeping every service and widget as a field in RlBuddyApp, I’d make a Vec<Box<dyn Service/Panel» for each, and loop through it. I spent about an hour trying to get Panels to automatically implement ui by requiring egui::Widget as a supertrait, which doesn’t work since widgets are stateful (need &self). So, I tried to require &mut Self to implement egui::Widget, but apparently something to do with type erasure doesn’t let that work with dynamic dispatch which was needed for the Vec<Box> thing. I’ve moved a few features to the new architecture, but I’m still in the process of finishing up. Additionally, it has to work side-by-side with existing crappy monster-Panel-enum architecture, which sucks to maintain. Okay, once again, I had to strip down a ton of detail (and my terrible wording but wtv) cause I hit like 5000 characters b4 realizing. See ya! May the Stardance gods increase devlog limits :)"}, {"post_id": 59926, "ts": "2026-09-01T23:19:29Z", "hours": 2.5164, "text": "rlbuddy has a gamepad overlay now so that you can show off your awesome bindings! Don’t even bother figuring out mine. It’s kinda starting to become hellish to add new widgets/services, but I’m almost done for the next ship so I doubt I’ll refactor just yet [edit: im doing a super refactor now hehe]. I made the overlay with the raw egui::Painter rather than actual controls (since it would be pretty hard to make a controller out of Buttons or something). I also prefer to avoid embedding static assets, otherwise I might have made an actual one in MS Paint or something. I also can’t seem to find a good egui version. I’ve been on 0.34 almost the whole time, which works well but doesn’t support transparency in extra viewports. But, 0.35/0.36 broke external viewports. So, until then, we get an opaque gamepad overlay :( but the main app is still transparent, so it’s not horrible. Rolled an 8 and a 9 on the Stardance rng today! I’m so proud of myself."}, {"post_id": 59228, "ts": "2026-08-31T21:59:04Z", "hours": 0.4561, "text": "I moved the mmr server to alpine linux! Before, it was regular raspberry pi os lite on the Pi. But, it was behaving strangely, randomly rebooting and things, so I decided to try installing Alpine. The lightweight distro has been on my radar for a while now, but this was my first time ever actually trying it. I imaged it normally with the raspberry pi imager, and put it on the pi, did setup-alpine, and all was well. But, I put in the wrong wifi password at first, which broke everything else. I tried changing the wifi config and doing something with wpa_supplicant (thanks google ai overview), but nothing fixed it so I ended up doing a fresh install. This time, I put in the right password and everything went great. I set up ssh, node, pm2, etc. and moved the server files onto the pi through sftp. Then, I got it running over my local network and set up authentication. So, it was time to set up the Cloudflare tunnel again. I followed this neat guide , changing values as needed (for example, my pi is aarch64, but the guide was x64, so I spent a while figuring out why the pi kept giving elf errors). It took a really long time to set up the openrc startup script because 1. cloudflare rotates the setup token relatively frequently and 2. I accidentally put 2 –token arguments. And since I was using vi, I didn’t even notice and kept trying to figure out why cloudflared crashed on startup. But I eventually found out and removed the duplicate and it worked! Then I finished setting up pm2 and put the pi in its home next to the router, and mmr.kmdw.dev is back up exposing your lobby’s skills. See you in the next one! Yes I know part of the token is in the image but it’s used already so it doesn’t matter"}, {"post_id": 56962, "ts": "2026-08-29T00:27:50Z", "hours": 9.075, "text": "rlbuddy can load custom maps now! Either you can download them and then import from a zip, or you can download them from bakkesplugins straight from the app! Importing it from a file is relatively easy. I checked the code for Lethamyr’s custom map loader to see what exactly it did, and for Lethamyr maps it: extracted the zip into a temp dir read info.json, .udk, and preview.jpg copied those into its own saved map directory I knew Rust, being a low-level language would let me not have to extract the zip fully first. Additionally, Bakkesplugins maps don’t contain info.json or preview.jpg, they only contain a udk file, so I had to make sure it would work with that. So, the import code I wrote basically: enumerates files in the zip extracts info.json (if found) into a struct copies *.upk into the target directory copies *.jpg into the target directory/preview.jpg if it exists It worked great. I made a really cool looking widget with stupid manual layouting behind it for map selection. First, it would add the preview image (or a black background if none). Then, it would get the screen rect of the image, and draw a semitransparent black background onto it (for contrast). Finally, it drew the actual contents in that screen rect. So, I got pretty-looking tiles with preview image backgrounds! I also added a progress bar for import status. I benchmarked each main part of the import process and found that decompressing/extracting the upk file took around 2 seconds, for which the ui thread would be totally frozen (big nono)! So, I moved the work onto another thread, and also made it decompress/load in 100 total chunks, updating a progress bar each time. I then moved on to the map downloader. Bakkesplugins doesn’t have an API, so it relies on scraping the website. I didn’t actually use any external crates for gathering information, though. I wrote a parser which takes a list of rules, each with a start and end search string, and looks for each of them in sequence till it fails to find a rule. I tried to make it completely zero-copy, but something it needed was to turn an [Option; N] into a Option<[T; N]> if every element was Some , but the only way I could figure out how to do that was with an iterator. It’s still really fast though. So, it parses search results, including map titles and urls straight out of the html string without needing an HTML parser or regex library. Once it was able to load results from the search page, I went to sleep and came back today. Now I had to get it to actually download the ZIP files and preview images, and import them straight into the app. It first has to download/parse the plugin info page since the ZIP url isn’t available in the search results. Then, it requests the ZIP. I had some trouble with this, since I wanted to show a progress bar for the download status. I first tried a function from this gist , but it didn’t work. So, I made my own which used the same chunking strategy as the import status loader. Turns out, ureq blocks requests once they hit 10MB by default, which was probably why the gist version didn’t work. But, mine was faster anyways, so I kept it. It’s even cooler since I made it myself. Then, I wired up a couple more commands to let it import straight from archive bytes instead of from a file path, and it finally loaded! Once that worked, I made it pass along the map title, author, and description as well. Then, I extended it to parse out the thumbnail image url and download that, then pass that along to the importer as well. Anyways, that was super fun. I would add a lot more detail, but Stardance limits devlogs to 4000 characters and I’m approaching scarily close to that. I’m planning on just polishing the downloader interface a bit more, and then I’ll do some bugfixes for the next release. See ya!"}, {"post_id": 55430, "ts": "2026-08-27T08:04:57Z", "hours": 3.0236, "text": "rlbuddy now can show people’s avatars cross-platform! It uses a web api I put on Cloudflare Workers which uses platform-specific requests to get avatar urls (see the previous devlog), which the app just fetches and renders. The http part was pretty easy, since I already have wrappers for cached HTTP apis, so I just had to define types for that and hook it up. But, once it was time to display, I ran into a weird problem where egui said there was no image loader installed for jpegs! Even using all_loaders + default didn’t work. Turns out, I have to actually include image as a separate crate and enable all the filetype features I want in there. Once I got it to load, it was time to mess with styling again. egui is really annoying with images, so I spent a while trying to get them to size right first. The default avatar used while they’re loading or for Epic/Switch players is from Fandom, like the rank icons. However, even though the icon is 90x90 pixels, the webp is 128x128 pixels, it just has a bunch of transparent padding. So, I initially messed with egui to do some weird ui allocation and calculation to get it to render right. But, turns out I didn’t have to do all of that. All I had to do was allocate a 28x28 space (the target size), scale that up by the 128/90 ratio, then paint the image onto the new size. Worked great. Then, I got to fight with grid layouts again. For some reason, wrapping the avatar and player details in a horizontal totally exploded all the layouting. So, I ended up making avatar and details separate columns. But, since the “player” header text is a bit larger than the icon width, there was too much padding between the avatar and the player details. So, I did more messing around with egui manual layouting, and ended up allocating a 24x(body text height + 2) space for the header, which would give it the default spacing. Then, I’d copy the Rect, shift the left bound over by 12 pixels, then paint the header onto there. That way, the header is left aligned with the avatar and the avatar + details look like they’re in the same column, even though it’s actually a bunch of stupid manual layout magic behind the scenes."}, {"post_id": 55160, "ts": "2026-08-26T17:10:01Z", "hours": 2.6972, "text": "Made an avatars api for Steam, PSN, and Xbox (Epic doesn’t support profile pictures and I have no clue what goes on in Nintendo-land, even Tracker doesn’t show theirs). It’s on Cloudflare Workers instead of my pi since it’s basically just api integration. I totally overcomplicated finding out how to get Steam profile pictures. Like, it’s insane how easy it actually is. A few weeks ago, I got an old version of Steam Rocket League and decompiled it, trying to look for where it fetched avatars from. After some experimentation and debugging, I learned that when Psyonix builds Rocket League, they give it something that implements OnlineSubsystem for whatever the target platform is. So, Steam gets the Steamworks OnlineSubsystem, Epic gets the EOSOnlineSubsystem, and so forth. And the game doesn’t need to know implementation details, just that it implements OnlineSubsystem, I think the term for that is dynamic dispatch in programming languages. Anyways, once I learned that Rocket League doesn’t do any avatar handling itself, I looked at the Steamworks SDK. Basically, it routes the avatar request through the open Steam client. So after some experimentation, I got it to fetch profile pictures with C++ and the Spacewars test game. But, that obviously wouldn’t work on a server, since the Steam client can’t really run on a Worker. So, I tried to use the Steam Web API. I got an API key, but when I tried, it said I was forbidden. According to the documentation, the GetPlayerSummaries endpoint was at partner.steam-api.com, which was only for publishers. About a week later, so yesterday, I had the genius idea to use api.steampowered.com (the public API domain) instead of partner.steam-api.com. Just swapping them out. And it worked. So, I now had a way to get Steam avatar urls. Xbox and PSN were actually really easy. Xbox has an undocumented API at https://peoplehub-public.xboxlive.com/people/gt(GAMERTAG) which returns json containing the avatar uri, and I used the psn-api package with a new PlayStation account to get PSN profile pictures. Then, I just put all of them in a Worker. So, rlbuddy will be able to show avatars soon enough!"}, {"post_id": 54013, "ts": "2026-08-24T19:11:04Z", "hours": 4.6756, "text": "Recently I was going through game archives and came across the BepInEx tool, which is basically a code injection framework for Unity games. I was really curious as to how it actually launched when the game launched, and found that they use a tool called Unity Doorstop, which adds winhttp.dll to the game’s binary directory. So, when the game tries to use things from winhttp, it goes to the new winhttp.dll instead of the system32 winhttp.dll. From there, the custom dll just forwards all the function calls. However, the custom dll is modified so that on its first interaction, it launches whatever Doorstop is configured to launch, and the mods can be loaded. That’s at least as far as I understood, but it made sense, and I thought, “what if I could launch rlbuddy automatically like this?” So, first, I tried to test it with a custom executable and library. I created a basic executable and DLL in C, and got the executable to load and run some code from the DLL. Then, I created another DLL, and got it to “impersonate” the original DLL. So, I’d rename the first dll to something like “mylibrary_original.dll”, rename the faker dll to “mylibrary.dll”, and the original executable would call the original, but it goes through the faker instead. And it worked! I had successfully created an actual doorstop-like faker. Now it was time to actually try this on Rocket League. So, I did a dumpbin /import on RocketLeague.exe, and found a few good targets - IPHLPAPI.dll, a system dll for networking stuff, and xinput1_3.dll, one shipped with the game for talking to controllers. RocketLeague.exe only imported two functions from each of them, meaning my fake interface wouldn’t have to be too big. So, first I tried to spoof IPHLPAPI.dll. The code was pretty simple, just a couple of global objects to hold the function. So, when the game loaded the DLL, it loaded the fake DLL. Then, when it tried to call some function in the DLL, such as GetAdaptersAddresses, the fake DLL would be the actual receiver, it would log something to a file, and then it would call the REAL GetAdaptersAddresses by dynamically loading the system IPHLPAPI.dll and return it. And… it worked! I opened Rocket League and the log file was created and had the log “GetAdaptersAddresses called!” Then, I launched it with anticheat enabled, and EAC immediately shut it down. I guess that was to be expected, but it was pretty annoying. So, I decided to try one more time, this time with xinput1_3.dll. This was more interesting because it was lazy loaded, and functions were imported by ordinals (2 = XInputGetState, 3 = XInputSetState), so I thought something might be different. So, I modified the original faker to be xinput1_3, replacing the function names and definitions. Since Rocket League imported them by ordinal instead of just the function name, I had to create a .def file as well, and define the ordinals there. Then, I did the same surgery on the binary folder, and after a few small mistake fixes, it worked! But, I still hadn’t tried with EAC enabled. So I launched it with anticheat, and it gave me a different error this time - that it couldn’t determine xinput1_3.dll’s file version. That was a different error! I opened the original xinput1_3.dll’s file properties, and it had copyright, file version, product version, and a couple other random things that were missing in my faker DLL. So I made a .rc file and compiled it together with the faker DLL. Then, most of the properties matched up. So, I tried it, and it seemingly worked! And then EAC said that it couldn’t verify the file again. In the end, I didn’t manage to get it working. I should’ve expected EAC to block me from the beginning, but it was pretty fun, and if I ever want to do something similar with a game without anti-cheat, I can do that now! rlbuddy is pretty closed to being released though, I just want to polish a few things and make sure the docs are fleshed out."}, {"post_id": 51407, "ts": "2026-08-21T02:54:11Z", "hours": 1.5947, "text": "rlbuddy doesn’t use the default eframe persistence feature for savedata anymore, which is pretty cool. There were a few reasons for this: It was kind of unnecessary, since eframe uses ron and it was storing a bunch of extra widget data which didn’t really fit with the app model anyway It took up extra dependencies (removing the feature shaved off like 10) There’s a bug where if the app crashed, it would erase all savedata, which, as you can imagine, was quite annoying especially since I actually use the app along with developing it, meaning if the app crashed in development it would delete all my actual match data. It’s easier to externally modify, so if in development I want to mess with some values it’s a lot easier. Anyways, actually getting the data directory was pretty interesting. I’ve basically decided to only support Windows, since the music player relies on Windows APIs anyways and I don’t think the Stats API even works on Linux. Initially, I checked out the source code for the dirs and directories crates, which led me to the dirs-sys crate (which actually isn’t even on crates.io). It used unsafe raw Win32 SHGetKnownFolderPath with the Roaming folder guid. However, since I was already using the windows-rs crate, I tried to find the WinRT equivalent. I ended up enabling the Storage_Search feature to use the API which would let me get it. Of course, this also didn’t work, because of something to do with how Windows apps are supposed to be registered. So, I ended up just grabbing the APPDATA environment variable and using that, then joining rlbuddy\\data.json to it. It’s pretty underwhelming, but it more than gets the job done. Now, whenever the app panics, I won’t lose all of my settings anymore! Pretty nice. Anyways, that’s what mainly got accomplished. I also tried to set up a GitHub Action to build it and make a release, but I kept hitting errors so I gave up and decided to upload a release next time I get the urge to actually update the GitHub repository. There’s also a few fixes, like the window title which has actually had a typo since refactors from around a month ago, and adding a missing ! which broke toasts when in training. Overall, only an hour or so was tracked, but a heck of a lot got done. See you all next time!"}, {"post_id": 49990, "ts": "2026-08-19T00:44:44Z", "hours": 1.4564, "text": "I added a small toast notification that activates when you score in training, like bakkesmod used to add it to text chat. It also activates when you hit the crossbar so you can feel even more remorseful that your beautiful musty didn’t go in :) I actually got the program to segfault while making it. egui’s external viewport api is kinda funky… there are two modes, immediate and deferred, and immediate is supposed to be easier to use. However, when I tried to use immediate mode, it panicked saying that the egui backend was implemented incorrectly. So I switched to deferred, and it gave me the segfault. There were 3 things I had to do: I stored all active toasts in a Vec, and render them in the external viewport every frame. When one should disappear, it uses Vec::retain to remove old ones. However, this doesn’t do any cleanup, meaning the viewport would go bonkers and crash the application. So, I had to close the viewport first. Calling ui.ctx() from the viewport made a segfault, probably my fault but I couldn’t figure out how to resolve it so I ended up just sending Viewport::Close from the main loop. Even if I sent Viewport::Close from the main loop, it still gave the weird error. So, I resolved it by adding a small delay from after it should close, which is when it sends the Viewport::Close command, and when it’s actually removed from the Vec of toasts. Well, I did all that, and it was working, but there was a really weird bug where it would lag the whole system while opening/closing. So, I switched from immediate to deferred viewport mode, and it stopped happening! I hit my first powerful airdribble musty with it on, it was around 105kph, and a total fluke. I wish I had gotten it on recording."}, {"post_id": 49200, "ts": "2026-08-17T21:06:45Z", "hours": 9.2278, "text": "I replaced the Spotify integration with a generic one that uses the Windows GSMTC api, meaning it’s way snappier, since it’s not making network requests every time it wants new data! The only reason it needs data is to fetch playback info, and it’s easy to do that since the windows crate gives a bunch of event listeners, meaning I also don’t need to poll anymore. Unfortunately, the integration from browsers etc. is kind of buggy so thumbnail loading is relatively inconsistent, but by adding some caching and timeouts it works flawlessly :) I also redid the UI since the old one was frankly quite ugly. Since the playback listener doesn’t update that frequently for progressbar changes, I also made it fake progress when music is playing and the ui updates, that way even if the latest data is stale, it still looks like the progress bar is moving. I’m now working on better session stats, I’ll probably end up replacing the all-time stat tracker with more in-depth session-only ones"}, {"post_id": 46652, "ts": "2026-08-14T02:03:01Z", "hours": 4.1664, "text": "rlbuddy finally has an MMR graph! I’m planning on adding more stat displays soon, like W/L, goals for/against, saves, etc. but this is a really big milestone since it’s a feature that a lot of players actually use (I basically only play casual so it’s not really for me 😅). Anyways, this also required me to rearchitect how matches are stored, and now there are two representations: a session match, which contains lots of information about it like detailed player skill information, and a stripped match, which is minimal and stores very little because it actually gets saved to disk! So, match history also gets saved now! This also opens up the doorway to a Deja-Vu-like thing which tells you if you’ve played with someone before and when! It uses the egui_plot library to show the graph. Funnily enough, basically every default option for a displayed plot was the opposite for this, and so the plot builder ended up using almost every method. Also, once again, hackatime is wrong because Zed likes to uninstall extensions randomly :("}, {"post_id": 42417, "ts": "2026-08-07T03:32:05Z", "hours": 2.1161, "text": "The Stats API finally provides the actual playlist id, so rlbuddy isn’t limited to guessing between 1v1/2v2/3v3/4v4 anymore! This brings in some cool extra features like displaying the rank each player is in for the given playlist as well as even better Discord presence! I looked through BakkesMod as well as some psynet endpoints to grab the list of playlist ids to associate with each actual playlist. There isn’t really an image to go with this, so here’s the monster enum of playlists :)"}, {"post_id": 40468, "ts": "2026-08-04T00:47:59Z", "hours": 2.2011, "text": "I rewrote the API admin page with Svelte! Before, it was a quick-and-dirty raw html/css/js solution, but now it should be a lot less annoying to work on. I improved authorization a lot, now instead of adding the pw query parameter for every request you put in a password once and it actually uses the Authorization header. Unfortunately, the browser EventSource doesn’t support headers except for in cookies, meaning I had to use the custom eventsource library for bootstrapping since the bootstrap API uses SSE. There’s basically a whole Vite project in src/webadmin, with its own tsconfig.json and everything. Because of the way it’s set up, development needs Vite running in build watch mode which builds to where the main app serves it out of. It makes deployment a lot easier, though. I didn’t really add any actual features to it, except for a log filter. However, it should be way easier to add more features in the future, like a api tester!"}, {"post_id": 38450, "ts": "2026-07-31T20:22:49Z", "hours": 6.755, "text": "rlbuddy has player lookup now, so you can check for smurfs without needing to boot up a heavy browser while playing. Unfortunately, this has to get its information from TRN because it’s the only source of this information, the rocket league apis don’t provide it. There’s some cool refactors behind the scenes, though. I generalized almost all HTTP requests into its own struct, so it removed like 200 lines of boilerplate code into a single generic module. It automatically handles caching, using new threads, ignoring if there’s already an inflight request, loading states, and automatic serde_json deserialization. The Epic id, uncensorer, ranks, and new TRN apis all use it now! Also, the button to open in TRN from the player list opens the player info dialog instead (though if you need to, you can open in TRN from there)."}, {"post_id": 34762, "ts": "2026-07-25T19:02:58Z", "hours": 1.9536, "text": "Note: I’ve actually had way more hours than it says, but I reinstalled windows and forgot to set up hackatime again so all that’s gone :( mmr-api-v2 finally has an admin page, so I don’t have to ssh into my pi just to check some debug information anymore! It is kind of developer-oriented but I think it looks and works well enough for what it is for. In the actual rlbuddy app, there are some cool new features! Facilitated by lots of refactors, of course (turns out, the matches service was bigger than the actual rocket league service, so I finally separated them). Spotify integration now has a previous button as well as a skip-to-song-in-current-playlist button. Match history was a feature that I’ve kind of ignored, so I gave it a much needed touch-up so its easier to view and browse. A pretty cool thing is that that’s been added a rocket-league-playerid-to-epic-games-id translation endpoint. This means that you can see Switch players’ TRN profiles through their linked Epic account, since TRN doesn’t let you check based on Switch name alone. Finally, there are some small quality of life improvements, like less deadlocks, better anthem pausing, and the open panel list persisting."}, {"post_id": 30390, "ts": "2026-07-17T21:27:26Z", "hours": 3.8292, "text": "Turns out, for spotify integration, I can’t actually let other people use my spotify development mode app. It’s limited to 5 users which I have to invite by email. And to get a quota extension, I need 250,000 existing monthy active users, which I’m slightly short of (by about 249,999). So, I changed the login flow so that each user has to make their own Spotify app, and log in using the client ID from there. I didn’t change the current PKCE flow since that didn’t really need to be changed, but setup unfortunately takes a little more work now. Also, it has transparency now."}, {"post_id": 28659, "ts": "2026-07-15T01:29:51Z", "hours": 13.4597, "text": "It’s been a week since the last devlog, and lots has changed! 1. new architecture! The code was getting pretty messy since I had kept adding new features without really doing major refactors. So, I finally took it upon myself to actually organize everything and come up with a proper architecture. Each feature has its own module, containing services and widgets. Services have all the state, for example the Spotify service stores the current song and settings and the Rocket League module exposes a Matches service for the current match and past matches, which the match and past match widgets actually show. Services all have update functions which get called every 10ms. There are two ways for services to talk to the rest of the app: events and state. State is straightforward, it’s usually just an Rc with a custom generic struct I made to manage whether the widget can read/write to it. Events are enums which the update method returns, and can get passed to other update methods. For example, the Stats API service doesn’t have its own widget, it only connects to the stats api and returns match events which other features can use, like Spotify using replay start/end events to play/pause music. 2. new ui! The dashboard part isn’t as ugly as it was before, and has actual cards for every panel instead of just having horizontal lines in between. Even though it sounds pretty small, it’s actually huge for the prettiness of the app! Along with this, the behaviour of managing panels also changed. There’s an actual close button, and instead of having one button per panel at the bottom, there’s a small picker to open/close them. Also, you can also move them up and down now 3. Automatic stats api setup This is a pretty small feature. It lets you select the path to the rocket league executable, detects whether it’s already enabled, and turns it on if it’s disabled. It does this by just replacing a line in the stats api configuration. 4. mmr api v2 doesnt explode There were a few bugs which would make the API disconnect randomly, but they’ve been ironed out. This also made it so the app doesn’t have to deal with failure behaviour and can just keep asking until the API responds."}, {"post_id": 23975, "ts": "2026-07-07T06:51:05Z", "hours": 8.1119, "text": "rlbuddy now has a little bit of Spotify support! Although it looks like a just few elements and a button, theres a lot going on behind the scenes. I’m not embedding an entire webview to run the web playback SDK this time, so it just uses the Web API to keep resource usage nice and low. Since it’s a native app, it has to jump through some hurdles to authorize, using the PKCE extension version since the client secret can’t be stored securely. It uses the webbrowser crate to open the Spotify auth page, and starts a tiny little oneshot HTTP server on a raw TCPListener. The redirect is set to the HTTP server, and then as soon as it receives the request, it sends a simple HTML page and continues. From there, it receives the authorization code and can continue as normal :) Other than that, it’s just normal REST api interaction. I did learn a ton about thread safety (I hit so many deadlocks), because unlike the stats api, for example, which just sits in a different thread and hurls events over a channel, it actually has to work with the user. It’s also able to pause during goal replays, and that was pretty annoying to structure. Eventually, I decided to just use a channel where the stats api could send replay start/end events through the match widget. Looking back on it, the solution was extremely simple 😅 I am planning to add a bit more, like shuffle/repeat controls as well as a previous track button, but this feature turned out pretty nicely!"}, {"post_id": 22551, "ts": "2026-07-05T02:19:55Z", "hours": 3.7678, "text": "rlbuddy can now show Rich Presence in Discord, so now all your friends can see you destroying your opponents ;)"}, {"post_id": 21165, "ts": "2026-07-02T23:37:22Z", "hours": 12.7792, "text": "rlbuddy has had major ui overhauls to shift it more towards an actual overlay rather than just an app that displays ranks. there are new features like a settings menu as well as major architectural overhauls, with more coming soon!"}, {"post_id": 16053, "ts": "2026-06-26T02:45:17Z", "hours": 2.3483, "text": "Got it working as an actual overlay!! Right now it just displays ranks, though"}, {"post_id": 15855, "ts": "2026-06-25T19:39:34Z", "hours": 30.4556, "text": "I got a stable MMR/ranks api working!! https://github.com/Kalilamodow/mmr-api-v2 Basically, it’s an http server that opens a websocket to the actual rocket league game api in the background and spoofs a real client connection. The socket only stays active for 5 seconds at a time though so I don’t kill psyonix’s servers. That way, rlbuddy can get ranks without getting blocked by tracker network! I originally tried to do it on Cloudflare, but the workers outbound websocket didn’t work since you can’t send custom headers with them. I ended up having to use my old raspberry pi and set up a homeserver behind Cloudflare tunnels, and I’m actually planning on moving the rest of my stuff that used to be on a VPS onto the pi."}]...
|
Title: rlbuddy by @kmdw | Stardance
Devlogs:
I go Title: rlbuddy by @kmdw | Stardance
Devlogs:
I got a stable MMR/ranks api working!! https://github.com/Kalilamodow/mmr-api-v2 Basically, it’s an http server that opens a websocket to the actual rocket league game api in the background and spoofs a real client connection. The socket only stays active for 5 seconds at a time though so I don’t kill psyonix’s servers. That way, rlbuddy can get ranks without getting blocked by tracker network! I originally tried to do it on Cloudflare, but the workers outbound websocket didn’t work since you can’t send custom headers with them. I ended up having to use my old raspberry pi and set up a homeserver behind Cloudflare tunnels, and I’m actually planning on moving the rest of my stuff that used to be on a VPS onto the pi.
Got it working as an actual overlay!! Right now it just displays ranks, though
rlbuddy has had major ui overhauls to shift it more towards an actual overlay rather than just an app that displays ranks. there are new features like a settings menu as well as major architectural overhauls, with more coming soon!
rlbuddy can now show Rich Presence in Discord, so now all your friends can see you destroying your opponents ;)
rlbuddy now has a little bit of Spotify support! Although it looks like a just few elements and a button, theres a lot going on behind the scenes. I’m not embedding an entire webview to run the web playback SDK this time, so it just uses the Web API to keep resource usage nice and low. Since it’s a native app, it has to jump through some hurdles to authorize, using the PKCE extension version since the client secret can’t be stored securely. It uses the webbrowser crate to open the Spotify auth page, and starts a tiny little oneshot HTTP server on a raw TCPListener. The redirect is set to the HTTP server, and then as soon as it receives the request, it sends a simple HTML page and continues. From there, it receives the authorization code and can continue as normal :) Other than that, it’s just normal REST api interaction. I did learn a ton about thread safety (I hit so many deadlocks), because unlike the stats api, for example, which just sits in a different thread and hurls events over a channel, it actually has to work with the user. It’s also able to pause during goal replays, and that was pretty annoying to structure. Eventually, I decided to just use a channel where the stats api could send replay start/end events through the match widget. Looking back on it, the solution was extremely simple 😅 I am planning to add a bit more, like shuffle/repeat controls as well as a previous track button, but this feature turned out pretty nicely!
It’s been a week since the last devlog, and lots has changed! 1. new architecture! The code was getting pretty messy since I had kept adding new features without really doing major refactors. So, I finally took it upon myself to actually organize everything and come up with a proper architecture. Each feature has its own module, containing services and widgets. Services have all the state, for example the Spotify service stores the current song and settings and the Rocket League module exposes a Matches service for the current match and past matches, which the match and past match widgets actually show. Services all have update functions which get called every 10ms. There are two ways for services to talk to the rest of the app: events and state. State is straightforward, it’s usually just an Rc with a custom generic struct I made to manage whether the widget can read/write to it. Events are enums which the update method returns, and can get passed to other update methods. For example, the Stats API service doesn’t have its own widget, it only connects to the stats api and returns match events which other features can use, like Spotify using replay start/end events to play/pause music. 2. new ui! The dashboard part isn’t as ugly as it was before, and has actual cards for every panel instead of just having horizontal lines in between. Even though it sounds pretty small, it’s actually huge for the prettiness of the app! Along with this, the behaviour of managing panels also changed. There’s an actual close button, and instead of having one button per panel at the bottom, there’s a small picker to open/close them. Also, you can also move them up and down now 3. Automatic stats api setup This is a pretty small feature. It lets you select the path to the rocket league executable, detects whether it’s already enabled, and turns it on if it’s disabled. It does this by just replacing a line in the stats api configuration. 4. mmr api v2 doesnt explode There were a few bugs which would make the API disconnect randomly, but they’ve been ironed out. This also made it so the app doesn’t have to deal with failure behaviour and can just keep asking until the API responds.
Turns out, for spotify integration, I can’t actually let other people use my spotify development mode app. It’s limited to 5 users which I have to invite by email. And to get a quota extension, I need 250,000 existing monthy active users, which I’m slightly short of (by about 249,999). So, I changed the login flow so that each user has to make their own Spotify app, and log in using the client ID from there. I didn’t change the current PKCE flow since that didn’t really need to be changed, but setup unfortunately takes a little more work now. Also, it has transparency now.
Note: I’ve actually had way more hours than it says, but I reinstalled windows and forgot to set up hackatime again so all that’s gone :( mmr-api-v2 finally has an admin page, so I don’t have to ssh into my pi just to check some debug information anymore! It is kind of developer-oriented but I think it looks and works well enough for what it is for. In the actual rlbuddy app, there are some cool new features! Facilitated by lots of refactors, of course (turns out, the matches service was bigger than the actual rocket league service, so I finally separated them). Spotify integration now has a previous button as well as a skip-to-song-in-current-playlist button. Match history was a feature that I’ve kind of ignored, so I gave it a much needed touch-up so its easier to view and browse. A pretty cool thing is that that’s been added a rocket-league-playerid-to-epic-games-id translation endpoint. This means that you can see Switch players’ TRN profiles through their linked Epic account, since TRN doesn’t let you check based on Switch name alone. Finally, there are some small quality of life improvements, like less deadlocks, better anthem pausing, and the open panel list persisting.
rlbuddy has player lookup now, so you can check for smurfs without needing to boot up a heavy browser while playing. Unfortunately, this has to get its information from TRN because it’s the only source of this information, the rocket league apis don’t provide it. There’s some cool refactors behind the scenes, though. I generalized almost all HTTP requests into its own struct, so it removed like 200 lines of boilerplate code into a single generic module. It automatically handles caching, using new threads, ignoring if there’s already an inflight request, loading states, and automatic serde_json deserialization. The Epic id, uncensorer, ranks, and new TRN apis all use it now! Also, the button to open in TRN from the player list opens the player info dialog instead (though if you need to, you can open in TRN from there).
I rewrote the API admin page with Svelte! Before, it was a quick-and-dirty raw html/css/js solution, but now it should be a lot less annoying to work on. I improved authorization a lot, now instead of adding the pw query parameter for every request you put in a password once and it actually uses the Authorization header. Unfortunately, the browser EventSource doesn’t support headers except for in cookies, meaning I had to use the custom eventsource library for bootstrapping since the bootstrap API uses SSE. There’s basically a whole Vite project in src/webadmin, with its own tsconfig.json and everything. Because of the way it’s set up, development needs Vite running in build watch mode which builds to where the main app serves it out of. It makes deployment a lot easier, though. I didn’t really add any actual features to it, except for a log filter. However, it should be way easier to add more features in the future, like a api tester!
The Stats API finally provides the actual playlist id, so rlbuddy isn’t limited to guessing between 1v1/2v2/3v3/4v4 anymore! This brings in some cool extra features like displaying the rank each player is in for the given playlist as well as even better Discord presence! I looked through BakkesMod as well as some psynet endpoints to grab the list of playlist ids to associate with each actual playlist. There isn’t really an image to go with this, so here’s the monster enum of playlists :)
rlbuddy finally has an MMR graph! I’m planning on adding more stat displays soon, like W/L, goals for/against, saves, etc. but this is a really big milestone since it’s a feature that a lot of players actually use (I basically only play casual so it’s not really for me 😅). Anyways, this also required me to rearchitect how matches are stored, and now there are two representations: a session match, which contains lots of information about it like detailed player skill information, and a stripped match, which is minimal and stores very little because it actually gets saved to disk! So, match history also gets saved now! This also opens up the doorway to a Deja-Vu-like thing which tells you if you’ve played with someone before and when! It uses the egui_plot library to show the graph. Funnily enough, basically every default option for a displayed plot was the opposite for this, and so the plot builder ended up using almost every method. Also, once again, hackatime is wrong because Zed likes to uninstall extensions randomly :(
I replaced the Spotify integration with a generic one that uses the Windows GSMTC api, meaning it’s way snappier, since it’s not making network requests every time it wants new data! The only reason it needs data is to fetch playback info, and it’s easy to do that since the windows crate gives a bunch of event listeners, meaning I also don’t need to poll anymore. Unfortunately, the integration from browsers etc. is kind of buggy so thumbnail loading is relatively inconsistent, but by adding some caching and timeouts it works flawlessly :) I also redid the UI since the old one was frankly quite ugly. Since the playback listener doesn’t update that frequently for progressbar changes, I also made it fake progress when music is playing and the ui updates, that way even if the latest data is stale, it still looks like the progress bar is moving. I’m now working on better session stats, I’ll probably end up replacing the all-time stat tracker with more in-depth session-only ones
I added a small toast notification that activates when you score in training, like bakkesmod used to add it to text chat. It also activates when you hit the crossbar so you can feel even more remorseful that your beautiful musty didn’t go in :) I actually got the program to segfault while making it. egui’s external viewport api is kinda funky… there are two modes, immediate and deferred, and immediate is supposed to be easier to use. However, when I tried to use immediate mode, it panicked saying that the egui backend was implemented incorrectly. So I switched to deferred, and it gave me the segfault. There were 3 things I had to do: I stored all active toasts in a Vec, and render them in the external viewport every frame. When one should disappear, it uses Vec::retain to remove old ones. However, this doesn’t do any cleanup, meaning the viewport would go bonkers and crash the application. So, I had to close the viewport first. Calling ui.ctx() from the viewport made a segfault, probably my fault but I couldn’t figure out how to resolve it so I ended up just sending Viewport::Close from the main loop. Even if I sent Viewport::Close from the main loop, it still gave the weird error. So, I resolved it by adding a small delay from after it should close, which is when it sends the Viewport::Close command, and when it’s actually removed from the Vec of toasts. Well, I did all that, and it was working, but there was a really weird bug where it would lag the whole system while opening/closing. So, I switched from immediate to deferred viewport mode, and it stopped happening! I hit my first powerful airdribble musty with it on, it was around 105kph, and a total fluke. I wish I had gotten it on recording.
rlbuddy doesn’t use the default eframe persistence feature for savedata anymore, which is pretty cool. There were a few reasons for this: It was kind of unnecessary, since eframe uses ron and it was storing a bunch of extra widget data which didn’t really fit with the app model anyway It took up extra dependencies (removing the feature shaved off like 10) There’s a bug where if the app crashed, it would erase all savedata, which, as you can imagine, was quite annoying especially since I actually use the app along with developing it, meaning if the app crashed in development it would delete all my actual match data. It’s easier to externally modify, so if in development I want to mess with some values it’s a lot easier. Anyways, actually getting the data directory was pretty interesting. I’ve basically decided to only support Windows, since the music player relies on Windows APIs anyways and I don’t think the Stats API even works on Linux. Initially, I checked out the source code for the dirs and directories crates, which led me to the dirs-sys crate (which actually isn’t even on crates.io). It used unsafe raw Win32 SHGetKnownFolderPath with the Roaming folder guid. However, since I was already using the windows-rs crate, I tried to find the WinRT equivalent. I ended up enabling the Storage_Search feature to use the API which would let me get it. Of course, this also didn’t work, because of something to do with how Windows apps are supposed to be registered. So, I ended up just grabbing the APPDATA environment variable and using that, then joining rlbuddy\data.json to it. It’s pretty underwhelming, but it more than gets the job done. Now, whenever the app panics, I won’t lose all of my settings anymore! Pretty nice. Anyways, that’s what mainly got accomplished. I also tried to set up a GitHub Action to build it and make a release, but I kept hitting errors so I gave up and decided to upload a release next time I get the urge to actually update the GitHub repository. There’s also a few fixes, like the window title which has actually had a typo since refactors from around a month ago, and adding a missing ! which broke toasts when in training. Overall, only an hour or so was tracked, but a heck of a lot got done. See you all next time!
Recently I was going through game archives and came across the BepInEx tool, which is basically a code injection framework for Unity games. I was really curious as to how it actually launched when the game launched, and found that they use a tool called Unity Doorstop, which adds winhttp.dll to the game’s binary directory. So, when the game tries to use things from winhttp, it goes to the new winhttp.dll instead of the system32 winhttp.dll. From there, the custom dll just forwards all the function calls. However, the custom dll is modified so that on its first interaction, it launches whatever Doorstop is configured to launch, and the mods can be loaded. That’s at least as far as I understood, but it made sense, and I thought, “what if I could launch rlbuddy automatically like this?” So, first, I tried to test it with a custom executable and library. I created a basic executable and DLL in C, and got the executable to load and run some code from the DLL. Then, I created another DLL, and got it to “impersonate” the original DLL. So, I’d rename the first dll to something like “mylibrary_original.dll”, rename the faker dll to “mylibrary.dll”, and the original executable would call the original, but it goes through the faker instead. And it worked! I had successfully created an actual doorstop-like faker. Now it was time to actually try this on Rocket League. So, I did a dumpbin /import on RocketLeague.exe, and found a few good targets - IPHLPAPI.dll, a system dll for networking stuff, and xinput1_3.dll, one shipped with the game for talking to controllers. RocketLeague.exe only imported two functions from each of them, meaning my fake interface wouldn’t have to be too big. So, first I tried to spoof IPHLPAPI.dll. The code was pretty simple, just a couple of global objects to hold the function. So, when the game loaded the DLL, it loaded the fake DLL. Then, when it tried to call some function in the DLL, such as GetAdaptersAddresses, the fake DLL would be the actual receiver, it would log something to a file, and then it would call the REAL GetAdaptersAddresses by dynamically loading the system IPHLPAPI.dll and return it. And… it worked! I opened Rocket League and the log file was created and had the log “GetAdaptersAddresses called!” Then, I launched it with anticheat enabled, and EAC immediately shut it down. I guess that was to be expected, but it was pretty annoying. So, I decided to try one more time, this time with xinput1_3.dll. This was more interesting because it was lazy loaded, and functions were imported by ordinals (2 = XInputGetState, 3 = XInputSetState), so I thought something might be different. So, I modified the original faker to be xinput1_3, replacing the function names and definitions. Since Rocket League imported them by ordinal instead of just the function name, I had to create a .def file as well, and define the ordinals there. Then, I did the same surgery on the binary folder, and after a few small mistake fixes, it worked! But, I still hadn’t tried with EAC enabled. So I launched it with anticheat, and it gave me a different error this time - that it couldn’t determine xinput1_3.dll’s file version. That was a different error! I opened the original xinput1_3.dll’s file properties, and it had copyright, file version, product version, and a couple other random things that were missing in my faker DLL. So I made a .rc file and compiled it together with the faker DLL. Then, most of the properties matched up. So, I tried it, and it seemingly worked! And then EAC said that it couldn’t verify the file again. In the end, I didn’t manage to get it working. I should’ve expected EAC to block me from the beginning, but it was pretty fun, and if I ever want to do something similar with a game without anti-cheat, I can do that now! rlbuddy is pretty closed to being released though, I just want to polish a few things and make sure the docs are fleshed out.
Made an avatars api for Steam, PSN, and Xbox (Epic doesn’t support profile pictures and I have no clue what goes on in Nintendo-land, even Tracker doesn’t show theirs). It’s on Cloudflare Workers instead of my pi since it’s basically just api integration. I totally overcomplicated finding out how to get Steam profile pictures. Like, it’s insane how easy it actually is. A few weeks ago, I got an old version of Steam Rocket League and decompiled it, trying to look for where it fetched avatars from. After some experimentation and debugging, I learned that when Psyonix builds Rocket League, they give it something that implements OnlineSubsystem for whatever the target platform is. So, Steam gets the Steamworks OnlineSubsystem, Epic gets the EOSOnlineSubsystem, and so forth. And the game doesn’t need to know implementation details, just that it implements OnlineSubsystem, I think the term for that is dynamic dispatch in programming languages. Anyways, once I learned that Rocket League doesn’t do any avatar handling itself, I looked at the Steamworks SDK. Basically, it routes the avatar request through the open Steam client. So after some experimentation, I got it to fetch profile pictures with C++ and the Spacewars test game. But, that obviously wouldn’t work on a server, since the Steam client can’t really run on a Worker. So, I tried to use the Steam Web API. I got an API key, but when I tried, it said I was forbidden. According to the documentation, the GetPlayerSummaries endpoint was at partner.steam-api.com, which was only for publishers. About a week later, so yesterday, I had the genius idea to use api.steampowered.com (the public API domain) instead of partner.steam-api.com. Just swapping them out. And it worked. So, I now had a way to get Steam avatar urls. Xbox and PSN were actually really easy. Xbox has an undocumented API at https://peoplehub-public.xboxlive.com/people/gt(GAMERTAG) which returns json containing the avatar uri, and I used the psn-api package with a new PlayStation account to get PSN profile pictures. Then, I just put all of them in a Worker. So, rlbuddy will be able to show avatars soon enough!
rlbuddy now can show people’s avatars cross-platform! It uses a web api I put on Cloudflare Workers which uses platform-specific requests to get avatar urls (see the previous devlog), which the app just fetches and renders. The http part was pretty easy, since I already have wrappers for cached HTTP apis, so I just had to define types for that and hook it up. But, once it was time to display, I ran into a weird problem where egui said there was no image loader installed for jpegs! Even using all_loaders + default didn’t work. Turns out, I have to actually include image as a separate crate and enable all the filetype features I want in there. Once I got it to load, it was time to mess with styling again. egui is really annoying with images, so I spent a while trying to get them to size right first. The default avatar used while they’re loading or for Epic/Switch players is from Fandom, like the rank icons. However, even though the icon is 90x90 pixels, the webp is 128x128 pixels, it just has a bunch of transparent padding. So, I initially messed with egui to do some weird ui allocation and calculation to get it to render right. But, turns out I didn’t have to do all of that. All I had to do was allocate a 28x28 space (the target size), scale that up by the 128/90 ratio, then paint the image onto the new size. Worked great. Then, I got to fight with grid layouts again. For some reason, wrapping the avatar and player details in a horizontal totally exploded all the layouting. So, I ended up making avatar and details separate columns. But, since the “player” header text is a bit larger than the icon width, there was too much padding between the avatar and the player details. So, I did more messing around with egui manual layouting, and ended up allocating a 24x(body text height + 2) space for the header, which would give it the default spacing. Then, I’d copy the Rect, shift the left bound over by 12 pixels, then paint the header onto there. That way, the header is left aligned with the avatar and the avatar + details look like they’re in the same column, even though it’s actually a bunch of stupid manual layout magic behind the scenes.
rlbuddy can load custom maps now! Either you can download them and then import from a zip, or you can download them from bakkesplugins straight from the app! Importing it from a file is relatively easy. I checked the code for Lethamyr’s custom map loader to see what exactly it did, and for Lethamyr maps it: extracted the zip into a temp dir read info.json, .udk, and preview.jpg copied those into its own saved map directory I knew Rust, being a low-level language would let me not have to extract the zip fully first. Additionally, Bakkesplugins maps don’t contain info.json or preview.jpg, they only contain a udk file, so I had to make sure it would work with that. So, the import code I wrote basically: enumerates files in the zip extracts info.json (if found) into a struct copies *.upk into the target directory copies *.jpg into the target directory/preview.jpg if it exists It worked great. I made a really cool looking widget with stupid manual layouting behind it for map selection. First, it would add the preview image (or a black background if none). Then, it would get the screen rect of the image, and draw a semitransparent black background onto it (for contrast). Finally, it drew the actual contents in that screen rect. So, I got pretty-looking tiles with preview image backgrounds! I also added a progress bar for import status. I benchmarked each main part of the import process and found that decompressing/extracting the upk file took around 2 seconds, for which the ui thread would be totally frozen (big nono)! So, I moved the work onto another thread, and also made it decompress/load in 100 total chunks, updating a progress bar each time. I then moved on to the map downloader. Bakkesplugins doesn’t have an API, so it relies on scraping the website. I didn’t actually use any external crates for gathering information, though. I wrote a parser which takes a list of rules, each with a start and end search string, and looks for each of them in sequence till it fails to find a rule. I tried to make it completely zero-copy, but something it needed was to turn an [Option; N] into a Option<[T; N]> if every element was Some , but the only way I could figure out how to do that was with an iterator. It’s still really fast though. So, it parses search results, including map titles and urls straight out of the html string without needing an HTML parser or regex library. Once it was able to load results from the search page, I went to sleep and came back today. Now I had to get it to actually download the ZIP files and preview images, and import them straight into the app. It first has to download/parse the plugin info page since the ZIP url isn’t available in the search results. Then, it requests the ZIP. I had some trouble with this, since I wanted to show a progress bar for the download status. I first tried a function from this gist , but it didn’t work. So, I made my own which used the same chunking strategy as the import status loader. Turns out, ureq blocks requests once they hit 10MB by default, which was probably why the gist version didn’t work. But, mine was faster anyways, so I kept it. It’s even cooler since I made it myself. Then, I wired up a couple more commands to let it import straight from archive bytes instead of from a file path, and it finally loaded! Once that worked, I made it pass along the map title, author, and description as well. Then, I extended it to parse out the thumbnail image url and download that, then pass that along to the importer as well. Anyways, that was super fun. I would add a lot more detail, but Stardance limits devlogs to 4000 characters and I’m approaching scarily close to that. I’m planning on just polishing the downloader interface a bit more, and then I’ll do some bugfixes for the next release. See ya!
I moved the mmr server to alpine linux! Before, it was regular raspberry pi os lite on the Pi. But, it was behaving strangely, randomly rebooting and things, so I decided to try installing Alpine. The lightweight distro has been on my radar for a while now, but this was my first time ever actually trying it. I imaged it normally with the raspberry pi imager, and put it on the pi, did setup-alpine, and all was well. But, I put in the wrong wifi password at first, which broke everything else. I tried changing the wifi config and doing something with wpa_supplicant (thanks google ai overview), but nothing fixed it so I ended up doing a fresh install. This time, I put in the right password and everything went great. I set up ssh, node, pm2, etc. and moved the server files onto the pi through sftp. Then, I got it running over my local network and set up authentication. So, it was time to set up the Cloudflare tunnel again. I followed this neat guide , changing values as needed (for example, my pi is aarch64, but the guide was x64, so I spent a while figuring out why the pi kept giving elf errors). It took a really long time to set up the openrc startup script because 1. cloudflare rotates the setup token relatively frequently and 2. I accidentally put 2 –token arguments. And since I was using vi, I didn’t even notice and kept trying to figure out why cloudflared crashed on startup. But I eventually found out and removed the duplicate and it worked! Then I finished setting up pm2 and put the pi in its home next to the router, and mmr.kmdw.dev is back up exposing your lobby’s skills. See you in the next one! Yes I know part of the token is in the image but it’s used already so it doesn’t matter
rlbuddy has a gamepad overlay now so that you can show off your awesome bindings! Don’t even bother figuring out mine. It’s kinda starting to become hellish to add new widgets/services, but I’m almost done for the next ship so I doubt I’ll refactor just yet [edit: im doing a super refactor now hehe]. I made the overlay with the raw egui::Painter rather than actual controls (since it would be pretty hard to make a controller out of Buttons or something). I also prefer to avoid embedding static assets, otherwise I might have made an actual one in MS Paint or something. I also can’t seem to find a good egui version. I’ve been on 0.34 almost the whole time, which works well but doesn’t support transparency in extra viewports. But, 0.35/0.36 broke external viewports. So, until then, we get an opaque gamepad overlay :( but the main app is still transparent, so it’s not horrible. Rolled an 8 and a 9 on the Stardance rng today! I’m so proud of myself.
I’m MASSIVELY refactoring rlbuddy! This, I think is the second (and hopefully the final) major refactor to the codebase. So, basically the current architecture is split into services and widgets. Each service has an update method, which does its stuff (draining subscribers, processing commands, etc). Since egui is immediate mode, this architecture works unlike callbacks/event-based which I actually tried to implement but couldn’t. Every widget is just implements egui::Widget, that holds some state handles (Rc) and command senders (Sender), usually just one for its respective service. Services are alive for the lifetime of the app, while widgets are the openable panels you see. Widgets display the data from service state, and talk back to it by mutating shared state or sending commands. I think music control has been the best for me to wrap my head around to decide about changes, so I’ll explain it with that. Music control had a controller, a service, and a widget file. The controller was a thread pool manager (if you can call the questionable implementation that) around Windows’ GSMTC API to give a single-thread api for it (since the app is basically single-threaded). Then, the service is always alive, syncing a state struct between the controller and its own state handle. Finally, the widget is optionally there as a panel, with next/previous/pause buttons which send commands and the ui which reads service state to display. It also has a mutable service state reference for settings (the “pause during anthems” button). The god object RlbuddyApp struct stores all of this stuff. So it has a music_control_service, music_control_widget, stats_api_service, all of those fields, which kinda sucked. On top of that, I had to maintain an enum of every panel, which was enumerated for the “open panel” popup and to render each one if it’s open. you might think “hey… isn’t that a self referential struct? how does music_control_widget store a reference to music_control_service?” Well, music_control_widget internally only has fields for the music_control_service’s state handles which are Rc/Arcs. So it only needs a reference to the service for it’s Widget::new function lifetime, all is well. Although it doesn’t look horrible, it was HELL to do anything. For example, refactoring the gilrs service out of hotkey and adding the gamepad overlay probably involved just as much fiddling around with Rcs in RlbuddyApp as adding the actual feature. So, I decided to move to a new architecture: services + features! And, after thinking about it for around 8 hours (i slept), I decided on something a bit different. Services + panels! Yeah, basically the same as services + widgets, but I was gonna implement it GOOD this time, and make design decisions that wouldn’t bite me in the ass later on. I wrote my first traits - Service, which requires update and optionally save , and Panel , which requires name() -> &'static str and ui (same as egui::Widget: :ui). Then, I’d change how components are registered: instead of keeping every service and widget as a field in RlBuddyApp, I’d make a Vec<Box<dyn Service/Panel» for each, and loop through it. I spent about an hour trying to get Panels to automatically implement ui by requiring egui::Widget as a supertrait, which doesn’t work since widgets are stateful (need &self). So, I tried to require &mut Self to implement egui::Widget, but apparently something to do with type erasure doesn’t let that work with dynamic dispatch which was needed for the Vec<Box> thing. I’ve moved a few features to the new architecture, but I’m still in the process of finishing up. Additionally, it has to work side-by-side with existing crappy monster-Panel-enum architecture, which sucks to maintain. Okay, once again, I had to strip down a ton of detail (and my terrible wording but wtv) cause I hit like 5000 characters b4 realizing. See ya! May the Stardance gods increase devlog limits :)
I finished the big refactor! I pushed around 25 commits to GitHub at once. I’m really gonna enjoy adding the next feature, basking in how much easier it is ;) Apparently, I never made a service for session stats, so it currently can’t persist its one setting. Actually, writing this I realized that the setting isn’t actually used, so I can delete it. That’s great. After finally kicking out all the annoying legacy panel code, I remembered that I never re-implemented the positioning or its related persistence code for the new panel system. The persistence system was reworked too, something that I don’t think really got included in the previous devlog. Each service can implement save , and there are generic helper methods in a common module for saving/loading serde structs to a file in the app data directory. The actual app now uses this method as well instead of doing all the pathing logic itself, so the persistence module is pretty small and could honestly be moved into app.rs. For new positioning, I store a list of open panels. Weirdly enough, it’s actually a lot easier than adding a position/is_open field to every AppPanel. So, I run the name through a Hasher to make a u64 which is easier to clone/copy and stuff and made a newtype around a PanelId. That way I could reuse the code from the previous paneling system to swap/manage open PanelIds, then just use find on the AppPanel vec to find the corresponding widget. Also, I never mentioned it but I’ve been trying RustRover for the past few devlogs. It’s a lot more stable than Zed, but I sorta miss its snappiness and minimalism. If I end up finding an annoying bug in RustRover, I’ll probably switch back. However, it’s been quite a few days and I don’t think I’ve found a single one. JetBrains is truly awesome at tooling. See ya next time. Probably will do my next ship soon :)
Had to remove the tracker.gg widget :( unfortunately they don’t allow scraping and what I had wasn’t allowed anyways. Things that used to open the player info widget now just open tracker in a browser.
Time formatting doesn’t suck anymore! I made the implementation way better so I could make it support stuff even past weeks, like months and years. The new implementation added around 60 lines, but it’s for a good cause. The previous implementation used a match statement with duplicated logic that only supported seconds, minutes, and hours, using a pluralize function and inline if-statements everywhere. If it were sent to any rational code-reviewer, they would likely have a heart attack. Now it’s a bit more complex but less complicated. You have TimeUnit s which format the unit themselves and TimePart s which format a value + a unit. Then, just use some math to build a Vec and format it into a string. Boom! Beautiful, well-formed time formatting. To soak in the new beauty, I added days n weeks. I just had to add 14 lines! The previous one would have probably needed a bunch of stupid magic numbers and weird chains everywhere to accomplish the same thing. Okay, I’m done using your time on reading a way-too-long write-up about fixing a crappy implementation that shouldn’t have been there in the first place. I’m gonna ship right after posting this. If you get it, make sure to give it 10 stars in everything 😉. Haha, jk. Well, not really. Cya later.
I’ve mostly been working on smaller features, improvements, and bugfixes. A cool one I did is fixing weird glitchy movement with the gamepad overlay window! Basically, the window needs to persist its position across disabling it/enabling it. And egui is immediate mode. So, every time it rendered the viewport, it would both set and get its position. So, moving it would update the current position, but because of the weird interop between setting the position in a ViewportBuilder and getting it from the viewport info, it would glitch back and forth, especially when my laptop is lagging. I fixed it by only calling the ViewportBuilder ‘s “ with_position ” method when the overlay had just been enabled ( !was_enabled && currently_enabled ). That way, it only sets it once externally, and lets it move freely while it’s open. Then, while it’s moving, it continues to update the saved position. And upon closing and then reopening it, it sets it again (but only once!) Relatively simple fix but it’s kind of funny. I mainly noticed it when I added a feature that would auto-unmaximize the overlay when the user maximizes it, and it would go crazy and fly around the screen. Very fun! I also fixed a pretty old bug where it would incorrectly detect the local player. Basically, the stats api doesn’t actually tell you who the local player is. So, we have to guess based on who the camera is targeting right now. Usually, it’s on the local player, but during goal replays or spectating a bot when joining a casual game, it would be improperly set at the start and then stay like that. So, I made sure that it always updated as long as the match is 1. in progress 2. not in a replay. It also fixes a thing with inconsistent match toasts, since the toasts only fire if the scoring player is the local player (and if it thinks the wrong player is the local player, everything’s messed up). I’m planning on revamping hotkeys next, to allow you to bind to any controller button and even do custom quickchats in-game. Later!
More gamepad overlay buttons!!! Yay!!! In not-so-awesomely-exciting news, I also added a table of contents to the readme (as well as a generator for it). The script’s in Python (I’m sorry for not using Rust) meaning the repository is now 0.5% Python. Takeover incoming? I overcomplicated the script a lot, but it’s really easy to read. There are three whole comments, aka 6% of lines in the whole file! It’s not technically interesting in the slightest. I was thinking of building a tree-like structure before outputting the string, but realized I can just use the header level (h1 vs h2 vs h3 etc) as the amount of spaces / 2. I also refactored it not to use magic PanelId s for the default panel list. I kinda rushed that part when I made it, I’ll be honest. But now each Panel can implement fn open_by_default(&self) -> bool (returns false by default) and if it does it keeps it open when savedata doesn’t exist yet. I don’t get how an entire hour n 27 minutes was spent on like 7 not-even-that-big commits. At least it was a good use of my math class. We reviewed limits for some reason (which everyone should already know for one because they took the prereqs?), and the teacher managed to extend her lecture for the ENTIRE class time. rlbuddy development saving the day, I guess (just like it will in your rocket league games btw, so you should download it)
I’ve been debugging high memory for the past month or so. It was egui_system_fonts. Why would fonts take 170mb of ram????????????????????????????????? help!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! I hate external dependencies!!!!!!!!!!!!!!!!!!!!11 I owe my life to DHAT now. go star https://github.com/nnethercote/dhat-rs
I did lots of performance improvements and also IT WORKS ON LINUX NOW!!! Let’s talk about performance first. Anyways, it has been using around 4% and 220MB of ram, which isn’t really what you’d expect from an overlay! So, I used things like DHAT to profile the memory, and noticed that fonts were doing some shenanigans. So I removed egui_system_fonts and loaded directly from C:\Windows\Fonts\segoeui.ttf and RAM usage dropped to 30mb. That was what the previous devlog was about. I then changed the default logic update rate from 10ms (100/s) to 65ms (15/s approx). This reduced idle cpu usage to under 0.2%. But, doing anything with the UI would spike it to 4%, which is still pretty bad. So, I used a method I found in an egui issue thread where I’d count the frametime since the last render, then sleep until the target frametime was finished. For example, if the frame rendered in 2ms but I want 16ms frametime, it would sleep for 14ms. That way, I could limit how often the UI rendered! This made it stay under around 1% CPU forever! Okay, Linux time! Rust is mostly cross-platform, so support was mostly dealing with dumbass design decisions. Since Music relies on GSMTC, I had to feature-gate the entire thing (as well as the windows/windows-future crates) behind cfg(windows) :( I also had to fix Linux font loading (since like I said earlier, it’s hardcoded to segoe ui). So I install fontdb on Linux and search for some popular fonts from there to load instead. Finally, I fixed up the storage paths since it could only load from AppData. I also made it use AppData\Local vs. AppData\Roaming instead of putting everything in Roaming. I first got it working through WSL! ! It took some messing with my GPU drivers but I got it to render. Now was the real challenge: getting it to build on an ACTUAL Linux machine. I had an old, basically broken Surface Pro 3 that I had put Debian+GNOME on for shits and giggles a few months ago. The perfect target! The main problem was getting Rocket League to even launch. I set up Legendary (goated launcher btw, check it out ) and tried to run it. I installed Wine, got Wine Mono, and it failed with a weird cryptic error about the CreateWindow function. The obvious solution to a graphical error: disable EAC. Yay, it launched! Then to get it to build. First I had to fix some filepaths since Linux is case-sensitive (nerds) while I don’t care about case on Windows. Then, rust-lld gave some weird error about simd or something which I didn’t care about. I just ran cargo clean and rebuilt it and it worked fine. Then to run, and it actually worked first try! It’s cool because I went into it expecting to debug a million socket errors, but it actuallly connected and ran. Awesome sauce! Now Linux users can use rlbuddy. More minions to contr- I mean cool users! Cya in the next one! ;) If you check out the rl perf overlay in the screenshot, you’ll be able to guess why this is the laptop I decided to put Linux on.
I’ve been putting this off for a while, but I’ve finally decided I’m going to add asset swapping. There’re a few existing implementations, so I’m reading those as well as some pdfs about the upk format. So basically credit to this document and this implementation . All it can do for now is parse the file summary. The implementation wasn’t too bad since I had Google as well as the C# implementation I just talked about. I basically have trait Deserializable : Sized { fn deserialize ( reader : & mut impl Read ) -> AnyResult < Self > ; } Then implement that for the various parts (eg. FGuid , a generic TArray ). Then, I use byteorder to read out numbers into each struct. For example, #[derive(Debug)] struct FCompressedChunkInfo { uncompressed_offset : i64 , uncompressed_size : i32 , compressed_offset : i64 , compressed_size : i32 , } impl Deserializable for FCompressedChunkInfo { fn deserialize ( reader : & mut impl Read ) -> AnyResult < Self > { Ok ( Self { uncompressed_offset : reader .read_i64 :: < LittleEndian > () ? , uncompressed_size : reader .read_i32 :: < LittleEndian > () ? , compressed_offset : reader .read_i64 :: < LittleEndian > () ? , compressed_size : reader .read_i32 :: < LittleEndian > () ? , }) } } I originally prototyped it in Python and then moved to Rust once I got tired of python’s byte shenanigans.
I JUST DESERIALIZED AND RESERIALIZED A UPK. OMAIGOD IM SO HAPPY. my brain is so tired. Alright so the payload still doesn’t get transferred but that’s pretty simple, it’s just Vec::extend. What a challenge! Deserialization actually ended up being the easy part, which is opposite of what I expected from starting the project. It went (relatively) fast since there are a few existing implementations which I could kinda just “borrow” structure parsing from. But, mine is unique in that it almost completely reserializes the package itself. I might’ve been able to “borrow” reserialization, but the impl I’ve been looking at is STRAIGHT ai slop and it’s more annoying to read that than to just do it myself. It was useful though, so I have to respect it. The first problem: basically, the first byte of an FString determines how many parts it has, NOT how many bytes it has. Which wasn’t a problem for parsing, since I had some word-based helpers which worked so I didn’t think much about it. But, when reserializing, I made two mistakes: 1. forgot to add the null terminator (which shouldn’t even be necessary) and 2. I accidentally put the wrong offset. I have no clue why there’s a null terminator for FStrings. The format is [n chars][the char bytes], meaning it should already be known how long the string is. Pretty stupid, but whatever. Anyways, when reserializing you’re supposed to include the null terminator in the string length marker. So, my logic was that I should offset it by two since unicode characters are two bytes. Bleh! I should’ve only incremented by one, since it’s in terms of utf16 chars rather than bytes. Yay, that worked! I don’t know how to summarize the next problem, so I’ll explain the reasoning. The package header is file summary + tables + something else (we’ll get to that later). Anyways, there’s some mysterious padding in between the summary and tables. Parsing, it’s easy to skip over because the summary includes the tables start offset ( name_offset , the name table is the first one). But when reserializing, you gotta keep those offsets intact. Well, I’m not totally sure if you actually have to keep them, but just for the sake of simplicity I tried to (which ended up adding more complexity, which I’ll see if I can remove now). So, I serialize/push the summary to the big Vec. Then, I make a new Vec and serialize the name table at (name_offset - summary_size), since the new Vec has to be encrypted and then appended to the big Vec. I do the same thing for imports/exports (placing the table at import/export _table_offset - summary_size ). Oh no! Since name_table_offset isn’t equal to summary_size, there’s some padding in between, which is expected. HOWEVER! The previous logic would skip over it in the table Vec creation, meaning the table Vec would have some 0-padding at the start. This padding needs to be in the SUMMARY part instead, and the name_offset should basically be the ZERO of the tables Vec! I doubt I would’ve been able to solve this part without the beautiful tool HxD . It’s really easy to use and is always helpful when I’m figgling around with binary. So, it does some more math, calculates the spacing, adds it to the big vec, and removes it from the tables Vec. Then, it re-encrypts the tables Vec and pushes it onto the big Vec! Okay, now that’s done. NOPE! There’s a mysterious structure for some reason at the end of the real table part? Yep, it’s that something else I said we’ll get to. I actually still have no idea what it is. From some research, I gathered it must be the dependencies table, but it’s really poorly documented. So, I ended up just cutting the bytes out from after the export table to the end of the tables part, and “pasting” it back before re-encryption. I do hope this devlog was readable. Now I’ll get to including the actual package payload and hopefully simplifying reserialization offsets. See you soon!
I figured out what comes after export tables! And it took way too long, since I DISCOVERED IT MYSELF! At least, as far as I know. I couldn’t find any information online about this portion of the header, so it was basically luck that I noticed a pattern. Before, I was just copying everything after the export table and pasting them back in afterwards, but as you can guess, that stopped working if I adjusted anything within the encrypted region. Compressed chunk info is a known part, and I figured out the AES padding pretty easily, so most of the time was spent trying to figure out what in the world those 24 bytes were. The first four bytes in the compressed chunk info are how many chunks they are. Here, in the Bubbles boost package, there are two (little endian), with 24 bytes of ???. And in Flamethrower, there are three, with 36 bytes of ???. I noticed that the ??? was always n chunks * 12 bytes (actually, it’s lucky that I didn’t test any which ended up having 0, otherwise I probably wouldn’t have figured it out). Since this probably had something to do with chunks, I made a guess that each chunk had some extra data stored in this array, 12 bytes of info per chunk. Using HxD’s highlight-bytes-and-get-the-decimal-value feature, I noticed a pattern where the first 8 bytes looked like an i64 offset and the last 4 looked like an i32 size, which the compressed chunk infos were also like for their matching counterparts. So, I deserialized it as [i64; i32] * n chunks and was able to read it better. These additional chunk infos seem to kinda sorta match up to uncompressed header offsets, but I don’t really understand what they are (and they’re marked as such in the code, lol). So, with that working (and some fiddling with broken serialization of TArrays which I’m surprised I didn’t catch earlier), I now understood the ENTIRE package header! Hooray! Let’s look at another example. body_grain_SF, the Fennec, has 4 chunks. Guess how many bytes of ??? it has. That’s right, zero! For some reason, a few packages just don’t have those things. After going through a bunch of them, I found that if licensee version was 32, there was no ???. But if it was 33, there WAS ???. I basically just added an if statement and it was fixed. I’m going to try to work on figuring out the padding in between the package summary and the start of the name table, but if I can’t, I suppose I’ll finally get to actually doing package swapping. Later!
I got a name swap! It doesn’t work properly, but I’m glad the game didn’t crash. These hours have been by far the most frustrating because the only way to test is against the real game since it’s really picky, but the game takes like 30 seconds to start, and if it crashes, it gives a cryptic error log, and if it freezes, it doesn’t give any log at all. I spent most of the time messing with moving different offset values forward and backwards, and ended up reverting to a simpler version with no overwriting when the header size changes just to test things. So far, I’ve mostly gleaned that name renaming is possible, but only up to a point. If the name grows too much, the game crashes, and if the name shrinks too much, the game freezes. Additionally, for some reason, total_header_size changes by the padded header size instead of the encrypted header size, which I still don’t understand. It’s seriously weird. I serialize each name properly, and yet the game reads it wrong. This game really does need a new codebase. When UE6 comes out, either the game’s gonna be so good it doesn’t need mods, or it’ll be relatively easily moddable. Or neither, which is the most probable based on Epic Games’ track record. Anyways, enjoy the beautiful screenshot.
IT SWAPPED IT SWAPPED IT SWAPPED AHAHAHHAHAHAHHAHAHAHAHHA FINALLY Okay now I gotta make it work for other pairs of boosts. If WHEN that works, I’ll actually put it in rlbuddy. I removed all the code relating to changing offsets to try to give myself a minimal workspace to tinker in, with as little side effects as possible. So, all the current code does is 1. open them 2. replace the name table entries and package guid. Surprisingly simple. Once I make it a bit more generic, I can extend it to support more swaps. If I’m really unable to get it to work for more combinations, I’ll probably end up just publishing the poc repo and not adding swapping to rlbuddy at all. This is a great motivation boost, though. I was honestly dreading coming home to work on it today because I was done with failing over and over, and considering giving up.
IT WORKS WHEN THE HEADER EXPANDS NOW YAYAYYAYAYAYYAYAYYAYAYAY I’m gonna be honest, the problem might just have been that my testing package was corrupted. I was debugging my deserialization logic, which I thought might have some parsing issue near the header extraction, and noticed that once the encrypted region deserializer’s Cursor reached the end of the region, it was actually FARTHER than the package summary’s total_header_size - by 6 bytes! That’s pretty bad, and I don’t know how something like that even happened. Anyways, I repaired the game and brought over the shiny new upk and… it worked. I’m pretty sure that I only accidentally did this while tidying up my workspace a few hours ago, but if this has genuinely been the thing holding me back for the past few days - I also finally made the poc code public, at https://github.com/kalilamodow/rl-upk-testing/
Apparently there are a bunch of different AES keys rocket league uses, not just one. You can get a list of them from the psynet config url, and then do some weird crc stuff to change them from “content keys” to aes keys. I discovered the rocket league mapmaking discord today and I’m blown away by the amount of information on there, and also apparently my whole thing about the unknown bytes when licensee version > 32 was straight up wrong, which is funny. Anyways it works for all items now, which is great. I’m gonna work on actually putting it in rlbuddy now, hopefully that goes well
rlbuddy now has item swapping! Basically, making one item appear like another to use items you don’t actually own. These hours were spent on a few different things. Firstly, I optimized the thing a bunch! There were a few places that were pretty slow since the original repo was mainly for testing. For example instead of decrypting the entire header and rechecking it to find the right key, it only loads the first 4 blocks and attempts to decrypt the first FString. If it fails, that means the AES key isn’t valid. Also, I improved the error handling with anyhow. It actually makes it so much easier to deal with things and was pretty useful when debugging the move over to the actual app. Now I’m just going to work on polishing the panel UI a bit more, since it’s still kind of ugly.
I made a ton of improvements to the asset swapper! And fixed a bug with the music player which is cool technically, so I’ll start with that. The player uses the GSMTC api, which is async, but egui doesn’t really like async. So, I made it so that every time you wanted to run some command on the current session, it would start up a new thread. This was less than ideal for a few reasons: terrible performance race conditions could happen just… in Windows itself The main problem was 2: for example, if you skipped a replay too fast, the Play command from the end of the replay might actually reach Windows before the Pause command from the replay start, leaving your music paused. So instead, it starts one dedicated worker thread which has a channel which receives a Box<dyn FnOnce(Session)> , and executes at most one command every 50ms (only one command per loop, fixed loop time of 50ms). It’s really interesting because you actually end up sending a closure through a channel, which feels funny but when you really think about it it’s just ownership semantics. But, that’s working great now! On to swapper improvements! First, I moved most of the swapper module to anyhow handling (it’s heaven!), and I also modernized the upk api a bit since it was basically dragged directly from the proof-of-concept repo, meaning it was not really application-ready. Also, it previously looked at the game’s webcache to decode the AES keys for header decryption, but now it uses the wonderful Toga-Files repository along with a really nice caching layer for it to load items and their associated API keys. Having access to the actual item data is also way better since you don’t have to manually type in a package name which is kinda weird for any normal person. Now, you can select it from a dropdown instead! I love UX.
rlbuddy now loads additional playlists straight from the game’s cached webconfig, instead of hardcoding them all! This means that the list of playlists will basically never go out of date. There are actually quite a few services which rely on game files (eg. auto stats api setup, custom maps, asset swapper). So, the first thing I did was to refactor it so make all of these load from the same global value. Then, for playlists, I made it read from a specific file in the game’s http cache directory which contains a bunch of configuration. Then, it parses it into a JSON object, grabs all the values with Class PlaylistSettings_TA, and then extracts the title and playlist id! There are still a bunch of built-in Playlists, since those have internal things like going from a casual playlist type to its respective competitive one or having the hard-coded list of singleplayer playlists. But, all the other ones, like ltms are dynamically loaded. Yay!
I got licensee version 34 (encrypted payloads too) to swap finally! Okay, so this was awesome. Rocket League’s been having a bunch of updates lately, which breaks the packages of people trying to get free stuff. So, in a Reddit thread, I ended up dishing out a bunch of swapped asset files for people in this situation. There’s a new boost which everybody wanted really bad since it was really rare (but they decided to make it unlockable at rocket pass lv99 so it doesn’t even matter anymore), and it was UNSWAPPABLE for three reasons: it was encrypted specially i hadnt encountered specially encrypted packages meaning their handling was wrong aes keys werent out for it yet (or so I thought) I’ll start with 3. I had written a tool which looks in the games cache for AES keys, and dumped them, and it worked great. What I didn’t expect is the filename to change between versions. So, I was super confused since yesterday since the AES key for the boost was just… missing. Thankfully, the geniuses at the RLMM discord got it and helped me figure out that the file I was reading from was just outdated. Great! Anyways, not too big of a deal, just a big delay. Now it’s time for the real challenge: figuring out how the hell to handle this type of package. First, I did some research. The twelve bytes of padding in files with licensee version >=33 before the summary are actually a nonce/aes iv, not just padding. Then, the header is encrypted with AES-CTR with the twelve first bytes of the iv just being the nonce. And the compressed chunks are encrypted too here: each one is also AES-CTRed with their own nonces in FCompressedChunkInfo. Thing is, I don’t have an implementation to really go off anymore, meaning there’s a lot more trial and error. For the original implementation, there were one or two existing asset swappers (though they were vibecoded meaning more of a puzzle to figure out what they’re even doing), but this time I was mostly relying on emii’s fork of UEViewer. Anyways, after spending a while figuring out what exactly I had to masquerade (payload, key, swap nonces) I finally got it to work!
Not much in terms of super-cool stuff this time. Highlights are: make sure dynamic playlist loading uses the latest cache file (and also fix its loading on normal people’s rocket league installs) loading the cache file on another thread so it doesnt freeze the whole app for a second on the first lazy lock access searching for items in the item swapper moved the error handling of the map loader to anyhow So no ultra-exciting things to talk about. anyhow is really cool though, it really simplifies error handling everywhere in the app, and I’m a big fan of its bail! macro. I’m also using Cow a lot more. Moo!
I made a standalone web-based swapper for the people who don’t want to download an entire app. A lot of people had broken packages after the last update but didn’t want to install a dedicated program just for a few swaps. So, I used the asset swapper backend of rlbuddy to make this thingamabob which runs entirely in the browser! First, I had to find out how to actually share rlbuddy’s asset swapper with other projects. Turns out Cargo has a cool thing called workspaces where you can have multiple crates in the same repo! So I moved the dedicated UPK/AES etc. stuff into a new crate and added it as a dependency in regular rlbuddy. Then, I whipped up a small wasm-compatible eframe app with the template, and included the new crate as a dependency. I made a big state machine of the steps meaning it’s impossible to have an invalid state, which is really nice. The only problem was that Rust’s ownership system isn’t smart enough to deal with it, so the code is a bit repetitive in places but it’s definitely worth it. The WASM restrictions were super annoying, mainly do to with filesystem access and requiring async. I ended up using the egui-async crate and spilling Binds all over the place within the state machine. I couldn’t even figure out how to get the actual swap procedure to run in a different thread. I also spent like 30 minutes debugging why in the world asset swapping was just broken. Even when I verified the same binary data were going in to the Upk object in the webapp and rlbuddy, for some reason the output upk was just different. Turns out I used chosen_replacement.name instead of chosen_replacement.package.name() . Isn’t that great? Anyways, it works fine now and I’m planning on posting it on r/RocketLeagueMods and possible r/RocketLeague.
A few fixes here and there. Some refactors, caching externally loaded playlists in savedata, and fixing a deadlock when clearing the items cache. And for some reason the decal option was missing from the items list picker.
more small improvements. i gave the session stats widget an actual service as well which speeds things up a lot since its not recalculating statistics every single frame. the swapper also uses the backup file if one is available and it no longer accepts duplicate custom maps
Ships:
rlbuddy is a feature-filled companion for Rocket League! It shows the skill of everyone in your lobby and has tons of toggleable widgets and features to make your life a lot easier, from Discord integration to music control. This is my first non-tiny Rust project, and I think it was really great! I’ve learned a lot such as proper state management and the ins and outs of Rust’s syntax. You can give it a try by heading to the Github releases section. If you play Rocket League, I hope you use it!
rlbutddy is a feature-rich companion for Rocket League, and v1.2 is out. There’s been some big architectural changes meaning it’s faster and bug-free-er, as well as big new features! New!!! Avatars! Now you can see people’s profile pictures even when you’re not on their platform. Custom map loader! You can import maps from a ZIP or download them straight from Bakkesplugins! Gamepad overlay! Show your controls while playing, to show off your bindings or get some help with your speedflips. I think I’ve definitely improved at Rust since the last release. Just in terms of the amount of mistakes I make, I feel like it’s way more smooth sailing than before. For example, I was able to (mostly) write not-so-buggy code and “run the borrow checker in my head” without needing to cargo check a million times, and clippy tends to have a lot less suggestions for me. Pretty great!
I made rlbuddy, a rocket league companion app! This is the third ship so far. The big features this time are the asset swapper and Linux support, but I think that the feature I’m most proud of this time is the asset swapper! It inserts the appearance of one item into the file of another, meaning by swapping out assets for others you can make your car look however you like! (Client-side only, of course). I learned a lot about byte-level manipulation and working with raw data streams and encryption/decryption in Rust, and I can read hex (relatively) well now! It’s also great because I think this combined with the doorstop experiment from a while ago gives me a nice base to try some reverse-engineering challenges in the future. I also worked a lot on performance this time, such as tuning loop times/ui fps caps and minimizing ram usage (I achieved around an 80% reduction here!) There are a crap ton more features added than that (totaling almost 100 commits), but I’m pretty sure you’re not supposed to have massive feature-dumps on the ship text. So the full list is on the latest github release! In the image, you can see I have a white fennec. In reality, I don’t actually have a tw trim, and the equipped decal isn’t compatible with the fennec either. But, using the power of asset swapping, I can get a beautiful all-white car. Neat!...
|
1792824716.4688025
|
1792911116.4688025
|
|
22316
|
Regim by @satish | Stardance
|
satish
|
0
|
186.57
|
0
|
[]
|
[{"post_id": 25329, "ts": "202 [{"post_id": 25329, "ts": "2026-07-09T15:32:04Z", "hours": 9.2267, "text": "Noticed a lot of things broke after the recent foundation change from 3 State HMM to 4 State. Started by profiling the research pipeline with py-spy. Rewrote the feature engineering loop using vectorized NumPy operations and numba.jit for the rolling entropy calculations. Cut preprocessing time from 22min to 6min using better caching routes. Also fixed a silent type coercion bug that was casting ints to floats incorrectly."}, {"post_id": 25122, "ts": "2026-07-09T04:10:23Z", "hours": 77.0039, "text": "Fixed several issues that surfaced after the 4-state HMM migration. The dashboard is now stable across all 8 assets. Fixed SPY regime forecasts showing negative probabilities by adding eigen-decomposition stability checks before forecast generation. Resolved Chrome/Recharts memory leak on the comparison tab by switching to lazy loading for asset comparison charts, reducing memory usage by ~40%. Fixed crypto state collapse on volatile days by increasing minimum state occupancy to 5% and re-running with 60 random seeds. Resolved 404 errors on the SHAP endpoint for IWM by fixing feature extraction in the KernelExplainer. Extended Yahoo Finance cache TTL to 7200s with fallback to previous day’s data when rate-limited. Fixed regime confidence display on the live tab by correcting posterior probability parsing. All 8 assets now load correctly across all 3 time periods. Next up: multi-asset portfolio execution endpoint and backtest optimization for 1-year periods."}, {"post_id": 19799, "ts": "2026-07-01T05:54:19Z", "hours": 100.3392, "text": "Migrated Regim’s core regime detection from 3-state to 4-state HMM. This required substantial refactoring of the backend: adding a 4th state (distinguishing “Crash” from “Bearish”), updating all 11 API endpoints to handle the new state space, re-validating statistical tests, and fixing cascading issues with backtest accuracy, regime labeling, and volatility forecasting."}]...
|
Title: Regim by @satish | Stardance
Devlogs:
Migr Title: Regim by @satish | Stardance
Devlogs:
Migrated Regim’s core regime detection from 3-state to 4-state HMM. This required substantial refactoring of the backend: adding a 4th state (distinguishing “Crash” from “Bearish”), updating all 11 API endpoints to handle the new state space, re-validating statistical tests, and fixing cascading issues with backtest accuracy, regime labeling, and volatility forecasting.
Fixed several issues that surfaced after the 4-state HMM migration. The dashboard is now stable across all 8 assets. Fixed SPY regime forecasts showing negative probabilities by adding eigen-decomposition stability checks before forecast generation. Resolved Chrome/Recharts memory leak on the comparison tab by switching to lazy loading for asset comparison charts, reducing memory usage by ~40%. Fixed crypto state collapse on volatile days by increasing minimum state occupancy to 5% and re-running with 60 random seeds. Resolved 404 errors on the SHAP endpoint for IWM by fixing feature extraction in the KernelExplainer. Extended Yahoo Finance cache TTL to 7200s with fallback to previous day’s data when rate-limited. Fixed regime confidence display on the live tab by correcting posterior probability parsing. All 8 assets now load correctly across all 3 time periods. Next up: multi-asset portfolio execution endpoint and backtest optimization for 1-year periods.
Noticed a lot of things broke after the recent foundation change from 3 State HMM to 4 State. Started by profiling the research pipeline with py-spy. Rewrote the feature engineering loop using vectorized NumPy operations and numba.jit for the rolling entropy calculations. Cut preprocessing time from 22min to 6min using better caching routes. Also fixed a silent type coercion bug that was casting ints to floats incorrectly....
|
1792694877.493044
|
1793299677.493044
|
|
43572
|
AKidsDream by @MrCode | Stardance
|
MrCode
|
2
|
190.61
|
2036
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-21T13:57:00Z", "hours": 107.0, "multiplier": 19.36, "payout": 1877, "blessing": "neutral", "text": "👾 AKidsDream~~(name work in progress)~~ , is a early version of a turn based strategy game , where you can controll multiple different units to win. 🤔 Why A Kid’s Dream? When I was a child, I created a small board game using paper and scissors. It was very complex, but still incredibly fun to play. 🏳️🏴Goal Its not just an attempt to make a game , its the challenge of creating modular , future proof system and to learn to clean code , using all my knoweledge of over the past 4 years of learning . (so even if i dont get rich with this game i did learn a lot xdd) What’s🆕 As this isn’t the first ship of the project, the project now contains: Mana💎 & a working card/hand systems Juicy new animations (as you may have seen with thecard drawing) more ℹ️nfo (who is playing and support for multiple local players) Hardships ( ̄ε(# ̄)☆╰╮o( ̄皿 ̄///) Trying to code everything modular and clean takes time, which is valuable resource :( Also the progress feels much slower at the beginning (but i could reuse the modular ability system for the cards which made everything easier:)) As i have invested close to 200hourse, the project has grown so much that sometimes its hard to see how one system may break another , then its another 1 hour debugging", "repo": "https://github.com/MrCode200/AKidsDream", "demo": "https://github.com/MrCode200/AKidsDream/releases/tag/v0.2.0-pre-alpha.1"}, {"ship_num": 2, "ts": "2026-08-09T19:50:41Z", "hours": 72.0, "multiplier": 8.67, "payout": 159, "blessing": "neutral", "text": "👾 AKidsDream(name work in progress), is a early version of a turn based strategy game, where you can controll multiple different units to win. 🤔 Why A Kid’s Dream? When I was a child, I created a small board game using paper and scissors. It was very complex, but still incredibly fun to play. A Kid’s Dream 🌜is my attempt to recreate that experience. Not exactly as it was, but from the pieces that remain in my memory. It is a game inspired by childhood imagination, handmade rules, and the joy of turning simple ideas into an adventure. ⚔️ Currently the game is in very early alpha, basically a proof of concept. I would love support, about what you would like to see, Game Design tips and tricks and what a winning condition could be. (destroy objectives vs destory a unit(like a king 🤴)", "repo": "https://github.com/MrCode200/AKidsDream", "demo": "https://github.com/MrCode200/AKidsDream/releases/tag/v0.2.0-pre-alpha.1"}]...
|
[{"post_id": 75690, "ts": "202 [{"post_id": 75690, "ts": "2026-09-30T19:21:12Z", "hours": 11.6108, "text": "Devlog 16: Extensions, Plugins && MODSSSSS Yes, it has been time, for what has given success to most games EVER!!!!!! ➕MODS Hard as hell to implement, as you need to make sure that each coding dependencies are implemented correctly… Had to change hole game structure to be easily extendable/moddable (fun and hard ) But i have to say i am learning more which is awsome But still many bugs and logic to fix/implement lul…"}, {"post_id": 70733, "ts": "2026-09-19T17:44:42Z", "hours": 10.015, "text": "Devlog 15: The Power of Plugins 🔌 Turned the Tween System into a plugin :)) Now it is way easier to reuse animations everywhere 🎞️ Also finished all Card + Hand logic 🃏 and cleaned up lots of code + bugs along the way 😭 The project’s recent work includes a refactor of the ability/card systems plus deck and cardcasting functionality."}, {"post_id": 65311, "ts": "2026-09-10T11:39:01Z", "hours": 10.4142, "text": "Devlog 14: Is it SatisFeelingable enough ☺️ (Help Q&Q: what animation feels more satisfying ?:00) Added clean card animation (in not so clean code 😭😭) More information on who’s turn it is. with bumb up🆙 animations for the Q&Q see the videos <3 Next 🆙: Card Deck and card into effect animations (spawn animations if above works without coding problems, which i feel is a delusional hope🥲 )"}, {"post_id": 62821, "ts": "2026-09-06T10:50:51Z", "hours": 11.515, "text": "Devlog 13: 3rr0Rssss$s ❌ and ✅Results<> Completely rewrote ȩ̷̪̓̈́́́͗͝ŗ̵͔̥̜̹̬̭̯̏̆̽͂̈́̅̐͛̾͘ͅr̸͗̌͌̾̌̾̂́͜ö̷̪̰́͊̆͗̈́̿̏́̀̂r̶̨̮̹͎̹̫͑̅̂̽̾̎͌s , Now each method returns in its chain a Result<TValue, TError> Methods like Map,Bind,Tap etc. make it now super easy to process results and errors :))"}, {"post_id": 61536, "ts": "2026-09-04T14:30:32Z", "hours": 12.2986, "text": "Devlog 12: Cards and MORE Cards 🃏 I have added Cards which can now summon units Also needed to redo the ability validation as now the modular ability system came in handy. I was able to combine both the Ability System and the Cards , so that the cards can use them freely."}, {"post_id": 58885, "ts": "2026-08-31T13:41:36Z", "hours": 8.9453, "text": "Devlog 11: I Hereby SUMMON YOU! (#°Д°) Today we are adding CARDS , 🃏Cards contain MANA Portrait Health Duration (after how many rounds does the card play its effect ) One problem i am encountering is how to identify clicking vs draggin in godot 😵💫, but i believe i could use a workaround"}, {"post_id": 56779, "ts": "2026-08-28T17:55:17Z", "hours": 13.4456, "text": "Devlog 10: MOOORE ANIMATIONSS!!!! Added a TweenComponent🎞️, allowing quick *reactive* and configurabel way to add TWEENS Created AutoGenerated Scripts⚙️ (if you know Godot.SignalNames , in a way i created the same) And for some reason one of my scripts reset so i had to debug it completly from the beginning 😭, but somehow it just got better lol."}, {"post_id": 53811, "ts": "2026-08-24T14:46:01Z", "hours": 11.2481, "text": "Devlog 9: Soo can i remove it?:0 New modular UI animations and able to delete and see order of tiles selected 😃 Tween Component 🎞️ Allows Resources to animate specifics (loop, ping pong) on specific actions (ready, shown etc.) For multiselectable tiles, there is a new layer which shows when which tiles were selected. Allows also the deletion of tiles if still valid."}, {"post_id": 50525, "ts": "2026-08-19T18:26:55Z", "hours": 8.7558, "text": "Devlog 8: So thats how much more i can CUT you😈 100+ hours 🥳 Finally added a UI for Pool Points💯 (How often an ability can be cast) Pool Updates 💧 The pool shows Icon and Count/MaxCount , with custom ANIMATIONS when the count changes Blocking Manager 🫸 The new Blocking Manager keeps track of the game states and automatically, blocks specific ui. Very Dynamic ( •̀ ω •́ )✧ (using enums for options) Next UP: More juicy animations for the Pool count (showing diff, based on current selected tiles, and a crash animation (hopefully 😅, if i can figure that out xd ))"}, {"post_id": 47365, "ts": "2026-08-15T08:27:57Z", "hours": 4.3611, "text": "Devlog 8: Ahhh you, I hit ( ̄ε(# ̄)💥╰╮o( ̄皿 ̄///) Through the new ability System, was finally able to add hit flashes ! But it was such a pain to get the Shaders working 〒▽〒 , they were never firing once, but 3 - 4 times in one row which didn’t make sense for 1 SLAP. If you hit them hard enough they jitter 😱 … Future destination 🛣️ I could imagine updating the system to be reactive to the effect applied to each Unit (so more DMG => More BOOM💥) Also added finally animations (was time).🕺"}, {"post_id": 46304, "ts": "2026-08-13T13:09:07Z", "hours": 3.7408, "text": "Devlog 7: 🐦🔥 HUGE Ability CHANGES Finally finished the new ability system (just took like 14 HOuRs Xdd) The new system introducestwo ways of running abilities (🤫see video): ⛓️Sequential Runs all selected tiles one by one, and casts the effect 📦Batch Runs the effect on all selected tiles. Also Added Context so that Abilities/Effects can now communicate and influence each other : Cost = Base Cost + Selected Tiles ... Damage = Cost * Base Damage (infinite cycle of death 🩻) This will allow huge upgrades to make in a modular way complex abilities super simple and fast ."}, {"post_id": 45761, "ts": "2026-08-12T13:46:07Z", "hours": 11.2067, "text": "Devlog 6: Rebuilding the Ability System Completely restructured the ability system , allowing abilities to be either sequentially or in batches . Also improved the underlying patterns, making abilities easier to modify, reuse, and plug into the game.(see image) Currently implementing EffectTrigger , which allows Effects of abilities to happen on specific Frames or after specific Time etc."}, {"post_id": 44495, "ts": "2026-08-10T09:23:28Z", "hours": 1.1089, "text": "Devlog 5: Camera Movement & Board Centralization Added camera movement and board centralization It feels super smooth ( zooming and moving ) thanks to lerp (love that name xd) 🤫 Also auto centers dynamically based on BOARD SIZE (if you want you can fight your friends on 1000 x 1000 tiles lul)"}, {"post_id": 44174, "ts": "2026-08-09T19:13:05Z", "hours": 0.4558, "text": "Devlog 4: Pre-Alpha Release 🥳🥳 Pre-alpha release is out! ( under review shipping, follow to see when comes live ;)) Also fixed positioning of ability buttons 🔥"}, {"post_id": 44122, "ts": "2026-08-09T18:03:26Z", "hours": 6.4614, "text": "Devlog 3: Big Progress on Units & Turn Logic Made great progress… ( •̀ ω •́ )✧ Added unit sprites Implemented turn logic Overengineered like always, xd but if i every want to make a 2v2 or how many vs how many , it will work Good thing: it now supports local X vs X , which is great for testing. :)) Next up: cool animations hehehe."}, {"post_id": 40688, "ts": "2026-08-04T11:39:41Z", "hours": 1.4419, "text": "Devlog 2: A Super Compact, Dynamic Ability System Drag and drop your Patterns (Cross, etc.) and Tada👀, you’ve got a new ability.💪 Need a special effect? Just plug in one of: DamageEffect SpawnEffect MoveSelfEffect …and many more."}, {"post_id": 40390, "ts": "2026-08-03T21:11:26Z", "hours": 63.7325, "text": "Devlog 1: 50 hours in the bag, joined stardance now! Added Ability system and backend Teams Logic (nothing visual sadly yet…)"}]...
|
Title: AKidsDream by @MrCode | Stardance
Devlogs: Title: AKidsDream by @MrCode | Stardance
Devlogs:
Devlog 1: 50 hours in the bag, joined stardance now! Added Ability system and backend Teams Logic (nothing visual sadly yet…)
Devlog 2: A Super Compact, Dynamic Ability System Drag and drop your Patterns (Cross, etc.) and Tada👀, you’ve got a new ability.💪 Need a special effect? Just plug in one of: DamageEffect SpawnEffect MoveSelfEffect …and many more.
Devlog 3: Big Progress on Units & Turn Logic Made great progress… ( •̀ ω •́ )✧ Added unit sprites Implemented turn logic Overengineered like always, xd but if i every want to make a 2v2 or how many vs how many , it will work Good thing: it now supports local X vs X , which is great for testing. :)) Next up: cool animations hehehe.
Devlog 4: Pre-Alpha Release 🥳🥳 Pre-alpha release is out! ( under review shipping, follow to see when comes live ;)) Also fixed positioning of ability buttons 🔥
Devlog 5: Camera Movement & Board Centralization Added camera movement and board centralization It feels super smooth ( zooming and moving ) thanks to lerp (love that name xd) 🤫 Also auto centers dynamically based on BOARD SIZE (if you want you can fight your friends on 1000 x 1000 tiles lul)
Devlog 6: Rebuilding the Ability System Completely restructured the ability system , allowing abilities to be either sequentially or in batches . Also improved the underlying patterns, making abilities easier to modify, reuse, and plug into the game.(see image) Currently implementing EffectTrigger , which allows Effects of abilities to happen on specific Frames or after specific Time etc.
Devlog 7: 🐦🔥 HUGE Ability CHANGES Finally finished the new ability system (just took like 14 HOuRs Xdd) The new system introducestwo ways of running abilities (🤫see video): ⛓️Sequential Runs all selected tiles one by one, and casts the effect 📦Batch Runs the effect on all selected tiles. Also Added Context so that Abilities/Effects can now communicate and influence each other : Cost = Base Cost + Selected Tiles ... Damage = Cost * Base Damage (infinite cycle of death 🩻) This will allow huge upgrades to make in a modular way complex abilities super simple and fast .
Devlog 8: Ahhh you, I hit ( ̄ε(# ̄)💥╰╮o( ̄皿 ̄///) Through the new ability System, was finally able to add hit flashes ! But it was such a pain to get the Shaders working 〒▽〒 , they were never firing once, but 3 - 4 times in one row which didn’t make sense for 1 SLAP. If you hit them hard enough they jitter 😱 … Future destination 🛣️ I could imagine updating the system to be reactive to the effect applied to each Unit (so more DMG => More BOOM💥) Also added finally animations (was time).🕺
Devlog 8: So thats how much more i can CUT you😈 100+ hours 🥳 Finally added a UI for Pool Points💯 (How often an ability can be cast) Pool Updates 💧 The pool shows Icon and Count/MaxCount , with custom ANIMATIONS when the count changes Blocking Manager 🫸 The new Blocking Manager keeps track of the game states and automatically, blocks specific ui. Very Dynamic ( •̀ ω •́ )✧ (using enums for options) Next UP: More juicy animations for the Pool count (showing diff, based on current selected tiles, and a crash animation (hopefully 😅, if i can figure that out xd ))
Devlog 9: Soo can i remove it?:0 New modular UI animations and able to delete and see order of tiles selected 😃 Tween Component 🎞️ Allows Resources to animate specifics (loop, ping pong) on specific actions (ready, shown etc.) For multiselectable tiles, there is a new layer which shows when which tiles were selected. Allows also the deletion of tiles if still valid.
Devlog 10: MOOORE ANIMATIONSS!!!! Added a TweenComponent🎞️, allowing quick *reactive* and configurabel way to add TWEENS Created AutoGenerated Scripts⚙️ (if you know Godot.SignalNames , in a way i created the same) And for some reason one of my scripts reset so i had to debug it completly from the beginning 😭, but somehow it just got better lol.
Devlog 11: I Hereby SUMMON YOU! (#°Д°) Today we are adding CARDS , 🃏Cards contain MANA Portrait Health Duration (after how many rounds does the card play its effect ) One problem i am encountering is how to identify clicking vs draggin in godot 😵💫, but i believe i could use a workaround
Devlog 12: Cards and MORE Cards 🃏 I have added Cards which can now summon units Also needed to redo the ability validation as now the modular ability system came in handy. I was able to combine both the Ability System and the Cards , so that the cards can use them freely.
Devlog 13: 3rr0Rssss$s ❌ and ✅Results<> Completely rewrote ȩ̷̪̓̈́́́͗͝ŗ̵͔̥̜̹̬̭̯̏̆̽͂̈́̅̐͛̾͘ͅr̸͗̌͌̾̌̾̂́͜ö̷̪̰́͊̆͗̈́̿̏́̀̂r̶̨̮̹͎̹̫͑̅̂̽̾̎͌s , Now each method returns in its chain a Result<TValue, TError> Methods like Map,Bind,Tap etc. make it now super easy to process results and errors :))
Devlog 14: Is it SatisFeelingable enough ☺️ (Help Q&Q: what animation feels more satisfying ?:00) Added clean card animation (in not so clean code 😭😭) More information on who’s turn it is. with bumb up🆙 animations for the Q&Q see the videos <3 Next 🆙: Card Deck and card into effect animations (spawn animations if above works without coding problems, which i feel is a delusional hope🥲 )
Devlog 15: The Power of Plugins 🔌 Turned the Tween System into a plugin :)) Now it is way easier to reuse animations everywhere 🎞️ Also finished all Card + Hand logic 🃏 and cleaned up lots of code + bugs along the way 😭 The project’s recent work includes a refactor of the ability/card systems plus deck and cardcasting functionality.
Devlog 16: Extensions, Plugins && MODSSSSS Yes, it has been time, for what has given success to most games EVER!!!!!! ➕MODS Hard as hell to implement, as you need to make sure that each coding dependencies are implemented correctly… Had to change hole game structure to be easily extendable/moddable (fun and hard ) But i have to say i am learning more which is awsome But still many bugs and logic to fix/implement lul…
Ships:
👾 AKidsDream(name work in progress), is a early version of a turn based strategy game, where you can controll multiple different units to win. 🤔 Why A Kid’s Dream? When I was a child, I created a small board game using paper and scissors. It was very complex, but still incredibly fun to play. A Kid’s Dream 🌜is my attempt to recreate that experience. Not exactly as it was, but from the pieces that remain in my memory. It is a game inspired by childhood imagination, handmade rules, and the joy of turning simple ideas into an adventure. ⚔️ Currently the game is in very early alpha, basically a proof of concept. I would love support, about what you would like to see, Game Design tips and tricks and what a winning condition could be. (destroy objectives vs destory a unit(like a king 🤴)
👾 AKidsDream~~(name work in progress)~~ , is a early version of a turn based strategy game , where you can controll multiple different units to win. 🤔 Why A Kid’s Dream? When I was a child, I created a small board game using paper and scissors. It was very complex, but still incredibly fun to play. 🏳️🏴Goal Its not just an attempt to make a game , its the challenge of creating modular , future proof system and to learn to clean code , using all my knoweledge of over the past 4 years of learning . (so even if i dont get rich with this game i did learn a lot xdd) What’s🆕 As this isn’t the first ship of the project, the project now contains: Mana💎 & a working card/hand systems Juicy new animations (as you may have seen with thecard drawing) more ℹ️nfo (who is playing and support for multiple local players) Hardships ( ̄ε(# ̄)☆╰╮o( ̄皿 ̄///) Trying to code everything modular and clean takes time, which is valuable resource :( Also the progress feels much slower at the beginning (but i could reuse the modular ability system for the cards which made everything easier:)) As i have invested close to 200hourse, the project has grown so much that sometimes its hard to see how one system may break another , then its another 1 hour debugging...
|
1792828401.6872187
|
1792914801.6872187
|
|
2805
|
FPEeee by @Duck | Stardance
|
Duck
|
2
|
191.0
|
1850
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-24T04:30:31Z", "hours": 58.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is an updated version of my physics engine, using a new simulation method called XPBD! It was a bit challenging learning the basics of vector calculus, but it was worth it for the added flexibility of XPBD constraints and integration. I’m also really proud of getting OpenGL rendering working for some of the demos, because making an 3D renderer could be a project in and of itself! (Not this renderer though, it’s pretty barebones.) I’m especially happy with the cloth demo, with the best 3D rendering and (in my opinion) the best showcase of the engine’s features! (Also the least laggy of them all? I know why but it’s still kinda weird, being the most complex demo.) Writing it in C was a probably a bit harder than using a higher level language like C++, but being able to compile the entire project from source in less than two seconds on my machine was a big plus! I hope you enjoy playing with the physics demos! I worked really hard on this project!!", "repo": "https://github.com/duckdood/fpeeee", "demo": "https://duckdood.github.io/physics_demo"}, {"ship_num": 2, "ts": "2026-09-06T04:53:48Z", "hours": 133.0, "multiplier": 16.74, "payout": 1850, "blessing": "neutral", "text": "This is a position-based physics engine made all in C for portability and versatility. It had many challenging moments when making it, such as triangle collisions, spatial partitioning, performance optimization, and more, but I had a lot of fun building it, showing it off to my friends and family, and learning more about physics.", "repo": "https://github.com/duckdood/fpeeee", "demo": "https://duckdood.github.io/physics_demo"}]...
|
[{"post_id": 80800, "ts": "202 [{"post_id": 80800, "ts": "2026-10-18T20:26:33Z", "hours": 1.6025, "text": "Devlog #22 (I just realized that I accidentally did two devlog #15s but it’s too late now) Getting ready for another ship I edited some constraints to be more stable, edited the website to be a bit more clear of where the controls are if your screen is too small to fit them, and had a NIGHTMARE fiddling with ffmpeg to try and replace the video on the README to not be too laggy or low quality but also not too big. I also tried to do some performance optimizations for phones, but I couldn’t figure it out. This is the mp4 version animated WebP that I eventually got ffmpeg to spit out. For some reason animated WebPs don’t work in devlogs."}, {"post_id": 79264, "ts": "2026-10-13T08:10:35Z", "hours": 2.3019, "text": "Devlog #21 MERGING I’ve been rewriting a lot of the physics engine for XPBD (eXtended Position Based Dynamics) since the last ship, but on a separate branch so that if I broke anything too bad it wouldn’t show up on the website, but today I finally merged the xpbd branch into main. Sadly, it is a fair bit slower than the previous verlet integration (at least for my simple demos), but it’s a far more flexible integration and constraint scheme and I think the tradeoff is worth it. (I am a bit disappointed with the performance on the website though, I swear it was faster before I merged it! It’s a lot faster natively!)"}, {"post_id": 78023, "ts": "2026-10-09T07:13:56Z", "hours": 4.0489, "text": "Devlog #20 Another constraint, and another failed side project. Boundary constraint I added a constraint that I named a “boundary constraint”, that confines a particle to being on the specific side of a line e.g. making four lines around the edges of the screen and making sure the particle is on the side which is visible on screen. This is different from a wall because walls have two sides (and also zero thickness) which can cause a particle that’s going super fast to completely pass through to the other side of the wall in a single physics step, whereas with a boundary it will always snap it back to the correct side of the line. (If this was a bad explanation, I’m sorry). Failed lua integration I suppose the word ‘failed’ is a bit harsh in this scenario, I was just dipping my toes into integrating a little lua shell into the demos that would let you spawn particles and stuff programatically, but I decided it wasn’t worth it for small demos that aren’t meant to be super duper flexible anyway because they’re just meant to show off cool features the engine can do. throwing balls very quickly at the wall, which don’t clip through VVV"}, {"post_id": 75992, "ts": "2026-10-01T22:09:53Z", "hours": 10.0394, "text": "Devlog #19 Optimization and Interaction I’ve optimized the triangle collision code to use the spatial partitioning I implemented before for collisions. It goes through each triangle and checks what balls are in its bounding box with the collision grid, and completely skips any balls that aren’t close. This allows for about a thousand balls in a scene (at least on my computer), which is a lot better than the hundred or so you’d get with just bounding box checks and the tens or so you would get with a naive approach. Sadly, this change is only on the XPBD branch for now, meaning it won’t reflect on the website, but you’d still probably have to be spawning balls for a while for that to slow down, depending on the computer. I’ve also added far better interaction to the cloth, using some matrix multiplication and some raycast tests, you can now drag the cloth around with your mouse! This change was on the main branch too, so this is right on the website , right now! I did try to implement a system for having the cloth tear when it was under stress, but it would have required me to rework a lot of stuff and it didn’t quite work out. :("}, {"post_id": 74317, "ts": "2026-09-27T05:22:56Z", "hours": 11.4481, "text": "Devlog #18 Fluid simulation For a couple days I’ve been researching and trying to implement a PBF (position based fluid) fluid simulation, but there are barely any resources on the topic that I’ve been able to find, and the ones I have found are very math oriented with evil cryptic symbols that take a while to wrap my head around. The fluid simulation does work, but it’s much laggier, a lot finickier, and not a lot better (if at all better) than just chucking a couple thousand balls together and having them collide normally."}, {"post_id": 72994, "ts": "2026-09-24T05:51:47Z", "hours": 9.7506, "text": "Devlog #17 OpenGL integration I spend the last couple days integrating OpenGL rendering into a couple of the projects, meaning the graphics will be a lot better and rendered on the GPU instead of being rendered on the CPU, as well as speeding up the demos because even with the added visual complexity, the GPU is just so much faster at rendering! I made these changes of the main branch so that they would reflect on the website sooner, but git’s merge system is actually super good and it took no more than 15 minutes to merge the OpenGL rendering to the XPBD branch. I’ve only migrated over the cloth and fluid demos, but they’re the ones that needed it the most, and it’s not too hard to add it to more demos after I’ve had most of the OpenGL boilerplate implemented."}, {"post_id": 70439, "ts": "2026-09-19T06:17:10Z", "hours": 8.4, "text": "Devlog #16 I migrated the XPBD stuff to 3D and moved all the demos to work with it as well, not much interesting to talk about though. Here’s a demo of it working though"}, {"post_id": 66409, "ts": "2026-09-12T07:11:52Z", "hours": 10.2822, "text": "Devlog #15: Rebuilding because why not A bit before shipping, I heard about another physics method called XPBD (extended position based dynamics) that’s a lot more powerful and flexible, and I decided, after I would ship, I would try to convert my engine to that. I kinda have to remake almost all of the physics stuff I already made, but I can recycle a lot of the older code, just making it fit the new framework, and being a lot more educated about physics simulation stuff than when I started this project, it wasn’t too hard to rewrite some new stuff. Right now I have ported over my ball pit thingy, not a lot to show that’s different from old devlogs, but hey, it’s the inside that counts, right?"}, {"post_id": 62664, "ts": "2026-09-06T04:32:53Z", "hours": 6.1839, "text": "Devlog #15: shipping! Super small devlog, just editing the website and the README and stuff like that, really want to ship now! It just took a while to add messages to all the different demos and I may have tried a little bit of engine stuff but it just didn’t work out."}, {"post_id": 59457, "ts": "2026-09-01T10:01:32Z", "hours": 10.425, "text": "Devlog #14 I added edge detection for 3D triangles and other miscellaneous stuff, like improving the website, adding VSync to the demos, but that stuff’s boring so I’m just going to show off the new demo! It might be the coolest one so far, but it was one of the easiest to make. I’m planning on shipping real soon though, just wanna add a few things to the website and readme!"}, {"post_id": 56613, "ts": "2026-08-28T13:09:26Z", "hours": 10.6511, "text": "Devlog #13 I added triangle-walls which vertices are 3 dynamic spheres, which can collide with other particles and have all 4 particles update with their own velocities! This makes the engine a lot more flexible, so you don’t have to make big grids of spheres if you want to be able to have walls that can move, instead of being static. And it makes rigidbodies (probably) possible! (Press enter to spawn balls) Demo! This devlog is a bit long, sorry! I didn’t want to go too far over 10 hours like a did a couple devlogs ago. 2D 2D is, of course, simpler than 3D, and the length of the function for these walls definitely show that (~40 lines). I used the same algorithm to find the closest position on a line to another position as I used for detecting collisions on the edges of the static 3D walls a while ago. It gives you a lerpable value from from the first point to the second point of the line, and you can use that to find the point you are looking for. Comparing it to the circle you’re checking against, will give the distance and the normal of the collision. You can use that information to move the circle out of the wall, and push the wall away, using the value to lerp between as the ratio to push each of the points that the wall is made of away. 3D This function is a bit more complicated, being about 80 lines long, but a lot of the information in the 2D version is applicable here too. Here, instead of trying to find the closest point, we are trying to find the barycentric coordinates of the point, which is similar to the value to lerp between the two points in 2D, but for 3D (It’s basically just 3 numbers which tell you how close you are to each vertex of a triangle, and can describe any point on the triangle). This involves find the triangle’s area that you are checking against using the cross product, getting the distance of the point inward to the triangle for each edge, and calculating some inverse areas, which magically (not really) give you the barycentric coordinates. We then use these coordinates, as long as the distance to the triangle face using the dot product, to figure out whether the ball is colliding with the face, and if so, moving the ball outside of the triangle and moving the 3 vertices away as well, of course using each barycentric coordinate as a weight for how much to move each individual vertex. I haven’t implemented detections with the edges of the triangles exactly yet though, only the faces, but I will try to implement it soon!"}, {"post_id": 50030, "ts": "2026-08-19T01:48:43Z", "hours": 11.2506, "text": "Devlog #12 I improved the website to include multiple demos, and I made a couple improvements to the performance of the spatial partitioning detection, but I’ve mostly just been doing tinkering and testing with the engine some more."}, {"post_id": 31654, "ts": "2026-07-20T07:22:53Z", "hours": 7.2706, "text": "Devlog #11: Not a huge devlog, I’ve mostly been having fun with this little parachute demo I made! I definitely spent too much time just playing with it. I’ve also been experimenting a bit with multithreading, but it’s not in a stable or performant enough state right now to showcase. mp4 compression will hate this"}, {"post_id": 27421, "ts": "2026-07-12T23:48:38Z", "hours": 6.1297, "text": "Devlog #10: I ported the spatial partitioning to 3D! It’s definitely a lot laggier in the 3D environment, because it needs to check 3x the partitions per ball, but it’s still a lot better than having no spatial partitioning at all. One of the problems I encountered when transitioning to 3D was lag, but not in the expected “It’s going to be laggy when you have a lot of balls” way. For some strange reason, the framerate was still below 60 even when there were no balls in the world! It turned out to be an issue with needing to calloc a big region of memory everytime it would sort the balls into their partitions, but I was able to fix it by keeping the allocation throughout the lifetime of the partition grid. I also fixed it in the 2D version, even though it wasn’t really a problem there, it also wasn’t really a problem to fix either. (In the video you will notice the balls disappearing, the sample I whipped up for the devlog just automatically despawns balls when they leave the partitioning grid. Also some balls fly off when spawning, because sometimes the balls spawn inside one another) I’m getting a bit burnt out from this project though, I might ship after maybe adding multithreading, creating the README, and maybe making some more demos. I’ve been watching some videos on real rigidbody physics, and I want to try that out too!"}, {"post_id": 24090, "ts": "2026-07-07T13:02:59Z", "hours": 25.6289, "text": "Devlog #9: Intro I added spatial partitioning to the engine to speed up collisions when you have a lot of balls in a scene. Partitioning explanation Spatial partitioning is an optimization that divides the world into a grid, so balls only check other balls that are in close cells, instead of every ball checking all others, which is O(n^2). It seems pretty simple, but I tried 4 different ways before getting a good result. Judging by the time logged, I struggled. First Attempt (Dense grid) I first tried a naive implementation, which was making a big grid, with each cell having a list of pointers to balls that are in it. The problem is, each cell needs to have the total amount of balls that could be in it allocated. For the best performance, each grid cell should be the same size as a ball, and for the size I use here, you need the grid dimensions to be in the 100s. with 1000 balls, and with 64 bit pointers, you could have 1000 * 8 * 300 * 300 bytes allocated total, ~720 MB. You can get away with a lot less pointers, but that still wasn’t satisfying, or flexible. Second Attempt (Sparse grid) My second try was a grid, but you only store cells which have balls in them. This doesn’t solve the high number of pointers per cell, but it uses less cells overall. It should’ve been easier, but C doesn’t have any built in hashmaps. The physics code doesn’t use many libraries, and I didn’t want to rely on more, so I had the bright idea to make my own hashmap. It didn’t work and I gave up, and that was the end of the sparse grid. Third Attempt (Resizable arrays) The third attempt was like the first, but I decided to try allocating the memory on the fly, when balls moved around, but it didn’t work out. Working Attempt!! (Sorting) The most successful attempt was a grid, every cell is allocated, and yet, uses the least memory. Instead of storing pointers, each cell only stores two things: An offset and a length. Just indices into the ball array, which sounds easy, but then you realize - the balls are in a random order. To fix this, when updating the grid, you sort the balls into the cell they’re in. You may think that going into the dark cave of sorting is a bad idea, but here, it’s just a counting sort. Then it sets each cell’s fields, and you have your partitions. Detecting Collisions Collisions are easier than constructing the grid, you just check every ball, find its cell, check balls in close cells, then you’re done. Struggles There was a lot of friction with memory errors. To fix them, I learned GDB, and learnt about sanitizers, which detect lots of hard to catch memory errors. One time the program would randomly crash, and it was really hard to fix, but a sanitizer detected an easy out of bounds error when rendering. Not even a physics thing. :( Sorry!! Sorry for the long post, and the time it took me to post it, The devlog guide says to keep it short and post often, but I fell down a rabbit hole with optimizing, and was putting off writing as I knew it would be unwieldy in length. I haven’t implemented partitioning in 3d yet, but it should be easy to transfer over. It’s hard to see the balls in the video, but I want to keep the video smaller. It gets laggy in the video as well, but there are 7000 balls in the scene at the end, and I check collisions 15 times per frame, I am also recording too. Try it out If you read all the way down here, you might want to try the engine. I have a build on my pages , but it’s kinda slow on web. Click to attract P to set where the balls shoot to when spawned Enter to spawn balls Scroll to change spawn speed (at least until I change the demo). On some screens the simulation doesn’t show up until you click fullscreen. Sorry for weird wording, max devlog size is 4k characters."}, {"post_id": 13602, "ts": "2026-06-22T09:10:49Z", "hours": 9.5267, "text": "Devlog #8: I added a function that generates wheels (kinda lame), but I also added a GitHub action that automatically compiles and pushes my commits to my GitHub pages so now theres a web demo also i did just like a ton of testing and playing and stuff which is what pushed it to 9 hours"}, {"post_id": 11197, "ts": "2026-06-18T10:07:28Z", "hours": 12.275, "text": "Devlog 7: Finally added mass to the engine! Before now all the particles had the same mass (just implicitly, so basically all of them had a mass of 1), making the small ones super dense. Took so long because I had to migrate back to 2d in order to make sure the mass was working in 2d (everything was in 3d already so I actually added mass to 3d first), and had to update the 2d rendering for it to be able to render in 3d, but now everything (especially springs), is a lot cooler!"}, {"post_id": 7804, "ts": "2026-06-13T00:51:39Z", "hours": 3.5253, "text": "I added the shape generators back for 3d, now we have ✨ 3D cloth ✨!"}, {"post_id": 7351, "ts": "2026-06-12T08:09:41Z", "hours": 12.0594, "text": "Trying to move to 3D, finally got triangle-sphere collisions working the edges were by far the hardest part, the sphere-face collision actually wasn’t too hard the engine wasn’t built for walls to be able to move, but it can handle it semi fine (I’m just having rotating walls for the cool 3d showcase)"}, {"post_id": 3300, "ts": "2026-06-06T04:57:51Z", "hours": 5.0347, "text": "Added some functions that generate shapes for you, for example, cloth!"}, {"post_id": 2633, "ts": "2026-06-05T08:26:08Z", "hours": 1.5244, "text": "not that big but i migrated to the sdl callback system, so it works on emscripten now (can run in browser) ignore my screen recorder quality"}, {"post_id": 2039, "ts": "2026-06-04T10:12:11Z", "hours": 5.5597, "text": "got circle-circle collision working and with a lot of balls its a bit like a fluid cleaned up main.c as well too"}, {"post_id": 721, "ts": "2026-06-02T09:46:29Z", "hours": 5.7058, "text": "includes double pendulum for clout not actually accurate but looks fine it uses verlet integration and supports springs as well"}]...
|
Title: FPEeee by @Duck | Stardance
Devlogs:
inclu Title: FPEeee by @Duck | Stardance
Devlogs:
includes double pendulum for clout not actually accurate but looks fine it uses verlet integration and supports springs as well
got circle-circle collision working and with a lot of balls its a bit like a fluid cleaned up main.c as well too
not that big but i migrated to the sdl callback system, so it works on emscripten now (can run in browser) ignore my screen recorder quality
Added some functions that generate shapes for you, for example, cloth!
Trying to move to 3D, finally got triangle-sphere collisions working the edges were by far the hardest part, the sphere-face collision actually wasn’t too hard the engine wasn’t built for walls to be able to move, but it can handle it semi fine (I’m just having rotating walls for the cool 3d showcase)
I added the shape generators back for 3d, now we have ✨ 3D cloth ✨!
Devlog 7: Finally added mass to the engine! Before now all the particles had the same mass (just implicitly, so basically all of them had a mass of 1), making the small ones super dense. Took so long because I had to migrate back to 2d in order to make sure the mass was working in 2d (everything was in 3d already so I actually added mass to 3d first), and had to update the 2d rendering for it to be able to render in 3d, but now everything (especially springs), is a lot cooler!
Devlog #8: I added a function that generates wheels (kinda lame), but I also added a GitHub action that automatically compiles and pushes my commits to my GitHub pages so now theres a web demo also i did just like a ton of testing and playing and stuff which is what pushed it to 9 hours
Devlog #9: Intro I added spatial partitioning to the engine to speed up collisions when you have a lot of balls in a scene. Partitioning explanation Spatial partitioning is an optimization that divides the world into a grid, so balls only check other balls that are in close cells, instead of every ball checking all others, which is O(n^2). It seems pretty simple, but I tried 4 different ways before getting a good result. Judging by the time logged, I struggled. First Attempt (Dense grid) I first tried a naive implementation, which was making a big grid, with each cell having a list of pointers to balls that are in it. The problem is, each cell needs to have the total amount of balls that could be in it allocated. For the best performance, each grid cell should be the same size as a ball, and for the size I use here, you need the grid dimensions to be in the 100s. with 1000 balls, and with 64 bit pointers, you could have 1000 * 8 * 300 * 300 bytes allocated total, ~720 MB. You can get away with a lot less pointers, but that still wasn’t satisfying, or flexible. Second Attempt (Sparse grid) My second try was a grid, but you only store cells which have balls in them. This doesn’t solve the high number of pointers per cell, but it uses less cells overall. It should’ve been easier, but C doesn’t have any built in hashmaps. The physics code doesn’t use many libraries, and I didn’t want to rely on more, so I had the bright idea to make my own hashmap. It didn’t work and I gave up, and that was the end of the sparse grid. Third Attempt (Resizable arrays) The third attempt was like the first, but I decided to try allocating the memory on the fly, when balls moved around, but it didn’t work out. Working Attempt!! (Sorting) The most successful attempt was a grid, every cell is allocated, and yet, uses the least memory. Instead of storing pointers, each cell only stores two things: An offset and a length. Just indices into the ball array, which sounds easy, but then you realize - the balls are in a random order. To fix this, when updating the grid, you sort the balls into the cell they’re in. You may think that going into the dark cave of sorting is a bad idea, but here, it’s just a counting sort. Then it sets each cell’s fields, and you have your partitions. Detecting Collisions Collisions are easier than constructing the grid, you just check every ball, find its cell, check balls in close cells, then you’re done. Struggles There was a lot of friction with memory errors. To fix them, I learned GDB, and learnt about sanitizers, which detect lots of hard to catch memory errors. One time the program would randomly crash, and it was really hard to fix, but a sanitizer detected an easy out of bounds error when rendering. Not even a physics thing. :( Sorry!! Sorry for the long post, and the time it took me to post it, The devlog guide says to keep it short and post often, but I fell down a rabbit hole with optimizing, and was putting off writing as I knew it would be unwieldy in length. I haven’t implemented partitioning in 3d yet, but it should be easy to transfer over. It’s hard to see the balls in the video, but I want to keep the video smaller. It gets laggy in the video as well, but there are 7000 balls in the scene at the end, and I check collisions 15 times per frame, I am also recording too. Try it out If you read all the way down here, you might want to try the engine. I have a build on my pages , but it’s kinda slow on web. Click to attract P to set where the balls shoot to when spawned Enter to spawn balls Scroll to change spawn speed (at least until I change the demo). On some screens the simulation doesn’t show up until you click fullscreen. Sorry for weird wording, max devlog size is 4k characters.
Devlog #10: I ported the spatial partitioning to 3D! It’s definitely a lot laggier in the 3D environment, because it needs to check 3x the partitions per ball, but it’s still a lot better than having no spatial partitioning at all. One of the problems I encountered when transitioning to 3D was lag, but not in the expected “It’s going to be laggy when you have a lot of balls” way. For some strange reason, the framerate was still below 60 even when there were no balls in the world! It turned out to be an issue with needing to calloc a big region of memory everytime it would sort the balls into their partitions, but I was able to fix it by keeping the allocation throughout the lifetime of the partition grid. I also fixed it in the 2D version, even though it wasn’t really a problem there, it also wasn’t really a problem to fix either. (In the video you will notice the balls disappearing, the sample I whipped up for the devlog just automatically despawns balls when they leave the partitioning grid. Also some balls fly off when spawning, because sometimes the balls spawn inside one another) I’m getting a bit burnt out from this project though, I might ship after maybe adding multithreading, creating the README, and maybe making some more demos. I’ve been watching some videos on real rigidbody physics, and I want to try that out too!
Devlog #11: Not a huge devlog, I’ve mostly been having fun with this little parachute demo I made! I definitely spent too much time just playing with it. I’ve also been experimenting a bit with multithreading, but it’s not in a stable or performant enough state right now to showcase. mp4 compression will hate this
Devlog #12 I improved the website to include multiple demos, and I made a couple improvements to the performance of the spatial partitioning detection, but I’ve mostly just been doing tinkering and testing with the engine some more.
Devlog #13 I added triangle-walls which vertices are 3 dynamic spheres, which can collide with other particles and have all 4 particles update with their own velocities! This makes the engine a lot more flexible, so you don’t have to make big grids of spheres if you want to be able to have walls that can move, instead of being static. And it makes rigidbodies (probably) possible! (Press enter to spawn balls) Demo! This devlog is a bit long, sorry! I didn’t want to go too far over 10 hours like a did a couple devlogs ago. 2D 2D is, of course, simpler than 3D, and the length of the function for these walls definitely show that (~40 lines). I used the same algorithm to find the closest position on a line to another position as I used for detecting collisions on the edges of the static 3D walls a while ago. It gives you a lerpable value from from the first point to the second point of the line, and you can use that to find the point you are looking for. Comparing it to the circle you’re checking against, will give the distance and the normal of the collision. You can use that information to move the circle out of the wall, and push the wall away, using the value to lerp between as the ratio to push each of the points that the wall is made of away. 3D This function is a bit more complicated, being about 80 lines long, but a lot of the information in the 2D version is applicable here too. Here, instead of trying to find the closest point, we are trying to find the barycentric coordinates of the point, which is similar to the value to lerp between the two points in 2D, but for 3D (It’s basically just 3 numbers which tell you how close you are to each vertex of a triangle, and can describe any point on the triangle). This involves find the triangle’s area that you are checking against using the cross product, getting the distance of the point inward to the triangle for each edge, and calculating some inverse areas, which magically (not really) give you the barycentric coordinates. We then use these coordinates, as long as the distance to the triangle face using the dot product, to figure out whether the ball is colliding with the face, and if so, moving the ball outside of the triangle and moving the 3 vertices away as well, of course using each barycentric coordinate as a weight for how much to move each individual vertex. I haven’t implemented detections with the edges of the triangles exactly yet though, only the faces, but I will try to implement it soon!
Devlog #14 I added edge detection for 3D triangles and other miscellaneous stuff, like improving the website, adding VSync to the demos, but that stuff’s boring so I’m just going to show off the new demo! It might be the coolest one so far, but it was one of the easiest to make. I’m planning on shipping real soon though, just wanna add a few things to the website and readme!
Devlog #15: shipping! Super small devlog, just editing the website and the README and stuff like that, really want to ship now! It just took a while to add messages to all the different demos and I may have tried a little bit of engine stuff but it just didn’t work out.
Devlog #15: Rebuilding because why not A bit before shipping, I heard about another physics method called XPBD (extended position based dynamics) that’s a lot more powerful and flexible, and I decided, after I would ship, I would try to convert my engine to that. I kinda have to remake almost all of the physics stuff I already made, but I can recycle a lot of the older code, just making it fit the new framework, and being a lot more educated about physics simulation stuff than when I started this project, it wasn’t too hard to rewrite some new stuff. Right now I have ported over my ball pit thingy, not a lot to show that’s different from old devlogs, but hey, it’s the inside that counts, right?
Devlog #16 I migrated the XPBD stuff to 3D and moved all the demos to work with it as well, not much interesting to talk about though. Here’s a demo of it working though
Devlog #17 OpenGL integration I spend the last couple days integrating OpenGL rendering into a couple of the projects, meaning the graphics will be a lot better and rendered on the GPU instead of being rendered on the CPU, as well as speeding up the demos because even with the added visual complexity, the GPU is just so much faster at rendering! I made these changes of the main branch so that they would reflect on the website sooner, but git’s merge system is actually super good and it took no more than 15 minutes to merge the OpenGL rendering to the XPBD branch. I’ve only migrated over the cloth and fluid demos, but they’re the ones that needed it the most, and it’s not too hard to add it to more demos after I’ve had most of the OpenGL boilerplate implemented.
Devlog #18 Fluid simulation For a couple days I’ve been researching and trying to implement a PBF (position based fluid) fluid simulation, but there are barely any resources on the topic that I’ve been able to find, and the ones I have found are very math oriented with evil cryptic symbols that take a while to wrap my head around. The fluid simulation does work, but it’s much laggier, a lot finickier, and not a lot better (if at all better) than just chucking a couple thousand balls together and having them collide normally.
Devlog #19 Optimization and Interaction I’ve optimized the triangle collision code to use the spatial partitioning I implemented before for collisions. It goes through each triangle and checks what balls are in its bounding box with the collision grid, and completely skips any balls that aren’t close. This allows for about a thousand balls in a scene (at least on my computer), which is a lot better than the hundred or so you’d get with just bounding box checks and the tens or so you would get with a naive approach. Sadly, this change is only on the XPBD branch for now, meaning it won’t reflect on the website, but you’d still probably have to be spawning balls for a while for that to slow down, depending on the computer. I’ve also added far better interaction to the cloth, using some matrix multiplication and some raycast tests, you can now drag the cloth around with your mouse! This change was on the main branch too, so this is right on the website , right now! I did try to implement a system for having the cloth tear when it was under stress, but it would have required me to rework a lot of stuff and it didn’t quite work out. :(
Devlog #20 Another constraint, and another failed side project. Boundary constraint I added a constraint that I named a “boundary constraint”, that confines a particle to being on the specific side of a line e.g. making four lines around the edges of the screen and making sure the particle is on the side which is visible on screen. This is different from a wall because walls have two sides (and also zero thickness) which can cause a particle that’s going super fast to completely pass through to the other side of the wall in a single physics step, whereas with a boundary it will always snap it back to the correct side of the line. (If this was a bad explanation, I’m sorry). Failed lua integration I suppose the word ‘failed’ is a bit harsh in this scenario, I was just dipping my toes into integrating a little lua shell into the demos that would let you spawn particles and stuff programatically, but I decided it wasn’t worth it for small demos that aren’t meant to be super duper flexible anyway because they’re just meant to show off cool features the engine can do. throwing balls very quickly at the wall, which don’t clip through VVV
Devlog #21 MERGING I’ve been rewriting a lot of the physics engine for XPBD (eXtended Position Based Dynamics) since the last ship, but on a separate branch so that if I broke anything too bad it wouldn’t show up on the website, but today I finally merged the xpbd branch into main. Sadly, it is a fair bit slower than the previous verlet integration (at least for my simple demos), but it’s a far more flexible integration and constraint scheme and I think the tradeoff is worth it. (I am a bit disappointed with the performance on the website though, I swear it was faster before I merged it! It’s a lot faster natively!)
Devlog #22 (I just realized that I accidentally did two devlog #15s but it’s too late now) Getting ready for another ship I edited some constraints to be more stable, edited the website to be a bit more clear of where the controls are if your screen is too small to fit them, and had a NIGHTMARE fiddling with ffmpeg to try and replace the video on the README to not be too laggy or low quality but also not too big. I also tried to do some performance optimizations for phones, but I couldn’t figure it out. This is the mp4 version animated WebP that I eventually got ffmpeg to spit out. For some reason animated WebPs don’t work in devlogs.
Ships:
This is a position-based physics engine made all in C for portability and versatility. It had many challenging moments when making it, such as triangle collisions, spatial partitioning, performance optimization, and more, but I had a lot of fun building it, showing it off to my friends and family, and learning more about physics.
This is an updated version of my physics engine, using a new simulation method called XPBD! It was a bit challenging learning the basics of vector calculus, but it was worth it for the added flexibility of XPBD constraints and integration. I’m also really proud of getting OpenGL rendering working for some of the demos, because making an 3D renderer could be a project in and of itself! (Not this renderer though, it’s pretty barebones.) I’m especially happy with the cloth demo, with the best 3D rendering and (in my opinion) the best showcase of the engine’s features! (Also the least laggy of them all? I know why but it’s still kinda weird, being the most complex demo.) Writing it in C was a probably a bit harder than using a higher level language like C++, but being able to compile the entire project from source in less than two seconds on my machine was a big plus! I hope you enjoy playing with the physics demos! I worked really hard on this project!!...
|
1792846081.7022202
|
1792932481.7022202
|
|
34808
|
Chess Game App in Web by @srimaan-gande | Stardanc Chess Game App in Web by @srimaan-gande | Stardance...
|
srimaan-gande
|
1
|
192.0
|
194
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-20T03:07:36Z", "hours": 48.0, "multiplier": 4.28, "payout": 194, "blessing": "neutral", "text": "Javascript Chess Game Credit: Abdul at THE SOLUTION HUB A fully-featured chess game built with vanilla JavaScript, jQuery, and CSS. Features complete standard chess rules plus advanced tournament rules. Features Implemented Core Chess Rules Standard piece movement : King, Queen, Rook, Bishop, Knight, Pawn Capture mechanics : Standard captures with algebraic notation (e.g., exd5 , Nxf3 ) Check detection : Real-time check status display Checkmate detection : Automatic game end with # notation Stalemate detection : Draw when no legal moves and not in check Castling : Kingside (O-O) and Queenside (O-O-O) with full validation King and rook must not have moved Path must be clear King cannot be in, move through, or end in check Pawn promotion : Automatic queen promotion on 8th/1st rank Advanced Rules En Passant : Capture pawn that moved two squares Visual highlight of en passant target square Correct capture mechanics (removes pawn from adjacent rank) Only available immediately after opponent’s double-move Threefold Repetition : Automatic draw detection Tracks full position including castling rights and en passant Draws when same position occurs 3 times Alert notification on draw Fifty-Move Rule : Automatic draw detection Half-move clock resets on pawn moves and captures Draws after 100 half-moves (50 full moves) without progress Alert notification on draw Draw by Agreement : “Offer Draw” button with confirmation Resignation : “Resign” button with confirmation dialog Visual Design (8-bit/Arcade Theme) Fonts : Press Start 2P (headers) + VT323 (monospace) CRT scanline overlay : Subtle horizontal lines Vignette effect : Darkened edges Pixel-perfect borders : 2px solid with inset shadows Neon glow effects : White/amber/red text shadows Hover animations : Scale + glow on squares Valid move pulse : Animated glow on legal destinations Custom scrollbars : Arcade-styled for move list Game over modal : Alert dialogs for checkmate/stalemate/draw User Interface Objects Turn display : “It’s White’s Turn!” / “It’s Black’s Turn” Status display : CHECK, CHECKMATE, STALEMATE, DRAW states with pulsing animations Move list panel : Side panel with numbered moves Control buttons : Restart, Offer Draw, Resign Responsive layout : Flexbox side-by-side (board + move list) Rank/file labels : 1-8 and a-h with grid positioning Controls Click piece → Select (shows legal moves) Click highlighted square → Move piece Click own piece → Switch selection Restart Game → Reset to initial position Offer Draw → Propose draw to opponent Resign → Concede the game", "repo": "https://github.com/tutugoy/chess-game-app", "demo": "https://tutugoy.github.io/chess-game-app/"}]...
|
[{"post_id": 42830, "ts": "202 [{"post_id": 42830, "ts": "2026-08-07T19:27:06Z", "hours": 10.0, "text": "Chess game update I am posting this devlog to save my time that I worked on. I don’t have anything major to report, because currently, I am changing the CSS on the board, and mainly fixed issues related to the buttons and the mood bar because I didn’t connect them properly to the rest of the menu. But with this devlog, I also want to share my idea of what the game will be in the future. Chess is a basic game that anyone can make, so my plan is to make it into an actual single player game . With this, there will be a storyline of sorts, with bosses, quests, and more (similar to the Super Mario deluxe game). My main doubt is should I make it into a game like this and keep the same chess aspect, or if I should I add more modifications, like powerups or smth."}, {"post_id": 41385, "ts": "2026-08-05T15:46:13Z", "hours": 10.0, "text": "Chess game update - mood bar This is yesterdays update because I forgot to post, but this time, I reverted my changes back to the arcade CSS because the menu and promotion wasn’t working correctly, and so I thought going element by element might be more efficient and easier for me to catch bugs. This update adds new button CSS that is sort of like Duolingo’s buttons, but I found some on Uiverse that I liked which I used. ( https://uiverse.io/snooka1/soft-quail-12 ). I also found a range slider on FreeFrontend.com ( https://freefrontend.com/css-range-sliders/ , called Neumorphism - Range Slider) that I modified to keep a face on the top for the difficulty, and then also made a bar behind it with the same color turning from green to red as it increases. I plan on making more changes to the overall CSS today as well."}, {"post_id": 40491, "ts": "2026-08-04T01:55:10Z", "hours": 11.0, "text": "Chess game - CSS Update Today, i removed all the arcade themed CSS. This includes: The game board The font The scanlines (that nobody could rly see) The scanlines on each game board slot (also which nobody could see) The grey and white board color The glow effect on everything So right now, its pretty bare. I do want to note that the promotion dial and the menu are not working properly right now because I removed some CSS. I will fix that tmrw. I am also currently working on making ideas for the duolingo slab design theme, and it will prob include interactive buttons and overall better scheme."}, {"post_id": 39275, "ts": "2026-08-02T04:26:35Z", "hours": 13.0, "text": "Chess game update As mentioned yesterday, I was working on a fairly new update. This time, I took the code for the dial for promotion, and replicated it to make a small menu that fits all of the commands of the following: Resigning Offering a Draw Restarting the game Flipping Board Move takeback (center button) For some reason, the move takeback button also doesn’t work, so I plan on fixing that as well as making the CSS better. I realized that the whole design isn’t as user friendly, and I kind of just did whatever I could to fit the theme, and that takes away from the goal of proper UI. I really like duolingo’s style of buttons and UI, so I will try to replication it in my own way if possible. This obviously will take a long time, so I am guessing this update will finish in 2-3 days optimistically. Btw link to project if you want to test: https://tutugoy.github.io/chess-game-app/"}, {"post_id": 38574, "ts": "2026-08-01T01:47:41Z", "hours": 9.0, "text": "Chess progress I am currently working on more functionality abilities and fixing some newfound bugs in the code. I don’t want to spoil just yet but I really liked the dial for the promotion, so I want to build on that feature with everything else. I understand this will be a difficult task, but by doing this, I can make the app much more functional! (I am currently coding the JS so I don’t have any good pictures to show so here is the old pic) Like I said, tomorrow I will have something good to show!"}, {"post_id": 38150, "ts": "2026-07-31T12:06:34Z", "hours": 9.0, "text": "Chess update - Promotion! I finished the promotion code today! Although I have mentioned it before, here is a summary of how it works. You go to the end, and a dial with 4 pieces appears. Choose yours and you will become that piece. I fixed the issue with the turn ending at the wrong time as well, which is good. But when doing this, I ran into a couple problems. Firstly, the game didn’t count any pieces taken for my pawn to promote. For example, if a white pawn was on g7 and a black rook on h8, the pawn should have the ability to take the rook and promote on the white turn. Although this happens visually, the game counts the rook as still alive. This is an issue I am currently working on right now."}, {"post_id": 37415, "ts": "2026-07-30T03:35:07Z", "hours": 9.0, "text": "Chess game update This is a major advancement in my pawn promotion mechanics. Since yesterday I have been working on pawn promotion, and I figured the best way could be a sort of dial. As you can see in the picture, this is what the dial will look like when trying to promote, and when clicking on one of the pieces, that piece will be selected. Super simple is what I thought at first, but it was much worse than that. Building the dial was an utter pain. The CSS features kept making it into a square that was twisted where it connected to all the sides where the sections split. The center was supposed to be hollow, but I am still unsure on its main use, so I kept it solid for now. The promotion works, but 2 main issues arise. Firstly, if I click out of promotion dial, it ends my turn without me doing anything. So I don’t even get to make a move at all. Secondly, if I click any of the pieces, it is still my turn for some reason. I believe the issue is that my JS counts clicking a legal square to move to as the end of my turn, which is why it is doing this. I will fix the rest tomorrow as I believe taking time to rest might help me think of a solution."}, {"post_id": 36335, "ts": "2026-07-28T11:56:56Z", "hours": 10.0, "text": "Chess game updates I recently got my first ship rated and I understood what mistakes I made and what I needed to fix. I understood that even though the game was well made in terms of how it works, it wasn’t user friendly and the theme made it harder to see. Thanks to all who helped give feedback for this, and my first change is to make the pieces actual vectors. This was an issue all of the users pointed out, so I hope this fixes at least one of the problems. I will continue moving forward with this in mind, and I am currently working on my other changes as well. (This is the only one that properly is working so I wrote about it)"}, {"post_id": 35304, "ts": "2026-07-26T16:57:03Z", "hours": 8.0, "text": "Chess update - bug fixes and initial work on Auto saving I used my time today to just update some other features that had bugs that I haven’t fixed yet, like the clock sometimes doesn’t work between turns. I also started working on Auto Saving so that the game saves in local storage so you could resume later, but it isn’t looking very good right now because I messed with the wrong code and the entire thing broke. I need to fix that tomorrow but overall this was a mostly successful use of time."}, {"post_id": 34601, "ts": "2026-07-25T13:44:43Z", "hours": 9.0, "text": "Chess game update Loading and saving games is now a feature as well. The app will export a JSON file containing data of the match, including time left for both sides, which pieces are still on the board, and the movelist as well. In addition, I have fixed bugs with the take back button, where it was removing pieces from the board entirely. I will focus on addition promotion tomorrow as I haven’t done that yet."}, {"post_id": 34026, "ts": "2026-07-24T13:25:10Z", "hours": 9.0, "text": "Chess game update - functionality I added a game clock (10 mins for now) and the take back move button. These are just functionality changes not anything major. it took a while because I also had to figure out how to make the clocks go around after the board was flipped so it was taking a long time for that. Also the game now has to read the move list and revert changes to the board for the move back so that also took long. I need to fix some issues with the clock, something I am working on now."}, {"post_id": 33846, "ts": "2026-07-24T02:48:00Z", "hours": 2.0, "text": "Chess game update - more functionality I have spent this time fixing the numerous issues that came with flipping the board, including deleting the pieces, changing their positions, making the move list somehow go into the negatives, and more I didn’t even notice but the console did. I had to perform a git restore to remove the changes and recode the entire thing again. It did workout and now it works well."}, {"post_id": 33441, "ts": "2026-07-23T12:10:29Z", "hours": 10.0, "text": "Chess game update I am currently trying to fix some issues when implementing the stockfish engine as it is too strong at level 1. This is proving to be a big challenge but I will be able to complete it soon. While doing so, I also thought of improving some functionality and I have added a feature to flip the board. This feature also has a lot of issues and both will most likely be fixed in the next devlog."}, {"post_id": 33130, "ts": "2026-07-22T19:15:52Z", "hours": 9.0, "text": "Chess Game update - Stockfish Engine Yesterday I started working on a stockfish engine for my game. I finished it today and it has some very strong features. You can now play in 3 modes: PvP PvE (Player plays as white) PvE (Player plays as Black) I used the LiChess stockfish engine to complete this part of the project (Link to release: https://github.com/lichess-org/stockfish.js/releases/tag/ddugovic-250718 ) The engine has all the features to calculate the best moves and complete them. To make it easier, I added a level system from 1-20 so that the bot is easier or harder to beat, but after testing, I found that the bot takes longer to respond with a move when its at level 20 and is still very smart and powerful at level 1. I think I may have integrated the engine incorrectly when connecting it to my current project, so in my next update, I will be fixing this issue."}, {"post_id": 32657, "ts": "2026-07-21T23:05:55Z", "hours": 8.0, "text": "Chess game update I am currently working on building a bot you can play against. It is very tough to find another person to play with especially on the same screen/device so this could fix that issue very easily. The bot will be stockfish and make moves for either black or white. For now, I will code it just for black and make it for white later. This devlog is for me to log my hours, but the bot is nearly finished and will take me a little more time. This also introduces the need to switch from white to black, so in the future I will be adding that feature as well."}, {"post_id": 32121, "ts": "2026-07-21T02:01:49Z", "hours": 0.0, "text": "Chess game fix quick For some reason King + Knight VS King was not working from my last update, which was because I did not properly edit the code. I have fixed the issue and that should be working now. This devlog isn’t major or an update but just a fix."}, {"post_id": 31992, "ts": "2026-07-20T20:34:58Z", "hours": 8.0, "text": "Chess game update Today I added the insufficient material feature. It took me a while to figure out because I was trying to use formulas and math to make the code analyze if a certain set of pieces can lead to a checkmate, but I realized that instead of calculating, I can just find which combinations of pieces cannot lead to checkmate, and then list those pieces in the code for the game to constantly check, and then determine if its a stalemate/draw. Below is the combinations of pieces that cannot lead to a checkmate that my code checks and accounts for: King vs King King + Bishop vs King King + Knight vs King King + Bishop vs King + Bishop (same color squares)"}, {"post_id": 31566, "ts": "2026-07-20T02:23:14Z", "hours": 3.0, "text": "Chess game final update before shipping This is my final update for the chess game. In this update I added sound effects and fixed some final issues before shipping."}, {"post_id": 31232, "ts": "2026-07-19T14:01:17Z", "hours": 7.0, "text": "Chess game fix So far, I worked on fixing the bug in my code which made my pieces disappear as mentioned last time. I am also currently working on trying to add sound effects to make the game more interesting to play and use. This devlog so that I log my hours and I will be posting another one soon."}, {"post_id": 31017, "ts": "2026-07-19T02:30:11Z", "hours": 9.0, "text": "Chess game updates Today, I made some decent functionality changes. It took very long because I couldn’t figure it out for a while because I had to do research on how to, but I figured out how to do the en passant, threefold repetition, and 50 move rule by updating the JS. I also fixed the previous issue where when the player is in check by another, they can’t block it with another piece, even if they should be able to. I was also able to fix this issue as well. Unfortunately, the logic of JS I made for the en passant, threefold repetition and 50 move rule introduced a new problem of erasing any piece that can be taken. For example, if a pawn is able to take another and I click on that pawn to see its possible moves, and then click on another piece, the opposing pawn disappears. I didn’t have enough time to fix the issue and will be working on it another time."}, {"post_id": 30466, "ts": "2026-07-18T01:40:46Z", "hours": 12.0, "text": "Chess game Update BIG I did a lot of work today in my chess engine. I had a lot of time and I was able to do a decent bit of research and use AI to find resources on making an old video game/arcade style design to the game board. Because of this, I spent a lot of time on CSS and JS, coding to fix the prior issues in my code as well as making changes so that it looks as good as it can. Firstly, the pieces can finally be moved only where they should. Before, any piece could move anywhere by clicking the square, unless it was already occupied. Now I fixed the javascript code so that the code checks if that piece can legally move there and stops it otherwise. I also added the ability to castle for both black and white for more functionality. In addition, I also made the resign feature work for both black and white, as it changes who has the ability to resign based on if the current turn is White’s or Black’s. If it is white, for example, the resign button will say Resign (White) so white loses and black wins, and vice versa. Because the game already has so much code on checking pieces and their positions, I figured I could also add a list on the side that says which pieces have been moved so far. I didn’t exactly how to put it in algebric notation so after researching, I had the idea of basically taking the position of the piece’s sqaure, then use javascript to convert into the grid number, and then add the letters in front if the piece moved is any piece other than a pawn. The list also shows castling, checks and checkmates. The board was looking really bland so I did research on ways to make it an arcade/old style like I said before. I first starting to make a scanline on the screen by using CSS and duplicating gradients on the screen. It is very hard to see but it is there. Next, I made the game boxes better by making them seamless when placed next to each other. I also made the hover highlight the boxes instead of making them bigger like before. I also added more diagonal scanlines in them as well. Next, I made as many elements neon to make it bright. As I was making this I also research online that the scroll bar in webpages can be edited. So when the move list is truncated, it shows custom white scroll bars as well. I also found that you can make really cool effects when hovering over buttons, so using CSS I also made the buttons have a horizontal box that goes over to show the animation of the color changing, and I added angled boxes in the back of it that animate and lift, making the button look like its coming up. I will probably add more functionality next time."}, {"post_id": 29649, "ts": "2026-07-16T18:32:03Z", "hours": 5.0, "text": "Chess game Update This is my third update for the chess game. I wanted to add some more functionality to the game with features in more popular chess game engines like Chess.com where it has draw and resign features. I also added a restart game feature since it is single player, but currently there is an issue where the pieces persist at their prior position even though according to the game, they are not there. They button CSS is also not aligned and good compared to the gradient style with the rest of the page, so for the future, I plan on making it one single theme and keeping the page more organized."}, {"post_id": 29265, "ts": "2026-07-16T02:21:42Z", "hours": 5.0, "text": "Chess App Updates Today, I worked on making the app better by making it figure out checks, checkmates, and stalemates. I used AI to understand how to do this, and by using resources online, I also figured out how to input gradients and better CSS functionality for the app to look better. The code for checks and checkmates mainly relies on the JS where it looks at and detects if any legal moves are left for the king to continue in play. I still haven’t added functionality for it to stop pieces from going into positions they shouldn’t be able to. Overall that is the main things I did today."}, {"post_id": 28672, "ts": "2026-07-15T02:11:01Z", "hours": 3.0, "text": "Chess game today I made my first chess game board using this tutorial: https://www.youtube.com/watch?v=SS5amIbX0Mo&list=LL&index=3&t=56s using it I was able to follow along and run the code and use google to understand what each piece of code does to the overall project. Some limits to the project are that the game is able to move the pieces but does not recognize checks or checkmates. I will do more research and try to improve it as much as I can."}]...
|
Title: Chess Game App in Web by @srimaan-gande | S Title: Chess Game App in Web by @srimaan-gande | Stardance
Devlogs:
Chess game today I made my first chess game board using this tutorial: https://www.youtube.com/watch?v=SS5amIbX0Mo&list=LL&index=3&t=56s using it I was able to follow along and run the code and use google to understand what each piece of code does to the overall project. Some limits to the project are that the game is able to move the pieces but does not recognize checks or checkmates. I will do more research and try to improve it as much as I can.
Chess App Updates Today, I worked on making the app better by making it figure out checks, checkmates, and stalemates. I used AI to understand how to do this, and by using resources online, I also figured out how to input gradients and better CSS functionality for the app to look better. The code for checks and checkmates mainly relies on the JS where it looks at and detects if any legal moves are left for the king to continue in play. I still haven’t added functionality for it to stop pieces from going into positions they shouldn’t be able to. Overall that is the main things I did today.
Chess game Update This is my third update for the chess game. I wanted to add some more functionality to the game with features in more popular chess game engines like Chess.com where it has draw and resign features. I also added a restart game feature since it is single player, but currently there is an issue where the pieces persist at their prior position even though according to the game, they are not there. They button CSS is also not aligned and good compared to the gradient style with the rest of the page, so for the future, I plan on making it one single theme and keeping the page more organized.
Chess game Update BIG I did a lot of work today in my chess engine. I had a lot of time and I was able to do a decent bit of research and use AI to find resources on making an old video game/arcade style design to the game board. Because of this, I spent a lot of time on CSS and JS, coding to fix the prior issues in my code as well as making changes so that it looks as good as it can. Firstly, the pieces can finally be moved only where they should. Before, any piece could move anywhere by clicking the square, unless it was already occupied. Now I fixed the javascript code so that the code checks if that piece can legally move there and stops it otherwise. I also added the ability to castle for both black and white for more functionality. In addition, I also made the resign feature work for both black and white, as it changes who has the ability to resign based on if the current turn is White’s or Black’s. If it is white, for example, the resign button will say Resign (White) so white loses and black wins, and vice versa. Because the game already has so much code on checking pieces and their positions, I figured I could also add a list on the side that says which pieces have been moved so far. I didn’t exactly how to put it in algebric notation so after researching, I had the idea of basically taking the position of the piece’s sqaure, then use javascript to convert into the grid number, and then add the letters in front if the piece moved is any piece other than a pawn. The list also shows castling, checks and checkmates. The board was looking really bland so I did research on ways to make it an arcade/old style like I said before. I first starting to make a scanline on the screen by using CSS and duplicating gradients on the screen. It is very hard to see but it is there. Next, I made the game boxes better by making them seamless when placed next to each other. I also made the hover highlight the boxes instead of making them bigger like before. I also added more diagonal scanlines in them as well. Next, I made as many elements neon to make it bright. As I was making this I also research online that the scroll bar in webpages can be edited. So when the move list is truncated, it shows custom white scroll bars as well. I also found that you can make really cool effects when hovering over buttons, so using CSS I also made the buttons have a horizontal box that goes over to show the animation of the color changing, and I added angled boxes in the back of it that animate and lift, making the button look like its coming up. I will probably add more functionality next time.
Chess game updates Today, I made some decent functionality changes. It took very long because I couldn’t figure it out for a while because I had to do research on how to, but I figured out how to do the en passant, threefold repetition, and 50 move rule by updating the JS. I also fixed the previous issue where when the player is in check by another, they can’t block it with another piece, even if they should be able to. I was also able to fix this issue as well. Unfortunately, the logic of JS I made for the en passant, threefold repetition and 50 move rule introduced a new problem of erasing any piece that can be taken. For example, if a pawn is able to take another and I click on that pawn to see its possible moves, and then click on another piece, the opposing pawn disappears. I didn’t have enough time to fix the issue and will be working on it another time.
Chess game fix So far, I worked on fixing the bug in my code which made my pieces disappear as mentioned last time. I am also currently working on trying to add sound effects to make the game more interesting to play and use. This devlog so that I log my hours and I will be posting another one soon.
Chess game final update before shipping This is my final update for the chess game. In this update I added sound effects and fixed some final issues before shipping.
Chess game update Today I added the insufficient material feature. It took me a while to figure out because I was trying to use formulas and math to make the code analyze if a certain set of pieces can lead to a checkmate, but I realized that instead of calculating, I can just find which combinations of pieces cannot lead to checkmate, and then list those pieces in the code for the game to constantly check, and then determine if its a stalemate/draw. Below is the combinations of pieces that cannot lead to a checkmate that my code checks and accounts for: King vs King King + Bishop vs King King + Knight vs King King + Bishop vs King + Bishop (same color squares)
Chess game fix quick For some reason King + Knight VS King was not working from my last update, which was because I did not properly edit the code. I have fixed the issue and that should be working now. This devlog isn’t major or an update but just a fix.
Chess game update I am currently working on building a bot you can play against. It is very tough to find another person to play with especially on the same screen/device so this could fix that issue very easily. The bot will be stockfish and make moves for either black or white. For now, I will code it just for black and make it for white later. This devlog is for me to log my hours, but the bot is nearly finished and will take me a little more time. This also introduces the need to switch from white to black, so in the future I will be adding that feature as well.
Chess Game update - Stockfish Engine Yesterday I started working on a stockfish engine for my game. I finished it today and it has some very strong features. You can now play in 3 modes: PvP PvE (Player plays as white) PvE (Player plays as Black) I used the LiChess stockfish engine to complete this part of the project (Link to release: https://github.com/lichess-org/stockfish.js/releases/tag/ddugovic-250718 ) The engine has all the features to calculate the best moves and complete them. To make it easier, I added a level system from 1-20 so that the bot is easier or harder to beat, but after testing, I found that the bot takes longer to respond with a move when its at level 20 and is still very smart and powerful at level 1. I think I may have integrated the engine incorrectly when connecting it to my current project, so in my next update, I will be fixing this issue.
Chess game update I am currently trying to fix some issues when implementing the stockfish engine as it is too strong at level 1. This is proving to be a big challenge but I will be able to complete it soon. While doing so, I also thought of improving some functionality and I have added a feature to flip the board. This feature also has a lot of issues and both will most likely be fixed in the next devlog.
Chess game update - more functionality I have spent this time fixing the numerous issues that came with flipping the board, including deleting the pieces, changing their positions, making the move list somehow go into the negatives, and more I didn’t even notice but the console did. I had to perform a git restore to remove the changes and recode the entire thing again. It did workout and now it works well.
Chess game update - functionality I added a game clock (10 mins for now) and the take back move button. These are just functionality changes not anything major. it took a while because I also had to figure out how to make the clocks go around after the board was flipped so it was taking a long time for that. Also the game now has to read the move list and revert changes to the board for the move back so that also took long. I need to fix some issues with the clock, something I am working on now.
Chess game update Loading and saving games is now a feature as well. The app will export a JSON file containing data of the match, including time left for both sides, which pieces are still on the board, and the movelist as well. In addition, I have fixed bugs with the take back button, where it was removing pieces from the board entirely. I will focus on addition promotion tomorrow as I haven’t done that yet.
Chess update - bug fixes and initial work on Auto saving I used my time today to just update some other features that had bugs that I haven’t fixed yet, like the clock sometimes doesn’t work between turns. I also started working on Auto Saving so that the game saves in local storage so you could resume later, but it isn’t looking very good right now because I messed with the wrong code and the entire thing broke. I need to fix that tomorrow but overall this was a mostly successful use of time.
Chess game updates I recently got my first ship rated and I understood what mistakes I made and what I needed to fix. I understood that even though the game was well made in terms of how it works, it wasn’t user friendly and the theme made it harder to see. Thanks to all who helped give feedback for this, and my first change is to make the pieces actual vectors. This was an issue all of the users pointed out, so I hope this fixes at least one of the problems. I will continue moving forward with this in mind, and I am currently working on my other changes as well. (This is the only one that properly is working so I wrote about it)
Chess game update This is a major advancement in my pawn promotion mechanics. Since yesterday I have been working on pawn promotion, and I figured the best way could be a sort of dial. As you can see in the picture, this is what the dial will look like when trying to promote, and when clicking on one of the pieces, that piece will be selected. Super simple is what I thought at first, but it was much worse than that. Building the dial was an utter pain. The CSS features kept making it into a square that was twisted where it connected to all the sides where the sections split. The center was supposed to be hollow, but I am still unsure on its main use, so I kept it solid for now. The promotion works, but 2 main issues arise. Firstly, if I click out of promotion dial, it ends my turn without me doing anything. So I don’t even get to make a move at all. Secondly, if I click any of the pieces, it is still my turn for some reason. I believe the issue is that my JS counts clicking a legal square to move to as the end of my turn, which is why it is doing this. I will fix the rest tomorrow as I believe taking time to rest might help me think of a solution.
Chess update - Promotion! I finished the promotion code today! Although I have mentioned it before, here is a summary of how it works. You go to the end, and a dial with 4 pieces appears. Choose yours and you will become that piece. I fixed the issue with the turn ending at the wrong time as well, which is good. But when doing this, I ran into a couple problems. Firstly, the game didn’t count any pieces taken for my pawn to promote. For example, if a white pawn was on g7 and a black rook on h8, the pawn should have the ability to take the rook and promote on the white turn. Although this happens visually, the game counts the rook as still alive. This is an issue I am currently working on right now.
Chess progress I am currently working on more functionality abilities and fixing some newfound bugs in the code. I don’t want to spoil just yet but I really liked the dial for the promotion, so I want to build on that feature with everything else. I understand this will be a difficult task, but by doing this, I can make the app much more functional! (I am currently coding the JS so I don’t have any good pictures to show so here is the old pic) Like I said, tomorrow I will have something good to show!
Chess game update As mentioned yesterday, I was working on a fairly new update. This time, I took the code for the dial for promotion, and replicated it to make a small menu that fits all of the commands of the following: Resigning Offering a Draw Restarting the game Flipping Board Move takeback (center button) For some reason, the move takeback button also doesn’t work, so I plan on fixing that as well as making the CSS better. I realized that the whole design isn’t as user friendly, and I kind of just did whatever I could to fit the theme, and that takes away from the goal of proper UI. I really like duolingo’s style of buttons and UI, so I will try to replication it in my own way if possible. This obviously will take a long time, so I am guessing this update will finish in 2-3 days optimistically. Btw link to project if you want to test: https://tutugoy.github.io/chess-game-app/
Chess game - CSS Update Today, i removed all the arcade themed CSS. This includes: The game board The font The scanlines (that nobody could rly see) The scanlines on each game board slot (also which nobody could see) The grey and white board color The glow effect on everything So right now, its pretty bare. I do want to note that the promotion dial and the menu are not working properly right now because I removed some CSS. I will fix that tmrw. I am also currently working on making ideas for the duolingo slab design theme, and it will prob include interactive buttons and overall better scheme.
Chess game update - mood bar This is yesterdays update because I forgot to post, but this time, I reverted my changes back to the arcade CSS because the menu and promotion wasn’t working correctly, and so I thought going element by element might be more efficient and easier for me to catch bugs. This update adds new button CSS that is sort of like Duolingo’s buttons, but I found some on Uiverse that I liked which I used. ( https://uiverse.io/snooka1/soft-quail-12 ). I also found a range slider on FreeFrontend.com ( https://freefrontend.com/css-range-sliders/ , called Neumorphism - Range Slider) that I modified to keep a face on the top for the difficulty, and then also made a bar behind it with the same color turning from green to red as it increases. I plan on making more changes to the overall CSS today as well.
Chess game update I am posting this devlog to save my time that I worked on. I don’t have anything major to report, because currently, I am changing the CSS on the board, and mainly fixed issues related to the buttons and the mood bar because I didn’t connect them properly to the rest of the menu. But with this devlog, I also want to share my idea of what the game will be in the future. Chess is a basic game that anyone can make, so my plan is to make it into an actual single player game . With this, there will be a storyline of sorts, with bosses, quests, and more (similar to the Super Mario deluxe game). My main doubt is should I make it into a game like this and keep the same chess aspect, or if I should I add more modifications, like powerups or smth.
Ships:
Javascript Chess Game Credit: Abdul at THE SOLUTION HUB A fully-featured chess game built with vanilla JavaScript, jQuery, and CSS. Features complete standard chess rules plus advanced tournament rules. Features Implemented Core Chess Rules Standard piece movement : King, Queen, Rook, Bishop, Knight, Pawn Capture mechanics : Standard captures with algebraic notation (e.g., exd5 , Nxf3 ) Check detection : Real-time check status display Checkmate detection : Automatic game end with # notation Stalemate detection : Draw when no legal moves and not in check Castling : Kingside (O-O) and Queenside (O-O-O) with full validation King and rook must not have moved Path must be clear King cannot be in, move through, or end in check Pawn promotion : Automatic queen promotion on 8th/1st rank Advanced Rules En Passant : Capture pawn that moved two squares Visual highlight of en passant target square Correct capture mechanics (removes pawn from adjacent rank) Only available immediately after opponent’s double-move Threefold Repetition : Automatic draw detection Tracks full position including castling rights and en passant Draws when same position occurs 3 times Alert notification on draw Fifty-Move Rule : Automatic draw detection Half-move clock resets on pawn moves and captures Draws after 100 half-moves (50 full moves) without progress Alert notification on draw Draw by Agreement : “Offer Draw” button with confirmation Resignation : “Resign” button with confirmation dialog Visual Design (8-bit/Arcade Theme) Fonts : Press Start 2P (headers) + VT323 (monospace) CRT scanline overlay : Subtle horizontal lines Vignette effect : Darkened edges Pixel-perfect borders : 2px solid with inset shadows Neon glow effects : White/amber/red text shadows Hover animations : Scale + glow on squares Valid move pulse : Animated glow on legal destinations Custom scrollbars : Arcade-styled for move list Game over modal : Alert dialogs for checkmate/stalemate/draw User Interface Objects Turn display : “It’s White’s Turn!” / “It’s Black’s Turn” Status display : CHECK, CHECKMATE, STALEMATE, DRAW states with pulsing animations Move list panel : Side panel with numbered moves Control buttons : Restart, Offer Draw, Resign Responsive layout : Flexbox side-by-side (board + move list) Rank/file labels : 1-8 and a-h with grid positioning Controls Click piece → Select (shows legal moves) Click highlighted square → Move piece Click own piece → Switch selection Restart Game → Reset to initial position Offer Draw → Propose draw to opponent Resign → Concede the game...
|
1792882071.2105198
|
1793746071.2105198
|
|
10356
|
Comet Programming Language by @SpookyDervish | Sta Comet Programming Language by @SpookyDervish | Stardance...
|
SpookyDervish
|
1
|
192.82
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-10T00:29:49Z", "hours": 95.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Comet is in a mostly stable state and ready for people to use! I’ve written a large amount of documentation for the syntax itself, however, Comet is a lower-level programming language and not written for absolute beginner programmers. Please report any bugs on the “Issues” page of the Github/Chookspace repository!", "repo": "https://chookspace.com/Comet/Comet", "demo": "https://chsp.au/Comet/Comet/downloads.html"}]...
|
[{"post_id": 75051, "ts": "202 [{"post_id": 75051, "ts": "2026-09-29T00:28:39Z", "hours": 90.8728, "text": "Rewriting in Rust"}, {"post_id": 26285, "ts": "2026-07-11T00:06:25Z", "hours": 6.9497, "text": "Optimizing Compiler | Devlog #03 New Features ───────────────────────────────────────── Hello again! I’ve turned Comet into an optimizing compiler! So far we don’t have much, but Comet now has constant folding and constant propagation. But what does that actually mean? “Constant Folding” Constant folding means we look through the code for any math expressions or other things of the like. If there are any constants in the math expression, then we can replace the expression with what it will equal. For example: int x = ( 2 + 3 ) * ( 4 + 5 ) The constant folder will see (2+3), and because the expression only has constants it will replace it with 5 int x = 5 * ( 4 + 5 ) The constant folder then sees (4+5), and replaces it with 9. int x = 5 * 9 And finally it sees 5 * 9 and replaces it with 45. int x = 45 We’ve turned a 7 instruction expression into 1 instruction! “Constant Propogation” Constant propogation means that if a variable stays a value that the compiler knows throughout the variable’s lifetime, then we can replace all instances of that variable with its value. For example: int x = 2 + 3 int y = x + 3 * 2 Constant folding runs and we get int x = 5 int y = x + 6 x is a compile time constant now, and because it never stops being a constant, we can replace all values of x with 5. int x = 5 int y = 5 + 6 See how we can now run constant folding again now that we have more information? This is why compilers run optimizations over and over, until the code doesn’t change anymore. Bug Fixes ───────────────────────────────────────── Along with adding an optimizer, I’ve fixed a large bug Return statements are automatically added to functions now! Before, if you didn’t add a return statement, your function could go past where it should’ve been, crashing your program and possibly even running code it shouldn’t. That is now fixed. Comet also throws an error if you don’t include a return statement in a non-void function. Docs ───────────────────────────────────────── Finally, I’ve extended the docs on the Comet website. It previously only have information on everything up to loops, but now includes info on structs and arrays. That’s all from me, see you next time!"}, {"post_id": 25598, "ts": "2026-07-09T23:20:09Z", "hours": 3.9903, "text": "Sockets in Comet | Devlog #02 External Library Updates ───────────────────────────────────────── External libraries now have the ability to define enums. With this, I’ve begun work on a socket library for fun. Socket External Lib ───────────────────────────────────────── In the screenshot I’ve included, I’ve got a very tiny client and server example set up where the server waits for a single connection, and then prints out what the connection sent. I’ve got the core functions done but I’m gonna add more methods like readExact, readAll, those kinds of methods that just make your life a bit easier. Bug Fixes ───────────────────────────────────────── With the help of a friend, I’ve fixed a number of bugs. I also got cometc and comet to compile without any warnings, which is nice. Some bugs where: A lexer issue where trying to access a field from a list access would be incorrectly seen as a decimal number unless you added a space. Type checking on arrays was extremely strict and so I’ve lessened it so that arrays are usable See you next time!"}, {"post_id": 23866, "ts": "2026-07-07T01:45:34Z", "hours": 91.2869, "text": "Devlog #1 - Core of Comet is done What I currently have I’ve got generics, arrays, structs, inheritance, external library support, a package manager, exceptions, loops, enums, and everything else working. My next steps are writing some of the standard library in C, after I get the language to a usable state I’m planning to bootstrap it! What I did since I created the project When I created this project on Stardance I had already begun working on it before the competition started. I think I had already spent around 100 hours on the project. The project was originally written in LLVM, however, LLVM was quite difficult to get working, and I wanted to make progress rather than be stuck fighting with a slow piece of junk. So I decided to rewrite the entire compiler. I created a VM and decided that the VM would be my compilation target. This made things such as exceptions possible because I would not have to worry about stack unwinding and other very complicated and difficult things. I’ve made a huge amount of progress since then, and have gotten exceptions, external libraries, generics and structs, as well as arrays working since I created this project. I must admit, I forgot about the devlogs until now and so this is why I’m so far ahead and creating my first devlog only now. :P I’ll make sure to keep you guys updated though, see you soon once I get a socket running!"}]...
|
Title: Comet Programming Language by @SpookyDervis Title: Comet Programming Language by @SpookyDervish | Stardance
Devlogs:
Devlog #1 - Core of Comet is done What I currently have I’ve got generics, arrays, structs, inheritance, external library support, a package manager, exceptions, loops, enums, and everything else working. My next steps are writing some of the standard library in C, after I get the language to a usable state I’m planning to bootstrap it! What I did since I created the project When I created this project on Stardance I had already begun working on it before the competition started. I think I had already spent around 100 hours on the project. The project was originally written in LLVM, however, LLVM was quite difficult to get working, and I wanted to make progress rather than be stuck fighting with a slow piece of junk. So I decided to rewrite the entire compiler. I created a VM and decided that the VM would be my compilation target. This made things such as exceptions possible because I would not have to worry about stack unwinding and other very complicated and difficult things. I’ve made a huge amount of progress since then, and have gotten exceptions, external libraries, generics and structs, as well as arrays working since I created this project. I must admit, I forgot about the devlogs until now and so this is why I’m so far ahead and creating my first devlog only now. :P I’ll make sure to keep you guys updated though, see you soon once I get a socket running!
Sockets in Comet | Devlog #02 External Library Updates ───────────────────────────────────────── External libraries now have the ability to define enums. With this, I’ve begun work on a socket library for fun. Socket External Lib ───────────────────────────────────────── In the screenshot I’ve included, I’ve got a very tiny client and server example set up where the server waits for a single connection, and then prints out what the connection sent. I’ve got the core functions done but I’m gonna add more methods like readExact, readAll, those kinds of methods that just make your life a bit easier. Bug Fixes ───────────────────────────────────────── With the help of a friend, I’ve fixed a number of bugs. I also got cometc and comet to compile without any warnings, which is nice. Some bugs where: A lexer issue where trying to access a field from a list access would be incorrectly seen as a decimal number unless you added a space. Type checking on arrays was extremely strict and so I’ve lessened it so that arrays are usable See you next time!
Optimizing Compiler | Devlog #03 New Features ───────────────────────────────────────── Hello again! I’ve turned Comet into an optimizing compiler! So far we don’t have much, but Comet now has constant folding and constant propagation. But what does that actually mean? “Constant Folding” Constant folding means we look through the code for any math expressions or other things of the like. If there are any constants in the math expression, then we can replace the expression with what it will equal. For example: int x = ( 2 + 3 ) * ( 4 + 5 ) The constant folder will see (2+3), and because the expression only has constants it will replace it with 5 int x = 5 * ( 4 + 5 ) The constant folder then sees (4+5), and replaces it with 9. int x = 5 * 9 And finally it sees 5 * 9 and replaces it with 45. int x = 45 We’ve turned a 7 instruction expression into 1 instruction! “Constant Propogation” Constant propogation means that if a variable stays a value that the compiler knows throughout the variable’s lifetime, then we can replace all instances of that variable with its value. For example: int x = 2 + 3 int y = x + 3 * 2 Constant folding runs and we get int x = 5 int y = x + 6 x is a compile time constant now, and because it never stops being a constant, we can replace all values of x with 5. int x = 5 int y = 5 + 6 See how we can now run constant folding again now that we have more information? This is why compilers run optimizations over and over, until the code doesn’t change anymore. Bug Fixes ───────────────────────────────────────── Along with adding an optimizer, I’ve fixed a large bug Return statements are automatically added to functions now! Before, if you didn’t add a return statement, your function could go past where it should’ve been, crashing your program and possibly even running code it shouldn’t. That is now fixed. Comet also throws an error if you don’t include a return statement in a non-void function. Docs ───────────────────────────────────────── Finally, I’ve extended the docs on the Comet website. It previously only have information on everything up to loops, but now includes info on structs and arrays. That’s all from me, see you next time!
Rewriting in Rust
Ships:
Comet is in a mostly stable state and ready for people to use! I’ve written a large amount of documentation for the syntax itself, however, Comet is a lower-level programming language and not written for absolute beginner programmers. Please report any bugs on the “Issues” page of the Github/Chookspace repository!...
|
1792835811.0777836
|
1792922211.0777836
|
|
10129
|
reMDer by @Keyboard1000n17 | Stardance
|
Keyboard1000n17
|
0
|
197.03
|
0
|
[]
|
[{"post_id": 71282, "ts": "202 [{"post_id": 71282, "ts": "2026-09-20T16:00:28Z", "hours": 25.7911, "text": "last devlog this is my last devlog the project isn’t complete and i won’t be shipping it. you see, i was banned for 2 months for misconduct on slack (i will not provide details here but i deserved it, it was corny anyway), and as part of that ban, i can’t participate in any events, including stardance. in this time however, i’ve done a lot. there’s now spinners for images, proper tables, and so many more improvements. keep your eyes peeled for a release on the github ! 👀 also it doesn’t matter that this devlog is 15 hours over the limit, its not like i can do anything about it. also if one of you regulars in #stardance see this, can you please ask amber if i can have my sticky streak rewards? i really want the stickers and plushie Changelog ( 446103b ) Render details elements properly again ( f527e5d ) Better logs, align images in row when a paragraph contains only images ( 3df2f59 ) Make task list function use TextChunk over ANSI escapes ( 2367089 ) Add proper tables ( 47c2b42 ) Add aligning components ( 00785d7 ) Move from Chalk/ANSI escapes to OpenTUI StyledText for styles ( 429e4b6 ) Load images lazily with spinner while loading ( a993197 ) Use OpenTUI ImageRenderable for images in renderer ( aa96067 ) Improve types and error handling, work on image bug ( b54ad43 ) Revert “Add footnote plugin (usage WIP) (errors on run)”"}, {"post_id": 64726, "ts": "2026-09-09T11:11:17Z", "hours": 6.0719, "text": "scroll one line at a time, render div and details elements not very big news here, but now you can: scroll just one line at a time instead of a whole renderable/element at once render div and details properly! now you can click on a details element to open and close it! this didn’t even take too long more technical, but i switched to mostly using the opentui renderable api which uses classes like TextRenderable or BoxRenderable that return a Renderable instance instead of functions like Text and Box which return a ProxiedVNode<T> . this is mostly because there’s a bunch of things a Renderable has that a ProxiedVNode doesn’t anyways im currently working on adding footnotes, so see you in a few days Changelog ( 64f6ed8 ) Add footnote plugin (usage WIP) (errors on run) ( ddd5c46 ) Add indicators to details elements and opening on click/space/enter ( 344806a ) Add support for rendering div and details elements ( d3b4a1d ) Fix small layout issues ( 5eb11b9 ) Scroll only one line at a time and convert (mostly) to Renderable API"}, {"post_id": 62808, "ts": "2026-09-06T10:22:48Z", "hours": 10.2442, "text": "table of contents feature is done! took only 10 hours, but im done with the table of contents thing! you can press shift+j to go down to the next heading, and i forgot to add shift+k 😭 anyway this took a while since i couldn’t figure out how to position the box properly and how to style it. this was fucking ass icl. i usually have much more to talk about but this wasn’t the most fun so here’s the commits: Changelog ( 5ccec11 ) Remove unnecessary focusing ToC ( 927cae9 ) Add tab cycling ( ae72d3d ) Scroll ToC menu to selected index instead of blindly 1 down ( 249d61a ) Implement scrolling ToC on pressing J ( a2ae0f2 ) Get table of contents feature working ( a6c7744 ) Add scrolling to next heading on pressing J ( 49f8fec ) Add “? - Help” hint to end of bottom bar"}, {"post_id": 60445, "ts": "2026-09-02T19:38:19Z", "hours": 10.6467, "text": "figlet headings, small headings, bottom bar, help menu and keybinds we’ve got a lot of new stuff! firstly we’ve got a bottom bar! all it does for now is show reMDer with a green bg and the file name next to it, but i’ll add more later! next we’ve got figlet headings! at the start i was thinking about using figlet for headings but i gave up on that. but now, i’m back to using it! this took a good chunk of the overflowing hours here but they look really cool too! passing a --no-render-headings or -H flag will make the headings render as normal text with colors instead of figlet fonts now! there’s now a tiny help menu in the corner! it only shows two keybinds right now–oh and speaking of keybinds… keybindings are now in ! for now you can press q to quit, ? to toggle the help menu, and C (shift+c) to open the console in debug mode and that’s about it next steps? here’s what i’m gonna do next: add support for horizontal rules add a table of contents feature like that of the leaf markdown viewer add some stuff to the bottom bar add an option to put the bottom bar at the top instead add support for a config file using YAML Changelog ( 9557586 ) Add help menu ( a4149e2 ) Add keybinds: q to quit, C to toggle console ( 4b18153 ) Finish figlet fonts support ( d23466d ) Start trying figlet again for ASCII art ( 33d52ea ) Start working on ASCII art for h2 headings ( b0e1668 ) Add option to not print big headings ( c58369c ) Start with bottom bar"}, {"post_id": 56522, "ts": "2026-08-28T10:01:31Z", "hours": 7.42, "text": "code blocks, alerts, emojis and task lists! we’ve got loads of new cool stuff that get rendered now! first, github alerts/callouts now render nicely! they look like this: > [!TAG] > content where TAG can be NOTE , IMPORTANT , TIP , WARNING or CAUTION . they also have these cool icons next to them, but the catch is you need a nerd font for it. i’ll add an option to not need it and only use ascii characters next, we have highlighted code blocks! the renderer can highlight hundreds of languages using shiki ! you might not even have heard of some of the languages that it can highlight! imo its really nice looking and i love it! the bulk of this time came from adding support for task list items because i couldn’t figure out how to do it. eventually after some tinkering i’ve got it to work! it looks kinda cool too tbh i also got emoji support using an extension. it automatically converts :emoji: to the corresponding emoji if its in the unicode specification. finally, i added a simple height option that just sets the height of the renderer. it allows you to set the height of the renderer manually and that’s about it lmao Changelog ( b4f69ad ) Add height option ( beea3a6 ) Add task list items support ( 4c42c84 ) Add emoji support ( 564a761 ) Upgrade markdown-it, fix breaking changes ( 963d910 ) Add alerts support ( 5e266e8 ) Add icons in code blocks ( 0bf0af7 ) Add code block support"}, {"post_id": 54062, "ts": "2026-08-24T20:36:45Z", "hours": 4.4367, "text": "holy fuck, you can pipe into stdin and tables render properly! while this is quite out of schedule (i usually post every 2-3 days), today brings some peak stuff! the peakest part is at the end firstly, i have in fact fixed tables! the issue was i was pushing the accumulated cells array to the rows array in the wrong loop. i was doing this in the loop that iterates over the cells in a row, so it was causing it to repeatedly push the same strings over and over. the fix was putting it in the loop just outside, that is, the loop that iterates over the rows in the table token! i’ve also improved the image handling! now Image classes have the buffer property renamed to content , and has a new property called properties , which is always {} . with this, it has all the properties of ProcessedToken , so my lsp won’t complain that some property doesn’t exist on Image speaking of ProcessedToken , its now an interface instead of a type. there’s also a new TableToken interface that extends ProcessedToken , with an alignment property. this makes it a bit easier to handle tables since the content property is narrowed. also, it seems like opentui’s tables don’t support alignment, so i might have to make a custom table function. i also upgraded opentui from 0.5.7 to 0.5.8! i have no idea what changed, but whatever i’ve also stopped using chalk to color my errors since the opentui console doesn’t support ansi now the peakest part is you can pipe markdown into the program . this is pretty peak and you must agree since there’s a lot of stuff you can do with this. for example, you could render arbitrary markdown without having to create a file first! it has a limitation though: if you’re on windows, you can’t use the interactive mode, and the rendered content is forced to print to stdout. this is because of a bug with bun. if you’re piping into the program, it’ll get the input by calling await Bun.stdin.text() , but this stops sending keypresses to opentui because of a bug in the bun runtime, so you can’t scroll down. i solved this issue (or rather, chatgpt solved this issue) by opening a read stream on /dev/tty . the issue with this is that /dev/tty doesn’t exist on windows since its not unix-like. my idea was to just, not let you do interactive mode on windows if you’re piping content to it. again, this is a bug with bun, and i’ll remove this limitation once one of the two is merged. that’s right, there’s two! here’s one for reference: https://github.com/oven-sh/bun/pull/32153 shit that was long Changelog ( dd07e14 ) Upgrade packages ( 77e6d34 ) Add support for piping into renderer.ts from stdin ( 1995f45 ) Improve image and ANSI handling, stop using chalk in errors ( 22cfacd ) Improve table handling, switch some types to interfaces pls like"}, {"post_id": 53181, "ts": "2026-08-23T16:52:59Z", "hours": 9.7842, "text": "better types. debug mode and stdout! from my last devlog: next up: code blocks (~2-4 hours) fixes to table rendering (<30 mins) fix image handling (it doesn’t handle relative paths correctly) (<1hr?) of these, i’ve done none! what i have done though is add flags and types! i spent a while dealing with type errors because i decided to specify types instead of just putting any on ProcessedToken.content . i also added a debug flag, but literally all it does is show the console i also fixed the width thing, so the content is only as wide as the space you give it so cooll!! the main part of this is that i added a --print-to-stdout flag that just prints the formatted markdown to stdout! you can just scroll in your terminal instead of having a whole ass tui its kinda borked and incomplete though, so i’ll fix it up! it does print some garbage at the beginning so that’s not great anyways, i’d better do what i said i’ll do last devlog! i went off track for this lmao Changelog ( b1c0489 ) Implement half-baked print to stdout option ( aa3c029 ) Add debug flag, fix logic errors ( aa33e84 ) Specify types for ProcessedToken.content instead of any"}, {"post_id": 51600, "ts": "2026-08-21T11:25:29Z", "hours": 8.0094, "text": "(back to) opentui! if you’ve read my last devlog, you might remember that i was considering the jsvision library. however, i came back to opentui because its still much simpler. also, i found that there are libs to adapt ansi! or at least chatgpt did at first i was doing ghostty-opentui , but i realized after some time that it was literally a whole terminal. then i got chatgpt to find me this package called ansi-sequence-parser ( https://www.npmjs.com/package/ansi-sequence-parser ) and its perfect! so now im using that to render the bold and italics! tbh i could just eliminate the middle stage ( stylize.ts ), but i put a lot of work into it and i’m extremely vulnerable to the sunken cost fallacy, so i’m doing this bloat lmao. also, i got ordered lists, bullet lists, and blockquotes working! they look so cool! as for the menu, its not doing very fine, but that’s because i’ve not worked on it! i’ll get to it, don’t worry! next up: code blocks (~2-4 hours) fixes to table rendering (<30 mins) fix image handling (it doesn’t handle relative paths correctly) (<1hr?) Changelog ( 8b44667 ) Add blockquotes and 1 row bottom margin to second-level renderables ( 3e5182f ) Add oredered list handling ( d997aff ) Switch back to OpenTUI, get things working"}, {"post_id": 49847, "ts": "2026-08-18T19:57:55Z", "hours": 8.505, "text": "generational fuck up well i’ve messed up big time, sunken cost fallacy is real and it got me you see, i was using opentui earlier, but i decided to change because i realized that it doesn’t support ansi escape sequences. i landed on neo-neo-blessed , and it seemed cool, until i realized the list selection thing got fucked up because it didn’t handle scrolling list options with heights greater than 1 row properly which is a deal breaker. i also spent a lot of time patching its types, in fact that’s what most of this time went to i think i’ll use jsvision. it seems interesting and i’ve got nothing to lose. the only issue is it has one maintainer and 9 stars, but gpt found it, and it seems cool. also they have demos of the unmodified lib running in the browser which i wanted to do, so this will be fun Changelog ( 33e1c91 ) Start using neo-neo-blessed and do a generational fuck up"}, {"post_id": 47449, "ts": "2026-08-15T11:47:19Z", "hours": 9.8211, "text": "TUI! i’ve got news: the TUI renders! for this tui, im using opentui! right now, the tui only shows an interactive list of files, and its supposed to render the file content if you select one, but that’s not happening right now. i’ve been working on the function to make opentui render the markdown. while opentui does have its own thing for markdown rendering ( ), i’m gonna render my own markdown. im currently trying to get tables working! Changelog ( c8ab716 ) Work further on rendering, start with rendering tables ( dc8b0be ) Start using OpenTUI for rendering TUI ( 86347cf ) Render unknown HTML correctly (without showing tags)"}, {"post_id": 44744, "ts": "2026-08-10T18:22:19Z", "hours": 2.7394, "text": "it works holy shit it works, the problem was that i was running a function but i wasn’t putting it in a console.log . the test function for reference returned a string. also, unknown tags are handled somewhat properly. i need to actually fix that, but once i do, im gonna start on the tui!! its been 96+ hours now what a crazy thing, i expected this to take 10-20 hours and now look at this… anyways, i’ll go fix the unknown tag thing! after that i’ll start working on the tui Changelog ( c1461c3 ) Get unknown HTML tags rendering"}, {"post_id": 43978, "ts": "2026-08-09T13:44:03Z", "hours": 10.3797, "text": "headings! unknown tag handling (that doesn’t work)! well we’ve got some nice stuff now! here’s a list of everything, including problems!: just whitespace? no more! : tokens that are just whitespace get omitted typescript lsp doesn’t complain : oh my god finally that was so annoying what’s this tag? : if it doesn’t have a handler, it falls back to the default, that is, it turns into a string! this doesn’t work properly though, i have to fix this ching chong ruby tags : now ruby tags are supported! is that a highlighter? : mark elements are now supported, which just put a yellow bg on some text is this a block element or not? : now the renderer can tell by looking at a token’s block property proper heading rendering?!?!? : chatgpt wrote the entirety of this part because you cannot bother me to make an efficient function that wraps giant text art letters based on width where’s the inline code? : that’s right, it doesn’t work and gets completely omitted! Changelog ( 456161f ) Trim content, add boolean property ( 07da8a6 ) Add handlers type to make the LSP shut up, trim strings in test file ( b4d251c ) Add handling for unknown tags ( d903b48 ) Add support for dfn , samp , ruby tags ( 813d934 ) Fix code to stop TypeScript ( vtsls lsp) warnings"}, {"post_id": 40582, "ts": "2026-08-04T07:04:35Z", "hours": 9.9967, "text": "typescript! i’ve moved to typescript, cleaned up some code, finished that image function from last devlog, and upgraded packages! finished the image function : now it works perfectly! upgraded packages : shiki was upgraded! its the code coloring package btw added a test : i can’t keep pressing the arrow keys in bun repl i have to do this moved to typescript : this is the main thing. devs on discord kept telling me to use and i said i’d do it soon. i wasn’t planning on it at this time, but i did because i got fed up with a stupid bug where i was accidentally setting token types to a boolean instead of a string. that prompted me to just do it™ and now i’m fixing a bunch of bugs! still not sure why the language server is just complaining about cases that can’t happen, but that’s what typescript is for i guess Changelog ( 688afd8 ) Start moving to TypeScript ( ac99373 ) Switch to map for aliases, add test, clean up code ( c62c57b ) Upgrade packages, clean up code ( f98e65c ) Finish revamping image function"}, {"post_id": 38811, "ts": "2026-08-01T11:37:47Z", "hours": 10.2436, "text": "WIP WORK // INCOMPLETE // this was a lot of work, and i’m still not done with html in the stylizer! here’s a list of changes with explanations: add more aliases to the aliases array in the html parsing section: this makes it so that html tokens and markdown tokens have the same types convert the array of allowed html tags into a set : sets have a .has() function that lets us find an element in O(1) time complexity which is much faster compared to Array.prototype.includes() which has an O(n) time complexity properly implement disallowed tags: these tags show as plain text because they are disallowed and shouldn’t be processed in markdown put non-block tokens as children of an inline token: non-block tokens only got parsed in the part where inline tokens were processed set attributes: the objects returned by the stylize function now have a properties key better error handling: now, where it used to just throw an error about being undefined or whatever, it will catch it, and throw a more useful error with better debug info [BUGFIX] make sure that arrays don’t get nested: this was a bug where arrays would get nested for some reason [BUGFIX] set token.level and token.nesting properly when processing html: this is necessary because the while loop depends on the nesting to know when to stop accumulating tokens and process them [WIP] html handling: any tokens having the substring _open in their .type property are handled all together, with a handlers object made up of functions. this handling is recursive token with types that don’t match the substring _open get handled through other branches of the if statement ( else if(...) {..} ) [WIP] bullet list handling: i did not realize that there were more markdown-it tokens that i had not added handling for in the stylize function. i also need to do this for some more token types too [WIP] revamp image handling: instead of just a complicated function, i added a class called Image that has a function to render the image. its nearly complete but it has some errors that i committed because i need to commit often lmao chatpgt usage now here i used chatgpt a lot for debugging. here’s exactly what i used it for: why tokens weren’t being processed: this is the problem the array nesting bugfix fixed fixing infinite recursion: i accidentally did that lmfao replacing top-level non-block tokens with an inline token that contains those top-level non-block tokens as children figuring how to set the level property of the tokens questions about syntax and mutation of global vars Changelog ( 5e931f7 ) Revamp image function (WIP) ( 0ce066f ) Improve error handling and fix token.level assignment ( 0f28b75 ) Process details element in stylizer ( 0e154f3 ) Start improving stylizer (WIP) why such long devlogs? you may have noticed i’ve been going more and more time without devlogging. that’s because i like devlogging when there’s a big new thing, not for every small little thing. my plan for this devlog was to announce that i was done with processing html in the stylize function, but that hasn’t happened yet because well, there were a latta bugs here and there, and i had to fix those too. as for the length of the devlog text, i like writing about my progress here because its the only place where it makes sense to talk about it in-depth"}, {"post_id": 35679, "ts": "2026-07-27T08:45:19Z", "hours": 7.8072, "text": "HTML parsing is now complete its been nearly 2 weeks and i have great news: html parsing is complete what this means is that html blocks get processed into token streams like the one’s markdown-it makes. now, i must clarify that these html blocks were already in a token stream but they were distinctly html, having the type html_block , and if i didn’t convert those html blocks into markdown-it’s _open / _close tokens, i’d have to parse it in the file that styles the tokens, and many html tags do the exact same thing as their markdown counterparts so i could reuse some functions. i must also clarify that i have NOT done anything for stylizing html in the stylize.js file, which deals with processing text formatting and image processing next up: stylizing html! Changelog ( c5a5ce0 ) Finish HTML parsing ( 841ba42 ) Start work on HTML parsing"}, {"post_id": 29515, "ts": "2026-07-16T14:30:25Z", "hours": 1.24, "text": "improvements and fixes to inline rendering this is way earlier than my normal schedule, but that’s because i’ve got something to show . basically, inline rendering was bugged , and not only did i fix it , i also made it so that it works better ! that’s all you need to know, do NOT read the rest of this if you don’t want to be bored to death, its a really lengthy explanation of this the initial bug was that inline rendering wouldn’t work at all. i figured out the problem was that i wasn’t pushing \"inline\" to the state array somewhere. i realized that it wasn’t working when called in the table rendering function, and that was because i wasn’t pushing \"inline\" to the state array. the reason for this is because the renderInline function slices the state array at the index after the \"inline\" string, so if its something like [\"paragraph\", \"inline\", \"bold\", \"italic\"] , the function slices at index 2 because \"inline\" is at index 1, and we get [\"bold\", \"italic\"] . the problem is, if \"inline\" doesn’t exist, running indexOf(\"inline\") returns -1, so it slices at -1 + 1 , which is 0, so its just the whole array. but anything before “inline” isn’t a valid style, and since the function for that is undefined, it goes kaboom and throws an error saying that it’s not a function. also gpt found 5 other bugs but they’re kinda irrelevant the fix was making it so that the renderInline function itself pushed \"inline' to the state array instead of depending on it being already there. this also removed the need for making sure that the inline string was already there. i might do this with the rest of the functions too actually :goonology: also removed unnecessary state.pop() occurrences since the pop method is destructive and can mess up everything as for the improvement, you might see in the first screenshot that there’s a bunch of text tokens together. yk, they could be squished together into one token… oh right, that’s what i did! i changed the renderInline function to make a variable where the text accumulates until there’s no more text or if there’s an image, on which it gets pushed to the contents array now the most important thing is that there’s only one more thing left to do: html rendering . this is the last thing before i get to actually rendering stuff on the screen! this is exciting! Changelog ( 9de477d ) Fix, improve inline rendering please like this took more than an hour to write"}, {"post_id": 29168, "ts": "2026-07-15T21:42:41Z", "hours": 4.2522, "text": "THAT WAS SO LONG WHAT ON EARTH in short, tables now work and the inline rendering function is fixed! this took a while because i genuinely had no idea what i was doing. now the long stuff: tables go brr i got distracted while writing this and realized everything’s actually borked, but tables do somewhat work! its still borked tho– also i realized that my whole code is borked, but… inline rendering includes links now! still have no idea how i missed that other i just changed image function so that it returns an object with a prototype function instead of unnecessarily repeating the function as a property of all the image objects, so if there’s 10 pictures in a file, there will only be one function to render each as opposed to 10 instances of that function Changelog ( d8feb46 ) Add table support, fix inline rendering oh fuck, my code is COMPLETELY borked"}, {"post_id": 27805, "ts": "2026-07-13T17:59:20Z", "hours": 2.5478, "text": "PEAK CODE gng TS IS PEAK!!!! i added a function that renders code AND ITS PEAK JUST SEE THE SS now some of this time came from trying to figure out why my code was joining the contents of a function, and it was because i forgot to add the argument that gave the coloring function (chalk library) the text to color. hey, at least i found a way to read the contents of functions time to go steal code from closed-source packages leaving that aside, my next step is thematic breaks. this shouldn’t be too hard, in fact, i’ll do it rn since it’s that easy. rn its 8:49 PM GMT+0300, i’ll tell in the next paragraph when i finish it. [8:54 PM] just did it, it only took like 2 mins, the other 3 were because i found a bug that never removed codeBlock from the stack after it was added. that’s about it, and this devlog was quite short. well, comparatively, to my other devlogs, after all there’s people posting 4 word devlogs. you should follow this project tho Changelog ( a17bd2b ) Add thematic break support ( e28f1b1 ) Add code block styling"}, {"post_id": 26701, "ts": "2026-07-11T17:20:33Z", "hours": 4.4769, "text": "when the FUCK did this become 4 hours so uhh i spent like all of this time debugging and improving my code. first thing is, i replaced these “microfunctions”, as i call them, with an object that had keys whose values were arrow functions. these arrow functions did the exact same thing and took up less space and was even more readable! second, i spent some time on a stupid bug where the main function in stylize.js would hang. i thought it was an issue with the image function, but after half an hour or so, when i added console.log(done) right before the return, i realized it had to do with the main function that was calling the image function, and sure enough, the second i looked at it, i realized the problem: it was a while loop and i forgot to add a line that incremented the index, so it just kept doing the same thing forever until i killed the process oh well, more hours for me third, i improved (or rather cleaned) my image function. it returns promises and doesn’t use terminal-image directly. instead, i made it so that it would return an object with a bunch of keys, one of which is a function that takes the whole object as an input. this function actually renders the image, since i plan to write the function to display it in a way that deals with image rendering after rendering text, and while the images get rendered, a spinner takes their place temporarily, but the images replace those spinners once they are processed fourth thing is, i made it so that the main function calls the renderInline function instead of the paragraph function. in fact, this paragraph function is completely useless, so i went ahead and removed it too. lastly, i upgraded a bunch of packages: upgraded typescript from version 5 to 5.9.3 upgraded got from version 15.0.7 to 15.1.0 upgraded markdown-it from version 14.2.0 to 14.3.0 upgraded shiki from version 4.3.0 to 4.3.1 if you wonder what these packages are typescript is, well, the typescript language, not sure why i have it, might be a dependency for another package. got is some package that does pretty much the same thing as the default fetch() but it can give me a buffer, which i need for images markdown-it is the markdown parser shiki is for coloring code. fancy, right? Changelog ( 9118913 ) Improve code ( 5b9c953 ) Remove test file ( ab3af08 ) Test image URL parsing on GitHub aight this took me 2 hours to write and i started coding again in the middle of writing this"}, {"post_id": 21475, "ts": "2026-07-03T13:24:58Z", "hours": 5.595, "text": "oof! that was a lot of work, but now we’re REALLY getting somewhere!!! first thing, headings actually work now, and if there’s a link in the heading, it gets displayed right below the heading! tbf i did rip the heading thing straight out of the original index.js file when i was trying to make a markdown parser using regex secondly, and the more important thing, image rendering now works . pretty big milestone. i achieved this through the terminal-image npm package. however, this took a while because i couldn’t figure out why it wouldn’t render. the problem was tmux–it was stripping the codes it didn’t recognise so i implemented another system to detect if the terminal had color and/or image support to decide whether to use ansi blocks or actual images. now, it works! ts so peak fr tl;dr headings work (i ripped them out of my original implementation in index.js ) images work (took me a while because it didn’t work properly in tmux we getting somewhere with this one 🔥 Changelog ( 9941b1b ) Finish image rendering ( 007b3f4 ) Work on image rendering ( 609be18 ) Make heading work"}, {"post_id": 18690, "ts": "2026-06-29T21:31:37Z", "hours": 6.2242, "text": "holy this shit is so long heyo! this is a long one, so i’ll go over this commit by commit ( 0ad2cb2 ) Start paragraph parsing here, i did these: i made a global string state to maintain the nesting while styling. managing this was quite tedious and useless i added a helper function to get the style of a token called getStyle() . i’ll explain the use for it below. i continued working on the heading() and paragraph() functions as well as the stylize() function ( eb218d2 ) Add markdown extensions as for this one, i added a bunch of packages, mostly extensions for markdown-it . these are: markdown-it-footnote markdown-it-github-alerts markdown-it-sanitizer markdown-it-table markdown-it-task-lists shiki (for code highlighting) terminal-image i removed a few of these later because they were either not really working properly or just weren’t necessary. besides these, i also configured the plugin to use the plugins, enable the autolink extension and also replace all HTML line breaks ( <br> ) with double newlines ( \\n\\n ) ( 5ecef2c ) Start working on image rendering and colors/styles now here is where i found a gem in my dependency tree. you see, i was searching for a package to handle color rendering since i sure as hell wasn’t gonna deal with the hex codes shiki , the code-highlighting plugin, was giving me for the colors of the tokens. so i saw a package called chalk and it sounded familiar. turns out, shiki had chalk as a dependency, so it was already installed! for that reason, i added a chalk import in this commit. i also started working on an image function to render images, and named it renderImage() . also added a great error message if two requirements weren’t met: throw new Error ( \" WRONG TOKEN IDIOT DEV \" ); but that was all i really did in that function ( 0dc393d ) Remove unnecessary object processing and dependencies this is where i removed markdown-it-footnote and markdown-it-table because i realized there just wasn’t a point in those since they weren’t letting me test my function, they were erroring out for some reason and i found out markdown-it-table already had support for markdown tables. i also removed the mapping function in the parser stage that i made to give myself only a few fields. it was pretty useless since i kept randomly finding that i’d need some new property. ( 8a5200c ) Continue work on inline parsing, add terminal-link latest commit, this is where i did a lot of work: i removed terminal-image as a dependency since i found that bun already provided a class for it ( Bun.Image ) and it also had webp support unlike terminal-image , so no point in another package when a built-in one works better i made the getStyles() function better i added a bunch of micro-functions like bold() , italic() , etc. i also renamed renderImage() to image() i combined two if statements into one in this image() function because why 2 if statements when 1 i did a lot of work in the renderInline() function. now it uses computed function names that call those micro-functions. i also changed that global string state to a global array, made things much easier. i worked on the heading() and paragraph() functions further that’s about it gng, also its 12:28 am for me rn this is why we devlog more often gng ✌️"}, {"post_id": 17162, "ts": "2026-06-27T21:04:18Z", "hours": 2.7842, "text": "toiling away… toiling away at this code… today was a bunch of stuff i added a renderInline() function to render stuff inline. i still need to add images and links, but i’d need a lib for links, and maybe for the images too i worked more on the main function. right now, im trying to get paragraphs actually rendered, which will take a while. i also added a heading() function that will render headings, emphasis on will because its not being called yet it took me a lot of thinking to get here so that part wasn’t too fun (a person who thinks all the time, has nothing to think about 🔥) changelog ( e24a192 ) Work more on the stylizer ( 1a02163 ) Start actual work on stylizer"}, {"post_id": 16483, "ts": "2026-06-26T20:35:10Z", "hours": 1.5342, "text": "revamp! i revamped the parse-input.js file! now, it has two functions: giveFields(obj) this is a function called by the second function. since markdown-it (the parser im using now!) has a lot of fields that i don’t need. so this function returns a mapped array with the fields type , tag , nesting , content , and children . as for this children field, the children field is an array of objects, where the objects are just like the parent object, with lots of unnecessary fields. for those, i used recursion! (it’s my first time using recursion ) parse(input) : this is the function that i’ll be using to get the tokens i need to style! what it does is pretty simple: initialize a new instance of the MarkdownIt constructor (? i’m not too sure if it’s a constructor) get markdown-it ’s tokens using their parsing function make a constant whose content is an array of objects returned by the first function ( giveFields() if your memory is that terrible). again its a mapped array that gives only select fields from the markdown-it tokens return that constant in other news, i wrote 2 more test markdown files. one tests the behaviour of headings and the other tests the behaviour of inline stuff like bold and italic text! Changelog ( 88bad121 ) Revamp parse-input.js ( 3eda61e5 ) Add more stuff to inlines.md"}, {"post_id": 15772, "ts": "2026-06-25T17:18:25Z", "hours": 2.5692, "text": "FUCK fuck this rewrite, i’m abandoning this shithole of a parser i’m trying to make, i’ll just go use an already existing parser, its just not worth it it’s too much hassle to make an in-house parser, so here’s my plan: i install a markdown parser that returns a tree of text, not html, and as a dependency in the styling part, i’ll go ahead and read the tree of text that the parser returns it gets passed to the renderer hopefully this will move much faster now!"}, {"post_id": 11542, "ts": "2026-06-18T20:48:29Z", "hours": 2.0211, "text": "rewrite i started a rewrite! what i was doing earlier was honestly too messy to actually use. my earlier way was making a bunch of regexes and using those to match the remaining text. my new method is still using regexes, but i split the whole thing into two parts: block parser and inline parser. block parser the block parser splits the markdown doc on newlines and checks what it starts with or ends with. when it finds that some line is not a paragraph, it pushes a token to the tokens array indicating that it is the start of a block. when it detects that the block has ended, it pushes a token to the tokens array indicating the end of the block. this is currently only implemented for headings, more are coming. it took this long because me dumb inline parser the inline parser loops through the existing tokens array made by the block parser and looks for characters that indicate the start of an inline token like bold, italic and so on. like the block parser, it will push start and end tokens to the tokens array the implementation of the inline parser has not started yet new character i added a backslash to the giant block letters i made for headings! Changelog (bac8c5a) Start parser rewrite (664713e) Add backslash in heading"}, {"post_id": 10859, "ts": "2026-06-17T20:14:25Z", "hours": 7.0403, "text": "help me what on god’s green earth is this so after dealing with a shit ton of regex and doing pretty much nothing with it besides some stuff that would improve performance, i have decided that regex is not the way. instead, i’ll just set a bunch of flags with empty content and make a separate function that processes everything. i think the styling function will handle tokens because that’s its job, to style the tokens. at least i have something to follow now. (i did not implement any of this yet) Changelog fc8de72 : Fix some regexes fe6eeef : Change some regexes f67c3b5 : Change matching system in parser 8a80409 : Add some HTML support in lexical parser 0727d82 : Finish lexical parser (almost) b7bc45b : Make lexical parser work"}, {"post_id": 7594, "ts": "2026-06-12T18:16:30Z", "hours": 6.0661, "text": "i got bombed by my own regex anyways, so i started making a lexical parser and uhh its not going all sunshine and rainbows. the blockquote regex doesn’t really work right and also i checked the gfm spec since i want to adhere to it and uhh fuck i might be cooked. i thought ts was going to be a 20h project help meeeeeee also yes it took me 6 hours for 74 lines of code sob this is just great"}, {"post_id": 6452, "ts": "2026-06-10T21:06:48Z", "hours": 1.475, "text": "HEADINGS NOW RENDER! headings now render! as you can see in the screenshot, it now renders the headings as big boys also, me very happy. this took a while because i lowk didn’t know what to really do. i didn’t think about how i would do it, i was only thinking about doing it anyways gn gng"}, {"post_id": 5881, "ts": "2026-06-09T20:48:17Z", "hours": 6.8622, "text": "took only this long to make a bunch of letters you see, i had to make a bunch of custom glyphs to render headings in the terminal. making that for pretty much all the characters on your keyboard isn’t quite easy but hey its done now. the thing is, this is only for level one headings. once i finish the actual parser, i’ll add glyphs for the rest of the headings. in the meantime, i’ll have to do the rest. i did not expect to have spent this long on the project already yk"}, {"post_id": 4481, "ts": "2026-06-07T20:14:04Z", "hours": 0.4414, "text": "a terminal markdown reader that has actual headings? never could have thought of it huh well this is what i’m doing. literally a markdown reader that prints text the way you might have written it. anyways so this is gonna use bun since bun is ultra fast. also this might be a 10-20h proj, shouldn’t be too hard. well i like more hours, so i might also add stuff like: browsing all the markdown files in a directory (and subdirectories) editing (very unlikely!) well i don’t really know what else to put so ig that’s it? anyways i have actually done some work, that is, my file currently ouputs some text. literally the raw original text. what’d you expect from 24m of coding"}]...
|
Title: reMDer by @Keyboard1000n17 | Stardance
Dev Title: reMDer by @Keyboard1000n17 | Stardance
Devlogs:
a terminal markdown reader that has actual headings? never could have thought of it huh well this is what i’m doing. literally a markdown reader that prints text the way you might have written it. anyways so this is gonna use bun since bun is ultra fast. also this might be a 10-20h proj, shouldn’t be too hard. well i like more hours, so i might also add stuff like: browsing all the markdown files in a directory (and subdirectories) editing (very unlikely!) well i don’t really know what else to put so ig that’s it? anyways i have actually done some work, that is, my file currently ouputs some text. literally the raw original text. what’d you expect from 24m of coding
took only this long to make a bunch of letters you see, i had to make a bunch of custom glyphs to render headings in the terminal. making that for pretty much all the characters on your keyboard isn’t quite easy but hey its done now. the thing is, this is only for level one headings. once i finish the actual parser, i’ll add glyphs for the rest of the headings. in the meantime, i’ll have to do the rest. i did not expect to have spent this long on the project already yk
HEADINGS NOW RENDER! headings now render! as you can see in the screenshot, it now renders the headings as big boys also, me very happy. this took a while because i lowk didn’t know what to really do. i didn’t think about how i would do it, i was only thinking about doing it anyways gn gng
i got bombed by my own regex anyways, so i started making a lexical parser and uhh its not going all sunshine and rainbows. the blockquote regex doesn’t really work right and also i checked the gfm spec since i want to adhere to it and uhh fuck i might be cooked. i thought ts was going to be a 20h project help meeeeeee also yes it took me 6 hours for 74 lines of code sob this is just great
help me what on god’s green earth is this so after dealing with a shit ton of regex and doing pretty much nothing with it besides some stuff that would improve performance, i have decided that regex is not the way. instead, i’ll just set a bunch of flags with empty content and make a separate function that processes everything. i think the styling function will handle tokens because that’s its job, to style the tokens. at least i have something to follow now. (i did not implement any of this yet) Changelog fc8de72 : Fix some regexes fe6eeef : Change some regexes f67c3b5 : Change matching system in parser 8a80409 : Add some HTML support in lexical parser 0727d82 : Finish lexical parser (almost) b7bc45b : Make lexical parser work
rewrite i started a rewrite! what i was doing earlier was honestly too messy to actually use. my earlier way was making a bunch of regexes and using those to match the remaining text. my new method is still using regexes, but i split the whole thing into two parts: block parser and inline parser. block parser the block parser splits the markdown doc on newlines and checks what it starts with or ends with. when it finds that some line is not a paragraph, it pushes a token to the tokens array indicating that it is the start of a block. when it detects that the block has ended, it pushes a token to the tokens array indicating the end of the block. this is currently only implemented for headings, more are coming. it took this long because me dumb inline parser the inline parser loops through the existing tokens array made by the block parser and looks for characters that indicate the start of an inline token like bold, italic and so on. like the block parser, it will push start and end tokens to the tokens array the implementation of the inline parser has not started yet new character i added a backslash to the giant block letters i made for headings! Changelog (bac8c5a) Start parser rewrite (664713e) Add backslash in heading
FUCK fuck this rewrite, i’m abandoning this shithole of a parser i’m trying to make, i’ll just go use an already existing parser, its just not worth it it’s too much hassle to make an in-house parser, so here’s my plan: i install a markdown parser that returns a tree of text, not html, and as a dependency in the styling part, i’ll go ahead and read the tree of text that the parser returns it gets passed to the renderer hopefully this will move much faster now!
revamp! i revamped the parse-input.js file! now, it has two functions: giveFields(obj) this is a function called by the second function. since markdown-it (the parser im using now!) has a lot of fields that i don’t need. so this function returns a mapped array with the fields type , tag , nesting , content , and children . as for this children field, the children field is an array of objects, where the objects are just like the parent object, with lots of unnecessary fields. for those, i used recursion! (it’s my first time using recursion ) parse(input) : this is the function that i’ll be using to get the tokens i need to style! what it does is pretty simple: initialize a new instance of the MarkdownIt constructor (? i’m not too sure if it’s a constructor) get markdown-it ’s tokens using their parsing function make a constant whose content is an array of objects returned by the first function ( giveFields() if your memory is that terrible). again its a mapped array that gives only select fields from the markdown-it tokens return that constant in other news, i wrote 2 more test markdown files. one tests the behaviour of headings and the other tests the behaviour of inline stuff like bold and italic text! Changelog ( 88bad121 ) Revamp parse-input.js ( 3eda61e5 ) Add more stuff to inlines.md
toiling away… toiling away at this code… today was a bunch of stuff i added a renderInline() function to render stuff inline. i still need to add images and links, but i’d need a lib for links, and maybe for the images too i worked more on the main function. right now, im trying to get paragraphs actually rendered, which will take a while. i also added a heading() function that will render headings, emphasis on will because its not being called yet it took me a lot of thinking to get here so that part wasn’t too fun (a person who thinks all the time, has nothing to think about 🔥) changelog ( e24a192 ) Work more on the stylizer ( 1a02163 ) Start actual work on stylizer
holy this shit is so long heyo! this is a long one, so i’ll go over this commit by commit ( 0ad2cb2 ) Start paragraph parsing here, i did these: i made a global string state to maintain the nesting while styling. managing this was quite tedious and useless i added a helper function to get the style of a token called getStyle() . i’ll explain the use for it below. i continued working on the heading() and paragraph() functions as well as the stylize() function ( eb218d2 ) Add markdown extensions as for this one, i added a bunch of packages, mostly extensions for markdown-it . these are: markdown-it-footnote markdown-it-github-alerts markdown-it-sanitizer markdown-it-table markdown-it-task-lists shiki (for code highlighting) terminal-image i removed a few of these later because they were either not really working properly or just weren’t necessary. besides these, i also configured the plugin to use the plugins, enable the autolink extension and also replace all HTML line breaks ( <br> ) with double newlines ( \n\n ) ( 5ecef2c ) Start working on image rendering and colors/styles now here is where i found a gem in my dependency tree. you see, i was searching for a package to handle color rendering since i sure as hell wasn’t gonna deal with the hex codes shiki , the code-highlighting plugin, was giving me for the colors of the tokens. so i saw a package called chalk and it sounded familiar. turns out, shiki had chalk as a dependency, so it was already installed! for that reason, i added a chalk import in this commit. i also started working on an image function to render images, and named it renderImage() . also added a great error message if two requirements weren’t met: throw new Error ( " WRONG TOKEN IDIOT DEV " ); but that was all i really did in that function ( 0dc393d ) Remove unnecessary object processing and dependencies this is where i removed markdown-it-footnote and markdown-it-table because i realized there just wasn’t a point in those since they weren’t letting me test my function, they were erroring out for some reason and i found out markdown-it-table already had support for markdown tables. i also removed the mapping function in the parser stage that i made to give myself only a few fields. it was pretty useless since i kept randomly finding that i’d need some new property. ( 8a5200c ) Continue work on inline parsing, add terminal-link latest commit, this is where i did a lot of work: i removed terminal-image as a dependency since i found that bun already provided a class for it ( Bun.Image ) and it also had webp support unlike terminal-image , so no point in another package when a built-in one works better i made the getStyles() function better i added a bunch of micro-functions like bold() , italic() , etc. i also renamed renderImage() to image() i combined two if statements into one in this image() function because why 2 if statements when 1 i did a lot of work in the renderInline() function. now it uses computed function names that call those micro-functions. i also changed that global string state to a global array, made things much easier. i worked on the heading() and paragraph() functions further that’s about it gng, also its 12:28 am for me rn this is why we devlog more often gng ✌️
oof! that was a lot of work, but now we’re REALLY getting somewhere!!! first thing, headings actually work now, and if there’s a link in the heading, it gets displayed right below the heading! tbf i did rip the heading thing straight out of the original index.js file when i was trying to make a markdown parser using regex secondly, and the more important thing, image rendering now works . pretty big milestone. i achieved this through the terminal-image npm package. however, this took a while because i couldn’t figure out why it wouldn’t render. the problem was tmux–it was stripping the codes it didn’t recognise so i implemented another system to detect if the terminal had color and/or image support to decide whether to use ansi blocks or actual images. now, it works! ts so peak fr tl;dr headings work (i ripped them out of my original implementation in index.js ) images work (took me a while because it didn’t work properly in tmux we getting somewhere with this one 🔥 Changelog ( 9941b1b ) Finish image rendering ( 007b3f4 ) Work on image rendering ( 609be18 ) Make heading work
when the FUCK did this become 4 hours so uhh i spent like all of this time debugging and improving my code. first thing is, i replaced these “microfunctions”, as i call them, with an object that had keys whose values were arrow functions. these arrow functions did the exact same thing and took up less space and was even more readable! second, i spent some time on a stupid bug where the main function in stylize.js would hang. i thought it was an issue with the image function, but after half an hour or so, when i added console.log(done) right before the return, i realized it had to do with the main function that was calling the image function, and sure enough, the second i looked at it, i realized the problem: it was a while loop and i forgot to add a line that incremented the index, so it just kept doing the same thing forever until i killed the process oh well, more hours for me third, i improved (or rather cleaned) my image function. it returns promises and doesn’t use terminal-image directly. instead, i made it so that it would return an object with a bunch of keys, one of which is a function that takes the whole object as an input. this function actually renders the image, since i plan to write the function to display it in a way that deals with image rendering after rendering text, and while the images get rendered, a spinner takes their place temporarily, but the images replace those spinners once they are processed fourth thing is, i made it so that the main function calls the renderInline function instead of the paragraph function. in fact, this paragraph function is completely useless, so i went ahead and removed it too. lastly, i upgraded a bunch of packages: upgraded typescript from version 5 to 5.9.3 upgraded got from version 15.0.7 to 15.1.0 upgraded markdown-it from version 14.2.0 to 14.3.0 upgraded shiki from version 4.3.0 to 4.3.1 if you wonder what these packages are typescript is, well, the typescript language, not sure why i have it, might be a dependency for another package. got is some package that does pretty much the same thing as the default fetch() but it can give me a buffer, which i need for images markdown-it is the markdown parser shiki is for coloring code. fancy, right? Changelog ( 9118913 ) Improve code ( 5b9c953 ) Remove test file ( ab3af08 ) Test image URL parsing on GitHub aight this took me 2 hours to write and i started coding again in the middle of writing this
PEAK CODE gng TS IS PEAK!!!! i added a function that renders code AND ITS PEAK JUST SEE THE SS now some of this time came from trying to figure out why my code was joining the contents of a function, and it was because i forgot to add the argument that gave the coloring function (chalk library) the text to color. hey, at least i found a way to read the contents of functions time to go steal code from closed-source packages leaving that aside, my next step is thematic breaks. this shouldn’t be too hard, in fact, i’ll do it rn since it’s that easy. rn its 8:49 PM GMT+0300, i’ll tell in the next paragraph when i finish it. [8:54 PM] just did it, it only took like 2 mins, the other 3 were because i found a bug that never removed codeBlock from the stack after it was added. that’s about it, and this devlog was quite short. well, comparatively, to my other devlogs, after all there’s people posting 4 word devlogs. you should follow this project tho Changelog ( a17bd2b ) Add thematic break support ( e28f1b1 ) Add code block styling
THAT WAS SO LONG WHAT ON EARTH in short, tables now work and the inline rendering function is fixed! this took a while because i genuinely had no idea what i was doing. now the long stuff: tables go brr i got distracted while writing this and realized everything’s actually borked, but tables do somewhat work! its still borked tho– also i realized that my whole code is borked, but… inline rendering includes links now! still have no idea how i missed that other i just changed image function so that it returns an object with a prototype function instead of unnecessarily repeating the function as a property of all the image objects, so if there’s 10 pictures in a file, there will only be one function to render each as opposed to 10 instances of that function Changelog ( d8feb46 ) Add table support, fix inline rendering oh fuck, my code is COMPLETELY borked
improvements and fixes to inline rendering this is way earlier than my normal schedule, but that’s because i’ve got something to show . basically, inline rendering was bugged , and not only did i fix it , i also made it so that it works better ! that’s all you need to know, do NOT read the rest of this if you don’t want to be bored to death, its a really lengthy explanation of this the initial bug was that inline rendering wouldn’t work at all. i figured out the problem was that i wasn’t pushing "inline" to the state array somewhere. i realized that it wasn’t working when called in the table rendering function, and that was because i wasn’t pushing "inline" to the state array. the reason for this is because the renderInline function slices the state array at the index after the "inline" string, so if its something like ["paragraph", "inline", "bold", "italic"] , the function slices at index 2 because "inline" is at index 1, and we get ["bold", "italic"] . the problem is, if "inline" doesn’t exist, running indexOf("inline") returns -1, so it slices at -1 + 1 , which is 0, so its just the whole array. but anything before “inline” isn’t a valid style, and since the function for that is undefined, it goes kaboom and throws an error saying that it’s not a function. also gpt found 5 other bugs but they’re kinda irrelevant the fix was making it so that the renderInline function itself pushed "inline' to the state array instead of depending on it being already there. this also removed the need for making sure that the inline string was already there. i might do this with the rest of the functions too actually :goonology: also removed unnecessary state.pop() occurrences since the pop method is destructive and can mess up everything as for the improvement, you might see in the first screenshot that there’s a bunch of text tokens together. yk, they could be squished together into one token… oh right, that’s what i did! i changed the renderInline function to make a variable where the text accumulates until there’s no more text or if there’s an image, on which it gets pushed to the contents array now the most important thing is that there’s only one more thing left to do: html rendering . this is the last thing before i get to actually rendering stuff on the screen! this is exciting! Changelog ( 9de477d ) Fix, improve inline rendering please like this took more than an hour to write
HTML parsing is now complete its been nearly 2 weeks and i have great news: html parsing is complete what this means is that html blocks get processed into token streams like the one’s markdown-it makes. now, i must clarify that these html blocks were already in a token stream but they were distinctly html, having the type html_block , and if i didn’t convert those html blocks into markdown-it’s _open / _close tokens, i’d have to parse it in the file that styles the tokens, and many html tags do the exact same thing as their markdown counterparts so i could reuse some functions. i must also clarify that i have NOT done anything for stylizing html in the stylize.js file, which deals with processing text formatting and image processing next up: stylizing html! Changelog ( c5a5ce0 ) Finish HTML parsing ( 841ba42 ) Start work on HTML parsing
WIP WORK // INCOMPLETE // this was a lot of work, and i’m still not done with html in the stylizer! here’s a list of changes with explanations: add more aliases to the aliases array in the html parsing section: this makes it so that html tokens and markdown tokens have the same types convert the array of allowed html tags into a set : sets have a .has() function that lets us find an element in O(1) time complexity which is much faster compared to Array.prototype.includes() which has an O(n) time complexity properly implement disallowed tags: these tags show as plain text because they are disallowed and shouldn’t be processed in markdown put non-block tokens as children of an inline token: non-block tokens only got parsed in the part where inline tokens were processed set attributes: the objects returned by the stylize function now have a properties key better error handling: now, where it used to just throw an error about being undefined or whatever, it will catch it, and throw a more useful error with better debug info [BUGFIX] make sure that arrays don’t get nested: this was a bug where arrays would get nested for some reason [BUGFIX] set token.level and token.nesting properly when processing html: this is necessary because the while loop depends on the nesting to know when to stop accumulating tokens and process them [WIP] html handling: any tokens having the substring _open in their .type property are handled all together, with a handlers object made up of functions. this handling is recursive token with types that don’t match the substring _open get handled through other branches of the if statement ( else if(...) {..} ) [WIP] bullet list handling: i did not realize that there were more markdown-it tokens that i had not added handling for in the stylize function. i also need to do this for some more token types too [WIP] revamp image handling: instead of just a complicated function, i added a class called Image that has a function to render the image. its nearly complete but it has some errors that i committed because i need to commit often lmao chatpgt usage now here i used chatgpt a lot for debugging. here’s exactly what i used it for: why tokens weren’t being processed: this is the problem the array nesting bugfix fixed fixing infinite recursion: i accidentally did that lmfao replacing top-level non-block tokens with an inline token that contains those top-level non-block tokens as children figuring how to set the level property of the tokens questions about syntax and mutation of global vars Changelog ( 5e931f7 ) Revamp image function (WIP) ( 0ce066f ) Improve error handling and fix token.level assignment ( 0f28b75 ) Process details element in stylizer ( 0e154f3 ) Start improving stylizer (WIP) why such long devlogs? you may have noticed i’ve been going more and more time without devlogging. that’s because i like devlogging when there’s a big new thing, not for every small little thing. my plan for this devlog was to announce that i was done with processing html in the stylize function, but that hasn’t happened yet because well, there were a latta bugs here and there, and i had to fix those too. as for the length of the devlog text, i like writing about my progress here because its the only place where it makes sense to talk about it in-depth
typescript! i’ve moved to typescript, cleaned up some code, finished that image function from last devlog, and upgraded packages! finished the image function : now it works perfectly! upgraded packages : shiki was upgraded! its the code coloring package btw added a test : i can’t keep pressing the arrow keys in bun repl i have to do this moved to typescript : this is the main thing. devs on discord kept telling me to use and i said i’d do it soon. i wasn’t planning on it at this time, but i did because i got fed up with a stupid bug where i was accidentally setting token types to a boolean instead of a string. that prompted me to just do it™ and now i’m fixing a bunch of bugs! still not sure why the language server is just complaining about cases that can’t happen, but that’s what typescript is for i guess Changelog ( 688afd8 ) Start moving to TypeScript ( ac99373 ) Switch to map for aliases, add test, clean up code ( c62c57b ) Upgrade packages, clean up code ( f98e65c ) Finish revamping image function
headings! unknown tag handling (that doesn’t work)! well we’ve got some nice stuff now! here’s a list of everything, including problems!: just whitespace? no more! : tokens that are just whitespace get omitted typescript lsp doesn’t complain : oh my god finally that was so annoying what’s this tag? : if it doesn’t have a handler, it falls back to the default, that is, it turns into a string! this doesn’t work properly though, i have to fix this ching chong ruby tags : now ruby tags are supported! is that a highlighter? : mark elements are now supported, which just put a yellow bg on some text is this a block element or not? : now the renderer can tell by looking at a token’s block property proper heading rendering?!?!? : chatgpt wrote the entirety of this part because you cannot bother me to make an efficient function that wraps giant text art letters based on width where’s the inline code? : that’s right, it doesn’t work and gets completely omitted! Changelog ( 456161f ) Trim content, add boolean property ( 07da8a6 ) Add handlers type to make the LSP shut up, trim strings in test file ( b4d251c ) Add handling for unknown tags ( d903b48 ) Add support for dfn , samp , ruby tags ( 813d934 ) Fix code to stop TypeScript ( vtsls lsp) warnings
it works holy shit it works, the problem was that i was running a function but i wasn’t putting it in a console.log . the test function for reference returned a string. also, unknown tags are handled somewhat properly. i need to actually fix that, but once i do, im gonna start on the tui!! its been 96+ hours now what a crazy thing, i expected this to take 10-20 hours and now look at this… anyways, i’ll go fix the unknown tag thing! after that i’ll start working on the tui Changelog ( c1461c3 ) Get unknown HTML tags rendering
TUI! i’ve got news: the TUI renders! for this tui, im using opentui! right now, the tui only shows an interactive list of files, and its supposed to render the file content if you select one, but that’s not happening right now. i’ve been working on the function to make opentui render the markdown. while opentui does have its own thing for markdown rendering ( ), i’m gonna render my own markdown. im currently trying to get tables working! Changelog ( c8ab716 ) Work further on rendering, start with rendering tables ( dc8b0be ) Start using OpenTUI for rendering TUI ( 86347cf ) Render unknown HTML correctly (without showing tags)
generational fuck up well i’ve messed up big time, sunken cost fallacy is real and it got me you see, i was using opentui earlier, but i decided to change because i realized that it doesn’t support ansi escape sequences. i landed on neo-neo-blessed , and it seemed cool, until i realized the list selection thing got fucked up because it didn’t handle scrolling list options with heights greater than 1 row properly which is a deal breaker. i also spent a lot of time patching its types, in fact that’s what most of this time went to i think i’ll use jsvision. it seems interesting and i’ve got nothing to lose. the only issue is it has one maintainer and 9 stars, but gpt found it, and it seems cool. also they have demos of the unmodified lib running in the browser which i wanted to do, so this will be fun Changelog ( 33e1c91 ) Start using neo-neo-blessed and do a generational fuck up
(back to) opentui! if you’ve read my last devlog, you might remember that i was considering the jsvision library. however, i came back to opentui because its still much simpler. also, i found that there are libs to adapt ansi! or at least chatgpt did at first i was doing ghostty-opentui , but i realized after some time that it was literally a whole terminal. then i got chatgpt to find me this package called ansi-sequence-parser ( https://www.npmjs.com/package/ansi-sequence-parser ) and its perfect! so now im using that to render the bold and italics! tbh i could just eliminate the middle stage ( stylize.ts ), but i put a lot of work into it and i’m extremely vulnerable to the sunken cost fallacy, so i’m doing this bloat lmao. also, i got ordered lists, bullet lists, and blockquotes working! they look so cool! as for the menu, its not doing very fine, but that’s because i’ve not worked on it! i’ll get to it, don’t worry! next up: code blocks (~2-4 hours) fixes to table rendering (<30 mins) fix image handling (it doesn’t handle relative paths correctly) (<1hr?) Changelog ( 8b44667 ) Add blockquotes and 1 row bottom margin to second-level renderables ( 3e5182f ) Add oredered list handling ( d997aff ) Switch back to OpenTUI, get things working
better types. debug mode and stdout! from my last devlog: next up: code blocks (~2-4 hours) fixes to table rendering (<30 mins) fix image handling (it doesn’t handle relative paths correctly) (<1hr?) of these, i’ve done none! what i have done though is add flags and types! i spent a while dealing with type errors because i decided to specify types instead of just putting any on ProcessedToken.content . i also added a debug flag, but literally all it does is show the console i also fixed the width thing, so the content is only as wide as the space you give it so cooll!! the main part of this is that i added a --print-to-stdout flag that just prints the formatted markdown to stdout! you can just scroll in your terminal instead of having a whole ass tui its kinda borked and incomplete though, so i’ll fix it up! it does print some garbage at the beginning so that’s not great anyways, i’d better do what i said i’ll do last devlog! i went off track for this lmao Changelog ( b1c0489 ) Implement half-baked print to stdout option ( aa3c029 ) Add debug flag, fix logic errors ( aa33e84 ) Specify types for ProcessedToken.content instead of any
holy fuck, you can pipe into stdin and tables render properly! while this is quite out of schedule (i usually post every 2-3 days), today brings some peak stuff! the peakest part is at the end firstly, i have in fact fixed tables! the issue was i was pushing the accumulated cells array to the rows array in the wrong loop. i was doing this in the loop that iterates over the cells in a row, so it was causing it to repeatedly push the same strings over and over. the fix was putting it in the loop just outside, that is, the loop that iterates over the rows in the table token! i’ve also improved the image handling! now Image classes have the buffer property renamed to content , and has a new property called properties , which is always {} . with this, it has all the properties of ProcessedToken , so my lsp won’t complain that some property doesn’t exist on Image speaking of ProcessedToken , its now an interface instead of a type. there’s also a new TableToken interface that extends ProcessedToken , with an alignment property. this makes it a bit easier to handle tables since the content property is narrowed. also, it seems like opentui’s tables don’t support alignment, so i might have to make a custom table function. i also upgraded opentui from 0.5.7 to 0.5.8! i have no idea what changed, but whatever i’ve also stopped using chalk to color my errors since the opentui console doesn’t support ansi now the peakest part is you can pipe markdown into the program . this is pretty peak and you must agree since there’s a lot of stuff you can do with this. for example, you could render arbitrary markdown without having to create a file first! it has a limitation though: if you’re on windows, you can’t use the interactive mode, and the rendered content is forced to print to stdout. this is because of a bug with bun. if you’re piping into the program, it’ll get the input by calling await Bun.stdin.text() , but this stops sending keypresses to opentui because of a bug in the bun runtime, so you can’t scroll down. i solved this issue (or rather, chatgpt solved this issue) by opening a read stream on /dev/tty . the issue with this is that /dev/tty doesn’t exist on windows since its not unix-like. my idea was to just, not let you do interactive mode on windows if you’re piping content to it. again, this is a bug with bun, and i’ll remove this limitation once one of the two is merged. that’s right, there’s two! here’s one for reference: https://github.com/oven-sh/bun/pull/32153 shit that was long Changelog ( dd07e14 ) Upgrade packages ( 77e6d34 ) Add support for piping into renderer.ts from stdin ( 1995f45 ) Improve image and ANSI handling, stop using chalk in errors ( 22cfacd ) Improve table handling, switch some types to interfaces pls like
code blocks, alerts, emojis and task lists! we’ve got loads of new cool stuff that get rendered now! first, github alerts/callouts now render nicely! they look like this: > [!TAG] > content where TAG can be NOTE , IMPORTANT , TIP , WARNING or CAUTION . they also have these cool icons next to them, but the catch is you need a nerd font for it. i’ll add an option to not need it and only use ascii characters next, we have highlighted code blocks! the renderer can highlight hundreds of languages using shiki ! you might not even have heard of some of the languages that it can highlight! imo its really nice looking and i love it! the bulk of this time came from adding support for task list items because i couldn’t figure out how to do it. eventually after some tinkering i’ve got it to work! it looks kinda cool too tbh i also got emoji support using an extension. it automatically converts :emoji: to the corresponding emoji if its in the unicode specification. finally, i added a simple height option that just sets the height of the renderer. it allows you to set the height of the renderer manually and that’s about it lmao Changelog ( b4f69ad ) Add height option ( beea3a6 ) Add task list items support ( 4c42c84 ) Add emoji support ( 564a761 ) Upgrade markdown-it, fix breaking changes ( 963d910 ) Add alerts support ( 5e266e8 ) Add icons in code blocks ( 0bf0af7 ) Add code block support
figlet headings, small headings, bottom bar, help menu and keybinds we’ve got a lot of new stuff! firstly we’ve got a bottom bar! all it does for now is show reMDer with a green bg and the file name next to it, but i’ll add more later! next we’ve got figlet headings! at the start i was thinking about using figlet for headings but i gave up on that. but now, i’m back to using it! this took a good chunk of the overflowing hours here but they look really cool too! passing a --no-render-headings or -H flag will make the headings render as normal text with colors instead of figlet fonts now! there’s now a tiny help menu in the corner! it only shows two keybinds right now–oh and speaking of keybinds… keybindings are now in ! for now you can press q to quit, ? to toggle the help menu, and C (shift+c) to open the console in debug mode and that’s about it next steps? here’s what i’m gonna do next: add support for horizontal rules add a table of contents feature like that of the leaf markdown viewer add some stuff to the bottom bar add an option to put the bottom bar at the top instead add support for a config file using YAML Changelog ( 9557586 ) Add help menu ( a4149e2 ) Add keybinds: q to quit, C to toggle console ( 4b18153 ) Finish figlet fonts support ( d23466d ) Start trying figlet again for ASCII art ( 33d52ea ) Start working on ASCII art for h2 headings ( b0e1668 ) Add option to not print big headings ( c58369c ) Start with bottom bar
table of contents feature is done! took only 10 hours, but im done with the table of contents thing! you can press shift+j to go down to the next heading, and i forgot to add shift+k 😭 anyway this took a while since i couldn’t figure out how to position the box properly and how to style it. this was fucking ass icl. i usually have much more to talk about but this wasn’t the most fun so here’s the commits: Changelog ( 5ccec11 ) Remove unnecessary focusing ToC ( 927cae9 ) Add tab cycling ( ae72d3d ) Scroll ToC menu to selected index instead of blindly 1 down ( 249d61a ) Implement scrolling ToC on pressing J ( a2ae0f2 ) Get table of contents feature working ( a6c7744 ) Add scrolling to next heading on pressing J ( 49f8fec ) Add “? - Help” hint to end of bottom bar
scroll one line at a time, render div and details elements not very big news here, but now you can: scroll just one line at a time instead of a whole renderable/element at once render div and details properly! now you can click on a details element to open and close it! this didn’t even take too long more technical, but i switched to mostly using the opentui renderable api which uses classes like TextRenderable or BoxRenderable that return a Renderable instance instead of functions like Text and Box which return a ProxiedVNode<T> . this is mostly because there’s a bunch of things a Renderable has that a ProxiedVNode doesn’t anyways im currently working on adding footnotes, so see you in a few days Changelog ( 64f6ed8 ) Add footnote plugin (usage WIP) (errors on run) ( ddd5c46 ) Add indicators to details elements and opening on click/space/enter ( 344806a ) Add support for rendering div and details elements ( d3b4a1d ) Fix small layout issues ( 5eb11b9 ) Scroll only one line at a time and convert (mostly) to Renderable API
last devlog this is my last devlog the project isn’t complete and i won’t be shipping it. you see, i was banned for 2 months for misconduct on slack (i will not provide details here but i deserved it, it was corny anyway), and as part of that ban, i can’t participate in any events, including stardance. in this time however, i’ve done a lot. there’s now spinners for images, proper tables, and so many more improvements. keep your eyes peeled for a release on the github ! 👀 also it doesn’t matter that this devlog is 15 hours over the limit, its not like i can do anything about it. also if one of you regulars in #stardance see this, can you please ask amber if i can have my sticky streak rewards? i really want the stickers and plushie Changelog ( 446103b ) Render details elements properly again ( f527e5d ) Better logs, align images in row when a paragraph contains only images ( 3df2f59 ) Make task list function use TextChunk over ANSI escapes ( 2367089 ) Add proper tables ( 47c2b42 ) Add aligning components ( 00785d7 ) Move from Chalk/ANSI escapes to OpenTUI StyledText for styles ( 429e4b6 ) Load images lazily with spinner while loading ( a993197 ) Use OpenTUI ImageRenderable for images in renderer ( aa96067 ) Improve types and error handling, work on image bug ( b54ad43 ) Revert “Add footnote plugin (usage WIP) (errors on run)”...
|
1792803099.7726493
|
1793407899.7726493
|
|
6943
|
TubeReplacer by @Preloading | Stardance
|
Preloading
|
0
|
197.22
|
0
|
[]
|
[{"post_id": 79718, "ts": "202 [{"post_id": 79718, "ts": "2026-10-15T06:35:36Z", "hours": 1.0169, "text": "To the demo, I added a time limit & a restart app option in case it breaks and the app has to be restarted."}, {"post_id": 79710, "ts": "2026-10-15T05:23:07Z", "hours": 11.7986, "text": "Cooking up the demo, I’ve basically setup a remote control system on this phone, which should hopefully run over the internet! Giving randos complete control of this phone… what could possibly go wrong???? I still need to do some stuff to lock down the system it runs in, and also patch the problems with tubereplacer that came up recently."}, {"post_id": 74763, "ts": "2026-09-28T05:27:24Z", "hours": 2.1983, "text": "Alright, so the results are in. From what it seems, it mostly went well, however there are some issues that came up, primarly due to me not having enough time to test (I released this the day before stardance was extended for another month…. a bit of extra time would have been nice to iron out the few bugs on release, and also time to diagnose the playback errors people encounted). I did a quick 2.0.1 release to fix some of the bigger issues… 5 days after the initial. i’m tired ok?"}, {"post_id": 72543, "ts": "2026-09-23T05:25:42Z", "hours": 3.6169, "text": "Oh dear, publishing it to the world! I’ve decided to say “fuck it, its good enough”. There are some issues which has popped up, like some versions crashing, and the SABR stream never starting issue. I’m praying that it’s not just that bad. Made a reddit post about it :3 https://www.reddit.com/r/LegacyJailbreak/comments/1wnh4il/ Hopefully this doesn’t go catastrophic! I also have to setup a demo. Right now, the big issue is how to. Just a video is kinda… lame? So I want to do somehow make it an interactable demo. However, there is not an emulator for appstore apps for any iOS version between 5-10. This makes things rather tough. I do have some spare phones I can acquire to run it. However, getting the screen out is uhh….. challenging. The version of AirPlay on iOS is too old for the open source projects, and even the closed source, execpt for one, AirServer (which is 20$ per computer). The 30pin -> HDMI adapter -> capture card is extraordinarily unreliable, and keeps disconnecting when I try to use it, and is a pain in the ass to get working. There’s Veency, but it goes black when playing a video, and is unusable slow. And after all that, I have to send it to a server to stream to a web browser, I have to take input, I have to manage launching the correct app, preventing escaping the app, handle crashing, queuing (its one phone so people will have to wait), etc. All in 7 days. oh dear."}, {"post_id": 71634, "ts": "2026-09-21T06:27:35Z", "hours": 2.2925, "text": "Did some stuff to make the challenge solver/nsig/potoken restart when needed. Also reorganized it a lot of that file."}, {"post_id": 70324, "ts": "2026-09-18T22:56:01Z", "hours": 2.3042, "text": "So, it randomly decided to break for many videos, and only for some people. It appears that YT is doing extra things to detect adblockers on web, and something I’m doing is triggering the adblock detection. This is uhh bad :) I get to figure out what I’m missing and implement it properly. Now for bugfixes I made fixed a signin crash on 1.0.1 & 1.1.0 due to a missing cflag fixed the video date failing to load on iOS 5 added proper backoff to SABR"}, {"post_id": 68463, "ts": "2026-09-15T04:46:50Z", "hours": 2.7594, "text": "Bugfixes! fixed a bug where playlist videos fail to play on channel playlists fixed the open source licesnses page crashing on 2.0.0 fixed a bug where closed videos in 2.0.0 continue to play after closing, locking the phone, then unlocking fixed a crashing bug when not connected to internet when fetching profile"}, {"post_id": 67668, "ts": "2026-09-13T20:35:14Z", "hours": 0.9072, "text": "Made it zip the network log stuff for sending over email, as text files generally have a really good compression ratio, (the file is actually 2mb), and email has really low limits."}, {"post_id": 66921, "ts": "2026-09-12T21:55:08Z", "hours": 2.8417, "text": "I managed to get N/Sig deciphering working with HLS streams, meaning you can now watch livestreams, if you change up some settings & it’s buggy. I’m not intending on shipping proper stream support right now, so this will do for release."}, {"post_id": 65754, "ts": "2026-09-11T03:18:56Z", "hours": 5.4256, "text": "Bugfixes! I’ve decided it’s probably good enuff to “feature lock” and just get it ready for release (also cuz stardance ends soon, yet the streak thingy to a plushie continues. as its ending. why. i wanna take a break!) Not much images but Fix an issue with my trimming stuff not working on 1.4.0 Managed to cleanup the stream when switching video on 2.0.0 Some missing thing on the thumbnail speedup thing My failing to do requestProfileForIdentity correctly."}, {"post_id": 64350, "ts": "2026-09-08T17:29:24Z", "hours": 4.5636, "text": "I did a bunch of things, none of which felt that interesting to make a log for, so here’s one big one. The quality selector now works You can now toggle video stats (logging in history) on or off. Some error handling and trimming stuff to save on ram"}, {"post_id": 62657, "ts": "2026-09-06T03:55:15Z", "hours": 2.315, "text": "Did a small hack to add the tweak’s version to the crash reports"}, {"post_id": 61946, "ts": "2026-09-05T03:58:53Z", "hours": 5.835, "text": "So this one is small, but I’ve done an optimzation for the process of getting that little thumbnail. The older youtube clients did indivisual, very small requests for the specific channel, incl the thumbnail. I already have this data with the video requests, and getting the channel data is rather wasteful of the network and slow. I’ve replaced it with just using the avatar from the feed. Speeds things up a decent chunk!"}, {"post_id": 60937, "ts": "2026-09-03T16:40:57Z", "hours": 1.4744, "text": "Some minor sabr tweaks, and also a fix to the channel id failing to load for certain feeds"}, {"post_id": 60505, "ts": "2026-09-02T21:45:45Z", "hours": 2.1469, "text": "I made some of the settings work, and also made it hide the comments count which I don’t have a way of getting a precise number right now. Ignore the playback error."}, {"post_id": 59350, "ts": "2026-09-01T02:54:44Z", "hours": 4.4475, "text": "i did a bunch of misc fixes which aren’t interesting. iOS 5 preference fix some reloading of video changes with SABR cleanup of a bunch of things a fix to the item count (cuz 32bit limit aaaaaaa) memory things some crash bugs with SABR"}, {"post_id": 57701, "ts": "2026-08-29T22:55:46Z", "hours": 5.6717, "text": "A bunch of signin fixes, I fixed the channel id finder failing for different accounts, and I fixed an issue where one of the requests I did on 2.0.0 is synchronous and would not let the app start until it completed."}, {"post_id": 55413, "ts": "2026-08-27T07:02:08Z", "hours": 3.3828, "text": "2.0.0 support! and actually 1.4.0 support this time (oops, i think i clicked the wrong version…). I really hacked my way to 2.0.0 support, as it adds all the stream data to a protobuf container thingy which is never actually generated as protobuf. The protobuf also isn’t a normal function, and I couldn’t figure out how to recreate it, not that it would really work if it does do some protobuf shenanigans. So I did what probably every programmer does, hack it in poorly. When it starts trying to play the video, after the protobuf section, and where i still have access to the legacy GData streams, and I just shove it in there, and it manages to work! Also had to do some extra things to include valid authentication to the SABR stuff so it can play private videos and such. But now 2.0.0 works!"}, {"post_id": 54270, "ts": "2026-08-25T05:15:09Z", "hours": 1.5956, "text": "I managed to get 1.4.0 support working! They started kinda doing what I implemented myself…. which causes issues, but it works! 2.0.0 is going to be hard tho…"}, {"post_id": 53575, "ts": "2026-08-24T05:23:41Z", "hours": 3.7281, "text": "Managed to get videos to count towards your history! Also some kinda boring optimization things (start parsing even while we are still downloading, because net neutrality doesn’t exist for some reason, and someone got 22 seconds for a 2mb file)"}, {"post_id": 51988, "ts": "2026-08-22T00:14:33Z", "hours": 1.3206, "text": "i managed to get private videos to work, however they still don’t show up in the “Uploads” tab."}, {"post_id": 51417, "ts": "2026-08-21T03:27:49Z", "hours": 1.5033, "text": "A bunch of smaller bugfixes, and now it runs on iOS 5. There was some small differences since polyfils, and it doesn’t work with a proxy on (since it proxies localhost). The left device is iOS 5."}, {"post_id": 51306, "ts": "2026-08-20T21:39:31Z", "hours": 2.2778, "text": "I spent a bit of time fixing up the settings menu to properly have the HD options. Unsure how much of this is going to stay like this, but right now both of the HQ ones work, the 360p (Android) plays with SABR for a bit, then it stops as we don’t have proper attestation (our POTokens only work on web based clients). Probably going to have to forbid using sabr on ANDROID. Unsure yet about Android VR or visionOS. They both need a visitorData, which I still have to get. VisionOS has the nice perk of giving a completely unprotected HLS stream, which this can use. Android VR is traditionally unprotected, but I think they kinda ruined that. I also did a tiny bit of work to get closed captions working, which is basically prefixing https://www.youtube.com to the URL if it begins with a slash"}, {"post_id": 50822, "ts": "2026-08-20T08:01:40Z", "hours": 2.6489, "text": "I fixed the support in 1.0.0-1.3.0, 1.4.0 and above, they started changing a bunch of player things which I still have to figure out…."}, {"post_id": 50056, "ts": "2026-08-19T02:53:41Z", "hours": 5.1094, "text": "I managed to fix most of the RAM issues, excluding the one inside the youtube app which my stuff amplifies. I’ve done some stuff to allow you to change apps, lock the phone, etc, and have the stream recover. It’s not perfect, but it works well enough."}, {"post_id": 49349, "ts": "2026-08-18T03:49:07Z", "hours": 3.9958, "text": "It kinda somewhat maybe works! you can make it through a video, however scrubbing thru the video takes forever (some request never finishes), and theres some random stutter in the video. RAM usage is still a problem, and private videos don’t play. To get here, I did things how the HTTP server wanted so other requests can come in while i’m waiting for a segment, and allows this to play fully, however I do still need to fix the buffering issues."}, {"post_id": 48759, "ts": "2026-08-17T09:09:04Z", "hours": 1.1469, "text": "Shockingly, now that I have most of the TS stuff already in place for video, audio is shockingly painless! It was only just like the previous thing, and ADTS headers, https://wiki.multimedia.cx/index.php/ADTS . Time to try it on device!"}, {"post_id": 48723, "ts": "2026-08-17T07:48:03Z", "hours": 1.5411, "text": "OK, so this was quite annoying, It was really hard to find any docs on how esds is decoded, but I got there in the end, these are some of the parts I need to make the ADTS header ( https://wiki.multimedia.cx/index.php/ADTS ). The decoder is quite bad, and just ignores some cases, but hopefully it will work :)"}, {"post_id": 47913, "ts": "2026-08-16T05:50:14Z", "hours": 2.8556, "text": "Figuring out why the player view was never getting freed was taking too long, so uhh audio! yes! I have managed to grab the header out of the app after having to patch wayyy too many bugs with the header parsing, some of which could crash the app if your network is bad. Tiem to parse dis audio header!"}, {"post_id": 46687, "ts": "2026-08-14T03:54:25Z", "hours": 5.185, "text": "I managed to make the buffering system a little more robust, it can complete a video & even seek if your careful to let it play out. I also fixed some of the memory leaks, you can get much farther, but it does still only climbs, at the end of this 25 minute video it got up to 189mbs of ram used, which means we basically leaked 100mb of ram. This is quite unacceptable still, and I get to do more of figuring out why, yay!"}, {"post_id": 46124, "ts": "2026-08-13T04:10:25Z", "hours": 8.5864, "text": "srry for audio, i am in a discord call, but i managed to get more than like 20 seconds to work, however it currently gobbles RAM, and has wayyyy too many crash bugs. I fixed a bunch of the crash bugs, and broken stream bugs, but there’s still some crashing, esp. on video end."}, {"post_id": 45278, "ts": "2026-08-11T17:04:13Z", "hours": 1.8236, "text": "IT PLAYS!!!!!!!!!!!!!!!!!!!!!! YES!!!!!!!!!!!!!! that took wayyy too much debugging (and i also used ai assistance to tell why it wouldn’t play). I got it first working with VLC & other media players, but the iOS 6 player was especially stubborn. It only plays a couple seconds since I only do one request, but it plays. Did i mention it plays? I might try forcing it to use 1080p since 144p is a little… lacking in quality and SABR is defaulting to it, i guess i’ll figure that out later."}, {"post_id": 44998, "ts": "2026-08-11T04:04:30Z", "hours": 5.6678, "text": "Unsure how much of a win this is, but at least FFplay can play the video! However, VLC, built in media players on windows, and more importantly, the video player within iOS 6 cannot play it :( I’ve forced it to use 144p for a while now for a small file size, but it should be able to go quite up in size. Bigger issue is getting it to play, however I think I will wait on that, and work on having it serve the files on the phone so I can debug this a bit easier, and have the player actually like play the files without my syslog stuff. Hopefully I can get the video to play tho :)"}, {"post_id": 44430, "ts": "2026-08-10T05:47:54Z", "hours": 1.2339, "text": "Quite boring when all that exists in these devlogs is random hex eh? Hopefully this should be the last hex blob before actually getting some kinda of video to play! (maybe, miiiight have to do one more as I hook the TS file up with the HTTP server). I managed to packetize the data into PES packets. The next thing for video (no audio) should be packing it all up in one nice TS file. And then if we get lucky, we will get like 4 seconds of a video :D, maybe even up to like 10 since then the buffer runs out, and second requests to SABR aren’t implemented yet."}, {"post_id": 44396, "ts": "2026-08-10T03:25:28Z", "hours": 2.2244, "text": "I now grab h264 samples, and convert them into annex b samples. I think the next part might be actually building the TS file! wow! This means creating packets of the data, and then making packets out of those packets (why…)"}, {"post_id": 43064, "ts": "2026-08-08T03:57:14Z", "hours": 1.8175, "text": "I decided compiling FFmpeg was going to take forever, uhh doesn’t really give good stardance hours, and this is does more stardance hours ig… I did tfdt, tfhd, and trun parsing. I think this is all the parsing I need to do on the video side and the fragment size… i hope. Here’s a screenshot of me just printing the sample size to syslog."}, {"post_id": 42485, "ts": "2026-08-07T07:55:25Z", "hours": 2.5286, "text": "I did some extra work trying to parse MP4, but like… this is going to be a lot of effort to do, and just for the video, not even looking at audio yet. For this reason, I would like to bundle parts off FFMPeg with it, but compiling it is being terrible… I got arm64 after a while, but armv7 just does not want to go :("}, {"post_id": 41141, "ts": "2026-08-05T04:55:53Z", "hours": 6.0775, "text": "POTokens actually work! current protection status being 1 means the session is approved and good to continue throughout the entire stream! I basically implemented the PR at https://github.com/LuanRT/BgUtils/pull/44 , and did some user agent fixes… and my fuckup mis-spelling something I literally said in comments I might of 😭 . And now I get SPS of 1! :D :D :D It only took… like 3 months…. for potokens… 😔 I also figured out that Web offers an HLS stream if you specify an iOS useragent… uhhhhh i pretend not to see (for now), I’m sunk cost right now, and such. I wanna commit video container crimes!"}, {"post_id": 40546, "ts": "2026-08-04T05:23:46Z", "hours": 5.7383, "text": "Actually doing something with the media data we get from SABR now. I have decided that probably the best way to implement this is to convert it into an HLS stream. I came to this decision after fully looking at what SABR outputs, a fragmented MP4 intended for DASH, which the phone cannot play. However, SABR splits up the files based on the header first, then a bunch of fMP4 fragments. With a lot of work, I should be able to manually change the container from fMP4, to MPEG-TS, the format used by HLS, and have it streamed. It does have some hickups, changing stream to a lower or higher quality while streaming would likely be difficult (more concerning with it being a server adaptive bit rate system). Also MPEG-TS looks kinda… janky? This may also bring me some trouble if I chose to add Opus audio, since much of the audio streams are Opus based. Anyways, I now parse the first MP4 stream we get per format (audio & video), specifically the initialization section, and create an HLS manifest out of it! My next step is probably to have the phone itself host an HTTP server to grab the stream from, as it only supports getting videos from URLs. Audio is also in MP4 format, so this should work for it too :D"}, {"post_id": 39802, "ts": "2026-08-03T01:12:06Z", "hours": 2.3247, "text": "Working on some SABR parsing stuff, I got StreamProtectionStatus & NextRequestPolicy, along with the extraction stuff to get the segment from SABR. Doing this kinda of debugging on airplane wifi is rather hard, as the response is quite big, containing video segments."}, {"post_id": 39281, "ts": "2026-08-02T04:46:10Z", "hours": 4.9647, "text": "OK, a couple fun things. I finally got an output from SABR yay! The bug was really stupid, and it took me wayyy to long to figure out. I get the ustreamerconfig as base64, HOWEVER, this isn’t standard base64, it’s URL safe base64… for some reason. To send it in SABR, I have to turn it into bytes, specifically an NSData. These old iOS versions don’t have a standard base64 library, so I import one. The base64 library does not accept the - & _ type, and instead of like throwing any sort of error or even a log, it just… ignores them! So the error was actually accurate, it was a malformed config, specifically ustreamer config. I also did some stuff on POTokens. It appears that youtube did an update, and the POToken engine does more checks to see if it’s on youtube.com, or something like that. It seems it now specifically refuses POTokens were minted on not youtube.com, and only for the video id case, and only sometimes, specifically if fexp in the URL is 51973818, if it’s 51973819 it works. Also for some reason on my end using the visitorData works, which it doesn’t for other people in the youtube.js discord. Oh I should mention it also affects the library BgUtils, which my thing (and yt-dlp, and literally everything) is based on/uses. For now, i’m going to ignore the POToken issue, since I’m honestly not that great at debugging the youtube’s JS (i spent like a couple hours trying, if you search for function Vr in the base.js you’ll find something in the POToken minter as of right now). However according to Luan (the author of the BgUtils thingy), nothing changed in the player code, so idk, Idk how I could really debug the potoken engine. Oh also, something… interesting, someone else in the BgUtils discord decided to uhh fork my thing and using the power of AI, implement POToken gen using QuickJS. I initally tried this for POToken gen but got stuck with me missing polyfills. I’m considering taking parts of the forked code (specifically the polyfills), and some of my older QuickJS code and having two POToken systems you can switch between in case one breaks (ES6 issues for example), but idk if I should. I guess for now, I get to go actually write an implementation reading SABR data/UMP now. Maybe i’ll be doing this on a plane again :D (return flight)"}, {"post_id": 34375, "ts": "2026-07-25T01:13:15Z", "hours": 7.5297, "text": "I’ve been doing a lot of work on getting SABR playback working. I think i’ve got sending “preferred” audio & video formats, client info stuff and probably some other things too. Currently the only response I have is sabr.malformed_config (2c1d0a15 73616272 2e6d616c 666f726d 65645f63 6f6e6669 6710021a 022006). Most of these 7h 30m were done on the ground, but i’m working on this at 37 000ft in the air. Had to do some hacks & scripting to get this to connect to the internet, which needs you to watch an ad every 30 minutes."}, {"post_id": 32689, "ts": "2026-07-22T00:21:33Z", "hours": 2.3422, "text": "I did a bunch of integration stuff, and cleanup, but now it plays 360p from the mweb client! I had to add an extra way to decipher n/sig to it (since youtube is yes), but it seems decently reliable, execpt for me not having POToken generation checks to see if it’s ready. Hopefully shouldn’t be too hard :)"}, {"post_id": 32532, "ts": "2026-07-21T19:26:46Z", "hours": 0.4147, "text": "iOS 5 now works with the botguard stuff! It was pretty simple, I just had it load the cloudflare version of polyfill.io and copied the JS it gave (since it’s based on UA)"}, {"post_id": 32499, "ts": "2026-07-21T18:34:50Z", "hours": 1.1594, "text": "I did some minor optimization of the POToken stuff, so it doesn’t block the main (UI) thread for too long, turning 2478.5ms -> 8.8ms by adding a 0 second settimeout when starting the botguard VM. I also went to go check on iOS 5. When there, I noticed my analytics temp file was failing to write, meaning it sent a “installed” event every launch. This is well… bad. It means my analytics are bad yay! I added a small check to see if I can actually write this file before sending it off, i’ll diagnose it later."}, {"post_id": 32158, "ts": "2026-07-21T03:56:13Z", "hours": 0.7561, "text": "And finally, I DID IT!!!!!!!!!!!!!!! YESS!!!!! This URL was generated on the phone, from a URL from the mobile client, meaning I can now get signed in videos. This was months and have ruined the speed of startup… BUT IT WORKS!!!!! I also have to actually make it like use the n/sig function, and do other tweaks since I used a proxy to manually implant the URL. It also means I can finally start making a SABR client inside this. I am very happy 😭"}, {"post_id": 32127, "ts": "2026-07-21T02:27:00Z", "hours": 3.8428, "text": "YESSS I HAVE A N/SIG SOLVED WITH JS CHALLENGE. I am yet to test if it’s valid though, here’s hoping lol."}, {"post_id": 31906, "ts": "2026-07-20T17:49:16Z", "hours": 1.3297, "text": "In an effort to keep it on device, I tried switching to tree-sitter. I got it all compiled for iOS, and I did get it to just parse the javascript on device! However, it took 40 seconds to parse. Along with this, RAM usage went from 58MB -> 220MB. The 3GS (one of the current targets) only has 256MB, and if I ever even try on the 3G, that only has 128MBs of ram. This is very bad. As much as it pains me, I think the best solution would likely be to have a server pick out the n/sig function, and have the device pull a json file or something which has the functions it needs. Kinda does ruin the “no server is involved” stuff with this, but that kinda does seem like the sacrifice I have to make unfortunately. Sadge :("}, {"post_id": 31547, "ts": "2026-07-20T01:21:56Z", "hours": 2.8094, "text": "So I decided to look at n/sig, as that’s what I need next. N/Sig is basically two steps Find the function for n/sig Run that function. The n/sig function is located somewhere in https://www.youtube.com/s/player/882a803a/player_es6.vflset/en_US/base.js (the link changes as new players come out, so it’s dynamic). If you look at it for a bit, you may notice it’s quite big. 2.4mb. Every other tool puts it into something called meryiah, a JS parser. https://meriyah.github.io/meriyah/ . If you try to put that script into that site, you will notice the output is extremely long. It’s long enough that you cannot select all of it. It’s also long enough to cause memory exhaustion. This is a problem. I cannot run this on my device without causing an out of memory crash. I’m unsure right now how I should get around this, but we will see I also did some integrating the POToken stuff with the rest of that app, but that was relatively minor execpt for the bad memory management I do biting me in the ass. I think this may have also destroyed launch preformance, but i guess we have to see."}, {"post_id": 31466, "ts": "2026-07-19T20:51:47Z", "hours": 1.5017, "text": "I quickly did coldstart token generation. This is intended for when the POToken engine is starting up/unavailable. It’s used to allow for instant playback on actual youtube, and here too I hope. There’s a few things I need to do to make sure this works alright. Right now, if there’s no network on startup, the engine will just be perpetually broken, and that’s not great, so I need to handle that, along with actually integrating it with the rest of the tweak."}, {"post_id": 31112, "ts": "2026-07-19T07:51:46Z", "hours": 2.9272, "text": "i did it! i now have a POToken on device. God that took far too long lol. Now I actually have to like… use them. im going to bed."}, {"post_id": 31024, "ts": "2026-07-19T02:36:09Z", "hours": 5.005, "text": "Probably had some other things, but I got the botguard response in the youtube app instead of the YT Capture app. This was shockingly annoying, since idk why, but the GTMHTTPFetcher just… doesn’t work on the youtube app? Since at least for now this is iOS 5+, I just switched to an equivalent function in the NS stuff. Right now this does botguard responses only, but I need POToken generation, so here I go i guess….. (isn’t this just riveting?)"}, {"post_id": 21806, "ts": "2026-07-03T22:44:25Z", "hours": 4.5053, "text": "I decided that QuickJS was just not working out, and decided to switch over to a hidden webview. I had a few hiccups due to the fact that it’s an ancient webview, and thus missing functions like await, async, and Symbol. The latter was required by the botguard’s iframe, which caused issues trying to polyfill it, but I got there in the end. And now I have a fresh botguard token! Now it’s time for POTokens, and then the needed tokens for uploading videos!"}, {"post_id": 21213, "ts": "2026-07-03T01:08:14Z", "hours": 3.8242, "text": "I fixed an issue where videos with a view count over the 32bit integer limit (2.14B) go into the negatives. This was relatively annoying since the issue was the app turning the int64 into an int when passing it to a function to display the video, meaning I had to RE & recreate the functions for displaying video info three times! (1.2.1 & 1.3.0 had different versions for iPad, and 2.0.0) Also did a small fix to the dislikes where viewing a video where more dislikes than likes (baby shark) would make the likes & dislikes 50/50."}, {"post_id": 18845, "ts": "2026-06-30T01:30:09Z", "hours": 5.8875, "text": "Took a break from PO stuff still, but now you can select a specific channel, though i’ve hidden my other one bcuz privacy."}, {"post_id": 9060, "ts": "2026-06-15T04:01:08Z", "hours": 0.3219, "text": "Since I keep seeing crash reports from people not reading “Known Issues”, i’ve added one for this, and iPad on iOS 9 incompatibilities. Hopefully I will stop seeing all this :)"}, {"post_id": 9053, "ts": "2026-06-15T03:35:25Z", "hours": 5.7428, "text": "I am taking a break from POToken for now, since they are legitimately hell, and it’s kinda gotten in a state where too much is broken and I must do a patch to fix these issues. I’ve managed to fix most of the issues which include Sentence based instead of word based captions not being handled “Viewer Discretion” videos not playing due to some missing flags RYTDL now uses ratio stuff with the from youtube like count instead of relying on just sometimes broken data from RYTDL Homepage length being broken Playlist content (trending, categories, playlists (duh), favourites, watch later) no longer appearing Removing the now broken “Adaptive” option (rip)"}, {"post_id": 7077, "ts": "2026-06-11T21:03:53Z", "hours": 3.9622, "text": "I’m getting somewhere but it’s still quite wrong. I managed to “pass” initalization, but generating a botguard response is just flat out broken. This should look very different. I changed out some bits on how setTimeout & setInterval to get it to initalize, but I don’t know if something there is wrong or what is happening :("}, {"post_id": 1889, "ts": "2026-06-04T03:24:22Z", "hours": 2.4694, "text": "Sooo uhh suffering :D I do not know everything in this 2h 26m, but I spent a bunch of time rewriting some of my requesting stuff to have auth for challenges, and debugging why the challenge response I got was junk. Turns out, I’m bad at javascript and didn’t properly await -_-. Now I can actually get a completed challenge! but only currently in the browser… Time to try it on device!"}]...
|
Title: TubeReplacer by @Preloading | Stardance
De Title: TubeReplacer by @Preloading | Stardance
Devlogs:
Sooo uhh suffering :D I do not know everything in this 2h 26m, but I spent a bunch of time rewriting some of my requesting stuff to have auth for challenges, and debugging why the challenge response I got was junk. Turns out, I’m bad at javascript and didn’t properly await -_-. Now I can actually get a completed challenge! but only currently in the browser… Time to try it on device!
I’m getting somewhere but it’s still quite wrong. I managed to “pass” initalization, but generating a botguard response is just flat out broken. This should look very different. I changed out some bits on how setTimeout & setInterval to get it to initalize, but I don’t know if something there is wrong or what is happening :(
I am taking a break from POToken for now, since they are legitimately hell, and it’s kinda gotten in a state where too much is broken and I must do a patch to fix these issues. I’ve managed to fix most of the issues which include Sentence based instead of word based captions not being handled “Viewer Discretion” videos not playing due to some missing flags RYTDL now uses ratio stuff with the from youtube like count instead of relying on just sometimes broken data from RYTDL Homepage length being broken Playlist content (trending, categories, playlists (duh), favourites, watch later) no longer appearing Removing the now broken “Adaptive” option (rip)
Since I keep seeing crash reports from people not reading “Known Issues”, i’ve added one for this, and iPad on iOS 9 incompatibilities. Hopefully I will stop seeing all this :)
Took a break from PO stuff still, but now you can select a specific channel, though i’ve hidden my other one bcuz privacy.
I fixed an issue where videos with a view count over the 32bit integer limit (2.14B) go into the negatives. This was relatively annoying since the issue was the app turning the int64 into an int when passing it to a function to display the video, meaning I had to RE & recreate the functions for displaying video info three times! (1.2.1 & 1.3.0 had different versions for iPad, and 2.0.0) Also did a small fix to the dislikes where viewing a video where more dislikes than likes (baby shark) would make the likes & dislikes 50/50.
I decided that QuickJS was just not working out, and decided to switch over to a hidden webview. I had a few hiccups due to the fact that it’s an ancient webview, and thus missing functions like await, async, and Symbol. The latter was required by the botguard’s iframe, which caused issues trying to polyfill it, but I got there in the end. And now I have a fresh botguard token! Now it’s time for POTokens, and then the needed tokens for uploading videos!
Probably had some other things, but I got the botguard response in the youtube app instead of the YT Capture app. This was shockingly annoying, since idk why, but the GTMHTTPFetcher just… doesn’t work on the youtube app? Since at least for now this is iOS 5+, I just switched to an equivalent function in the NS stuff. Right now this does botguard responses only, but I need POToken generation, so here I go i guess….. (isn’t this just riveting?)
i did it! i now have a POToken on device. God that took far too long lol. Now I actually have to like… use them. im going to bed.
I quickly did coldstart token generation. This is intended for when the POToken engine is starting up/unavailable. It’s used to allow for instant playback on actual youtube, and here too I hope. There’s a few things I need to do to make sure this works alright. Right now, if there’s no network on startup, the engine will just be perpetually broken, and that’s not great, so I need to handle that, along with actually integrating it with the rest of the tweak.
So I decided to look at n/sig, as that’s what I need next. N/Sig is basically two steps Find the function for n/sig Run that function. The n/sig function is located somewhere in https://www.youtube.com/s/player/882a803a/player_es6.vflset/en_US/base.js (the link changes as new players come out, so it’s dynamic). If you look at it for a bit, you may notice it’s quite big. 2.4mb. Every other tool puts it into something called meryiah, a JS parser. https://meriyah.github.io/meriyah/ . If you try to put that script into that site, you will notice the output is extremely long. It’s long enough that you cannot select all of it. It’s also long enough to cause memory exhaustion. This is a problem. I cannot run this on my device without causing an out of memory crash. I’m unsure right now how I should get around this, but we will see I also did some integrating the POToken stuff with the rest of that app, but that was relatively minor execpt for the bad memory management I do biting me in the ass. I think this may have also destroyed launch preformance, but i guess we have to see.
In an effort to keep it on device, I tried switching to tree-sitter. I got it all compiled for iOS, and I did get it to just parse the javascript on device! However, it took 40 seconds to parse. Along with this, RAM usage went from 58MB -> 220MB. The 3GS (one of the current targets) only has 256MB, and if I ever even try on the 3G, that only has 128MBs of ram. This is very bad. As much as it pains me, I think the best solution would likely be to have a server pick out the n/sig function, and have the device pull a json file or something which has the functions it needs. Kinda does ruin the “no server is involved” stuff with this, but that kinda does seem like the sacrifice I have to make unfortunately. Sadge :(
YESSS I HAVE A N/SIG SOLVED WITH JS CHALLENGE. I am yet to test if it’s valid though, here’s hoping lol.
And finally, I DID IT!!!!!!!!!!!!!!! YESS!!!!! This URL was generated on the phone, from a URL from the mobile client, meaning I can now get signed in videos. This was months and have ruined the speed of startup… BUT IT WORKS!!!!! I also have to actually make it like use the n/sig function, and do other tweaks since I used a proxy to manually implant the URL. It also means I can finally start making a SABR client inside this. I am very happy 😭
I did some minor optimization of the POToken stuff, so it doesn’t block the main (UI) thread for too long, turning 2478.5ms -> 8.8ms by adding a 0 second settimeout when starting the botguard VM. I also went to go check on iOS 5. When there, I noticed my analytics temp file was failing to write, meaning it sent a “installed” event every launch. This is well… bad. It means my analytics are bad yay! I added a small check to see if I can actually write this file before sending it off, i’ll diagnose it later.
iOS 5 now works with the botguard stuff! It was pretty simple, I just had it load the cloudflare version of polyfill.io and copied the JS it gave (since it’s based on UA)
I did a bunch of integration stuff, and cleanup, but now it plays 360p from the mweb client! I had to add an extra way to decipher n/sig to it (since youtube is yes), but it seems decently reliable, execpt for me not having POToken generation checks to see if it’s ready. Hopefully shouldn’t be too hard :)
I’ve been doing a lot of work on getting SABR playback working. I think i’ve got sending “preferred” audio & video formats, client info stuff and probably some other things too. Currently the only response I have is sabr.malformed_config (2c1d0a15 73616272 2e6d616c 666f726d 65645f63 6f6e6669 6710021a 022006). Most of these 7h 30m were done on the ground, but i’m working on this at 37 000ft in the air. Had to do some hacks & scripting to get this to connect to the internet, which needs you to watch an ad every 30 minutes.
OK, a couple fun things. I finally got an output from SABR yay! The bug was really stupid, and it took me wayyy to long to figure out. I get the ustreamerconfig as base64, HOWEVER, this isn’t standard base64, it’s URL safe base64… for some reason. To send it in SABR, I have to turn it into bytes, specifically an NSData. These old iOS versions don’t have a standard base64 library, so I import one. The base64 library does not accept the - & _ type, and instead of like throwing any sort of error or even a log, it just… ignores them! So the error was actually accurate, it was a malformed config, specifically ustreamer config. I also did some stuff on POTokens. It appears that youtube did an update, and the POToken engine does more checks to see if it’s on youtube.com, or something like that. It seems it now specifically refuses POTokens were minted on not youtube.com, and only for the video id case, and only sometimes, specifically if fexp in the URL is 51973818, if it’s 51973819 it works. Also for some reason on my end using the visitorData works, which it doesn’t for other people in the youtube.js discord. Oh I should mention it also affects the library BgUtils, which my thing (and yt-dlp, and literally everything) is based on/uses. For now, i’m going to ignore the POToken issue, since I’m honestly not that great at debugging the youtube’s JS (i spent like a couple hours trying, if you search for function Vr in the base.js you’ll find something in the POToken minter as of right now). However according to Luan (the author of the BgUtils thingy), nothing changed in the player code, so idk, Idk how I could really debug the potoken engine. Oh also, something… interesting, someone else in the BgUtils discord decided to uhh fork my thing and using the power of AI, implement POToken gen using QuickJS. I initally tried this for POToken gen but got stuck with me missing polyfills. I’m considering taking parts of the forked code (specifically the polyfills), and some of my older QuickJS code and having two POToken systems you can switch between in case one breaks (ES6 issues for example), but idk if I should. I guess for now, I get to go actually write an implementation reading SABR data/UMP now. Maybe i’ll be doing this on a plane again :D (return flight)
Working on some SABR parsing stuff, I got StreamProtectionStatus & NextRequestPolicy, along with the extraction stuff to get the segment from SABR. Doing this kinda of debugging on airplane wifi is rather hard, as the response is quite big, containing video segments.
Actually doing something with the media data we get from SABR now. I have decided that probably the best way to implement this is to convert it into an HLS stream. I came to this decision after fully looking at what SABR outputs, a fragmented MP4 intended for DASH, which the phone cannot play. However, SABR splits up the files based on the header first, then a bunch of fMP4 fragments. With a lot of work, I should be able to manually change the container from fMP4, to MPEG-TS, the format used by HLS, and have it streamed. It does have some hickups, changing stream to a lower or higher quality while streaming would likely be difficult (more concerning with it being a server adaptive bit rate system). Also MPEG-TS looks kinda… janky? This may also bring me some trouble if I chose to add Opus audio, since much of the audio streams are Opus based. Anyways, I now parse the first MP4 stream we get per format (audio & video), specifically the initialization section, and create an HLS manifest out of it! My next step is probably to have the phone itself host an HTTP server to grab the stream from, as it only supports getting videos from URLs. Audio is also in MP4 format, so this should work for it too :D
POTokens actually work! current protection status being 1 means the session is approved and good to continue throughout the entire stream! I basically implemented the PR at https://github.com/LuanRT/BgUtils/pull/44 , and did some user agent fixes… and my fuckup mis-spelling something I literally said in comments I might of 😭 . And now I get SPS of 1! :D :D :D It only took… like 3 months…. for potokens… 😔 I also figured out that Web offers an HLS stream if you specify an iOS useragent… uhhhhh i pretend not to see (for now), I’m sunk cost right now, and such. I wanna commit video container crimes!
I did some extra work trying to parse MP4, but like… this is going to be a lot of effort to do, and just for the video, not even looking at audio yet. For this reason, I would like to bundle parts off FFMPeg with it, but compiling it is being terrible… I got arm64 after a while, but armv7 just does not want to go :(
I decided compiling FFmpeg was going to take forever, uhh doesn’t really give good stardance hours, and this is does more stardance hours ig… I did tfdt, tfhd, and trun parsing. I think this is all the parsing I need to do on the video side and the fragment size… i hope. Here’s a screenshot of me just printing the sample size to syslog.
I now grab h264 samples, and convert them into annex b samples. I think the next part might be actually building the TS file! wow! This means creating packets of the data, and then making packets out of those packets (why…)
Quite boring when all that exists in these devlogs is random hex eh? Hopefully this should be the last hex blob before actually getting some kinda of video to play! (maybe, miiiight have to do one more as I hook the TS file up with the HTTP server). I managed to packetize the data into PES packets. The next thing for video (no audio) should be packing it all up in one nice TS file. And then if we get lucky, we will get like 4 seconds of a video :D, maybe even up to like 10 since then the buffer runs out, and second requests to SABR aren’t implemented yet.
Unsure how much of a win this is, but at least FFplay can play the video! However, VLC, built in media players on windows, and more importantly, the video player within iOS 6 cannot play it :( I’ve forced it to use 144p for a while now for a small file size, but it should be able to go quite up in size. Bigger issue is getting it to play, however I think I will wait on that, and work on having it serve the files on the phone so I can debug this a bit easier, and have the player actually like play the files without my syslog stuff. Hopefully I can get the video to play tho :)
IT PLAYS!!!!!!!!!!!!!!!!!!!!!! YES!!!!!!!!!!!!!! that took wayyy too much debugging (and i also used ai assistance to tell why it wouldn’t play). I got it first working with VLC & other media players, but the iOS 6 player was especially stubborn. It only plays a couple seconds since I only do one request, but it plays. Did i mention it plays? I might try forcing it to use 1080p since 144p is a little… lacking in quality and SABR is defaulting to it, i guess i’ll figure that out later.
srry for audio, i am in a discord call, but i managed to get more than like 20 seconds to work, however it currently gobbles RAM, and has wayyyy too many crash bugs. I fixed a bunch of the crash bugs, and broken stream bugs, but there’s still some crashing, esp. on video end.
I managed to make the buffering system a little more robust, it can complete a video & even seek if your careful to let it play out. I also fixed some of the memory leaks, you can get much farther, but it does still only climbs, at the end of this 25 minute video it got up to 189mbs of ram used, which means we basically leaked 100mb of ram. This is quite unacceptable still, and I get to do more of figuring out why, yay!
Figuring out why the player view was never getting freed was taking too long, so uhh audio! yes! I have managed to grab the header out of the app after having to patch wayyy too many bugs with the header parsing, some of which could crash the app if your network is bad. Tiem to parse dis audio header!
OK, so this was quite annoying, It was really hard to find any docs on how esds is decoded, but I got there in the end, these are some of the parts I need to make the ADTS header ( https://wiki.multimedia.cx/index.php/ADTS ). The decoder is quite bad, and just ignores some cases, but hopefully it will work :)
Shockingly, now that I have most of the TS stuff already in place for video, audio is shockingly painless! It was only just like the previous thing, and ADTS headers, https://wiki.multimedia.cx/index.php/ADTS . Time to try it on device!
It kinda somewhat maybe works! you can make it through a video, however scrubbing thru the video takes forever (some request never finishes), and theres some random stutter in the video. RAM usage is still a problem, and private videos don’t play. To get here, I did things how the HTTP server wanted so other requests can come in while i’m waiting for a segment, and allows this to play fully, however I do still need to fix the buffering issues.
I managed to fix most of the RAM issues, excluding the one inside the youtube app which my stuff amplifies. I’ve done some stuff to allow you to change apps, lock the phone, etc, and have the stream recover. It’s not perfect, but it works well enough.
I fixed the support in 1.0.0-1.3.0, 1.4.0 and above, they started changing a bunch of player things which I still have to figure out….
I spent a bit of time fixing up the settings menu to properly have the HD options. Unsure how much of this is going to stay like this, but right now both of the HQ ones work, the 360p (Android) plays with SABR for a bit, then it stops as we don’t have proper attestation (our POTokens only work on web based clients). Probably going to have to forbid using sabr on ANDROID. Unsure yet about Android VR or visionOS. They both need a visitorData, which I still have to get. VisionOS has the nice perk of giving a completely unprotected HLS stream, which this can use. Android VR is traditionally unprotected, but I think they kinda ruined that. I also did a tiny bit of work to get closed captions working, which is basically prefixing https://www.youtube.com to the URL if it begins with a slash
A bunch of smaller bugfixes, and now it runs on iOS 5. There was some small differences since polyfils, and it doesn’t work with a proxy on (since it proxies localhost). The left device is iOS 5.
i managed to get private videos to work, however they still don’t show up in the “Uploads” tab.
Managed to get videos to count towards your history! Also some kinda boring optimization things (start parsing even while we are still downloading, because net neutrality doesn’t exist for some reason, and someone got 22 seconds for a 2mb file)
I managed to get 1.4.0 support working! They started kinda doing what I implemented myself…. which causes issues, but it works! 2.0.0 is going to be hard tho…
2.0.0 support! and actually 1.4.0 support this time (oops, i think i clicked the wrong version…). I really hacked my way to 2.0.0 support, as it adds all the stream data to a protobuf container thingy which is never actually generated as protobuf. The protobuf also isn’t a normal function, and I couldn’t figure out how to recreate it, not that it would really work if it does do some protobuf shenanigans. So I did what probably every programmer does, hack it in poorly. When it starts trying to play the video, after the protobuf section, and where i still have access to the legacy GData streams, and I just shove it in there, and it manages to work! Also had to do some extra things to include valid authentication to the SABR stuff so it can play private videos and such. But now 2.0.0 works!
A bunch of signin fixes, I fixed the channel id finder failing for different accounts, and I fixed an issue where one of the requests I did on 2.0.0 is synchronous and would not let the app start until it completed.
i did a bunch of misc fixes which aren’t interesting. iOS 5 preference fix some reloading of video changes with SABR cleanup of a bunch of things a fix to the item count (cuz 32bit limit aaaaaaa) memory things some crash bugs with SABR
I made some of the settings work, and also made it hide the comments count which I don’t have a way of getting a precise number right now. Ignore the playback error.
Some minor sabr tweaks, and also a fix to the channel id failing to load for certain feeds
So this one is small, but I’ve done an optimzation for the process of getting that little thumbnail. The older youtube clients did indivisual, very small requests for the specific channel, incl the thumbnail. I already have this data with the video requests, and getting the channel data is rather wasteful of the network and slow. I’ve replaced it with just using the avatar from the feed. Speeds things up a decent chunk!
Did a small hack to add the tweak’s version to the crash reports
I did a bunch of things, none of which felt that interesting to make a log for, so here’s one big one. The quality selector now works You can now toggle video stats (logging in history) on or off. Some error handling and trimming stuff to save on ram
Bugfixes! I’ve decided it’s probably good enuff to “feature lock” and just get it ready for release (also cuz stardance ends soon, yet the streak thingy to a plushie continues. as its ending. why. i wanna take a break!) Not much images but Fix an issue with my trimming stuff not working on 1.4.0 Managed to cleanup the stream when switching video on 2.0.0 Some missing thing on the thumbnail speedup thing My failing to do requestProfileForIdentity correctly.
I managed to get N/Sig deciphering working with HLS streams, meaning you can now watch livestreams, if you change up some settings & it’s buggy. I’m not intending on shipping proper stream support right now, so this will do for release.
Made it zip the network log stuff for sending over email, as text files generally have a really good compression ratio, (the file is actually 2mb), and email has really low limits.
Bugfixes! fixed a bug where playlist videos fail to play on channel playlists fixed the open source licesnses page crashing on 2.0.0 fixed a bug where closed videos in 2.0.0 continue to play after closing, locking the phone, then unlocking fixed a crashing bug when not connected to internet when fetching profile
So, it randomly decided to break for many videos, and only for some people. It appears that YT is doing extra things to detect adblockers on web, and something I’m doing is triggering the adblock detection. This is uhh bad :) I get to figure out what I’m missing and implement it properly. Now for bugfixes I made fixed a signin crash on 1.0.1 & 1.1.0 due to a missing cflag fixed the video date failing to load on iOS 5 added proper backoff to SABR
Did some stuff to make the challenge solver/nsig/potoken restart when needed. Also reorganized it a lot of that file.
Oh dear, publishing it to the world! I’ve decided to say “fuck it, its good enough”. There are some issues which has popped up, like some versions crashing, and the SABR stream never starting issue. I’m praying that it’s not just that bad. Made a reddit post about it :3 https://www.reddit.com/r/LegacyJailbreak/comments/1wnh4il/ Hopefully this doesn’t go catastrophic! I also have to setup a demo. Right now, the big issue is how to. Just a video is kinda… lame? So I want to do somehow make it an interactable demo. However, there is not an emulator for appstore apps for any iOS version between 5-10. This makes things rather tough. I do have some spare phones I can acquire to run it. However, getting the screen out is uhh….. challenging. The version of AirPlay on iOS is too old for the open source projects, and even the closed source, execpt for one, AirServer (which is 20$ per computer). The 30pin -> HDMI adapter -> capture card is extraordinarily unreliable, and keeps disconnecting when I try to use it, and is a pain in the ass to get working. There’s Veency, but it goes black when playing a video, and is unusable slow. And after all that, I have to send it to a server to stream to a web browser, I have to take input, I have to manage launching the correct app, preventing escaping the app, handle crashing, queuing (its one phone so people will have to wait), etc. All in 7 days. oh dear.
Alright, so the results are in. From what it seems, it mostly went well, however there are some issues that came up, primarly due to me not having enough time to test (I released this the day before stardance was extended for another month…. a bit of extra time would have been nice to iron out the few bugs on release, and also time to diagnose the playback errors people encounted). I did a quick 2.0.1 release to fix some of the bigger issues… 5 days after the initial. i’m tired ok?
Cooking up the demo, I’ve basically setup a remote control system on this phone, which should hopefully run over the internet! Giving randos complete control of this phone… what could possibly go wrong???? I still need to do some stuff to lock down the system it runs in, and also patch the problems with tubereplacer that came up recently.
To the demo, I added a time limit & a restart app option in case it breaks and the app has to be restarted....
|
1792529450.069319
|
1793134250.069319
|
|
27346
|
shadow less light by @flyingfish | Stardance
|
flyingfish
|
1
|
200.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T21:59:09Z", "hours": 200.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "this is a desk lamp inspired my surgery lights this is my first time ever doing a pcb or smd soldering i learned a ton it was super fun", "repo": "https://github.com/dinotiger01/shadowless-light", "demo": ""}]...
|
[{"post_id": 71477, "ts": "202 [{"post_id": 71477, "ts": "2026-09-20T21:56:22Z", "hours": 7.8586, "text": "https://youtu.be/H-r51vnOVfs everything is done i can ship now there wasnt a lot of stuff to say in the midle of development so the devlogs got kinda bad around the middle"}, {"post_id": 69984, "ts": "2026-09-18T05:47:32Z", "hours": 6.7189, "text": "i have the video on my phone but i dont have wifi rn so you can have this i assembed every thing and starded the covumantation"}, {"post_id": 68285, "ts": "2026-09-14T20:58:58Z", "hours": 7.6081, "text": "100% done with 3d modeling it just takes a long time to proint everything"}, {"post_id": 66330, "ts": "2026-09-12T03:15:51Z", "hours": 8.2417, "text": "um i have done almost everything besides the case servos were breaking everything so aparently even if you dont use a servo on pin 10 0r 9 the servo lobrary still disables it but i uses those for red and green so i will need to figure that out later all panels and the main board are soldered and wired controlls when you click on the rotary encoder it changes what value you are changeing white - white lights red - red lights green - green lights blue - blue lights yellow - servos (not working) purple - turns on uv on main pannel"}, {"post_id": 65764, "ts": "2026-09-11T03:41:50Z", "hours": 4.5517, "text": "i started soldering everything over to the mother board i was able to dim the lights but i broke also its like green idk but most of the fir ware is done"}, {"post_id": 65105, "ts": "2026-09-10T00:33:09Z", "hours": 2.18, "text": "i have finished most of the soldering the rest is just small stuff"}, {"post_id": 64596, "ts": "2026-09-09T03:20:50Z", "hours": 5.7506, "text": "i am at 7/9 sooo close"}, {"post_id": 64439, "ts": "2026-09-08T20:21:40Z", "hours": 2.9669, "text": "i just made a a panel i am at 5/8 i am going to try to finish the other 3 today also"}, {"post_id": 64073, "ts": "2026-09-08T07:05:34Z", "hours": 3.8169, "text": "i got the uv lights all soldered up and made another panel i have made 4/8 panels i was going to meanchen how i have posted 3 devlogs today but i just noticed it became tomorrow during my last recording"}, {"post_id": 63995, "ts": "2026-09-08T03:05:37Z", "hours": 7.0836, "text": "i did the big one and every single light acualy works this time my back is in extreme consent pain i am almost don with soldering though my eyes i have been staring in to these lights for like 7 hr"}, {"post_id": 63665, "ts": "2026-09-07T16:29:00Z", "hours": 2.4503, "text": "i am starting to get the hang of things i lowered my chair and now i dont have insane back pain"}, {"post_id": 63304, "ts": "2026-09-07T01:49:15Z", "hours": 2.8169, "text": "i got some new stuff for soldering um and my back hurts sooo bad"}, {"post_id": 63218, "ts": "2026-09-06T22:02:36Z", "hours": 5.0336, "text": "yooo"}, {"post_id": 62617, "ts": "2026-09-06T02:45:23Z", "hours": 5.6875, "text": "so like i think i poisoned my self or somthing i wasnt able to get mech work done i am like on the verge of passing out like constently ill do a lot more tomarow"}, {"post_id": 61747, "ts": "2026-09-04T20:03:13Z", "hours": 7.3389, "text": "it works"}, {"post_id": 36826, "ts": "2026-07-29T04:02:13Z", "hours": 6.045, "text": "3d modeling and i hate windows i have finish all the 3dmodling i need to do for now and am now just waiting foe the pcbs to ship in the mean tim i wall be here https://stardance.hackclub.com/projects/41354 clips i added clips on the bottom of the outer pieaces they wew to small on the first print so i made them bigger poles i did almost a com pleat overhaul on the poles i made them connect stronger by making them go deeper in logo * i added the loo to everything because it looks cool control i add a control panel it is at the base of the main light and just kinda sits there idea i have a another idea but i am way to tired to add it rn so i am not adding it till later the idea is to have a light conecten to a pole so i can pull it off to like press it up against things rn i also want to add a uv light to it so i can cure things better"}, {"post_id": 35555, "ts": "2026-07-27T02:13:05Z", "hours": 9.48, "text": "windows is soo slow i am making this because i have been modeling for 10hr and more then 10hr doesn’t log to star dance will make a longer devlog in a bit"}, {"post_id": 33887, "ts": "2026-07-24T05:20:04Z", "hours": 4.9367, "text": "alright i got the pcbs 100% done for real this time UV i fully implemented the UV lights IR i gave the option to attach a it receiver so i can do that in the futor if i want to logo i added the updated logo silkscreen i went through the silkscreen and fixed all there errors check i want through literately every since trace and footprint on these boards to make sure i am actually done designing thease"}, {"post_id": 33673, "ts": "2026-07-23T19:40:16Z", "hours": 5.7425, "text": "so turns out i was not done with the pcbs i redesigned the logo i gave it this outline and added a gear to the light bulb uv i had the idea to add uv light to the light for like idk i will probably never use it but its fun the best use i can think of is curing resen witch is really cool i added them in to the pcb redesign so while adding the uv i realized i didnt use the vertion of the foot print ment for hand a soldering so i made sure to fix that hopfully they are done for real this time"}, {"post_id": 32810, "ts": "2026-07-22T06:19:52Z", "hours": 9.4156, "text": "logo i got everything done to get the pcbs orderd Logo i made a logo so i could add it to the silkscreen for some extra style mother board the mother board is basically an Arduino what directly plugs in to 36 outputs so it can control all 9 boards controll to make the controller i have desided it is going to be comprised of 3 componest the indicator a rotary encoder and a switch indicator it is passively a relay small since wrgb controller so i can do a small display type out but it is also nice because i have extra of all the components so this will make them easy to use for other components jlc is goofy so if you have sevral break away bords in one they charge you for all of them witch is like a lot and the work around is if you split all of them in to there own file it only cost like $2 per board so instead of paying $20 for for board i paid $8 for the same amount this is what i split everything in to fin_right fin_left indicator mother_board main_light"}, {"post_id": 32122, "ts": "2026-07-21T02:09:02Z", "hours": 6.1692, "text": "uh i am so tired i did like 6hr of work while fighting to stay awake split i split the pcb in to 2 100mm sections becouse it is like a lot cheaper. i have no mony to connect between panels i come up with an idea that is rather guineas or it is going to be the biggest mistake in the entire project i put 5 pads on the sides of each board and i am planing to aline the boards then bridge the gap with solder this should electrically connect the 2 boards and hold them together at least a bit net i finished the net on the main pcb i finished the not on the fins flip just like yesterday i flipped the pcb so that the leds work"}, {"post_id": 31867, "ts": "2026-07-20T16:31:24Z", "hours": 7.3906, "text": "data sheet uh resistors i moved the resistors like 5mm apart because i have plenty of space and it will be like X400 easier so solder i am blind i was testing the led so i can make sure every thing works the led is like really small so i was leaning in so that i can see the pins so i can try and turn it on… so like it is super bright and i burned a little dot in my eye data sheet so when i was testing the led i noticed that you need to power it from the left side and i assumed that it was powered from the right side i was curious as to why i got it backwards because i reference the data sheet like all the time. so apparently the schematic counted clockwise. while everything else on the data sheet is counter-clockwise like look at pg 15 and you can see why i assumed the power went from right to left not left to right https://downloads.cree-led.com/files/ds/h/HB-CLW6A-TKW.pdf the flip so i needed to flip the entire pcb becouse the power is on the wrong side i would have just rotated it around but scene the resistors are specific to the pins that wouldn’t work and the leds would burn out i also learned that you cant mirror footprints on kicad so what i did was set the center of my pcb to (0,0) then went through and switch the sign on every x value on the pcb"}, {"post_id": 31021, "ts": "2026-07-19T02:34:27Z", "hours": 6.3408, "text": "i am making things small small i have decided to find some way to fit everything in to 100 mm pieces the old deign would have costed like $30 idk why but pcb manufacturers really like 100mm x 100mm and each only cost like 1 dollar"}, {"post_id": 30448, "ts": "2026-07-18T00:20:00Z", "hours": 4.9019, "text": "pcb are really time consuming i have found (expetaly if you have never used any kinda pcb editor) bigger trace the traces on my pcb before were a bit to small and there was a good chance they would but each light pulls 20mA witch is 0.02A there is 25 lights and each has 4 light in side because RGBW witch means this could potently run at 2 amps and the 0.2 mm traces can only handle like 0.5A(i forgot but it is a smaller number) so i mad most things bigger lets hope it doesn’t explode"}, {"post_id": 29907, "ts": "2026-07-17T02:32:06Z", "hours": 4.6172, "text": "pcbs are like really expenceve so turns out most pcb manufatuers only sell 5 panels at a time so i shrunk my design down to just 2 so i get 10 in total also all the components arrived from mouser because i assumed it would take waaaay longer for them to ship"}, {"post_id": 29262, "ts": "2026-07-16T02:11:59Z", "hours": 6.4558, "text": "i think i got scamed idk why but like a lot of my time just didnt get logged i am working on it fins are done i put the finishing toutches on the fin lights mainly changing out the mosfets and stuff net so i had no clue what net is and aparently i was sposed to be lableing what everything is sposed to canect to so it can auto check for shorts so i spent like 2 hrs individualy assining a value to all the pads on the pcb panalization i was doing a lot of stuff trying to figure out panzatoin its almost done i think"}, {"post_id": 28654, "ts": "2026-07-15T01:16:48Z", "hours": 10.5153, "text": "so i had to go to my grand parents over the week end so i want able to get much work done but i figured out how to use kicad on my laptop so it was funny in the car while we driving i was working and then kicad crashed before i saved and i had to restart and then after i had done it all a second time i saved and turns out my kicad was out of date so i had to restart all i did was sett up the main pcb that has the 25 lights as seen below the zig zag pattern is because all the lights need to be connected in parallel the really weird pattern in the middle right was because the light was too close to the side so i had to move things and that is that only way i could find that things fit new mosfets i just changed the mosfets for fun idk"}, {"post_id": 26330, "ts": "2026-07-11T01:59:42Z", "hours": 10.4356, "text": "i did a lot of work on the pcb and Um idk i burnt my hand RGBW to i decided i would have 10 per segment and 25 on the core 105 in total witch end up at 8 amps and 1050 lumins resistors i decided to giv every pin its own resistor witch ends up with 420 resistor is need to solder i have never hand solder a smd component this is going to be a learning expireence mostfets i think i was high earlier it is like realy easy to fin smd mosfets i added smd mosfets i have in idea regarding the stand i didnt like the crane becouse it was really bulky and i feel like it wont move how i want it to and i wanted like a standered desk lamp where it can me moved easy but it is too wide for that to work well so what if i take the same mechonisum as the desk arm and just mount it to the wall"}, {"post_id": 24530, "ts": "2026-07-08T04:31:37Z", "hours": 5.7922, "text": "so i have to delete all of the pcb work i had before . i learned that making white light with RGB sucks and causes eye strain and it wont be brite enough RGBW i switched to RGBW leds witch is the same but with a dedicated white led the white light fixes both problems the pure white light wont cause eye strain and they are about 4x brighter then the old ones however it took me like 3 hours to figure out how to add a footprint to my library"}, {"post_id": 23669, "ts": "2026-07-06T19:38:41Z", "hours": 4.6003, "text": "so i managed to not save and lost all my progress again pcb rgb so the rgb have common anode(+) witch means yo just need to power the one pin then short witch color you want to turn on i learned how to us the seconded layer in order to hook all the cathodes(-) together mosfet the plan is to use the mosfets to switch each color on using a arduino idk why i couldn’t find any smd mosfets so i added tht mosfets and put them in backward to i can add a heatsink with out it getting in the way of the light resistors idk man its a resistor its not that exiting"}, {"post_id": 23003, "ts": "2026-07-05T18:22:30Z", "hours": 4.7006, "text": "so uh i worked for a long time then a black out hit and i lost all of it"}, {"post_id": 21865, "ts": "2026-07-04T01:07:06Z", "hours": 4.8339, "text": "i finished the crane for the case matirials i decided to make part of the crane out of pvc pipe because idk i don’t know anything better *changeable i made a simple pole connector to hole the thing on so that the crane can hold any future projects if needed *motor i have been debating whether it is worth it to make it motorized at the moment it is set up to be but idk"}, {"post_id": 20491, "ts": "2026-07-02T02:58:40Z", "hours": 4.2003, "text": "so this is the first time i have ever used kicad there is not a lot to say here i just spent like 4 trying to make a pcb and nothing happend execpt things turned green every so often and idk why"}, {"post_id": 19714, "ts": "2026-07-01T03:18:51Z", "hours": 4.7839, "text": "i worked on the core model servo i made places for the servos to sit in the core *the servos will push and pull the control poles to tilt the segments *poles the poles i printed earlier finished and i though i could get away with just 2 servos but i am going to need 4 other then that is seems to work as expected for now *RGB *ngl i just think it would be funny to add RGB and it could help with very specific tasked i gouess *general so i feel kinda dumb but i realized i could add lights on the bottom of the core too so that is something i am working on now i did a lot of general changes to the design mainly getting rid of unneeded plastic witch makes it look cooler"}, {"post_id": 17315, "ts": "2026-06-28T01:16:37Z", "hours": 9.3347, "text": "so i want to make a desk lamp that works the same way that surgery lamps so there is no shadows constraints: bright: i want to be able to use it to see no shadows: i don’t want shadows alright this is the model so far: it has 8 segments : place to mount a pcb a hole with a pole that lets it swivel a second hole to have a pole that can control it moving in and out(see more farther down) each has 2 brackets that hold the swivel pole to the center control poles like the segments there are 8 of these each of them have a hole and a pole the idea is you thread the pole part thought the hole of another one till it comes all the way around then if one is pusher out it should push all of them out i am currently printing some small versions to see if the concept workes center it is curtly just a block with slits for the brackest i am sure there will be more on it latter"}]...
|
Title: shadow less light by @flyingfish | Stardanc Title: shadow less light by @flyingfish | Stardance
Devlogs:
so i want to make a desk lamp that works the same way that surgery lamps so there is no shadows constraints: bright: i want to be able to use it to see no shadows: i don’t want shadows alright this is the model so far: it has 8 segments : place to mount a pcb a hole with a pole that lets it swivel a second hole to have a pole that can control it moving in and out(see more farther down) each has 2 brackets that hold the swivel pole to the center control poles like the segments there are 8 of these each of them have a hole and a pole the idea is you thread the pole part thought the hole of another one till it comes all the way around then if one is pusher out it should push all of them out i am currently printing some small versions to see if the concept workes center it is curtly just a block with slits for the brackest i am sure there will be more on it latter
i worked on the core model servo i made places for the servos to sit in the core *the servos will push and pull the control poles to tilt the segments *poles the poles i printed earlier finished and i though i could get away with just 2 servos but i am going to need 4 other then that is seems to work as expected for now *RGB *ngl i just think it would be funny to add RGB and it could help with very specific tasked i gouess *general so i feel kinda dumb but i realized i could add lights on the bottom of the core too so that is something i am working on now i did a lot of general changes to the design mainly getting rid of unneeded plastic witch makes it look cooler
so this is the first time i have ever used kicad there is not a lot to say here i just spent like 4 trying to make a pcb and nothing happend execpt things turned green every so often and idk why
i finished the crane for the case matirials i decided to make part of the crane out of pvc pipe because idk i don’t know anything better *changeable i made a simple pole connector to hole the thing on so that the crane can hold any future projects if needed *motor i have been debating whether it is worth it to make it motorized at the moment it is set up to be but idk
so uh i worked for a long time then a black out hit and i lost all of it
so i managed to not save and lost all my progress again pcb rgb so the rgb have common anode(+) witch means yo just need to power the one pin then short witch color you want to turn on i learned how to us the seconded layer in order to hook all the cathodes(-) together mosfet the plan is to use the mosfets to switch each color on using a arduino idk why i couldn’t find any smd mosfets so i added tht mosfets and put them in backward to i can add a heatsink with out it getting in the way of the light resistors idk man its a resistor its not that exiting
so i have to delete all of the pcb work i had before . i learned that making white light with RGB sucks and causes eye strain and it wont be brite enough RGBW i switched to RGBW leds witch is the same but with a dedicated white led the white light fixes both problems the pure white light wont cause eye strain and they are about 4x brighter then the old ones however it took me like 3 hours to figure out how to add a footprint to my library
i did a lot of work on the pcb and Um idk i burnt my hand RGBW to i decided i would have 10 per segment and 25 on the core 105 in total witch end up at 8 amps and 1050 lumins resistors i decided to giv every pin its own resistor witch ends up with 420 resistor is need to solder i have never hand solder a smd component this is going to be a learning expireence mostfets i think i was high earlier it is like realy easy to fin smd mosfets i added smd mosfets i have in idea regarding the stand i didnt like the crane becouse it was really bulky and i feel like it wont move how i want it to and i wanted like a standered desk lamp where it can me moved easy but it is too wide for that to work well so what if i take the same mechonisum as the desk arm and just mount it to the wall
so i had to go to my grand parents over the week end so i want able to get much work done but i figured out how to use kicad on my laptop so it was funny in the car while we driving i was working and then kicad crashed before i saved and i had to restart and then after i had done it all a second time i saved and turns out my kicad was out of date so i had to restart all i did was sett up the main pcb that has the 25 lights as seen below the zig zag pattern is because all the lights need to be connected in parallel the really weird pattern in the middle right was because the light was too close to the side so i had to move things and that is that only way i could find that things fit new mosfets i just changed the mosfets for fun idk
i think i got scamed idk why but like a lot of my time just didnt get logged i am working on it fins are done i put the finishing toutches on the fin lights mainly changing out the mosfets and stuff net so i had no clue what net is and aparently i was sposed to be lableing what everything is sposed to canect to so it can auto check for shorts so i spent like 2 hrs individualy assining a value to all the pads on the pcb panalization i was doing a lot of stuff trying to figure out panzatoin its almost done i think
pcbs are like really expenceve so turns out most pcb manufatuers only sell 5 panels at a time so i shrunk my design down to just 2 so i get 10 in total also all the components arrived from mouser because i assumed it would take waaaay longer for them to ship
pcb are really time consuming i have found (expetaly if you have never used any kinda pcb editor) bigger trace the traces on my pcb before were a bit to small and there was a good chance they would but each light pulls 20mA witch is 0.02A there is 25 lights and each has 4 light in side because RGBW witch means this could potently run at 2 amps and the 0.2 mm traces can only handle like 0.5A(i forgot but it is a smaller number) so i mad most things bigger lets hope it doesn’t explode
i am making things small small i have decided to find some way to fit everything in to 100 mm pieces the old deign would have costed like $30 idk why but pcb manufacturers really like 100mm x 100mm and each only cost like 1 dollar
data sheet uh resistors i moved the resistors like 5mm apart because i have plenty of space and it will be like X400 easier so solder i am blind i was testing the led so i can make sure every thing works the led is like really small so i was leaning in so that i can see the pins so i can try and turn it on… so like it is super bright and i burned a little dot in my eye data sheet so when i was testing the led i noticed that you need to power it from the left side and i assumed that it was powered from the right side i was curious as to why i got it backwards because i reference the data sheet like all the time. so apparently the schematic counted clockwise. while everything else on the data sheet is counter-clockwise like look at pg 15 and you can see why i assumed the power went from right to left not left to right https://downloads.cree-led.com/files/ds/h/HB-CLW6A-TKW.pdf the flip so i needed to flip the entire pcb becouse the power is on the wrong side i would have just rotated it around but scene the resistors are specific to the pins that wouldn’t work and the leds would burn out i also learned that you cant mirror footprints on kicad so what i did was set the center of my pcb to (0,0) then went through and switch the sign on every x value on the pcb
uh i am so tired i did like 6hr of work while fighting to stay awake split i split the pcb in to 2 100mm sections becouse it is like a lot cheaper. i have no mony to connect between panels i come up with an idea that is rather guineas or it is going to be the biggest mistake in the entire project i put 5 pads on the sides of each board and i am planing to aline the boards then bridge the gap with solder this should electrically connect the 2 boards and hold them together at least a bit net i finished the net on the main pcb i finished the not on the fins flip just like yesterday i flipped the pcb so that the leds work
logo i got everything done to get the pcbs orderd Logo i made a logo so i could add it to the silkscreen for some extra style mother board the mother board is basically an Arduino what directly plugs in to 36 outputs so it can control all 9 boards controll to make the controller i have desided it is going to be comprised of 3 componest the indicator a rotary encoder and a switch indicator it is passively a relay small since wrgb controller so i can do a small display type out but it is also nice because i have extra of all the components so this will make them easy to use for other components jlc is goofy so if you have sevral break away bords in one they charge you for all of them witch is like a lot and the work around is if you split all of them in to there own file it only cost like $2 per board so instead of paying $20 for for board i paid $8 for the same amount this is what i split everything in to fin_right fin_left indicator mother_board main_light
so turns out i was not done with the pcbs i redesigned the logo i gave it this outline and added a gear to the light bulb uv i had the idea to add uv light to the light for like idk i will probably never use it but its fun the best use i can think of is curing resen witch is really cool i added them in to the pcb redesign so while adding the uv i realized i didnt use the vertion of the foot print ment for hand a soldering so i made sure to fix that hopfully they are done for real this time
alright i got the pcbs 100% done for real this time UV i fully implemented the UV lights IR i gave the option to attach a it receiver so i can do that in the futor if i want to logo i added the updated logo silkscreen i went through the silkscreen and fixed all there errors check i want through literately every since trace and footprint on these boards to make sure i am actually done designing thease
windows is soo slow i am making this because i have been modeling for 10hr and more then 10hr doesn’t log to star dance will make a longer devlog in a bit
3d modeling and i hate windows i have finish all the 3dmodling i need to do for now and am now just waiting foe the pcbs to ship in the mean tim i wall be here https://stardance.hackclub.com/projects/41354 clips i added clips on the bottom of the outer pieaces they wew to small on the first print so i made them bigger poles i did almost a com pleat overhaul on the poles i made them connect stronger by making them go deeper in logo * i added the loo to everything because it looks cool control i add a control panel it is at the base of the main light and just kinda sits there idea i have a another idea but i am way to tired to add it rn so i am not adding it till later the idea is to have a light conecten to a pole so i can pull it off to like press it up against things rn i also want to add a uv light to it so i can cure things better
it works
so like i think i poisoned my self or somthing i wasnt able to get mech work done i am like on the verge of passing out like constently ill do a lot more tomarow
yooo
i got some new stuff for soldering um and my back hurts sooo bad
i am starting to get the hang of things i lowered my chair and now i dont have insane back pain
i did the big one and every single light acualy works this time my back is in extreme consent pain i am almost don with soldering though my eyes i have been staring in to these lights for like 7 hr
i got the uv lights all soldered up and made another panel i have made 4/8 panels i was going to meanchen how i have posted 3 devlogs today but i just noticed it became tomorrow during my last recording
i just made a a panel i am at 5/8 i am going to try to finish the other 3 today also
i am at 7/9 sooo close
i have finished most of the soldering the rest is just small stuff
i started soldering everything over to the mother board i was able to dim the lights but i broke also its like green idk but most of the fir ware is done
um i have done almost everything besides the case servos were breaking everything so aparently even if you dont use a servo on pin 10 0r 9 the servo lobrary still disables it but i uses those for red and green so i will need to figure that out later all panels and the main board are soldered and wired controlls when you click on the rotary encoder it changes what value you are changeing white - white lights red - red lights green - green lights blue - blue lights yellow - servos (not working) purple - turns on uv on main pannel
100% done with 3d modeling it just takes a long time to proint everything
i have the video on my phone but i dont have wifi rn so you can have this i assembed every thing and starded the covumantation
https://youtu.be/H-r51vnOVfs everything is done i can ship now there wasnt a lot of stuff to say in the midle of development so the devlogs got kinda bad around the middle
Ships:
this is a desk lamp inspired my surgery lights this is my first time ever doing a pcb or smd soldering i learned a ton it was super fun...
|
1792856853.0419824
|
1792943253.0419824
|
|
47585
|
Endesium by @nikhil_nagaraj | Stardance
|
nikhil_nagaraj
|
1
|
202.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-31T02:13:35Z", "hours": 202.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I created a Minecraft mod called Endesium, which is an End Update mod. I learned Minecraft modding from scratch for this. There are 10 new biomes, 15 new mobs, 4 new bosses, 4 new sets of armor, and a lot of cool and incredible stuff. The new structures look incredible, like the elderwood sanctum, and many other cool and magnificent structures. It was challenging to figure out how to make custom mob models and make them spawn with boss bars and stuff of that sort. I am incredibly proud of my project, and I have put over 1 weeks worth of time into this project. I have learned many things along the way, and it was truly an incredible experience learning how to make a mod for Minecraft. It is a fabric 1.21.1 mod, sorry no modrinth - that takes weeks to verify.", "repo": "https://github.com/Infernodude777/endesium", "demo": "https://www.curseforge.com/minecraft/mc-mods/endesium"}]...
|
[{"post_id": 58574, "ts": "202 [{"post_id": 58574, "ts": "2026-08-31T01:13:03Z", "hours": 10.8222, "text": "Devlog 28 - The Egg Becomes an Altar hey guys. last devlog for this project The egg now hatches I made the egg hatch into an end golem after 1 minute - a very op, hard to defeat mob. However, defeating it gives 3-5 additional permanent hearts (lose it upon death). Also, when you kill the dragon now, a chest spawns where it died, with dragon wings (gives iron-level protection, slowness 1 while worn, functions like an elytra). what that means for the endgame so the progression reads clean now. beat the dragon, take the egg, set it up,and call up the colossus that guards everything past the first kill. the dragon fight is the warm-up act for something that doesn’t even spawn until you put the trophy to work. that’s it. that’s the end of the end. thanks for following along - go fight the dragon for real, then come back and raise one of your own."}, {"post_id": 57710, "ts": "2026-08-29T23:19:41Z", "hours": 7.3728, "text": "Devlog 26 hey guys. I turned the dragon fight into a bunch of small fixes that all made the fights read better.nothing shiny, just the stuff that was quietly wrong. stuff that was supposed to do stuff but didnt lol the dragon fight had announcements. not the kind players see - the kind thatonly exist in code. the enrage thresholds (“The Dragon Remembers” at 60%,35%, 15%) and the hoard reveal were computed, and then… dropped. a soundplayed, a title was built, and nobody ever saw the title. the function wasliterally called announce and it announced nothing. same story in the special attacks. the imports for title packets were sittingthere, imported and never used. so now the scripted set-pieces finally namethemselves: Burrow - “The Dragon Descends” before the ground starts shifting Seize - “The Dragon Takes You” right before it swoops to carry you aloft Rifts - “Reality Tears” as the gravity rifts start opening around you i’m genuinely annoyed this was broken for as long as it was. the drama of thedragon fight was all there in the code - the escalation, the set-pieces, the named thresholds - and none of it reached the player. now it does. the sentinel’s grab is escapable now the crown sentinel’s grab-and-hurl from a few devlogs ago was a one-way trip.if it got its hands on you, you watched the animation and then got launched.no counterplay, which felt wrong for a fight that’s supposed to be about reading the boss. so it got the same rule the warden and golem already had: deal enough damage mid-hold and it drops you early. 18 damage is the breaking point - enough that you can’t just tickle it, but enough that a player who’s actually fighting back gets out before the throw. it also shields against the worst feeling case, where the hold just deletes you with nothing to do about it. and while I was in there: the goal list had two goals at priority 4, whichmeant the sentinel’s behavior was occasionally picking the wrong thing to doat the same weight. renumbered so the hierarchy actually means something. next up the dragon’s hoard, the sentinel’s other moves, and the stronghold is still missing its advancements - the burrow is found, but it doesn’t have a single achievement attached to finding it. that’s next. the fights are starting to feel like they have a conversation with you now.the dragon tells you what it’s about to do, and you get to do something about it. That is the top view of the crown sentinel btw, it looks pretty dope imo"}, {"post_id": 57406, "ts": "2026-08-29T15:28:56Z", "hours": 10.3303, "text": "Devlog 25 Wrapping things up Hi guys, this was mostly wrapping up the project. I have had a lot of fun working on the project, but I want to ship soon, maybe at like 200 hours. I hope everyone has enjoyed watching my progress on this, as I thoroughly enjoyed working on it myself. I hope everyone gets a chance to try it out and give some feedback. Models I touched up some 3d models and improved them a bit, making them look a bit cleaner. I touched the void stalker’s model, and the dragon’s model primarily Loot tables I customized the loot tables for a lot of the custom or modified structures like the stronghold to be a lot nicer and more fitting towards the endesium mod. They are a lot stronger, but not too OP I’d say. Nothing much else done I know I spent 10 hours coding, but I didn’t get much done because of how long I spent wondering what to do lol."}, {"post_id": 57050, "ts": "2026-08-29T03:50:55Z", "hours": 2.9678, "text": "Devlog 24 - Making the Stronghold Even Better hey guys. DEVLOG_23 was about replacing the vanilla stronghold - the layout, the rooms, the portal cathedral. and it shipped, and it worked, and then i walked back through it and something was off. the shape was right but the rooms read empty. a big citadel of bare stone is just a bigger version of the problem i was trying to kill. so yesterday/today was the boring pass nobody gets excited about in a change log: making rooms feel lived in. the noise every room had the bones but none of the clutter. so i went room by room and dressed them like actual inhabitants left mess behind: wall shelf rows with candles on top, sconce rows down the hall, two-tone floor tiles instead of one flat slab clustered corners - reading nooks, work benches, storage piles - instead of hanging lanterns and chandeliers where the ceiling actually had headroom for them crypts and catacombs got coffin rows, skull niches, soul lanterns barracks got lockers, footlockers, armor stands treasury got actual stacks of gold, not a promise of gold gardens finally read as gardens - flower meadows instead of a dirt square and corridors stopped being dead space: candle runs, clutter, tiled edges.it’s not glamorous but it’s the difference between a structure and a place. three new district wings once the rooms felt alive, the citadel wanted more than the hub spine. so it grew three themed districts, and i love how they ground the place: Forge - a contained lava pit ringed in polished deepslate, anvils, furnaces, coal stores. the stronghold had no industry before; now it reads like it smiths something down there. Dining Hall - a proper mess: table rows, benches, chandeliers. a fortress this size would have somewhere to eat. Prison - iron-bar cells, chains, a witch behind the barracks. every good stronghold needs a brig. plus a monumental columned entrance to the Great Descent Hall, an amethyst landing dais, cross-bridges over the Star well, a grand staircase dropping from the cathedral gallery, and a carpet runner down every corridor so you always know you’re on the path. Also started playing hades :P"}, {"post_id": 56657, "ts": "2026-08-28T14:38:37Z", "hours": 15.6544, "text": "Devlog 23 - The Stronghold Update hey guys.for a while now the Endesium identity stopped at the end. everything past theportal was ours - the island, the dragon, the resonance, the gear - but the road to it was still vanilla’s stronghold. a cramped maze of hallways and libraries copy-pasted a hundred times, holding the exact same end portal the game shipped with in 2011. it never matched. the mod’s big gate got the smallest room in the game.that’s done now. the vanilla stronghold is gone and the Endesium stronghold replaced it: a buried citadel that previews the end without spoiling it. this one took a while, so let me walk the whole thing. the layout: a citadel vanilla strongholds are random. rooms are scattered, corridors dead-end,libraries repeat, and the portal is wherever the RNG put it. the Endesium stronghold is authored : a fixed, connected, three-times-bigger floor plant that always works. a Great Descent Hall buries you - a switchback staircase that drops from the surface as much as 90 blocks down into the stone, red runner carpet down the aisle, end rods lighting the way, two vindicator sentinels waiting at the top. a sealed Arrival Vault is what the eye of ender actually points at: a quiet chamber with a radial purple sigil on the floor and exactly one grounded door - the route onward, always. - the Hub is the spine: an atrium with a carpeted floor, a central resonance dais (amethyst block, end rod, the works), purpur pillars at the cardinal axes, bookshelves and barrels lining every wall, bats circling the ceiling, and a real staircase up to the gallery instead of a visual platform. junctions are readable - four grounded route markers plus a carpet cross - so you never need signs to find your way. the rooms sixteen distinct room kinds, every one hand-dressed:- Library - bookshelves three shelves high around the walls, two lecterns, a chiseled-bookshelf reading dais, blue carpet, bats.- Treasury - iron-bar vault bars with a single gap, chests and barrels in rows, gold, candles, and a captain guarding the middle.- Guard Post - weapon racks (fence posts) with candles, a phantom spawner in the center, two vindicators on the door.- Sanctum - end stone brick floor, purpur pillars, crying obsidian and a chorus plant on a pedestal, purple carpet, an enderman spawner , a live enderman pacing the corner.- Barracks - four red beds with proper head/foot parts, smoker, furnace, crafting table, three guards on duty.- Scriptorium - lecterns with candles, bookshelves and chiseled shelves, a cauldron of ink, a bat haunting the rafters.- Arboretum - a glass-ceilinged garden: dirt floor, flowering azaleas, ferns, moss carpet, a lily pad pond.- Observatory - concentric purpur ring inlays, an amethyst telescope-core, end-rod instruments along the walls.- Resonance Engine - amethyst conduit pillars with end-rod emitters and a crying obsidian reactor - the end’s power plant, studied safely from outside the portal.- Bastion - deepslate pillars, an iron-bar partition, weapon racks, a captain and two guards. military.- Conservatory - chorus plants and chorus flowers growing on end stone, flower pots and moss, an enderman in residence.- Reliquary - concentric obsidian ritual rings, an ender chest at the heart, candles, a captain standing watch.- Portal Cathedral what’s next the stronghold finally reads like the end’s doorstep. next up is the rest ofthe ten-hour pass - every file retyped, every line deliberate - and afterthat, the bosses and dragon still want their second pass of polish. but thegate is fixed. you’ll never walk vanilla’s cramped hallways to the end again."}, {"post_id": 55578, "ts": "2026-08-27T15:02:09Z", "hours": 16.8225, "text": "Devlog 22 - End Fight Update (again)hey guys.this one’s a two-day entry. yesterday was the sky getting alive and the gear lines finally clicking together into actual fighting systems. today was the dragon. the end fight has been building layers for a while - phases, enrage,scripted moves - but it still had one big problem: the first dragon barely used any of it. that’s fixed now. the first kill is the fight now. therespawned one is the nightmare. yesterday - 8/26the sky got three new mobssky jelly, galefin, and deep lurker went in (that one got its own devlog - 21).the sky half of AmbientSkyManager fills the air with biome motes when youfly high, and the deep half keeps the under-island dark honest: lurkersspawned into the black pockets below the heightmap, capped so the deep end isominous without ever becoming a wall.the sets became systemsthe luminous, ash, and null sets each got a cross-set layer inEndgearSetBonuses - wear the full set and hold that line’s tool andarmor + weapon merge into one fighting identity: luminous + prism grip - speed II and haste II while channelling; every hit blinds with a flash (3 true damage + glowing) and sparks light shards.ash + ember core - fire resistance while channelling; hits stoke the burn for 2 extra seconds and throw weight behind the strike.null + erased edge - strength I and haste I; every hit shreds 4 armor durability off the target and drags them into the blade. and the void set finally got its signature: hover. full void set, sneak inthe air, and you stop falling - a gentle drift at -0.12 blocks/tick instead ofa tumble, with void motes trailing under you. it pairs with the sword’ssingularity for total sky control, and it’s the boots’ tooltip promise kept. today - 8/27the dragon actually fights nowthefour-phase fight controller - impact dives, shockwaves, screeches, gales,storms, collapses, the final roar, catastrophe - now runs on the firstdragon too. before, the first kill was vanilla strafing plus harassment, andall the authored grammar was locked behind the respawned dragon. that gate isgone. the first dragon opens with the full attack schedule, escalates throughall four phases, and the transformation still makes things worse: 1.6x scaleand the resonance-exclusive moves are still the awakened dragon’s alone.the pillars became cooler with new mechanicscrystals were just a heal before. now the aegis is a shield:- every surviving pillar grants the dragon 10% damage reduction (capped at 60%), so clearing the pillars is a real first phase, not an optional chore.- destroying a crystal detonates at its pillar with a roar.- the last crystal falling breaks the aegis: the dragon is staggered for five seconds and takes +40% damage, a wisp wave pours out, and the next scripted set-piece fires immediately. that’s your payoff window. set-pieces are guaranteed nowscripted specials used to roll a dice every tick. now they’re scheduled:one opens the fight about thirty seconds in, every enrage escalationforces the next one within a second, and a broken aegis queues one on thespot. the random cadence only fills the gaps. you will see these moves, everyfight, on purpose. two new attacksOblivion Charge (enrage 2+, set-piece) - the dragon climbs high, paints a straight lane through the nearest player with end-rod markers, then dives it twice, tearing through anyone on the line and leaving void-fire wakes in its path. get off the lane.- Resonance Collapse (transformed dragon only) - drags every player toward the dragon for three seconds with converging rings, then detonates at its position. gain distance and find cover; standing still loses."}, {"post_id": 55084, "ts": "2026-08-26T15:11:55Z", "hours": 5.3419, "text": "Devlog 21 hey guys.the End’s been empty for a while. the ecology mobs live on the islands, thebosses live under them, but the sky itself was a void. this one fixes that,and it brings back something else that was missing: three new mobs three new mobs Sky Jelly - ambient, drifts with the wind. a soft bell of a thing withfour trailing tentacles, pulsing gently and leaving end-rod motes behind it.it bobs upward every now and then like it’s breathing. 8 hp, doesn’t careabout you. just ambient. Galefin - the fastest thing in the End. a sleek sky-fish that cutsthrough the air at 0.75 flying speed and avoids you entirely - the momentyou get within 12 blocks it’s gone. 4 hp. you see them flicker past in thecorner of your eye more than you ever actually look at one. Deep Lurker - this is the mean one. it lives below the islands, in thedark air pockets under the heightmap, and it waits. 22 hp, leaps at you,does real damage. when one spawns you get a portal-particle burst as awarning, and then you have maybe a second to look down.all three are geckolib animated - jelly pulses, galefin swims, lurker idleswith a slow head sway - and all three have spawn eggs and their own loottables. the sky and the deep are managed now AmbientSkyManager runs two server-side systems: sky half - if you’re flying more than 12 blocks above the surface, theair around you fills with biome motes (highland wind, lumen motes, endwastes dust). it makes flying at height feel alive instead of empty. deep half - a managed lurker spawner. every 5 seconds it looks for darkpockets below the islands: solid floor, air to spawn in, brightness under 7,at least 34 blocks of island above you. spawns are capped at 6 lurkerswithin 96 blocks per player, so the deep end gets ominous without everbecoming a wall of them. what’s nextthe deep end is less empty now, but it’s still just lurking. the design docskeep pointing at something bigger under the islands - the Umbral Reach - andthe sky could always use more than motes. more ambient life is on the table."}, {"post_id": 54927, "ts": "2026-08-26T05:00:01Z", "hours": 6.7258, "text": "Devlog 20 - Three New Sets this one adds the thing that’s been missing since the void set went in being actual custom armor that isn’t void. Luminous, Ash, and Null are new. 12 armor pieces, 15 tools, all with their own textures, their own powers, and their own place in the creative tab. ##the new sets the void set already had its silhouette and its trim workflow. the new sets follow the same P-mode two-layer model so trims work the same, but they’re recolored palettes with their own read:- Luminous gold-cyan, glassy, the grove’s light. high enchantability, diamond-tier defense with a light-mobility kit.- Ash gray-ember with ember-orange highlights, volcano-forged. slightly lighter than void but built for fire.- Null violet-void, deleted matter. void-tier defense, hungrier enchant cost, gravity-deletion kit. you can read them now none of the three sets had working names before — datagen was fine, but the generated lang had Luminous_helmet with a capital L, so the game looked for item.endesium.luminous_helmet and found nothing. 26 keys showed item.endesium.___ in inventories. src/main/generated/assets/endesium/lang/en_us.json is now lowercase for all luminous/ash/null armor and tools, the phantom Ash_boots is gone. hover a luminous sword and it actually says luminous sword. armor is per-piece now new rule: every single piece does something on its own. the full set is an upgrade, not the only reason to wear it. Luminous — the grove’s light — GearAbilities per piece + tooltips on GearArmorItem : helmet Gleamsight – night vision while worn- chest Radiant Aegis — attackers get glowing 8s; full set Prism Ward adds darkness 3s + 3 magic burn-back- leggings Lightspeed — speed I (II with full set)- boots Lumen Leap — jump II Ash — the volcano — volcano kit, fire is fuel:- helmet Ember Crown — fire resistance while worn- chest Searing Plate — attackers ignite 4s; burning/in lava gives strength I- leggings Magma Blood — regen I while burning/in lava- boots Ashwalker — stand on lava, and now hold shift in lava to sink at -0.18/tick to -0.55 like scaffolding, release and you stay down with LAVA puffs every 4tfull ash Volcanic Heart is permanent strength I. the set wants you in lava. Null — deleted matter — Erased Mind helmet purges levitation/darkness/nausea every tick, Erased Wound chest gives absorption 5s on hit, Weightless leggings no fall damage, Null Step boots +1 step height via attribute, full set Void Body deletes 25% of incoming projectiles with smoke + shield block feedback. what’s next more landmark variants, ambient life for the empty skies, and the deep end is still sitting there being ominous. Sorry, no sneak peak yet - still not finished yet"}, {"post_id": 54260, "ts": "2026-08-25T04:47:26Z", "hours": 6.335, "text": "Devlog #19 Sorry for the random numbering before - i guess i suck at counting. Anyways, devlog. Updated structures Before, structures were just decoration and weren’t technically vanilla structures (kaupenjoe misled me). However, I managed to turn them into structure with help from OpenCode. I also added some new structues, like a castle (needs some works still), some new cathedrals, willowtree trunk, etc. I am adding some more custom armor, and I will make it cool with cool abilities. Custom armor My plan for custom armor includes: Luminous armor (infinite night vision, light level control panel, more ideas to come), Ash armor (fire-related abilities, ashwalker boots already exist) Null armor (i have no idea on what to do for this, but it sounds cool) Dragon fight Improve the dragon fight so it has several new stages Made it so that it spawns void wisps here and there Added a bunch of new drops it gives, working on adding Dragon Wings (slow but give iron-chestplate armor level) What’s next? Add the custom armor and tools and weapons Finish the dragon fight so it is exceptional"}, {"post_id": 53838, "ts": "2026-08-24T15:09:54Z", "hours": 13.1583, "text": "Devlog 16 Short one, but it is the one I have been putting off. The dragon fight was authored with attacks, phases, telegraphs but the pillars were just decor and the last third of the health bar played identically to the first. The pillars fight back Crystal aegis is the simplest thing in the world: while crystals stand, thedragon heals. One line of health regen did more for the fight’s shape than anyattack I have authored, because it moves the win condition backwards. You donot win by out-DPS-ing a health bar; you win by climbing pillars under fire.Five crystals means two HP a second, which is enough to visibly undo a sloppyopening. That is the fight telling you it is watching. Enrage is a ladder, not a switch Three thresholds - 60, 35, 15 percent - each announced, each spawning void wisps into the arena. The wisps are not the threat; they are the clock . Every second you spend swatting a wisp off your back is a second the dragon is cycling toward catastrophe. From enrage two the dragon leaves breath pools under its flight path, which turns its flyovers into map control. killing the dragon The kill now drops a real pile: heart, fangs, bone, resonant scales. First kill still fires the transformation. /dragonfight gives a live readout for tuning the curve without guessing. Notes for next time The wisps cap at eight; if playtests say the floor is unreadable, that cap is the first knob. Aegis regen is intentionally visible (1-2 HP/s). If it feels unfair, the fix is fewer crystals required, not slower regen. Docs live in docs/DRAGON_FIGHT.md now, including the testing checklist."}, {"post_id": 53144, "ts": "2026-08-23T16:05:28Z", "hours": 10.3856, "text": "Devlog 15 this one is mostly bug fixing, and I lowkey should have done it a while ago. two big ones got found and killed. bosses were not spawning properly the wardens were supposed to be standing in every flagship - crypt floors, balcony rings, throne daises, all of it. and most of them just werent there. I found out that the placement helper was asking for a heightmap that doesn’t even exist yet during world gen. so the game would try to figure out where the ground was, get garbage back, fail the collision check, and die To fix it, I (and opencode) used the surface heightmap that actually works mid-generation, check footing with real collision shapes instead of vibes, and stop teleporting interior wardens to the roof. a warden meant to stand in a crypt now stands in the crypt. if there’s genuinely nowhere legal to stand, we log it loudly instead of pretending everything’s fine. the structure grid I noticed flagships spawn in a straight line. I then found out the placement gate checked chunk coords against two fixed numbers with modulo math - which doesn’t pick ONE spot per cell, it picks EVERY chunk that matches the mod. so the game was building a perfect lattice. cathedral, 160 blocks, cathedral, 160 blocks, forever, in neat little rows like crops. landmarks had the same bug at 256 block scale. both features now hash the cell coordinates themselves to pick a single host chunk per region per cell, so every attempt lands somewhere different. flagships also got pushed out to a 384 block minimum since they’re supposed to be rare landmarks. what’s next back to content. more landmark variants, ambient life in the skies, the deep end is still sitting there on the roadmap being ominous."}, {"post_id": 52823, "ts": "2026-08-23T05:32:07Z", "hours": 4.1633, "text": "Devlog 14 hey guys. another one. smaller than 13 but a lot of the actual gameplay got wired up this time. void gear is done netherite-tier stats: 2031 durability, 9.0 attack damage, 4.0 speed. sword, pickaxe, axe, shovel, hoe — full tool set, all void ingot + stick.the armor follows the void set: helmet, chestplate, leggings, boots. two-layer P-mode armor model with gold shoulder plates. helmet has the retexture layers. the full set bonus is coming later but the base is solid. void ingot chain works: void gem -> smelt -> void ingot. ingot <-> 9 nuggets. void brick from void slate (2x2). slab, stairs, wall. all the recipes are wired up in datagen. black holes hold void sword for 5 seconds with the full void set -> singularity fires 6 blocks ahead, pulls everything in a 14 block radius for 8 seconds, 5 minute cooldown. the HUD has a charge bar now: resonance cyan rising to pale glow, ancient gold pulse when full. the label “VOID SINGULARITY” sits above it.this is client-side display only. the actual singularity logic lives on the server through the use item tick. sonic boom elbyra + resonant wings -> press R -> sonic boom fires. client sends a packet, server validates wings + cooldown + alive-ness before executing. keybind registered on client tick. the client is finally wired all 13 entities now have renderers. the crash where any entity without a renderer NPE’d the level renderer is gone. particles registered (void skirt mote), block render layers set for void glass and mireglass (translucent), guidebook screen opens on right-click.dragon armor model layer registered for the resonant wings passives. what was deleted the old void stalker entity, old resonance lens item, old void shard item, old foundation test block, and the old generated loot/recipe/advancement JSONs for them — all removed. everything has been replaced by the production versions.## what’s nextmore ruin variants for the landmark tier, ambient life for the empty skies, maybe the deep end. see the roadmap. go find a black hole.!!! (the black box is the singularity/black hole)"}, {"post_id": 52693, "ts": "2026-08-22T23:37:07Z", "hours": 8.1931, "text": "Update - What I have worked on I have added a custom mini boss per biome, and I have also added a custom big boss that drops op loot. I am working on names and textures, but this is a WIP. This is going really well so far. Future yap I am going to figure out a name for each item, some custom weapons and abilities, then I will balance out the game a bit. Right now, it is too easy to kill a boss, so I will make them harder."}, {"post_id": 52103, "ts": "2026-08-22T05:44:55Z", "hours": 8.0386, "text": "Devlog #12 Hi guys! I added a lot here. Instead of having multiple small structures that are sort of just arbitrary, I made it so that there is just 1 big but incredible structure per custom biome in my end mod. This makes it feel so much cleaner and nicer, and although there are still some bugs that need to be patched, I plan on improving them a lot. Here are some screenshots that I took of updated structures. I plan to make a lot more and better structures in the futures (also the volcano is split in half so you (the ppl) could see the inside with a vault room)"}, {"post_id": 51443, "ts": "2026-08-21T04:51:58Z", "hours": 11.3122, "text": "Devlog 12 this one is huge. i rebuilt basically every system in the mod and fixed a mountain of bugs that were making the whole thing feel broken. endesium finally feels so much better now and actually playable. Updates: Black holes: the void sword’s signature ability actually works now. hold right-click for 4 seconds with full void armor on and a singularity spawns 6 blocks ahead of your crosshair. it pulls mobs, items, everything within 14 blocks with an inverse-square gravity curve plus an orbital swirl near the core, shreds anything caught inside, then implodes after 8 seconds with falloff damage. accretion disc particles orbit it while it’s live. 5 minute cooldown because it is absolutely devastating. full void set makes you immune to your own hole. Void armor + tools: the whole set got redone from scratch. armor textures are now built directly off vanilla netherite’s palette structure (same silhouette, same transparency map) but re-tinted to abyssal navy with cyan seams and gold shoulder trim, so it renders perfectly on the body — no more magenta mannequin glitch. tools now have true netherite stats: 2031 durability, 9.0 speed, 4.0 damage bonus, proper attack speed/damage attributes on every tool so tooltips show real numbers. pickaxe has an AoE resonance blast, axe has a dash, sword applies slow on hit. Ten landmark structures: every biome got a flagship now, not just perimeters. the ashen expanse has a 28-block stratovolcano with lava falls and a hidden obsidian vault, plus a lava-moated bastion fortress. luminous groves has a 27x27 lumen castle with prism-roofed towers. void skirts has a prison citadel with a 16-block spire and nullwalker wardens. there’s also a wastes cathedral with a crypt, a chorus mother tree, a highland lighthouse with a working beacon, a sunken mire cathedral, a crystal sanctum palace, a crown spire, and a null citadel. each one has exclusive loot you can’t get anywhere else, a guardian mob spawner, environmental dangers, and a resonance mechanism to wake. Item art overhaul: every custom item got handcrafted pixel art instead of flat recolors. edge-darkening, biome-specific palettes (lumen lime, ashen fire, crystal lilac, marsh teal), gold flecks on highlights. skyglass shards are faceted ice-blue, the windscar winch is a bronze gear with a hook, prism seeds have rainbow gradients. also resized everything that was clipping outside its inventory slot. Guidebook rewrite: went from 36 pages to 42 across 8 tabs. every biome gets its own page covering blocks, mobs, and landmarks. new pages for the landmark index, biome relics, exclusive loot tables, and the full tool/armor ability breakdown. if it’s in the mod, it’s in the book now. /locate support: added /endesium locate biome and /endesium locate structure commands so you can find any of the ten biomes or any structure from the command line. no more wandering the void for an hour looking for the volcano. Whats next? Dragon fight polish: the respawned dragon phases work but the telegraphs could be way more readable. i want distinct visual tells before each resonance attack. Sound design: most sounds reuse vanilla assets right now. custom .ogg recordings for the black hole ambience and landmark mechanisms would be great as well. More structure variants: the flagships are rare by design, but smaller biome-specific ruins between them would make exploration feel less empty."}, {"post_id": 50774, "ts": "2026-08-20T04:31:52Z", "hours": 4.8667, "text": "Devlog 12 - a shorter one I am working on adding cool stuff like black holes to my end update mod. I want to make it so that if you get full void armor and right click your void sword for 5 seconds, it summons a black hole (with a long cooldown) that affects every entity thats not wearing any piece of void armor. It may look something like in the image below. I don’t have much to yap about here; sorry :P"}, {"post_id": 50352, "ts": "2026-08-19T15:07:19Z", "hours": 10.3525, "text": "Devlog 11hey guys.some pretty large changes were added.I’ve been working on a big stability and polish pass over the whole mod, fixing a bunch of long-standing issues from the brutal audit and making the realm feel a lot more solid.Updates:- Guidebook clarity: The guidebook was pretty blurry in the inventory, so I fixed the item model to use an integer scale with no rotation, and reworked the screen to draw all the text with shadows. It reads crisp at any GUI scale now, and I added a bunch of new pages - field notes on the ruins, a crafting reference, and notes on the resonance system.- Structure stability: Ruins, spires, and archives used to check support at the origin column’s height, which meant they could float over dips or clip into rises on sloped terrain. I switched all three landmark features to per-column support checks, so each column is sampled at its own surface height. They sit on real ground now.- Far chunk writes: The landmark builders were writing blocks into chunks outside the generating region, which triggered “setBlock in a far chunk” warnings and risked corrupting already-saved chunks. I added a write gate to StructurePlacement that refuses any write outside the generating 3x3 region, so the warnings are gone and the footprints still fit fine.- Resonance system: The Resonance attachment was dead code - it had get and add helpers but nothing ever called them. I built a ResonanceSystem that grants resonance when you defeat Endesium mobs, with tier notices when you cross thresholds. It’s wired into the mod now and persists per player.- Texture fixes: void_gravel.png was 15x16 instead of 16x16, which made it shimmer. I wrote a script that pads any non-power-of-two texture up to the next power of two by repeating edge pixels, and swept the whole texture tree so nothing else can regress.- Verification tooling: I added audit_verify.py, a read-only script that checks every audit fix is present in the source tree, plus a guidebook-specific verifier. It exits non-zero on failure so I can run it in CI or before every release.## Whats next?- Resonance recipes: Now that the resonance system is wired, I want to gate some of the later recipes on resonance tiers so progression through the realm actually matters.- Landmark system: The hand-authored structures work, but I’m thinking about moving the big-footprint ones over to the vanilla Structure system so they get proper bounding-box arbitration instead of the write gate.- More guidebook content: The book is a lot better now, but I want to add an interactive region map and maybe a bestiary section before the next devlog. Also some roti buns i had while coding :P"}, {"post_id": 50065, "ts": "2026-08-19T03:36:42Z", "hours": 1.1294, "text": "added a guidebook to my end update mod. This is a simple update, nothing much. I made it look nice, though a bit blurry. I will fix it, then continue improving the rest of the mod. :D"}, {"post_id": 49637, "ts": "2026-08-18T15:02:34Z", "hours": 8.5408, "text": "Devlog - I improved the biomes and structures in my end update mod by a solid bit. There are now volcanoes in the ashen expanse (WIP), monuments, etc. I am also adding a new guidebook that you get by killing the updated ender dragon to help you in your journey of understanding Endesium and conquering the end."}, {"post_id": 48942, "ts": "2026-08-17T14:44:08Z", "hours": 7.7394, "text": "Update on my end update mod: I added several new biomes - the ashen expanse, luminous grove, shattered highlands, umbral reach, void crown, void marshes, and void skirts. I am working on adding mobs and structures unique to each biome to give it some life, but it is coming together really well."}, {"post_id": 48653, "ts": "2026-08-17T04:16:39Z", "hours": 6.1225, "text": "I’m now doing a deep overhaul of the ender dragon fight in my end update mod. I am adding several new attacks, stages, updating the terrain, etc. I am making this much bigger than what is in the base game, and I am also making it so that it can spawn subminions. Overall, the mod is going very well."}, {"post_id": 48429, "ts": "2026-08-16T19:34:55Z", "hours": 4.3747, "text": "updated main end island to be of many parts. I made it so that there’s a central arena, ruins, ridges, fractures (the part visible in the sc), spires, etc."}, {"post_id": 47874, "ts": "2026-08-16T04:11:16Z", "hours": 4.8725, "text": "added two new biomes to my end mod. I added the end wastes and the chorus wilds. Added some structures and new blocks to give it some life, and as well as added the new mob (void stalker) to it. I am working on adding the next BIG biome - the Deep End (and then after that is the void realm)"}, {"post_id": 47615, "ts": "2026-08-15T16:54:50Z", "hours": 5.5167, "text": "Progress Update – Last 5.5 hours Added a bunch of custom items to my end mod, working on adding functionality to different items. It is going very well overall, thank you kaupenjoe for the yt tutorial!"}, {"post_id": 47294, "ts": "2026-08-15T04:52:46Z", "hours": 3.9925, "text": "Setting up some new blocks that are end themed (this one was bugged, working on fixing it.) Adding new biomes, etc."}, {"post_id": 47020, "ts": "2026-08-14T16:43:21Z", "hours": 3.4886, "text": "modeled a mob, created basic implimentation for the void stalker (name of the mob)"}, {"post_id": 46704, "ts": "2026-08-14T04:36:26Z", "hours": 3.2261, "text": "set up a full repository for the minecraft mod endesium (just an end update because mojang hasn’t made one)"}]...
|
Title: Endesium by @nikhil_nagaraj | Stardance
De Title: Endesium by @nikhil_nagaraj | Stardance
Devlogs:
set up a full repository for the minecraft mod endesium (just an end update because mojang hasn’t made one)
modeled a mob, created basic implimentation for the void stalker (name of the mob)
Setting up some new blocks that are end themed (this one was bugged, working on fixing it.) Adding new biomes, etc.
Progress Update – Last 5.5 hours Added a bunch of custom items to my end mod, working on adding functionality to different items. It is going very well overall, thank you kaupenjoe for the yt tutorial!
added two new biomes to my end mod. I added the end wastes and the chorus wilds. Added some structures and new blocks to give it some life, and as well as added the new mob (void stalker) to it. I am working on adding the next BIG biome - the Deep End (and then after that is the void realm)
updated main end island to be of many parts. I made it so that there’s a central arena, ruins, ridges, fractures (the part visible in the sc), spires, etc.
I’m now doing a deep overhaul of the ender dragon fight in my end update mod. I am adding several new attacks, stages, updating the terrain, etc. I am making this much bigger than what is in the base game, and I am also making it so that it can spawn subminions. Overall, the mod is going very well.
Update on my end update mod: I added several new biomes - the ashen expanse, luminous grove, shattered highlands, umbral reach, void crown, void marshes, and void skirts. I am working on adding mobs and structures unique to each biome to give it some life, but it is coming together really well.
Devlog - I improved the biomes and structures in my end update mod by a solid bit. There are now volcanoes in the ashen expanse (WIP), monuments, etc. I am also adding a new guidebook that you get by killing the updated ender dragon to help you in your journey of understanding Endesium and conquering the end.
added a guidebook to my end update mod. This is a simple update, nothing much. I made it look nice, though a bit blurry. I will fix it, then continue improving the rest of the mod. :D
Devlog 11hey guys.some pretty large changes were added.I’ve been working on a big stability and polish pass over the whole mod, fixing a bunch of long-standing issues from the brutal audit and making the realm feel a lot more solid.Updates:- Guidebook clarity: The guidebook was pretty blurry in the inventory, so I fixed the item model to use an integer scale with no rotation, and reworked the screen to draw all the text with shadows. It reads crisp at any GUI scale now, and I added a bunch of new pages - field notes on the ruins, a crafting reference, and notes on the resonance system.- Structure stability: Ruins, spires, and archives used to check support at the origin column’s height, which meant they could float over dips or clip into rises on sloped terrain. I switched all three landmark features to per-column support checks, so each column is sampled at its own surface height. They sit on real ground now.- Far chunk writes: The landmark builders were writing blocks into chunks outside the generating region, which triggered “setBlock in a far chunk” warnings and risked corrupting already-saved chunks. I added a write gate to StructurePlacement that refuses any write outside the generating 3x3 region, so the warnings are gone and the footprints still fit fine.- Resonance system: The Resonance attachment was dead code - it had get and add helpers but nothing ever called them. I built a ResonanceSystem that grants resonance when you defeat Endesium mobs, with tier notices when you cross thresholds. It’s wired into the mod now and persists per player.- Texture fixes: void_gravel.png was 15x16 instead of 16x16, which made it shimmer. I wrote a script that pads any non-power-of-two texture up to the next power of two by repeating edge pixels, and swept the whole texture tree so nothing else can regress.- Verification tooling: I added audit_verify.py, a read-only script that checks every audit fix is present in the source tree, plus a guidebook-specific verifier. It exits non-zero on failure so I can run it in CI or before every release.## Whats next?- Resonance recipes: Now that the resonance system is wired, I want to gate some of the later recipes on resonance tiers so progression through the realm actually matters.- Landmark system: The hand-authored structures work, but I’m thinking about moving the big-footprint ones over to the vanilla Structure system so they get proper bounding-box arbitration instead of the write gate.- More guidebook content: The book is a lot better now, but I want to add an interactive region map and maybe a bestiary section before the next devlog. Also some roti buns i had while coding :P
Devlog 12 - a shorter one I am working on adding cool stuff like black holes to my end update mod. I want to make it so that if you get full void armor and right click your void sword for 5 seconds, it summons a black hole (with a long cooldown) that affects every entity thats not wearing any piece of void armor. It may look something like in the image below. I don’t have much to yap about here; sorry :P
Devlog 12 this one is huge. i rebuilt basically every system in the mod and fixed a mountain of bugs that were making the whole thing feel broken. endesium finally feels so much better now and actually playable. Updates: Black holes: the void sword’s signature ability actually works now. hold right-click for 4 seconds with full void armor on and a singularity spawns 6 blocks ahead of your crosshair. it pulls mobs, items, everything within 14 blocks with an inverse-square gravity curve plus an orbital swirl near the core, shreds anything caught inside, then implodes after 8 seconds with falloff damage. accretion disc particles orbit it while it’s live. 5 minute cooldown because it is absolutely devastating. full void set makes you immune to your own hole. Void armor + tools: the whole set got redone from scratch. armor textures are now built directly off vanilla netherite’s palette structure (same silhouette, same transparency map) but re-tinted to abyssal navy with cyan seams and gold shoulder trim, so it renders perfectly on the body — no more magenta mannequin glitch. tools now have true netherite stats: 2031 durability, 9.0 speed, 4.0 damage bonus, proper attack speed/damage attributes on every tool so tooltips show real numbers. pickaxe has an AoE resonance blast, axe has a dash, sword applies slow on hit. Ten landmark structures: every biome got a flagship now, not just perimeters. the ashen expanse has a 28-block stratovolcano with lava falls and a hidden obsidian vault, plus a lava-moated bastion fortress. luminous groves has a 27x27 lumen castle with prism-roofed towers. void skirts has a prison citadel with a 16-block spire and nullwalker wardens. there’s also a wastes cathedral with a crypt, a chorus mother tree, a highland lighthouse with a working beacon, a sunken mire cathedral, a crystal sanctum palace, a crown spire, and a null citadel. each one has exclusive loot you can’t get anywhere else, a guardian mob spawner, environmental dangers, and a resonance mechanism to wake. Item art overhaul: every custom item got handcrafted pixel art instead of flat recolors. edge-darkening, biome-specific palettes (lumen lime, ashen fire, crystal lilac, marsh teal), gold flecks on highlights. skyglass shards are faceted ice-blue, the windscar winch is a bronze gear with a hook, prism seeds have rainbow gradients. also resized everything that was clipping outside its inventory slot. Guidebook rewrite: went from 36 pages to 42 across 8 tabs. every biome gets its own page covering blocks, mobs, and landmarks. new pages for the landmark index, biome relics, exclusive loot tables, and the full tool/armor ability breakdown. if it’s in the mod, it’s in the book now. /locate support: added /endesium locate biome and /endesium locate structure commands so you can find any of the ten biomes or any structure from the command line. no more wandering the void for an hour looking for the volcano. Whats next? Dragon fight polish: the respawned dragon phases work but the telegraphs could be way more readable. i want distinct visual tells before each resonance attack. Sound design: most sounds reuse vanilla assets right now. custom .ogg recordings for the black hole ambience and landmark mechanisms would be great as well. More structure variants: the flagships are rare by design, but smaller biome-specific ruins between them would make exploration feel less empty.
Devlog #12 Hi guys! I added a lot here. Instead of having multiple small structures that are sort of just arbitrary, I made it so that there is just 1 big but incredible structure per custom biome in my end mod. This makes it feel so much cleaner and nicer, and although there are still some bugs that need to be patched, I plan on improving them a lot. Here are some screenshots that I took of updated structures. I plan to make a lot more and better structures in the futures (also the volcano is split in half so you (the ppl) could see the inside with a vault room)
Update - What I have worked on I have added a custom mini boss per biome, and I have also added a custom big boss that drops op loot. I am working on names and textures, but this is a WIP. This is going really well so far. Future yap I am going to figure out a name for each item, some custom weapons and abilities, then I will balance out the game a bit. Right now, it is too easy to kill a boss, so I will make them harder.
Devlog 14 hey guys. another one. smaller than 13 but a lot of the actual gameplay got wired up this time. void gear is done netherite-tier stats: 2031 durability, 9.0 attack damage, 4.0 speed. sword, pickaxe, axe, shovel, hoe — full tool set, all void ingot + stick.the armor follows the void set: helmet, chestplate, leggings, boots. two-layer P-mode armor model with gold shoulder plates. helmet has the retexture layers. the full set bonus is coming later but the base is solid. void ingot chain works: void gem -> smelt -> void ingot. ingot <-> 9 nuggets. void brick from void slate (2x2). slab, stairs, wall. all the recipes are wired up in datagen. black holes hold void sword for 5 seconds with the full void set -> singularity fires 6 blocks ahead, pulls everything in a 14 block radius for 8 seconds, 5 minute cooldown. the HUD has a charge bar now: resonance cyan rising to pale glow, ancient gold pulse when full. the label “VOID SINGULARITY” sits above it.this is client-side display only. the actual singularity logic lives on the server through the use item tick. sonic boom elbyra + resonant wings -> press R -> sonic boom fires. client sends a packet, server validates wings + cooldown + alive-ness before executing. keybind registered on client tick. the client is finally wired all 13 entities now have renderers. the crash where any entity without a renderer NPE’d the level renderer is gone. particles registered (void skirt mote), block render layers set for void glass and mireglass (translucent), guidebook screen opens on right-click.dragon armor model layer registered for the resonant wings passives. what was deleted the old void stalker entity, old resonance lens item, old void shard item, old foundation test block, and the old generated loot/recipe/advancement JSONs for them — all removed. everything has been replaced by the production versions.## what’s nextmore ruin variants for the landmark tier, ambient life for the empty skies, maybe the deep end. see the roadmap. go find a black hole.!!! (the black box is the singularity/black hole)
Devlog 15 this one is mostly bug fixing, and I lowkey should have done it a while ago. two big ones got found and killed. bosses were not spawning properly the wardens were supposed to be standing in every flagship - crypt floors, balcony rings, throne daises, all of it. and most of them just werent there. I found out that the placement helper was asking for a heightmap that doesn’t even exist yet during world gen. so the game would try to figure out where the ground was, get garbage back, fail the collision check, and die To fix it, I (and opencode) used the surface heightmap that actually works mid-generation, check footing with real collision shapes instead of vibes, and stop teleporting interior wardens to the roof. a warden meant to stand in a crypt now stands in the crypt. if there’s genuinely nowhere legal to stand, we log it loudly instead of pretending everything’s fine. the structure grid I noticed flagships spawn in a straight line. I then found out the placement gate checked chunk coords against two fixed numbers with modulo math - which doesn’t pick ONE spot per cell, it picks EVERY chunk that matches the mod. so the game was building a perfect lattice. cathedral, 160 blocks, cathedral, 160 blocks, forever, in neat little rows like crops. landmarks had the same bug at 256 block scale. both features now hash the cell coordinates themselves to pick a single host chunk per region per cell, so every attempt lands somewhere different. flagships also got pushed out to a 384 block minimum since they’re supposed to be rare landmarks. what’s next back to content. more landmark variants, ambient life in the skies, the deep end is still sitting there on the roadmap being ominous.
Devlog 16 Short one, but it is the one I have been putting off. The dragon fight was authored with attacks, phases, telegraphs but the pillars were just decor and the last third of the health bar played identically to the first. The pillars fight back Crystal aegis is the simplest thing in the world: while crystals stand, thedragon heals. One line of health regen did more for the fight’s shape than anyattack I have authored, because it moves the win condition backwards. You donot win by out-DPS-ing a health bar; you win by climbing pillars under fire.Five crystals means two HP a second, which is enough to visibly undo a sloppyopening. That is the fight telling you it is watching. Enrage is a ladder, not a switch Three thresholds - 60, 35, 15 percent - each announced, each spawning void wisps into the arena. The wisps are not the threat; they are the clock . Every second you spend swatting a wisp off your back is a second the dragon is cycling toward catastrophe. From enrage two the dragon leaves breath pools under its flight path, which turns its flyovers into map control. killing the dragon The kill now drops a real pile: heart, fangs, bone, resonant scales. First kill still fires the transformation. /dragonfight gives a live readout for tuning the curve without guessing. Notes for next time The wisps cap at eight; if playtests say the floor is unreadable, that cap is the first knob. Aegis regen is intentionally visible (1-2 HP/s). If it feels unfair, the fix is fewer crystals required, not slower regen. Docs live in docs/DRAGON_FIGHT.md now, including the testing checklist.
Devlog #19 Sorry for the random numbering before - i guess i suck at counting. Anyways, devlog. Updated structures Before, structures were just decoration and weren’t technically vanilla structures (kaupenjoe misled me). However, I managed to turn them into structure with help from OpenCode. I also added some new structues, like a castle (needs some works still), some new cathedrals, willowtree trunk, etc. I am adding some more custom armor, and I will make it cool with cool abilities. Custom armor My plan for custom armor includes: Luminous armor (infinite night vision, light level control panel, more ideas to come), Ash armor (fire-related abilities, ashwalker boots already exist) Null armor (i have no idea on what to do for this, but it sounds cool) Dragon fight Improve the dragon fight so it has several new stages Made it so that it spawns void wisps here and there Added a bunch of new drops it gives, working on adding Dragon Wings (slow but give iron-chestplate armor level) What’s next? Add the custom armor and tools and weapons Finish the dragon fight so it is exceptional
Devlog 20 - Three New Sets this one adds the thing that’s been missing since the void set went in being actual custom armor that isn’t void. Luminous, Ash, and Null are new. 12 armor pieces, 15 tools, all with their own textures, their own powers, and their own place in the creative tab. ##the new sets the void set already had its silhouette and its trim workflow. the new sets follow the same P-mode two-layer model so trims work the same, but they’re recolored palettes with their own read:- Luminous gold-cyan, glassy, the grove’s light. high enchantability, diamond-tier defense with a light-mobility kit.- Ash gray-ember with ember-orange highlights, volcano-forged. slightly lighter than void but built for fire.- Null violet-void, deleted matter. void-tier defense, hungrier enchant cost, gravity-deletion kit. you can read them now none of the three sets had working names before — datagen was fine, but the generated lang had Luminous_helmet with a capital L, so the game looked for item.endesium.luminous_helmet and found nothing. 26 keys showed item.endesium.___ in inventories. src/main/generated/assets/endesium/lang/en_us.json is now lowercase for all luminous/ash/null armor and tools, the phantom Ash_boots is gone. hover a luminous sword and it actually says luminous sword. armor is per-piece now new rule: every single piece does something on its own. the full set is an upgrade, not the only reason to wear it. Luminous — the grove’s light — GearAbilities per piece + tooltips on GearArmorItem : helmet Gleamsight – night vision while worn- chest Radiant Aegis — attackers get glowing 8s; full set Prism Ward adds darkness 3s + 3 magic burn-back- leggings Lightspeed — speed I (II with full set)- boots Lumen Leap — jump II Ash — the volcano — volcano kit, fire is fuel:- helmet Ember Crown — fire resistance while worn- chest Searing Plate — attackers ignite 4s; burning/in lava gives strength I- leggings Magma Blood — regen I while burning/in lava- boots Ashwalker — stand on lava, and now hold shift in lava to sink at -0.18/tick to -0.55 like scaffolding, release and you stay down with LAVA puffs every 4tfull ash Volcanic Heart is permanent strength I. the set wants you in lava. Null — deleted matter — Erased Mind helmet purges levitation/darkness/nausea every tick, Erased Wound chest gives absorption 5s on hit, Weightless leggings no fall damage, Null Step boots +1 step height via attribute, full set Void Body deletes 25% of incoming projectiles with smoke + shield block feedback. what’s next more landmark variants, ambient life for the empty skies, and the deep end is still sitting there being ominous. Sorry, no sneak peak yet - still not finished yet
Devlog 21 hey guys.the End’s been empty for a while. the ecology mobs live on the islands, thebosses live under them, but the sky itself was a void. this one fixes that,and it brings back something else that was missing: three new mobs three new mobs Sky Jelly - ambient, drifts with the wind. a soft bell of a thing withfour trailing tentacles, pulsing gently and leaving end-rod motes behind it.it bobs upward every now and then like it’s breathing. 8 hp, doesn’t careabout you. just ambient. Galefin - the fastest thing in the End. a sleek sky-fish that cutsthrough the air at 0.75 flying speed and avoids you entirely - the momentyou get within 12 blocks it’s gone. 4 hp. you see them flicker past in thecorner of your eye more than you ever actually look at one. Deep Lurker - this is the mean one. it lives below the islands, in thedark air pockets under the heightmap, and it waits. 22 hp, leaps at you,does real damage. when one spawns you get a portal-particle burst as awarning, and then you have maybe a second to look down.all three are geckolib animated - jelly pulses, galefin swims, lurker idleswith a slow head sway - and all three have spawn eggs and their own loottables. the sky and the deep are managed now AmbientSkyManager runs two server-side systems: sky half - if you’re flying more than 12 blocks above the surface, theair around you fills with biome motes (highland wind, lumen motes, endwastes dust). it makes flying at height feel alive instead of empty. deep half - a managed lurker spawner. every 5 seconds it looks for darkpockets below the islands: solid floor, air to spawn in, brightness under 7,at least 34 blocks of island above you. spawns are capped at 6 lurkerswithin 96 blocks per player, so the deep end gets ominous without everbecoming a wall of them. what’s nextthe deep end is less empty now, but it’s still just lurking. the design docskeep pointing at something bigger under the islands - the Umbral Reach - andthe sky could always use more than motes. more ambient life is on the table.
Devlog 22 - End Fight Update (again)hey guys.this one’s a two-day entry. yesterday was the sky getting alive and the gear lines finally clicking together into actual fighting systems. today was the dragon. the end fight has been building layers for a while - phases, enrage,scripted moves - but it still had one big problem: the first dragon barely used any of it. that’s fixed now. the first kill is the fight now. therespawned one is the nightmare. yesterday - 8/26the sky got three new mobssky jelly, galefin, and deep lurker went in (that one got its own devlog - 21).the sky half of AmbientSkyManager fills the air with biome motes when youfly high, and the deep half keeps the under-island dark honest: lurkersspawned into the black pockets below the heightmap, capped so the deep end isominous without ever becoming a wall.the sets became systemsthe luminous, ash, and null sets each got a cross-set layer inEndgearSetBonuses - wear the full set and hold that line’s tool andarmor + weapon merge into one fighting identity: luminous + prism grip - speed II and haste II while channelling; every hit blinds with a flash (3 true damage + glowing) and sparks light shards.ash + ember core - fire resistance while channelling; hits stoke the burn for 2 extra seconds and throw weight behind the strike.null + erased edge - strength I and haste I; every hit shreds 4 armor durability off the target and drags them into the blade. and the void set finally got its signature: hover. full void set, sneak inthe air, and you stop falling - a gentle drift at -0.12 blocks/tick instead ofa tumble, with void motes trailing under you. it pairs with the sword’ssingularity for total sky control, and it’s the boots’ tooltip promise kept. today - 8/27the dragon actually fights nowthefour-phase fight controller - impact dives, shockwaves, screeches, gales,storms, collapses, the final roar, catastrophe - now runs on the firstdragon too. before, the first kill was vanilla strafing plus harassment, andall the authored grammar was locked behind the respawned dragon. that gate isgone. the first dragon opens with the full attack schedule, escalates throughall four phases, and the transformation still makes things worse: 1.6x scaleand the resonance-exclusive moves are still the awakened dragon’s alone.the pillars became cooler with new mechanicscrystals were just a heal before. now the aegis is a shield:- every surviving pillar grants the dragon 10% damage reduction (capped at 60%), so clearing the pillars is a real first phase, not an optional chore.- destroying a crystal detonates at its pillar with a roar.- the last crystal falling breaks the aegis: the dragon is staggered for five seconds and takes +40% damage, a wisp wave pours out, and the next scripted set-piece fires immediately. that’s your payoff window. set-pieces are guaranteed nowscripted specials used to roll a dice every tick. now they’re scheduled:one opens the fight about thirty seconds in, every enrage escalationforces the next one within a second, and a broken aegis queues one on thespot. the random cadence only fills the gaps. you will see these moves, everyfight, on purpose. two new attacksOblivion Charge (enrage 2+, set-piece) - the dragon climbs high, paints a straight lane through the nearest player with end-rod markers, then dives it twice, tearing through anyone on the line and leaving void-fire wakes in its path. get off the lane.- Resonance Collapse (transformed dragon only) - drags every player toward the dragon for three seconds with converging rings, then detonates at its position. gain distance and find cover; standing still loses.
Devlog 23 - The Stronghold Update hey guys.for a while now the Endesium identity stopped at the end. everything past theportal was ours - the island, the dragon, the resonance, the gear - but the road to it was still vanilla’s stronghold. a cramped maze of hallways and libraries copy-pasted a hundred times, holding the exact same end portal the game shipped with in 2011. it never matched. the mod’s big gate got the smallest room in the game.that’s done now. the vanilla stronghold is gone and the Endesium stronghold replaced it: a buried citadel that previews the end without spoiling it. this one took a while, so let me walk the whole thing. the layout: a citadel vanilla strongholds are random. rooms are scattered, corridors dead-end,libraries repeat, and the portal is wherever the RNG put it. the Endesium stronghold is authored : a fixed, connected, three-times-bigger floor plant that always works. a Great Descent Hall buries you - a switchback staircase that drops from the surface as much as 90 blocks down into the stone, red runner carpet down the aisle, end rods lighting the way, two vindicator sentinels waiting at the top. a sealed Arrival Vault is what the eye of ender actually points at: a quiet chamber with a radial purple sigil on the floor and exactly one grounded door - the route onward, always. - the Hub is the spine: an atrium with a carpeted floor, a central resonance dais (amethyst block, end rod, the works), purpur pillars at the cardinal axes, bookshelves and barrels lining every wall, bats circling the ceiling, and a real staircase up to the gallery instead of a visual platform. junctions are readable - four grounded route markers plus a carpet cross - so you never need signs to find your way. the rooms sixteen distinct room kinds, every one hand-dressed:- Library - bookshelves three shelves high around the walls, two lecterns, a chiseled-bookshelf reading dais, blue carpet, bats.- Treasury - iron-bar vault bars with a single gap, chests and barrels in rows, gold, candles, and a captain guarding the middle.- Guard Post - weapon racks (fence posts) with candles, a phantom spawner in the center, two vindicators on the door.- Sanctum - end stone brick floor, purpur pillars, crying obsidian and a chorus plant on a pedestal, purple carpet, an enderman spawner , a live enderman pacing the corner.- Barracks - four red beds with proper head/foot parts, smoker, furnace, crafting table, three guards on duty.- Scriptorium - lecterns with candles, bookshelves and chiseled shelves, a cauldron of ink, a bat haunting the rafters.- Arboretum - a glass-ceilinged garden: dirt floor, flowering azaleas, ferns, moss carpet, a lily pad pond.- Observatory - concentric purpur ring inlays, an amethyst telescope-core, end-rod instruments along the walls.- Resonance Engine - amethyst conduit pillars with end-rod emitters and a crying obsidian reactor - the end’s power plant, studied safely from outside the portal.- Bastion - deepslate pillars, an iron-bar partition, weapon racks, a captain and two guards. military.- Conservatory - chorus plants and chorus flowers growing on end stone, flower pots and moss, an enderman in residence.- Reliquary - concentric obsidian ritual rings, an ender chest at the heart, candles, a captain standing watch.- Portal Cathedral what’s next the stronghold finally reads like the end’s doorstep. next up is the rest ofthe ten-hour pass - every file retyped, every line deliberate - and afterthat, the bosses and dragon still want their second pass of polish. but thegate is fixed. you’ll never walk vanilla’s cramped hallways to the end again.
Devlog 24 - Making the Stronghold Even Better hey guys. DEVLOG_23 was about replacing the vanilla stronghold - the layout, the rooms, the portal cathedral. and it shipped, and it worked, and then i walked back through it and something was off. the shape was right but the rooms read empty. a big citadel of bare stone is just a bigger version of the problem i was trying to kill. so yesterday/today was the boring pass nobody gets excited about in a change log: making rooms feel lived in. the noise every room had the bones but none of the clutter. so i went room by room and dressed them like actual inhabitants left mess behind: wall shelf rows with candles on top, sconce rows down the hall, two-tone floor tiles instead of one flat slab clustered corners - reading nooks, work benches, storage piles - instead of hanging lanterns and chandeliers where the ceiling actually had headroom for them crypts and catacombs got coffin rows, skull niches, soul lanterns barracks got lockers, footlockers, armor stands treasury got actual stacks of gold, not a promise of gold gardens finally read as gardens - flower meadows instead of a dirt square and corridors stopped being dead space: candle runs, clutter, tiled edges.it’s not glamorous but it’s the difference between a structure and a place. three new district wings once the rooms felt alive, the citadel wanted more than the hub spine. so it grew three themed districts, and i love how they ground the place: Forge - a contained lava pit ringed in polished deepslate, anvils, furnaces, coal stores. the stronghold had no industry before; now it reads like it smiths something down there. Dining Hall - a proper mess: table rows, benches, chandeliers. a fortress this size would have somewhere to eat. Prison - iron-bar cells, chains, a witch behind the barracks. every good stronghold needs a brig. plus a monumental columned entrance to the Great Descent Hall, an amethyst landing dais, cross-bridges over the Star well, a grand staircase dropping from the cathedral gallery, and a carpet runner down every corridor so you always know you’re on the path. Also started playing hades :P
Devlog 25 Wrapping things up Hi guys, this was mostly wrapping up the project. I have had a lot of fun working on the project, but I want to ship soon, maybe at like 200 hours. I hope everyone has enjoyed watching my progress on this, as I thoroughly enjoyed working on it myself. I hope everyone gets a chance to try it out and give some feedback. Models I touched up some 3d models and improved them a bit, making them look a bit cleaner. I touched the void stalker’s model, and the dragon’s model primarily Loot tables I customized the loot tables for a lot of the custom or modified structures like the stronghold to be a lot nicer and more fitting towards the endesium mod. They are a lot stronger, but not too OP I’d say. Nothing much else done I know I spent 10 hours coding, but I didn’t get much done because of how long I spent wondering what to do lol.
Devlog 26 hey guys. I turned the dragon fight into a bunch of small fixes that all made the fights read better.nothing shiny, just the stuff that was quietly wrong. stuff that was supposed to do stuff but didnt lol the dragon fight had announcements. not the kind players see - the kind thatonly exist in code. the enrage thresholds (“The Dragon Remembers” at 60%,35%, 15%) and the hoard reveal were computed, and then… dropped. a soundplayed, a title was built, and nobody ever saw the title. the function wasliterally called announce and it announced nothing. same story in the special attacks. the imports for title packets were sittingthere, imported and never used. so now the scripted set-pieces finally namethemselves: Burrow - “The Dragon Descends” before the ground starts shifting Seize - “The Dragon Takes You” right before it swoops to carry you aloft Rifts - “Reality Tears” as the gravity rifts start opening around you i’m genuinely annoyed this was broken for as long as it was. the drama of thedragon fight was all there in the code - the escalation, the set-pieces, the named thresholds - and none of it reached the player. now it does. the sentinel’s grab is escapable now the crown sentinel’s grab-and-hurl from a few devlogs ago was a one-way trip.if it got its hands on you, you watched the animation and then got launched.no counterplay, which felt wrong for a fight that’s supposed to be about reading the boss. so it got the same rule the warden and golem already had: deal enough damage mid-hold and it drops you early. 18 damage is the breaking point - enough that you can’t just tickle it, but enough that a player who’s actually fighting back gets out before the throw. it also shields against the worst feeling case, where the hold just deletes you with nothing to do about it. and while I was in there: the goal list had two goals at priority 4, whichmeant the sentinel’s behavior was occasionally picking the wrong thing to doat the same weight. renumbered so the hierarchy actually means something. next up the dragon’s hoard, the sentinel’s other moves, and the stronghold is still missing its advancements - the burrow is found, but it doesn’t have a single achievement attached to finding it. that’s next. the fights are starting to feel like they have a conversation with you now.the dragon tells you what it’s about to do, and you get to do something about it. That is the top view of the crown sentinel btw, it looks pretty dope imo
Devlog 28 - The Egg Becomes an Altar hey guys. last devlog for this project The egg now hatches I made the egg hatch into an end golem after 1 minute - a very op, hard to defeat mob. However, defeating it gives 3-5 additional permanent hearts (lose it upon death). Also, when you kill the dragon now, a chest spawns where it died, with dragon wings (gives iron-level protection, slowness 1 while worn, functions like an elytra). what that means for the endgame so the progression reads clean now. beat the dragon, take the egg, set it up,and call up the colossus that guards everything past the first kill. the dragon fight is the warm-up act for something that doesn’t even spawn until you put the trophy to work. that’s it. that’s the end of the end. thanks for following along - go fight the dragon for real, then come back and raise one of your own.
Ships:
I created a Minecraft mod called Endesium, which is an End Update mod. I learned Minecraft modding from scratch for this. There are 10 new biomes, 15 new mobs, 4 new bosses, 4 new sets of armor, and a lot of cool and incredible stuff. The new structures look incredible, like the elderwood sanctum, and many other cool and magnificent structures. It was challenging to figure out how to make custom mob models and make them spawn with boss bars and stuff of that sort. I am incredibly proud of my project, and I have put over 1 weeks worth of time into this project. I have learned many things along the way, and it was truly an incredible experience learning how to make a mod for Minecraft. It is a fabric 1.21.1 mod, sorry no modrinth - that takes weeks to verify....
|
1792875234.1406589
|
1793739234.1406589
|
|
53943
|
Speedtickers by @juanes | Stardance
|
juanes
|
0
|
202.27
|
0
|
[]
|
[{"post_id": 74689, "ts": "202 [{"post_id": 74689, "ts": "2026-09-28T00:20:58Z", "hours": 9.7158, "text": "made a custom shader for the 2nd world that adds a fake lightning effect to the tiles. Also made custom backgrounds for the bsides"}, {"post_id": 73347, "ts": "2026-09-24T23:18:57Z", "hours": 2.4997, "text": "reworked more bside levels; added lights/normal maps, and expanded the mockups of the 2nd world"}, {"post_id": 72890, "ts": "2026-09-23T23:34:51Z", "hours": 9.0025, "text": "Started working on the new bside levels(Gameboy, Snes, and alt pallete style) and made the mockups for the 2nd world. Made around 10 new levels, and reworked around 10 old ones"}, {"post_id": 72008, "ts": "2026-09-22T00:11:03Z", "hours": 12.0467, "text": "added 3 new gameboy kaizo levels; the 1st boss sprites now use normal maps; also made some general bug fixes for an expo"}, {"post_id": 69880, "ts": "2026-09-18T00:05:03Z", "hours": 9.5719, "text": "Reworked the intro for the Game. The player shadow now changes color and opacity depending on the movement across the screen, and speed, from the Player. Started developing the cutscenes for the game. The Replays in the game can now use all the items the player can(Rails, keys, etc)"}, {"post_id": 61204, "ts": "2026-09-04T00:54:33Z", "hours": 2.3258, "text": "Added more ui/dialogs to the Editor. The Editor save/load dialog now works."}, {"post_id": 56856, "ts": "2026-08-28T20:17:43Z", "hours": 1.9317, "text": "The level editor now saves correctly every autotile terrain(For some reason the slide/slam autotiles sometimes aren’t saved correctly)"}, {"post_id": 54080, "ts": "2026-08-24T21:12:18Z", "hours": 155.1767, "text": "Finished the initial ver of the Level Editor Save Feature. (Most of the hours were logged previously to Beest)"}]...
|
Title: Speedtickers by @juanes | Stardance
Devlog Title: Speedtickers by @juanes | Stardance
Devlogs:
Finished the initial ver of the Level Editor Save Feature. (Most of the hours were logged previously to Beest)
The level editor now saves correctly every autotile terrain(For some reason the slide/slam autotiles sometimes aren’t saved correctly)
Added more ui/dialogs to the Editor. The Editor save/load dialog now works.
Reworked the intro for the Game. The player shadow now changes color and opacity depending on the movement across the screen, and speed, from the Player. Started developing the cutscenes for the game. The Replays in the game can now use all the items the player can(Rails, keys, etc)
added 3 new gameboy kaizo levels; the 1st boss sprites now use normal maps; also made some general bug fixes for an expo
Started working on the new bside levels(Gameboy, Snes, and alt pallete style) and made the mockups for the 2nd world. Made around 10 new levels, and reworked around 10 old ones
reworked more bside levels; added lights/normal maps, and expanded the mockups of the 2nd world
made a custom shader for the 2nd world that adds a fake lightning effect to the tiles. Also made custom backgrounds for the bsides...
|
1792770475.3417456
|
1793375275.3417456
|
|
4431
|
Geared Reversible CVT by @packager | Stardance
|
packager
|
0
|
202.39
|
0
|
[]
|
[{"post_id": 64554, "ts": "202 [{"post_id": 64554, "ts": "2026-09-09T01:51:47Z", "hours": 7.6675, "text": "Finished tolerancing the holes, and I added the pulley to the input gear. I also changed the large bearing mount for the gear shifter and also redid the lead screw mount because stuff was hitting. Here’s what I did: I went through like 70 holes, compared it to the toleranced version that was assembled. Lots of problems happened when I had to oversize the holes. For example, the linear bearing holes on the gear shifter mount had to be oversized, which made the thickness of the wall like 0.8mm thick. I then had to go into my mastersketch and change up the dimensions which took a stupidly long time. Regeneration times are hitting near 2 minutes (300 features isn’t good, plus tons of dependencies, and so many dimensions that it takes up the entire sketch). I added the pulley to the input gear. I had to switch to a different featurescript because the one I was using didn’t have GT2. After that it was pretty easy, just had to cad the walls, chamfer a bit and boolean and bore it. The most annoying part was that the copper lead screw nut (on the mount) was hitting the 1:1 gears completely ruining the whole thing. I basically had to redo the shaping of the lead screw mount. I moved the copper part further up the part, keeping the standoffs at basically the same level. As a result, I had more space at the bottom for two screws instead of 1. Also, now all the constraints are fully dependent on the external parts, so there’s no random dimensions I did just to make stuff look good, which is good because it means if I change the gearing or something in the mastersketch, the mount should update accordingly. This also took a pretty long time and 2 min regeneration doesn’t help."}, {"post_id": 62711, "ts": "2026-09-06T06:17:18Z", "hours": 8.0844, "text": "Cleaned up a lot of the stuff hitting and a lot of the tolerances too. I also had to do some cooked surface modeling with onshape (I have never surface modeled before). Here’s what I did: The blue pieces were also hitting at the bottom, so I had to make the material even thinner than it was (really cooked, near 1.5mm thickness and barely clearing eachother). The standoff placements really cook everything so I’ll probably just extend the plate and move the standoffs further from the gears. However it will be uglier, and I would rather have a good looking cvt that doesn’t work than a ugly cvt that works. I had to do some really cooked stuff with surface modeling. Basically, the wrap feature wasn’t working. I spent like an hour or two trying to learn surface modeling, but nothing was working because the shape was weird, so I ended up just doing 8 separate revolutes, boolean, and then some move faces. Also, the bumps can’t be radial because the bearing isn’t radial (it faces horizontal, so the edge closer to the center moves up first which causes the whole thing to jam). To fix that I had to do even more cooked remove revolutes, then bridge curving and then knitting (I had never used these before) and fileting. I need to figure out a clearer way to do it because it’s getting on my nerves. I went through the latest V3 and compared around half of the holes to the V2 (it turns out there’s like 3 holes per part and theres like 100 holes to go through, not including clearances). The clearances also cooked some of the spacing so I went and fixed that. I’ve been spending some time thinking about the 1way bearing solution, and I completely switched up and now think it’s impossible."}, {"post_id": 61667, "ts": "2026-09-04T18:15:01Z", "hours": 9.5906, "text": "Finished most of the cad, just need to clean up tolerances and split a few parts. Here’s what I did: I made the rings for the gearshifter bigger because the gear shifter mount on the lead screw was hitting the center 1:1 gears. This caused lots of issues with sketches breaking so I had to redo those. I had to change the gearing for the last stage. The 1:1 gears were hitting the bearings so the only solution is to move the bearings further from the center, hence change the gear ratio. This also caused tons of problems and I had to redo a lot of the parts again, especially the gear shifter mount that mounts onto the lead screw. I added cutouts onto the blue part (it’s gray now, but the one that houses the bearing that the dog clutch goes on. The blue parts used to be hitting the 1:1 gears but now it clears by like 0.5 mm. I’m still deciding whether I want to assemble this or not. I can’t figure out the 1way bearing based thing, and I’m starting to feel like it’s fundamentally impossible."}, {"post_id": 60403, "ts": "2026-09-02T18:22:52Z", "hours": 7.5178, "text": "I mirrored the whole thing, and the V3 looks complete but there’s some fundamental flaws. I also thopught a lot about the 1way bearing based solution. Here’s what I did: Mirrored the whole thing onto the other side. I didn’t run into any spacing issues which means I’m good at mastersketching. Currently, the 1:1 gears are hitting the big bearing that the dog clutch is in. I dont’ know how to fix this because it means I’ll have to change the gear ratios. I spent a lot of time thinking about the 1way cvt that doesn’t use clutching. I realized that I could put the input gear on a 1way bearing and somehow run different sets of gears based on the direction. However, everything is inevitably linked to the same output which jams everything. Also, the arm system is inherently not backdrivable which is makes the input on a 1way bearing solution not work. I’m gonna have to think more about a better solution. I need to do some finishing touches to the V3, but I’ll spend more of my time thinking about the 1way bearing cvt."}, {"post_id": 59751, "ts": "2026-09-01T17:59:00Z", "hours": 5.7678, "text": "Made the 1:1 gears to power the cam and made a new rail system for the ring. Today was really productive, here’s what I did: initially, I messed with a lot of the dimensioning and spacing with the rails on the outside. I realized there’s no way it was gonna work, and even if it could, it would take up tons of space. I needed a better solution. Having the rails on the outside makes everything really big which doesn’t fit. I figured out a way to add a rail inside the tube. Instead of the ring being constrained to a rail, the inside thick square piece is constrained to a rail. This leaves tons of space on the outside for gears (almost 6mm of space on each side). I finally added the gears. I had 6mm of space which is more than enough. However, the gears hit the bearings that track the ring, so I’ll probably end up making the ring bigger either way. Another terrible thing is that the gears hit the blue piece. It actually goes far enough to cut into the bearing. Either I shift into smaller bearings, or I change the spacing between the gears. I still have to decide which on to do. I don’t think I’ll be building this version in hopes of coming up with a way to use one-way bearings."}, {"post_id": 59002, "ts": "2026-08-31T16:09:51Z", "hours": 5.5344, "text": "More cad. I assembled the lead screw and gear shifter. Here’s some stuff I did: After building my v2, I realized the ring is super unstable and can easily tilt, causing the whole thing to jam. This is especially true because its only being pushed at one point (the contact of the bearing). Therefore, I added some holes for rails so it can slide along the holes. However the rails need mounts which take up space, taking away space for the gear, so I might switch the rails to something else. The rails made the ring bigger so it started hitting the blue piece again, so i changed the position of the standoff to create more distance. I assembled the center shaft, which includes the output gears and the perpendicular cam. I had to change up some of the dimensions because it wasn’t fitting. I also removed the from the part because it would make it hard to print, and instead used a separate spacer. I’m starting to become pretty unproductive at cad because almost 40-50% of the time spent is just thinking about how I can design it rather than actually designing it. I also spent some time thinking about the one-way bearing solution. I finally got my hands on them so I’ll be trying stuff out instead of just trying to visualize them."}, {"post_id": 57937, "ts": "2026-08-30T08:41:36Z", "hours": 9.2519, "text": "Did tons of cad, semi finished the parts (still need to fix some stuff) and started an assembly. Here’s some stuff I did/problems I ran into: I cadded the new lead screw mounts for the gearshifter. I lowk dont have any clue what I’ll do about it hitting the 1:1 gears. Hopefully there’s some geometry fixes I can make. The bottom moving piece (that moves back and forth following the cam) is oversized and will hit the ring for the ramp. I will change it tmmrw. I realized a lot of my new parts are gonna be really hard to print so I split them. I started the assembly. I finished the basic side (most of the rest should just be mirorred). I have to figure out a better way to transfer torque while also spinning (remember the linear bearings spinning smooth). The current method just has something sliding on a shaft which is high friction. There are actual linear bearings that prevent rotation, but they are crazy expensive and barely produced anymore. I’ve also been thinking more about the one-way bearing based solution. I realize that maybe the key is just to mirror the whole gearbox and change the direction that it’s clutched in."}, {"post_id": 55759, "ts": "2026-08-27T19:04:18Z", "hours": 7.1681, "text": "Did more cad, especially working on the gear shifter mechanism. I was having lapse and hackatime issues so I couldn’t really record much or post a devlog. Here’s what I worked on and some problems I ran into: chromebooks are slow as hell and are literally impossible to cad on (hence i need the macbook). This means the only time I can cad really productivley is at home which is annoying because I don’t do anything at school. For the gearshifter to work, it needs to be geared 1:1 with the tubes. This is a huge problem geometrically because it hits the blue piece. In fact, it goes into the bearing hole for the blue piece which means I can’t just cope and be lazy by making the piece thin. The closer I move the output gears to the dog clutch gears, the closer the blue piece moves to the center gear which cancels out making the 1:1 gears smaller. I have to figure out a solution soon. I swtched from the cam being sandwiched between bearings to the bearings being sandwiched between the cam because it gives space for the gears to be on the outisde. I’m pretty sure this is also better force wise because instead of pulling out each bearings individually when it moves side to side, the bearings are in contact so you effectively have to pull out both bearings at the same time. Also the lever arm for the center version looks smaller than the version with the separate gear just for the shifting which means less friction. I had to tweak the ratios and spacing a bit because the blue piece barely has space. Even now, it’s way too thin (1mm) which I don’t like. No, I haven’t forgotten the mythical one-way-bearing based concept, I’m still thinking about it. I have a vague idea of what it should kind of look like (somehow have two sets, both of them mirrored, each of them ratcheting the other way). I’m pretty sure there’s a solution but I’m not smart enough to figure it out."}, {"post_id": 54291, "ts": "2026-08-25T07:26:33Z", "hours": 5.0694, "text": "Finalized the sketching and starting making some parts. Here’s some stuff I did: I realized mod 1mm is way too small and I want the macbook more than a smaller cvt, so I’ll be sticking with mod 1.25mm. I basically went through like 35 features and redo them because of the new dimensions. I have yet to go through 210 more and add more features on top of that. Since I’m keeping the gears as mod 1.25mm, I increased the radius of the gear shifting from 9mm to 11mm (like it was originally). Based on how the built model performed, I redid a lot of the tolerances. I also needed to cad a new base plate because of the new shape. the gears were hitting so I changed the output and dog-clutch gear sizes. Now that I’m devlogging, I realize that I seriously need to lock in on the constant-speed gears. I’ll be spending lots of time tomorrow working on that."}, {"post_id": 53601, "ts": "2026-08-24T07:20:36Z", "hours": 6.5417, "text": "Look who’s back. Back again. I was banned from using my personal computer because my parents saw that I was cadding instead of studying for sat, but I just took it and I can finally cad now. I feel like I’m close to finding a way to eliminate the clutch but I can’t figure out how to yet. Therefore I decided to save it for a v4 and focus on other stuff for a v3. Here’s some stuff I did today: I sketched out what the v3 will look like. Instead of a pentagon it’ll look more like a trapezoid because I don’t need the 3rd gear anymore. I’m still not sure if it’s possible to gear the gear selector 1:1 with the outside gears because it has to be bigger than the tube. After building my v2, I realized my gearshifting mechanism was completely cooked. It jammed a ton because there was nothing stopping the ring from angling and binding with the tube. Adding fuel to the fire was the fact that the worm gear mech only pushed it from one side making it impossible to stop the ring from angling. I wanted to add support rods for my v2 but it was impossible because the gears were way too close, but now it’s possible because of the new spacing. Also, the worm gear is effectively moved downward, more in line with the centers of the rings, which lets me wrap it around the ring and make bending less easy. I still haven’t decided if I want to stick with ramps or switch to something else. I switched everything to 1mm mod gears, but I realized spacing was way too cooked because there’s PROBABLY no space for the cutout for the ramps (or whatever I choose to use, it’s just that I have no space for 2 linear bearings in a row). I still haven’t figured out the cutout dimension fully, but there’s a good chance that I’ll end up switching back to 1.25mm mod. Also, 1mm mod means I need to buy new bearings and stuff which are expensive and cut away money from my stardust payout (which I wanna maximize because I NEED THAT MACBOOK so I can cad during school)."}, {"post_id": 33928, "ts": "2026-07-24T07:36:27Z", "hours": 5.2675, "text": "Did tons of math and tons of brainstorming. The math is absolute hell and annoying but desmos is carrying. I got a shape for the non-circular gears for now (they can’t be called elliptical), see the first image. The sharp angles might be a problem with the gears depending on how many teeth are on them, so I may have to change a fully flat output to something very slightly oscillating. I spent a good amount of time thinking about how to eliminate the clutch. I am no longer as confident about there being a solution as right after opensauce, but I may be onto something. I came up with a mechanical “absolute value” system which takes an input and basically gives the absolute value of it. The input will be both geared and belted to an output shaft, and the recieving gear and pulley will have a one way bearing on them. Since the direction of each recieving thing is opposite to eachother (the gear changes direction while pulley keeps it the same), one bearing will always be ratcheting while the other is transmitting torque. Therefore, regardless of how you spin the input, the output always spins in the same direction. Also, after doing the math, it turns out that the output osciallting speeds isn’t symettric in both directions: it’s actually faster when spinning one way than the other. This is really good because it gives me a way to differentiate between the two directions. I sitll haven’t figured this out yet but I think I’m in the right direction. Overall, the math is complete hell and I’m not too sure whether it’s even possible to eliminate the clutch entirely and shift to a system of one-way bearings. However, I do feel like I’m somewhat onto something."}, {"post_id": 32569, "ts": "2026-07-21T20:40:47Z", "hours": 5.96, "text": "I haven’t devlogged in a while cuz I was busy with outpost/opensauce, but I almost finished the build. I had terrible printing problems (my parts were warping all over the place) and I basically had to print/build the entire thing in 2 nights. As a result i have rlly bad friction on the gear shifting mechanism. After talking to some people at outpost and opensauce, I believe it is possible replace the clutch with a system of one way bearings, so I will spend most of my time brainstorming solutions for a v3 or v4."}, {"post_id": 27538, "ts": "2026-07-13T05:55:23Z", "hours": 8.5006, "text": "I finished printing all the parts and tuned all of the tolerances. I ran into far too many printing issues (I probably wasted as much filament as will be used in the project), especially with bed adhesion. It was to the point where even a 10mm brim with 0 brim-object gap and increasing the bed temp by 5 degrees and washing the bed couldn’t stop warping. But at the end of the day I thugged through and got all my parts. I also ran into some cooked tolerancing with the bearings and even the screw holes for some reason. But all of that is behind me now cuz I can finally start building."}, {"post_id": 23948, "ts": "2026-07-07T05:04:04Z", "hours": 22.6917, "text": "I ordered all the parts and set stuff to print to test the tolerances and I ran into some pretty annoying issues. Here’s some of the issues I ran into: There was only 4 packs of 2 3x6 linear bearings in stock so I had to redesign the lead screw gear shifter to use 6x12 ones. 32x39 bearings are literally 12 bucks per and there’s only one singular vendor for it so I switched to 30x37 bearings which are way cheaper. In doing so I ran into really sketchy wall thicknesses. The slots for the 28mm dowel pins were way too close to the walls of the gear, so I had to change up some of the geometry so it doesn’t just print as a half circle. I spent a good amount of time tuning the tolerances so that the bearings would actually pressfit and not slide off easily. Same thing with the dowel pins. The biggest problem I ran into was that apparently you CAN rotate linear bearings around a shaft very smoothly. Every google search made it seems like I would break my wrist and explode trying to rotate a linear bearing, and it was pretty shocking to see it spinning smoother than a fidget spinner. This completely cooks my entire design and I still can’t figure out a good solution the second biggest problems was that, when switching from 32 to 30mm bearings, I forgot to change the dowel pin size so now they don’t fit in the bearings. I might just end up 3d printing pins if they’re too expensive/take too long to ship. a lot of the parts were really hard to 3d print so I split them into multiple to screw in. Apparently the maximum devlog time limit is 10 hrs. I had 22 hrs logged because I wanted to have some aura post with 40 hrs where the entire thing was built, but I ended up losing 12 hrs instead."}, {"post_id": 16824, "ts": "2026-06-27T10:00:06Z", "hours": 7.3842, "text": "another great lock in, the cad is done (finally). V2 seems like it could work IRL so I’m gonna actually order parts and build it. Today, I split the gray gears (with the tube) into two parts so I can actually assembly it, added countersinks to parts that need it, and fixed up some tolerances. I don’t have too many new ideas for the V3, but hopefully after I build/test V2 I can notice some key problems. Here’s the general gist of I’m aiming to accomplish: Obviously, I need to actually lock in with elliptical gears for the V3. This is the biggest problem with the V2. Because of the sinusoidal motion, the output gear isn’t constant speed (it oscillates slightly too). The whole extra gear for the CAM is super annoying, so I’m gonna keep it coaxial to the input/output shaft (running three things coaxial) and gear it from the tubes instead of a separate thing. I need a huge geometry change for this which is why I’m saving it for a V3. I want to figure out a better way to do the dog clutch system. I’m hoping there’s a smarter way which doesn’t rely on meshing/unmeshing but so far I couldn’t think of anything. I’m really happy with where this has come, and I can’t wait to start assembling this. For those who want to take a closer look, here is the link to the cad: https://cad.onshape.com/documents/c369754a085e1b437744081a/w/8784f23027b47ba880d55ef1/e/7f96dc46c879863ea30c1be9?renderMode=0&uiState=6a3f9f14c9069ebe4a356101"}, {"post_id": 16166, "ts": "2026-06-26T08:42:14Z", "hours": 8.2175, "text": "insane lock in, I finished the whole linear motion, and made tons of small changes. Here’s some of the bigger stuff I did: I was originally planning to use thrust bearings, but they were way too big. Instead, I just decided to use 3x6 bearings sideways (ball bearings are designed to handle radial load anyway). The packaging was cleaner than thrust bearings anyway. for the linear motion, I had to add more dowel pins - linear bearings to stop the thing from rotating with the lead screw. I ran into some really stupid onshape problems where everything was off by 0.088 degrees for some reason. I was messing with random parts and doing random mates for like 30 minutes until suddenly it worked. I have no clue how, but that doesn’t matter. The linear cams were hitting the 3mm dowel pins inside the gear so I cut out part of it. The linear cam seemed really weak, so I connected the bottom of the ramp to the main assembly. This was a huge pain because there’s barely any space, so tolerances had to be tight. Just one more day of cad and I will be done with it."}, {"post_id": 15541, "ts": "2026-06-25T08:19:43Z", "hours": 4.5006, "text": "Huge lock in, finished up the linear CAM so it should work now, and started the worm gear for the gear shifter. I realized I was doing the linear CAM wrong, and it has to be mirrored instead of just a 180 degree turn, so I fixed that and made a new part for the other side. I also added the lead screw and bearing for the gear shifting. Turns out everything packages nicely (i love uxcell) so I don’t have to do cooked stuff. Just another day or two of CAD and I should be ready to build."}, {"post_id": 14927, "ts": "2026-06-24T07:41:56Z", "hours": 10.0839, "text": "Did tons of changes to the design and continued procrastinating my devlogs. I realized the whole dog clutch thing was too cooked with that little space because it means less space between the bearings for the perpendicular cam. It was also better to change the angle of the linear cam to 45 degrees, and doing so gave me more space. I finished up the dog clutch stuff. I also spent some time cadding the perpendicular cam, and I ended up spending a couple of hours learning surface modeling in Onshape (it was super hard to get it to work). I also put tons of time into thinking about a better way to power the cam: having a whole separate gear is messy, so I wanted to keep it coaxial on the output shaft, but it turns out there isn’t enough space. Hopefully I can switch to this in a V3. I’m also saving elliptical gears for a V3 cuz I have to get this done by outpost. I just need to do some final touches and a full assembly check before I can start building."}, {"post_id": 11814, "ts": "2026-06-19T07:23:14Z", "hours": 4.7167, "text": "I added the dog clutches and realized there’s some big spacing issues. I mated the dog clutches and switched from a 19mm to 18mm length linear bearing. There’s some really bad spacing issues with the linear bearings: not only is it super long, but there also needs to be space between the two separate shafts so that the linear bearings don’t contact two at the same time. However, this distance can’t be too much or else the distance between the clutch and the gear in disengaged state will be too small. I spent some time searching for that balance only to realize that my linear bearing was contacting the flanged bearing, so I changed the lengths up but still no luck. I’m probably going to just make the whole thing a bit wider (because the angle for the linear motion is too steep right now anyway) which should make everything a lot easier."}, {"post_id": 11140, "ts": "2026-06-18T06:55:51Z", "hours": 6.8189, "text": "Finished around half of the assembly. I assembled some of the parts in onshape and realized there’s a few intersections and some of the spacings were off so I changed those. I didn’t run into much problems, but I had a few better ideas that I’ll try implementing in the future: It turns out I was being stupid and you need two separate dog clutches for each side. This might actually be better because since they just have to rotate differently but the spacing between them is constant, I can make that outer ring much thicker. This gives me space to bearing sandwich the cam instead of doing some other cooked stuff. However this also means you need two separate shafts which are cantilevered. I need to figure out a way to support the shafts from the inner end. While I was assembling, I realized I had done the linear cam (for the gear shifting) wrong because everything can be one part. This will make the entire thing thinner. I had a stroke of genius and realized that instead of using that fifth bottom gear which makes everything bigger and ugly, I can gear the perpendicular cam (for the dog clutches) to the gear shifting mechanism, making the entire gearbox so much cleaner. This is kinda cooked because it means the gears will be sliding on each other and because it relies on the tolerancing of 3d printed parts which I don’t trust too much. But if it means making the gearbox look much better, it may be worth it (aesthetics are the most important consideration when designing functional parts). I realized I could switch everything from mod 1.25mm to mod 1 or even mod 0.8 because there’s no more cooked gear meshing/unmeshing. However, it may be too late to do this for the V2, so I’ll probably save it for a V3. The gearbox is not only thinner than the V1, but is also much less cooked. And (probably best of all) the packaging will be really really clean. It does take up more space radially, but that can easily be fixed by switching from mod 1.25 to mod 0.8."}, {"post_id": 10511, "ts": "2026-06-17T08:13:48Z", "hours": 13.7492, "text": "I’ve been procrastinating my devlogs, but I finished up basically all the parts and fixed a ton of problems. Now I can get started with the assembly. I’ve been procrastinating way too much with devlogging because every time I finish recording its late at night and I’m too lazy to devlog but here’s a summary: I tried implementing the linear cam (which is just a fancy name for a sliding ramp) but I quit halfway through because there was barely any space and I was too lazy to make it work. I then implemented my old idea (the linkage) but when you mirror it, it takes up 50mm which is huge. I then decided to go back to the linear cam. I added two ramps and two slots instead of just one so its more stable. I plan to add a screwed in 3d print plate underneath so it doesn’t bend. Now it only takes up like 35mm which is slightly better. I mirrored the gear and realized the plate that switches the gear ratio will be hitting the outer bearing of the dog clutch, so I spaced out the gears a bit more. I’ll probably be switching away from the outer gear on the dog clutch because it takes up tons of space. The parts are basically done, I just have to see how everything works in an assembly."}, {"post_id": 7364, "ts": "2026-06-12T08:34:27Z", "hours": 2.0681, "text": "Figured out perpendicular cam geometry. I was running into quite a few issues and managed to find a solution that fixed most of them. I pivoted from 6mm ID bearings to 32mm for the second stage of gears (the oscillating ones). I also realized that instead of moving the dog clutch directly, I have to mount another bearing around it with a 3d print mount. This not only allowed me to save tons of space, but now I only have to use one perpendicular cam because I can make the 3d prints 90 degrees offset, preserving phase. Here are some problems I ran into and how I tried fixing them: The 32mm bearings were hitting, so I changed up the main geometry and will be alternately adding flange space on each side of the main plate. There isn’t enough space for 2 flanges to be next to each other, but there’s enough space for 1 flange and a normal bearing to be next to each other (0.1mm of space). With my old design (screwing a sidways bearing directly on the dog clutch), I had to use two separate cams because the phase was not 90 degrees offset. However, with another bearing around the whole thing, I can change the angle to not be radial, making it exactly 90 degrees. Looks like V2 will take the shape of a pentagon, and will soon look like a hexagon once I add the linear motion for the gear shifting mechanism."}, {"post_id": 6718, "ts": "2026-06-11T07:53:07Z", "hours": 3.0533, "text": "I did tons of brainstorming and came up with a better replacement for the meshing/unmeshing gears (I actually had 2.5 hours more recorded the night before but lapse ran into a problem so they aren’t counted for here). I realized I could keep the gears in contact the entire time, and instead use a perpendicular CAM (idk what it’s called, it’s basically a CAM that has its offsets parallel to its axis of rotation) to engage a dog clutch onto the gears. The dog clutch basically has 0 chance of bad alignment because the clutch will self align. This hopefully makes everything much more reliable and efficient. To power this, I need a third gear directly connected to the input gear that takes the linear CAM below the input shaft (you can’t run it coaxially). To make it fit, I changed up some of the gear ratios. I soon plan to switch from 1.25 mm to 1mm modulus."}, {"post_id": 5446, "ts": "2026-06-09T07:10:30Z", "hours": 5.2933, "text": "Continued sketching my V2. I spent most of my time visualizing the whole thing (I spent almost two hours sketching the thing out and doing the math). Here are some of the problems I ran into (and how I fixed them): I need the inputs on both sides to be powered, but I also want the output to be a pulley on the side (not in the center). This is impossible with a normal coaxial setup. Instead, I linked the first stage of gears (the one that has the ration changing mechanism) and will be changing up the linear motion mechanism. When connecting the first stage, it hit the output gear, so I had to change some of the geometry. As mentioned before, the radial force by the gear changing mechanism of V1 will probably cause the linear bearings to bind, so I’ll be changing this to a static linear-CAM type of motion for a constant force throughout the motion. Because I’m linking the first stage, everything will basically be inside a tube."}, {"post_id": 4760, "ts": "2026-06-08T07:08:52Z", "hours": 3.3856, "text": "Did some math for the V2. I want the output to be at a constant speed, which means the gears have to be noncircular. The output right now actually isn’t even sinusoidal, and Claude and I had to do tons of weird trig to find the angle as a function of time. After graphing everything on Desmos, I figured out the ideal shape of the gears. Next, I’ll do more mastersketching, and export the shapes from Desmos into Onshape. In the image, the black curve is the position as a function of time, and the blue and red curves are the ideal gear shapes. Actually, now that I think about it, this is wrong and I need to change the whole thing."}, {"post_id": 3356, "ts": "2026-06-06T07:38:50Z", "hours": 4.0761, "text": "I made some minor changes and I’m almost ready for a v2. I fixed up some of the spacers, changed the direction of the linkage that changes the ratio, changed some of the bearings. I also changed the coloring, and it looks much cleaner (I chose pink because I have pink filament loaded in, if you guys have any recommendations please tell me). Here are some fundamental problems with the current version and how I’ll fix them in the v2: The biggest problem is probably gears meshing. The entire thing has to be perfectly synchronized for the gears to mesh perfectly every time, which is obviously impossible. The only thing preventing jams right now is my prayers. However, backlash does give it some room for error. I’ll probably find a better gear tooth profile for my V2, but this is sort of a fundamental problems that will exist. The second biggest problem is that the gears oscillate from max speed to 0 speed every half-cycle, which means the speed will be constantly oscillating. This is easily fixable: in my V2, I’ll use more driving gears (probably 4) each active for a smaller fraction of their period. This combined with elliptical gears to counter the sine waves should make the output basically constant speed. The linkage for the gear changing has basically zero torque, and backlash will completely fry it. Also, this adds weird thrust forces on the linear bearings which will probably cause them to bind. In my V2, I’ll probably shift from a linkage to a linear CAM type of thing (I still have to figure it out). This is really big and wastes some space. My V2 will (hopefully) have better packaging and be smaller. This is achieved by putting the second layer of gears on the inside of the plate and praying there is enough space. The uniform coloring makes it look way better. Once again, if you have any colors you think would look better, please tell me."}, {"post_id": 2610, "ts": "2026-06-05T07:19:25Z", "hours": 4.9444, "text": "I basically finished up the linear motion for the CAM. All that remains is some minute adjustments. Here’s some problems I ran into: The geometry was incredibly hard due to the lack of space, and I ended up just trying a bunch of possibilities and landing on one that worked decently. While I was planning to use belts, I switched to gears after I saw how little space there was. Screws were hitting the servo for the gear changing mechanism, so I rearranged it so the lip is on the outside of the plate, giving me a precious 4mm to work with. It was hard to come up with a way to ensure the full range of motion always happens. There’s nothing pushing the gears up after the CAM pushes it down. Initially, I was planning to do some complex linkage relying on the definition of an ellipse (the sum of distances from the foci is constant). I tried sketching it out but there was literally no space. At the end, I thought of tying a string to both gears and wrap it around an idler to keep the constant sum of distances. This thing’s gonna look clean once everything is colored. All that remains is some minute adjustments and I can move on to a V2."}, {"post_id": 2001, "ts": "2026-06-04T08:28:28Z", "hours": 4.7186, "text": "Started the linear motion for the CAM. I was initially thinking about using MGN3 linear rails until a realized that each rail is over 100 bucks. Instead, I decided on linear bearing based motion with 3mm rods similar to how the ratio changes. Here’s some problems I ran into: Cheap MGN rails were way too big so I decided on the linear bearings (I spent way too long searching for cheap MGN3 linear rails) I initially wanted to put the rods between the yellow and blue plate, but after sketching it I realized the tolerances were too sketchy. Initially I was going to do one main CAM in the center, but I realized when the CAM is pushing the shaft to the outside, the angle is weird so the force is basically transmitted perpendicular to the direction of the motion, which really cooks efficiency. So instead I decided on 2 smaller CAMS that are belted to the main gear. some future/long term problems I need to fix: I don’t think there’s enough space for the belts and cams, so this whole design might be fried The 3mm rods aren’t constrained on their ends, so I have to figure out a way to do that (right now its only held by friction). The motion of the driven gear will oscillate a ton because of the CAM. One potential solution is to use elliptical gears and have the gears engage only in a certain phase where its speed is high (so its not stopping) There’s something similar to the coaxial effect from swerve drives in this gearbox too: I’m gonna call it the CVT effect. When the gear ratio changes, the linear motion makes the gear change phases. Something similar happens because of the CAM, but this isn’t that big of a problem. But when in doubt, assume software can account for it."}, {"post_id": 1318, "ts": "2026-06-03T07:33:32Z", "hours": 1.1881, "text": "Mounted the CAM gear, added a front plate, and added screws. I ran into a problem where one of the hubs hits the belt to the lead screw so I changed up some of the geometry. The gearbox is starting to look pretty complicated and dense without the second most complicated part (the CAM). I am holding off coloring everything and pocketing till the very end because it’ll be very satisfying."}, {"post_id": 1291, "ts": "2026-06-03T05:55:02Z", "hours": 3.5786, "text": "Finish up Linear Motion for CVT. Mounted the linear bearing, added the servo, and finalized the linkage so the actual CVT part now works. Now, I have to work on the CAM mechanism."}]...
|
Title: Geared Reversible CVT by @packager | Starda Title: Geared Reversible CVT by @packager | Stardance
Devlogs:
Finish up Linear Motion for CVT. Mounted the linear bearing, added the servo, and finalized the linkage so the actual CVT part now works. Now, I have to work on the CAM mechanism.
Mounted the CAM gear, added a front plate, and added screws. I ran into a problem where one of the hubs hits the belt to the lead screw so I changed up some of the geometry. The gearbox is starting to look pretty complicated and dense without the second most complicated part (the CAM). I am holding off coloring everything and pocketing till the very end because it’ll be very satisfying.
Started the linear motion for the CAM. I was initially thinking about using MGN3 linear rails until a realized that each rail is over 100 bucks. Instead, I decided on linear bearing based motion with 3mm rods similar to how the ratio changes. Here’s some problems I ran into: Cheap MGN rails were way too big so I decided on the linear bearings (I spent way too long searching for cheap MGN3 linear rails) I initially wanted to put the rods between the yellow and blue plate, but after sketching it I realized the tolerances were too sketchy. Initially I was going to do one main CAM in the center, but I realized when the CAM is pushing the shaft to the outside, the angle is weird so the force is basically transmitted perpendicular to the direction of the motion, which really cooks efficiency. So instead I decided on 2 smaller CAMS that are belted to the main gear. some future/long term problems I need to fix: I don’t think there’s enough space for the belts and cams, so this whole design might be fried The 3mm rods aren’t constrained on their ends, so I have to figure out a way to do that (right now its only held by friction). The motion of the driven gear will oscillate a ton because of the CAM. One potential solution is to use elliptical gears and have the gears engage only in a certain phase where its speed is high (so its not stopping) There’s something similar to the coaxial effect from swerve drives in this gearbox too: I’m gonna call it the CVT effect. When the gear ratio changes, the linear motion makes the gear change phases. Something similar happens because of the CAM, but this isn’t that big of a problem. But when in doubt, assume software can account for it.
I basically finished up the linear motion for the CAM. All that remains is some minute adjustments. Here’s some problems I ran into: The geometry was incredibly hard due to the lack of space, and I ended up just trying a bunch of possibilities and landing on one that worked decently. While I was planning to use belts, I switched to gears after I saw how little space there was. Screws were hitting the servo for the gear changing mechanism, so I rearranged it so the lip is on the outside of the plate, giving me a precious 4mm to work with. It was hard to come up with a way to ensure the full range of motion always happens. There’s nothing pushing the gears up after the CAM pushes it down. Initially, I was planning to do some complex linkage relying on the definition of an ellipse (the sum of distances from the foci is constant). I tried sketching it out but there was literally no space. At the end, I thought of tying a string to both gears and wrap it around an idler to keep the constant sum of distances. This thing’s gonna look clean once everything is colored. All that remains is some minute adjustments and I can move on to a V2.
I made some minor changes and I’m almost ready for a v2. I fixed up some of the spacers, changed the direction of the linkage that changes the ratio, changed some of the bearings. I also changed the coloring, and it looks much cleaner (I chose pink because I have pink filament loaded in, if you guys have any recommendations please tell me). Here are some fundamental problems with the current version and how I’ll fix them in the v2: The biggest problem is probably gears meshing. The entire thing has to be perfectly synchronized for the gears to mesh perfectly every time, which is obviously impossible. The only thing preventing jams right now is my prayers. However, backlash does give it some room for error. I’ll probably find a better gear tooth profile for my V2, but this is sort of a fundamental problems that will exist. The second biggest problem is that the gears oscillate from max speed to 0 speed every half-cycle, which means the speed will be constantly oscillating. This is easily fixable: in my V2, I’ll use more driving gears (probably 4) each active for a smaller fraction of their period. This combined with elliptical gears to counter the sine waves should make the output basically constant speed. The linkage for the gear changing has basically zero torque, and backlash will completely fry it. Also, this adds weird thrust forces on the linear bearings which will probably cause them to bind. In my V2, I’ll probably shift from a linkage to a linear CAM type of thing (I still have to figure it out). This is really big and wastes some space. My V2 will (hopefully) have better packaging and be smaller. This is achieved by putting the second layer of gears on the inside of the plate and praying there is enough space. The uniform coloring makes it look way better. Once again, if you have any colors you think would look better, please tell me.
Did some math for the V2. I want the output to be at a constant speed, which means the gears have to be noncircular. The output right now actually isn’t even sinusoidal, and Claude and I had to do tons of weird trig to find the angle as a function of time. After graphing everything on Desmos, I figured out the ideal shape of the gears. Next, I’ll do more mastersketching, and export the shapes from Desmos into Onshape. In the image, the black curve is the position as a function of time, and the blue and red curves are the ideal gear shapes. Actually, now that I think about it, this is wrong and I need to change the whole thing.
Continued sketching my V2. I spent most of my time visualizing the whole thing (I spent almost two hours sketching the thing out and doing the math). Here are some of the problems I ran into (and how I fixed them): I need the inputs on both sides to be powered, but I also want the output to be a pulley on the side (not in the center). This is impossible with a normal coaxial setup. Instead, I linked the first stage of gears (the one that has the ration changing mechanism) and will be changing up the linear motion mechanism. When connecting the first stage, it hit the output gear, so I had to change some of the geometry. As mentioned before, the radial force by the gear changing mechanism of V1 will probably cause the linear bearings to bind, so I’ll be changing this to a static linear-CAM type of motion for a constant force throughout the motion. Because I’m linking the first stage, everything will basically be inside a tube.
I did tons of brainstorming and came up with a better replacement for the meshing/unmeshing gears (I actually had 2.5 hours more recorded the night before but lapse ran into a problem so they aren’t counted for here). I realized I could keep the gears in contact the entire time, and instead use a perpendicular CAM (idk what it’s called, it’s basically a CAM that has its offsets parallel to its axis of rotation) to engage a dog clutch onto the gears. The dog clutch basically has 0 chance of bad alignment because the clutch will self align. This hopefully makes everything much more reliable and efficient. To power this, I need a third gear directly connected to the input gear that takes the linear CAM below the input shaft (you can’t run it coaxially). To make it fit, I changed up some of the gear ratios. I soon plan to switch from 1.25 mm to 1mm modulus.
Figured out perpendicular cam geometry. I was running into quite a few issues and managed to find a solution that fixed most of them. I pivoted from 6mm ID bearings to 32mm for the second stage of gears (the oscillating ones). I also realized that instead of moving the dog clutch directly, I have to mount another bearing around it with a 3d print mount. This not only allowed me to save tons of space, but now I only have to use one perpendicular cam because I can make the 3d prints 90 degrees offset, preserving phase. Here are some problems I ran into and how I tried fixing them: The 32mm bearings were hitting, so I changed up the main geometry and will be alternately adding flange space on each side of the main plate. There isn’t enough space for 2 flanges to be next to each other, but there’s enough space for 1 flange and a normal bearing to be next to each other (0.1mm of space). With my old design (screwing a sidways bearing directly on the dog clutch), I had to use two separate cams because the phase was not 90 degrees offset. However, with another bearing around the whole thing, I can change the angle to not be radial, making it exactly 90 degrees. Looks like V2 will take the shape of a pentagon, and will soon look like a hexagon once I add the linear motion for the gear shifting mechanism.
I’ve been procrastinating my devlogs, but I finished up basically all the parts and fixed a ton of problems. Now I can get started with the assembly. I’ve been procrastinating way too much with devlogging because every time I finish recording its late at night and I’m too lazy to devlog but here’s a summary: I tried implementing the linear cam (which is just a fancy name for a sliding ramp) but I quit halfway through because there was barely any space and I was too lazy to make it work. I then implemented my old idea (the linkage) but when you mirror it, it takes up 50mm which is huge. I then decided to go back to the linear cam. I added two ramps and two slots instead of just one so its more stable. I plan to add a screwed in 3d print plate underneath so it doesn’t bend. Now it only takes up like 35mm which is slightly better. I mirrored the gear and realized the plate that switches the gear ratio will be hitting the outer bearing of the dog clutch, so I spaced out the gears a bit more. I’ll probably be switching away from the outer gear on the dog clutch because it takes up tons of space. The parts are basically done, I just have to see how everything works in an assembly.
Finished around half of the assembly. I assembled some of the parts in onshape and realized there’s a few intersections and some of the spacings were off so I changed those. I didn’t run into much problems, but I had a few better ideas that I’ll try implementing in the future: It turns out I was being stupid and you need two separate dog clutches for each side. This might actually be better because since they just have to rotate differently but the spacing between them is constant, I can make that outer ring much thicker. This gives me space to bearing sandwich the cam instead of doing some other cooked stuff. However this also means you need two separate shafts which are cantilevered. I need to figure out a way to support the shafts from the inner end. While I was assembling, I realized I had done the linear cam (for the gear shifting) wrong because everything can be one part. This will make the entire thing thinner. I had a stroke of genius and realized that instead of using that fifth bottom gear which makes everything bigger and ugly, I can gear the perpendicular cam (for the dog clutches) to the gear shifting mechanism, making the entire gearbox so much cleaner. This is kinda cooked because it means the gears will be sliding on each other and because it relies on the tolerancing of 3d printed parts which I don’t trust too much. But if it means making the gearbox look much better, it may be worth it (aesthetics are the most important consideration when designing functional parts). I realized I could switch everything from mod 1.25mm to mod 1 or even mod 0.8 because there’s no more cooked gear meshing/unmeshing. However, it may be too late to do this for the V2, so I’ll probably save it for a V3. The gearbox is not only thinner than the V1, but is also much less cooked. And (probably best of all) the packaging will be really really clean. It does take up more space radially, but that can easily be fixed by switching from mod 1.25 to mod 0.8.
I added the dog clutches and realized there’s some big spacing issues. I mated the dog clutches and switched from a 19mm to 18mm length linear bearing. There’s some really bad spacing issues with the linear bearings: not only is it super long, but there also needs to be space between the two separate shafts so that the linear bearings don’t contact two at the same time. However, this distance can’t be too much or else the distance between the clutch and the gear in disengaged state will be too small. I spent some time searching for that balance only to realize that my linear bearing was contacting the flanged bearing, so I changed the lengths up but still no luck. I’m probably going to just make the whole thing a bit wider (because the angle for the linear motion is too steep right now anyway) which should make everything a lot easier.
Did tons of changes to the design and continued procrastinating my devlogs. I realized the whole dog clutch thing was too cooked with that little space because it means less space between the bearings for the perpendicular cam. It was also better to change the angle of the linear cam to 45 degrees, and doing so gave me more space. I finished up the dog clutch stuff. I also spent some time cadding the perpendicular cam, and I ended up spending a couple of hours learning surface modeling in Onshape (it was super hard to get it to work). I also put tons of time into thinking about a better way to power the cam: having a whole separate gear is messy, so I wanted to keep it coaxial on the output shaft, but it turns out there isn’t enough space. Hopefully I can switch to this in a V3. I’m also saving elliptical gears for a V3 cuz I have to get this done by outpost. I just need to do some final touches and a full assembly check before I can start building.
Huge lock in, finished up the linear CAM so it should work now, and started the worm gear for the gear shifter. I realized I was doing the linear CAM wrong, and it has to be mirrored instead of just a 180 degree turn, so I fixed that and made a new part for the other side. I also added the lead screw and bearing for the gear shifting. Turns out everything packages nicely (i love uxcell) so I don’t have to do cooked stuff. Just another day or two of CAD and I should be ready to build.
insane lock in, I finished the whole linear motion, and made tons of small changes. Here’s some of the bigger stuff I did: I was originally planning to use thrust bearings, but they were way too big. Instead, I just decided to use 3x6 bearings sideways (ball bearings are designed to handle radial load anyway). The packaging was cleaner than thrust bearings anyway. for the linear motion, I had to add more dowel pins - linear bearings to stop the thing from rotating with the lead screw. I ran into some really stupid onshape problems where everything was off by 0.088 degrees for some reason. I was messing with random parts and doing random mates for like 30 minutes until suddenly it worked. I have no clue how, but that doesn’t matter. The linear cams were hitting the 3mm dowel pins inside the gear so I cut out part of it. The linear cam seemed really weak, so I connected the bottom of the ramp to the main assembly. This was a huge pain because there’s barely any space, so tolerances had to be tight. Just one more day of cad and I will be done with it.
another great lock in, the cad is done (finally). V2 seems like it could work IRL so I’m gonna actually order parts and build it. Today, I split the gray gears (with the tube) into two parts so I can actually assembly it, added countersinks to parts that need it, and fixed up some tolerances. I don’t have too many new ideas for the V3, but hopefully after I build/test V2 I can notice some key problems. Here’s the general gist of I’m aiming to accomplish: Obviously, I need to actually lock in with elliptical gears for the V3. This is the biggest problem with the V2. Because of the sinusoidal motion, the output gear isn’t constant speed (it oscillates slightly too). The whole extra gear for the CAM is super annoying, so I’m gonna keep it coaxial to the input/output shaft (running three things coaxial) and gear it from the tubes instead of a separate thing. I need a huge geometry change for this which is why I’m saving it for a V3. I want to figure out a better way to do the dog clutch system. I’m hoping there’s a smarter way which doesn’t rely on meshing/unmeshing but so far I couldn’t think of anything. I’m really happy with where this has come, and I can’t wait to start assembling this. For those who want to take a closer look, here is the link to the cad: https://cad.onshape.com/documents/c369754a085e1b437744081a/w/8784f23027b47ba880d55ef1/e/7f96dc46c879863ea30c1be9?renderMode=0&uiState=6a3f9f14c9069ebe4a356101
I ordered all the parts and set stuff to print to test the tolerances and I ran into some pretty annoying issues. Here’s some of the issues I ran into: There was only 4 packs of 2 3x6 linear bearings in stock so I had to redesign the lead screw gear shifter to use 6x12 ones. 32x39 bearings are literally 12 bucks per and there’s only one singular vendor for it so I switched to 30x37 bearings which are way cheaper. In doing so I ran into really sketchy wall thicknesses. The slots for the 28mm dowel pins were way too close to the walls of the gear, so I had to change up some of the geometry so it doesn’t just print as a half circle. I spent a good amount of time tuning the tolerances so that the bearings would actually pressfit and not slide off easily. Same thing with the dowel pins. The biggest problem I ran into was that apparently you CAN rotate linear bearings around a shaft very smoothly. Every google search made it seems like I would break my wrist and explode trying to rotate a linear bearing, and it was pretty shocking to see it spinning smoother than a fidget spinner. This completely cooks my entire design and I still can’t figure out a good solution the second biggest problems was that, when switching from 32 to 30mm bearings, I forgot to change the dowel pin size so now they don’t fit in the bearings. I might just end up 3d printing pins if they’re too expensive/take too long to ship. a lot of the parts were really hard to 3d print so I split them into multiple to screw in. Apparently the maximum devlog time limit is 10 hrs. I had 22 hrs logged because I wanted to have some aura post with 40 hrs where the entire thing was built, but I ended up losing 12 hrs instead.
I finished printing all the parts and tuned all of the tolerances. I ran into far too many printing issues (I probably wasted as much filament as will be used in the project), especially with bed adhesion. It was to the point where even a 10mm brim with 0 brim-object gap and increasing the bed temp by 5 degrees and washing the bed couldn’t stop warping. But at the end of the day I thugged through and got all my parts. I also ran into some cooked tolerancing with the bearings and even the screw holes for some reason. But all of that is behind me now cuz I can finally start building.
I haven’t devlogged in a while cuz I was busy with outpost/opensauce, but I almost finished the build. I had terrible printing problems (my parts were warping all over the place) and I basically had to print/build the entire thing in 2 nights. As a result i have rlly bad friction on the gear shifting mechanism. After talking to some people at outpost and opensauce, I believe it is possible replace the clutch with a system of one way bearings, so I will spend most of my time brainstorming solutions for a v3 or v4.
Did tons of math and tons of brainstorming. The math is absolute hell and annoying but desmos is carrying. I got a shape for the non-circular gears for now (they can’t be called elliptical), see the first image. The sharp angles might be a problem with the gears depending on how many teeth are on them, so I may have to change a fully flat output to something very slightly oscillating. I spent a good amount of time thinking about how to eliminate the clutch. I am no longer as confident about there being a solution as right after opensauce, but I may be onto something. I came up with a mechanical “absolute value” system which takes an input and basically gives the absolute value of it. The input will be both geared and belted to an output shaft, and the recieving gear and pulley will have a one way bearing on them. Since the direction of each recieving thing is opposite to eachother (the gear changes direction while pulley keeps it the same), one bearing will always be ratcheting while the other is transmitting torque. Therefore, regardless of how you spin the input, the output always spins in the same direction. Also, after doing the math, it turns out that the output osciallting speeds isn’t symettric in both directions: it’s actually faster when spinning one way than the other. This is really good because it gives me a way to differentiate between the two directions. I sitll haven’t figured this out yet but I think I’m in the right direction. Overall, the math is complete hell and I’m not too sure whether it’s even possible to eliminate the clutch entirely and shift to a system of one-way bearings. However, I do feel like I’m somewhat onto something.
Look who’s back. Back again. I was banned from using my personal computer because my parents saw that I was cadding instead of studying for sat, but I just took it and I can finally cad now. I feel like I’m close to finding a way to eliminate the clutch but I can’t figure out how to yet. Therefore I decided to save it for a v4 and focus on other stuff for a v3. Here’s some stuff I did today: I sketched out what the v3 will look like. Instead of a pentagon it’ll look more like a trapezoid because I don’t need the 3rd gear anymore. I’m still not sure if it’s possible to gear the gear selector 1:1 with the outside gears because it has to be bigger than the tube. After building my v2, I realized my gearshifting mechanism was completely cooked. It jammed a ton because there was nothing stopping the ring from angling and binding with the tube. Adding fuel to the fire was the fact that the worm gear mech only pushed it from one side making it impossible to stop the ring from angling. I wanted to add support rods for my v2 but it was impossible because the gears were way too close, but now it’s possible because of the new spacing. Also, the worm gear is effectively moved downward, more in line with the centers of the rings, which lets me wrap it around the ring and make bending less easy. I still haven’t decided if I want to stick with ramps or switch to something else. I switched everything to 1mm mod gears, but I realized spacing was way too cooked because there’s PROBABLY no space for the cutout for the ramps (or whatever I choose to use, it’s just that I have no space for 2 linear bearings in a row). I still haven’t figured out the cutout dimension fully, but there’s a good chance that I’ll end up switching back to 1.25mm mod. Also, 1mm mod means I need to buy new bearings and stuff which are expensive and cut away money from my stardust payout (which I wanna maximize because I NEED THAT MACBOOK so I can cad during school).
Finalized the sketching and starting making some parts. Here’s some stuff I did: I realized mod 1mm is way too small and I want the macbook more than a smaller cvt, so I’ll be sticking with mod 1.25mm. I basically went through like 35 features and redo them because of the new dimensions. I have yet to go through 210 more and add more features on top of that. Since I’m keeping the gears as mod 1.25mm, I increased the radius of the gear shifting from 9mm to 11mm (like it was originally). Based on how the built model performed, I redid a lot of the tolerances. I also needed to cad a new base plate because of the new shape. the gears were hitting so I changed the output and dog-clutch gear sizes. Now that I’m devlogging, I realize that I seriously need to lock in on the constant-speed gears. I’ll be spending lots of time tomorrow working on that.
Did more cad, especially working on the gear shifter mechanism. I was having lapse and hackatime issues so I couldn’t really record much or post a devlog. Here’s what I worked on and some problems I ran into: chromebooks are slow as hell and are literally impossible to cad on (hence i need the macbook). This means the only time I can cad really productivley is at home which is annoying because I don’t do anything at school. For the gearshifter to work, it needs to be geared 1:1 with the tubes. This is a huge problem geometrically because it hits the blue piece. In fact, it goes into the bearing hole for the blue piece which means I can’t just cope and be lazy by making the piece thin. The closer I move the output gears to the dog clutch gears, the closer the blue piece moves to the center gear which cancels out making the 1:1 gears smaller. I have to figure out a solution soon. I swtched from the cam being sandwiched between bearings to the bearings being sandwiched between the cam because it gives space for the gears to be on the outisde. I’m pretty sure this is also better force wise because instead of pulling out each bearings individually when it moves side to side, the bearings are in contact so you effectively have to pull out both bearings at the same time. Also the lever arm for the center version looks smaller than the version with the separate gear just for the shifting which means less friction. I had to tweak the ratios and spacing a bit because the blue piece barely has space. Even now, it’s way too thin (1mm) which I don’t like. No, I haven’t forgotten the mythical one-way-bearing based concept, I’m still thinking about it. I have a vague idea of what it should kind of look like (somehow have two sets, both of them mirrored, each of them ratcheting the other way). I’m pretty sure there’s a solution but I’m not smart enough to figure it out.
Did tons of cad, semi finished the parts (still need to fix some stuff) and started an assembly. Here’s some stuff I did/problems I ran into: I cadded the new lead screw mounts for the gearshifter. I lowk dont have any clue what I’ll do about it hitting the 1:1 gears. Hopefully there’s some geometry fixes I can make. The bottom moving piece (that moves back and forth following the cam) is oversized and will hit the ring for the ramp. I will change it tmmrw. I realized a lot of my new parts are gonna be really hard to print so I split them. I started the assembly. I finished the basic side (most of the rest should just be mirorred). I have to figure out a better way to transfer torque while also spinning (remember the linear bearings spinning smooth). The current method just has something sliding on a shaft which is high friction. There are actual linear bearings that prevent rotation, but they are crazy expensive and barely produced anymore. I’ve also been thinking more about the one-way bearing based solution. I realize that maybe the key is just to mirror the whole gearbox and change the direction that it’s clutched in.
More cad. I assembled the lead screw and gear shifter. Here’s some stuff I did: After building my v2, I realized the ring is super unstable and can easily tilt, causing the whole thing to jam. This is especially true because its only being pushed at one point (the contact of the bearing). Therefore, I added some holes for rails so it can slide along the holes. However the rails need mounts which take up space, taking away space for the gear, so I might switch the rails to something else. The rails made the ring bigger so it started hitting the blue piece again, so i changed the position of the standoff to create more distance. I assembled the center shaft, which includes the output gears and the perpendicular cam. I had to change up some of the dimensions because it wasn’t fitting. I also removed the from the part because it would make it hard to print, and instead used a separate spacer. I’m starting to become pretty unproductive at cad because almost 40-50% of the time spent is just thinking about how I can design it rather than actually designing it. I also spent some time thinking about the one-way bearing solution. I finally got my hands on them so I’ll be trying stuff out instead of just trying to visualize them.
Made the 1:1 gears to power the cam and made a new rail system for the ring. Today was really productive, here’s what I did: initially, I messed with a lot of the dimensioning and spacing with the rails on the outside. I realized there’s no way it was gonna work, and even if it could, it would take up tons of space. I needed a better solution. Having the rails on the outside makes everything really big which doesn’t fit. I figured out a way to add a rail inside the tube. Instead of the ring being constrained to a rail, the inside thick square piece is constrained to a rail. This leaves tons of space on the outside for gears (almost 6mm of space on each side). I finally added the gears. I had 6mm of space which is more than enough. However, the gears hit the bearings that track the ring, so I’ll probably end up making the ring bigger either way. Another terrible thing is that the gears hit the blue piece. It actually goes far enough to cut into the bearing. Either I shift into smaller bearings, or I change the spacing between the gears. I still have to decide which on to do. I don’t think I’ll be building this version in hopes of coming up with a way to use one-way bearings.
I mirrored the whole thing, and the V3 looks complete but there’s some fundamental flaws. I also thopught a lot about the 1way bearing based solution. Here’s what I did: Mirrored the whole thing onto the other side. I didn’t run into any spacing issues which means I’m good at mastersketching. Currently, the 1:1 gears are hitting the big bearing that the dog clutch is in. I dont’ know how to fix this because it means I’ll have to change the gear ratios. I spent a lot of time thinking about the 1way cvt that doesn’t use clutching. I realized that I could put the input gear on a 1way bearing and somehow run different sets of gears based on the direction. However, everything is inevitably linked to the same output which jams everything. Also, the arm system is inherently not backdrivable which is makes the input on a 1way bearing solution not work. I’m gonna have to think more about a better solution. I need to do some finishing touches to the V3, but I’ll spend more of my time thinking about the 1way bearing cvt.
Finished most of the cad, just need to clean up tolerances and split a few parts. Here’s what I did: I made the rings for the gearshifter bigger because the gear shifter mount on the lead screw was hitting the center 1:1 gears. This caused lots of issues with sketches breaking so I had to redo those. I had to change the gearing for the last stage. The 1:1 gears were hitting the bearings so the only solution is to move the bearings further from the center, hence change the gear ratio. This also caused tons of problems and I had to redo a lot of the parts again, especially the gear shifter mount that mounts onto the lead screw. I added cutouts onto the blue part (it’s gray now, but the one that houses the bearing that the dog clutch goes on. The blue parts used to be hitting the 1:1 gears but now it clears by like 0.5 mm. I’m still deciding whether I want to assemble this or not. I can’t figure out the 1way bearing based thing, and I’m starting to feel like it’s fundamentally impossible.
Cleaned up a lot of the stuff hitting and a lot of the tolerances too. I also had to do some cooked surface modeling with onshape (I have never surface modeled before). Here’s what I did: The blue pieces were also hitting at the bottom, so I had to make the material even thinner than it was (really cooked, near 1.5mm thickness and barely clearing eachother). The standoff placements really cook everything so I’ll probably just extend the plate and move the standoffs further from the gears. However it will be uglier, and I would rather have a good looking cvt that doesn’t work than a ugly cvt that works. I had to do some really cooked stuff with surface modeling. Basically, the wrap feature wasn’t working. I spent like an hour or two trying to learn surface modeling, but nothing was working because the shape was weird, so I ended up just doing 8 separate revolutes, boolean, and then some move faces. Also, the bumps can’t be radial because the bearing isn’t radial (it faces horizontal, so the edge closer to the center moves up first which causes the whole thing to jam). To fix that I had to do even more cooked remove revolutes, then bridge curving and then knitting (I had never used these before) and fileting. I need to figure out a clearer way to do it because it’s getting on my nerves. I went through the latest V3 and compared around half of the holes to the V2 (it turns out there’s like 3 holes per part and theres like 100 holes to go through, not including clearances). The clearances also cooked some of the spacing so I went and fixed that. I’ve been spending some time thinking about the 1way bearing solution, and I completely switched up and now think it’s impossible.
Finished tolerancing the holes, and I added the pulley to the input gear. I also changed the large bearing mount for the gear shifter and also redid the lead screw mount because stuff was hitting. Here’s what I did: I went through like 70 holes, compared it to the toleranced version that was assembled. Lots of problems happened when I had to oversize the holes. For example, the linear bearing holes on the gear shifter mount had to be oversized, which made the thickness of the wall like 0.8mm thick. I then had to go into my mastersketch and change up the dimensions which took a stupidly long time. Regeneration times are hitting near 2 minutes (300 features isn’t good, plus tons of dependencies, and so many dimensions that it takes up the entire sketch). I added the pulley to the input gear. I had to switch to a different featurescript because the one I was using didn’t have GT2. After that it was pretty easy, just had to cad the walls, chamfer a bit and boolean and bore it. The most annoying part was that the copper lead screw nut (on the mount) was hitting the 1:1 gears completely ruining the whole thing. I basically had to redo the shaping of the lead screw mount. I moved the copper part further up the part, keeping the standoffs at basically the same level. As a result, I had more space at the bottom for two screws instead of 1. Also, now all the constraints are fully dependent on the external parts, so there’s no random dimensions I did just to make stuff look good, which is good because it means if I change the gearing or something in the mastersketch, the mount should update accordingly. This also took a pretty long time and 2 min regeneration doesn’t help....
|
1792716612.7587106
|
1793321412.7587106
|
|
44760
|
NHNK by @bali0531 | Stardance
|
bali0531
|
3
|
203.0
|
3419
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-06T17:48:14Z", "hours": 85.0, "multiplier": 19.62, "payout": 1664, "blessing": "neutral", "text": "Last ship was about optimizing stuff and fixing small bugs, while this ship is a bit more focused on new features, a new OOBE page, dev mode for advanced statistics about the application, and another batch of bug and UI fixes. So the main goal was to make the app look better and provide a better experience while using it overall + making it easier to diagnose possible problems through the devmode. UI/UX fixes include a new OLED theme, fixed overlapping elements, fixed contrast of the pages. For the UX part a new Out Of Box Experience, its basically a new login/info flow on first start, so now instead of separate pages for TOS/PP login, institution search etc, everything is on one seemless experience. It had some bug fixes too, like the .ics calendar exporting and auto-updating has been fixed now. Also fixed the broken widgets too so now it actually shows what classes you have that day. In terms of New Functions this ship introduces a new Dev mode by clicking the version number fast multiple times, it has a lot of informations about the startup, resource usage etc. For the future plans, I don’t have any new idea for now, the ones I had turned out to be not possible because of the api I have to use, I will probably fix the findings from the reviews of this ship + google playstore closed testing findings too. If you have any good idea make sure to write it down in the reviews / on the github page. (or on discord at @ bali411)", "repo": "https://github.com/Bali0531-RC/NHNK", "demo": "https://github.com/Bali0531-RC/NHNK/releases"}, {"ship_num": 2, "ts": "2026-08-29T18:07:52Z", "hours": 59.0, "multiplier": 18.22, "payout": 934, "blessing": "neutral", "text": "The previous ship was about fixing up the basics and making everyting work as intended. If you are interested in the main points of this project etc make sure to read the previous ship description too. In this ship I focused on optimizing the app, making the load time shorter, fixing some bugs like haptics etc, also logged the readme and website rework too. This ship is mainly for ending this stage before I start working on new features and more fixes. I optimized almost everything I can, made loading parallel where it was possible etc. Next ship will be packed with new features, I plan to add a dev mode to help find and debug edge cases or loading issues / resource leaks, also planning to add an “OOBE” to make the onboarding more seamless and modern. (No new images for this ship, since most of the changes are code related and not cosmetical. )", "repo": "https://github.com/Bali0531-RC/NHNK", "demo": "https://github.com/Bali0531-RC/NHNK/releases"}, {"ship_num": 3, "ts": "2026-08-11T18:50:41Z", "hours": 59.0, "multiplier": 17.56, "payout": 821, "blessing": "neutral", "text": "This project’s (NHNK = “Nem Hivatalos Neptun Kliens”, or in english “Unofficial Neptun Client” so you can say unc) goal is to make the life of university students easier, by creating a mobile app that lets them view their schedule, grades, statistics, upcoming events, messages and a lot more in one place, without the need to login every 30 minutes. The main problem was figuring out how the official university system “Neptun” works, and finding their API routes, but after figuring that out, the app works perfectly fine. This project makes major improvements over the official websites, First of all, every university has their own URL for the management site, that the students have to find / memorize, my app only needs the name of the university, and it automatically uses the saved address(es) from our list. Most universities have multiple urls/servers for “Neptun”, so if one is down, there is another. This again requires the users to figure out which server is up and usable, my app auto selects a server from the fallback list, if the default website is not available, and makes the switching seamless without even the users notice. The “Neptun” website also require users to login after 30min inactivity again, while in the same time most universities enabled the function to require 2fa for all accounts. While this is good for security, it makes checking your schedule grades etc a hassle. My app only needs users to enter their details once, and it wont ask for them again (except if the auth fails because of invalid credentials.), I know it might seems a security issue, that the app wont log users out, but the app is fully read only, as its only meant to check your data. these are the main improvements, but there are a lot more fun and usable features in the app, like detailed statistics etc. You can try the app out on https://nhnk.bali0531.hu via the live demo, or you can download it from github releases (and google play store too soon), but it requires a hungarian university student status to log in. (For non hungarian people who are interested in the app, a DEMO mode is also available in the app itself, but at that point you can just check it out on the website without downloading anything.", "repo": "https://github.com/Bali0531-RC/NHNK", "demo": "https://github.com/Bali0531-RC/NHNK/releases"}]...
|
[{"post_id": 63063, "ts": "202 [{"post_id": 63063, "ts": "2026-09-06T17:32:06Z", "hours": 5.5081, "text": "Added an OLED theme, picked it on my phone, and most of the screen was still grey. Rather than argue with my own eyes I took a screenshot and read the actual pixel values out of it, which took about a minute and saved me a lot of guessing. The background was 121212 when I had asked for pure black. Turned out the theme was never reaching the screen. The app builds its colour scheme without setting a surface colour, so every page fell back to Material’s own default grey and quietly ignored the palette it had been handed. One line, and the background went to 000000 and the cards to 080808. The bit I liked was the leftovers. A few tiles stayed light and I was about to go and edit the seventy something places that paint card backgrounds by hand, until I noticed the colour was 3B4548. That is not grey. Grey has equal channels. It was the teal accent bleeding in, because Material tints raised surfaces with your primary colour, so that was one setting too rather than an afternoon of find and replace. Also checked the contrast while I was in there and every accent clears AA on black between 9.37 and 18.80 to one, and found that choosing OLED did not survive the phone flipping to light mode and back, because the theme listener was overwriting whatever you picked. Not finished yet, the tile fix still needs a look on a real device."}, {"post_id": 62859, "ts": "2026-09-06T12:01:46Z", "hours": 9.5653, "text": "The old setup opened with a page of legal text and then asked whether you wanted to pick your school from a list or type in a Neptun URL, which is a strange thing to ask someone who has not been told what the app does yet. One of the reviews said it was a bit hard to set up and that was the honest version of it. It is four steps now with a bar across the top so you can see where the end is. Terms first, then a screen that actually says what NHNK is, then your school, then the login. The school search used to live behind that how do you want to log in question and now it is just the third step, so there is one less screen to get through. While testing it I typed obuda and got nothing back, because the school is called Óbudai Egyetem and I had not thought about accents. Nobody types those into a search box. It folds them now and there are tests so it stays that way. The screen I deleted was also quietly running the update check and the language prompt, which I only noticed on the last read through before removing it. Testing any of this used to mean wiping my own login, so debug builds install separately now."}, {"post_id": 62309, "ts": "2026-09-05T16:43:11Z", "hours": 5.9292, "text": "The next release replaces the login flow, so before touching anything I sat down and read the one I already have. It is four screens before anyone sees a timetable, all of them living in a single file of 2148 lines with five page classes in it. Disclosure, then pick how you want to log in, then find your university, then your Neptun code and password. The university list is 54 entries that I typed in by hand, and the app openly admits in its own description that your school might not be there. That is the part I keep coming back to, because someone whose university is missing has to understand what a Neptun URL is before they can get in. I also found out I had a note wrong. I had written down that the app forces Hungarian and needs country detection added. It does not. It already reads the phone language and falls back to English for anything it does not have. Good thing I checked before building a feature that exists. The genuinely awkward bit is the disclaimer. Translations get downloaded from GitHub while the app runs, which is lovely for adding languages and completely wrong for legal text, since nothing downloaded should be able to rewrite what the disclaimer says. So it is compiled in, and the one screen that most needs to be understood is the one screen stuck in two languages. I do not have a clean answer for that yet. Smaller things I wrote down. A class called SetupPageInstitudeSelection, spelled that way in eleven places. One university with its URL fixed up by hand inside the login handler. The Linux desktop build does not compile at all, which I only discovered because I tried to run the first-run flow there rather than wipe my own account off my phone. Four screens is not really the problem. Not knowing which of them people give up on is."}, {"post_id": 62096, "ts": "2026-09-05T10:46:49Z", "hours": 6.6283, "text": "Someone sent me a screenshot of the home screen widget saying they had no classes, last updated 00:00. They had a class at nine. The 00:00 was not a rounding problem or a timezone problem, it was every day, for everyone, since the widget shipped. When the app caches your week it stores the date as midnight on purpose, because the check for whether the cache is a day old compares whole days. The widget read that same value and printed the clock part of it, so it was showing you the definition of midnight rather than when anything happened. Reading the fetch path to fix it turned up a worse one. If a refresh fails the app puts the old rows back so you still have something to look at, which is right, but then it saves them again with today’s date on them. A week of failed refreshes and the cache still swears it is current. Restored rows keep their original timestamp now. The widget cannot fetch anything by itself, so past a day it says to open the app instead of telling you your day is empty. I nearly shipped that badly too, because the new timestamp only gets written on a real fetch, so every existing user would have been told to refresh the moment they updated. It falls back to the old date for them until their next fetch. An empty widget is fine. An empty widget that looks confident is not."}, {"post_id": 61698, "ts": "2026-09-04T18:56:47Z", "hours": 2.2917, "text": "The statistics page asks you to type how many credits your degree is, which has always annoyed me because Neptun obviously knows. So I went looking, and it will not tell me. There is an endpoint for it sitting in my own code that I have never called, except it only exists on the old API and the modern one has no equivalent among the ten endpoints I use. The one call that touches your programme at all already runs on every startup, and it returns three fields: whether the training is current, its id, and its name. Not a credit count anywhere. I even tried working it out from the programme name and that failed too, because it is a plain string with no BSc or MSc in it. So the box where you type 180 stays, and the release that was going to remove it does not exist. An evening to find that out is a lot cheaper than half a feature."}, {"post_id": 61464, "ts": "2026-09-04T12:10:44Z", "hours": 10.0589, "text": "Tap the version seven times and the app now has a developer tab: startup timings, every request it makes, how stale each cache is, and how many frames it dropped. The interesting part was not building it, it was working out what it is allowed to say, because this thing is holding somebody’s Neptun password. So the list of stored keys is an allowlist rather than a blocklist, meaning a key I add next year is hidden until I say otherwise, and the cached grades and messages only ever show their size. The redaction lives in the recorder instead of the screen, which matters more than it sounds, because one of my own URLs turned out to be a credential and a log that printed URLs would have published it."}, {"post_id": 60573, "ts": "2026-09-03T00:32:04Z", "hours": 10.0933, "text": "Next release I want a developer tab that shows what the app is storing and every request it makes, which sounds harmless right up until you remember my app is holding somebody’s Neptun password. So before writing any of it I went through all 77 things it keeps on disk, and only 46 can have their value put on screen. The trap was sorting by key name, because CachedMarkbook_3 sounds like nothing and is actually somebody’s grades, so that whole group gets to show its size and age and nothing else. The one that nearly got me is the calendar export link, which keeps working with no session at all, meaning the URL is the credential, and a network log that prints URLs would have published it in plain text."}, {"post_id": 60246, "ts": "2026-09-02T14:26:30Z", "hours": 5.3231, "text": "Someone reviewing the last ship said my contrast was bad, the corners did not match and things needed more padding, so instead of squinting at it I went and measured all three. Every accent colour in the light theme failed WCAG AA, and the worst was the one I use for links and section headers, sitting at 1.43 to 1, which is pale blue text on pale grey. Then I counted the corner radii and found fifteen different values across 88 places, which is exactly the kind of thing you stop seeing in your own app. The padding one turned out to be a single number, the search box above the message list had zero bottom padding, and while I was looking at spacing I finally noticed the week switcher on the timetable has always been two separate boxes of different widths with mismatched corners, pretending to be one panel."}, {"post_id": 59878, "ts": "2026-09-01T21:18:00Z", "hours": 10.0089, "text": "I added screen reader labels to the payments, messages and periods cards, then dumped the accessibility tree off the phone to actually hear what came out. Good thing, because the order was backwards: every card read its details first and the name of the thing last, so a subject announced itself as “6 credits, not completed, Introduction to Programming”. That was true of the markbook labels I shipped months ago as well, which nobody had ever mentioned to me. Also finished the calendar export fix from last time, so exporting your timetable no longer tells you the file type is unsupported."}, {"post_id": 59071, "ts": "2026-08-31T17:55:45Z", "hours": 9.8689, "text": "Spent this one adding screen reader labels to the cards that never had any, and then dumping the accessibility tree off the phone to check what actually comes out. Two things fell out of that: the order was backwards everywhere, so cards read their details before the name of the thing, and that was true of labels I shipped months ago too. The honest scoreboard is three of seven card types verified, payments is impossible for me to check because my account has no bills on it, and I have not run an actual screen reader yet, only read the tree, which tells me nothing about focus order or whether you can even swipe to them. So this one is going into closed testing before it gets a tag."}, {"post_id": 58018, "ts": "2026-08-30T11:09:29Z", "hours": 9.7206, "text": "Someone told me the timetable export says “unsupported file type” on their phone, and then mine did it too, which at least made it easy to chase. Turns out the plugin I use picks the file type from a big list of extensions and there is no entry for ics, so it falls through to / and Android hands that to whatever generic file previewer the manufacturer ships, which obviously cannot read a calendar. The annoying part is the phone had the right app the whole time, because Honor’s calendar registers itself for text/calendar and I just never asked for it. One extra argument and the export now offers the calendar first, which ships in the next update."}, {"post_id": 57516, "ts": "2026-08-29T18:00:19Z", "hours": 2.3325, "text": "Last time I said the real problem was that startup waits for the keystore at all, and that fixing it meant making six getters async across a pile of call sites. Did it, and it went from 239ms to 144ms because the timetable comes out of the cache and never needed a password in the first place. What I did not expect was that the compiler only caught 22 of the 27 places that broke, because the last five build the old API request body by gluing strings together, and a string is happy to take a Future and turn it into “Instance of ‘Future<String?>’”. So those five would have quietly posted that to the university as my password instead of failing, which I only found because I went looking after the analyser had already gone green."}, {"post_id": 57413, "ts": "2026-08-29T15:39:47Z", "hours": 9.7889, "text": "Last release I added timers to the app. This one I finally pointed them at startup, and the answer was annoying: 153ms of a 251ms cold start was one function, and 128ms of that was six separate trips to the Android keystore to read six saved values one at a time. None of which the timetable needs, because it draws from cache. I have a fix half done that reads them once and starts before anything asks, but while measuring I noticed the bigger problem is that startup waits for those values at all, and unpicking that means changing six getters used in 46 places, so that is the next few evenings."}, {"post_id": 56915, "ts": "2026-08-28T22:43:52Z", "hours": 9.1436, "text": "I have been shipping features for weeks without ever measuring any of them. So I plugged the phone in and actually timed things, and the Upcoming screen I added last week turned out to fire eight calendar requests one after another. One slow week took 3.2 seconds and the other seven just sat in the queue behind it. Sending them four at a time took the whole thing from 3987ms to 297ms. Then while I was reading the log I noticed every haptic in the app has been throwing an exception instead of vibrating, because I gave Android an amplitude list of the wrong length in all seven places, so vibration has never once worked."}, {"post_id": 56621, "ts": "2026-08-28T13:34:18Z", "hours": 10.9206, "text": "My app ships a 22.9 MB emoji font to draw 28 emoji. It’s bundled on purpose, so the icons look identical on every phone instead of Samsung doing its own thing. Fine goal. But it’s the whole font, 1485 codepoints, sitting in the base module so every single user downloads all of it. Subset it to the ones I actually use and it’s 1.93 MB.Most of what was left after subsetting turned out to be the SVG table. Google ships every glyph twice, once as COLR and once as SVG, and Skia only draws the COLR one, so 6.1 MB of it was duplicate artwork nothing would ever read.Also learned to measure the thing that matters. Uncompressed it’s a 21 MB saving, which sounds great, but the font compresses inside the APK so the real number is 7.30 MB to 1.01 MB, and the APK went 67.6 to 61.0. Still good, just not the number I wanted to write. Separately, my last release failed twice for reasons that had nothing to do with me: CI tracked Flutter stable, stable moved to 3.47, and it raised the minimum Gradle and then the minimum AGP. Pinned CI to the version I actually build with."}, {"post_id": 56177, "ts": "2026-08-27T20:14:51Z", "hours": 10.6, "text": "Last ship’s feedback was blunt: five people said they couldn’t tell what the project was because they don’t read Hungarian. The UI switched to English fine, but the demo data never did, so you’d open it and still get “Analízis I. (előadás)” and “bejelentkezési időszak”. So every bit of fake data the demo makes up now follows the app language. Timetable, exams, deadlines, grades, four semesters of history, payments, periods, mail. Two things had to stay Hungarian underneath though: the period icons are picked by string-matching the period name (Neptun only ever replies in Hungarian), and the “is this payment cancelled” check keys off the word “törölt”. Translating those naively would’ve silently killed every period icon and made cancelled payments look paid. Kept the raw values for the logic, translate only what’s on screen.Found a bug doing it too. Switched to Hungarian and half the demo stayed English, because markbook/payments/periods cache their data for 24h and nobody had exempted demo mode. The calendar already did. Now they all do.Also killed 9 languages. German, Romanian, Russian, Turkish, Ukrainian, Arabic, Spanish, Chinese and Pirate were all downloadable and all mostly half-translated, so picking one left you in a mix of two languages, which is worse than just being in one. Magyar and English only now."}, {"post_id": 55132, "ts": "2026-08-26T16:25:24Z", "hours": 16.6372, "text": "Spent the last stretch on the parts of the project that aren’t the app itself. Rewrote the README three times. First pass just bolted an English version onto the Hungarian one and it ballooned to 351 lines. Second pass I tried to make it “proper” and somehow ended up at 3,185 words, which is longer than most of my essays and nobody was ever going to read it. Third pass I threw that out and wrote it like I’d explain the thing to a friend. Ended up at 184 lines, shorter than what I started with, in two languages instead of one.Then rewrote the whole website. The old one had a big slogan hero, “Neptun, the way it should work on your phone”, which sounds nice but doesn’t tell you what the thing actually is. New one just says it: an unofficial Neptun client for Android, with a little spec row underneath (platform, licence, tracking, price) so you get the whole picture in about two seconds. 13 files, ~5k lines. Also finally wired the site into the app repo as a submodule so they stop drifting apart. Not the most exciting work but the feedback from last ship was that people couldn’t tell what the project was if they didn’t speak Hungarian, so this was the fix."}, {"post_id": 45330, "ts": "2026-08-11T18:32:36Z", "hours": 11.6211, "text": "Your exams were always in the app, you just had to guess which week to scroll to. Built an Upcoming screen that pulls every exam, deadline and open registration period into one list with countdowns, plus a degree progress ring and proper subject pages that finally put the grade, the classes and the exam together."}, {"post_id": 44854, "ts": "2026-08-10T21:49:43Z", "hours": 7.0381, "text": "Was adding a stats page and realised the app had been downloading all 6 of my semesters this whole time and then throwing away everything except the last one. So now there’s actual history: semester averages, credits, grade distribution, on charts I painted by hand because adding a chart library for two graphs felt dumb.Also found out cancelled payments were counting as money you’d spent, so it was telling you that you’d paid 5000 Ft you never paid. Fixed that too. 1.2.3 is out."}, {"post_id": 44620, "ts": "2026-08-10T14:47:36Z", "hours": 8.6858, "text": "I was shipping 20 MB that nobody downloads"}, {"post_id": 44179, "ts": "2026-08-09T19:26:38Z", "hours": 8.5783, "text": "Added live demo for the app to the website."}, {"post_id": 43585, "ts": "2026-08-08T22:40:44Z", "hours": 20.7336, "text": "Fixed some bugs, added widgets, offline mode and a lot more stuff. 5/14 days done until playstore prod release."}, {"post_id": 42540, "ts": "2026-08-07T10:46:27Z", "hours": 2.4797, "text": "Play Store closed testing is in progress!"}]...
|
Title: NHNK by @bali0531 | Stardance
Devlogs:
Pla Title: NHNK by @bali0531 | Stardance
Devlogs:
Play Store closed testing is in progress!
Fixed some bugs, added widgets, offline mode and a lot more stuff. 5/14 days done until playstore prod release.
Added live demo for the app to the website.
I was shipping 20 MB that nobody downloads
Was adding a stats page and realised the app had been downloading all 6 of my semesters this whole time and then throwing away everything except the last one. So now there’s actual history: semester averages, credits, grade distribution, on charts I painted by hand because adding a chart library for two graphs felt dumb.Also found out cancelled payments were counting as money you’d spent, so it was telling you that you’d paid 5000 Ft you never paid. Fixed that too. 1.2.3 is out.
Your exams were always in the app, you just had to guess which week to scroll to. Built an Upcoming screen that pulls every exam, deadline and open registration period into one list with countdowns, plus a degree progress ring and proper subject pages that finally put the grade, the classes and the exam together.
Spent the last stretch on the parts of the project that aren’t the app itself. Rewrote the README three times. First pass just bolted an English version onto the Hungarian one and it ballooned to 351 lines. Second pass I tried to make it “proper” and somehow ended up at 3,185 words, which is longer than most of my essays and nobody was ever going to read it. Third pass I threw that out and wrote it like I’d explain the thing to a friend. Ended up at 184 lines, shorter than what I started with, in two languages instead of one.Then rewrote the whole website. The old one had a big slogan hero, “Neptun, the way it should work on your phone”, which sounds nice but doesn’t tell you what the thing actually is. New one just says it: an unofficial Neptun client for Android, with a little spec row underneath (platform, licence, tracking, price) so you get the whole picture in about two seconds. 13 files, ~5k lines. Also finally wired the site into the app repo as a submodule so they stop drifting apart. Not the most exciting work but the feedback from last ship was that people couldn’t tell what the project was if they didn’t speak Hungarian, so this was the fix.
Last ship’s feedback was blunt: five people said they couldn’t tell what the project was because they don’t read Hungarian. The UI switched to English fine, but the demo data never did, so you’d open it and still get “Analízis I. (előadás)” and “bejelentkezési időszak”. So every bit of fake data the demo makes up now follows the app language. Timetable, exams, deadlines, grades, four semesters of history, payments, periods, mail. Two things had to stay Hungarian underneath though: the period icons are picked by string-matching the period name (Neptun only ever replies in Hungarian), and the “is this payment cancelled” check keys off the word “törölt”. Translating those naively would’ve silently killed every period icon and made cancelled payments look paid. Kept the raw values for the logic, translate only what’s on screen.Found a bug doing it too. Switched to Hungarian and half the demo stayed English, because markbook/payments/periods cache their data for 24h and nobody had exempted demo mode. The calendar already did. Now they all do.Also killed 9 languages. German, Romanian, Russian, Turkish, Ukrainian, Arabic, Spanish, Chinese and Pirate were all downloadable and all mostly half-translated, so picking one left you in a mix of two languages, which is worse than just being in one. Magyar and English only now.
My app ships a 22.9 MB emoji font to draw 28 emoji. It’s bundled on purpose, so the icons look identical on every phone instead of Samsung doing its own thing. Fine goal. But it’s the whole font, 1485 codepoints, sitting in the base module so every single user downloads all of it. Subset it to the ones I actually use and it’s 1.93 MB.Most of what was left after subsetting turned out to be the SVG table. Google ships every glyph twice, once as COLR and once as SVG, and Skia only draws the COLR one, so 6.1 MB of it was duplicate artwork nothing would ever read.Also learned to measure the thing that matters. Uncompressed it’s a 21 MB saving, which sounds great, but the font compresses inside the APK so the real number is 7.30 MB to 1.01 MB, and the APK went 67.6 to 61.0. Still good, just not the number I wanted to write. Separately, my last release failed twice for reasons that had nothing to do with me: CI tracked Flutter stable, stable moved to 3.47, and it raised the minimum Gradle and then the minimum AGP. Pinned CI to the version I actually build with.
I have been shipping features for weeks without ever measuring any of them. So I plugged the phone in and actually timed things, and the Upcoming screen I added last week turned out to fire eight calendar requests one after another. One slow week took 3.2 seconds and the other seven just sat in the queue behind it. Sending them four at a time took the whole thing from 3987ms to 297ms. Then while I was reading the log I noticed every haptic in the app has been throwing an exception instead of vibrating, because I gave Android an amplitude list of the wrong length in all seven places, so vibration has never once worked.
Last release I added timers to the app. This one I finally pointed them at startup, and the answer was annoying: 153ms of a 251ms cold start was one function, and 128ms of that was six separate trips to the Android keystore to read six saved values one at a time. None of which the timetable needs, because it draws from cache. I have a fix half done that reads them once and starts before anything asks, but while measuring I noticed the bigger problem is that startup waits for those values at all, and unpicking that means changing six getters used in 46 places, so that is the next few evenings.
Last time I said the real problem was that startup waits for the keystore at all, and that fixing it meant making six getters async across a pile of call sites. Did it, and it went from 239ms to 144ms because the timetable comes out of the cache and never needed a password in the first place. What I did not expect was that the compiler only caught 22 of the 27 places that broke, because the last five build the old API request body by gluing strings together, and a string is happy to take a Future and turn it into “Instance of ‘Future<String?>’”. So those five would have quietly posted that to the university as my password instead of failing, which I only found because I went looking after the analyser had already gone green.
Someone told me the timetable export says “unsupported file type” on their phone, and then mine did it too, which at least made it easy to chase. Turns out the plugin I use picks the file type from a big list of extensions and there is no entry for ics, so it falls through to / and Android hands that to whatever generic file previewer the manufacturer ships, which obviously cannot read a calendar. The annoying part is the phone had the right app the whole time, because Honor’s calendar registers itself for text/calendar and I just never asked for it. One extra argument and the export now offers the calendar first, which ships in the next update.
Spent this one adding screen reader labels to the cards that never had any, and then dumping the accessibility tree off the phone to check what actually comes out. Two things fell out of that: the order was backwards everywhere, so cards read their details before the name of the thing, and that was true of labels I shipped months ago too. The honest scoreboard is three of seven card types verified, payments is impossible for me to check because my account has no bills on it, and I have not run an actual screen reader yet, only read the tree, which tells me nothing about focus order or whether you can even swipe to them. So this one is going into closed testing before it gets a tag.
I added screen reader labels to the payments, messages and periods cards, then dumped the accessibility tree off the phone to actually hear what came out. Good thing, because the order was backwards: every card read its details first and the name of the thing last, so a subject announced itself as “6 credits, not completed, Introduction to Programming”. That was true of the markbook labels I shipped months ago as well, which nobody had ever mentioned to me. Also finished the calendar export fix from last time, so exporting your timetable no longer tells you the file type is unsupported.
Someone reviewing the last ship said my contrast was bad, the corners did not match and things needed more padding, so instead of squinting at it I went and measured all three. Every accent colour in the light theme failed WCAG AA, and the worst was the one I use for links and section headers, sitting at 1.43 to 1, which is pale blue text on pale grey. Then I counted the corner radii and found fifteen different values across 88 places, which is exactly the kind of thing you stop seeing in your own app. The padding one turned out to be a single number, the search box above the message list had zero bottom padding, and while I was looking at spacing I finally noticed the week switcher on the timetable has always been two separate boxes of different widths with mismatched corners, pretending to be one panel.
Next release I want a developer tab that shows what the app is storing and every request it makes, which sounds harmless right up until you remember my app is holding somebody’s Neptun password. So before writing any of it I went through all 77 things it keeps on disk, and only 46 can have their value put on screen. The trap was sorting by key name, because CachedMarkbook_3 sounds like nothing and is actually somebody’s grades, so that whole group gets to show its size and age and nothing else. The one that nearly got me is the calendar export link, which keeps working with no session at all, meaning the URL is the credential, and a network log that prints URLs would have published it in plain text.
Tap the version seven times and the app now has a developer tab: startup timings, every request it makes, how stale each cache is, and how many frames it dropped. The interesting part was not building it, it was working out what it is allowed to say, because this thing is holding somebody’s Neptun password. So the list of stored keys is an allowlist rather than a blocklist, meaning a key I add next year is hidden until I say otherwise, and the cached grades and messages only ever show their size. The redaction lives in the recorder instead of the screen, which matters more than it sounds, because one of my own URLs turned out to be a credential and a log that printed URLs would have published it.
The statistics page asks you to type how many credits your degree is, which has always annoyed me because Neptun obviously knows. So I went looking, and it will not tell me. There is an endpoint for it sitting in my own code that I have never called, except it only exists on the old API and the modern one has no equivalent among the ten endpoints I use. The one call that touches your programme at all already runs on every startup, and it returns three fields: whether the training is current, its id, and its name. Not a credit count anywhere. I even tried working it out from the programme name and that failed too, because it is a plain string with no BSc or MSc in it. So the box where you type 180 stays, and the release that was going to remove it does not exist. An evening to find that out is a lot cheaper than half a feature.
Someone sent me a screenshot of the home screen widget saying they had no classes, last updated 00:00. They had a class at nine. The 00:00 was not a rounding problem or a timezone problem, it was every day, for everyone, since the widget shipped. When the app caches your week it stores the date as midnight on purpose, because the check for whether the cache is a day old compares whole days. The widget read that same value and printed the clock part of it, so it was showing you the definition of midnight rather than when anything happened. Reading the fetch path to fix it turned up a worse one. If a refresh fails the app puts the old rows back so you still have something to look at, which is right, but then it saves them again with today’s date on them. A week of failed refreshes and the cache still swears it is current. Restored rows keep their original timestamp now. The widget cannot fetch anything by itself, so past a day it says to open the app instead of telling you your day is empty. I nearly shipped that badly too, because the new timestamp only gets written on a real fetch, so every existing user would have been told to refresh the moment they updated. It falls back to the old date for them until their next fetch. An empty widget is fine. An empty widget that looks confident is not.
The next release replaces the login flow, so before touching anything I sat down and read the one I already have. It is four screens before anyone sees a timetable, all of them living in a single file of 2148 lines with five page classes in it. Disclosure, then pick how you want to log in, then find your university, then your Neptun code and password. The university list is 54 entries that I typed in by hand, and the app openly admits in its own description that your school might not be there. That is the part I keep coming back to, because someone whose university is missing has to understand what a Neptun URL is before they can get in. I also found out I had a note wrong. I had written down that the app forces Hungarian and needs country detection added. It does not. It already reads the phone language and falls back to English for anything it does not have. Good thing I checked before building a feature that exists. The genuinely awkward bit is the disclaimer. Translations get downloaded from GitHub while the app runs, which is lovely for adding languages and completely wrong for legal text, since nothing downloaded should be able to rewrite what the disclaimer says. So it is compiled in, and the one screen that most needs to be understood is the one screen stuck in two languages. I do not have a clean answer for that yet. Smaller things I wrote down. A class called SetupPageInstitudeSelection, spelled that way in eleven places. One university with its URL fixed up by hand inside the login handler. The Linux desktop build does not compile at all, which I only discovered because I tried to run the first-run flow there rather than wipe my own account off my phone. Four screens is not really the problem. Not knowing which of them people give up on is.
The old setup opened with a page of legal text and then asked whether you wanted to pick your school from a list or type in a Neptun URL, which is a strange thing to ask someone who has not been told what the app does yet. One of the reviews said it was a bit hard to set up and that was the honest version of it. It is four steps now with a bar across the top so you can see where the end is. Terms first, then a screen that actually says what NHNK is, then your school, then the login. The school search used to live behind that how do you want to log in question and now it is just the third step, so there is one less screen to get through. While testing it I typed obuda and got nothing back, because the school is called Óbudai Egyetem and I had not thought about accents. Nobody types those into a search box. It folds them now and there are tests so it stays that way. The screen I deleted was also quietly running the update check and the language prompt, which I only noticed on the last read through before removing it. Testing any of this used to mean wiping my own login, so debug builds install separately now.
Added an OLED theme, picked it on my phone, and most of the screen was still grey. Rather than argue with my own eyes I took a screenshot and read the actual pixel values out of it, which took about a minute and saved me a lot of guessing. The background was 121212 when I had asked for pure black. Turned out the theme was never reaching the screen. The app builds its colour scheme without setting a surface colour, so every page fell back to Material’s own default grey and quietly ignored the palette it had been handed. One line, and the background went to 000000 and the cards to 080808. The bit I liked was the leftovers. A few tiles stayed light and I was about to go and edit the seventy something places that paint card backgrounds by hand, until I noticed the colour was 3B4548. That is not grey. Grey has equal channels. It was the teal accent bleeding in, because Material tints raised surfaces with your primary colour, so that was one setting too rather than an afternoon of find and replace. Also checked the contrast while I was in there and every accent clears AA on black between 9.37 and 18.80 to one, and found that choosing OLED did not survive the phone flipping to light mode and back, because the theme listener was overwriting whatever you picked. Not finished yet, the tile fix still needs a look on a real device.
Ships:
This project’s (NHNK = “Nem Hivatalos Neptun Kliens”, or in english “Unofficial Neptun Client” so you can say unc) goal is to make the life of university students easier, by creating a mobile app that lets them view their schedule, grades, statistics, upcoming events, messages and a lot more in one place, without the need to login every 30 minutes. The main problem was figuring out how the official university system “Neptun” works, and finding their API routes, but after figuring that out, the app works perfectly fine. This project makes major improvements over the official websites, First of all, every university has their own URL for the management site, that the students have to find / memorize, my app only needs the name of the university, and it automatically uses the saved address(es) from our list. Most universities have multiple urls/servers for “Neptun”, so if one is down, there is another. This again requires the users to figure out which server is up and usable, my app auto selects a server from the fallback list, if the default website is not available, and makes the switching seamless without even the users notice. The “Neptun” website also require users to login after 30min inactivity again, while in the same time most universities enabled the function to require 2fa for all accounts. While this is good for security, it makes checking your schedule grades etc a hassle. My app only needs users to enter their details once, and it wont ask for them again (except if the auth fails because of invalid credentials.), I know it might seems a security issue, that the app wont log users out, but the app is fully read only, as its only meant to check your data. these are the main improvements, but there are a lot more fun and usable features in the app, like detailed statistics etc. You can try the app out on https://nhnk.bali0531.hu via the live demo, or you can download it from github releases (and google play store too soon), but it requires a hungarian university student status to log in. (For non hungarian people who are interested in the app, a DEMO mode is also available in the app itself, but at that point you can just check it out on the website without downloading anything.
The previous ship was about fixing up the basics and making everyting work as intended. If you are interested in the main points of this project etc make sure to read the previous ship description too. In this ship I focused on optimizing the app, making the load time shorter, fixing some bugs like haptics etc, also logged the readme and website rework too. This ship is mainly for ending this stage before I start working on new features and more fixes. I optimized almost everything I can, made loading parallel where it was possible etc. Next ship will be packed with new features, I plan to add a dev mode to help find and debug edge cases or loading issues / resource leaks, also planning to add an “OOBE” to make the onboarding more seamless and modern. (No new images for this ship, since most of the changes are code related and not cosmetical. )
Last ship was about optimizing stuff and fixing small bugs, while this ship is a bit more focused on new features, a new OOBE page, dev mode for advanced statistics about the application, and another batch of bug and UI fixes. So the main goal was to make the app look better and provide a better experience while using it overall + making it easier to diagnose possible problems through the devmode. UI/UX fixes include a new OLED theme, fixed overlapping elements, fixed contrast of the pages. For the UX part a new Out Of Box Experience, its basically a new login/info flow on first start, so now instead of separate pages for TOS/PP login, institution search etc, everything is on one seemless experience. It had some bug fixes too, like the .ics calendar exporting and auto-updating has been fixed now. Also fixed the broken widgets too so now it actually shows what classes you have that day. In terms of New Functions this ship introduces a new Dev mode by clicking the version number fast multiple times, it has a lot of informations about the startup, resource usage etc. For the future plans, I don’t have any new idea for now, the ones I had turned out to be not possible because of the api I have to use, I will probably fix the findings from the reviews of this ship + google playstore closed testing findings too. If you have any good idea make sure to write it down in the reviews / on the github page. (or on discord at @ bali411)...
|
1792878441.7529333
|
1793742441.7529333
|
|
42272
|
+1 Jump Skate Escape by @Wontonify | Stardance
|
Wontonify
|
0
|
203.24
|
0
|
[]
|
[{"post_id": 61890, "ts": "202 [{"post_id": 61890, "ts": "2026-09-05T01:48:50Z", "hours": 9.2422, "text": "Devlog #042 Race world is now officially out! Sorry it took so long, these past days I have been really busy with school and haven’t worked on much. I think this will be my last proper devlog of the game, the next will probably just be preparing the project for shipping."}, {"post_id": 60031, "ts": "2026-09-02T04:25:41Z", "hours": 7.7886, "text": "Devlog #041 Changes More analytics More badges OP daily rewards to increase retention Map improvements Revive and Race UI Re-implementation of revive popup"}, {"post_id": 56973, "ts": "2026-08-29T00:50:21Z", "hours": 4.4531, "text": "Devlog #040 World 2 is now officially out! Stayed up late yesterday to get some bug fixes in straight after publish but we should be good for now."}, {"post_id": 56468, "ts": "2026-08-28T07:47:54Z", "hours": 3.7669, "text": "Devlog #039 Added in funnels so that I can see where the users are leaving and why are they are leaving. Hopefully this can help me decide what to add to improve game stats."}, {"post_id": 55513, "ts": "2026-08-27T12:33:37Z", "hours": 4.9758, "text": "Devlog #038 Took a temporary detour to make the race map and also improved upon World 2. Every 5 minutes, the user can choose to participate in a “Race” with other people. The winner of the race will receive wins (I haven’t really decided what to give yet) and its sort of just like a fun little event."}, {"post_id": 55405, "ts": "2026-08-27T06:50:48Z", "hours": 2.1469, "text": "Devlog #037 Fully finished up the balancing, so that World 2 takes 2x the time to beat as World 1."}, {"post_id": 55368, "ts": "2026-08-27T04:35:52Z", "hours": 8.6767, "text": "Devlog #036 Changes This devlog was supposed to be out yesterday but HackaTime servers were down and so I couldn’t post. Anyways, the entirely of W2 is now complete (aside from balancing) which I still have to do. The issue is that WalkSpeed is locked to +1 per level, but the world two map is the same size so you start slamming into walls. Game Stats We have almost 10k people signed up for the World 2 release date in a few days (WHICH IS CRAZY)! And we also hit 20k home recommendations which is nice and hopefully that number keeps growing."}, {"post_id": 53652, "ts": "2026-08-24T09:46:54Z", "hours": 2.5603, "text": "Devlog #035 Got the rest of the spawn done including new skateboards and training areas!"}, {"post_id": 53597, "ts": "2026-08-24T06:48:48Z", "hours": 1.4014, "text": "Devlog #034 Finished up the entirety of the main map! Got the spawn to do (new training areas + skateboard models) and I should be good to start scripting the second world!"}, {"post_id": 53020, "ts": "2026-08-23T12:27:36Z", "hours": 4.1781, "text": "Devlog #033 Finished up 4 more sections! I just got the “Black Hole” section to do now and the main build for W2 is done!"}, {"post_id": 52870, "ts": "2026-08-23T07:41:29Z", "hours": 1.0503, "text": "Devlog #032 Finished up the 6th section! This one is definitely one of the more unique ones out of the batch, and I think I’m going to do something similar for the ones after that as well. World 1 had like a biome sort of theme such areas such as “Forest”, “Ice”, “Dune” and “Sakura” so the theme for World 2 would be planets. 🪐 So far I’ve completed Earth, Moon, Mercury, Mars, Venus and Saturn. I’ve also tried to implement details of each planet inside the build itself, so for Saturn (shown in image) I added arches above the top since it has rings and also added a bunch of small floating rocks as “moons”"}, {"post_id": 52850, "ts": "2026-08-23T06:35:47Z", "hours": 3.8669, "text": "Devlog #031 Finished the first 5 sections of W2! I added these cross sectioned lasers just to mix it up and make world two a little more different than world 1. Also some guy has 41 hours on the game lol"}, {"post_id": 52089, "ts": "2026-08-22T05:02:06Z", "hours": 0.97, "text": "Devlog #030 Working on World TWO!"}, {"post_id": 52061, "ts": "2026-08-22T03:43:27Z", "hours": 4.7569, "text": "Devlog #029 There’s been a major bug with the UI on top of the skateboards where sometimes it just wouldn’t show. I think this is something do with the Roblox glyph engine, I’ve had an issue similar to this before but it was with another game and it has significantly more textlabels, and the text was flickering instead of just blatantly not showing. I’ve added adonis with dex which lets me view studio properties inside of Roblox so I can see whether its a studio issue or just my code. Additional Changes Added group reward with brand new skateboard Added badges"}, {"post_id": 51608, "ts": "2026-08-21T11:41:11Z", "hours": 3.1489, "text": "Devlog #028 Added in some more thumbnails and am also in the process of trialing different titles. Somehow this thumbnail is leading by far with 4% CTR."}, {"post_id": 51499, "ts": "2026-08-21T07:49:16Z", "hours": 2.1506, "text": "Devlog #027 Just realised that this entire time I haven’t been uploading to github. Unfortunately there isn’t an easy way to upload files to git directly from the studio but I do now have script sync enabled and will try to commit at least once every devlog. Not really sure about the times when the devlog is mainly about building, as I can’t just directly upload the rbxm file since I use so many bought assets. Eventually during the final ship I will spend the time to create a map with the assets stripped out. Changes Added admin command system Added daily rewards Fixed major bugs regarding shop + boosts Added friend boosts and train area boost when multiple people are training on the same rail Right now I’m working on the map for W2, hopefully I can get this finished fast!"}, {"post_id": 51438, "ts": "2026-08-21T04:37:21Z", "hours": 0.8681, "text": "Devlog #026 Not really a devlog lol but we just hit all ages!"}, {"post_id": 50871, "ts": "2026-08-20T10:13:32Z", "hours": 4.825, "text": "Devlog #025 Massive overhaul. Before there were way too many different values for the user to handle, so I decided to simplify it. Now, every single obtainable item in the game revolves around XP. XP is obtained by moving or being at one of the training grounds. Obtaining XP increase progress towards your LEVEL, which controls things like WalkSpeed, Jumps, Ramp Boost."}, {"post_id": 50776, "ts": "2026-08-20T04:40:27Z", "hours": 6.8889, "text": "Devlog #024 Testing some more thumbnails for maximum click rate. I’m working on a pretty big rework change right now which is why this devlog has so much time attached to it but I wanted to let yall know."}, {"post_id": 50070, "ts": "2026-08-19T03:49:00Z", "hours": 3.2386, "text": "Devlog #023 THUMBNAILS + RELEASE! Game link: https://www.roblox.com/games/92438199141937/1-Skate-Obby-Escape"}, {"post_id": 49431, "ts": "2026-08-18T08:27:23Z", "hours": 9.9875, "text": "Devlog #022 New UI + Polish Changes! Honestly these past few devlogs I kinda got no idea what to say, I could go on about the thousands of tiny value changes I did but that’d be boring so here’s the more important things. Changes You can now choose your own speed, as long as it is lower than your max New hazard systems, such as the floor rising and platforms suddenly dropping Bunch of bug fixes and polish changes WE ARE SO SO SO CLOSE TO RELEASE! Thumbnails are being made as I speak!"}, {"post_id": 48069, "ts": "2026-08-16T11:01:26Z", "hours": 11.5511, "text": "Devlog #021 Changes Added more monetization Added revive system Scripted upgrade machine More polish changes The game is nearing its complete! Hopefully I am able to release soon once I get some thumbnails made."}, {"post_id": 47251, "ts": "2026-08-15T01:46:11Z", "hours": 3.4672, "text": "Devlog #020 Finished up the final two sections!"}, {"post_id": 46876, "ts": "2026-08-14T12:43:32Z", "hours": 1.6408, "text": "Devlog #019 Believe it or not but this upgrade machine took me nearly 2 hours 😭"}, {"post_id": 46826, "ts": "2026-08-14T10:57:52Z", "hours": 10.6086, "text": "Devlog #018 MASSIVE MAP IMPROVEMENTS P.S. THERE ARE MORE THAN 1 IMAGE"}, {"post_id": 45685, "ts": "2026-08-12T10:34:44Z", "hours": 5.0622, "text": "Devlog #017 Continued working on the map! All walls are up now just working on decoration and other small map improvements!"}, {"post_id": 45579, "ts": "2026-08-12T05:13:00Z", "hours": 3.0192, "text": "Devlog #016 Got awesome asset pack 🔥and continuing work on completing the map expansion + revamp!"}, {"post_id": 45106, "ts": "2026-08-11T11:49:48Z", "hours": 8.6303, "text": "Devlog #015 Changes Expanded and Reworked Map Reworked Boost Mechanism (AGAIN!) More Polishing Made the map significant bigger to encompass new and improved boosting mechanism. I cannot tell you how many times I have rewrote the boost mechanism so HOPEFULLY this is the last time 🤞"}, {"post_id": 43888, "ts": "2026-08-09T10:28:53Z", "hours": 9.9439, "text": "** Devlog #014** Did a bunch more polishing / doc work and continue worked on improving current map and world 2 map."}, {"post_id": 43232, "ts": "2026-08-08T11:35:27Z", "hours": 9.9789, "text": "Devlog #013 Trails and Monetization are now complete!. I also did a LOT more polishing and also started on the build for World 2!"}, {"post_id": 42510, "ts": "2026-08-07T09:39:12Z", "hours": 9.9669, "text": "Devlog #012 Changes Scripted level and click system Finalised boost system Scripted rebirth Training zones now work Skateboards are purchasable and affect your power per click Scripted 3 leaderboards, playtime, power and wins Pads at every island give wins upon contact and teleport back to spawn The majority of the game is complete, all that’s left is the monetization and the trails. The work detailed within this devlog has been spread out across some of the previous sessions so they were definitely not all done in this time!"}, {"post_id": 41792, "ts": "2026-08-06T06:23:30Z", "hours": 5.1358, "text": "Devlog #011 Got some trails made! There hasn’t been much action in the last few devlogs especially on the scripting side because I’m waiting for the completion of a few more systems before summarizing them all."}, {"post_id": 41204, "ts": "2026-08-05T08:59:44Z", "hours": 5.0711, "text": "Devlog #010 MASSIVE MAP REWORK + EXPANSION!"}, {"post_id": 40680, "ts": "2026-08-04T11:27:47Z", "hours": 5.8708, "text": "Devlog #009 Changes Implemented animations Refined and polished boost ramp system Added skateboard (upgrades coming soon!)"}, {"post_id": 40041, "ts": "2026-08-03T12:05:30Z", "hours": 5.1867, "text": "Devlog #008 Got some skateboard animations made! RIP Robux 🥲"}, {"post_id": 39361, "ts": "2026-08-02T09:10:02Z", "hours": 5.1403, "text": "Devlog #007 Additions Setup backend data saving using ProfileStore Setup communication via Knit Scripted clicking system to obtain “Power” every time you click Started on ramp boosts (still needs significant polishing) Physics isn’t my strong suit so hopefully I can figure this out soon!"}, {"post_id": 38674, "ts": "2026-08-01T05:43:05Z", "hours": 2.7356, "text": "Devlog #006 Changes Improved main map FINALLY! Map is basically done. I can finally move on to the scripting."}, {"post_id": 38599, "ts": "2026-08-01T02:32:35Z", "hours": 1.8689, "text": "Devlog #005 Changes Revamped spawn area Placed new skateboards in their designated location Added AFK zone models (will place later) Finally nearing the completion of the map! Although basic, I think it looks pretty good for my first time. Can’t wait to get started on the scripting side, everything should be a lot more smooth there."}, {"post_id": 38546, "ts": "2026-08-01T00:40:31Z", "hours": 2.7036, "text": "Devlog #004 Changes Revamped Map Received commission for skateboards and UI Hopefully I’m near the completion of the map, apologies if these last few devlogs have been rather slow since its my first time building an entire map. I have a commercial license for the skateboard models and the UI but I unfortunately cannot share them in a github public repo."}, {"post_id": 38160, "ts": "2026-07-31T12:32:05Z", "hours": 1.1008, "text": "Devlog #003 Finished off the spawn area"}, {"post_id": 38137, "ts": "2026-07-31T11:20:20Z", "hours": 1.8019, "text": "Devlog #002 Continued expanding the map and now there’s slopes going higher and higher. This is my first time officially building a full map for the first time, so I decided to do something simple for now."}, {"post_id": 38081, "ts": "2026-07-31T09:23:27Z", "hours": 1.8181, "text": "Devlog #001 This is my first time learning BUILDING in Roblox Studio, so I chose a relatively simple game. I’m mainly a scripter, so this is a new experience for me. The idea for this game is basically like a simulator where the player can get further and further."}]...
|
Title: +1 Jump Skate Escape by @Wontonify | Starda Title: +1 Jump Skate Escape by @Wontonify | Stardance
Devlogs:
Devlog #001 This is my first time learning BUILDING in Roblox Studio, so I chose a relatively simple game. I’m mainly a scripter, so this is a new experience for me. The idea for this game is basically like a simulator where the player can get further and further.
Devlog #002 Continued expanding the map and now there’s slopes going higher and higher. This is my first time officially building a full map for the first time, so I decided to do something simple for now.
Devlog #003 Finished off the spawn area
Devlog #004 Changes Revamped Map Received commission for skateboards and UI Hopefully I’m near the completion of the map, apologies if these last few devlogs have been rather slow since its my first time building an entire map. I have a commercial license for the skateboard models and the UI but I unfortunately cannot share them in a github public repo.
Devlog #005 Changes Revamped spawn area Placed new skateboards in their designated location Added AFK zone models (will place later) Finally nearing the completion of the map! Although basic, I think it looks pretty good for my first time. Can’t wait to get started on the scripting side, everything should be a lot more smooth there.
Devlog #006 Changes Improved main map FINALLY! Map is basically done. I can finally move on to the scripting.
Devlog #007 Additions Setup backend data saving using ProfileStore Setup communication via Knit Scripted clicking system to obtain “Power” every time you click Started on ramp boosts (still needs significant polishing) Physics isn’t my strong suit so hopefully I can figure this out soon!
Devlog #008 Got some skateboard animations made! RIP Robux 🥲
Devlog #009 Changes Implemented animations Refined and polished boost ramp system Added skateboard (upgrades coming soon!)
Devlog #010 MASSIVE MAP REWORK + EXPANSION!
Devlog #011 Got some trails made! There hasn’t been much action in the last few devlogs especially on the scripting side because I’m waiting for the completion of a few more systems before summarizing them all.
Devlog #012 Changes Scripted level and click system Finalised boost system Scripted rebirth Training zones now work Skateboards are purchasable and affect your power per click Scripted 3 leaderboards, playtime, power and wins Pads at every island give wins upon contact and teleport back to spawn The majority of the game is complete, all that’s left is the monetization and the trails. The work detailed within this devlog has been spread out across some of the previous sessions so they were definitely not all done in this time!
Devlog #013 Trails and Monetization are now complete!. I also did a LOT more polishing and also started on the build for World 2!
** Devlog #014** Did a bunch more polishing / doc work and continue worked on improving current map and world 2 map.
Devlog #015 Changes Expanded and Reworked Map Reworked Boost Mechanism (AGAIN!) More Polishing Made the map significant bigger to encompass new and improved boosting mechanism. I cannot tell you how many times I have rewrote the boost mechanism so HOPEFULLY this is the last time 🤞
Devlog #016 Got awesome asset pack 🔥and continuing work on completing the map expansion + revamp!
Devlog #017 Continued working on the map! All walls are up now just working on decoration and other small map improvements!
Devlog #018 MASSIVE MAP IMPROVEMENTS P.S. THERE ARE MORE THAN 1 IMAGE
Devlog #019 Believe it or not but this upgrade machine took me nearly 2 hours 😭
Devlog #020 Finished up the final two sections!
Devlog #021 Changes Added more monetization Added revive system Scripted upgrade machine More polish changes The game is nearing its complete! Hopefully I am able to release soon once I get some thumbnails made.
Devlog #022 New UI + Polish Changes! Honestly these past few devlogs I kinda got no idea what to say, I could go on about the thousands of tiny value changes I did but that’d be boring so here’s the more important things. Changes You can now choose your own speed, as long as it is lower than your max New hazard systems, such as the floor rising and platforms suddenly dropping Bunch of bug fixes and polish changes WE ARE SO SO SO CLOSE TO RELEASE! Thumbnails are being made as I speak!
Devlog #023 THUMBNAILS + RELEASE! Game link: https://www.roblox.com/games/92438199141937/1-Skate-Obby-Escape
Devlog #024 Testing some more thumbnails for maximum click rate. I’m working on a pretty big rework change right now which is why this devlog has so much time attached to it but I wanted to let yall know.
Devlog #025 Massive overhaul. Before there were way too many different values for the user to handle, so I decided to simplify it. Now, every single obtainable item in the game revolves around XP. XP is obtained by moving or being at one of the training grounds. Obtaining XP increase progress towards your LEVEL, which controls things like WalkSpeed, Jumps, Ramp Boost.
Devlog #026 Not really a devlog lol but we just hit all ages!
Devlog #027 Just realised that this entire time I haven’t been uploading to github. Unfortunately there isn’t an easy way to upload files to git directly from the studio but I do now have script sync enabled and will try to commit at least once every devlog. Not really sure about the times when the devlog is mainly about building, as I can’t just directly upload the rbxm file since I use so many bought assets. Eventually during the final ship I will spend the time to create a map with the assets stripped out. Changes Added admin command system Added daily rewards Fixed major bugs regarding shop + boosts Added friend boosts and train area boost when multiple people are training on the same rail Right now I’m working on the map for W2, hopefully I can get this finished fast!
Devlog #028 Added in some more thumbnails and am also in the process of trialing different titles. Somehow this thumbnail is leading by far with 4% CTR.
Devlog #029 There’s been a major bug with the UI on top of the skateboards where sometimes it just wouldn’t show. I think this is something do with the Roblox glyph engine, I’ve had an issue similar to this before but it was with another game and it has significantly more textlabels, and the text was flickering instead of just blatantly not showing. I’ve added adonis with dex which lets me view studio properties inside of Roblox so I can see whether its a studio issue or just my code. Additional Changes Added group reward with brand new skateboard Added badges
Devlog #030 Working on World TWO!
Devlog #031 Finished the first 5 sections of W2! I added these cross sectioned lasers just to mix it up and make world two a little more different than world 1. Also some guy has 41 hours on the game lol
Devlog #032 Finished up the 6th section! This one is definitely one of the more unique ones out of the batch, and I think I’m going to do something similar for the ones after that as well. World 1 had like a biome sort of theme such areas such as “Forest”, “Ice”, “Dune” and “Sakura” so the theme for World 2 would be planets. 🪐 So far I’ve completed Earth, Moon, Mercury, Mars, Venus and Saturn. I’ve also tried to implement details of each planet inside the build itself, so for Saturn (shown in image) I added arches above the top since it has rings and also added a bunch of small floating rocks as “moons”
Devlog #033 Finished up 4 more sections! I just got the “Black Hole” section to do now and the main build for W2 is done!
Devlog #034 Finished up the entirety of the main map! Got the spawn to do (new training areas + skateboard models) and I should be good to start scripting the second world!
Devlog #035 Got the rest of the spawn done including new skateboards and training areas!
Devlog #036 Changes This devlog was supposed to be out yesterday but HackaTime servers were down and so I couldn’t post. Anyways, the entirely of W2 is now complete (aside from balancing) which I still have to do. The issue is that WalkSpeed is locked to +1 per level, but the world two map is the same size so you start slamming into walls. Game Stats We have almost 10k people signed up for the World 2 release date in a few days (WHICH IS CRAZY)! And we also hit 20k home recommendations which is nice and hopefully that number keeps growing.
Devlog #037 Fully finished up the balancing, so that World 2 takes 2x the time to beat as World 1.
Devlog #038 Took a temporary detour to make the race map and also improved upon World 2. Every 5 minutes, the user can choose to participate in a “Race” with other people. The winner of the race will receive wins (I haven’t really decided what to give yet) and its sort of just like a fun little event.
Devlog #039 Added in funnels so that I can see where the users are leaving and why are they are leaving. Hopefully this can help me decide what to add to improve game stats.
Devlog #040 World 2 is now officially out! Stayed up late yesterday to get some bug fixes in straight after publish but we should be good for now.
Devlog #041 Changes More analytics More badges OP daily rewards to increase retention Map improvements Revive and Race UI Re-implementation of revive popup
Devlog #042 Race world is now officially out! Sorry it took so long, these past days I have been really busy with school and haven’t worked on much. I think this will be my last proper devlog of the game, the next will probably just be preparing the project for shipping....
|
1792889421.5578184
|
1793753421.5578184
|
|
13808
|
My very own WebOS by @mohitkrr2557 | Stardance
|
mohitkrr2557
|
2
|
205.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-27T23:55:17Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Cyber OS is a fully client-side, browser-based desktop OS simulation — built from scratch in vanilla HTML, CSS, and JavaScript, with zero frameworks, zero backend, and zero build step. It boots like a real machine: a login screen with custom profiles and emoji avatars, then a working desktop with draggable/resizable windows, a taskbar (search, start menu, system tray, flyouts for network/battery/volume), alt-tab switching, and snap layouts. Underneath that shell is a real virtual file system — files are persistent node objects you can actually create, open, edit, rename, and delete through File Explorer, not just decorative icons — plus a full app suite (Notepad, Calculator, To-Do, AI Chat, three different terminal shells, Paint, Media Player, Snipping Tool) and a Gaming Hub with 8 playable arcade games and persistent high scores. The newest piece, Brave, is a working in-OS browser: type any URL and it renders the live page, with real back/forward history and a clean fallback for sites that block embedding. The hardest part wasn’t any single feature — it was making the OS hold up under real use instead of just looking right in a screenshot. The file system needed an actual state machine: every file had to round-trip correctly through open → edit → save → delete → restore-from-recycle-bin without corrupting other files or colliding on names, all serialized into per-user local storage. Getting the animations to feel native took its own full pass — swapping synchronous style writes on every mouse move for transform updates inside the animation frame loop, and replacing scattered ad hoc transition values with one shared eased curve so windows, menus, and flyouts all move consistently instead of half snapping and half easing. Brave was its own rabbit hole — handling X-Frame-Options and CSP headers that block embedding without the iframe just going silently blank took a lot of trial and error to land on a clean “open in a new tab” fallback instead of a broken-looking pane. I’m proud that this stopped being a mock-up somewhere around the file system rewrite. Most “fake OS” projects let you click icons that don’t actually do anything; Cyber OS persists real state — files, sessions, high scores, notes, to-do items — all of it survives a refresh because it’s genuinely saved, not just rendered. ~205 hours across four devlogs went into getting from a static desktop image to something that behaves like a real, if small, operating system. Try it live, no install needed: https://mohitkrr2557.github.io/CyberOS/ . Sign in with any username — it spins up a fresh local profile — then open File Explorer and actually create, edit, and delete a file; drop into Space Notepad or the To-Do app and refresh to watch your state survive; launch a couple of games from the Gaming Hub; and try Brave with a real URL to see the live in-OS browser. Everything is stored locally to your own browser profile, so nothing you do will affect anyone else testing it.", "repo": "https://github.com/Mohitkrr2557/CyberOS", "demo": "https://mohitkrr2557.github.io/CyberOS/"}, {"ship_num": 2, "ts": "2026-06-27T14:30:14Z", "hours": 205.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Cyber OS — a browser-based desktop operating system simulation, built from scratch in vanilla HTML/CSS/JS with zero frameworks and no backend. Boot in as a Space Cadet, and you get a full desktop: draggable/resizable windows, a taskbar with live search, a start menu, alt-tab switching, and snap layouts — plus a real virtual file system where you can actually create, open, edit, and delete files (not just decorative icons). It comes loaded with built-in apps (Notepad, Calculator, To-Do, AI Chat, Terminal/PowerShell/Ubuntu shells, Paint, Media Player, Snipping Tool) and a Gaming Hub with 8 playable arcade games — Snake, 2048, Minesweeper, Blackjack, Pac-Man, and more — each with persistent high scores. Everything — user sessions, files, game scores — persists locally per profile, so it survives a refresh and feels like an actual OS rather than a mock-up. ~200 hours in so far, most recently spent building out the real file engine and smoothing every window/drag animation so it doesn’t feel laggy under real use. Built with: HTML5, CSS3 (custom theming engine), vanilla JavaScript, html2canvas.", "repo": "https://github.com/Mohitkrr2557/CyberOS", "demo": "https://mohitkrr2557.github.io/CyberOS/"}]...
|
[{"post_id": 17261, "ts": "202 [{"post_id": 17261, "ts": "2026-06-27T23:51:27Z", "hours": 0.2633, "text": "Today’s update closes one of the biggest gaps in Cyber OS’s in-browser experience: Brave is no longer a static prop showing a handful of hardcoded mock pages — type literally any URL into the address bar and it now resolves to a real page rendered live inside the browser window, with a proper loading state in the tab while it fetches and a working back/forward history stack once it’s in. Sites that refuse to be embedded (anything sending X-Frame-Options or a frame-ancestors CSP header) now fail gracefully into a clear “this site won’t load here — open it in a new tab” message instead of the silent blank pane the old build used to choke on. It sounds like a small change on paper, but it’s the difference between Brave being decoration on the desktop and an actual working browser — you can search, click through, and browse the real web without ever leaving the simulated OS."}, {"post_id": 16924, "ts": "2026-06-27T14:16:40Z", "hours": 162.6578, "text": "Cyber OS v2.1 Devlog: After roughly 150 hours since the last milestone, Cyber OS has moved from “looks like a desktop” to “behaves like one.” Where the previous release solved identity, session persistence, and the visual shell, this cycle was almost entirely focused on giving the file layer real teeth and giving the entire interaction surface a pass for latency, jank, and visual inconsistency. The result is a build that no longer just simulates file management and motion — it actually performs both. The single biggest structural addition is a genuine virtual file system sitting underneath File Explorer, replacing what was previously a static icon list with no backing state. Every file is now a real node object — name, type, parent-directory reference, content payload, and a last-modified timestamp — serialized directly into the user’s persistent profile store instead of hardcoded into the DOM. Opening a file resolves its type against an app-association table and routes the payload into the correct handler, so text-type nodes stream straight into Space Notepad’s editable surface with two-way binding: in-app edits write back to the node’s content field on a debounced save cycle rather than firing a disk write on every keystroke. Deletion no longer just yanks a DOM element; it stages the node into a true Recycle Bin queue with restore and permanent-purge paths, and renaming is now an in-place editable operation with collision checks against sibling nodes so a file can’t silently clobber another with the same name. None of this existed before — files were effectively props with no underlying state machine. Now they’re a small but real persistence layer with actual create, open, edit, and delete semantics behind it. On the visual side, the focus was smoothing every interaction that previously felt jarring or laggy under real use. Window open, close, and minimize transitions were rebuilt around a single eased transform-and-opacity curve instead of mismatched linear defaults, so windows scale and fade consistently rather than snapping into place. Drag and resize logic was rewritten to update transforms through the animation frame loop instead of writing styles synchronously on every pointer move, which cut visible stutter substantially on larger windows. Hover, focus, and active states across buttons, taskbar icons, and context menu items now pull from one shared elevation and shadow scale instead of ad hoc values scattered across components built at different times, so the desktop finally reads as one coherent surface instead of a patchwork of UI built in different sessions. Scrollbars, focus rings, and context menu animations were rebuilt to match the neon/glass aesthetic instead of falling back to browser defaults — one of the more obvious “unfinished” tells before, now gone. Underneath the visible layer, a meaningful share of those 150 hours went into cleanup nobody sees directly but that the whole experience depends on: debouncing the autosave scrapers so they stop thrashing local storage on every keystroke, validating file payloads before they ever reach the profile serializer so a malformed or oversized entry can’t corrupt a session, and trimming redundant reflows that were firing every time a window gained focus or a flyout opened. None of it shows up in a screenshot, but it’s the difference between an OS that feels responsive under sustained use and one that only feels responsive in a thirty-second demo. Taken together, the file engine and the motion pass were the two threads tying this update together — files now persist and behave like real file management instead of a mock-up, and the chrome around them finally moves the way a native desktop would. Next up: drag-and-drop file moves between folders, and carrying this same eased-transform approach into the snap-layout and alt-tab overlays, which still run on the older, snappier logic and now visibly lag behind everything else."}, {"post_id": 6576, "ts": "2026-06-11T01:33:05Z", "hours": 30.7583, "text": "I have officially completed a massive architectural refactor of Cyber OS v2.0, transforming a simple frontend mock-up into a highly interactive, stateful, and secure multi-user desktop simulation environment. This milestone release successfully bridges a secure boot kernel, an encrypted local file engine, and a fully reactive visual compositing layer. The core JS script now treats user sessions as persistent sandbox environments by running a secure boot cycle tied to browser local storage and custom profile serialization. To make the OS feel truly functional, I engineered automated data scrapers that continuously track and save a user’s local application modifications, including text inside the Space Notepad, active items within the Todo list, and chat logs inside the AI interface. These sessions are mapped directly to the authorized user’s profile and fully restored upon login, while strict kernel state flags manage layout depth and window minimizing queues. Visually, the entire desktop environment has been upgraded to a hardware-accelerated layout pipeline powered by a modular CSS variable architecture. This decoupled theme system allows the entire UI to instantly toggle between a neon terminal space and a sleek light mode theme through a single class injection. The styling rules supply high-fidelity interactive state vectors for active running applications, introducing translucent container overlays, distinct border changes, and neon glow vectors for active or minimized windows. Finally, the HTML scaffolding has been expanded to support modern desktop components, introducing a custom profile customizer on the boot screen and an advanced taskbar system. This taskbar hosts an active search utility, application launcher shortcuts, a terminal clock, and a hardware simulation tray complete with placeholder nodes for network, battery, and notification toggles. The system markup is fully optimized with hidden containment hooks, perfectly primed to anchor background canvas animation loops and edge-drag window snapping logic next. I am going to continue advancing this OS to reach a windows desktop experties!"}, {"post_id": 5780, "ts": "2026-06-09T18:10:25Z", "hours": 12.0811, "text": "Project Update: Cyber OS I’m stoked to share the progress on my custom WebOS! I’ve built a futuristic, space-themed desktop environment from scratch using pure HTML, CSS, and JavaScript, designed to feel like a high-performance digital cockpit running in the heart of a nebula. I’ve engineered a custom window manager that handles dragging, closing, and dynamic z-index layering. This is paired with a built-in utility suite featuring a Space Notepad for captain’s logs, a dynamic Star-Date Calendar, and a functional Todo list for managing station operations. Looking ahead, I’m preparing to launch a Wallpaper Engine for custom cosmic backgrounds and an AI Navigator Chatbot with a terminal-style interface. Can’t wait to see this OS fully powered up!"}]...
|
Title: My very own WebOS by @mohitkrr2557 | Starda Title: My very own WebOS by @mohitkrr2557 | Stardance
Devlogs:
Project Update: Cyber OS I’m stoked to share the progress on my custom WebOS! I’ve built a futuristic, space-themed desktop environment from scratch using pure HTML, CSS, and JavaScript, designed to feel like a high-performance digital cockpit running in the heart of a nebula. I’ve engineered a custom window manager that handles dragging, closing, and dynamic z-index layering. This is paired with a built-in utility suite featuring a Space Notepad for captain’s logs, a dynamic Star-Date Calendar, and a functional Todo list for managing station operations. Looking ahead, I’m preparing to launch a Wallpaper Engine for custom cosmic backgrounds and an AI Navigator Chatbot with a terminal-style interface. Can’t wait to see this OS fully powered up!
I have officially completed a massive architectural refactor of Cyber OS v2.0, transforming a simple frontend mock-up into a highly interactive, stateful, and secure multi-user desktop simulation environment. This milestone release successfully bridges a secure boot kernel, an encrypted local file engine, and a fully reactive visual compositing layer. The core JS script now treats user sessions as persistent sandbox environments by running a secure boot cycle tied to browser local storage and custom profile serialization. To make the OS feel truly functional, I engineered automated data scrapers that continuously track and save a user’s local application modifications, including text inside the Space Notepad, active items within the Todo list, and chat logs inside the AI interface. These sessions are mapped directly to the authorized user’s profile and fully restored upon login, while strict kernel state flags manage layout depth and window minimizing queues. Visually, the entire desktop environment has been upgraded to a hardware-accelerated layout pipeline powered by a modular CSS variable architecture. This decoupled theme system allows the entire UI to instantly toggle between a neon terminal space and a sleek light mode theme through a single class injection. The styling rules supply high-fidelity interactive state vectors for active running applications, introducing translucent container overlays, distinct border changes, and neon glow vectors for active or minimized windows. Finally, the HTML scaffolding has been expanded to support modern desktop components, introducing a custom profile customizer on the boot screen and an advanced taskbar system. This taskbar hosts an active search utility, application launcher shortcuts, a terminal clock, and a hardware simulation tray complete with placeholder nodes for network, battery, and notification toggles. The system markup is fully optimized with hidden containment hooks, perfectly primed to anchor background canvas animation loops and edge-drag window snapping logic next. I am going to continue advancing this OS to reach a windows desktop experties!
Cyber OS v2.1 Devlog: After roughly 150 hours since the last milestone, Cyber OS has moved from “looks like a desktop” to “behaves like one.” Where the previous release solved identity, session persistence, and the visual shell, this cycle was almost entirely focused on giving the file layer real teeth and giving the entire interaction surface a pass for latency, jank, and visual inconsistency. The result is a build that no longer just simulates file management and motion — it actually performs both. The single biggest structural addition is a genuine virtual file system sitting underneath File Explorer, replacing what was previously a static icon list with no backing state. Every file is now a real node object — name, type, parent-directory reference, content payload, and a last-modified timestamp — serialized directly into the user’s persistent profile store instead of hardcoded into the DOM. Opening a file resolves its type against an app-association table and routes the payload into the correct handler, so text-type nodes stream straight into Space Notepad’s editable surface with two-way binding: in-app edits write back to the node’s content field on a debounced save cycle rather than firing a disk write on every keystroke. Deletion no longer just yanks a DOM element; it stages the node into a true Recycle Bin queue with restore and permanent-purge paths, and renaming is now an in-place editable operation with collision checks against sibling nodes so a file can’t silently clobber another with the same name. None of this existed before — files were effectively props with no underlying state machine. Now they’re a small but real persistence layer with actual create, open, edit, and delete semantics behind it. On the visual side, the focus was smoothing every interaction that previously felt jarring or laggy under real use. Window open, close, and minimize transitions were rebuilt around a single eased transform-and-opacity curve instead of mismatched linear defaults, so windows scale and fade consistently rather than snapping into place. Drag and resize logic was rewritten to update transforms through the animation frame loop instead of writing styles synchronously on every pointer move, which cut visible stutter substantially on larger windows. Hover, focus, and active states across buttons, taskbar icons, and context menu items now pull from one shared elevation and shadow scale instead of ad hoc values scattered across components built at different times, so the desktop finally reads as one coherent surface instead of a patchwork of UI built in different sessions. Scrollbars, focus rings, and context menu animations were rebuilt to match the neon/glass aesthetic instead of falling back to browser defaults — one of the more obvious “unfinished” tells before, now gone. Underneath the visible layer, a meaningful share of those 150 hours went into cleanup nobody sees directly but that the whole experience depends on: debouncing the autosave scrapers so they stop thrashing local storage on every keystroke, validating file payloads before they ever reach the profile serializer so a malformed or oversized entry can’t corrupt a session, and trimming redundant reflows that were firing every time a window gained focus or a flyout opened. None of it shows up in a screenshot, but it’s the difference between an OS that feels responsive under sustained use and one that only feels responsive in a thirty-second demo. Taken together, the file engine and the motion pass were the two threads tying this update together — files now persist and behave like real file management instead of a mock-up, and the chrome around them finally moves the way a native desktop would. Next up: drag-and-drop file moves between folders, and carrying this same eased-transform approach into the snap-layout and alt-tab overlays, which still run on the older, snappier logic and now visibly lag behind everything else.
Today’s update closes one of the biggest gaps in Cyber OS’s in-browser experience: Brave is no longer a static prop showing a handful of hardcoded mock pages — type literally any URL into the address bar and it now resolves to a real page rendered live inside the browser window, with a proper loading state in the tab while it fetches and a working back/forward history stack once it’s in. Sites that refuse to be embedded (anything sending X-Frame-Options or a frame-ancestors CSP header) now fail gracefully into a clear “this site won’t load here — open it in a new tab” message instead of the silent blank pane the old build used to choke on. It sounds like a small change on paper, but it’s the difference between Brave being decoration on the desktop and an actual working browser — you can search, click through, and browse the real web without ever leaving the simulated OS.
Ships:
Cyber OS — a browser-based desktop operating system simulation, built from scratch in vanilla HTML/CSS/JS with zero frameworks and no backend. Boot in as a Space Cadet, and you get a full desktop: draggable/resizable windows, a taskbar with live search, a start menu, alt-tab switching, and snap layouts — plus a real virtual file system where you can actually create, open, edit, and delete files (not just decorative icons). It comes loaded with built-in apps (Notepad, Calculator, To-Do, AI Chat, Terminal/PowerShell/Ubuntu shells, Paint, Media Player, Snipping Tool) and a Gaming Hub with 8 playable arcade games — Snake, 2048, Minesweeper, Blackjack, Pac-Man, and more — each with persistent high scores. Everything — user sessions, files, game scores — persists locally per profile, so it survives a refresh and feels like an actual OS rather than a mock-up. ~200 hours in so far, most recently spent building out the real file engine and smoothing every window/drag animation so it doesn’t feel laggy under real use. Built with: HTML5, CSS3 (custom theming engine), vanilla JavaScript, html2canvas.
Cyber OS is a fully client-side, browser-based desktop OS simulation — built from scratch in vanilla HTML, CSS, and JavaScript, with zero frameworks, zero backend, and zero build step. It boots like a real machine: a login screen with custom profiles and emoji avatars, then a working desktop with draggable/resizable windows, a taskbar (search, start menu, system tray, flyouts for network/battery/volume), alt-tab switching, and snap layouts. Underneath that shell is a real virtual file system — files are persistent node objects you can actually create, open, edit, rename, and delete through File Explorer, not just decorative icons — plus a full app suite (Notepad, Calculator, To-Do, AI Chat, three different terminal shells, Paint, Media Player, Snipping Tool) and a Gaming Hub with 8 playable arcade games and persistent high scores. The newest piece, Brave, is a working in-OS browser: type any URL and it renders the live page, with real back/forward history and a clean fallback for sites that block embedding. The hardest part wasn’t any single feature — it was making the OS hold up under real use instead of just looking right in a screenshot. The file system needed an actual state machine: every file had to round-trip correctly through open → edit → save → delete → restore-from-recycle-bin without corrupting other files or colliding on names, all serialized into per-user local storage. Getting the animations to feel native took its own full pass — swapping synchronous style writes on every mouse move for transform updates inside the animation frame loop, and replacing scattered ad hoc transition values with one shared eased curve so windows, menus, and flyouts all move consistently instead of half snapping and half easing. Brave was its own rabbit hole — handling X-Frame-Options and CSP headers that block embedding without the iframe just going silently blank took a lot of trial and error to land on a clean “open in a new tab” fallback instead of a broken-looking pane. I’m proud that this stopped being a mock-up somewhere around the file system rewrite. Most “fake OS” projects let you click icons that don’t actually do anything; Cyber OS persists real state — files, sessions, high scores, notes, to-do items — all of it survives a refresh because it’s genuinely saved, not just rendered. ~205 hours across four devlogs went into getting from a static desktop image to something that behaves like a real, if small, operating system. Try it live, no install needed: https://mohitkrr2557.github.io/CyberOS/ . Sign in with any username — it spins up a fresh local profile — then open File Explorer and actually create, edit, and delete a file; drop into Space Notepad or the To-Do app and refresh to watch your state survive; launch a couple of games from the Gaming Hub; and try Brave with a real URL to see the live in-OS browser. Everything is stored locally to your own browser profile, so nothing you do will affect anyone else testing it....
|
1792820875.3729985
|
1792907275.3729985
|
|
9492
|
GLM5.3 on AMD CDNA4 by @EOBD | Stardance
|
EOBD
|
0
|
207.36
|
0
|
[]
|
[{"post_id": 57250, "ts": "202 [{"post_id": 57250, "ts": "2026-08-29T11:12:01Z", "hours": 30.3531, "text": "ohhhhh MY ooh My I got CDNA4 And GLM5.3 it’s a party NOW!! I’ma first find the best way to quantize the experts than we go swimming in Aiter to find A8W4 for the experts and A8WA for the rest we then benchmark plain torch – probably 20% work for 80% performance we then squeeze the residuals into a fused kernel + proper grouped gemm for the MLA + fp4 indexer keys and then, finally, see if it all comes under one launch, and does a pretty spin to become a 100% resident, HBM synced pipeline system. it’s no longer a kernel, but an async token horse I did fail my tests but worth it I tell ya!"}, {"post_id": 43316, "ts": "2026-08-08T14:47:22Z", "hours": 18.5081, "text": "Huge Pain with tile schedule for the MLP. huge. still haven’t fully figured it out, but getting there"}, {"post_id": 37908, "ts": "2026-07-30T22:06:51Z", "hours": 9.4236, "text": "Don’t leave XNACK on 🤦🏽 It’s been like a whole day trying to understand why I have these idles (not a stall) Hate myself so much. And mannnn – AMD – why nooooo documentation whatsoever as to how yor MMU works ?? 😭 not sure if I’d feel better, learning that they are willing to share this – but you’d just need to sign off your grandma as collateral on an NDA Or maybe show somewhere that there was a fault 😭😭😭 (could also be me not knowing where to look…) ….but…. while breaking my head, I also improved rocprof compute viewer 🎉 and it’s going GPL until AMD gives me access to CDNA4 and 5 hardware😇 Because they are so so nice and willing to support a budding kernel developer ♥️ or I’ll stop being lazy and write a PR which ever comes first I guess"}, {"post_id": 36315, "ts": "2026-07-28T11:05:53Z", "hours": 16.4278, "text": "Going to do the MoE next (HipKittens sync first) And so before I commit to a very complex design that would piggyback low-token-experts on ones that can fill the 16 rows for the matrix cores – though I should what the distrebution actually looks like… ): complex design will be needed ): Expected but still a bummer. My sample space is tiny because GPUs are expensive as hell. But I imagine it’s a good proxy because the curve looks right. maybe a bit more concentrated across a large chat focused on coding."}, {"post_id": 33588, "ts": "2026-07-23T17:11:44Z", "hours": 5.1664, "text": "Well. That’s been a huge pain. But I’s got a native unix shell Should be amazing to not rely on this slugish p9 windows is like sweet poison so nice but so sloowwwww bitlocker is scary guys ubuntu is the best – linux without the added pain of knowing how linux works (:"}, {"post_id": 31945, "ts": "2026-07-20T19:17:20Z", "hours": 9.6733, "text": "last 6 spills super nasty. LLVM be complex should also hoist the loads before the stores (ugly stalls are swaits). but look at that pretty no-sigpgmend-barrier work"}, {"post_id": 30824, "ts": "2026-07-18T19:18:20Z", "hours": 12.7942, "text": "I don’t hate LLVM anymore!! So easy to just hook up to its headers and do what the hell I want with it (mostly in terms of what opt passes to run on the device code because I’m scared of that fat binary linking 😭) LICM is being stupid? Kick that sucker off the top the stairs!! possibly could have also done this with opt but C++ is way cooler and going to pay off once I really dig deep into this. Ima get my 0 spills even if it’s going to cost me all my finals. probably already did 🥲 phhh that poor-people normal kernel… Hardware scheduled… Meh. No match for my persistent kernel! not actually sure why I beat it, shouldn’t have. Stores are not acked on at the end of the kernel. But we first smile, then run them back to back and earn that smile! Look at me utilizing smile debt like finance bro. Maybe its my very cool scheduling algo. but I doubt it."}, {"post_id": 29330, "ts": "2026-07-16T06:19:01Z", "hours": 10.5694, "text": "I know how I’ll do it! We will unfraternally have to have kernel boundaries but really just because the L1i cache is too small (and GPU architecture is too dumb) But it’s fine for now. Going to have the following kernels: 1:1 Residual + Norm 8:1 Residual + Norm (for the MoE summing) 1:1 Residual + Norm + MPT norm MoE Full DSA Fused attention (with or without indexer) Head + Sampling +Embedding retrieval + normed MTP embedding EH_Proj + MLP And then! For the HBM sync we need between so many things (mostly the attention kernel) I’m going to extend HipKittens with a flagging mechanism that latches onto the stores, and add many more load methods that depend on it (like a stream of available blocks. the coolest thing is that I can have the flagging work at a certain granularity, and the load can infer if it’s OK based on a different one! Don’t do kernels kids."}, {"post_id": 27336, "ts": "2026-07-12T20:26:58Z", "hours": 94.4428, "text": "(90h) I don’t like LLVM! fun! Have you ever written manual ASM loops because it hoists like there’s no tomorrow? and can’t handle a back edge?? And since it’s impossible to get CDNA4 hardware, will be moving forward with MI300s. All my ❤️ to RunPod and HotAisle (and AMD dev cloud) Still a bit annoying because I much rather pay 5x and get access to CDNA4 then free credits. But also nice ! THANKS ! And to whoever is hogging all the capacity from from cloudrift – pig (: EDIT: llvm is very nice I love anyone who has ever worked on LLVM it was the AMD backend hoisting my licm figured it out though And ASM loops are a really bad idea"}]...
|
Title: GLM5.3 on AMD CDNA4 by @EOBD | Stardance
D Title: GLM5.3 on AMD CDNA4 by @EOBD | Stardance
Devlogs:
(90h) I don’t like LLVM! fun! Have you ever written manual ASM loops because it hoists like there’s no tomorrow? and can’t handle a back edge?? And since it’s impossible to get CDNA4 hardware, will be moving forward with MI300s. All my ❤️ to RunPod and HotAisle (and AMD dev cloud) Still a bit annoying because I much rather pay 5x and get access to CDNA4 then free credits. But also nice ! THANKS ! And to whoever is hogging all the capacity from from cloudrift – pig (: EDIT: llvm is very nice I love anyone who has ever worked on LLVM it was the AMD backend hoisting my licm figured it out though And ASM loops are a really bad idea
I know how I’ll do it! We will unfraternally have to have kernel boundaries but really just because the L1i cache is too small (and GPU architecture is too dumb) But it’s fine for now. Going to have the following kernels: 1:1 Residual + Norm 8:1 Residual + Norm (for the MoE summing) 1:1 Residual + Norm + MPT norm MoE Full DSA Fused attention (with or without indexer) Head + Sampling +Embedding retrieval + normed MTP embedding EH_Proj + MLP And then! For the HBM sync we need between so many things (mostly the attention kernel) I’m going to extend HipKittens with a flagging mechanism that latches onto the stores, and add many more load methods that depend on it (like a stream of available blocks. the coolest thing is that I can have the flagging work at a certain granularity, and the load can infer if it’s OK based on a different one! Don’t do kernels kids.
I don’t hate LLVM anymore!! So easy to just hook up to its headers and do what the hell I want with it (mostly in terms of what opt passes to run on the device code because I’m scared of that fat binary linking 😭) LICM is being stupid? Kick that sucker off the top the stairs!! possibly could have also done this with opt but C++ is way cooler and going to pay off once I really dig deep into this. Ima get my 0 spills even if it’s going to cost me all my finals. probably already did 🥲 phhh that poor-people normal kernel… Hardware scheduled… Meh. No match for my persistent kernel! not actually sure why I beat it, shouldn’t have. Stores are not acked on at the end of the kernel. But we first smile, then run them back to back and earn that smile! Look at me utilizing smile debt like finance bro. Maybe its my very cool scheduling algo. but I doubt it.
last 6 spills super nasty. LLVM be complex should also hoist the loads before the stores (ugly stalls are swaits). but look at that pretty no-sigpgmend-barrier work
Well. That’s been a huge pain. But I’s got a native unix shell Should be amazing to not rely on this slugish p9 windows is like sweet poison so nice but so sloowwwww bitlocker is scary guys ubuntu is the best – linux without the added pain of knowing how linux works (:
Going to do the MoE next (HipKittens sync first) And so before I commit to a very complex design that would piggyback low-token-experts on ones that can fill the 16 rows for the matrix cores – though I should what the distrebution actually looks like… ): complex design will be needed ): Expected but still a bummer. My sample space is tiny because GPUs are expensive as hell. But I imagine it’s a good proxy because the curve looks right. maybe a bit more concentrated across a large chat focused on coding.
Don’t leave XNACK on 🤦🏽 It’s been like a whole day trying to understand why I have these idles (not a stall) Hate myself so much. And mannnn – AMD – why nooooo documentation whatsoever as to how yor MMU works ?? 😭 not sure if I’d feel better, learning that they are willing to share this – but you’d just need to sign off your grandma as collateral on an NDA Or maybe show somewhere that there was a fault 😭😭😭 (could also be me not knowing where to look…) ….but…. while breaking my head, I also improved rocprof compute viewer 🎉 and it’s going GPL until AMD gives me access to CDNA4 and 5 hardware😇 Because they are so so nice and willing to support a budding kernel developer ♥️ or I’ll stop being lazy and write a PR which ever comes first I guess
Huge Pain with tile schedule for the MLP. huge. still haven’t fully figured it out, but getting there
ohhhhh MY ooh My I got CDNA4 And GLM5.3 it’s a party NOW!! I’ma first find the best way to quantize the experts than we go swimming in Aiter to find A8W4 for the experts and A8WA for the rest we then benchmark plain torch – probably 20% work for 80% performance we then squeeze the residuals into a fused kernel + proper grouped gemm for the MLA + fp4 indexer keys and then, finally, see if it all comes under one launch, and does a pretty spin to become a 100% resident, HBM synced pipeline system. it’s no longer a kernel, but an async token horse I did fail my tests but worth it I tell ya!...
|
1792792331.883065
|
1793397131.883065
|
|
50158
|
Kazi by @Bianca | Stardance
|
Bianca
|
1
|
212.74
|
407
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-20T21:14:41Z", "hours": 30.0, "multiplier": 13.9, "payout": 407, "blessing": "neutral", "text": "What I made: Kazi connects skilled trade workers with customers who need their services, making the process faster and easier. Workers are electricians, plumbers, builders, welders, mechanics, and other professionals who create profiles, showcase their skills, and find relevant jobs. Customers can use Kazi to discover skilled workers, view their profiles, and find the right person for the work they need. The challenges I faced: The challenges I faced were setting up the Google API to allow for Google sign-up and making sure the frontend and backend were communicating. Additionally, making a polished, well-thought-out app with minimal bugs was another challenge. Things I accomplished that I am proud of: Before starting this challenge, using the terminal felt like a foreign language and I didn’t know why the backend and frontend had to be separate. Now I can confidently say that the terminal is my best friend, and I don’t need to watch YouTube tutorials on the difference between an API and an SDK. Things to know: On the demo the google sign in does not work only on emulators it does. Taking photos and contact via phone is not supported on the demo as well. Using th README file has a lot of additional tips. If you create an account even if you close the file will be saved in the database and you can log in, if you have trouble deleting the account you made email me the email you used and ill do it manually.", "repo": "https://github.com/PhantomJelly/Kazi-Cursor.git", "demo": "https://phantomjelly.github.io/Kazi-Cursor/"}]...
|
[{"post_id": 65589, "ts": "202 [{"post_id": 65589, "ts": "2026-09-10T20:37:40Z", "hours": 9.9253, "text": "Dev vlog 21 - I didnt like the first iteration of the subsriptions screen so I made it more personalised to the specific industry im targeting. I changed words like “Pro plan” to “Artisan plan” and “Free plan” to “Apprentice plan”. The reason there is some what space is because I’ll be adding some assets what I’m still designing in procreate and Lottie."}, {"post_id": 65015, "ts": "2026-09-09T20:11:12Z", "hours": 10.4989, "text": "Dev vlog 20 - Today I made the workers job screen more interactable and customizable. I’m going through day by day to improve each screen’s UI. I’m honestly quite happy with how the app is coming up even though I’ve only done 2 screens im slowly getting to a completed version 1."}, {"post_id": 64677, "ts": "2026-09-09T08:33:15Z", "hours": 10.4519, "text": "Dev vlog 19 - I added a pay wall on the worker account that limits theamount of jobs a worker can recieve and and the features they have. It costs $3.00 (I converted it) which is a small amount for the workers, I dont want it to be too high as in Namibia subscriptions is not something people are willing to pay. Especially low wage workers and unemployed people"}, {"post_id": 64413, "ts": "2026-09-08T19:39:24Z", "hours": 6.9683, "text": "Dev vlog 18 - I’ve been making some assets to use for the UI and testing the app to find more areas I’d like to add more features and animations."}, {"post_id": 63751, "ts": "2026-09-07T18:24:22Z", "hours": 9.5639, "text": "Dev vlog 17 - Hi I made good progress with the UI, I started with the splash screen and I’m working my way from there, the animation was a bit glitchy and i fexed the issue. Additionally, the letters were not lined up which was quite a task to do, i though it would be easier but when importing the animation it would keep changing it so I had to make tha letters separate to the animation. I used Mobbin to get references and I saw most we’re too flashy so i made mine simple but enjoyable. Next I’ll be working on the user onboardeing, im currently preparing a lot of assets as I want it to be interactive and unique."}, {"post_id": 62718, "ts": "2026-09-06T06:43:31Z", "hours": 9.8536, "text": "Dev vlog 16 - After adding the Didit verification the SQL database was not syncing, a had to make 2 separate databses to make it work, now im able to make an account again."}, {"post_id": 62449, "ts": "2026-09-05T19:59:59Z", "hours": 9.1511, "text": "Dev post 15 - Hey everyone, I spent the day improving the web experience for testers and you guys :). Im still having troubles with the google sign in but ill try and address it tomorrow. My favourite thing i did was limiting the web screen so that it gives more of that app feel."}, {"post_id": 61380, "ts": "2026-09-04T08:21:31Z", "hours": 10.3572, "text": "Dev post 14 - Hi everyone I spent the whole day polishing up Kazi, fixing bugs, and just improving the overall experience. Now im going to add more features I’m planning on adding a paywall to start making some income from this, and im now brainstorming the features I should add."}, {"post_id": 60515, "ts": "2026-09-02T22:09:05Z", "hours": 10.7911, "text": "Dev vlog 13 - I caught a bug which was actually quite critical. When the user would delete their account, their information would not get deleted, so if they made an account with same old email all the past information would still be there."}, {"post_id": 59122, "ts": "2026-08-31T19:07:19Z", "hours": 9.1975, "text": "Dev post 12 - I added back the google sign in and polished up the rest of the verification setup."}, {"post_id": 58193, "ts": "2026-08-30T15:27:10Z", "hours": 9.7597, "text": "Dev vlog 11 - I’m building the a better workflow in Figma and iy was been taking quite a long time to implement and I want to change some of the things I’ve build. I also want to make the UI animations in Figma instead of Lottie because I know how to use Figma more and you can add an extension to export your work as .lottie files (a type of file that allows your animation to run on your app without taking much storage)."}, {"post_id": 57327, "ts": "2026-08-29T13:23:34Z", "hours": 9.3769, "text": "Dev vlog 10 - Hi there I’ve been finalising the setup of the workers ID verification. I ran into some problems but I found this site that allows ID verification (can use passports, drivers licenses) for free for your first 500 verification every month, essentially meaning that if you stay below 500 verifications per month its completely free. Its called Didit. After setting up I’ll go on tosetting up analytics to track onboarding and activity of users."}, {"post_id": 56479, "ts": "2026-08-28T08:06:11Z", "hours": 12.835, "text": "Dev vlog 9 - Hi and thank you to everyone who voted for my project and all the tips you’ve given me. I have a few challenges I’m tackling at the moment: 1. Google sign it, it works with then mobile version (if I test with an APK) but not on web like in the demo. 2. The ID verification, it needs to be able to authenticate yours profiles which seems so complex. 3. The UI and making animations, I dont have much time as I have my A-level exams soon."}, {"post_id": 55756, "ts": "2026-08-27T18:56:17Z", "hours": 10.3631, "text": "Dev vlog 8 - I made some changes to the assistant section so that the questions asked by agent is more conscience and more interactive. Where the user can just tap on the screen and not type."}, {"post_id": 54739, "ts": "2026-08-25T20:25:24Z", "hours": 10.1636, "text": "Dev vlog 7 - After I made a basic AI chat assist, I made some minor UI improvements. I mainly focused on the inquiry generation, I’m not 100% there but I’m trying to make it as quick and easy as possible for users to easily send a detailed inquiries with minimal effort."}, {"post_id": 54310, "ts": "2026-08-25T08:13:39Z", "hours": 11.7128, "text": "Dev vlog 6 - Hi there, I’ve made a drastic change as I’ve descided to add an AI chat bot to the app to make it even more easier to send workers inquiries. It will be a place where you just describe the issue and it will automatically find the best worker and send them an inquiry for you after you give it all the necessary information."}, {"post_id": 53196, "ts": "2026-08-23T17:12:34Z", "hours": 10.9467, "text": "Dev vlog 6 - I finished with the official Beta version of Kazi and will be launching soon to the play store. After launching and getting my first wavy of users I’ll launch the official version 1."}, {"post_id": 52272, "ts": "2026-08-22T11:49:28Z", "hours": 2.8028, "text": "Dev vlog 5 - I set up notifications that pop up when a user opens the app, next I want to make it more interactive and add custom icons. Also for when allowing for photos I’ll add some humor when asking for permission and more custom icons. I’ll be making the icon on procreate then use Lottie to turn it into files that can be used on the app."}, {"post_id": 51479, "ts": "2026-08-21T06:40:27Z", "hours": 8.0186, "text": "Dev vlog 4 - Im now focusing on making the UI more unique and interactive. For planning im using Figma and for animations im using Lottie. I added some coloured elements so that its easier to see the difference between features more easily, like if your inquiry is pending or has been answered."}, {"post_id": 50803, "ts": "2026-08-20T06:37:08Z", "hours": 9.8239, "text": "Dev vlog 3 - I started using emulator, it took a while to install and setup. I made worker accounts have bonuses feature to get more clients, but now I want to improve the UI and add custom badges and animations, I started learning how to use Lottie to do that."}, {"post_id": 50478, "ts": "2026-08-19T17:19:01Z", "hours": 10.575, "text": "Dev vlog 2 - I made the customer side of the app but I used dummy data and didn’t connect any APIs yet so I need to do that. I also need to fix bugs and allow customers to contact the workers."}, {"post_id": 49519, "ts": "2026-08-18T12:07:28Z", "hours": 9.4683, "text": "Dev vlog 1 - I’m building a mobile app to help trade workers like plumbers, electricians, and cleaners find work. In the same light to help people find someone who can fix their leaky tap or install a cupboard. This is the workers side that I’ve built, I used my brothers phone to help me make a demo account and test out the features. The key features are different languages, photo verification, and google sign up."}]...
|
Title: Kazi by @Bianca | Stardance
Devlogs:
Dev v Title: Kazi by @Bianca | Stardance
Devlogs:
Dev vlog 1 - I’m building a mobile app to help trade workers like plumbers, electricians, and cleaners find work. In the same light to help people find someone who can fix their leaky tap or install a cupboard. This is the workers side that I’ve built, I used my brothers phone to help me make a demo account and test out the features. The key features are different languages, photo verification, and google sign up.
Dev vlog 2 - I made the customer side of the app but I used dummy data and didn’t connect any APIs yet so I need to do that. I also need to fix bugs and allow customers to contact the workers.
Dev vlog 3 - I started using emulator, it took a while to install and setup. I made worker accounts have bonuses feature to get more clients, but now I want to improve the UI and add custom badges and animations, I started learning how to use Lottie to do that.
Dev vlog 4 - Im now focusing on making the UI more unique and interactive. For planning im using Figma and for animations im using Lottie. I added some coloured elements so that its easier to see the difference between features more easily, like if your inquiry is pending or has been answered.
Dev vlog 5 - I set up notifications that pop up when a user opens the app, next I want to make it more interactive and add custom icons. Also for when allowing for photos I’ll add some humor when asking for permission and more custom icons. I’ll be making the icon on procreate then use Lottie to turn it into files that can be used on the app.
Dev vlog 6 - I finished with the official Beta version of Kazi and will be launching soon to the play store. After launching and getting my first wavy of users I’ll launch the official version 1.
Dev vlog 6 - Hi there, I’ve made a drastic change as I’ve descided to add an AI chat bot to the app to make it even more easier to send workers inquiries. It will be a place where you just describe the issue and it will automatically find the best worker and send them an inquiry for you after you give it all the necessary information.
Dev vlog 7 - After I made a basic AI chat assist, I made some minor UI improvements. I mainly focused on the inquiry generation, I’m not 100% there but I’m trying to make it as quick and easy as possible for users to easily send a detailed inquiries with minimal effort.
Dev vlog 8 - I made some changes to the assistant section so that the questions asked by agent is more conscience and more interactive. Where the user can just tap on the screen and not type.
Dev vlog 9 - Hi and thank you to everyone who voted for my project and all the tips you’ve given me. I have a few challenges I’m tackling at the moment: 1. Google sign it, it works with then mobile version (if I test with an APK) but not on web like in the demo. 2. The ID verification, it needs to be able to authenticate yours profiles which seems so complex. 3. The UI and making animations, I dont have much time as I have my A-level exams soon.
Dev vlog 10 - Hi there I’ve been finalising the setup of the workers ID verification. I ran into some problems but I found this site that allows ID verification (can use passports, drivers licenses) for free for your first 500 verification every month, essentially meaning that if you stay below 500 verifications per month its completely free. Its called Didit. After setting up I’ll go on tosetting up analytics to track onboarding and activity of users.
Dev vlog 11 - I’m building the a better workflow in Figma and iy was been taking quite a long time to implement and I want to change some of the things I’ve build. I also want to make the UI animations in Figma instead of Lottie because I know how to use Figma more and you can add an extension to export your work as .lottie files (a type of file that allows your animation to run on your app without taking much storage).
Dev post 12 - I added back the google sign in and polished up the rest of the verification setup.
Dev vlog 13 - I caught a bug which was actually quite critical. When the user would delete their account, their information would not get deleted, so if they made an account with same old email all the past information would still be there.
Dev post 14 - Hi everyone I spent the whole day polishing up Kazi, fixing bugs, and just improving the overall experience. Now im going to add more features I’m planning on adding a paywall to start making some income from this, and im now brainstorming the features I should add.
Dev post 15 - Hey everyone, I spent the day improving the web experience for testers and you guys :). Im still having troubles with the google sign in but ill try and address it tomorrow. My favourite thing i did was limiting the web screen so that it gives more of that app feel.
Dev vlog 16 - After adding the Didit verification the SQL database was not syncing, a had to make 2 separate databses to make it work, now im able to make an account again.
Dev vlog 17 - Hi I made good progress with the UI, I started with the splash screen and I’m working my way from there, the animation was a bit glitchy and i fexed the issue. Additionally, the letters were not lined up which was quite a task to do, i though it would be easier but when importing the animation it would keep changing it so I had to make tha letters separate to the animation. I used Mobbin to get references and I saw most we’re too flashy so i made mine simple but enjoyable. Next I’ll be working on the user onboardeing, im currently preparing a lot of assets as I want it to be interactive and unique.
Dev vlog 18 - I’ve been making some assets to use for the UI and testing the app to find more areas I’d like to add more features and animations.
Dev vlog 19 - I added a pay wall on the worker account that limits theamount of jobs a worker can recieve and and the features they have. It costs $3.00 (I converted it) which is a small amount for the workers, I dont want it to be too high as in Namibia subscriptions is not something people are willing to pay. Especially low wage workers and unemployed people
Dev vlog 20 - Today I made the workers job screen more interactable and customizable. I’m going through day by day to improve each screen’s UI. I’m honestly quite happy with how the app is coming up even though I’ve only done 2 screens im slowly getting to a completed version 1.
Dev vlog 21 - I didnt like the first iteration of the subsriptions screen so I made it more personalised to the specific industry im targeting. I changed words like “Pro plan” to “Artisan plan” and “Free plan” to “Apprentice plan”. The reason there is some what space is because I’ll be adding some assets what I’m still designing in procreate and Lottie.
Ships:
What I made: Kazi connects skilled trade workers with customers who need their services, making the process faster and easier. Workers are electricians, plumbers, builders, welders, mechanics, and other professionals who create profiles, showcase their skills, and find relevant jobs. Customers can use Kazi to discover skilled workers, view their profiles, and find the right person for the work they need. The challenges I faced: The challenges I faced were setting up the Google API to allow for Google sign-up and making sure the frontend and backend were communicating. Additionally, making a polished, well-thought-out app with minimal bugs was another challenge. Things I accomplished that I am proud of: Before starting this challenge, using the terminal felt like a foreign language and I didn’t know why the backend and frontend had to be separate. Now I can confidently say that the terminal is my best friend, and I don’t need to watch YouTube tutorials on the difference between an API and an SDK. Things to know: On the demo the google sign in does not work only on emulators it does. Taking photos and contact via phone is not supported on the demo as well. Using th README file has a lot of additional tips. If you create an account even if you close the file will be saved in the database and you can log in, if you have trouble deleting the account you made email me the email you used and ill do it manually....
|
1792878526.8970366
|
1793742526.8970366
|
|
6431
|
luminal by @t3kkm0tt | Stardance
|
t3kkm0tt
|
0
|
214.16
|
0
|
[]
|
[{"post_id": 80812, "ts": "202 [{"post_id": 80812, "ts": "2026-10-18T21:03:58Z", "hours": 11.4214, "text": "What has changed I forgot to devlog (again) and I lost 1hr 21m I started working on registration (yey) I removed the login screen because it was a stupid concept because the identifiers are long as helllllll and they can be loaded from a file I added a registration screen that currently only shows that you can go to the list of public instances or host your own instance (with a link to the docs which don’t exist yet)"}, {"post_id": 79141, "ts": "2026-10-12T19:59:26Z", "hours": 10.5661, "text": "What has changed: I (once again) forgot to devlog in time so I lost about 33m I deleted the client because I hate css and html (making an iced ui in rust now) added more stuff to lcp (functions, yey) refined the login (I have no idea if I did it right, but I´ll see.)"}, {"post_id": 77670, "ts": "2026-10-07T19:45:36Z", "hours": 11.1578, "text": "what has changed I forgor to devlog so i lost 1h and 9m. I deleted major parts of lcp , instance and msgstorage , which I am rebuilding right now. I just installed another distro (guix system) so building doesn’t work right now"}, {"post_id": 74215, "ts": "2026-09-26T22:48:43Z", "hours": 10.9461, "text": "What has changed: not much, I had to get better at tauri and yew and had weird ownership errors i made a component that fetches the conversations (yay) i destroyed my table because I slammed on it too hard (not yay)"}, {"post_id": 70826, "ts": "2026-09-19T20:43:21Z", "hours": 6.1056, "text": "What has changed: I have stopped developing the tui and I´m focusing on a gui now. I also tried making a web-app but that didn´t really work :<"}, {"post_id": 68157, "ts": "2026-09-14T16:43:20Z", "hours": 8.6347, "text": "What has changed I changed the logo (someone on reddit drew it for me, big shoutout to them <3) I added a instance field to the Message struct so you can figure out what instance the Message was sent from (that´s useful for texting between instances (you send a Message to your instance, it sends it to your friend´s instance)) I fixed some bugs, but in its current state, the application won´t compile"}, {"post_id": 64195, "ts": "2026-09-08T12:54:10Z", "hours": 10.1464, "text": "What has changed I finally fixed a stupid bug by using DER instead of PEM I cleaned up a bit and added custom errors using thiserror I started implementing Communities and Groups"}, {"post_id": 59606, "ts": "2026-09-01T14:55:07Z", "hours": 9.5381, "text": "What has changed basically nothing, had multiple problems that I couldn´t fix, so I just used certbot to get the certs did some config system fixes for the instance wrote some comments/docs"}, {"post_id": 52550, "ts": "2026-08-22T18:29:24Z", "hours": 8.9558, "text": "What has changed: I made the TUI better and also made one for the instance I had multiple mental breakdowns trying to understand TLS I started implementing Let´s encrypt certs instead of self-signed ones for usability. Right now, I cannot show a screenshot of the stuff because it´s not compiling (yet)"}, {"post_id": 49214, "ts": "2026-08-17T21:24:41Z", "hours": 3.6575, "text": "What has changed: I added more customization options to the messagestorage, it was pretty hard to do that with ratatui I wrote some comments in the code I found a bug where the font is the same colour as the background, so the font is unreadable. I gotta fix that bug now."}, {"post_id": 47772, "ts": "2026-08-15T22:49:38Z", "hours": 4.4378, "text": "What has changed: I continued making the TUI and it now has color schemes, stats and settings. I will continue making the TUI for the instance later. I migrated the project to an organization to get luminal.codeberg.page as the domain of the website"}, {"post_id": 46282, "ts": "2026-08-13T12:31:37Z", "hours": 5.9986, "text": "What has changed: tried implementing a resource monitoring widget on the messagestorage dashboard and failed to do so, so I deleted it again (there were bugs I was unable to fix)"}, {"post_id": 43021, "ts": "2026-08-08T02:03:47Z", "hours": 8.3433, "text": "What has changed: continued making the TUI to a point where it was usable until I put a bug somewhere in the code. I will have to fix that soon updated the messagestorage replaced some .unwrap() s"}, {"post_id": 41644, "ts": "2026-08-06T00:15:22Z", "hours": 5.8672, "text": "What has changed: I started making a TUI using ratatui, focusing on minimalism and simplicity fixed some bugs"}, {"post_id": 40965, "ts": "2026-08-04T20:47:01Z", "hours": 5.7975, "text": "What has changed: I implemented and tested encryption (it still has some minor bugs, but it works) I stopped using userids and started using RSA keys for identification since that´s way more efficient"}, {"post_id": 39821, "ts": "2026-08-03T02:11:26Z", "hours": 8.9131, "text": "What has changed: I lost my mind trying to use the wtransport crate (it will work, trust (cope)) continued working on the messaging part refined the authentication stuff"}, {"post_id": 37227, "ts": "2026-07-29T19:35:16Z", "hours": 8.2822, "text": "What has changed: created a SQLite database for users and messages “offloaded” more code to LCP (Luminal Communication Protocol) started making the messaging part"}, {"post_id": 36057, "ts": "2026-07-27T22:01:52Z", "hours": 7.29, "text": "What has changed: Made a basic session-based authentication system (harder than I thought) using JWT Fixed and created some bugs Created unnecessary debug messages before I noticed that the hex decoding fails because I put something like ¨adasdasd¨ into my config instead of a hex string"}, {"post_id": 33264, "ts": "2026-07-23T01:24:33Z", "hours": 7.1994, "text": "What changed: continued making lcp (took longer as expected because the wtransport crate is poorly documented) started making messagestorage use lcp everything has become a mess, I gotta clean up next time I work on luminal Sidenote: I cannot commit to codeberg as I am writing this, they reported that they have an outage. I will push the code when codeberg is back up."}, {"post_id": 31853, "ts": "2026-07-20T15:54:01Z", "hours": 8.6744, "text": "What has changed Structure Started making libs and mods for the separate parts ( l uminal c ommunication p rotocol, etc.) changed the architecture from: Client <-> Messagestorage <-> Instance to: Messagestorage <- Client <-> Instance Bugfixes Fixed various bugs, but the compiler throws errors right now, so I cannot show a working version in the screenshot."}, {"post_id": 29139, "ts": "2026-07-15T20:31:15Z", "hours": 8.5089, "text": "What changed started making a bash-like shell for managing and controlling the instance rewrote the config system to use the toml crate instead of config fixed multiple bugs started making cert verification smol sidenote: I cannot work as fast as the last weeks right now because I’m on vacation and only have a dual-core ThinkPad with me."}, {"post_id": 26334, "ts": "2026-07-11T02:05:48Z", "hours": 8.7136, "text": "What changed added automatic port fetching for better ux fixed multiple bugs made the code very messy (gonna clean everything up tomorrow)"}, {"post_id": 15708, "ts": "2026-06-25T15:38:56Z", "hours": 7.2625, "text": "What changed: Took out ml-kem for now because it was causing rust-analyzer to be slow as hell Switched to RSA encryption because I was stupid fixed many bugs (not running right now - gotta fix that now) And a small information at the bottom: I am making this project to learn cryptography and get a Framework 12"}, {"post_id": 10286, "ts": "2026-06-16T22:32:02Z", "hours": 5.1903, "text": "Things that changed: I went back to BiStreams because I was dumb and didn’t realize that what I wanted to do was way easier with BiStreams . I started working on the backend, which can receive BiStreams from the selfhost-server as of now."}, {"post_id": 7109, "ts": "2026-06-11T21:35:55Z", "hours": 4.3564, "text": "Things that changed: Used multiple UniStreams instead of a single BiStream because its easier, made the functions more usable, removed unused dependencies."}, {"post_id": 6298, "ts": "2026-06-10T16:25:13Z", "hours": 5.8919, "text": "Started cleaning up and structuring the project. I also made a basic account system which will need some tuning later."}, {"post_id": 5589, "ts": "2026-06-09T13:19:23Z", "hours": 10.8408, "text": "After trying different protocols for literal hours , I finally settled on WebTransport. Its safer than WebSocket, I believe. I now have to make it send the json instead of “HELLO”."}, {"post_id": 1604, "ts": "2026-06-03T18:51:18Z", "hours": 1.4583, "text": "This is my first devlog of this project. I’ve always wanted to make a chat app since they are one of the most used tools today. Every attempt of making one failed and I was really frustrated. Now, I have motivation to make it and get something for free ."}]...
|
Title: luminal by @t3kkm0tt | Stardance
Devlogs:
Title: luminal by @t3kkm0tt | Stardance
Devlogs:
This is my first devlog of this project. I’ve always wanted to make a chat app since they are one of the most used tools today. Every attempt of making one failed and I was really frustrated. Now, I have motivation to make it and get something for free .
After trying different protocols for literal hours , I finally settled on WebTransport. Its safer than WebSocket, I believe. I now have to make it send the json instead of “HELLO”.
Started cleaning up and structuring the project. I also made a basic account system which will need some tuning later.
Things that changed: Used multiple UniStreams instead of a single BiStream because its easier, made the functions more usable, removed unused dependencies.
Things that changed: I went back to BiStreams because I was dumb and didn’t realize that what I wanted to do was way easier with BiStreams . I started working on the backend, which can receive BiStreams from the selfhost-server as of now.
What changed: Took out ml-kem for now because it was causing rust-analyzer to be slow as hell Switched to RSA encryption because I was stupid fixed many bugs (not running right now - gotta fix that now) And a small information at the bottom: I am making this project to learn cryptography and get a Framework 12
What changed added automatic port fetching for better ux fixed multiple bugs made the code very messy (gonna clean everything up tomorrow)
What changed started making a bash-like shell for managing and controlling the instance rewrote the config system to use the toml crate instead of config fixed multiple bugs started making cert verification smol sidenote: I cannot work as fast as the last weeks right now because I’m on vacation and only have a dual-core ThinkPad with me.
What has changed Structure Started making libs and mods for the separate parts ( l uminal c ommunication p rotocol, etc.) changed the architecture from: Client <-> Messagestorage <-> Instance to: Messagestorage <- Client <-> Instance Bugfixes Fixed various bugs, but the compiler throws errors right now, so I cannot show a working version in the screenshot.
What changed: continued making lcp (took longer as expected because the wtransport crate is poorly documented) started making messagestorage use lcp everything has become a mess, I gotta clean up next time I work on luminal Sidenote: I cannot commit to codeberg as I am writing this, they reported that they have an outage. I will push the code when codeberg is back up.
What has changed: Made a basic session-based authentication system (harder than I thought) using JWT Fixed and created some bugs Created unnecessary debug messages before I noticed that the hex decoding fails because I put something like ¨adasdasd¨ into my config instead of a hex string
What has changed: created a SQLite database for users and messages “offloaded” more code to LCP (Luminal Communication Protocol) started making the messaging part
What has changed: I lost my mind trying to use the wtransport crate (it will work, trust (cope)) continued working on the messaging part refined the authentication stuff
What has changed: I implemented and tested encryption (it still has some minor bugs, but it works) I stopped using userids and started using RSA keys for identification since that´s way more efficient
What has changed: I started making a TUI using ratatui, focusing on minimalism and simplicity fixed some bugs
What has changed: continued making the TUI to a point where it was usable until I put a bug somewhere in the code. I will have to fix that soon updated the messagestorage replaced some .unwrap() s
What has changed: tried implementing a resource monitoring widget on the messagestorage dashboard and failed to do so, so I deleted it again (there were bugs I was unable to fix)
What has changed: I continued making the TUI and it now has color schemes, stats and settings. I will continue making the TUI for the instance later. I migrated the project to an organization to get luminal.codeberg.page as the domain of the website
What has changed: I added more customization options to the messagestorage, it was pretty hard to do that with ratatui I wrote some comments in the code I found a bug where the font is the same colour as the background, so the font is unreadable. I gotta fix that bug now.
What has changed: I made the TUI better and also made one for the instance I had multiple mental breakdowns trying to understand TLS I started implementing Let´s encrypt certs instead of self-signed ones for usability. Right now, I cannot show a screenshot of the stuff because it´s not compiling (yet)
What has changed basically nothing, had multiple problems that I couldn´t fix, so I just used certbot to get the certs did some config system fixes for the instance wrote some comments/docs
What has changed I finally fixed a stupid bug by using DER instead of PEM I cleaned up a bit and added custom errors using thiserror I started implementing Communities and Groups
What has changed I changed the logo (someone on reddit drew it for me, big shoutout to them <3) I added a instance field to the Message struct so you can figure out what instance the Message was sent from (that´s useful for texting between instances (you send a Message to your instance, it sends it to your friend´s instance)) I fixed some bugs, but in its current state, the application won´t compile
What has changed: I have stopped developing the tui and I´m focusing on a gui now. I also tried making a web-app but that didn´t really work :<
What has changed: not much, I had to get better at tauri and yew and had weird ownership errors i made a component that fetches the conversations (yay) i destroyed my table because I slammed on it too hard (not yay)
what has changed I forgor to devlog so i lost 1h and 9m. I deleted major parts of lcp , instance and msgstorage , which I am rebuilding right now. I just installed another distro (guix system) so building doesn’t work right now
What has changed: I (once again) forgot to devlog in time so I lost about 33m I deleted the client because I hate css and html (making an iced ui in rust now) added more stuff to lcp (functions, yey) refined the login (I have no idea if I did it right, but I´ll see.)
What has changed I forgot to devlog (again) and I lost 1hr 21m I started working on registration (yey) I removed the login screen because it was a stupid concept because the identifiers are long as helllllll and they can be loaded from a file I added a registration screen that currently only shows that you can go to the list of public instances or host your own instance (with a link to the docs which don’t exist yet)...
|
1792612413.4905527
|
1793217213.4905527
|
|
10338
|
Liable For Damages by @wilson_brunner | Stardance
|
wilson_brunner
|
1
|
214.95
|
2560
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T17:08:06Z", "hours": 211.0, "multiplier": 13.61, "payout": 2560, "blessing": "neutral", "text": "I made something! This was my first time coding outside of Arduinos, and one of the biggest learning experiences of my life. There was stress, time crunches, and pain, but it all came down to the wire. The most challenging part was drawing, of course, I’m never going to do this again JUST because of the assets. Thanks for playing", "repo": "https://github.com/wilbot3000/Liable-For-Damages", "demo": "https://wilbot3000.itch.io/liable-for-damages"}]...
|
[{"post_id": 75085, "ts": "202 [{"post_id": 75085, "ts": "2026-09-29T03:15:45Z", "hours": 3.1931, "text": "Started working on Liable for Damages 2.0 Devlog #1 Started working on better settings, mostly just things for volume, fonhts, and scrolling things. Whipped up some basic sprites in aseprite and took a day to implement them and figure out bugs, which were very annoying, mostly just related to button sizing. Had to mess around with Godot’s “containers”, for the first time, and it was quite bad, I’ve got some more work to do before I can get the sliders to work, but I’m close! Next stuff’s: -format sliders -start creating settings related to different busses -create saves for the sliders -implement button to change font -make font-changed labels for all maps -do bum ahh drivers ed instead of W Stardance I’ll hopefully release 2.0 within October, and I’mma try and devlog more! ~Wil"}, {"post_id": 72459, "ts": "2026-09-23T00:48:57Z", "hours": 0.7572, "text": "devlog for projects i forgot to add, really just time from learning to export godot games, very annoying um, fun fact, if you create a web game, change the file to index.html, or it literally WON’T WORK!!! Play my game (now!)"}, {"post_id": 71208, "ts": "2026-09-20T13:27:09Z", "hours": 10.0756, "text": "Final Release (or close to it) Game will be out soon, I just gotta ship, but everythings done, I finished sounds, and the ending yesterday, like a 8 hour coding marathon, so i could get this out in time. PLEASE play it, it’s called Liable for Damages, I don’t know where I’ll post it yet, but It’ll probably be on Itch.io or just the game application file. It’s like 150,000 kilabytes, so it shouldn’t be too bad for any computer, hopefully (mines from like 2009 and it ran fine) P.S! Please, (if you do play), comment bugs, especially major things, EXCEPT: -Player dissapearing when opening menu in elevator (don’t try this, im not fixing it it’s funny) -Bugs on top of head, (js kill them) Anything else is bad and needs fix thanks. Also sorry no volume controls, I was crunching down to finish."}, {"post_id": 69943, "ts": "2026-09-18T03:13:43Z", "hours": 10.1883, "text": "SFX stuff, final thing before ending, just finishing sounds, really annoying though ngl. done soon, big update at end"}, {"post_id": 67708, "ts": "2026-09-13T22:09:54Z", "hours": 11.4017, "text": "FINAL STRETCH time to lock in please oh no Im finishing the last level, no time to talk, but got like 4 things to finish THINGS: -level -boss fight -sounds -ending -bugs"}, {"post_id": 59735, "ts": "2026-09-01T17:44:56Z", "hours": 10.84, "text": "WORKING ON MY FINAL STRETCH I’m going to be locked in for the next few days, school starts, so I’ll have less time, but I got a boss fight and then bug fixing and sound effects, hears a sneak peak and one of the many things ive worked on. Also, I came up for a name. Looked up the universal laws for space and saw something about how “Countries of Origin are Liable for Damages caused by their space debris” and said “dang, thas dope” so now i have a name. In my next log ill have a longer devlog like a lite trailer, but the games pretty short, more like a showcase of learning. Thanks!"}, {"post_id": 55339, "ts": "2026-08-27T02:45:42Z", "hours": 9.8842, "text": "quick stuff, nothing much Finished some updates, but I’m locked so don’t have time to write much"}, {"post_id": 53129, "ts": "2026-08-23T15:40:04Z", "hours": 10.67, "text": "Another devlog about levels. Started work on the second (this takes so long) I can’t say much for fear of spoilers, but just say this involves WAY to much code and sprites (I hate drawing so much)"}, {"post_id": 51334, "ts": "2026-08-20T22:46:55Z", "hours": 10.2436, "text": "quick devlog. I need to do this cause i got 10 hours, Im working on the level system and im so tired please why is htis so hard D: D: D: D: D: D: D: D: D: D: D: D:"}, {"post_id": 49718, "ts": "2026-08-18T17:06:16Z", "hours": 9.2325, "text": "keypads, doors, and beginning of the first level. Im actually making a game! contains spoilers First of many… keypads were really difficult, every button, when clicked, multiplies the correct number by a multiplier, and adds it to a “code” variable. the multiplier is chosen based on what step of the code you’re on, (e.g, 1: 10000, 2: 1000, 3: 100, 4: 10, 5: 1), when you click the green button, it cross checks another variable with the one you typed, and if they’re the same, it sends the function to open the doors, and if not, everything resets. The other terminals and what not just open things when clicked on, so it’s just an easier version of the keypad."}, {"post_id": 47241, "ts": "2026-08-15T01:07:13Z", "hours": 8.0058, "text": "Flying enemy is complete, in record time! wow, 8 hours for an enemy, how quick D: This was a challenge, but also really fun. This enemy is the flying one, which made it a little more difficult than just the copy and paste of old ones but still pretty cool. It works using a Navigation Agent, which is like Godot pathfinding. Fast forward three hours and a whole lot of troubleshooting, but that works. The enemy detects the player in the same fashion as the other enemies and then activates the nav-agent to being movement. It’ll follow the player through vents, passages and really anywhere. The fly has three main detection circles, the first one tells it to move towards the player, if the player enters the second one, it’ll freeze and stop moving, and if the player gets even closer, it’ll try to move away (by reversing the velocity var outputted by the nav-agent, iyc) the enemy’s one hit, acourse, but is really annoying to attack, (ill rework ground pounding to make this easier later). The enemy has a shooting attack, that is on a 6 second timer if it can see the player, otherwise it’s just on hold. its shots are pretty slow, so there easy to avoid, but in a crowded fight ya never know. The main quirk of this enemy is it has a really long forgetfulness timer, so even if it can’t see you, it’ll continue to follow for quite a long time, much longer than other enemies. Next:! -stationary, weird wall tentacle that shoots at you -egg spawner that hatches into 1 of three enemies (mystery ooh) -doors (ikr)"}, {"post_id": 44372, "ts": "2026-08-10T02:47:57Z", "hours": 2.9308, "text": "Enemy is complete: Chomper! Lot of work, but got it done. This is the, please avoid, very dangerous, you will die enemy. I haven’t balanced its health yet, and I’m not going to for a while, so it looks like an easy kill in the video. The weird quirks of this enemy are mostly in its charge attack, that rushes the player. It’s pretty easy to avoid, but once again i haven’t done attack balancing, so it may become harder later. The majority of the enemy works just like the lil guy, so idk read that devlog. But there is two major differences: LIST: gasp 1.!!!1! : idle stuff -really just a randomizer -if enemy is idling, starts a timer, and when it runs out of time, it does one of two things (using a randi() function) -if the outputs a 1, nothing happens, but if its a 2 it flips the enemy, thas all -the main reason for this is that since this enemy is so big, making it a tad more animated than the lil guy felt important to me, and also because the detection areas for the big guy are skewed towards the front, so him turning around makes the player sneaking up on him a little less common, it’s generally just for Q-O-l (slang btw) (only cool people understand) 2.!: dash -dear lord, why was hard so much D: -Wasn’t actually that difficult, I spent a lot of time trying stuff before realizing I just unleash my inner enginneer and do it step by step ’till it works, which it did. -first, theres three detection boxes, one for walking towards the player, one for the chomp, and one for dashing, if the player enters the dash-box, a timer will start -when the timer ends, the charge animation plays, which halfway through, activates a function too add velocity (actual charge part of charge) -If the enemy hits a wall, player, or box, it stops moving, but in the case of the player it plays a second animation (dash_hit) that looks like a chomp and kills the player if it hits them. Theres another If statement that sets velocity back to 0 when this happens also. OTHER CHANGES: -I removed the players health really, I like games that are one shot, because it’s subjectively more fun, I’ll make the player death a little more explosive if I have time. I’ll probably make them have three health but that’ll change when I do attack balancing -made the lil guys attack timer shorter, makes him more dangerous. NEXT TIME PLANS: -hopefully in one day (ima lock in rq) -gonna add a flying enemy, -literally just a tad fly, like 5x5 pixels, it’ll look at the player and fire acid that’ll kill you -i might change the death animation to be more BOOM (IYKWIM) :D -my goal is too complete the flying guy 100% tomorrow, but I got other stuff to do so we shall see -also it’ll be nice to not have to do major animating besides literally 6 pixels splaterring -if extra time, I’ll make a weird egg thing that turns into the fly THANKS FOR READING! as always (not really) go make some interesting, and uh learn something new every day please (P.S I made some changes after I took these videos so it still looks and feels kinda bad but not actually rn) ~Wilfred"}, {"post_id": 44000, "ts": "2026-08-09T14:18:20Z", "hours": 11.6767, "text": "Little enemy beginnings I haven’t actually finished anything yet, but I need to devlog anyways, but I have started to finish the second enemy, which is also the framework for more."}, {"post_id": 41460, "ts": "2026-08-05T17:57:18Z", "hours": 12.2908, "text": "player movement is complete!! went on vacation, so fell behind a bit, but finally got this done. I spent a lot of time thinking on how to make player movement good, and then thought of my BOTW playthroughs, where you can either hold your attack and have a powerful slash, or click fast and hit three in a row. First addition!: Ground pounds were pretty interesting, all it does is forces the player down hard if they attack in the air, decreases stamina, and then hits the ground, I added a dust cloud that explodes when he hits the ground, which just plays the animation and then disappears. I had to do some fenagling with this because the code knows when to start the animation because the player will be ground pounding and on the ground, which starts the poof and then stops ground pounding, which also keeps the animation from playing multiple times. SECOND: Annoying stupid player attacks. Tried to finish this in a day, so I was working till 11:00 at night, but I got the animations done and what not. When the player hits/holds the attack button, it starts a stopwatch that increases, when the player releases the button, depending on the time on this timer, it will either play the first of 3 quick attacks or the big attack, which does more damage. If the quick attacks are chosen, the first one will play, three things happen when thats starts, 2 timers start, and player velocity increases to 500. at the end of the attack, there are three things can happen, the player can wait until the animation ends, they can attack again, or they can walk to reset the attack earlier than waiting, the first timer forces the player to wait to cancel the attack by walking, and the second one stops their velocity so they jolt forward. at the end of the animation, a function is played that: starts the reset timer for the attack A variable increases that sets the next attack to be the second or third in the sequence, instead of the first and a if statement that resets the variable to 0 if it gets to 3. Theres some other details for weird situations, like falling off the edge and ground pounding while attacking, or the variable not resetting weirdly. But all of that was like an hour. Thanks for reading: Play my game when it comes out so I have a reason to finihs Also I need a name for the game (please, I suck at naming) and go play Legend of Zelda (or Just Cause 3) (or research operation Just Cause) #USinvadinglatinamericaAGAINfornoreason P.S (I was gonking on being up till eleven, but I did like 3 hours of animating and coding in like 30 minutes while being food deprived and barely awake because deadlines = lock in, so if you need to lock in just don’t sleep ig ) also, I’m technically not done ‘cause ma boy needs a sawed off before I’m done here Yee Haw"}, {"post_id": 35583, "ts": "2026-07-27T03:37:24Z", "hours": 1.1306, "text": "MOVEMENT PART # (3) les go took me short time, it’s ten o’clock im tired, pretty simple stuff. If player is sprinting and the crouch button is pressed, the normal function is overridden and a slide is activated, this just sets the animation to slide and the X velocity of the player to a high number. There’s some other code for just general quality of life, like stopping if you hit a wall and keeping you from changing directions, but the REALLLY cool part is jumping. Like in real life (trust), while sliding the player will jump further, which permits some cool movement combinations, like vaulting over gaps and climbing 4 block walls. I have to work out stamina changes depending on jump strength and stamina decrease for vaulting, but the movement getting pretty fleshed out. P.S, after I took the video, I changed the sprint stamina decrease to be a consistent decrease instead of being choppy like in the video, it’ll be in the next log, but it was just quality of life. NEXTS STUFFS: -dash -enemy lunge -stamina from hoisting and slide-jump stamina increase Thanks for reading!"}, {"post_id": 34965, "ts": "2026-07-26T03:00:51Z", "hours": 3.8936, "text": "Crouching! #2 in the player movement chronicles! Surprisingly, I also managed to create a whole new 5 animations! slide, crouch idle, crouch walk, and the sledge versions (not slide cause ya can’t sprint with sledge). I implemented all but the slide, which’ll take a long time, so I’m going to keep it off a bit. This was really straight forward to add, and for the first time in a long time, i had like only 1 problem . I really just had a piece of code that asks, “did ya click the crouch button?” and if so, it toggles crouch. IF (and only if!) the crouch is on (or “true”) the idle and walk animations are switched to their respective crouch variants, and the normal player hitbox is replaced by a shorter-er-est one. To bar the player from un-crouching in the midst of a tunnel, I added 2 new raycasts to the front and back of the players head facing up, these casts detect if there is a block above the player, and if either one of them detects anything, the player is unable to un-crouch until they are unshielded. Another quick thing I had to fix a bit was the raycasts detecting the player, which broke EVERYTHING so I just turned good ’ol collision mask/layer 20 into the super-cool (ALL-NEW !!) “player raycast collision!!!” which just only lets them interact with the floor and boxes, so yippee NEXT STEPeths!: -slide ): -enemy lunge -other player attacks (only hard attack right now which is bad)"}, {"post_id": 34347, "ts": "2026-07-24T23:18:41Z", "hours": 13.5214, "text": "Mantling and fixes Hi. I have had a very long week. I spent a lot of time working on sprites, mostly for the game 3rd level (no spoilers, (but that’s pretty boring) so heres the interesting part. I’ve been focusing on revamping player movement to make it feel more interesting and fun, and this is a good start. Mantling! if you don’t know what this is, it’s what you do when you get out of a pool without a ladder or staircase, pretty much just “pulling yourself up” The player does this by using raycasts, I added three, but one is for something else. One of them detects a wall in front of the player, and one detects a wall above. The code uses these casts to detect if the player is up against a wall, and if there is no wall above the player, pretty much checking if there is a mantalable ledge. If there is, the code says “you can mantle” Another line says: if you can mantle, and you are not on the ground, and if the player clicked space (Jump), then mantle. The annoying part was animations. When the player begins mantling, the hitbox and player position is frozen in space, and position is snapped to the nearest block to line up the animation. the only thing that moves during the animation is the player sprite, which means at the end of the animation, when the players position is finally changed, the player sprite needs to snap back at the EXACT same time, or it looks bad, which was hard. The other annoying part was the camera snapping randomly, as it moves with the player and not the sprite. I fixed this by just temporarily turning on the cameras position smoothing while the mantle is happening and then turning it off when the player moves again."}, {"post_id": 31003, "ts": "2026-07-19T01:34:03Z", "hours": 14.4064, "text": "sprites! done some stuff, mostly just game planning (sadly didn’t get time for because notes but I got a lot done, mostly just some serious drawing. I finished some tiles for the first and second levels, and some tiles for the next three."}, {"post_id": 26947, "ts": "2026-07-12T01:17:07Z", "hours": 4.2967, "text": "Quick hurt animations Main thing I added was animations for death and injury. I first added knockback when hit. It just takes the player’s scale.x (what i use for flipping the sprite) and multiplies it by 200 to the player velocity, since the scale is either 1 or -1, it changes the direction the player is thrown (in the future i’d like to make the scale the enemies direction, not the players, as if the player is flipped in the wrong direction, it could have knockback in the wrong direction (very bad) Theres was already a variable to detect if the player was being hit that was used for testing, so I just implemented that to play the injury animations. i also detected if the players health was zero or below after being hit, and if so it would make the player play the death animation instead of the injury. I have currently unimplemented animations for a before-death injured player, so after they are hit for the last time they will stand for a bit before collapsing. NEXT STUFF: (hast beeneth narrowed list) -add enemy knockback (only when injured, lok wierd when die) -fix player knockback thank yoh forth coming to my TED talk"}, {"post_id": 25010, "ts": "2026-07-08T22:32:29Z", "hours": 12.3911, "text": "I’m gonna start this by saying: I HATE animating! Aseprite made this so much easier, but GOD this was difficult… I think I had 5 situations this time around where the problem was the littlest change in the world, and I just needed to go to bed. I made 3 different walk cycles, before giving up and figuring out how to do it for real, it was only a little difficult after that. I have unused hurt, death, and push animations, and need to implement a shorter attack and smooth some things out still (jumping while attacking cough ) Almost all of these 12 hours was fixing stupid little problems and changing little pixels, probably some of the worst time ive spent on this project yet… (but still really interesting) NEXT STEPS::: -fix walk so it looks sensible (drifting) -make jumping illegal hwilst attacking -add short attack -customized tile map ????? Thank you for reading goodbye I want to stop animating"}, {"post_id": 21598, "ts": "2026-07-03T17:09:19Z", "hours": 4.0883, "text": "enemy attacks/better particles. This took some work, but not really… The enemy can now attack and hurt the player the codes really just the same as the player attacking the enemies. Theres a hurtbox in the player that gets hit by an area in the enemy that makes them take damage. The particles took some more difficult work. Godot has CPU and GPU particles, which apparently are different, it just depends on what in your computer renders them. I used GPU particles, because they run better and can collide with things. I whipped up a sprite sheet for the particles in Aseprite, which looked a lot better than the weird purple generic Godot things. The particles only collided with light occluders??, so I added an occlusion layer to the tile map, at some point I hope to create a better system for when they hit the ground, but thats not my priority right now. Next STEPS!!!!! -main thing is that the enemy has a lunge attack that I haven’t implemented yet, so thats next. -starting on the player sprites, this is a LOT of work, so its gonna take me a lot of time, but no time like the present"}, {"post_id": 20225, "ts": "2026-07-01T19:32:16Z", "hours": 5.3086, "text": "Some more enemy development! -first “enemy” in the game, a pretty basic little thing. -designed on Aseprite, took some time to set up with hakatime, but turns out I was using a version only used on Mac OS, so no kidding it was giving me trouble -I created unused animations for a lunge and whip attack animations that I will implement soon (?). NEXT STEPS :D : -stop the player from colliding with the enemy’s hitbox, it’s very annoying, and in the future will we a necessity for having many creatures in the same room -add the enemy attacks, I’ll probably just use a raycasy to see if the players close enough, and then make it hit, pretty simple… Also get Aseprite, it’s like 20 bucks but it’s a really good software, also it’s just really good for game making. gasp :D"}, {"post_id": 18857, "ts": "2026-06-30T01:51:26Z", "hours": 10.155, "text": "Basis of an enemy AI!!! the beginnings… I feel like ten hours is a little much for just this, but there was so much work to do. The main step began with a pretty simple area. It just detects if the player enters. The code uses the player position (or “target” position in the code), and subtracts it from the enemy position, if the numbers greater than 1 it moves one way and if less than -1 other. (The buffer in-between the 2 is just for smoothing) If the player is within the hitbox, the enemy shoots out a ray cast towards the player. If it touches the player, it lets the enemy move, if it hits a box or the ground first it doesn’t, pretty simple, till you realize what can go wrong… For clarification i have NO CLUE why any of what i did helped, but it did so yippee!!! The first problem was that the enemy would only detect the player if they were off the ground. I tried to fix this by forcing the ray cast to not interact with the Tile Map (which wouldn’t have worked anyways, because it still needs to so the objects can block the enemy’s sight). I set a piece of code to print what the enemy was interacting with, and it turns out it was the background? (I know, weird?) I seperated the background and collision ground into 2 tile layers, then turned of collisions for the back layer. After that there was some glitchy stuff which you can see in the video a bit, but I fixed almost all of it with literally one if statement that only lets the player become a target for the code (My code is a modified version from this website) / / / / / Godot 3.0: Visibility with Ray-casting · KCC Blog"}, {"post_id": 14832, "ts": "2026-06-24T02:59:54Z", "hours": 4.9869, "text": "Devlog #4? 3 big things this time, physics blocks, destructive blocks, and stamina upgrades. Physics!: -just a block but it’s a “rigid body”, so Godot gives it physics. -It uses some “borrowed code” to detect if the player is colliding with something and then add the players velocity to it.* -I had to change the hitbox of the floor to be a collision polygon, instead of one per block, which made the pushing kind of shotty.** Destruction!: -Really simple… just an enemy that can’t move or fight back. I added an animation so you can tell it’s getting hit but that’s the most complicated it got. Stamina! (it’s better): -I added 3 major things, though 2 of them are pretty small. First, I added a bar, Godot has a built-in progress bar node, so I just mapped the value from 0 - 10, and used the stamina value from the player as the value input -SECOND! I changed the recharge, instead of a variable that goes up when a timer ends, it now uses a move_toward() function to make the stamina tick up smoothly. -thirdibidily, a pause. Mainly because irl and in games you don’t just start recharging as soon as you stop moving. This uses a float that begins to tick up when the player starts moving, and when it surpasses a certain point, it allows the stamina to recharge. Final stuff!!! -I’ll start focusing on: -more indepth weapons -and maybe ai for enemies… probs something with raycasts……….."}, {"post_id": 13221, "ts": "2026-06-21T17:28:44Z", "hours": 1.7094, "text": "Sprinting! took a bit, but I finally got sprinting to work. Works pretty simply, the characters motion is determined by a speed variable, which just increases if the sprint button (shift) is held down. Here’s the code: if Input.is_action_just_pressed(“sprint”) and stamina >= 1: state_machine.travel(“sprint”) sprinting_timer.start() SPEED = 200 sprinting = true elif Input.is_action_just_released(“sprint”): SPEED = 75 sprinting = false sprinting_timer.stop() I’m using an animation_tree for my animations, instead of just a player, this helps the transitions from animations feel smoother, so thats what the “state_machine” is. The “sprinting” variable is used to force other animations (e.g, for idling and running) to check if the player is sprinting, and thus not override the animation (the sprinting animation currently is identical to running, but when I start designing the character i’ll change that). The timer is just on a .5 sec loop, and makes the stamina decrease when it ends, the second bit of code checks if you stopped sprinting, and returns the SPEED to normal and stops the timer loop. This code doesn’t actually fully work, as another if statement is needed. The extra “and” in the first check makes sure you can’t start sprinting if stamina is below one, but actually only checks once when you start sprinting, not constantly, so the sprinting doesn’t stop if stamina goes below 1 (like it should). if stamina < 1: SPEED = 75 sprinting_timer.stop() sprinting = false This code, unlike the first “if”, checks consistantly if stamina’s below one, and does the same job as if you let go of sprinting. This keeps stamina from going negative D: In the future I plan on adding a gradient to the effect, so the speed up isn’t as jarring, but this is a good start! Thanks to Brackeys for the current assets! (go watch his video on Godot, it’s very informative) ~wil"}, {"post_id": 12762, "ts": "2026-06-20T21:26:41Z", "hours": 13.1589, "text": "Finally started to develop a “game” made 3 things, Attacks, Stamina, and GUI Attacks: ->use hurtboxes detect if an area entered, if that area is_in_group(“attackarea”) the hurtbox takes a damage variable and applies it to the thing it’s attached too (Player, enemy, etc) Stamina: -> A timer slowly makes it tick upwards, starts at 10, and goes down if the player jumps or attacks, uses a Global Variable allow the GUI to display the stamina (there’s probably a better way but I’m lazy ¯ _ (ツ)_/¯) GUI: ->uses a canvas layer being displayed over a sub-viewport, which includes the coins and stamina, just displays text and then the quantities of each integer. next steps: ->destructible blocks ->physics blocks ->stamina bar (not integer) ->sprinting (and smoother movement. Thanks to Brackeys for the assets!"}, {"post_id": 5987, "ts": "2026-06-10T01:24:33Z", "hours": 4.8608, "text": "Finally done learning basic Godot!! My entire time has been dedicated to just learning how to use the software, and I’m glad to say I now have something to work off of. I still need to learn more, like GDscript, pixel art, and game design. Next Steps! -develop weapon (sledgehammer :D) -destructible terrain elements (fancy walls that get destroyed) -physics blocks -begin designing character and aliens"}]...
|
Title: Liable For Damages by @wilson_brunner | Sta Title: Liable For Damages by @wilson_brunner | Stardance
Devlogs:
Finally done learning basic Godot!! My entire time has been dedicated to just learning how to use the software, and I’m glad to say I now have something to work off of. I still need to learn more, like GDscript, pixel art, and game design. Next Steps! -develop weapon (sledgehammer :D) -destructible terrain elements (fancy walls that get destroyed) -physics blocks -begin designing character and aliens
Finally started to develop a “game” made 3 things, Attacks, Stamina, and GUI Attacks: ->use hurtboxes detect if an area entered, if that area is_in_group(“attackarea”) the hurtbox takes a damage variable and applies it to the thing it’s attached too (Player, enemy, etc) Stamina: -> A timer slowly makes it tick upwards, starts at 10, and goes down if the player jumps or attacks, uses a Global Variable allow the GUI to display the stamina (there’s probably a better way but I’m lazy ¯ _ (ツ)_/¯) GUI: ->uses a canvas layer being displayed over a sub-viewport, which includes the coins and stamina, just displays text and then the quantities of each integer. next steps: ->destructible blocks ->physics blocks ->stamina bar (not integer) ->sprinting (and smoother movement. Thanks to Brackeys for the assets!
Sprinting! took a bit, but I finally got sprinting to work. Works pretty simply, the characters motion is determined by a speed variable, which just increases if the sprint button (shift) is held down. Here’s the code: if Input.is_action_just_pressed(“sprint”) and stamina >= 1: state_machine.travel(“sprint”) sprinting_timer.start() SPEED = 200 sprinting = true elif Input.is_action_just_released(“sprint”): SPEED = 75 sprinting = false sprinting_timer.stop() I’m using an animation_tree for my animations, instead of just a player, this helps the transitions from animations feel smoother, so thats what the “state_machine” is. The “sprinting” variable is used to force other animations (e.g, for idling and running) to check if the player is sprinting, and thus not override the animation (the sprinting animation currently is identical to running, but when I start designing the character i’ll change that). The timer is just on a .5 sec loop, and makes the stamina decrease when it ends, the second bit of code checks if you stopped sprinting, and returns the SPEED to normal and stops the timer loop. This code doesn’t actually fully work, as another if statement is needed. The extra “and” in the first check makes sure you can’t start sprinting if stamina is below one, but actually only checks once when you start sprinting, not constantly, so the sprinting doesn’t stop if stamina goes below 1 (like it should). if stamina < 1: SPEED = 75 sprinting_timer.stop() sprinting = false This code, unlike the first “if”, checks consistantly if stamina’s below one, and does the same job as if you let go of sprinting. This keeps stamina from going negative D: In the future I plan on adding a gradient to the effect, so the speed up isn’t as jarring, but this is a good start! Thanks to Brackeys for the current assets! (go watch his video on Godot, it’s very informative) ~wil
Devlog #4? 3 big things this time, physics blocks, destructive blocks, and stamina upgrades. Physics!: -just a block but it’s a “rigid body”, so Godot gives it physics. -It uses some “borrowed code” to detect if the player is colliding with something and then add the players velocity to it.* -I had to change the hitbox of the floor to be a collision polygon, instead of one per block, which made the pushing kind of shotty.** Destruction!: -Really simple… just an enemy that can’t move or fight back. I added an animation so you can tell it’s getting hit but that’s the most complicated it got. Stamina! (it’s better): -I added 3 major things, though 2 of them are pretty small. First, I added a bar, Godot has a built-in progress bar node, so I just mapped the value from 0 - 10, and used the stamina value from the player as the value input -SECOND! I changed the recharge, instead of a variable that goes up when a timer ends, it now uses a move_toward() function to make the stamina tick up smoothly. -thirdibidily, a pause. Mainly because irl and in games you don’t just start recharging as soon as you stop moving. This uses a float that begins to tick up when the player starts moving, and when it surpasses a certain point, it allows the stamina to recharge. Final stuff!!! -I’ll start focusing on: -more indepth weapons -and maybe ai for enemies… probs something with raycasts………..
Basis of an enemy AI!!! the beginnings… I feel like ten hours is a little much for just this, but there was so much work to do. The main step began with a pretty simple area. It just detects if the player enters. The code uses the player position (or “target” position in the code), and subtracts it from the enemy position, if the numbers greater than 1 it moves one way and if less than -1 other. (The buffer in-between the 2 is just for smoothing) If the player is within the hitbox, the enemy shoots out a ray cast towards the player. If it touches the player, it lets the enemy move, if it hits a box or the ground first it doesn’t, pretty simple, till you realize what can go wrong… For clarification i have NO CLUE why any of what i did helped, but it did so yippee!!! The first problem was that the enemy would only detect the player if they were off the ground. I tried to fix this by forcing the ray cast to not interact with the Tile Map (which wouldn’t have worked anyways, because it still needs to so the objects can block the enemy’s sight). I set a piece of code to print what the enemy was interacting with, and it turns out it was the background? (I know, weird?) I seperated the background and collision ground into 2 tile layers, then turned of collisions for the back layer. After that there was some glitchy stuff which you can see in the video a bit, but I fixed almost all of it with literally one if statement that only lets the player become a target for the code (My code is a modified version from this website) / / / / / Godot 3.0: Visibility with Ray-casting · KCC Blog
Some more enemy development! -first “enemy” in the game, a pretty basic little thing. -designed on Aseprite, took some time to set up with hakatime, but turns out I was using a version only used on Mac OS, so no kidding it was giving me trouble -I created unused animations for a lunge and whip attack animations that I will implement soon (?). NEXT STEPS :D : -stop the player from colliding with the enemy’s hitbox, it’s very annoying, and in the future will we a necessity for having many creatures in the same room -add the enemy attacks, I’ll probably just use a raycasy to see if the players close enough, and then make it hit, pretty simple… Also get Aseprite, it’s like 20 bucks but it’s a really good software, also it’s just really good for game making. gasp :D
enemy attacks/better particles. This took some work, but not really… The enemy can now attack and hurt the player the codes really just the same as the player attacking the enemies. Theres a hurtbox in the player that gets hit by an area in the enemy that makes them take damage. The particles took some more difficult work. Godot has CPU and GPU particles, which apparently are different, it just depends on what in your computer renders them. I used GPU particles, because they run better and can collide with things. I whipped up a sprite sheet for the particles in Aseprite, which looked a lot better than the weird purple generic Godot things. The particles only collided with light occluders??, so I added an occlusion layer to the tile map, at some point I hope to create a better system for when they hit the ground, but thats not my priority right now. Next STEPS!!!!! -main thing is that the enemy has a lunge attack that I haven’t implemented yet, so thats next. -starting on the player sprites, this is a LOT of work, so its gonna take me a lot of time, but no time like the present
I’m gonna start this by saying: I HATE animating! Aseprite made this so much easier, but GOD this was difficult… I think I had 5 situations this time around where the problem was the littlest change in the world, and I just needed to go to bed. I made 3 different walk cycles, before giving up and figuring out how to do it for real, it was only a little difficult after that. I have unused hurt, death, and push animations, and need to implement a shorter attack and smooth some things out still (jumping while attacking cough ) Almost all of these 12 hours was fixing stupid little problems and changing little pixels, probably some of the worst time ive spent on this project yet… (but still really interesting) NEXT STEPS::: -fix walk so it looks sensible (drifting) -make jumping illegal hwilst attacking -add short attack -customized tile map ????? Thank you for reading goodbye I want to stop animating
Quick hurt animations Main thing I added was animations for death and injury. I first added knockback when hit. It just takes the player’s scale.x (what i use for flipping the sprite) and multiplies it by 200 to the player velocity, since the scale is either 1 or -1, it changes the direction the player is thrown (in the future i’d like to make the scale the enemies direction, not the players, as if the player is flipped in the wrong direction, it could have knockback in the wrong direction (very bad) Theres was already a variable to detect if the player was being hit that was used for testing, so I just implemented that to play the injury animations. i also detected if the players health was zero or below after being hit, and if so it would make the player play the death animation instead of the injury. I have currently unimplemented animations for a before-death injured player, so after they are hit for the last time they will stand for a bit before collapsing. NEXT STUFF: (hast beeneth narrowed list) -add enemy knockback (only when injured, lok wierd when die) -fix player knockback thank yoh forth coming to my TED talk
sprites! done some stuff, mostly just game planning (sadly didn’t get time for because notes but I got a lot done, mostly just some serious drawing. I finished some tiles for the first and second levels, and some tiles for the next three.
Mantling and fixes Hi. I have had a very long week. I spent a lot of time working on sprites, mostly for the game 3rd level (no spoilers, (but that’s pretty boring) so heres the interesting part. I’ve been focusing on revamping player movement to make it feel more interesting and fun, and this is a good start. Mantling! if you don’t know what this is, it’s what you do when you get out of a pool without a ladder or staircase, pretty much just “pulling yourself up” The player does this by using raycasts, I added three, but one is for something else. One of them detects a wall in front of the player, and one detects a wall above. The code uses these casts to detect if the player is up against a wall, and if there is no wall above the player, pretty much checking if there is a mantalable ledge. If there is, the code says “you can mantle” Another line says: if you can mantle, and you are not on the ground, and if the player clicked space (Jump), then mantle. The annoying part was animations. When the player begins mantling, the hitbox and player position is frozen in space, and position is snapped to the nearest block to line up the animation. the only thing that moves during the animation is the player sprite, which means at the end of the animation, when the players position is finally changed, the player sprite needs to snap back at the EXACT same time, or it looks bad, which was hard. The other annoying part was the camera snapping randomly, as it moves with the player and not the sprite. I fixed this by just temporarily turning on the cameras position smoothing while the mantle is happening and then turning it off when the player moves again.
Crouching! #2 in the player movement chronicles! Surprisingly, I also managed to create a whole new 5 animations! slide, crouch idle, crouch walk, and the sledge versions (not slide cause ya can’t sprint with sledge). I implemented all but the slide, which’ll take a long time, so I’m going to keep it off a bit. This was really straight forward to add, and for the first time in a long time, i had like only 1 problem . I really just had a piece of code that asks, “did ya click the crouch button?” and if so, it toggles crouch. IF (and only if!) the crouch is on (or “true”) the idle and walk animations are switched to their respective crouch variants, and the normal player hitbox is replaced by a shorter-er-est one. To bar the player from un-crouching in the midst of a tunnel, I added 2 new raycasts to the front and back of the players head facing up, these casts detect if there is a block above the player, and if either one of them detects anything, the player is unable to un-crouch until they are unshielded. Another quick thing I had to fix a bit was the raycasts detecting the player, which broke EVERYTHING so I just turned good ’ol collision mask/layer 20 into the super-cool (ALL-NEW !!) “player raycast collision!!!” which just only lets them interact with the floor and boxes, so yippee NEXT STEPeths!: -slide ): -enemy lunge -other player attacks (only hard attack right now which is bad)
MOVEMENT PART # (3) les go took me short time, it’s ten o’clock im tired, pretty simple stuff. If player is sprinting and the crouch button is pressed, the normal function is overridden and a slide is activated, this just sets the animation to slide and the X velocity of the player to a high number. There’s some other code for just general quality of life, like stopping if you hit a wall and keeping you from changing directions, but the REALLLY cool part is jumping. Like in real life (trust), while sliding the player will jump further, which permits some cool movement combinations, like vaulting over gaps and climbing 4 block walls. I have to work out stamina changes depending on jump strength and stamina decrease for vaulting, but the movement getting pretty fleshed out. P.S, after I took the video, I changed the sprint stamina decrease to be a consistent decrease instead of being choppy like in the video, it’ll be in the next log, but it was just quality of life. NEXTS STUFFS: -dash -enemy lunge -stamina from hoisting and slide-jump stamina increase Thanks for reading!
player movement is complete!! went on vacation, so fell behind a bit, but finally got this done. I spent a lot of time thinking on how to make player movement good, and then thought of my BOTW playthroughs, where you can either hold your attack and have a powerful slash, or click fast and hit three in a row. First addition!: Ground pounds were pretty interesting, all it does is forces the player down hard if they attack in the air, decreases stamina, and then hits the ground, I added a dust cloud that explodes when he hits the ground, which just plays the animation and then disappears. I had to do some fenagling with this because the code knows when to start the animation because the player will be ground pounding and on the ground, which starts the poof and then stops ground pounding, which also keeps the animation from playing multiple times. SECOND: Annoying stupid player attacks. Tried to finish this in a day, so I was working till 11:00 at night, but I got the animations done and what not. When the player hits/holds the attack button, it starts a stopwatch that increases, when the player releases the button, depending on the time on this timer, it will either play the first of 3 quick attacks or the big attack, which does more damage. If the quick attacks are chosen, the first one will play, three things happen when thats starts, 2 timers start, and player velocity increases to 500. at the end of the attack, there are three things can happen, the player can wait until the animation ends, they can attack again, or they can walk to reset the attack earlier than waiting, the first timer forces the player to wait to cancel the attack by walking, and the second one stops their velocity so they jolt forward. at the end of the animation, a function is played that: starts the reset timer for the attack A variable increases that sets the next attack to be the second or third in the sequence, instead of the first and a if statement that resets the variable to 0 if it gets to 3. Theres some other details for weird situations, like falling off the edge and ground pounding while attacking, or the variable not resetting weirdly. But all of that was like an hour. Thanks for reading: Play my game when it comes out so I have a reason to finihs Also I need a name for the game (please, I suck at naming) and go play Legend of Zelda (or Just Cause 3) (or research operation Just Cause) #USinvadinglatinamericaAGAINfornoreason P.S (I was gonking on being up till eleven, but I did like 3 hours of animating and coding in like 30 minutes while being food deprived and barely awake because deadlines = lock in, so if you need to lock in just don’t sleep ig ) also, I’m technically not done ‘cause ma boy needs a sawed off before I’m done here Yee Haw
Little enemy beginnings I haven’t actually finished anything yet, but I need to devlog anyways, but I have started to finish the second enemy, which is also the framework for more.
Enemy is complete: Chomper! Lot of work, but got it done. This is the, please avoid, very dangerous, you will die enemy. I haven’t balanced its health yet, and I’m not going to for a while, so it looks like an easy kill in the video. The weird quirks of this enemy are mostly in its charge attack, that rushes the player. It’s pretty easy to avoid, but once again i haven’t done attack balancing, so it may become harder later. The majority of the enemy works just like the lil guy, so idk read that devlog. But there is two major differences: LIST: gasp 1.!!!1! : idle stuff -really just a randomizer -if enemy is idling, starts a timer, and when it runs out of time, it does one of two things (using a randi() function) -if the outputs a 1, nothing happens, but if its a 2 it flips the enemy, thas all -the main reason for this is that since this enemy is so big, making it a tad more animated than the lil guy felt important to me, and also because the detection areas for the big guy are skewed towards the front, so him turning around makes the player sneaking up on him a little less common, it’s generally just for Q-O-l (slang btw) (only cool people understand) 2.!: dash -dear lord, why was hard so much D: -Wasn’t actually that difficult, I spent a lot of time trying stuff before realizing I just unleash my inner enginneer and do it step by step ’till it works, which it did. -first, theres three detection boxes, one for walking towards the player, one for the chomp, and one for dashing, if the player enters the dash-box, a timer will start -when the timer ends, the charge animation plays, which halfway through, activates a function too add velocity (actual charge part of charge) -If the enemy hits a wall, player, or box, it stops moving, but in the case of the player it plays a second animation (dash_hit) that looks like a chomp and kills the player if it hits them. Theres another If statement that sets velocity back to 0 when this happens also. OTHER CHANGES: -I removed the players health really, I like games that are one shot, because it’s subjectively more fun, I’ll make the player death a little more explosive if I have time. I’ll probably make them have three health but that’ll change when I do attack balancing -made the lil guys attack timer shorter, makes him more dangerous. NEXT TIME PLANS: -hopefully in one day (ima lock in rq) -gonna add a flying enemy, -literally just a tad fly, like 5x5 pixels, it’ll look at the player and fire acid that’ll kill you -i might change the death animation to be more BOOM (IYKWIM) :D -my goal is too complete the flying guy 100% tomorrow, but I got other stuff to do so we shall see -also it’ll be nice to not have to do major animating besides literally 6 pixels splaterring -if extra time, I’ll make a weird egg thing that turns into the fly THANKS FOR READING! as always (not really) go make some interesting, and uh learn something new every day please (P.S I made some changes after I took these videos so it still looks and feels kinda bad but not actually rn) ~Wilfred
Flying enemy is complete, in record time! wow, 8 hours for an enemy, how quick D: This was a challenge, but also really fun. This enemy is the flying one, which made it a little more difficult than just the copy and paste of old ones but still pretty cool. It works using a Navigation Agent, which is like Godot pathfinding. Fast forward three hours and a whole lot of troubleshooting, but that works. The enemy detects the player in the same fashion as the other enemies and then activates the nav-agent to being movement. It’ll follow the player through vents, passages and really anywhere. The fly has three main detection circles, the first one tells it to move towards the player, if the player enters the second one, it’ll freeze and stop moving, and if the player gets even closer, it’ll try to move away (by reversing the velocity var outputted by the nav-agent, iyc) the enemy’s one hit, acourse, but is really annoying to attack, (ill rework ground pounding to make this easier later). The enemy has a shooting attack, that is on a 6 second timer if it can see the player, otherwise it’s just on hold. its shots are pretty slow, so there easy to avoid, but in a crowded fight ya never know. The main quirk of this enemy is it has a really long forgetfulness timer, so even if it can’t see you, it’ll continue to follow for quite a long time, much longer than other enemies. Next:! -stationary, weird wall tentacle that shoots at you -egg spawner that hatches into 1 of three enemies (mystery ooh) -doors (ikr)
keypads, doors, and beginning of the first level. Im actually making a game! contains spoilers First of many… keypads were really difficult, every button, when clicked, multiplies the correct number by a multiplier, and adds it to a “code” variable. the multiplier is chosen based on what step of the code you’re on, (e.g, 1: 10000, 2: 1000, 3: 100, 4: 10, 5: 1), when you click the green button, it cross checks another variable with the one you typed, and if they’re the same, it sends the function to open the doors, and if not, everything resets. The other terminals and what not just open things when clicked on, so it’s just an easier version of the keypad.
quick devlog. I need to do this cause i got 10 hours, Im working on the level system and im so tired please why is htis so hard D: D: D: D: D: D: D: D: D: D: D: D:
Another devlog about levels. Started work on the second (this takes so long) I can’t say much for fear of spoilers, but just say this involves WAY to much code and sprites (I hate drawing so much)
quick stuff, nothing much Finished some updates, but I’m locked so don’t have time to write much
WORKING ON MY FINAL STRETCH I’m going to be locked in for the next few days, school starts, so I’ll have less time, but I got a boss fight and then bug fixing and sound effects, hears a sneak peak and one of the many things ive worked on. Also, I came up for a name. Looked up the universal laws for space and saw something about how “Countries of Origin are Liable for Damages caused by their space debris” and said “dang, thas dope” so now i have a name. In my next log ill have a longer devlog like a lite trailer, but the games pretty short, more like a showcase of learning. Thanks!
FINAL STRETCH time to lock in please oh no Im finishing the last level, no time to talk, but got like 4 things to finish THINGS: -level -boss fight -sounds -ending -bugs
SFX stuff, final thing before ending, just finishing sounds, really annoying though ngl. done soon, big update at end
Final Release (or close to it) Game will be out soon, I just gotta ship, but everythings done, I finished sounds, and the ending yesterday, like a 8 hour coding marathon, so i could get this out in time. PLEASE play it, it’s called Liable for Damages, I don’t know where I’ll post it yet, but It’ll probably be on Itch.io or just the game application file. It’s like 150,000 kilabytes, so it shouldn’t be too bad for any computer, hopefully (mines from like 2009 and it ran fine) P.S! Please, (if you do play), comment bugs, especially major things, EXCEPT: -Player dissapearing when opening menu in elevator (don’t try this, im not fixing it it’s funny) -Bugs on top of head, (js kill them) Anything else is bad and needs fix thanks. Also sorry no volume controls, I was crunching down to finish.
devlog for projects i forgot to add, really just time from learning to export godot games, very annoying um, fun fact, if you create a web game, change the file to index.html, or it literally WON’T WORK!!! Play my game (now!)
Started working on Liable for Damages 2.0 Devlog #1 Started working on better settings, mostly just things for volume, fonhts, and scrolling things. Whipped up some basic sprites in aseprite and took a day to implement them and figure out bugs, which were very annoying, mostly just related to button sizing. Had to mess around with Godot’s “containers”, for the first time, and it was quite bad, I’ve got some more work to do before I can get the sliders to work, but I’m close! Next stuff’s: -format sliders -start creating settings related to different busses -create saves for the sliders -implement button to change font -make font-changed labels for all maps -do bum ahh drivers ed instead of W Stardance I’ll hopefully release 2.0 within October, and I’mma try and devlog more! ~Wil
Ships:
I made something! This was my first time coding outside of Arduinos, and one of the biggest learning experiences of my life. There was stress, time crunches, and pain, but it all came down to the wire. The most challenging part was drawing, of course, I’m never going to do this again JUST because of the assets. Thanks for playing...
|
1792856909.6890633
|
1792943309.6890633
|
|
987
|
Oppurtunity OS by @dseshukumar2008 | Stardance
|
dseshukumar2008
|
1
|
219.84
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T15:28:16Z", "hours": 136.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built and refined OppurtunityOS , an AI powered career development platform designed to help students understand their skills, career paths, and can be more confident about the career . The platform includes the features such as Career Roadmaps, Project recommendations, AI Career coach, Resume Builder and Analyzer , Github Analyzer , Skill Gap Analysis , Career Explorer, and Analytics. One of the main challenges that I faced was handling API calls . I refined the interface , removed unnecessary features , and ensured final platform is deployed. I am proud of bringing the different career-development tools together into one working platform. To use the project , use the try project button to explore the deployed application , and see the source code to view the complete implementation and README.", "repo": "https://github.com/dseshukumar2008-hub/opportunityOS", "demo": "https://opportunity-os-rust.vercel.app/"}]...
|
[{"post_id": 69727, "ts": "202 [{"post_id": 69727, "ts": "2026-09-17T17:35:11Z", "hours": 9.6806, "text": "While working on OpportunityOS, I realized as the project grew , the CSS had become more complex , With repeated tailwind classes , different styling patterns, larger border radiuses. I decided to simplify the existing styling component by component, focusing on cleaner layouts, consistent colors, simpler borders and shadows, and more maintainable CSS while keeping the existing UI structure and functionality unchanged. I made changes and removed unnecessary repeated code."}, {"post_id": 64952, "ts": "2026-09-09T18:06:24Z", "hours": 11.1286, "text": "Fixed the local AI connection issue by routing frontend API requests through the vite proxy to the deployed backend . Debugged several issues including: -> offline fallback states -> Incorrect AI response handling -> stuck analysis / loading states scrolling and time stamp issues"}, {"post_id": 63536, "ts": "2026-09-07T13:33:53Z", "hours": 10.7625, "text": "Working on the project engine . The main page is taking step , but OppurtunityOS Copilot side panel still needs fixing - messages are not getting a proper response . Fixing the integration and working to get the proper response"}, {"post_id": 62056, "ts": "2026-09-05T09:06:42Z", "hours": 10.3364, "text": "Added the Career quiz to the Skill Arcade - a timed 10 question challenge designed to test challenge around coding and technology . Currently polishing the Skill arcade experience and getting oppurtunityOS closer to final submission."}, {"post_id": 60708, "ts": "2026-09-03T08:22:30Z", "hours": 11.0881, "text": "Build Tech Match for the Skill Arcade !!! A quick challenge where you match technologies with their correct categories and test your knowledge under time pressure."}, {"post_id": 58637, "ts": "2026-08-31T03:49:46Z", "hours": 10.4067, "text": "After spending time fixing the bugs - I decided to make finding bugs a game . So I added a new game to my skill arcade - bug hunter. The idea is simple , first the user have to select the programming language , and then have to select the toughness level , based on that there will be code snippets and options for that code snippets."}, {"post_id": 56740, "ts": "2026-08-28T16:48:24Z", "hours": 10.3039, "text": "After spending too much time fixing bugs , i got tired of debugging So instead of fixing another bug …. I tried to build something new . I implemented Skill Arcade in Opportunity OS - a small gamified section where users can test their skills through interactive games"}, {"post_id": 55130, "ts": "2026-08-26T16:22:11Z", "hours": 10.1347, "text": "I am continuing to manually refine and test the project feature by feature . I focused on debugging the Resume Analyzer , improving the error flow , and checking the complete analysis process . Still refining the project , making changes in the code , getting errors and fixing them ."}, {"post_id": 53102, "ts": "2026-08-23T15:17:00Z", "hours": 4.3336, "text": "finally OpportunityOS is deployed and it is live !!!"}, {"post_id": 52494, "ts": "2026-08-22T17:11:34Z", "hours": 9.8203, "text": "Recently I have been refining the career intelligence dashboard and improving the overall UI and user experience . I am also working on connecting the Analytics page with all the existing features , so users can get a complete view of their progress and activity across Opportunity OS . The focus is now on making the existing features feel more connected , polished , and product ready . Still Building … still improving !!!"}, {"post_id": 49693, "ts": "2026-08-18T16:16:04Z", "hours": 9.9183, "text": "Opportunity OS is getting closer to the finish line !!! The focus has now shifted from building features to make sure everything actually works as intended Currently working on : Fixing remaining bugs Testing complete user flows checking AI - powered features polishing UI Fixing navigation and state issues verifying existing features before release At this stage , it’s less about adding more and more features - and more about making the existing product reliable , consistent , and ready to ship . The final stretch is here ……."}, {"post_id": 38424, "ts": "2026-07-31T19:45:09Z", "hours": 10.7006, "text": "Opportunity OS has entered its final phase . Currently I am focusing on fixing the bugs , testing and ensuring every feature works before final release . The finish line is getting closer"}, {"post_id": 28867, "ts": "2026-07-15T12:57:36Z", "hours": 9.6481, "text": "continued refining the OpportunityOS onboarding experience by improving the overall UI, spacing, alignment, typography, and visual consistency across all onboarding steps. The focus wasn’t on adding new features but on creating a smoother, more intuitive, and premium experience that makes a great first impression. One step closer to a polished SaaS product!"}, {"post_id": 23475, "ts": "2026-07-06T14:05:30Z", "hours": 10.7319, "text": "I focused on improving the onboarding experience for OpportunityOS. I redesigned the Personal Details, Education, and Skills screens to create a cleaner and more premium user experience. I also introduced a new Career Interests step, allowing users to share their career goals so OpportunityOS can deliver more personalized opportunities and recommendations. The onboarding is becoming more intuitive, engaging, and aligned with the vision of building an AI-powered career platform for students"}, {"post_id": 15145, "ts": "2026-06-24T16:31:24Z", "hours": 8.7697, "text": "I focused on enhancing the Resume Builder in OpportunityOS. Improved the resume creation workflow, refined the live preview experience, strengthened Firebase data synchronization, and validated auto-save functionality for a smoother user experience. Also worked on ATS analysis improvements and overall stability to ensure users can build professional resumes seamlessly."}, {"post_id": 14465, "ts": "2026-06-23T16:26:54Z", "hours": 14.9064, "text": "Built the Career Explorer module in OpportunityOS to help users discover career paths based on their skills and profile. Added role-based career cards, skill gap insights, recommended projects, learning timelines, and roadmap generation for different career tracks. Currently focusing on improving matching accuracy, personalization, and overall user experience."}, {"post_id": 11928, "ts": "2026-06-19T13:37:55Z", "hours": 5.7172, "text": "Project Recommendation Engine in OpportunityOS. One problem I noticed is that many students know their dream role but have no idea what projects they should actually build. So I developed an AI-powered engine that analyzes a student’s target role and skill gaps, then recommends portfolio-worthy projects that can strengthen their profile and improve career readiness. Turning career goals into actionable projects, one recommendation at a time. user flow : user selects the specialization that he has choosen next user selects the target role Stay tuned for more updates !!!"}, {"post_id": 10024, "ts": "2026-06-16T16:13:40Z", "hours": 10.1594, "text": "After generating a personalized Career Roadmap, the next step is understanding what’s missing. The Skill Gap Analysis feature helps users compare their current skills with the skills required for their dream career. For example, if someone wants to become an AI Engineer, OpportunityOS can analyze their profile and show which skills they already have and which skills they still need to learn."}, {"post_id": 8533, "ts": "2026-06-14T06:06:49Z", "hours": 6.7772, "text": "Development Update: AI-Powered Career Roadmap in OpportunityOS One challenge students face is not knowing what to learn next after choosing a career path. Today, I worked on the Career Roadmap Module in OpportunityOS. How does it work : -> Lets users choose a target role (Software Engineer, AI Engineer, Full Stack Developer, etc.) -> Generates a structured learning roadmap Breaks the journey into clear phases and milestones -> Shows recommended learning resources for each phase -> Tracks roadmap progress over time Integrates with Skill Gap Analysis to recommend the next skills to learn Still improving the experience, but excited to see the roadmap becoming more interactive and personalized."}, {"post_id": 7300, "ts": "2026-06-12T05:14:32Z", "hours": 4.055, "text": "One of the biggest challenges students face is finding relevant opportunities scattered across multiple platforms. To solve this, I built the Opportunities Hub inside OpportunityOS , where students can discover internships, jobs, hackathons, scholarships, and competitions from a single platform."}, {"post_id": 4909, "ts": "2026-06-08T14:24:57Z", "hours": 3.5189, "text": "AI Resume Analysis is now live in OpportunityOS. One thing I’ve noticed is that many students apply for opportunities without knowing whether their resume is actually ATS-friendly or aligned with the role they’re targeting. To address this, I built an AI-powered Resume Analysis feature using Google Gemini, allowing users to upload a resume or analyze their OpportunityOS profile to receive ATS scoring, strengths and weaknesses analysis, missing skill detection, and personalized improvement suggestions. Stay tuned for more features !!!"}, {"post_id": 4726, "ts": "2026-06-08T05:04:03Z", "hours": 2.1067, "text": "Thinking a lot , I thought of building a OpportunityOS Copilot, a context-aware AI assistant built directly into the platform. Instead of acting like a generic chatbot, the Copilot is designed to understand a user’s profile, skills, career goals, resume insights, and opportunities data to provide personalized guidance. And Guess what the answer is insane !!!"}, {"post_id": 3598, "ts": "2026-06-06T16:25:34Z", "hours": 4.8642, "text": "Worked on OpportunityOS onboarding and authentication today. Implemented a first-time user onboarding flow that guides users through profile creation, skill selection, interests, and career goals setup after Google Sign In."}, {"post_id": 2781, "ts": "2026-06-05T16:10:58Z", "hours": 10.1692, "text": "Built and organized multiple settings components including Account Information, Password & Security, Notifications, Privacy, Integrations, Appearance, Data Storage, and Email Preferences. Next, I’ll connect these settings to live backend services and replace remaining placeholder functionality with real-time integrations. Stay tuned !!!!!"}, {"post_id": 1548, "ts": "2026-06-03T17:07:23Z", "hours": 4.4708, "text": "I worked on the login page of Oppurtunity OS . I added a branding section on the left side to highlight the main features of the platform . I also improved the login form layout and added google and github signin options to make the user interface look more good and efficient ."}, {"post_id": 935, "ts": "2026-06-02T18:06:06Z", "hours": 5.0983, "text": "I worked on the home page of Oppurtunity OS I improved the landing page design , navigation bar, overall layout . I also fixed alignment issues ."}, {"post_id": 228, "ts": "2026-06-01T10:39:24Z", "hours": 0.5008, "text": "I completed the foundation of OppurtunityOS, a platform designed to help students , discover the hackathons , internships , competitions and scholarships."}]...
|
Title: Oppurtunity OS by @dseshukumar2008 | Starda Title: Oppurtunity OS by @dseshukumar2008 | Stardance
Devlogs:
I completed the foundation of OppurtunityOS, a platform designed to help students , discover the hackathons , internships , competitions and scholarships.
I worked on the home page of Oppurtunity OS I improved the landing page design , navigation bar, overall layout . I also fixed alignment issues .
I worked on the login page of Oppurtunity OS . I added a branding section on the left side to highlight the main features of the platform . I also improved the login form layout and added google and github signin options to make the user interface look more good and efficient .
Built and organized multiple settings components including Account Information, Password & Security, Notifications, Privacy, Integrations, Appearance, Data Storage, and Email Preferences. Next, I’ll connect these settings to live backend services and replace remaining placeholder functionality with real-time integrations. Stay tuned !!!!!
Worked on OpportunityOS onboarding and authentication today. Implemented a first-time user onboarding flow that guides users through profile creation, skill selection, interests, and career goals setup after Google Sign In.
Thinking a lot , I thought of building a OpportunityOS Copilot, a context-aware AI assistant built directly into the platform. Instead of acting like a generic chatbot, the Copilot is designed to understand a user’s profile, skills, career goals, resume insights, and opportunities data to provide personalized guidance. And Guess what the answer is insane !!!
AI Resume Analysis is now live in OpportunityOS. One thing I’ve noticed is that many students apply for opportunities without knowing whether their resume is actually ATS-friendly or aligned with the role they’re targeting. To address this, I built an AI-powered Resume Analysis feature using Google Gemini, allowing users to upload a resume or analyze their OpportunityOS profile to receive ATS scoring, strengths and weaknesses analysis, missing skill detection, and personalized improvement suggestions. Stay tuned for more features !!!
One of the biggest challenges students face is finding relevant opportunities scattered across multiple platforms. To solve this, I built the Opportunities Hub inside OpportunityOS , where students can discover internships, jobs, hackathons, scholarships, and competitions from a single platform.
Development Update: AI-Powered Career Roadmap in OpportunityOS One challenge students face is not knowing what to learn next after choosing a career path. Today, I worked on the Career Roadmap Module in OpportunityOS. How does it work : -> Lets users choose a target role (Software Engineer, AI Engineer, Full Stack Developer, etc.) -> Generates a structured learning roadmap Breaks the journey into clear phases and milestones -> Shows recommended learning resources for each phase -> Tracks roadmap progress over time Integrates with Skill Gap Analysis to recommend the next skills to learn Still improving the experience, but excited to see the roadmap becoming more interactive and personalized.
After generating a personalized Career Roadmap, the next step is understanding what’s missing. The Skill Gap Analysis feature helps users compare their current skills with the skills required for their dream career. For example, if someone wants to become an AI Engineer, OpportunityOS can analyze their profile and show which skills they already have and which skills they still need to learn.
Project Recommendation Engine in OpportunityOS. One problem I noticed is that many students know their dream role but have no idea what projects they should actually build. So I developed an AI-powered engine that analyzes a student’s target role and skill gaps, then recommends portfolio-worthy projects that can strengthen their profile and improve career readiness. Turning career goals into actionable projects, one recommendation at a time. user flow : user selects the specialization that he has choosen next user selects the target role Stay tuned for more updates !!!
Built the Career Explorer module in OpportunityOS to help users discover career paths based on their skills and profile. Added role-based career cards, skill gap insights, recommended projects, learning timelines, and roadmap generation for different career tracks. Currently focusing on improving matching accuracy, personalization, and overall user experience.
I focused on enhancing the Resume Builder in OpportunityOS. Improved the resume creation workflow, refined the live preview experience, strengthened Firebase data synchronization, and validated auto-save functionality for a smoother user experience. Also worked on ATS analysis improvements and overall stability to ensure users can build professional resumes seamlessly.
I focused on improving the onboarding experience for OpportunityOS. I redesigned the Personal Details, Education, and Skills screens to create a cleaner and more premium user experience. I also introduced a new Career Interests step, allowing users to share their career goals so OpportunityOS can deliver more personalized opportunities and recommendations. The onboarding is becoming more intuitive, engaging, and aligned with the vision of building an AI-powered career platform for students
continued refining the OpportunityOS onboarding experience by improving the overall UI, spacing, alignment, typography, and visual consistency across all onboarding steps. The focus wasn’t on adding new features but on creating a smoother, more intuitive, and premium experience that makes a great first impression. One step closer to a polished SaaS product!
Opportunity OS has entered its final phase . Currently I am focusing on fixing the bugs , testing and ensuring every feature works before final release . The finish line is getting closer
Opportunity OS is getting closer to the finish line !!! The focus has now shifted from building features to make sure everything actually works as intended Currently working on : Fixing remaining bugs Testing complete user flows checking AI - powered features polishing UI Fixing navigation and state issues verifying existing features before release At this stage , it’s less about adding more and more features - and more about making the existing product reliable , consistent , and ready to ship . The final stretch is here …….
Recently I have been refining the career intelligence dashboard and improving the overall UI and user experience . I am also working on connecting the Analytics page with all the existing features , so users can get a complete view of their progress and activity across Opportunity OS . The focus is now on making the existing features feel more connected , polished , and product ready . Still Building … still improving !!!
finally OpportunityOS is deployed and it is live !!!
I am continuing to manually refine and test the project feature by feature . I focused on debugging the Resume Analyzer , improving the error flow , and checking the complete analysis process . Still refining the project , making changes in the code , getting errors and fixing them .
After spending too much time fixing bugs , i got tired of debugging So instead of fixing another bug …. I tried to build something new . I implemented Skill Arcade in Opportunity OS - a small gamified section where users can test their skills through interactive games
After spending time fixing the bugs - I decided to make finding bugs a game . So I added a new game to my skill arcade - bug hunter. The idea is simple , first the user have to select the programming language , and then have to select the toughness level , based on that there will be code snippets and options for that code snippets.
Build Tech Match for the Skill Arcade !!! A quick challenge where you match technologies with their correct categories and test your knowledge under time pressure.
Added the Career quiz to the Skill Arcade - a timed 10 question challenge designed to test challenge around coding and technology . Currently polishing the Skill arcade experience and getting oppurtunityOS closer to final submission.
Working on the project engine . The main page is taking step , but OppurtunityOS Copilot side panel still needs fixing - messages are not getting a proper response . Fixing the integration and working to get the proper response
Fixed the local AI connection issue by routing frontend API requests through the vite proxy to the deployed backend . Debugged several issues including: -> offline fallback states -> Incorrect AI response handling -> stuck analysis / loading states scrolling and time stamp issues
While working on OpportunityOS, I realized as the project grew , the CSS had become more complex , With repeated tailwind classes , different styling patterns, larger border radiuses. I decided to simplify the existing styling component by component, focusing on cleaner layouts, consistent colors, simpler borders and shadows, and more maintainable CSS while keeping the existing UI structure and functionality unchanged. I made changes and removed unnecessary repeated code.
Ships:
I built and refined OppurtunityOS , an AI powered career development platform designed to help students understand their skills, career paths, and can be more confident about the career . The platform includes the features such as Career Roadmaps, Project recommendations, AI Career coach, Resume Builder and Analyzer , Github Analyzer , Skill Gap Analysis , Career Explorer, and Analytics. One of the main challenges that I faced was handling API calls . I refined the interface , removed unnecessary features , and ensured final platform is deployed. I am proud of bringing the different career-development tools together into one working platform. To use the project , use the try project button to explore the deployed application , and see the source code to view the complete implementation and README....
|
1792824822.242663
|
1792911222.242663
|
|
30756
|
Stardancer (formerly Unnamed Platformer) by @zahra Stardancer (formerly Unnamed Platformer) by @zahran | Stardance...
|
zahran
|
1
|
220.0
|
3505
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-12T20:37:52Z", "hours": 220.0, "multiplier": 13.35, "payout": 3505, "blessing": "neutral", "text": "For HackClub Stardance, I created Stardancer , a 30-level platformer featuring a unique mechanic: mid-level shapeshifting to unlock new abilities and powers! I used C++ and SFML (the Simple and Fast Multimedia Library) to code this game. During the development of this game, I ran into a couple of technical challenges. Collision was among the biggest; I had initially decided on AABB (Axis-Aligned Bounding Box) collision, but after implementing that I realized that it led to erroneous collision interactions, misalignments, and more issues. So, I switched to SAT (Separating Axis Theorem) collision instead. This, combined with general collision response logic, made coding collision one of the hardest endeavours of this project. There were many other challenges throughout development, however none are too disruptive to the experience of the final game. I’m still extremely proud of myself and this project for many reasons: This is the largest project I’ve ever made; Despite many challenges, bugs, and pieces of complex logic to work through, I made a fully functional and complete game; I managed to make this with no external engines; I was able to use my C++ and new SFML skills to create something I can proudly say I made! IMPORTANT NOTE FOR REVIEWERS!! PLEASE READ!!! A complete playthrough of the game takes a large amount of time due to how levels are structured: to play a level, you must beat the level before it, which poses an issue for one of the shapes which is only unlocked in the last set. I realize most reviewers do not have the time required to play through the full game and gain a complete understanding of its features. For this reason, I strongly urge reviewers to skim through/watch my full walkthrough video linked in my README, as well as check out the “Credits Easter Egg” section in that video. Playing through all 30 levels sequentially takes time, but you can unlock every level directly from the Credits screen so you can test all shape powers hands-on right away! This way, a reviewer will be able to understand the scope and gameplay of the game in a short amount of time. With that being said, I truly hope you enjoy my game.", "repo": "https://github.com/HughMann635/Stardancer", "demo": "https://zahran-635.itch.io/stardancer"}]...
|
[{"post_id": 79153, "ts": "202 [{"post_id": 79153, "ts": "2026-10-12T20:35:30Z", "hours": 8.0819, "text": "Unnamed Platformer - Devlog 27 WE’RE FINALLY HERE! What I did: I did a lot of final polish and testing before getting the game ready for release. Initially I was going to use Emscripten to port my game over to web assembly (inspired by this video: https://www.youtube.com/watch?v=1kiwpAIU454 ) but I soon realized that it was much more complex than it looked, and kind of took away from the spirit of being entirely made out of C++ and SFML. So, I decided to simply publish an executable rather than port the game over to web. I set up the release build and whatnot (which took a while because of cmake config issues and whatnot) but I finally got a release build working n it feels great! I ported to itch.io, now I just gotta finish up the itch page and readme, as well as record a walkthrough video for macOS and Linux users as I couldn’t figure out how to configure the game for either. Challenges: The whole odyssey of deciding how to port my game over was a slight hassle, but nothing too bad. Also, while recording my walkthrough vid, I ended up discovering A LOT of hidden bugs, so I managed to pick all those off and there shouldn’t be any left…hopefully. Plans for next time: Ship! This devlog will be my last for this project, and for this challenge. Aside from being done with everything, I accidentally created a completely new project according to Hackatime when I was renaming the file folder, executable, etc. from “WorldofBlockman” (my placeholder name) to Stardancer so everything would be more consistent with my final title. so any work I do on my project won’t count towards heartbeats and thus I can’t post another devlog (15 minutes minimum/devlog). Still, it’s been such an amazing journey, I learned so much and I made this game that I’m super proud of 🥹 even though this game gave me hell sometimes, I have virtually no regrets about any of it. This has been my biggest project ever, and many more to come in the future hopefully. K…bye guys."}, {"post_id": 74692, "ts": "2026-09-28T00:34:26Z", "hours": 9.5458, "text": "Unnamed Platformer - Devlog 26 Stardance extension + fatigue = holy procrastination 😂✌️ What I did: More random stuff: Level timer that stores each level’s personal best, displays a live timer in the level, and lets you access your PR for each level from level select menu Fixed issue where you couldn’t close game while in settings menu Death count (it just tracks deaths over every single level, accessed from level select menu, manual restarts count as death too) and coin count as well Adjusted some levels a bit Added a feature to handbook where items you haven’t come across yet are blacked out and have hidden descs, and add notification to handbook when you unlock these items Update README a little bit cause I was feeling lazy and didn’t want to do anything else Fix some bugs concerning rotation and tipping, as well as making it so you do not rotate when passing thru a 1 tile high gap (this is specially an issue with the square where it can feel a bit janky otherwise) I will note that some of these were multifaceted changes that took quite a bit of effort and iterations, but I couldn’t be bothered explaining everything I did here. And more playtesting too. Challenges: Probably the handbook feature…it was the longest one out of all of them. Plans for next time: I want to be done with pretty much everything related to the actual game by next devlog, so I can focus on the README and finally shipping! K bye guys"}, {"post_id": 70860, "ts": "2026-09-19T21:41:39Z", "hours": 9.0317, "text": "Unnamed Platformer - Devlog 25 I’m so tired omg What I did: Bunch of miscellaneous stuff: Added basic vfx: so far we only have a click sound, I’ll add more later but it took me a while to figure out how to get SFML’s audio system working since I also had to find out why my audio files weren’t loading in either. Added coins to every level: added new tile type for coin, added a coin into each level, added effects, etc. Fix bugs/gameplay issues such as the triangle being unable to teleport after a restart/new level, rearrange some levels to fit coin placements, find out some new bugs and try (and fail) to fix them, so decide to deal with them another day. Add simple death animation to the player. Make it so levels must be completed in progressive order (e.g. you start at level 1, cannot progress till you have completed), also add different colors to boxes on level select menu (check vid) Probably a few more things related to general playtesting but i can’t remember Challenges: Making level buttons in the levelmenu was kind of frustrating not only because of the selection aspect but also getting them to visually render in the proper colors. Honestly though, now the main challenge is dealing with my own fatigue, especially since I’ve been joining more clubs and getting more homework, so hopefully I can clutch up over the final few days cuz I highkey need that framework 13 🥺✌️ Plans for next time: I added a list of bugs I want to tackle/stuff I want to add: //BUGS!!!!! //cant close window while in settings menu //rotation bugs //levels 13, 17, 26, 4, 8, look into //as well as other levels but these ones I can remember //TO ADD!!!!! //speedrun timer //death count //updating handbook (notif icon, hidden objects) //more sfx (death especially) K bye guys"}, {"post_id": 68850, "ts": "2026-09-15T21:16:00Z", "hours": 7.4011, "text": "Unnamed Platformer - Devlog 24 The game is finally coming together… 🥹🔥 What I did: All the menus in the game are completed! Ngl, credits was really easy ofc, but I was deciding how I should go about doing it, still didnt take too long tho. Then settings was a lot harder 😭 volume adjustment was quite easy, but the real problem came with creating the keybind section, since I had already coded hard inputs all throughout my code. So I pretty much had to add a new system + helper func in vars.h, then replace every instance of isKeyPressed with that system+helper, then code the menu in the ui file (Which took forever cuz of bugs with msg updating + event handling + key updates + etc.). Well, it’s (mostly) done now, which is good. And ofc I was also testing the game for general bugs too. Challenges: The keybind menu took me a hella long time to get done…thats about it, aside from some other tiny bugs. Plans for next time: add vfx, polish up every single one of the menus…and then I’ll see where to go from there. Hopefully I can finish most of my stuff by the start of next week. K bye guys"}, {"post_id": 66830, "ts": "2026-09-12T19:00:20Z", "hours": 9.0458, "text": "Unnamed Platformer - Devlog 23 Hey guys. What I did: I did a lot of playtesting/bug hunting as usual, but I was mainly creating the entire handbook menu. Which took surprisingly long, cuz of designing the menu + figuring out how to include all the different tile icons + creating descriptions + making stuff functional + formatting + colors + bugs + you get the idea. Anyway I’m pretty happy with how it looks so far, I doubt I’ll make any major changes in the future. Also I did find a couple of bugs while testing, but i didn’t really do anything about them, I want to completely create all the core functions before tackling any small bugs/issues. Challenges: There were a few bugs and I went through a few designs for the menu, but overall everything was hella light so I wouldn’t say there were any real challenges. Plans for next time: Create credits menu, then work on adding vfx, add settings menu (thinking of adding volume + keybind toggles), polish up all the menus…and then I’ll see where to go from there. I’m pretty worried cuz now that school’s started (im in gr11 now) I’m probably gonna have a good amount of schoolwork, clubs, etc. that I’ll also have to make time for…so wish me luck ig. K bye guys"}, {"post_id": 63924, "ts": "2026-09-07T23:45:05Z", "hours": 6.8869, "text": "Unnamed Platformer - Devlog 22 School starts tomorrow ✌️so i decided to make a shorter devlog…also I’m so tired What I did: Honestly you can’t really tell that I did much at first glance. I was mainly playtesting a lot and polishing stuff up, and making sure all the background stuff was fine. For now I dont think I’ll return to background stuff for a while. Although I did manage to add a particle effect for the black holes (both the ones in the background as well as the actual obstacles). I was also experimenting with a horizon for a bit, but then I decided I don’t want it and scrapped a good chunk of time worth of changes. Challenges: Deciding how to add in particles was a bit challenging, specially the math part. But other than that it was a pretty chill 7 hours. Plans for next time: Hopefully finish menus, then: work on vfx, polish up all the menus, tackle any big issues with levels or physics, and finally work on bringing my game onto itch.io! not all in one go, though. K bye guys"}, {"post_id": 61060, "ts": "2026-09-03T19:34:17Z", "hours": 9.8472, "text": "Unnamed Platformer - Devlog 21 Background design is a bit easier now that I have a plan…also I did not lose track of time 👍 What I did: I added in every single sky element I want to have: comets, planets, black holes, stars, floating rocks, and a moon. I think I might tweak some elements later down the line (specifically the moon(adding craters) and black holes(I’ll think of some extra effects) ), but for now I’m fairly satisfied with how far I’ve come. Looking at the game now gives me a sense of pride at seeing everything finally come together after so long 🥹✌️ Challenges: Making comets was a bit of a hassle, because I had to decide how to do it (which took me some time for brainstorming + more time cuz of discarded changes + even more minutes of brainstorming), and implement it. It’s pretty complex cuz there’s a cooldown on each comet, then you have to set the spawn point and angle/speed, calculate the trail’s points, draw them, draw the head too etc etc…so it was pretty tedious, but comets are the most rewarding visually imo out of all the features. Other than that, I spent a bit of time per other feature figuring out how to implement each of them, but none of them were as complex as the comet. Plans for next time: Finish up any bugs or other issues in sky-related stuff, then I’ll try to make a visible horizon again and see if I’ve changed my mind since last time. Either that or I’ll start working more on smaller vfx, specially trying to find out how to make a particle effect. K bye guys"}, {"post_id": 59814, "ts": "2026-09-01T19:29:23Z", "hours": 11.1828, "text": "Unnamed Platformer - Devlog 20 Background design is a hell of a lot harder than I thought it would be…also I lost track of time 😭😭 What I did: I got started on background design, and partially implemented a background. I actually had a pretty different idea in mind compared to what I have now: the rest of the planet visible, stretching into the horizon, with mountains and volcanoes etc etc. scattered along its surface. After spending a while implementing that, I realized it a) didn’t look right, since everything was just following the player around at normal cam speed, and b) I didn’t like the idea anymore to begin with. So after scrapping all those changes, I started researching how to add a scrolling effect so it would look more natural. I found out how to implement a parallax scroll effect, which basicallymeans that objects in the background move along slower than objects closer to the front of the screen. I also restructured my scenes.h file which contains all background-related stuff, and made a couple of other small changes and fixes with certain levels. I know I don’t have much to show for it, but that’s mainly because I spent a lot of time tweaking certain elements and just undoing backgrounds I ended up not liking 😭🥀 Challenges: Deciding what to do visuals-wise cost me some time bcuz I kept going back on my old ideas, but restructuring scenes.h was the hardest part since after deciding what to do for visuals, I had to base the logic in scenes.h off that. Also it took me a while to decide how to add in a parallax scroll system. Plans for next time: Work on more background stuff. right now I’ve set up a lot of background elements’ structs and whatnot, but I’ve only redrawn the stars and added a rough brightening/dimming effect. Also Im gonna have to start thinking about what I’m going to add on each of the sub-menus accessible from the main menu (credits, handbook, and settings). K bye guys"}, {"post_id": 56961, "ts": "2026-08-29T00:22:59Z", "hours": 9.99, "text": "Unnamed Platformer - Devlog 19 The UI is coming along pretty nicely! Pt. 2 What I did: I believe I’ve fully created everything UI- and menu-wise, aside from 3 additional menus (credits, a ‘handbook’ that contains info about stuff, and a settings page) that are currently blank. I created a hovering effect for buttons that makes it so when you hover over a button, the button goes downward slightly and the shadow moves to match. Aside from that, I polished up/tweaked some minor details, and the only things I’ll add menu wise are probably those 3 sub-menus on the main menu and a universal backwards-nav button. The biggest thing (time-wise) was figuring out how to make the code more readable and actually making it more readable. I created two new functions for making text and button objects which made my life a lot easier, also the button-hover code took quite a few lines so I put that into a function too. Aside from that, I made a couple fixes here and there to make it more efficient memory wise. And even then, I ended up breaking stuff which took me a while to fix, such as the issue with unpausing ur game in the vid. Challenges: Probably efficiency stuff, since deciding how to do it + implementation took a while and had a couple of bugs due to me not accounting for stuff. For example: my hover function would change states on its own, but since sometimes you don’t need to directly change state or you need to do other things too, I made it into a boolean that each individual case takes and does its own thing with. Plans for next time: Start on background stuff probably, I don’t want to do anymore UI stuff for now. I have a fewideas in mind for my background visuals, but I hope they won’t be too hard/impossible to implement. K bye guys"}, {"post_id": 55174, "ts": "2026-08-26T17:32:12Z", "hours": 9.9275, "text": "Unnamed Platformer - Devlog 18 The UI is coming along pretty nicely! What I did: Designed a full level select menu (there are a couple more things left to add), add a heads up display for the current level, and add proper mouse input and extra details to buttons such as shadows (havent implemented shadows for everything, I’ll explain why) and changing color when hovering. Even though it doesn’t sound like much, it took me a surprisingly long time because my text wasn’t centering…What I didn’t realize is that sf::Text creates invisible offsets for some reason, so when I used getGlobalBounds() it would return that offset too and mess up the centering. I ended up doing some research and realized I had to use the local bounds (i.e. untransformed) when centering. Challenges: Ig the biggest ‘challenge’ was centering buttons with text, because at first I actually tried to manually fine tune coordinates and whatnot. But then I found out I had to use localbounds and blah blah. Another thing is, I spent a lot of time fine tuning sizes, colors, shadow darknesses and depths, etc. which took a lot of my time. Also no ai used this time either, although I did spend a lot of time researching why my text wouldn’t center itself. Plans for next time: I’ll just polish up existing menus, and work on background elements. Also I want to add a kind of handbook accessible from the main menu that tells you what stuff does, different powerups, etc. But most importantly, I’m gonna try to find out how to make shadow creation more efficient. For every text/button, I need a shadow. That means I have to add it as a member in the class, copy the actual object, change the color and offset it, then draw it too. Since I have so many objects that make shadows (all of them in the end, ideally), I’m probably going to make a shadow-making function for readability. Other than that I’ll just play the game and test levels a bunch, which I’ve already been doing a lot to make sure everything is as it should be. K bye guys P.S. there’s also still a couple bugs ( UI-related or otherwise) that I have to fix as well"}, {"post_id": 53440, "ts": "2026-08-24T00:04:55Z", "hours": 9.9042, "text": "Unnamed Platformer - Devlog 17 It’s actually no longer “Unnamed Platformer”, it’s “Worlds of Blockman”, I might change that later idk What I did: I designed level 30, playtested every level extensively and tweaked some levels, and made a basic main menu, level hud and pause menu. And it took me ~10 hours. Well, that’s not all I did. I also changed up the colors of the square to differentiate it from spikes and buttons, and I added a visual indicator for the triangle’s teleport. When you tp the triangle fades to a darker shade of green, and when it gets off cooldown (3 secs) it fades back to its normal color and then you can tp again. Also, level design took quite a long time since I was kind of making it up as I went along, and the whole game states implementation wasn’t too hard in itself, but I ran into errors with loading my font. I added the .ttf file to my assets folder and wrote the correct file name in font.loadFromFile() and whatnot, but turns out I didn’t have the actual font downloaded in the build folder or my project. So after a bit less than an hour I added it in and it fixed the issue. also I spent a bit of time deciding how the different menus would actually look which ate up some time. Challenges: ngl the font-loading thing was kind of the only hard part 😭most other stuff was solved relatively quickly and easily AI used, if any: None, also most likely no AI will be used in the future since the future just holds visual stuff which should not be hard enough to merit the help of AI. Plans for next time: Level select menu, add more stuff to main menu, also make it so the current level shows in the background when you go to the pause menu. also add mouse inputs so you can use those instead of kb inputs in the menu, and start on some more vfx and sfx. I’m also really tired"}, {"post_id": 51378, "ts": "2026-08-21T01:20:51Z", "hours": 9.9719, "text": "Unnamed Platformer - Devlog 16 Actually didn’t get a lot done over the last few days, let me explain. What I did: The biggest and only new feature I added was a major adjustment to black holes. Earlier they were just 2 tile x 2 tile circles that killed you upon touching. I’ve reworked them to how they’re supposed to be: 6 px x 6 px black circles, with a surrounding 6 tile x 6 tile ring. now if you enter the ring, you lose the ability to move normally (you can still jump tho) get pulled toward the black center, which kills you if you touch it Which is how it’s supposed to be (nevermind the astrophysical inaccuracy lmao). This took me 2 hours 😭 and then I designed levels 26 and 27. I also re-added the old texture system I implemented and then took down earlier cuz it was making things look hella grainy, but only for environment tiles cuz there’s no big changes visually compared to redrawing them every frame. Unfortunately it doesn’t seem to be doing much in terms of efficiency. I also designed levels 28 and 29 (ss of level 29 attached), and playtested every level from 1 to 28 and adjusted each one to remove any unwanted ways you can cheese a level, as well as to just make some of them less punishing for small mistakes. I also (FINALLY) designed level 6. I added extra sections and polished up some elements that were making the level impossible if you didn’t play it perfectly. I did 2 other things as well: I made it so blocks can’t be pushed by any character other than the square (before you could just push blocks w/ anything) and I reduced horizontal movespeed in zero-g. There’s still a lot more I have to do, mainly ui/menu stuff and visual polish. Challenges: Black hole physics took me a while since my first few implementations were completely wrong, and then I locked in nd figured out how to make it pull correctly. Also, level design is proving to be surprisingly challenging, I rly didn’t think it would take this long, but what with conceptualizing + creating + playtesting each level, especially the later ones where I want to make them more complex and difficult, it eats up a lot of time per level. Even going back through older levels and tweaking them can take a while, cuz you gotta track down all the problematic sections and figure out how to fix them. I also have a humble 18 more days till school starts so I gotta lock in🙏 AI used, if any: None, level design is hard but its not THAT hard Plans for next time: Finish level 30, playtest levels 29 and 30, and hopefully get started on + finish a main menu and level select menu. Im so behind on my schedule it aint even funny so wish me luck"}, {"post_id": 49286, "ts": "2026-08-18T00:22:13Z", "hours": 10.0053, "text": "Unnamed Platformer - Devlog 15 Actually got a lot done over the last few days ig What I did: first off, I reset my old changes and made it so env tiles layer over obstacles. At first I tried to assign an individual character to each combination (spike in water, block in zero-gravity, etc etc) but that didn’t work since I couldn’t get them to lay over each other. So what I did is I split my statictilelist into two: statictilelist now held all non-moving entities like spikes, ground, etc. while envtilelist held all my environment tiles. Then I changed my map loading function to take two map strings: one assigned tiles based on entities and the other pass assigned them based on environment. And now I can lay environments over things without breaking my game! Yippee! I also fixed an issue where blocks could clip through obstacles in zero-g when you moved them upward. The issue was blocks unconditionally being mtv-moved when the player was below them, so the player forced them through anything. I added an extra check before mtv-moving and made obstacle detection variables global to fix it. I also ran into an issue where spikes would incorrectly kill you even if you were not touching them, just near: the issue was that I wasn’t running SAT collision, just going straight to death logic if the initial AABB check turned out true (I run an AABB check first because running SAT for everything makes the game super laggy). both of these lowkey took me a while 😭 As for level design I reworked level 6 (still can’t play it) and level 17 (finished), and I designed levels 18-25 (I attached a video of level 24). Also in the vid I switched shapes randomly, that’s just because I had different keybinds earlier and it was js muscle memory kicking in. Challenges: Aside from a bunch of small bugs, the biggest challenges were the issue where spikes would kill you even if you weren’t touching them and the issue with blocks being pushed up forever in zerog. Even then, for both issues it was still easy to fix since it was easy to diagnose and a few lines per fix, even if it took me a while to find those few lines 🥀🥀 However, there’s still an issue where blocks sink slightly upon spawning in zero-g. This makes it impossible to play level 6, so I’ll have to look into/rework/do something to zero-g logic because I really want to keep its existing level mechanic. AI used, if any: None 🔥 Plans for next time: Finish levels 26-30, finish level 6, and test all the levels to make sure they’re not too hard/impossible/possible to cheese. Aside from that, I’ll most likely bring back the texture thing I implemented last time cuz it did actually make the game run a bit smoother, but I’ll only do it for environment tiles. K bye guys"}, {"post_id": 46621, "ts": "2026-08-14T00:27:19Z", "hours": 10.0767, "text": "Unnamed Platformer - Devlog 14 I’m genuinely so done What I did: I designed levels 5 and 7-16 (ss of a few levels should be attached idk which they are). I have a cool idea in mind for level 6 but my current code makes it hard to implement, and I also have a cool idea in mind for level 17 but my code made it hard to implement. So I changed everything up like an idiot. My 17th level features a massive pool, but that requires me to draw 1000+ water tiles. Since I redraw tiles every frame, it causes a big load on the computer. So I had the brilliant idea of creating an sf::RenderTexture . spoiler it’s not so brilliant. That led to a massive chain reaction where there were a bunch of nullptr issues at first, which I spent about 40 minutes on before actually getting the game to run. Then everything was super grainy due to aliasing issues caused by drawing everything to a RenderTexture, PLUS since I was drawing everything at the start of the frame and not updating it, stuff like buttons and doors would never update. SO, my dumb ahh moved half my static/environment tiles to dynamictilelist , reserved for strictly blocks which are the only tiles that can change position, and I did this cuz these would draw every frame and they didn’t have the same grainy look as the ones drawn to a texture. the result is probably self explanatory. That caused SO MANY ISSUES that I can’t even begin to describe them all, so after 50 minutes I undid 50 minutes worth of changes, added some spaghetti code to make it a bit more presentable, and call it a day. Challenges: Level design was fun, and easy. I did that for all of yesterday and the first half-ish of today. The vain attempt at making my code more efficient by changing how static tiles were drawn and then going on to deeply regret it and consider undoing it all the next day, was not. Also I probably shouldn’t have bothered trying seeing as I was pretty tired anyway, but ig my stupidity/ambition/idek led me to try. I’m genuinely too tired to bother elaborating, but it goes somewhat like this: I started on the texture-caching thing -> I ran into nullptr errors -> I got those out of the way -> I ran into issues with rendering and updating -> out of frustration I undid all my progress and started anew -> I decided to implement anti-aliasing -> I will probably(definitely) reset my code to where I had been right before I decided to do this stupid implementation AI used, if any: none. If I had I would’ve probably been done with this bs by now. Plans for next time: Realistically I’ll likely just undo all the changes I made to drawing processes, find out how to draw environment tiles underneath other entities/obstacles (which will be useful for many of my levels with spikes or the like in environments), and…thats it. Also, for level design, I want to have all preliminary designs down by the end of this Sunday (3 more days), and then I can playtest and refine later. I wanna cry P.S. the level with the white room is level 6 and it’s currently unfinished lmao"}, {"post_id": 44761, "ts": "2026-08-10T19:13:08Z", "hours": 9.9139, "text": "Unnamed Platformer - Devlog 13 No motivation… What I did: I solved the issue of vertically stacked blocks clipping through each other and through the player, which was a pretty big chunk of my time since I went through like 10 different approaches and changed up a bunch of stuff along the way. I ended up taking out the SAT collision function I had built and just plugging mtvCheck() (which checks the mtv( )) and the movement logic straight into the collision loops instead. I had to reorder a good chunk of logic too since a lot of the clipping was coming from stuff resolving in the wrong order relative to other stuff. Also did some cleanup: deleted the grounded member off the block class since entity already has one and I was just using two variables for the same thing like an idiot. I added an R keybind so I can restart instantly instead of walking into a spike every time I want to reset (useful for testing + as an actual game feature). I also made the player’s rotation reset on spawn so you don’t respawn tilted at some weird angle from your last death and shrunk the spike hitbox down a bit from 20x20 to 18x18 because I was dying to one-pixel overlaps that looked like it shouldn’t have counted and that are pretty frustrating to deal with. Also did a bunch of level design. I’ve only done levels 1 through 4 so I lowkey gotta lock in. Challenges: The stacked block thing took forever because the symptoms kept changing depending on how many blocks were stacked, which direction they were pushed from, whether the player was involved, etc etc, so it never felt like I was chasing ONE bug, more like four bugs wearing a trenchcoat. Eventually I just started brute-force testing every combo I could think of (2 stacked, 3 stacked, stacked + pushed, stacked + player jumping into it) until I ran out of ways to break it. Also I ran into some issues when designing levels: blockonhead , which makes it so you cannot jump if a block is on your head, was triggering if any block was lined up above your head, even if it was like on a platform way above you. I managed to fix that, and other than that + the block issue there wasn’t too many big obstacles this time. AI used, if any: none, since I’m not using it at all for game design and didn’t need to use it to solve block clipping issues since I just brute forced a bunch of possible solutions. Plans for next time: More level design…I’ll try to get most of the levels done by next devlog. K bye guys"}, {"post_id": 37384, "ts": "2026-07-30T02:06:51Z", "hours": 9.8561, "text": "Unnamed Platformer - Devlog 12 Man* Realizes True Meaning of ‘If it ain’t broke, don’t fix it’ What I did: First I ported pushable blocks to SAT collision so they use the same system as the player and it’s not split between two systems. Well. That broke blocks. so I spent 2 hours or so cross referencing my old versions and adding and deleting changes till it started working again. After that, I made sure blocks moved properly in zero-g. (they didn’t so I had to fix that too) Aside from that, I made a bunch of miscellaneous changes, such as fixing level progression bugs and altering player constants, but most importantly making sure blocks worked properly. Somewhere along the line I was investigating how stacked blocks interacted. I noticed they were clipping through the ground because of collision checks happening after the position of blocks was updated, and after some thought I tried adding another collision check pass to my main game loop. It worked like a charm! I added two extra checks for safety and it stopped working like a charm. The issue is my checkCollisions function is hella inefficient. 500+ lines of searching through every character in the tilemap (36x64, plus an extra column for new lines making it 36x65=2340) 6 times (!!!) Not only that, in some cases (block/player collision detection) I was nesting full passes within full passes, which caused insane lag, especially with my SAT collision which does a lot of math each frame. So I decided I wanted it to be more efficient (spoiler: it’s not efficient yet). I split my old tilelist into static tiles and dynamic tiles…and instantly regretted it. Challenges: Basically when I split tilelist into two separate vectors ( statictilelist which is everything except for blocks + dynamictilelist which is just blocks since nothing else moves lmao), I think I accidentally deleted a lot of existing logic that was the duct tape to my spaghetti code**. Aside from that, when I passed through tilelist it always passed through every tile, but with my new logic I had to decide which one to use. my stupid ahh didnt realize that there might be a chance I have to pass through both of them though 😭 well guess what there were a lot more gaps in my logic. All of these combined into the logic I had spent the last few hours working so hard to perfect, falling apart in 5 seconds. Similar to the whole block to SAT thing I worked out most of the issues just by adding, tweaking, and removing a bunch of checks as well as looking back at my old logic to figure out what I forgot. Among these general changes I also added a new grounded member to the block class, and tried to get it to register if it’s on top of a player. Unfortunately it didn’t work. It’s ok I’ll brute force my way to the root of the problem tomorrow. (Btw this doesn’t even cover the issues I faced prior to this😭 ✌️ ) AI used, if any: Now that the core elements of the game (physics) are out of the way, I’ve pretty much been grinding through bugs myself since it’s just existing logic and I’m not really adding much that’s new or unfamiliar. Honestly, I think it’s gonna stay this way because I don’t intend to use AI to design the game, I was using it more to help solve physics issues and the like. Plans for next time: I’ll try to hopefully fix the new block clipping issues. then idek anymore. Maybe i shouldn’t have tried to build the engine from scratch. K bye guys *I’m not actually over 18 **Tuff line?"}, {"post_id": 35959, "ts": "2026-07-27T19:01:15Z", "hours": 9.8747, "text": "Unnamed Platformer - Devlog 11 Rotation is finally working! Mostly. Anyway I have to post now cuz of the 10 hour limit per devlog. What I did: I fully implemented rolling and rotation physics across all player shapes! Shapes now physically rotate based on movement speed, tip over cliff edges, and smoothly snap back to a flat face when you stop moving. I also added a feature where shapes automatically realign when entering water or zero-G. To make everything smooth and frame-rate independent, I overhauled the settling and snapping math using fmod for shortest-path rotation and wrap-around handling. Challenges: Getting the angle snapping and tipping logic to work was the biggest hurdle. Non-square shapes were getting locked out of tipping due to floating-point issues, which I fixed with an epsilon tolerance check. There are still a couple of bugs that I’ll tackle later, notably the fact that shapes sometimes spin an extra time upon settling. but the core system is more or less functional now. AI used, if any: I managed to work out the math myself but I needed to ask AI with help debugging. Plans for next time: I’ll probably work on some visual effects for the next couple days + fine-tune and debug my physics a bit more. K bye guys"}, {"post_id": 33845, "ts": "2026-07-24T02:43:36Z", "hours": 7.1331, "text": "Unnamed Platformer - Devlog 10 I’m tired 😭 What I did: I ported the rest of my entities over to SAT collision. Every tile that can be collided with now uses SAT. I refactored some of my functions to handle the new logic properly across the board, and got rid of the old standalone AABB collision code for ground tiles. I also decided to make pushable blocks hybrid for simplicity: aside from general environment collisions which use SAT, I didn’t change much of the old AABB code. I also added an O(1) center/radius projection for circles to fix random micro-stutters, and updated drawdebug() so it stops drawing every vertex and instead renders one dynamic vector targeting the nearest tile vertex. (Circles in SFML are actually 30-sided polygons, so earlier the collision checks were looking at 15 different axes + all those axes were being drawn in the debug overlay.) Challenges: Thankfully most of the porting to SAT stuff was easy, I only had a couple of minor setbacks here and there. However, the harder part was getting the circle center-to-vertex collision logic down. I had to find out how to do it + add completely new logic to my function + add checks in my collision code to determine if the shape was a circle + rewrite my drawdebug() code. It took a while and a lot of my sanity but I got it done in the end AI used, if any: Used AI to help debug the updated circle collision detection system + its separate debug overlay code. Plans for next time: I’m going to work on rolling physics for real. I hope it goes well 👍 K bye guys"}, {"post_id": 32739, "ts": "2026-07-22T02:37:49Z", "hours": 9.0553, "text": "Unnamed Platformer - Devlog 9 I was “busy” watching the World Cup bronze/final matches over the weekend. No way we got a 10 goal third place game while everyone started throwing hands at the end of the final😭 What I did: I finally got started on SAT collision like I said I would, and it’s actually working! Mostly. I built all the fundamentals so far: vertex extraction, edge normal calculation, projection ranges, minimum translation vector (MTV) calculation, etc etc. I hooked it into checkCollisions for ground tiles, and the MTV push resolution actually stops shapes from clipping through geometry now, and it’s also sign-corrected and whatnot so it always pushes the right direction. I also made a debug overlay that draws vertices and axis normals directly in the game window, which saved my sanity countless times and looks pretty cool too. On top of collision math I had to go back and fix 3 out of my 5 characters’ movement code because switching to SAT caused bugs in features that worked just fine under the old AABB system, aside from all the general bugs I had to deal with. The hexagon’s double jump stopped working entirely, circle’s acceleration started randomly resetting mid-sprint, and octagon’s wall jump turned into an absolute mess (more on that below). The main thing was that my old flags for checking wall collisions were set with assumptions that crumble once you switch from checking 4 fixed direction to a bunch of axes. Challenges: Oh boy… The wall jump bug was hella frustrating: after switching to SAT, the octagon would do exactly one wall jump and then just slide down the second, no matter how many times I hit jump. It took me forever to figure out it was a chain of three separate bugs stacked on top of each other: wall contact flags getting cleared before the function ever read them, my walljumped flag never resetting between wall touches so it permanently locked my horizontal movement, and then once THAT was fixed, SAT was re-zeroing my wall-jump velocity on the same frame it fired because the player was technically still overlapping the wall geometry. So I fixed those and immediately got a NEW bug where wall jumping turned into a pogo stick that spam-bounced me up the wall, because a vertical MTV was getting misread as “landed on the ground,” which reset the wall jump lock and let it refire every single frame. Also spent quite a bit of time before realizing this one line I had, if (grounded) velocity.y = 0 , worked fine with AABB but not so much with SAT’s own grounding logic, since my SAT function sets grounded = true when it sees downward velocity, and that line was zeroing velocity before SAT checked it. Removed it and a lot of my bugs disappeared. AI used, if any: SAT math I mostly figured out myself, after reading through a ton of Stack Overflow threads, articles, watching a lot of YT videos, etc. on my own time. I did use AI to clarify/debug a couple of parts though. However, I ended up needing it a lot more for debugging the problems that stemmed from it, i.e. the octagon, hexagon and circle issues. Plans for next time: SAT works for ground tiles but I’ve still got all my other entities on the old AABB system so I gotta port those over. Although, probably the biggest thing is trying to make my code more efficient because sometimes the game randomly slows down/freezes and makes random clips occur. If this isn’t lag (which it might not be, I could just be stupid) I’ll still have to look into whats happening. Then, once ground collision is 100% finished: rolling physics, aka the reason I made this change in the first place. Gonna have to look into the math/physics behind that, but it should be pretty easy since I already got this down. Once this is done, the shapes should be tipping and rolling around instead of just sliding around like ice cubes. We’ll see how that goes. K bye guys"}, {"post_id": 30455, "ts": "2026-07-18T00:46:19Z", "hours": 6.8525, "text": "Unnamed Platformer - Devlog 8 Bro idk What I did: I finally wrapped up the character roster by implementing and debugging the last two shapes: the hexagon and the octagon. The biggest milestone was completely overhauling and fixing the wall jump implementation for the octagon (which took me like 1.5 hrs out of which 50 minutes worth of changes were discarded). I ended up shifting all the wall-jump physics directly into the jump event handler, rather than splitting the logic between two different functions (my jump and updatepos functions). This allowed me to make it so I can properly maintain and destroy momentum for wall bounces On top of physics stuff, I built the level progression system. When you touch the exit tile, the game increases your level index and loads the next stage. It’s finally starting to feel like a real game! Although, not really, since every level after the second is the exact same weird ahh testing level cuz I needed to make sure my system worked. Challenges: The real nightmare was the octagon’s wall jump. I spent about 50 minutes writing changes because the physics wouldn’t cooperate, only to discard them because I got too confused 🥀I had half of the wall jump math in jump() and the other half in updatepos() and it was making the normal movement code immediately overwrite/neutralize the walljump code the very next frame. Another thing was making it so you couldnt just hold down the w or up key and automatically bounce up forever. I had to add an input debounce check so you have to release+re-tap the key to jump again. Everything else was honestly smooth sailing and any other bugs took maybe <15 mins to solve. AI used, if any: I didn’t use much AI, since the two big features I added were pretty easy to implement/debug, but I did ask it to help me a bit with wall jump logic since I was pretty fried. Plans for next time: Now that the physics is working, I’ve decided I want to get rid of it all. Sliding shapes feel hella unnatural (also the hitboxes are pretty weird), so I’ve decided on making the shapes roll around/have accurate hitboxes using SAT (Separating Axis Theorem) vector math. I asked Gemini how long it would take and it literally told me to avoid it if I can 😭 so we’ll see how many hairs I lose over the course of trying to implement SAT. It’ll probably be all I do from now until around the start of August when I’ll be going on vacation K bye guys"}, {"post_id": 29243, "ts": "2026-07-16T00:59:37Z", "hours": 6.4681, "text": "Unnamed Platformer - Devlog 7 I typed words into a code editor and made shapes move around What I did: I finally took on the shape-switching system and got it working! I had to completely change how the player class worked, so I made it into a pure virtual class to handle polymorphism (which lets me switch between different shapes) and replaced the old static player setup with a dynamic shape-switching state w/ unique pointers. For shapes so far I implemented the circle with rolling physics and friction, and the triangle which can teleport forward a short distance. Also, keeping source code in header files was causing circular include errors, so I reorganized all the player class code into a brand new players.cpp file. And finally I made it so falling below the screen kills the player, which is a pretty small feature but still. Pretty much what was happening was that I needed to access my tilesettings.h file in my players.h class for movement-related checks, but tilesettings.h also needed players.h for hitbox/collision stuff. So I had to take out my code from my player header file and move it to player.cpp , which was lowkey a nightmare since I ran into a bunch of compiler and linker errors that took me an hour to fix😭 Anyway, Gemini helped rescue me (since my Claude 5-hour limit somehow ended after the first question I asked it today), so thanks Gemini. Challenges: Pretty chill today, since today was more designing and testing new features that were easy to implement; however the real nightmare was splitting my files. Moving code to players.cpp broke everything with a bunch of “multiple definition” linker errors. I didn’t define my global variables as inline at first, but since they were getting defined across many files I had mark them as inline. Also, the triangle’s teleport mechanic let you phase into solid tiles at first, so I made a position prediction system using swept AABB bounds. In fact, creating this swept check was the feature that needed me to call tilesettings.h in players.h in the first place, which led to my cortisol spiking when the compiler stopped working for an hour AI used, if any: Used Gemini to help me figure out why the compiler+linker were throwing errors, and some basic debugging in my other features. Plans for next time: I’m gonna design my other two shapes now (octagon and hexagon), then start making this into an actual game with multiple levels, progressing to the next level when you reach the finish, etc etc. Also, I feel like the sliding movement is kinda unnatural, but idk if I’m going to change it because I already have a whole system down and starting from scratch would be a chore. Anyway, I’ll think about it. K bye guys"}, {"post_id": 28035, "ts": "2026-07-14T01:42:05Z", "hours": 4.6406, "text": "Unnamed Platformer - Devlog 6 Guess what? More block physics issues! I’m gonna lose my mind! What I did: Implemented logic with the buttons and doors; now, being on a button opens a corresponding door. Also fixed EVEN MORE BUGS with block pushing logic. I also resolved block-block vertical clipping and horizontal stacking bugs. I replaced the ground collision function I had made with a manual check for blocks landing on other blocks; groundCollide (that function) was not accounting for if a block landed on top of the player. This fixes vertical clipping through players and blocks and unintentional behavior with horizontally stacked blocks. Additionally, I added a system to make sure you can’t get crushed by a door too. When I first discovered that could happen, I implemented a half baked system, but it didn’t work since it pretty much made the block/player fall through the door even if the button hadn’t been pressed prior. I replaced the old block-crush prevention logic with a new system. Now the button class has another variable, presscheck , which acts like sticky keys (idk how else to put it) even after you’re not on the button. It checks for if a player or block is within the closed door’s hitbox and if so props the door open until they leave, but it can only register that after you push the button. Challenges: Buttons not changing color; color change logic was in my constructor and not the draw function so it never updated. Other than that, general implementation was also tricky to plan out because I had to decide how they were gonna work (how buttons would be linked to doors; decided on an ID system) and then how to implement that (using dynamic casts just as my button class uses). And then the block clipping glitch was another nightmare, though it did take me less than an hour which is nice. Also, it took me a while to think of how I would figure out how to make doors not close on players/blocks, but I thought up a solution pretty quickly which is nice 👍 AI used, if any: Used Claude to help me figure out the part that stops the block from falling through the player (I was genuinely™ too exhausted with dealing with bugs to try to solve it myself 😭😭) + used Gemini and a bit of Claude for general debugging. Plans for next time: I’ll polish up some visual stuff, but I think I’ll leave block-related bugs alone for now. As you can see there are some clipping issues still with the door, but idk if I want to tackle those right now. Either way my main focus for next time (and like all of the next week or two) will be getting the shape-switching system down. I’ll also try to create some map layouts that force the player to utilize block placement on buttons to navigate doors, because it would be a shame for me to have spent all my sanity on a feature only like 5 levels use. K bye guys P.S. Last time, when I said I spent all weekend working on button-related stuff, I meant the pushable blocks too (since those can activate the buttons)"}, {"post_id": 27428, "ts": "2026-07-12T23:59:57Z", "hours": 5.0344, "text": "Unnamed Platformer - Devlog 5 I pretty much spent the last weekend working entirely on button-related stuff. Turns out there were a lot of bugs and other physics-related issues I had to address. Anyway I think they’re all good now. What I did: Day 1: I fixed a bug where nested loops using the same name (pos) caused only the first pushable block to register collisions. I also implemented a side-detection fix so the player doesn’t accidentally push blocks when standing on top of them + added a border/outline to pushable blocks for visual clarity. I also started work on button and door tile classes. Day 2: I made it so you can push blocks vertically in zero-gravity. A really big fix was a global physics bug. I had been using a gravity called blockgravity for block physics, but since it was a global variable, one block’s position dictated all the other’s physics. E.g. one block in a zero-g tile meant everything else was now unable to fall. I moved blockgravity into the block class and now a block entering a zero-g zone floats without shutting off gravity for every other block on the map. I also decided on two new features: a button that can be stood upon/have a block placed on it, and a door that opens when its button is pushed. I added each one’s sprite and loaded them into my map. Also, I made another big change to my plans: having spend so much time on block physics, I’ve decided they’ll become a core feature of the game and not just a small gimmick of the triangle shape. Challenges: The hardest problem (by miles) was the block push collision. the issue turned out to be one loop variable shadowing another, which meant only the first block in the list was ever processed. Another tricky bug was zerogactive being reset before the block push loop ran, meaning zero-g vertical pushing never triggered. Ironically I ended up removing the zero-g check because if you’re going to push a block vertically, you’re not going to be on solid ground anyway. Also I accidentally mismatched curly brackets so that made life a lot harder. Also, I faced a bunch of other bugs while trying to polish up collision. Imma be honest, about an hour or so from this devlog was useless cuz it was me trying to implement a solution, confusing myself, and just discarding all my changes😭💔 Also, I spent like 20 minutes trying to get the button looking good (it’s supposed to be an octagon, but the sides are uneven). AI used, if any: I used Claude for debugging my physics code, as well as helping me figure out why the upwards/downwards block push wasn’t working. Plans for next time: I’m going to try and begin implementing the 5 player shapes and their power-ups. I’ll start with the circle probably, since it seems the simplest (just get faster over time). Also, I’m going to make it so that each button actually is linked to a door, since right now they’re just visuals. K bye guys"}, {"post_id": 26274, "ts": "2026-07-10T23:35:39Z", "hours": 8.5728, "text": "Unnamed Platformer - Devlog 4 I hate AABB with a passion. I spent 8.5 hours over 2 days (hardest lock in yet 🔥) on 2 features and Im pretty sure there are still bugs in each. What I did: On day 1 I added collision detection for pretty much all my objects, added some custom physics (e.g. water and zero g now have custom physics), and implemented AABB collision. Since I got it working yesterday(mostly), I deleted the initial ground class I had for testing SFML and most features, as well as any related functions like the check ground function in the player class. On day 2 I spent 4 hours trying to get the block to push. It took me a while cuz I initially tried to just copy the groundcollide() function and tweak whatever I needed to. However that didn’t work, so after hitting up Stack Overflow + Claude I realized I had to change up a LOT of my pre existing code. I added a master entity class for anything that is affected by physics (all players + the block + more features in the future probably) then added more functions and commands in my checkCollisions function in order to get my block mechanic mostly working. I also ended up adding many more features to my block class(velocity, gravity, and a grounded check) since it has to react to physics and the environment. Overall the introduction of an entity class that everything else inherits from was a big help in getting the game to work properly. Challenges: my game crashed when I attempted to put the check collision function in main.cpp; then, implementing water and zero-g was a lot of trial and error not only to find physics that felt fluid but also because there were a lot of bugs in the logic as well as bugs that stopped the game from running at all. Also, it took me a while to wrap my head around AABB collision; I literally had to draw it out on a piece of paper and ask Claude to grasp the concept 😭 During bug fixes, I ended up breaking a bunch of stuff/realizing a bunch of stuff was still broken and spending a bunch of time fixing it. For example, while trying to fix collision, I ended up discovering a bug in my water/zero-g physics, and then while trying to fix that I broke my spring logic too. And creating the logic for pushing the block is a whole other can of worms. It took me 4 hours of implementing different strategies and adding different functions only to have a half baked block-pushing function. 😭 It does kind of work, but you can only push one block: any other blocks act like normal ground tiles. AI used, if any: I asked Claude for help on how to tackle block pushing logic, as well as helping me understand AABB collision. Plans for next time: I’m going to try and hopefully get all the block-pushing logic done without any issues, then fix up any collision-based bugs and work on implementing the rest of my player shapes. K bye guys"}, {"post_id": 25091, "ts": "2026-07-09T02:23:55Z", "hours": 4.3644, "text": "Unnamed Platformer - Devlog 3 My game is kind of coming together! It’ll still be many weeks, but I did something! What I did: finished my tile map parser (I decided to use a unique pointer to parse through each tile type and draw the according one, after a bit of thought). I also started working on collision detection. I created a basic checkCollisions function and added getGlobalBounds to every tile class. Before I did that though I had to do some research on Axis-Aligned Bounding Box collision, and how to implement it in SFML. I’m still far from done, but that’s tomorrow’s problem. Challenges: implementing the map drawing functions (couldn’t figure out how to get the draw functions in the classes to match up with the main class), and after that I was having a lot of trouble with the pointer logic I had implemented (had to use std::move, also there were errors in my file importing structure); then after I got that to work, and implemented the parser into main.cpp, it ended up causing my entire program to crash when I ran build 😭Ended up asking Claude for help for how to fix it; it turned out to be how I had formatted my levels and my level-parsing loop for assigning tile types to tilemap characters. Then lava, water, and zero-g block weren’t drawing properly either. After spending like an hour trying to decode why, I realized sf::Color’s transparency had to be an 8-bit integer rather than a decimal between 0 and 1. Also my doublespike was not drawing properly, so I made it 2 separate convexShape’s rather than 1. Apparently you can’t have mere points holding a single convexShape together, which kind of sucks. AI used, if any: Like I mentioned, I asked Claude for help on how to fix my level loading feature (it ended up being like 3 minute details) and also used it when debugging my initial collision functions (I ended up replacing <10 lines total by its suggestion). Plans for next time: I’m going to try to finish collision. That’s my entire goal, since I still don’t know entirely how I’m gonna deal with every collision possible and it might end up taking me a long time depending on the number of mistakes I make/bugs that pop up. K bye guys (btw the music in the background is because I was listening to music while I was working on this)"}, {"post_id": 23883, "ts": "2026-07-07T02:36:17Z", "hours": 3.9897, "text": "Unnamed Platformer - Devlog 2 I was a little busy yesterday but we’re back on track now. What I did: I think I got a solid amount done today and for a bit of time yesterday: I added a camera feature that scrolls with the player, created the tile map and tile types, and designed the first part of the tile map parser; also changed the background slightly and researched more on building tilemap loaders in SFML (YouTube videos + looking at Github repos and articles). Challenges: For a zero-gravity section I’m thinking of adding, I wanted to put thin gray stripes in those sections. I couldn’t figure out how to do that, so I just decided to depict it as a translucent white block. Also determining the coordinates of the spring pad in the game took a while too. Overall, my other challenges were mostly small bugs and didnt stand out too much. AI used, if any: Used Claude for debugging the switch case for my tile map parser. Also, not AI, but my camera system was more or less entirely designed using a YouTube video that I’ll credit in my readme later. Plans for next time: I want to finish my tile map parser and get an actual level loaded. I’m also going to start deciding what the UI will look like for the main menu, level selects, and pause menu. K bye guys"}, {"post_id": 22443, "ts": "2026-07-04T22:13:21Z", "hours": 3.4311, "text": "Unnamed Platformer - Devlog 1 It’s finally time for me to lock in. This is gonna be a big project to which I hope to add a lot of content, and I’m hoping I can accumulate a lot of good hours from this project. What I did: I set up SFML (the library I’m using to code this game), set up the required files, watched a lot of YouTube videos to get more familiar with SFML, and coded a basic thing where you control a square and jump around. Challenges: This is like my second time using SFML (I used it once for a small project a while ago), so I’m not that familiar with it. No worries though, as it’s nothing a bunch of YouTube videos can’t fix. Also, today was kind of a refresher for my barely existent SFML skills. AI used, if any: I used Claude for learning how to set up SFML and asking it for help on how to fix my jump button not working. (I was missing two characters. : \\ ) Plans for next time: I’ll try to add actual platforms, maybe working obstacles as well. I’ll focus on adding a menu some other time, and actual styling will come much later so the game is gonna look ahh for now. All my devlogs will pretty much follow the format of this one(accomplishments, challenges, plans, additional notes) so that I can lazily copy-paste the same template when I don’t feel like writing a whole new devlog each devlog will feel connected/cohesive and make it easier for readers to follow along on my journey."}]...
|
Title: Stardancer (formerly Unnamed Platformer) by Title: Stardancer (formerly Unnamed Platformer) by @zahran | Stardance
Devlogs:
Unnamed Platformer - Devlog 1 It’s finally time for me to lock in. This is gonna be a big project to which I hope to add a lot of content, and I’m hoping I can accumulate a lot of good hours from this project. What I did: I set up SFML (the library I’m using to code this game), set up the required files, watched a lot of YouTube videos to get more familiar with SFML, and coded a basic thing where you control a square and jump around. Challenges: This is like my second time using SFML (I used it once for a small project a while ago), so I’m not that familiar with it. No worries though, as it’s nothing a bunch of YouTube videos can’t fix. Also, today was kind of a refresher for my barely existent SFML skills. AI used, if any: I used Claude for learning how to set up SFML and asking it for help on how to fix my jump button not working. (I was missing two characters. : \ ) Plans for next time: I’ll try to add actual platforms, maybe working obstacles as well. I’ll focus on adding a menu some other time, and actual styling will come much later so the game is gonna look ahh for now. All my devlogs will pretty much follow the format of this one(accomplishments, challenges, plans, additional notes) so that I can lazily copy-paste the same template when I don’t feel like writing a whole new devlog each devlog will feel connected/cohesive and make it easier for readers to follow along on my journey.
Unnamed Platformer - Devlog 2 I was a little busy yesterday but we’re back on track now. What I did: I think I got a solid amount done today and for a bit of time yesterday: I added a camera feature that scrolls with the player, created the tile map and tile types, and designed the first part of the tile map parser; also changed the background slightly and researched more on building tilemap loaders in SFML (YouTube videos + looking at Github repos and articles). Challenges: For a zero-gravity section I’m thinking of adding, I wanted to put thin gray stripes in those sections. I couldn’t figure out how to do that, so I just decided to depict it as a translucent white block. Also determining the coordinates of the spring pad in the game took a while too. Overall, my other challenges were mostly small bugs and didnt stand out too much. AI used, if any: Used Claude for debugging the switch case for my tile map parser. Also, not AI, but my camera system was more or less entirely designed using a YouTube video that I’ll credit in my readme later. Plans for next time: I want to finish my tile map parser and get an actual level loaded. I’m also going to start deciding what the UI will look like for the main menu, level selects, and pause menu. K bye guys
Unnamed Platformer - Devlog 3 My game is kind of coming together! It’ll still be many weeks, but I did something! What I did: finished my tile map parser (I decided to use a unique pointer to parse through each tile type and draw the according one, after a bit of thought). I also started working on collision detection. I created a basic checkCollisions function and added getGlobalBounds to every tile class. Before I did that though I had to do some research on Axis-Aligned Bounding Box collision, and how to implement it in SFML. I’m still far from done, but that’s tomorrow’s problem. Challenges: implementing the map drawing functions (couldn’t figure out how to get the draw functions in the classes to match up with the main class), and after that I was having a lot of trouble with the pointer logic I had implemented (had to use std::move, also there were errors in my file importing structure); then after I got that to work, and implemented the parser into main.cpp, it ended up causing my entire program to crash when I ran build 😭Ended up asking Claude for help for how to fix it; it turned out to be how I had formatted my levels and my level-parsing loop for assigning tile types to tilemap characters. Then lava, water, and zero-g block weren’t drawing properly either. After spending like an hour trying to decode why, I realized sf::Color’s transparency had to be an 8-bit integer rather than a decimal between 0 and 1. Also my doublespike was not drawing properly, so I made it 2 separate convexShape’s rather than 1. Apparently you can’t have mere points holding a single convexShape together, which kind of sucks. AI used, if any: Like I mentioned, I asked Claude for help on how to fix my level loading feature (it ended up being like 3 minute details) and also used it when debugging my initial collision functions (I ended up replacing <10 lines total by its suggestion). Plans for next time: I’m going to try to finish collision. That’s my entire goal, since I still don’t know entirely how I’m gonna deal with every collision possible and it might end up taking me a long time depending on the number of mistakes I make/bugs that pop up. K bye guys (btw the music in the background is because I was listening to music while I was working on this)
Unnamed Platformer - Devlog 4 I hate AABB with a passion. I spent 8.5 hours over 2 days (hardest lock in yet 🔥) on 2 features and Im pretty sure there are still bugs in each. What I did: On day 1 I added collision detection for pretty much all my objects, added some custom physics (e.g. water and zero g now have custom physics), and implemented AABB collision. Since I got it working yesterday(mostly), I deleted the initial ground class I had for testing SFML and most features, as well as any related functions like the check ground function in the player class. On day 2 I spent 4 hours trying to get the block to push. It took me a while cuz I initially tried to just copy the groundcollide() function and tweak whatever I needed to. However that didn’t work, so after hitting up Stack Overflow + Claude I realized I had to change up a LOT of my pre existing code. I added a master entity class for anything that is affected by physics (all players + the block + more features in the future probably) then added more functions and commands in my checkCollisions function in order to get my block mechanic mostly working. I also ended up adding many more features to my block class(velocity, gravity, and a grounded check) since it has to react to physics and the environment. Overall the introduction of an entity class that everything else inherits from was a big help in getting the game to work properly. Challenges: my game crashed when I attempted to put the check collision function in main.cpp; then, implementing water and zero-g was a lot of trial and error not only to find physics that felt fluid but also because there were a lot of bugs in the logic as well as bugs that stopped the game from running at all. Also, it took me a while to wrap my head around AABB collision; I literally had to draw it out on a piece of paper and ask Claude to grasp the concept 😭 During bug fixes, I ended up breaking a bunch of stuff/realizing a bunch of stuff was still broken and spending a bunch of time fixing it. For example, while trying to fix collision, I ended up discovering a bug in my water/zero-g physics, and then while trying to fix that I broke my spring logic too. And creating the logic for pushing the block is a whole other can of worms. It took me 4 hours of implementing different strategies and adding different functions only to have a half baked block-pushing function. 😭 It does kind of work, but you can only push one block: any other blocks act like normal ground tiles. AI used, if any: I asked Claude for help on how to tackle block pushing logic, as well as helping me understand AABB collision. Plans for next time: I’m going to try and hopefully get all the block-pushing logic done without any issues, then fix up any collision-based bugs and work on implementing the rest of my player shapes. K bye guys
Unnamed Platformer - Devlog 5 I pretty much spent the last weekend working entirely on button-related stuff. Turns out there were a lot of bugs and other physics-related issues I had to address. Anyway I think they’re all good now. What I did: Day 1: I fixed a bug where nested loops using the same name (pos) caused only the first pushable block to register collisions. I also implemented a side-detection fix so the player doesn’t accidentally push blocks when standing on top of them + added a border/outline to pushable blocks for visual clarity. I also started work on button and door tile classes. Day 2: I made it so you can push blocks vertically in zero-gravity. A really big fix was a global physics bug. I had been using a gravity called blockgravity for block physics, but since it was a global variable, one block’s position dictated all the other’s physics. E.g. one block in a zero-g tile meant everything else was now unable to fall. I moved blockgravity into the block class and now a block entering a zero-g zone floats without shutting off gravity for every other block on the map. I also decided on two new features: a button that can be stood upon/have a block placed on it, and a door that opens when its button is pushed. I added each one’s sprite and loaded them into my map. Also, I made another big change to my plans: having spend so much time on block physics, I’ve decided they’ll become a core feature of the game and not just a small gimmick of the triangle shape. Challenges: The hardest problem (by miles) was the block push collision. the issue turned out to be one loop variable shadowing another, which meant only the first block in the list was ever processed. Another tricky bug was zerogactive being reset before the block push loop ran, meaning zero-g vertical pushing never triggered. Ironically I ended up removing the zero-g check because if you’re going to push a block vertically, you’re not going to be on solid ground anyway. Also I accidentally mismatched curly brackets so that made life a lot harder. Also, I faced a bunch of other bugs while trying to polish up collision. Imma be honest, about an hour or so from this devlog was useless cuz it was me trying to implement a solution, confusing myself, and just discarding all my changes😭💔 Also, I spent like 20 minutes trying to get the button looking good (it’s supposed to be an octagon, but the sides are uneven). AI used, if any: I used Claude for debugging my physics code, as well as helping me figure out why the upwards/downwards block push wasn’t working. Plans for next time: I’m going to try and begin implementing the 5 player shapes and their power-ups. I’ll start with the circle probably, since it seems the simplest (just get faster over time). Also, I’m going to make it so that each button actually is linked to a door, since right now they’re just visuals. K bye guys
Unnamed Platformer - Devlog 6 Guess what? More block physics issues! I’m gonna lose my mind! What I did: Implemented logic with the buttons and doors; now, being on a button opens a corresponding door. Also fixed EVEN MORE BUGS with block pushing logic. I also resolved block-block vertical clipping and horizontal stacking bugs. I replaced the ground collision function I had made with a manual check for blocks landing on other blocks; groundCollide (that function) was not accounting for if a block landed on top of the player. This fixes vertical clipping through players and blocks and unintentional behavior with horizontally stacked blocks. Additionally, I added a system to make sure you can’t get crushed by a door too. When I first discovered that could happen, I implemented a half baked system, but it didn’t work since it pretty much made the block/player fall through the door even if the button hadn’t been pressed prior. I replaced the old block-crush prevention logic with a new system. Now the button class has another variable, presscheck , which acts like sticky keys (idk how else to put it) even after you’re not on the button. It checks for if a player or block is within the closed door’s hitbox and if so props the door open until they leave, but it can only register that after you push the button. Challenges: Buttons not changing color; color change logic was in my constructor and not the draw function so it never updated. Other than that, general implementation was also tricky to plan out because I had to decide how they were gonna work (how buttons would be linked to doors; decided on an ID system) and then how to implement that (using dynamic casts just as my button class uses). And then the block clipping glitch was another nightmare, though it did take me less than an hour which is nice. Also, it took me a while to think of how I would figure out how to make doors not close on players/blocks, but I thought up a solution pretty quickly which is nice 👍 AI used, if any: Used Claude to help me figure out the part that stops the block from falling through the player (I was genuinely™ too exhausted with dealing with bugs to try to solve it myself 😭😭) + used Gemini and a bit of Claude for general debugging. Plans for next time: I’ll polish up some visual stuff, but I think I’ll leave block-related bugs alone for now. As you can see there are some clipping issues still with the door, but idk if I want to tackle those right now. Either way my main focus for next time (and like all of the next week or two) will be getting the shape-switching system down. I’ll also try to create some map layouts that force the player to utilize block placement on buttons to navigate doors, because it would be a shame for me to have spent all my sanity on a feature only like 5 levels use. K bye guys P.S. Last time, when I said I spent all weekend working on button-related stuff, I meant the pushable blocks too (since those can activate the buttons)
Unnamed Platformer - Devlog 7 I typed words into a code editor and made shapes move around What I did: I finally took on the shape-switching system and got it working! I had to completely change how the player class worked, so I made it into a pure virtual class to handle polymorphism (which lets me switch between different shapes) and replaced the old static player setup with a dynamic shape-switching state w/ unique pointers. For shapes so far I implemented the circle with rolling physics and friction, and the triangle which can teleport forward a short distance. Also, keeping source code in header files was causing circular include errors, so I reorganized all the player class code into a brand new players.cpp file. And finally I made it so falling below the screen kills the player, which is a pretty small feature but still. Pretty much what was happening was that I needed to access my tilesettings.h file in my players.h class for movement-related checks, but tilesettings.h also needed players.h for hitbox/collision stuff. So I had to take out my code from my player header file and move it to player.cpp , which was lowkey a nightmare since I ran into a bunch of compiler and linker errors that took me an hour to fix😭 Anyway, Gemini helped rescue me (since my Claude 5-hour limit somehow ended after the first question I asked it today), so thanks Gemini. Challenges: Pretty chill today, since today was more designing and testing new features that were easy to implement; however the real nightmare was splitting my files. Moving code to players.cpp broke everything with a bunch of “multiple definition” linker errors. I didn’t define my global variables as inline at first, but since they were getting defined across many files I had mark them as inline. Also, the triangle’s teleport mechanic let you phase into solid tiles at first, so I made a position prediction system using swept AABB bounds. In fact, creating this swept check was the feature that needed me to call tilesettings.h in players.h in the first place, which led to my cortisol spiking when the compiler stopped working for an hour AI used, if any: Used Gemini to help me figure out why the compiler+linker were throwing errors, and some basic debugging in my other features. Plans for next time: I’m gonna design my other two shapes now (octagon and hexagon), then start making this into an actual game with multiple levels, progressing to the next level when you reach the finish, etc etc. Also, I feel like the sliding movement is kinda unnatural, but idk if I’m going to change it because I already have a whole system down and starting from scratch would be a chore. Anyway, I’ll think about it. K bye guys
Unnamed Platformer - Devlog 8 Bro idk What I did: I finally wrapped up the character roster by implementing and debugging the last two shapes: the hexagon and the octagon. The biggest milestone was completely overhauling and fixing the wall jump implementation for the octagon (which took me like 1.5 hrs out of which 50 minutes worth of changes were discarded). I ended up shifting all the wall-jump physics directly into the jump event handler, rather than splitting the logic between two different functions (my jump and updatepos functions). This allowed me to make it so I can properly maintain and destroy momentum for wall bounces On top of physics stuff, I built the level progression system. When you touch the exit tile, the game increases your level index and loads the next stage. It’s finally starting to feel like a real game! Although, not really, since every level after the second is the exact same weird ahh testing level cuz I needed to make sure my system worked. Challenges: The real nightmare was the octagon’s wall jump. I spent about 50 minutes writing changes because the physics wouldn’t cooperate, only to discard them because I got too confused 🥀I had half of the wall jump math in jump() and the other half in updatepos() and it was making the normal movement code immediately overwrite/neutralize the walljump code the very next frame. Another thing was making it so you couldnt just hold down the w or up key and automatically bounce up forever. I had to add an input debounce check so you have to release+re-tap the key to jump again. Everything else was honestly smooth sailing and any other bugs took maybe <15 mins to solve. AI used, if any: I didn’t use much AI, since the two big features I added were pretty easy to implement/debug, but I did ask it to help me a bit with wall jump logic since I was pretty fried. Plans for next time: Now that the physics is working, I’ve decided I want to get rid of it all. Sliding shapes feel hella unnatural (also the hitboxes are pretty weird), so I’ve decided on making the shapes roll around/have accurate hitboxes using SAT (Separating Axis Theorem) vector math. I asked Gemini how long it would take and it literally told me to avoid it if I can 😭 so we’ll see how many hairs I lose over the course of trying to implement SAT. It’ll probably be all I do from now until around the start of August when I’ll be going on vacation K bye guys
Unnamed Platformer - Devlog 9 I was “busy” watching the World Cup bronze/final matches over the weekend. No way we got a 10 goal third place game while everyone started throwing hands at the end of the final😭 What I did: I finally got started on SAT collision like I said I would, and it’s actually working! Mostly. I built all the fundamentals so far: vertex extraction, edge normal calculation, projection ranges, minimum translation vector (MTV) calculation, etc etc. I hooked it into checkCollisions for ground tiles, and the MTV push resolution actually stops shapes from clipping through geometry now, and it’s also sign-corrected and whatnot so it always pushes the right direction. I also made a debug overlay that draws vertices and axis normals directly in the game window, which saved my sanity countless times and looks pretty cool too. On top of collision math I had to go back and fix 3 out of my 5 characters’ movement code because switching to SAT caused bugs in features that worked just fine under the old AABB system, aside from all the general bugs I had to deal with. The hexagon’s double jump stopped working entirely, circle’s acceleration started randomly resetting mid-sprint, and octagon’s wall jump turned into an absolute mess (more on that below). The main thing was that my old flags for checking wall collisions were set with assumptions that crumble once you switch from checking 4 fixed direction to a bunch of axes. Challenges: Oh boy… The wall jump bug was hella frustrating: after switching to SAT, the octagon would do exactly one wall jump and then just slide down the second, no matter how many times I hit jump. It took me forever to figure out it was a chain of three separate bugs stacked on top of each other: wall contact flags getting cleared before the function ever read them, my walljumped flag never resetting between wall touches so it permanently locked my horizontal movement, and then once THAT was fixed, SAT was re-zeroing my wall-jump velocity on the same frame it fired because the player was technically still overlapping the wall geometry. So I fixed those and immediately got a NEW bug where wall jumping turned into a pogo stick that spam-bounced me up the wall, because a vertical MTV was getting misread as “landed on the ground,” which reset the wall jump lock and let it refire every single frame. Also spent quite a bit of time before realizing this one line I had, if (grounded) velocity.y = 0 , worked fine with AABB but not so much with SAT’s own grounding logic, since my SAT function sets grounded = true when it sees downward velocity, and that line was zeroing velocity before SAT checked it. Removed it and a lot of my bugs disappeared. AI used, if any: SAT math I mostly figured out myself, after reading through a ton of Stack Overflow threads, articles, watching a lot of YT videos, etc. on my own time. I did use AI to clarify/debug a couple of parts though. However, I ended up needing it a lot more for debugging the problems that stemmed from it, i.e. the octagon, hexagon and circle issues. Plans for next time: SAT works for ground tiles but I’ve still got all my other entities on the old AABB system so I gotta port those over. Although, probably the biggest thing is trying to make my code more efficient because sometimes the game randomly slows down/freezes and makes random clips occur. If this isn’t lag (which it might not be, I could just be stupid) I’ll still have to look into whats happening. Then, once ground collision is 100% finished: rolling physics, aka the reason I made this change in the first place. Gonna have to look into the math/physics behind that, but it should be pretty easy since I already got this down. Once this is done, the shapes should be tipping and rolling around instead of just sliding around like ice cubes. We’ll see how that goes. K bye guys
Unnamed Platformer - Devlog 10 I’m tired 😭 What I did: I ported the rest of my entities over to SAT collision. Every tile that can be collided with now uses SAT. I refactored some of my functions to handle the new logic properly across the board, and got rid of the old standalone AABB collision code for ground tiles. I also decided to make pushable blocks hybrid for simplicity: aside from general environment collisions which use SAT, I didn’t change much of the old AABB code. I also added an O(1) center/radius projection for circles to fix random micro-stutters, and updated drawdebug() so it stops drawing every vertex and instead renders one dynamic vector targeting the nearest tile vertex. (Circles in SFML are actually 30-sided polygons, so earlier the collision checks were looking at 15 different axes + all those axes were being drawn in the debug overlay.) Challenges: Thankfully most of the porting to SAT stuff was easy, I only had a couple of minor setbacks here and there. However, the harder part was getting the circle center-to-vertex collision logic down. I had to find out how to do it + add completely new logic to my function + add checks in my collision code to determine if the shape was a circle + rewrite my drawdebug() code. It took a while and a lot of my sanity but I got it done in the end AI used, if any: Used AI to help debug the updated circle collision detection system + its separate debug overlay code. Plans for next time: I’m going to work on rolling physics for real. I hope it goes well 👍 K bye guys
Unnamed Platformer - Devlog 11 Rotation is finally working! Mostly. Anyway I have to post now cuz of the 10 hour limit per devlog. What I did: I fully implemented rolling and rotation physics across all player shapes! Shapes now physically rotate based on movement speed, tip over cliff edges, and smoothly snap back to a flat face when you stop moving. I also added a feature where shapes automatically realign when entering water or zero-G. To make everything smooth and frame-rate independent, I overhauled the settling and snapping math using fmod for shortest-path rotation and wrap-around handling. Challenges: Getting the angle snapping and tipping logic to work was the biggest hurdle. Non-square shapes were getting locked out of tipping due to floating-point issues, which I fixed with an epsilon tolerance check. There are still a couple of bugs that I’ll tackle later, notably the fact that shapes sometimes spin an extra time upon settling. but the core system is more or less functional now. AI used, if any: I managed to work out the math myself but I needed to ask AI with help debugging. Plans for next time: I’ll probably work on some visual effects for the next couple days + fine-tune and debug my physics a bit more. K bye guys
Unnamed Platformer - Devlog 12 Man* Realizes True Meaning of ‘If it ain’t broke, don’t fix it’ What I did: First I ported pushable blocks to SAT collision so they use the same system as the player and it’s not split between two systems. Well. That broke blocks. so I spent 2 hours or so cross referencing my old versions and adding and deleting changes till it started working again. After that, I made sure blocks moved properly in zero-g. (they didn’t so I had to fix that too) Aside from that, I made a bunch of miscellaneous changes, such as fixing level progression bugs and altering player constants, but most importantly making sure blocks worked properly. Somewhere along the line I was investigating how stacked blocks interacted. I noticed they were clipping through the ground because of collision checks happening after the position of blocks was updated, and after some thought I tried adding another collision check pass to my main game loop. It worked like a charm! I added two extra checks for safety and it stopped working like a charm. The issue is my checkCollisions function is hella inefficient. 500+ lines of searching through every character in the tilemap (36x64, plus an extra column for new lines making it 36x65=2340) 6 times (!!!) Not only that, in some cases (block/player collision detection) I was nesting full passes within full passes, which caused insane lag, especially with my SAT collision which does a lot of math each frame. So I decided I wanted it to be more efficient (spoiler: it’s not efficient yet). I split my old tilelist into static tiles and dynamic tiles…and instantly regretted it. Challenges: Basically when I split tilelist into two separate vectors ( statictilelist which is everything except for blocks + dynamictilelist which is just blocks since nothing else moves lmao), I think I accidentally deleted a lot of existing logic that was the duct tape to my spaghetti code**. Aside from that, when I passed through tilelist it always passed through every tile, but with my new logic I had to decide which one to use. my stupid ahh didnt realize that there might be a chance I have to pass through both of them though 😭 well guess what there were a lot more gaps in my logic. All of these combined into the logic I had spent the last few hours working so hard to perfect, falling apart in 5 seconds. Similar to the whole block to SAT thing I worked out most of the issues just by adding, tweaking, and removing a bunch of checks as well as looking back at my old logic to figure out what I forgot. Among these general changes I also added a new grounded member to the block class, and tried to get it to register if it’s on top of a player. Unfortunately it didn’t work. It’s ok I’ll brute force my way to the root of the problem tomorrow. (Btw this doesn’t even cover the issues I faced prior to this😭 ✌️ ) AI used, if any: Now that the core elements of the game (physics) are out of the way, I’ve pretty much been grinding through bugs myself since it’s just existing logic and I’m not really adding much that’s new or unfamiliar. Honestly, I think it’s gonna stay this way because I don’t intend to use AI to design the game, I was using it more to help solve physics issues and the like. Plans for next time: I’ll try to hopefully fix the new block clipping issues. then idek anymore. Maybe i shouldn’t have tried to build the engine from scratch. K bye guys *I’m not actually over 18 **Tuff line?
Unnamed Platformer - Devlog 13 No motivation… What I did: I solved the issue of vertically stacked blocks clipping through each other and through the player, which was a pretty big chunk of my time since I went through like 10 different approaches and changed up a bunch of stuff along the way. I ended up taking out the SAT collision function I had built and just plugging mtvCheck() (which checks the mtv( )) and the movement logic straight into the collision loops instead. I had to reorder a good chunk of logic too since a lot of the clipping was coming from stuff resolving in the wrong order relative to other stuff. Also did some cleanup: deleted the grounded member off the block class since entity already has one and I was just using two variables for the same thing like an idiot. I added an R keybind so I can restart instantly instead of walking into a spike every time I want to reset (useful for testing + as an actual game feature). I also made the player’s rotation reset on spawn so you don’t respawn tilted at some weird angle from your last death and shrunk the spike hitbox down a bit from 20x20 to 18x18 because I was dying to one-pixel overlaps that looked like it shouldn’t have counted and that are pretty frustrating to deal with. Also did a bunch of level design. I’ve only done levels 1 through 4 so I lowkey gotta lock in. Challenges: The stacked block thing took forever because the symptoms kept changing depending on how many blocks were stacked, which direction they were pushed from, whether the player was involved, etc etc, so it never felt like I was chasing ONE bug, more like four bugs wearing a trenchcoat. Eventually I just started brute-force testing every combo I could think of (2 stacked, 3 stacked, stacked + pushed, stacked + player jumping into it) until I ran out of ways to break it. Also I ran into some issues when designing levels: blockonhead , which makes it so you cannot jump if a block is on your head, was triggering if any block was lined up above your head, even if it was like on a platform way above you. I managed to fix that, and other than that + the block issue there wasn’t too many big obstacles this time. AI used, if any: none, since I’m not using it at all for game design and didn’t need to use it to solve block clipping issues since I just brute forced a bunch of possible solutions. Plans for next time: More level design…I’ll try to get most of the levels done by next devlog. K bye guys
Unnamed Platformer - Devlog 14 I’m genuinely so done What I did: I designed levels 5 and 7-16 (ss of a few levels should be attached idk which they are). I have a cool idea in mind for level 6 but my current code makes it hard to implement, and I also have a cool idea in mind for level 17 but my code made it hard to implement. So I changed everything up like an idiot. My 17th level features a massive pool, but that requires me to draw 1000+ water tiles. Since I redraw tiles every frame, it causes a big load on the computer. So I had the brilliant idea of creating an sf::RenderTexture . spoiler it’s not so brilliant. That led to a massive chain reaction where there were a bunch of nullptr issues at first, which I spent about 40 minutes on before actually getting the game to run. Then everything was super grainy due to aliasing issues caused by drawing everything to a RenderTexture, PLUS since I was drawing everything at the start of the frame and not updating it, stuff like buttons and doors would never update. SO, my dumb ahh moved half my static/environment tiles to dynamictilelist , reserved for strictly blocks which are the only tiles that can change position, and I did this cuz these would draw every frame and they didn’t have the same grainy look as the ones drawn to a texture. the result is probably self explanatory. That caused SO MANY ISSUES that I can’t even begin to describe them all, so after 50 minutes I undid 50 minutes worth of changes, added some spaghetti code to make it a bit more presentable, and call it a day. Challenges: Level design was fun, and easy. I did that for all of yesterday and the first half-ish of today. The vain attempt at making my code more efficient by changing how static tiles were drawn and then going on to deeply regret it and consider undoing it all the next day, was not. Also I probably shouldn’t have bothered trying seeing as I was pretty tired anyway, but ig my stupidity/ambition/idek led me to try. I’m genuinely too tired to bother elaborating, but it goes somewhat like this: I started on the texture-caching thing -> I ran into nullptr errors -> I got those out of the way -> I ran into issues with rendering and updating -> out of frustration I undid all my progress and started anew -> I decided to implement anti-aliasing -> I will probably(definitely) reset my code to where I had been right before I decided to do this stupid implementation AI used, if any: none. If I had I would’ve probably been done with this bs by now. Plans for next time: Realistically I’ll likely just undo all the changes I made to drawing processes, find out how to draw environment tiles underneath other entities/obstacles (which will be useful for many of my levels with spikes or the like in environments), and…thats it. Also, for level design, I want to have all preliminary designs down by the end of this Sunday (3 more days), and then I can playtest and refine later. I wanna cry P.S. the level with the white room is level 6 and it’s currently unfinished lmao
Unnamed Platformer - Devlog 15 Actually got a lot done over the last few days ig What I did: first off, I reset my old changes and made it so env tiles layer over obstacles. At first I tried to assign an individual character to each combination (spike in water, block in zero-gravity, etc etc) but that didn’t work since I couldn’t get them to lay over each other. So what I did is I split my statictilelist into two: statictilelist now held all non-moving entities like spikes, ground, etc. while envtilelist held all my environment tiles. Then I changed my map loading function to take two map strings: one assigned tiles based on entities and the other pass assigned them based on environment. And now I can lay environments over things without breaking my game! Yippee! I also fixed an issue where blocks could clip through obstacles in zero-g when you moved them upward. The issue was blocks unconditionally being mtv-moved when the player was below them, so the player forced them through anything. I added an extra check before mtv-moving and made obstacle detection variables global to fix it. I also ran into an issue where spikes would incorrectly kill you even if you were not touching them, just near: the issue was that I wasn’t running SAT collision, just going straight to death logic if the initial AABB check turned out true (I run an AABB check first because running SAT for everything makes the game super laggy). both of these lowkey took me a while 😭 As for level design I reworked level 6 (still can’t play it) and level 17 (finished), and I designed levels 18-25 (I attached a video of level 24). Also in the vid I switched shapes randomly, that’s just because I had different keybinds earlier and it was js muscle memory kicking in. Challenges: Aside from a bunch of small bugs, the biggest challenges were the issue where spikes would kill you even if you weren’t touching them and the issue with blocks being pushed up forever in zerog. Even then, for both issues it was still easy to fix since it was easy to diagnose and a few lines per fix, even if it took me a while to find those few lines 🥀🥀 However, there’s still an issue where blocks sink slightly upon spawning in zero-g. This makes it impossible to play level 6, so I’ll have to look into/rework/do something to zero-g logic because I really want to keep its existing level mechanic. AI used, if any: None 🔥 Plans for next time: Finish levels 26-30, finish level 6, and test all the levels to make sure they’re not too hard/impossible/possible to cheese. Aside from that, I’ll most likely bring back the texture thing I implemented last time cuz it did actually make the game run a bit smoother, but I’ll only do it for environment tiles. K bye guys
Unnamed Platformer - Devlog 16 Actually didn’t get a lot done over the last few days, let me explain. What I did: The biggest and only new feature I added was a major adjustment to black holes. Earlier they were just 2 tile x 2 tile circles that killed you upon touching. I’ve reworked them to how they’re supposed to be: 6 px x 6 px black circles, with a surrounding 6 tile x 6 tile ring. now if you enter the ring, you lose the ability to move normally (you can still jump tho) get pulled toward the black center, which kills you if you touch it Which is how it’s supposed to be (nevermind the astrophysical inaccuracy lmao). This took me 2 hours 😭 and then I designed levels 26 and 27. I also re-added the old texture system I implemented and then took down earlier cuz it was making things look hella grainy, but only for environment tiles cuz there’s no big changes visually compared to redrawing them every frame. Unfortunately it doesn’t seem to be doing much in terms of efficiency. I also designed levels 28 and 29 (ss of level 29 attached), and playtested every level from 1 to 28 and adjusted each one to remove any unwanted ways you can cheese a level, as well as to just make some of them less punishing for small mistakes. I also (FINALLY) designed level 6. I added extra sections and polished up some elements that were making the level impossible if you didn’t play it perfectly. I did 2 other things as well: I made it so blocks can’t be pushed by any character other than the square (before you could just push blocks w/ anything) and I reduced horizontal movespeed in zero-g. There’s still a lot more I have to do, mainly ui/menu stuff and visual polish. Challenges: Black hole physics took me a while since my first few implementations were completely wrong, and then I locked in nd figured out how to make it pull correctly. Also, level design is proving to be surprisingly challenging, I rly didn’t think it would take this long, but what with conceptualizing + creating + playtesting each level, especially the later ones where I want to make them more complex and difficult, it eats up a lot of time per level. Even going back through older levels and tweaking them can take a while, cuz you gotta track down all the problematic sections and figure out how to fix them. I also have a humble 18 more days till school starts so I gotta lock in🙏 AI used, if any: None, level design is hard but its not THAT hard Plans for next time: Finish level 30, playtest levels 29 and 30, and hopefully get started on + finish a main menu and level select menu. Im so behind on my schedule it aint even funny so wish me luck
Unnamed Platformer - Devlog 17 It’s actually no longer “Unnamed Platformer”, it’s “Worlds of Blockman”, I might change that later idk What I did: I designed level 30, playtested every level extensively and tweaked some levels, and made a basic main menu, level hud and pause menu. And it took me ~10 hours. Well, that’s not all I did. I also changed up the colors of the square to differentiate it from spikes and buttons, and I added a visual indicator for the triangle’s teleport. When you tp the triangle fades to a darker shade of green, and when it gets off cooldown (3 secs) it fades back to its normal color and then you can tp again. Also, level design took quite a long time since I was kind of making it up as I went along, and the whole game states implementation wasn’t too hard in itself, but I ran into errors with loading my font. I added the .ttf file to my assets folder and wrote the correct file name in font.loadFromFile() and whatnot, but turns out I didn’t have the actual font downloaded in the build folder or my project. So after a bit less than an hour I added it in and it fixed the issue. also I spent a bit of time deciding how the different menus would actually look which ate up some time. Challenges: ngl the font-loading thing was kind of the only hard part 😭most other stuff was solved relatively quickly and easily AI used, if any: None, also most likely no AI will be used in the future since the future just holds visual stuff which should not be hard enough to merit the help of AI. Plans for next time: Level select menu, add more stuff to main menu, also make it so the current level shows in the background when you go to the pause menu. also add mouse inputs so you can use those instead of kb inputs in the menu, and start on some more vfx and sfx. I’m also really tired
Unnamed Platformer - Devlog 18 The UI is coming along pretty nicely! What I did: Designed a full level select menu (there are a couple more things left to add), add a heads up display for the current level, and add proper mouse input and extra details to buttons such as shadows (havent implemented shadows for everything, I’ll explain why) and changing color when hovering. Even though it doesn’t sound like much, it took me a surprisingly long time because my text wasn’t centering…What I didn’t realize is that sf::Text creates invisible offsets for some reason, so when I used getGlobalBounds() it would return that offset too and mess up the centering. I ended up doing some research and realized I had to use the local bounds (i.e. untransformed) when centering. Challenges: Ig the biggest ‘challenge’ was centering buttons with text, because at first I actually tried to manually fine tune coordinates and whatnot. But then I found out I had to use localbounds and blah blah. Another thing is, I spent a lot of time fine tuning sizes, colors, shadow darknesses and depths, etc. which took a lot of my time. Also no ai used this time either, although I did spend a lot of time researching why my text wouldn’t center itself. Plans for next time: I’ll just polish up existing menus, and work on background elements. Also I want to add a kind of handbook accessible from the main menu that tells you what stuff does, different powerups, etc. But most importantly, I’m gonna try to find out how to make shadow creation more efficient. For every text/button, I need a shadow. That means I have to add it as a member in the class, copy the actual object, change the color and offset it, then draw it too. Since I have so many objects that make shadows (all of them in the end, ideally), I’m probably going to make a shadow-making function for readability. Other than that I’ll just play the game and test levels a bunch, which I’ve already been doing a lot to make sure everything is as it should be. K bye guys P.S. there’s also still a couple bugs ( UI-related or otherwise) that I have to fix as well
Unnamed Platformer - Devlog 19 The UI is coming along pretty nicely! Pt. 2 What I did: I believe I’ve fully created everything UI- and menu-wise, aside from 3 additional menus (credits, a ‘handbook’ that contains info about stuff, and a settings page) that are currently blank. I created a hovering effect for buttons that makes it so when you hover over a button, the button goes downward slightly and the shadow moves to match. Aside from that, I polished up/tweaked some minor details, and the only things I’ll add menu wise are probably those 3 sub-menus on the main menu and a universal backwards-nav button. The biggest thing (time-wise) was figuring out how to make the code more readable and actually making it more readable. I created two new functions for making text and button objects which made my life a lot easier, also the button-hover code took quite a few lines so I put that into a function too. Aside from that, I made a couple fixes here and there to make it more efficient memory wise. And even then, I ended up breaking stuff which took me a while to fix, such as the issue with unpausing ur game in the vid. Challenges: Probably efficiency stuff, since deciding how to do it + implementation took a while and had a couple of bugs due to me not accounting for stuff. For example: my hover function would change states on its own, but since sometimes you don’t need to directly change state or you need to do other things too, I made it into a boolean that each individual case takes and does its own thing with. Plans for next time: Start on background stuff probably, I don’t want to do anymore UI stuff for now. I have a fewideas in mind for my background visuals, but I hope they won’t be too hard/impossible to implement. K bye guys
Unnamed Platformer - Devlog 20 Background design is a hell of a lot harder than I thought it would be…also I lost track of time 😭😭 What I did: I got started on background design, and partially implemented a background. I actually had a pretty different idea in mind compared to what I have now: the rest of the planet visible, stretching into the horizon, with mountains and volcanoes etc etc. scattered along its surface. After spending a while implementing that, I realized it a) didn’t look right, since everything was just following the player around at normal cam speed, and b) I didn’t like the idea anymore to begin with. So after scrapping all those changes, I started researching how to add a scrolling effect so it would look more natural. I found out how to implement a parallax scroll effect, which basicallymeans that objects in the background move along slower than objects closer to the front of the screen. I also restructured my scenes.h file which contains all background-related stuff, and made a couple of other small changes and fixes with certain levels. I know I don’t have much to show for it, but that’s mainly because I spent a lot of time tweaking certain elements and just undoing backgrounds I ended up not liking 😭🥀 Challenges: Deciding what to do visuals-wise cost me some time bcuz I kept going back on my old ideas, but restructuring scenes.h was the hardest part since after deciding what to do for visuals, I had to base the logic in scenes.h off that. Also it took me a while to decide how to add in a parallax scroll system. Plans for next time: Work on more background stuff. right now I’ve set up a lot of background elements’ structs and whatnot, but I’ve only redrawn the stars and added a rough brightening/dimming effect. Also Im gonna have to start thinking about what I’m going to add on each of the sub-menus accessible from the main menu (credits, handbook, and settings). K bye guys
Unnamed Platformer - Devlog 21 Background design is a bit easier now that I have a plan…also I did not lose track of time 👍 What I did: I added in every single sky element I want to have: comets, planets, black holes, stars, floating rocks, and a moon. I think I might tweak some elements later down the line (specifically the moon(adding craters) and black holes(I’ll think of some extra effects) ), but for now I’m fairly satisfied with how far I’ve come. Looking at the game now gives me a sense of pride at seeing everything finally come together after so long 🥹✌️ Challenges: Making comets was a bit of a hassle, because I had to decide how to do it (which took me some time for brainstorming + more time cuz of discarded changes + even more minutes of brainstorming), and implement it. It’s pretty complex cuz there’s a cooldown on each comet, then you have to set the spawn point and angle/speed, calculate the trail’s points, draw them, draw the head too etc etc…so it was pretty tedious, but comets are the most rewarding visually imo out of all the features. Other than that, I spent a bit of time per other feature figuring out how to implement each of them, but none of them were as complex as the comet. Plans for next time: Finish up any bugs or other issues in sky-related stuff, then I’ll try to make a visible horizon again and see if I’ve changed my mind since last time. Either that or I’ll start working more on smaller vfx, specially trying to find out how to make a particle effect. K bye guys
Unnamed Platformer - Devlog 22 School starts tomorrow ✌️so i decided to make a shorter devlog…also I’m so tired What I did: Honestly you can’t really tell that I did much at first glance. I was mainly playtesting a lot and polishing stuff up, and making sure all the background stuff was fine. For now I dont think I’ll return to background stuff for a while. Although I did manage to add a particle effect for the black holes (both the ones in the background as well as the actual obstacles). I was also experimenting with a horizon for a bit, but then I decided I don’t want it and scrapped a good chunk of time worth of changes. Challenges: Deciding how to add in particles was a bit challenging, specially the math part. But other than that it was a pretty chill 7 hours. Plans for next time: Hopefully finish menus, then: work on vfx, polish up all the menus, tackle any big issues with levels or physics, and finally work on bringing my game onto itch.io! not all in one go, though. K bye guys
Unnamed Platformer - Devlog 23 Hey guys. What I did: I did a lot of playtesting/bug hunting as usual, but I was mainly creating the entire handbook menu. Which took surprisingly long, cuz of designing the menu + figuring out how to include all the different tile icons + creating descriptions + making stuff functional + formatting + colors + bugs + you get the idea. Anyway I’m pretty happy with how it looks so far, I doubt I’ll make any major changes in the future. Also I did find a couple of bugs while testing, but i didn’t really do anything about them, I want to completely create all the core functions before tackling any small bugs/issues. Challenges: There were a few bugs and I went through a few designs for the menu, but overall everything was hella light so I wouldn’t say there were any real challenges. Plans for next time: Create credits menu, then work on adding vfx, add settings menu (thinking of adding volume + keybind toggles), polish up all the menus…and then I’ll see where to go from there. I’m pretty worried cuz now that school’s started (im in gr11 now) I’m probably gonna have a good amount of schoolwork, clubs, etc. that I’ll also have to make time for…so wish me luck ig. K bye guys
Unnamed Platformer - Devlog 24 The game is finally coming together… 🥹🔥 What I did: All the menus in the game are completed! Ngl, credits was really easy ofc, but I was deciding how I should go about doing it, still didnt take too long tho. Then settings was a lot harder 😭 volume adjustment was quite easy, but the real problem came with creating the keybind section, since I had already coded hard inputs all throughout my code. So I pretty much had to add a new system + helper func in vars.h, then replace every instance of isKeyPressed with that system+helper, then code the menu in the ui file (Which took forever cuz of bugs with msg updating + event handling + key updates + etc.). Well, it’s (mostly) done now, which is good. And ofc I was also testing the game for general bugs too. Challenges: The keybind menu took me a hella long time to get done…thats about it, aside from some other tiny bugs. Plans for next time: add vfx, polish up every single one of the menus…and then I’ll see where to go from there. Hopefully I can finish most of my stuff by the start of next week. K bye guys
Unnamed Platformer - Devlog 25 I’m so tired omg What I did: Bunch of miscellaneous stuff: Added basic vfx: so far we only have a click sound, I’ll add more later but it took me a while to figure out how to get SFML’s audio system working since I also had to find out why my audio files weren’t loading in either. Added coins to every level: added new tile type for coin, added a coin into each level, added effects, etc. Fix bugs/gameplay issues such as the triangle being unable to teleport after a restart/new level, rearrange some levels to fit coin placements, find out some new bugs and try (and fail) to fix them, so decide to deal with them another day. Add simple death animation to the player. Make it so levels must be completed in progressive order (e.g. you start at level 1, cannot progress till you have completed), also add different colors to boxes on level select menu (check vid) Probably a few more things related to general playtesting but i can’t remember Challenges: Making level buttons in the levelmenu was kind of frustrating not only because of the selection aspect but also getting them to visually render in the proper colors. Honestly though, now the main challenge is dealing with my own fatigue, especially since I’ve been joining more clubs and getting more homework, so hopefully I can clutch up over the final few days cuz I highkey need that framework 13 🥺✌️ Plans for next time: I added a list of bugs I want to tackle/stuff I want to add: //BUGS!!!!! //cant close window while in settings menu //rotation bugs //levels 13, 17, 26, 4, 8, look into //as well as other levels but these ones I can remember //TO ADD!!!!! //speedrun timer //death count //updating handbook (notif icon, hidden objects) //more sfx (death especially) K bye guys
Unnamed Platformer - Devlog 26 Stardance extension + fatigue = holy procrastination 😂✌️ What I did: More random stuff: Level timer that stores each level’s personal best, displays a live timer in the level, and lets you access your PR for each level from level select menu Fixed issue where you couldn’t close game while in settings menu Death count (it just tracks deaths over every single level, accessed from level select menu, manual restarts count as death too) and coin count as well Adjusted some levels a bit Added a feature to handbook where items you haven’t come across yet are blacked out and have hidden descs, and add notification to handbook when you unlock these items Update README a little bit cause I was feeling lazy and didn’t want to do anything else Fix some bugs concerning rotation and tipping, as well as making it so you do not rotate when passing thru a 1 tile high gap (this is specially an issue with the square where it can feel a bit janky otherwise) I will note that some of these were multifaceted changes that took quite a bit of effort and iterations, but I couldn’t be bothered explaining everything I did here. And more playtesting too. Challenges: Probably the handbook feature…it was the longest one out of all of them. Plans for next time: I want to be done with pretty much everything related to the actual game by next devlog, so I can focus on the README and finally shipping! K bye guys
Unnamed Platformer - Devlog 27 WE’RE FINALLY HERE! What I did: I did a lot of final polish and testing before getting the game ready for release. Initially I was going to use Emscripten to port my game over to web assembly (inspired by this video: https://www.youtube.com/watch?v=1kiwpAIU454 ) but I soon realized that it was much more complex than it looked, and kind of took away from the spirit of being entirely made out of C++ and SFML. So, I decided to simply publish an executable rather than port the game over to web. I set up the release build and whatnot (which took a while because of cmake config issues and whatnot) but I finally got a release build working n it feels great! I ported to itch.io, now I just gotta finish up the itch page and readme, as well as record a walkthrough video for macOS and Linux users as I couldn’t figure out how to configure the game for either. Challenges: The whole odyssey of deciding how to port my game over was a slight hassle, but nothing too bad. Also, while recording my walkthrough vid, I ended up discovering A LOT of hidden bugs, so I managed to pick all those off and there shouldn’t be any left…hopefully. Plans for next time: Ship! This devlog will be my last for this project, and for this challenge. Aside from being done with everything, I accidentally created a completely new project according to Hackatime when I was renaming the file folder, executable, etc. from “WorldofBlockman” (my placeholder name) to Stardancer so everything would be more consistent with my final title. so any work I do on my project won’t count towards heartbeats and thus I can’t post another devlog (15 minutes minimum/devlog). Still, it’s been such an amazing journey, I learned so much and I made this game that I’m super proud of 🥹 even though this game gave me hell sometimes, I have virtually no regrets about any of it. This has been my biggest project ever, and many more to come in the future hopefully. K…bye guys.
Ships:
For HackClub Stardance, I created Stardancer , a 30-level platformer featuring a unique mechanic: mid-level shapeshifting to unlock new abilities and powers! I used C++ and SFML (the Simple and Fast Multimedia Library) to code this game. During the development of this game, I ran into a couple of technical challenges. Collision was among the biggest; I had initially decided on AABB (Axis-Aligned Bounding Box) collision, but after implementing that I realized that it led to erroneous collision interactions, misalignments, and more issues. So, I switched to SAT (Separating Axis Theorem) collision instead. This, combined with general collision response logic, made coding collision one of the hardest endeavours of this project. There were many other challenges throughout development, however none are too disruptive to the experience of the final game. I’m still extremely proud of myself and this project for many reasons: This is the largest project I’ve ever made; Despite many challenges, bugs, and pieces of complex logic to work through, I made a fully functional and complete game; I managed to make this with no external engines; I was able to use my C++ and new SFML skills to create something I can proudly say I made! IMPORTANT NOTE FOR REVIEWERS!! PLEASE READ!!! A complete playthrough of the game takes a large amount of time due to how levels are structured: to play a level, you must beat the level before it, which poses an issue for one of the shapes which is only unlocked in the last set. I realize most reviewers do not have the time required to play through the full game and gain a complete understanding of its features. For this reason, I strongly urge reviewers to skim through/watch my full walkthrough video linked in my README, as well as check out the “Credits Easter Egg” section in that video. Playing through all 30 levels sequentially takes time, but you can unlock every level directly from the Credits screen so you can test all shape powers hands-on right away! This way, a reviewer will be able to understand the scope and gameplay of the game in a short amount of time. With that being said, I truly hope you enjoy my game....
|
1792759984.4731371
|
1792846384.4731371
|
|
1562
|
SuperNewRoles by @yoking | Stardance
|
yoking
|
0
|
220.15
|
0
|
[]
|
[{"post_id": 50428, "ts": "202 [{"post_id": 50428, "ts": "2026-08-19T16:26:01Z", "hours": 9.1528, "text": "The latest version of Among Us, v18, has been released, so I worked on updating it. (For both the client and the server!)"}, {"post_id": 47863, "ts": "2026-08-16T03:14:40Z", "hours": 15.0264, "text": "Merging stacked PRs is fun! (I might have worked a bit too much…)"}, {"post_id": 47397, "ts": "2026-08-15T09:48:20Z", "hours": 13.4536, "text": "Preparing features for the upcoming update👀"}, {"post_id": 45253, "ts": "2026-08-11T16:31:25Z", "hours": 15.3244, "text": "First time using stacked PRs for a fairly big refactor."}, {"post_id": 41913, "ts": "2026-08-06T13:02:57Z", "hours": 8.9292, "text": "I spent the whole day just fixing and testing the bugs A found… but on the bright side, we got so many of them sorted, which means much better quality modding from here on!"}, {"post_id": 41252, "ts": "2026-08-05T10:55:49Z", "hours": 8.7486, "text": "Asked AI to spot some bugs and it found 52, and they were pretty major ones too. 😭"}, {"post_id": 38854, "ts": "2026-08-01T12:44:14Z", "hours": 8.5133, "text": "A bit of refactoring"}, {"post_id": 35638, "ts": "2026-07-27T06:11:51Z", "hours": 8.1333, "text": "Two hotfixes for way too many bugs lol https://supernewroles.com/releases"}, {"post_id": 33403, "ts": "2026-07-23T10:06:49Z", "hours": 7.8878, "text": "v3.1.5.4 has been released (hotfixes 3.1.5.5 and 3.1.5.6 are also included)! Tasks are now displayed for the “Home Guard” (a role with no tasks, which basically refers to a NEET who stays home all the time (lol))!"}, {"post_id": 32150, "ts": "2026-07-21T03:37:02Z", "hours": 8.1486, "text": "Adding more features to Custom Cosmetics & fixing about 6 bugs!"}, {"post_id": 28957, "ts": "2026-07-15T15:59:04Z", "hours": 80.7908, "text": "Reworking the Wiki, etc. https://wiki.supernewroles.com"}, {"post_id": 9036, "ts": "2026-06-15T02:24:06Z", "hours": 21.7083, "text": "I added a new mode and new settings. I will introduce them in a new devlog once they are released 👀. It is a lot of fun!"}, {"post_id": 2576, "ts": "2026-06-05T04:44:51Z", "hours": 14.3325, "text": "Many bugs fixed and the “Tasker” role ported! https://supernewroles.com/v3.1.5.1"}]...
|
Title: SuperNewRoles by @yoking | Stardance
Devlo Title: SuperNewRoles by @yoking | Stardance
Devlogs:
Many bugs fixed and the “Tasker” role ported! https://supernewroles.com/v3.1.5.1
I added a new mode and new settings. I will introduce them in a new devlog once they are released 👀. It is a lot of fun!
Reworking the Wiki, etc. https://wiki.supernewroles.com
Adding more features to Custom Cosmetics & fixing about 6 bugs!
v3.1.5.4 has been released (hotfixes 3.1.5.5 and 3.1.5.6 are also included)! Tasks are now displayed for the “Home Guard” (a role with no tasks, which basically refers to a NEET who stays home all the time (lol))!
Two hotfixes for way too many bugs lol https://supernewroles.com/releases
A bit of refactoring
Asked AI to spot some bugs and it found 52, and they were pretty major ones too. 😭
I spent the whole day just fixing and testing the bugs A found… but on the bright side, we got so many of them sorted, which means much better quality modding from here on!
First time using stacked PRs for a fairly big refactor.
Preparing features for the upcoming update👀
Merging stacked PRs is fun! (I might have worked a bit too much…)
The latest version of Among Us, v18, has been released, so I worked on updating it. (For both the client and the server!)...
|
1791824391.7003748
|
1792688391.7003748
|
|
4799
|
Evochess by @Sam | Stardance
|
Sam
|
1
|
225.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-15T04:56:14Z", "hours": 225.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Let’s ship 🚢 This is a website where people can learn and improve their chess skills by watching courses, solving puzzles and practicing their vision. The website was overall really challenging to build. If I had do pick, it would definitely be making a working chessboard for puzzles. At the beginning of the project I didn’t even know if I was capable of building one but I am really glad I tried as I’ve learned so much. Another challenging thing would definitely be making the website responsive. I don’t like making website responsive and in this project animations added another layer of complexity. I’ve tried my best to keep things responsive though. I am really proud of completing the project and mainly working chessboard as this is my first time building something like this. I am also proud of the animations and the ui of the website. To test my website some knowledge of chess is preferred but even if you have zero knowledge about chess you can test out my project as there are courses which will teach you about chess. Thanks stardance for everything 💖💖. I probably would never have created or completed this project without stardance😄", "repo": "https://github.com/samgod1/Chess-website", "demo": "https://evochess.vercel.app"}]...
|
[{"post_id": 79525, "ts": "202 [{"post_id": 79525, "ts": "2026-10-14T13:11:44Z", "hours": 3.0406, "text": "THIS MIGHT BE THE LAST DEVLOG First I polished the puzzles sidebar. I made the sidebar width to be same as vision page sidebar. Then I changed the level button size as they were too small for larger screens. I also made the level button container scrollable if the level buttons overflow. This took the most time because the whole puzzles sidebar body was overflowing pushing down that start button. I just wanted the sidebar body to not overflow which would make the levels container to be scrollable. The fix at last was using min-height: 0 to the sidebar body. Idk how the min-height: 0 is helping here 😭 . Next I made the visualization section animation (The last section of the home page) to appear quicker. This was a recommendation from my brother as when scrolling previously the section might seem like it contained nothing until you scroll fully. I faced issued mainly with the section not pinning to the top of screen when trying to move the animation timeline starting point. Also I tried to placing text higher on y axis and animate it coming down with the user scroll which produce the result I was expecting. So, I split the timeline into two. The first one reveals the text and the second one shows a person visualizing. The tex revealing animation ends when the section top hits the top of the screen which makes the section pin to the top exactly how I wanted it to be. Then I polished vision page sidebar as follows: Made the sidebar responsive after user has clicked on start Made the sidebar header look better and fix mismatch of padding from body Returned to using flex for the attempts and mad them responsive Tweaked the options and info as they were looking odd in some screen sizes (mainly the tablet one which looked really bad) I then copied some of these changes to the puzzles sidebar for maintaining similarity. Lastly I capped the width of course, puzzles and vision page to 1600px by adding a wrapper element. It acted weird on puzzles and vision page sidebar as there was already a element named wrapper and so I changed the classname to page-wrapper."}, {"post_id": 76969, "ts": "2026-10-05T07:23:36Z", "hours": 1.8433, "text": "Fixing things and some more responsive things I’ve fixed chessboard displaying multiple selected squares. This happened when user selected a piece and then selected another piece by dragging. The fix was really simple. I just added resetSquares function when piece on drag start. I’ve also fixed pieces stacking on top of each other if user drags and drops a piece on another piece quickly before the opponents move happens. This was prevented when pieces are moved only by clicking but I forgot to prevent this if pieces were dragged and dropped. I did two things to prevent this: I reduced the time for opponent piece to move after the first move. I disabled the piece from dragging if it wasn’t the player’s turn. It seems the first fix wasn’t sufficient as it created another bug. So, if user selected a piece by clicking or dragging and then dragged the same piece then the destination squares and captureSquare will just completely disappear. The occurred due to resetSquares function that I had added. I thought for a while and came up with this solution. The resetSquares function only executes if user selects another piece on drag. However the function won’t execute if the selected Piece is being dragged. The selected piece state null at first so resetSquares() won’t also execute if selected piece is null. Now, it works as expected until and unless I find some bugs. Now returning back to the responsiveness. I fixed the puzzles button to be equal width and height. I had made the level buttons responsive before but they weren’t the same size. I had tried the aspect ratio last time as well but it was breaking the layout. Basically I used aspect ratio, removed the grid templated rows and changed some clamp values. Also I removed the media query below 1440px and integrated it as default css. After doing that, I started to fix the attempts in in vision sidebar. I thought it would take me two seconds to do it as I just had to apply the puzzle button knowledge here. I thought just doing this will work grid-template-columns: repeat(auto-fit, minmax(40px, 1fr)); I was wrong 😭 This worked fine for level buttons cuz the number of buttons were static. Here the attempts squares increases as the user clicks on the chessboard. If there’s only one attempt square then it will take the whole width. I was stuck after this. I tried different things such as using max-width, trying to add width: fit-content, etc. but nothing worked. At last I thought of reverting back to what the code orginally was which just used flex and flex wrap but coming this far I just used grid and used different values with height to make the attemps square kinda responsive. I still need to use clamp or something to make this look good. Uhhhhhh this is so frustrating… . I think I’m overexplaining things. I should just simplify down things"}, {"post_id": 75141, "ts": "2026-09-29T08:47:38Z", "hours": 2.0161, "text": "This devlog is a short one I’ve made the vision page responsive for larger screens. Last time I made the page responsive for mobile screens. I made some small changes in puzzles page while doing this for maintaining similar code . I ran into some issues such as css not working due to incorrect nesting and writing the writing the css on wrong file. Also, I removed media query for 1440px as the default css will work between 1024px and 1440px using clamp css functions and by doing that, above 1440px the css will stay the largest clamp value. I think I will do the same in puzzles page as well. 2hrs wen’t so quickly mainly cuz of my stupidity as I broke things that already was working fine. Also, I don’t think I like the mobile responsiveness that much but i don’t think i’ll change it now (or maybe I will). While writing this devlog I just realize that I’ve make the sidebar responsive after vision page has started. Uhhh i hate responsive design"}, {"post_id": 73203, "ts": "2026-09-24T16:25:05Z", "hours": 2.6344, "text": "Changed some puzzles and more responsiveness work Copied the puzzles page and it’s component’s media query css So after making puzzles page somewhat responsive last time, the first thing I decided to do after that was copying puzzles page media query css and just paste it in vision page as both of pages are very similar. This made the vision page and it’s components a little responsive. Puzzle changes I’ve changed the puzzle from level 12, 23 and 30. The 12 and 23 level had 2 ways to deliver checkmate and only one of them counted as correct. I changed them as user might get frustrated seeing that. My code doesn’t handle that so I just changed them. Level 30 was changed cuz it wasn’t really difficult. I don’t think I’m satisfied with the new level 30 puzzle either. One issue while polishing signup page I didn’t want the form to look squished on devices with small vertical screen size. Due to this last time I generally kept things smaller than what I wanted to make sure it looks okay for those devices. To fix that I added min-height to the form-container. It prevented the form from squishing but the form-container was overflowing as the puzzles page has 100dvh. What I wanted was just the form scrolling using overflow: scroll but this probably took me about 20-30 mins to make it work 😭 . I set overflow to scroll to form-container it didn’t work, added it to form which also didn’t work and then I added it to puzzles page. The scroll part was working when I added it on puzzles page but not what I was looking. Then I created a wrapper div to hold the img container and form container hoping now adding overflow:scroll to form container will do the job. After trying all things things I realized that the min-height was set to form container instead of form. The fix was to adding min-height to form and set overflow scroll to form-container. I removed the wrapper div after that as it was unnecessary and also hid the scrollbar that appears in form-container. Signup and login page polish after that annoying issue After that annoying issue I’d say things went pretty smoothly. I mainly used clamp as always for making things responsive. And as always it took me longer that expected. After polishing up the signup page I copied the code to login page and just changed signup to login. Vision page responsive on mobile devices Making the vision page responsive for mobile device was really similar as polishing signup page. I just used clamp for everything and made sure everything looked good. Now that I think about it i only made the sidebar responsive including the popup menu as only that is displayed on mobile devices and chessboard is hidden. The chessboard is also kinda responsive due to the copy pasting the puzzles page media query css. The making of sidebar responsive was just trying out different sizes and then putting the value into clamp calculator and copy pasting the value. Now, I’ll work on the vision page responsiveness for bigger devices and then if everything looks great after testing then I’ll ship the project"}, {"post_id": 71645, "ts": "2026-09-21T06:52:58Z", "hours": 3.2419, "text": "Made puzzles page responsive and bugs fixes Puzzles page responsive Most the time was spent making the puzzles page responsive. As always it took more time than expected. There were many issue that popped up and slowly but surely I fixed them. One of the issues was in bigger mobile screens the sidebar was being squished because the chessboard was getting really big but puzzles page has height of 100dvh as the chesboard in mobile phones is calculated according to width. To fix it I tried adding min-height to the sidebar for not getting squished and height of auto to puzzles page but this broke the sidebar when puzzles is not started cuz there’s no chessboard. The height of sidebar is 100% so due to the parent’s height being auto the sidebar height was about as didn’t fill the whole screen. To fix this I used overflow: scroll to puzzles page and it’s height to 100dvh. Another issue came when trying to make chessboard and sidebar look decent in different laptop sizes. I made it somehow work but using clamp, min-height, max-height, min-width and max width. It was kind of a pain to solve all the issues that came while doing this. That’s why I’ve rushed making the puzzles page responsive. My plan is to come and polish it after I’ve made the course page responsive as well. It shouldn’t be too difficult imo as it’s very similar to puzzles page. Fixed user being able to drag and drop opponent’s pieces It was a quite dumb bug. I had prevented this for click to move feature but I didn’t think about it in drag and drop. The fix was quite simple as dnd-kit (npm package) provides a disabled property in useDraggble. I disabled it for the pieces for dragging which had the opposite color of chessboard. Fix next puzzle button not working on second last level I didn’t actually know about this bug. A friend of mine told me about this issue while testing the website. After level 29 is completed a state is toggled to true which prevents the next button from not working. The next button is now only supposed to not work after completed the last level. I haven’t used fixed values for fixing this so in future if I decide to add or remove puzzles it shouldn’t break. The fix was a little more complex than I anticipated. 9 days of stardance remain now. So, I have to lock in now. Okay bie"}, {"post_id": 70097, "ts": "2026-09-18T13:33:32Z", "hours": 2.1928, "text": "We’re close to the end First I fixed the buggy dropping piece. I fixed this when I first worked on drag and drop piece feature but I don’t know how it broke again. When trying different things to fix it I tried to move the setIsDragging(false) lower inside dragEnd function below movePiece and capturePiece function calls. Surprisingly it worked 😄. I fixed light square being dark and vise versa if user had the black pieces. I found out this issue because the coordinates colors were mismatched. So my first intuition was changing the color of coords.jsx. I got really confused as the changes did nothing in the browser. I am so dumb I was changing the vision page chessboard’s coords.jsx instead of puzzles page chessboard’s coords.jsx. It worked but then I realized the coordinates color weren’t wrong square colors were. I undid the changes made to coords.jsx. I also seperated the coords.jsx but adding puzzles and vision in the name. Then I fixed the squares color for black’s board. I’ve figured out the mobile design for puzzle section. First the idea was that the chessboard and sidebar would be stacked on top of each other. This was the easy route but if I did that then it would add friction to the mobile players as they would have to scroll all the way down to start the puzzles. Then I looked at chess.com and they were doing it really well where only after clicking start puzzle the chessboard will appear. So I removed the chessboard below 425px first and then made the button text, size and gap smaller. I also removed the aspect ratio of 1/1 from the buttons as the buttons were ruining the gaps between them in certain screen sizes. Now for the first challenge I faced. How do I only make the chessboard appear and disappear when clicking start puzzle only on mobile devices. As I used gsap matchMedia to make the chessboard’s container display none or block according to hasPuzzleStarted for mobile screens. The chessboardSize is calculated according to chessboard container so that the chessboard is divisible by 4. When first loading the chessboard if the container has display none then the chessboardSize becomes zero and when setting the container to block will only show empty chessboard container without a board. I tried using the autoAlpha property of gsap hoping that it will do that same job as display none but without remove the element. It was making the container invisible but the container would still retain it’s height and width. I was starting to doubt myself here and was thinking to take the easy route but just stacking the board and sidebar vertically. After thinking for a while I came up with a breakthrough I made the position of chessboard container to absolute and visibility to invisible. Now the chessboard container won’t be visible and won’t take up any space as it is absolute. When the board used absolute position idk why but the board container got so bigger. It also distorted the pieces when puzzle started. To fix it I ran the gsapMatchMedia code only after chessboardSize is calculated which was a great idea. It fixed the board when the puzzle started but when it was hidden it was still large. I just replaced the absolute and visibility with display: none as it only runs after the chessboardSize is calculated, that’s why there is no issue with display:none. Last change is when sidebarMode is notStarted then only chessboard is hidden. I know that 80% of the things I say won’t be understood but I’m not a good explainer so you have do deal with it 😅. Were really close to the end now I just have to make puzzles page and vision page responsive and just polish the website and then click the ship button"}, {"post_id": 69180, "ts": "2026-09-16T15:22:21Z", "hours": 2.6522, "text": "Omg how does changing the color model solve the issue Before that I fixed the black piece being upside down when dragging. You can see it in my last devlog’s video. I was only happening with black pieces because to make the board work when user got the black pieces I just rotated the board 180 degree. This made all the pieces upside down and to fix that I again rotated the piece’s img 180 degree. Ig when dragging using dnd-kit (npm package) the transform value was being overwritten causing this issue. To fix the issue rather the rotating with board using css I changed the order of files and ranks. I used flex-direction column replacing column-reverse for the rank to start from 1 to 8. Then for reversing the files when color is black then I mapped squares from reversed files array using toReversed array method. I thought by doing this I’ll make the code cleaner but I think it’s more messy now 😭 . Also I did have hard time understanding my own code when trying to solve the issue 😭 . I fixed the pieces, destSquares and captureSquares being generated on the wrong squares. I realized the piece transition wasn’t working when capturing piece both for user’s piece and opponent’s piece. The transition only happens if hasPlacedPieces is set to true and isDragging is false. So, my first assumption the hasPlacedPieces was being turned to false only when capturing pieces but I was wrong. I was checked if it had something to do with the value of isDragging. I found the isDragging was never turned false so I fixed it but still the main issue wasn’t resolved. I was console logging things and just trying to figure out what was actually causing the issue. The fix was really simple. To implement the drag and drop feature I’ve broken down piece code into it’s own component. There inside the component I have added the key attribute and it was the issue. The key attribute is supposed to be used on the component itself instead of inside the component div. (Eg.) I don’t know why it only broke the capture transition but anyways it’s fixed Now to the part where I don’t even understand how does this even happen. Hopefully you understood what I was saying in the video btw please unmute the video as I am talking in that video. So what happened was the piece img bg color changes when it’s selected. This was working fine until I added the dragging feature. When the piece is dragged you see the background color comes along with the piece. So I decided that the square should change it’s color rather than the img inside the piece. I was going to create squareRefs for holding all the values of sqaures and then select the square using gsap to change the color but I realized a easier way would be to just target the square id. It worked so I also decided to use for changing background color of square when user move was either correct or incorrect. On light squares it worked great and it also fixed the animation as the same animation was working a little weirdly when using pieceRefs. I was happy that it was better but then I found the bug from the video. I tried different things and just couldn’t figure out what was the issue but when I decided to change the color from var(–c-red) to yellow it worked as intended. Then I changed the same hsl color into hex and it also worked but I don’t know whyyyy. If someone knows why this happened please tell me cuz it’s ridiculous. Most of the issue had a simple solution but learning what caused the issue what the difficult part."}, {"post_id": 68502, "ts": "2026-09-15T07:18:35Z", "hours": 3.0806, "text": "Worked on the drag and drop feature Although it’s not fully complete and polished, it’s kinda working. I stopped working on the feature and started writing this devlog cuz It has been 3hrs I’m forgetting what I did while working on it. Firstly I wasn’t even going to implement this on the first place as I thought this was outside my coding capability but someone gave me a feedback that I should add this feature so I decided to give it a shot. I found out about the dnd-kit package for implementing drag and drop. I was skeptical of using it at first. I was reading their docs to figure out the package. My main concern was how would I implement the feature with the already existing click to move feature. They provide a useDraggable hook for making any element draggable. The useDraggable was used to make the piece draggable. I had to convert the piece code into a component for it to work. To drop something into another thing there’s useDropable hook which as the piece I made square, destSquares and captureSquares into components. If I were a good react dev I would’ve already did those things ig the using the package is some what helping my code to be cleaner. I used the useDroppable hook inside destinationSquares and captureSquares. I was concerned that we couldn’t actually drop the piece as it doesn’t live inside the square rather it lives on top of the board using position absolute. But, I had gotten dnd-kit wrong. I element does need go inside the element if useDroppable is used. There’s DragDropProvider that connects both draggable and droppable hook. Let’s just say DragDropProvider gave me all the function such as dragEnd and values needed to move the piece. Later I changed the useDroppable to be inside all squares cuz after dragging the piece there was some issues when dropping the piece in it’s original square if the user wanted to cancel the move. I didn’t really have to write new code for moving, capturing and resettingSquare as the code I wrote previously worked fine with the drag and drop functionality. There were many issues while trying to add this feature. Still there are issues I need to fix such as the highlighting the square bg color instead of the piece bg color when selecting piece and other bugs I’ve found. Also transition when opponent captures pieces doesn’t working also need to fix that. But, I’m really glad I tried to add this feature as I’ve learned alot and the puzzles board now feels more fun because of the feature. Thanks @PAPER_01 for suggesting the feature 💖 Okay, I’ll stop yapping. Have a good time"}, {"post_id": 67307, "ts": "2026-09-13T11:45:38Z", "hours": 2.3678, "text": "Gosh I’m so dumb Last time I thought I had fixed 404 page issue when visiting paths like course directly. I did fix it for local development but not for production which is really dumb, shouldn’t the development environment be the same as deployment when using vercel cli. I tweaked the vercel.json to fix the issue in production now but now in the development the website didn’t work. The fix that I’m now using is leaving the production as it is and in devlopment using the environment created by vercel cli only as backend and running the frontend seperately using pnpm run dev. To connect both backend and frontend I configured the vite.config.js to redirect every /api request to localhost:3000(this is running throught vercel cli) Most of the time was spent on making the signup page responsive. The login page is also now responsive but it’s just a copy paste of signup page css. I am quite dissapointed in myself because it took me so long to do this and still I don’t like how it looks on certain screens. As I realized that I was spending too much time on making signup page responsive I panicked and just rushed the process. As a result a have a reponsive signup and login page that I’m not very proud of. I fixed the signup not working. While signing up there it showed user already exist error everytime. The fix was quite simple, I had missed await keyword when checking for user with same email in database. Due to which the userExists variable was always true. Then I did something really dumb. I tried to fix something that was already working. I was worried that if I delete a user from database and then if that user tries to login then it would throw an error so without even checking if that was true I started making changes to the protectRoute.js file. I was thinking after the token is verified then I’ll just check if the user exists or not. In the process I deleted one important line of code because of which I wasn’t able to login now and I didn’t know why. I tried made the code as before not knowing the line is still missing so the error still persisted. After giving up and doing ctrl + z undo the previous code returned I finally realized the missing line of code. Also the feature was already there when fetching user data so none of this was necessary 🫠 ."}, {"post_id": 66353, "ts": "2026-09-12T04:12:13Z", "hours": 4.2436, "text": "We’ve reached 200 hours It’s a big milestone that I’ve finally reached . I’ve made the whole course page responsive. This took me longer than I’ve expected. But before that I was getting 404 not found when visiting locations like /course directly but it was working normally when I was navbar to navigate. I’ve seen this issue before as well so I kinda knew that this was because of react SPA (Single Page Application) thing. To fix this I configured the vercel.json file and now it works as expected. So onto the course page. Firstly I made the accordions responsive on mobile screens using css clamp function. I removed the course info section for mobile devices. I didn’t touch the course card as they were a future problem for me to do. But the basic idea was the image with take up the whole width and the image and the text will be vertically aligned instead of the default horizontal alignment. Between 1024px and 768px one of the issues was the course info was looking crammed on the smaller side. so I reduced the padding and font-sizes with clamp css function so that it still looks good on the bigger screens. I also made the progress bar slimmer and badges smaller. Another issue were the course cards. One the bigger screens they looked find but on smaller screens the text were taking up more height than the image itself. I changed the value of thumbnail image from fixed value to %. Also I reduced the massive 1.75rem padding on the course card container for smaller screens. Also for all screens sizes below768px I made the banner slightly bigger vertically as the previous banner was looking very slim on mobile devices. I scraped the idea of making course cards vertically aligned and stayed with the horizontal alignment. I somehow managed the cards to look decent on smaller screens as well by using clamp(). The things I needed to do were similar but I guess it took me long as I was first checking the min and max values using browser dev tools and then putting that into clamp calculator and then pasting the value into vscode. Basically I had to constantly switch between things. In the end, I went to sleep but couldn’t fall asleep so I decided to complete the course page reponsiveness and do on last thing which was making the loading spinner responsive. Then, I peacefully went to bed ."}, {"post_id": 65437, "ts": "2026-09-10T15:59:36Z", "hours": 3.6533, "text": "This was a rough one One a good note I’ve completed making the home page responsive (for now). After making the hero section more responsive last time I then proceeded with making the courses and puzzles page more responsive. I mainly used the clamp css funciton to make the course and puzzles section responsive. The courses section remained the same as I am quite happy wiht how it turn out but I didn’t like how the puzzles section was looking after testing the website out in my phone. It looked to small for a section so below 768px instead of the text and image being horizontally aligned it’s now vertically aligned. The clamp part was similar to the courses section. Finally after completing those two I started working on the visualization section. I was the hardest section to make responsive due to the absolute positioning of the moves. Firstly I only focused on bigger screens as I had no idea how it would look on smaller devices. The moves were positioned before by mapping an array with the move notation and the css of top and right/left with percent values. I tried to remove that and instead of mapping the elements I thought of manually placing them and giving the ids by which I could have greater control over the css. While trying that I couldn’t make it work as in smaller screen heights it still looked terrible. At this point I was losing hope. I was wasting time watching a anime series just so I could avoid working on this. I tried thinking out the solution but nothing came in mind. Later when I was messing around with css throught the developer tools on the browser I realized the I could change the height of the image container to change the positioning of the moves as the moves are postioned on the basis of the image container. Now below 1440px the height of image container is 90% and below 1024px it’s 80% and I have a max-height value set for safety. It’s not prefect but it’s much better and I’m relieved 😌 . The mobile design uses a image contaning the main image and all the moves as there’s no animation on mobile devices. I made the image in fimga and using clamps and % values I think it’s decently responsive. To make the pages responsive I am using the developer tool in browser to first figure out the min and max values and the putting that value into clamp calculator to generate values. I am constantly switching between vscode and browser for this and if you have a better way to do it please lemme know. Okay the devlog has turned very long so biee…"}, {"post_id": 64066, "ts": "2026-09-08T06:38:40Z", "hours": 1.9236, "text": "Worked on hero and puzzles section (Responsiveness) The puzzles section was the easier that hero and courses section for making it responsive cuz puzzles section doesn’t contain any animations or any special thing. After several trials of adjusting the fonts and image I stopped after it looked quite decent. Before working on the visualization section I decided to polish the hero section first. My main goal with polishing the hero sectino was mainly using clamp() css function for smooth responsive text. Although the text are responsive using media queries in hero section, the text look kinda odd in some screens. After using clamp the website feels better that before. Also I changed the width of image with % values which does feel better. I also used clamp for some vertical padding as well cuz it was looking bad for devices with smaller vertical heights. I thought from 425px to 768px was tablet screen size but it seems the tablet screen size starts from 768px. So now upto 768px the website follows the mobile design. Now I’ll polishing courses section and puzzles sections just like the hero section. Wish me luck 😄. Bye I wanted to add more images but it seems 4 is the limit ."}, {"post_id": 63438, "ts": "2026-09-07T08:57:07Z", "hours": 4.4833, "text": "More website responsive stuff Firstly, I removed the animations from home and courses section below 768px of screen size. I didn’t remove the hero section starting animation cuz it’s nice. I used gsap matchMedia to achieve this. While removing the animations a funny thing happened, the matchMedia wasn’t working and then I was reading this a gsap forum hoping to see where did I go wrong. I later found that I was doing things correctly but instead of looking at localhost I was looking at live website. Obviously the changes didn’t appear 🤦♂️ Then, I made the courses section kinda resposive. Firstly I went to figma to design the mobile version of courses section as I was mainly unsure of what to do with the thumbnail cards. I decided to turn them into carousel which imo was a great idea. First, I turned turned the main courses section text smaller and then started working on the carousel. The making of carousel was rough. Firstly I was reading stuff online on how the sliding thing works. I think I somewhat figured that out but what I couldn’t figure out is the aligning the cards perfectly. The issue was I was going for a style where the first and the last card aren’t centered alight while the rest of them are. The swiping snapped the cards into place and some parts of the left and right cards would also be visible. I couldn’t figure out how to make this and was about to making hamburger menu but coincidentally while scrolling the stardance home page I saw recommended projects section where it’s like a carousel without the snapping thing. It was way easier to achieve than what I was thinking so even though I didn’t make what I wanted the carousel isn’t bad. The overall the courses section felt responsive so I started working on the hamburger menu. Working on hamburger menu went pretty smoothly except for some things going wrong here and there. I first roughly designed the the menu in figma and then wrote the code."}, {"post_id": 62042, "ts": "2026-09-05T08:11:51Z", "hours": 3.8953, "text": "Starting making the website responsive Before starting on making the website responsive I saw that when logging in or signing up there is some delay before redirection where people might click the login button several times thinking that it it’s working which is bad ux. In development there was almost no delay because I was using local mongodb. To let the user know that the button has been clicked successfully and to prevent multiple login/signup button clicks the buttons are disabled as soon as user clicks any button in login or signup page while turning the buttons color into gray. Now on to the reponsive ui part. I first tried making the navbar responsive but it didn’t look right in small screens. I was also trying to make the hero section responsive but without any design to follow. So realizing that I needed a design first I then hopped onto figma to design the navbar and hero section. I changed the ui of the navbar ig to make it easier to make it responsive but I don’t know if the navbar ui got better or worse. I know one thing and that is the navbar has got simpler. The design on the mobile is pretty simple imo but that’s the best I could do to make it look decent. I used flex property to make all the text align vertically in phones and decided to remove the image in phone screens. I’ve have currently hidden all sections below 1024px except the hero section to focus only on the hero section without other sections interference. I’ve mostly used hardcoded values to make hero section which I will change to clamp css propery for smoother hero section responsiveness. I have just eyeballed the sizes and paddings which is a bad idea but I’m just lazy to create figma design for every layouts. Now, I’ll make the hamburger menu working. Uhh, I hate making website responsive but it has to be done. If you’ve any suggestion feel free to leave it down in the comments."}, {"post_id": 61270, "ts": "2026-09-04T03:49:40Z", "hours": 1.9669, "text": "The website is live guys I used vercel to deploy my mern stack project and it was rough . I first tried deploying the the frontend and the backend separately. After reading blogs and trying I ended up deploying the express backend but at that point I had learned that there’s vercel cli with which I don’t have to push commits everytime to find out errors in production. I can just use “vercel dev” command to create a production like environment but for development and testing out. I couldn’t figure out how to run frontend and backend seperately using vercel cli. I then tried deploying the whole repo. The issue with this was I couldn’t configure the website with folder structure like this chess-website ----frontend ----backend Maybe there’s a way to make this work (I couldn’t ), I chose the easier path which I’m kinda familiar with. In this approach there’s no frontend and backend directory. The backend is renamed to api which allows vercel to recognize that it’s the backend and all the contents of the frontend folder will be moved up to the root directory. Errors came as I changed the folder structure but fixed on after another. The backend wasn’t working which got me really confused. There were many issues in this approach as well but atlast the website is running and backend is working properly . The two days break I took from coding is over and i think I feel better. Here’s the link to the website: https://evochess.vercel.app/"}, {"post_id": 58966, "ts": "2026-08-31T15:18:41Z", "hours": 2.2961, "text": "Many small improvements 🙂 I’ve added transition to level btns and added icons and different ui to puzzle sidebar button. I am using an array inside objects to display all buttons. So to customize the buttons I manipulated the array.Some button have only text, some have both text and img and some have only img. Also the main button is wider and other buttons are gray in background color. For this I used the className like in tailwind to add the styling meaning the buttons which need gray color will have the className gray. The size of the buttons is differentiated using different values of flex grow. I think the buttons look way better now. I’ve added reset if user changes from puzzles page to other page. The is to avoid any unnecessary bugs and error. I had already done this in vision page now it was the turn of the puzzles page. I have been avoiding this for so long but finally I’ve done it. I added the videos for professional course (or should I say advance course). I changed the name to advance cuz professional is just the wrong word to use here. I also moved some videos from beginner to intermediate. Now that the courses are in place I can finally write what you’ll learn in the information section. I’ve added numbers such as 0 - 1000 representing what I mean by beginner. I’ve tried to match videos to the elo level. The data in courses section in the home page is also change from placeholder data. Looking back at the code they are really bad but I’ll leave it as it is not broken 😁. Now I think the project is coming to it’s final stages I do need to add things but after that ig all I need is to polish the website and make website responsive. I’ve also fixed progress bar animation happening everytime on reload. This was a small thing but it was bugging me so I decided to fix it. Fixing it was annoying as I had expected to fix this easily. After some trial and error I fixed it using a hasCompleted state which is set to true after finish lesson button is click. Only when the hasCompleted is true the animation occurs. Some other changes I did were fixing only displaying highest achieved medal in course page and adding background color transitions to buttons. Enought yapping. I don’t feel like coding and I think I should take some rest for the next two days. Hope the rest reset my feelings and returns me to my prime stardance days 😆."}, {"post_id": 56525, "ts": "2026-08-28T10:04:18Z", "hours": 2.7708, "text": "Wow! This is the 51th devlog I’ve added the player color indicator in the sidebar. It tells you which color you’re playing. Before coding this I just complicating things in my head by thinking of creating new unnecessary states. I used pen and paper to think and realized why not use the color state already available in chessboard. To access the state I moved it up to the puzzles context file where both sidebar and chessboard could get and change the color. I also moved the hint down as it look clutter both color and hint together in the sidebar. Two quick small fixes. I fixed retry and back button not working and fixed replay button not playing the same level only on last level. I’ve added pawn promotions functionality to the opponent’s pawns. In puzzle 17 and 26 there are promotions that happen but without the promotion part it just looks weird to look at. Especially in level 26 where the pawn promotes to a knight and without having that knowledge the user will just get confused. I haven’t added promotion functionality for the user pawns because there is no puzzle that requires it. I will add it if I have the time to but rn i am going to just ignore it. One of the bugs I faced while doing this was the knight promotion worked fine but the queen promotion at level 17 wasn’t. The pawn was just disappearing because the pawn was capturing itself cuz the promotion only work for black pieces which is now fixed. Next I fixed the random color option color menu not working. Idk when and how it broke I thought it was working fine but it seems not. It seems it was not working because the element was being unmounted before running the selectRandomColor function. So, I moved it to vision context and with a useEffect hook it runs every time hasStarted is true. A small change but which I feel great that it’s solved. When clicking on accordion or pieces twice sometimes it selects the icon and other things which was just annoying. The fix was just two lines of css which I learned from a random dude on the internet. Really thank that random dude. I’ve now added functionality for adding multiple bestScore for according to the time and color. Before the highest score in vision would be the score scored across any time or color. So if you were to score 5 point in 45 seconds and score 5 points in 30 seconds they were treated as the same thing which imo opinion isn’t fair. To achieve this I used object inside a object unlike the single number representing the bestScore like before. The object looks like this. { white: { 15: 0, 30: 0, 45: 0, }, black: { 15: 0, 30: 0, 45: 0, } } I did have a very hard time figuring out how to update the state like this as I had to change the specific time score within the correct color. One thing I did learn from this is we can use square brackets for using a variable’s value as key while manipulating the useState object. I also encountered some errors while trying to implement this functionality. Now everything is working as expected."}, {"post_id": 55374, "ts": "2026-08-27T05:12:03Z", "hours": 2.2717, "text": "I’m so sloppy now I’ve added sounds for piece movement, capturing piece and completed puzzle. I spent more time than I should’ve finding the sounds. I am still not sure about the sounds that I’ve added expect completed puzzle sound. There was issue with playing sounds during opponent move cuz unlike moving player’s piece where there are seperate function for moving and capturing pieces, the moving and capturing logic is inside the same function. After thinking a while I did solve the issue. It seems mac default recording doesn’t capture sounds so you just have to trust me here 😅. I’ve made hint button disabled when pieces are moving (Both player and opponent piece). I did this after figuring out if user click the hint button quickly after the last puzzle move then we get an error. Although this thing happening is very unlikely but it’s better to always fix bugs. Also I don’t know what happens if user clicks on hint inbetween moves so I think preventing it is better. A small change, I’ve added better hover transition to logout button. I didn’t add a red background during making it cuz I had issue with chaning the svg color. I’ve learned that if I make the svg inline in the jsx and set fill to currentColor then I can change the svg color through css and add transitions. Also, I’ve added popup animations to time menu and color menu. I was even struggling with this even though I’ve added those kind of animations before. I was using the new Activity element in react to toggle the menus but to for adding the animations I’ve removed the Activity element cuz the menu would disappear before animating. I took some break from coding cuz I got sick. I think I’m really sloppy now. Imo these changes shouldn’t have taken me 2hrs. Hope I will be able to shake off this sloppiness."}, {"post_id": 53935, "ts": "2026-08-24T17:12:15Z", "hours": 2.6236, "text": "A little rest from programming I’ve added hint button in the puzzles sidebar. I had been trying to avoid working on this but I couldn’t avoid it forever. Also the puzzles sidebar looked really empty without the hint button. In chess.com the hint button highlights the correct. I did things a little differently, the hint is communicated via text to user. The text animates during first appearance and I’ve made it so that user gets only one hint. After the hint the button goes gray indicating it’s not clickable anymore. I made puzzles sidebar code better to display buttons and also added replay button with functionality on successful puzzle complete. I mainly made the code better cuz I need to add the replay button. The replay button is same as retry button for replaying the puzzle after completion. I made next button do nothing if user reaches the last level. Before when completing the last puzzle level we would reach the next level automatically which is prevented now. I’ve been sick for 2-3 days now and am just writing this devlog. Hopefully from tomorrow I will be working on the project more seriously."}, {"post_id": 51434, "ts": "2026-08-21T04:22:13Z", "hours": 1.9856, "text": "Interesting updates I added back button in puzzles sidebar with functionality. Before there was not way to go to the default sidebar (the notStarted state). Now after messing up or completing a puzzle there’s a back button which sets the board to default postion and set sidebarMode to “notStarted”. I wanted both buttons to be taking up equal space but later thought the smaller back button is better. Also now, puzzleLevel updates instantly updates after solving a puzzle instead of updating only after clicking next puzzle button. User can now select and play any completed puzzle by clicking level btns in sidebar. Previously user can only start the puzzle Level user has reached which meant no puzzle 1 and 2 resolving puzzle after user has reached level 3. I split the puzzleLevel state into selectedLevel and highestReachedLevel. The puzzle is set to the selectedLevel and the buttons aren’t clickable above the highestReachedLevel. The ui of level buttons is changed. I made the buttons smaller and made the selected level more distinct by adding a inner glow to the button. We’ve upto 30 levels now . I downloaded the lichess puzzles database for this project but whenever I opened the file my laptop will just heat as there were more than 69 millions data 💀 . I did try to use the lichess data but I didn’t actually like the progression of difficulty so I used chatgpt to make puzzles. I’ve played upto 21 levels and I think it’s good so far. That’s all for now, okay bie…."}, {"post_id": 50379, "ts": "2026-08-19T15:27:48Z", "hours": 1.1106, "text": "Finally, I present to you a short devlog 😆 I have fixed the issue of pieces moving with transition when pieces are being placed after clicking on retry puzzle. To prevent this I already written code which worked perfectly but when only on retry puzzle it wasn’t working. This solution was simple but figuring out the issue took time. To fix the issue I used a useState hook to set hasPiecesPlaced to true only after pieces state updated. Also, I’ve already written code for handling page change in the middle of vision practice. I think this doesn’t work after I removed Chessboard.jsx and ChessboardContext.jsx. Not sure when this broke . I found better way to do this using the useEffect hook cleanup function. I learned that when adding setState directly in cleanup function it throws at recurring error 😭 . I felt my laptop heating up 😭 😭 . But there’s no error when adding setState inside the function and then running the function in the cleanup function. That’s all for today. Couldn’t do as much as would like today cuz a rat bit me 😭. Bye…"}, {"post_id": 49661, "ts": "2026-08-18T15:27:18Z", "hours": 4.6519, "text": "Ayy good progress today I created a separate chessboard component for puzzles page only. Before both puzzles page and vision page were using the same chessboard component making the code complex, hard to read and hard to debug. Firstly I decided to move all the chessboard functions and states into puzzle context but later changed my mind midway. I decided the chessboard functions and states make more sense to be in it’s own folder. Everything broke while doing as expected but I fixed them one by one. Now the puzzles chessboard is functional and it’s code looks a little less overwhelming to me. Now the vision page also needed a separate a chessboard. It wasn’t as easy as just copying and pasting most of the code into vision chessboard because the data was connected to more components of the sidebar such as progress timer, color Menu, etc. I don’t if I should separate the functions to components that they server of just dump it all into the vision context file. What I did was keep functions into their respective folders cuz I think the vision context file looks really cluttered doing that. Everything broke here as well but as before I fixed things one by one. Now I really believe it will be much easier for me to work on chessboards as they’ve been seperated. Also I deleted the original chessboard component and chessboard context after that. On clicking the sidebar button the reset board function is called and the function came from chessboard context. As there is no chessboard context now you can see that there’s a problem here. The reset board function in now in PuzzlesChessboard.jsx which means we can’t access it from PuzzlesSidebarBody.jsx. To solve this I just made the board reset everytime when hasPuzzleStarted is true. We do have the access to hasPuzzleStarted from puzzle context. Fixing that somehow broke the piece transition though. After that I mostly worked on the small things. Such as fixing no transition during piece, fixing the progress timer staring with 2 seconds less than the time set, adding chessboard size to puzzles chessboard in a better way, etc… Now the next puzzle and retry puzzle buttons also work. The next puzzle button works as expected. The retry puzzle button also works but the pieces move to their repective place with animation when the board resets which I don’t wan’t. To prevent this specific thing I have already written some code before and it’s working when starting the puzzle, moving to next puzzle, rendering the default pieces on first load. I can’t figure out why it’s specifically working for retrying a puzzle. I spend a good amount of time looking but idk. I’ll look into this tomorrow. I think the devlogs are still pretty long. I’ll try to keep the devlogs shorter on future devlogs. Okay bie…"}, {"post_id": 48941, "ts": "2026-08-17T14:42:47Z", "hours": 3.0389, "text": "Two steps forward, Four steps backwards 😭 Firstly, I’ve fixed the gsap animations not working. This happened because last time I renamed all the color state into chessboardColor. Due to this the gsap backgroundColor css property turned into backgroundchessboardColor. Ig the lesson here is think before using change all occurences feature in vscode. The sidebar now changes. If puzzle hasn’t started then it’s the same old ui. If the puzzle starts the level btns disappear along with start puzzle button. If user makes incorrect move the sidebar show retry puzzle button and if the puzzle is completed successfully then next puzzle button shows up. One thing I learned here is making one button use different className, onClick handler and text easily by storing all data in object. The retry and completed onClick function looks empty. So, I decided to work on the retry puzzle button functionality. To make the functionality work I imported the resetBoard function from chessboard context. Calling the function directly didn’t work because setState function doesn’t apparently update if the value is same. I fixed that by passing {retryLevel: true} or false to the function. After doing this the first opponent move did break and I did fix it but I think with bad code. Looking at the code now I’ve been calling resetting the board and setting default position using the chessboardColor seems wrong. So, then I started cleaning the code. I guess I was correct and things needed to change. I would say these are mostly small changes and don’t need explanation but it seems that the chessboardColor had an actually bug and it took my soul away trying to fix that 😭 . So, the opponent move was capturing it’s own piece meaning that the piece which moved at the beginning would automatically disappear. This was happening because the moveOpponentPiece function ran before the chessboardColor could change when the puzzle is first started. To fix this I had used useEffect hook with chessboardColor in the dependency array to reset the board. But only works if I have the black pieces. If I have the white pieces the chessboardColor doesn’t update because useState doesn’t update when the value is same. The value is white at first because of the default position set when puzzle hasn’t started. I don’t even know how to explain the fix i used. I just chained state updates from file to file to have colorUpdated state value updated in chessboard context.jsx. Basically I had a rough time fixing the resetBoard function running before chessboard color was updated. This time even pen and paper also couldn’t help me solve this 😭 😭 but it did help me to understand the problem on a deeper level. I tried adding next puzzle button functionality. “I tried” 😭 cuz I couldn’t get it to work and on top of that when I tested the retry button it didn’t work. Don’t know how but the retry button also broke. Now, I’m taking a huge decision again. I think some of the problems can be reduced if the chessboard wasn’t a single component that works on both puzzle page and vision page. I think I was too ambitious but now seeing these issues I think it’s better for me to have to separate chessboard components. This might not be the best practice, but this will probably make my life easier. I just read the “Devlogs that get noticed” in the resources page and I think I should make my devlogs a little shorter. I said this in one of my previous blocks as well, but it seems that I am explaining too much. So let’s see what will happen tomorrow. Okay bieeee…."}, {"post_id": 47257, "ts": "2026-08-15T02:00:48Z", "hours": 3.0875, "text": "Learnt something valuable ✨ Okay now the puzzle buttons have dynamic ui. The puzzle button will have ui according to the puzzle level. I was confused on how to achieive because there were three condition instead of two. If there were only two coniditions then it would have be easy as I would have simply used ternary operator. I couldn’t use if condition inside jsx. After some time I figured that if could call a function and use if conditions inside the function and return the className. Also now the puzzle level is stored and fetched from the backend. After doing that a toast error popped up as you can see below. I didn’t know why this was showing up when the page is first loaded up but instead of fixing that I first moved on to make the start puzzle button work. I think my main problem is I get distracted easily. To make the start puzzles button work firstly I created puzzle context file . I was deciding to make the chesboard context the puzzlecontext as all the data needed for puzzles page was there but I think it’s better to seperate those things. So, I placed the puzzle context higher than chessboard context with that thought process. If the puzzle hasn’t started the fen value is set to default starting position. Then I again got distracted and thought why isn’t the vision context also above the chessboard context. So, I moved the vision context and the coordinates broke. The reason was color state so then I created different color states for vision and puzzle context. While writing this I don’t actually know what I’m really doing. I do one thing and jump onto another making writing the devlog very hard. I think I can do better… 🙁 After learning the lesson, doing thing one at a time. I only focused on making the start button work. So I moved some values inside puzzles context for this to work and everything broke. But, I wasn’t feeling overwhelmed as my focus on only one thing. Slowly but surely I fixed the pieces moving, capturing and the first opponent move. I think my main issue is dealing with useState hook updating in batches. Ig I will just get better with time. Still the backgroundColor animation is broken which I need to fix. Also while doing this I found out why the toast error was occurring. Silly me didn’t add method post to update the puzzle level. Now after the puzzle finishes the puzzle levels value updates and the updated value persists. I should definitely do things one at a time. Getting distracted and doing multiple things will just make me feeling overwhelmed and will make it harder for me to devlog as well."}, {"post_id": 46384, "ts": "2026-08-13T15:40:46Z", "hours": 4.4847, "text": "Making good progress The piece background color now changes color depending upon the correct or incorrect move that the user makes. Last time I was trying to achieve this by just using useState hook. I’ve understood now that it was the wrong approach instead now gsap handles the animation part. The main issue with gsap I was having was I didn’t know how to select the exact piece for animation. I’ve achieved this by using useRef hook named pieceRefs containing an object will all the pieces on the board with their ids as key. I haven’t never used a ref like this before and it feels scary to write code in the unknown territory but ig it’s a part learning. Also I’ve removed the code that changed the backgroundColor using useState and used gsap. It was just waste of my time to try to use useState hook to change the backgroundColor . So now, piece toggling the highlighted bg color when a piece is selected or unselected will be handled through gsap. Ahhhhhhh.. Finally after a puzzle is completed successfully the the next puzzle will start. My brain feels like it’s melting after making this work. I struggled so much to make the work mainly due to react batching the state updates. Unexpected bugs came while coding this. So, basically a puzzle is considered finished if the moveOpponentPiece function has no moves left. Then, we change the fen state and also reset the board so that the pieces are placed again. After that when player reaches next level the opponent first move needs to take place. For that I have a useEffect hook to check if opponentMoveIndex and userMoveIndex value are default values. The values are set to default through resetBoard function and if the values are the default ones then the opponent pieces moves. One of the main issues I had with this was the moveOpponentPiece function was running twice. Due to which one of the opponent move was being skipped. I wasn’t able to locate why and was making so many unnecessary changes and console logging everywhere to fix this 😭 . The issue was that the useEffect that I talked about earlier had pieces in the dependency array making the moveOpponentPiece function to run twice. I’m really exhausted after doing this… Then after some relaxation I made a rough figma design for the puzzles sidebar. It was kinda relaxing to not worry about coding for a while. I had big plans for the sidebar like making candy crush type levels but I don’t think I’ve time for that so just basic buttons will have to do. I’ve tried creating the distuinguishing the levels based on completed levels, current level and locked levels. Back to coding again, I mostly copied the vision sidebar code for puzzles sidebar as the only difference is in the sidebar body. It seems that I’ve forgetten to use css grids. I wanted the buttons layout to be responsive. I took a quick revisit on how grids. Throwed random properties at the grid hoping it will work as I expected 😆. At last it was the auto-fill property I was looking for with a combination of minmax. I’ve tried created the css for completed, current and locked now I just have to hook them up to the buttons according to puzzle level reached by player. I’ll do that tomorrow, now I’ll stop writing. If you’re reading this, I hope your project is going well💖."}, {"post_id": 45805, "ts": "2026-08-12T14:57:39Z", "hours": 2.5114, "text": "I am stuck Ayy the opponent moves work as expected now. In last devlog I wasn’t able to capture opponent’s page because I accidentally didn’t filter the pieces, only moved the piece. Now the capturing system also works as normal. While talking about capturing pieces now the opponent can also capture pieces. If any of the player’s piece is on the destination of opponent’s piece then it will be captured. The main lesson learned here is to mostly use the previous data while changing the state’s value to avoid unnecessary bugs. I’ve made the reset board function work. This was the point where I decided to rebuilt the code by removing the use dom manipulation and looking back I think it was a great decision by me. (Context: 2, 3 devlogs ago I found out my code was really trash while creating the reset board function). While writing reset board function I did run into some weird bugs. The board is reset by reconverting the fen to pieces array. The first opponent move happens when the opponentMoveIndex is 0 now. In the reset function the opponentMoveIndex is set to zero. I’ll add a animation to indicate that the user’s move is incorrect later. For now I added the animation for the piece moving. I’ve learned that when moving the pieces by updating the state in react, the key of the element is what matters for animation to occur. If the key of the element is same and just the transform style has changed react knows that it’s the same piece that jumped from one place to another. Also now, the move transition doesn’t happen when the pieces are being place. Because the pieces are placed using the transfrom property, the same property used to move the piece. I took me a while to fix this. It seems that this was happening because the squareWidth was making the page re render. I’ve fixed it but I still I don’t completely understand it, which shows that I’ve a long way to go. This one is small but crucial. Now the user cannot select the opponent’s piece during opponent’s turn. I’ve added a 500 ms delay for opponent’s move so that it doesn’t feel things are happening really fast. In that timeframe user is not able to select any pieces now. I am now stuck at the part where I am trying to animate the pieces after checking the user input. Whether it’s correct or incorrect. I wanted to make the background green if the move was correct and red if it move user made was incorrect. Using states is proving to be tricky for me as they’re fully synchronous. My brain goes okay this will happen and that will happen but the code won’t have the updated data because of useState nature. Also I tried to change the background color same way I move the pieces. Now that I think I about it I just wasted time. I will try to do animations with gsap now but idk how to explain I can’t really think of a way to do it with these useStates. Okay this was more that enough yap for 2hr 30 mins of work. Let’s see if I figure out a way tomorrow. If you’re reading this love you man 💖."}, {"post_id": 45236, "ts": "2026-08-11T16:05:21Z", "hours": 6.4983, "text": "Most rebuilding my broken code For context last devlog I took the decision to start rewriting the code to stop accessing dom directly by using states. Now the pieces are mapped from pieces state rather than directly from fen so that I can move the pieces from state instead of manipulating the dom. To achieve this I firstly created to convert the fen to pieces array. The pieces array looks something like this rn. [ {id: 'r-a8', pieceNotation: 'r', square: 'a8', coordOfFile: 0, coordOfRank: 0}, {id: 'r-e8', pieceNotation: 'r', square: 'e8', coordOfFile: 4, coordOfRank: 0} ] From this I learnt that setting the key attribute serves it’s own purpose in react. I don’t fully understand it rn but I’ll look into it. Now, the id of the piece serves as the key for the piece element and if I’ve understood correctly that will be vital in animating the piece moving. Yay the rook has been reestablished using react state without any dom manipulation. The reestablishment wasn’t too difficult as I thought due to the already existing code. All the changes now happen in the pieces state which then causes the react to repaint the pieces. Now the rook can move from one square to another and capture opponent’s pieces. Also I’ve made the reset squares function as it removes the destination squares, caputure squares, etc . Although there’s no animation during piece movement rn I’ll it add later. After making the rook work I stared making all other pieces work as they used to before. I thought I had to write most of the code to fix all the pieces but after finishing the rook other fix other pieces wasn’t that bad. I reused the code from the rook where I could, fixed some bugs and errors on the way and modified the code where necessary. Sometimes I got stuck due to my own stupidity but that’s nothing new 😆. The moveOpponentPiece function is rebuilt. Now the first opponent move will happen when the board is first loaded. While fixing this function I found out that I was able to select the opponent’s piece as well. This shouldn’t be the case cuz I had already put railguards for preventing this. After fixing the moveOpponentPiece function I checked why this was happenning and the cause was I put railguards only if user click on another piece when a piece was already selected and that code was also wrong. I fixed them both and now they work as expected. Another bug found. When I clicked on the first pawn it only created one destination square instead of two. This was happening because the for loop had only 7 iterations instead of 8 which added the starting pawn squares to the array. Also the user’s pawn were able to capture the user’s pieces which was a big nono so I quickly fixed that. Even thought the moveOpponentPiece is working for the first move it instantly breaks from the second move. I still fully don’t understand why this is happening. I know it has something to do with using setState and it not being synchronous. The code looks like this let updatedPieces = pieces.map((piece) => { if (piece.square === position) { return { ...piece, square: destination }; } return piece; }); setPieces((prev) => { console.log(\"updated\", updatedPieces);// I don't understand how this value return updatedPieces; // and this are have different values}); I’ve fixed it while writing this devlog removing updatedPieces variable and mapping the value directly inside setPieces(). Now, the second move works but the third move is broken 😭 . I’ll look into this tomorrow. I’ll wrap this up for today. Also I’m changing my devlog style a little bit. I’m not telling you all the problems I ran into like I did before to keep the devlogs a little short."}, {"post_id": 44520, "ts": "2026-08-10T10:34:10Z", "hours": 3.1394, "text": "Taking a BIG decision Updates: Fixed pieces creating only single capture square Added redirection to signup page in puzzle and vision page if user isn’t logged in Made user unable to select piece when opponent’s piece is moving Connect oppenent’s move to puzzle data, Add check for user moves and Add functionality to make the opponent piece move automatically after user plays the correct move I fixed the pawn not being showing two capture squares last time. After that I found out that the capturing the piece wasn’t removing the piece from the board. I found out a function that I have commented out was being called and causing an error so I removed the function call for now. This was easy to fix but by doing this I found out that the pawn wasn’t the only one who wasn’t able to display mutliple capture squares. All the other pieces weren’t able to display multiple capture squares due to a simple rookie react mistake. The value of captureSquares was being updated with it’s own value instead of using the previous value. After sorting that out I figured i should do same with the destination squares. Previously had an array updatedDestinationSquares after pushing all the values to the array then only I updated the destinationSquares value. In short I was doing the correct thing and me thinking that I could save 2 lines of code by adding setDestinationSquares directly to the loop was a bad idea but the state function isn’t synchronous. So I undid all the changes and also added a updatedCaptureSquare to all functions just to be safe. Now user can’t select pieces when it’s the opponent’s turn. Although the timeframe to select piece is small but still I wanted to be safe. I achieved this with a state named isOpponentPieceMoving. it’s toggled on when user clicks on a destination square and toggles back off after the animation finishes. Next I tried to make the opponent piece move work through with the help of the lichess puzzle data. Before the opponent piece could only the first move to play. After connecting the moveOpponentPiece with puzzles data. I created a function to check whether the move made by user is correct or incorrect. This was also being checked with the data in constants.js file. The data is stored like this r3r1k1/p4ppp/2p2n2/1p6/3P1qb1/2NQR3/PPB2PP1/R1B3K1 w - - 5,e3g3 e8e1 g1h2 e1c1 a1c1 f4h6 h2g1 h6c1 The moves part start after the comma. First move is of opponent. It tells from which square to which square the piece is needs to be moved Eg(e3 to g3). The second move seperated by space is what the user need to play to move forward in the puzzle. So if the user’s move is correct then I move the opponent’s piece. But if it’s incorrect then I reset the board. I got lost in the reset part. I learned if the key of a element is changed the element kinda resets. When I started doing this I felt a little uneasy. I was figuring out the code I wrote was manipulating the dom which isn’t the best practice in react. Regardless, I added a fragment to the code that was generating the pieces with a key with the value of boardKey and updated the boardKey when the user’s move was incorrect. But in my mind a question was lingering \"Should I redo this in the way how react wants it\" . Seeing the functionality working I pushed off that question. But, when I captured a piece a error popped up. The ss is below. I tried to locate why was that error popping up. I’ve concluded that the bad code has started to show why it’s called bad code. Although I might find this solution to this issue I think it’s better for me to just rewrite the code. This is painful but it will make me a better developer. Also I found another bug, the error isn’t the only reason I’m making this decision. I’ll push the code upto what I’ve done right now and then I’ll start to fix what I’ve created."}, {"post_id": 44051, "ts": "2026-08-09T15:53:39Z", "hours": 2.9425, "text": "I’m dissapointed in myself Updates: Fixed pawn unable to show two capture squares at once Added function to move opponent’s piece automatically Set fen according to puzzleLevel Moved opponent piece after the pieces have been placed and remove css transition into gsap animation while moving pieces Last time I added functionality to pawn to be able to capture pieces. It worked fine I there was only one piece diagonal to the pawn. I there were two pieces diagonally infront of the pawn only one capture square would appear. Now two capture squares appear if there are two pieces in front of the pawn diagonally. Fixing this was simple. Created the function to move the opponent’s piece automatically. In puzzles the user only moves their piece, the opponent’s piece moves automatically after user plays their move. This was the most frustrating thing I worked on today. I thought the function worked correctly but I was wrong. I’ll tell you in a sec. I added 3 fens with moves from lichess puzzles data in constants.js . Then I made the default fen data to null and made it so that the fen is selected according to the level of the puzzle. I think I was trying to add loading state for this. It was very poor thinking from me. I was just being very ambious and instead of trying to do things step by step I was trying to multiple things at this time. I don’t remember exactly what changes I tried to make ig I was trying to fix the moveOppenentPiece function as well at this time. I undid some of those changes, left others as it was and fixed the fen and commited that. I was already frustrated at that point and then when I tried fixing the moveOpponentPiece function the constant errors and bugs worsened my frustration. I don’t want to explain that part. Just know that after fighting with my code it’s working now. Also before I had css transition for trasform property. Meaning that whenever the pieces moved it moved smoothly. But when the chessboard is first rendered all the pieces also animate to their places. I fixed this by removing the transition css and using gsap to move the pieces. Now the first opponent move happens automatically. This was also frustrating to make it working. Basically today was frustrating. I thought I coded longer but seems like not. But anyway, when you’re at the bottom the only was is going up. Saying that I will stop writing this devlog. I feel I could have written an essay today. Okay bie…"}, {"post_id": 43708, "ts": "2026-08-09T03:48:45Z", "hours": 3.2064, "text": "Gobble up pieces Updates: Rotated piece img when color is black and made user unable to select opponent’s piece Added functionality of capturing pieces with rook Added functionality of capturing pieces to bishop, king and knight Added functionality of capturing pieces with pawn My goal was to make the board work from both sides. I was ready for this goal to be challenging. I was messing with squareid and position of pieces by checking the color of the board. But it seems don’t have to do much for things to work. Before, I have already made the board rotate using css. I was rotating the pieces when color was black and that was causing issue. Instead of rotating the piece I simply rotated the img inside the piece. Till now every is working as expected. Also I made user unable to select the opposite colored piece. Now we can capture pieces . If a piece can be captured, the piece will have four triangles at the corners. This is inspired from lichess as I didn’t really like the circle of chess.com. I made the triangles myself using figma. Also I created the dot in figma to change it’s color. Previously the dots were green. It took me some time to pick the colors of triangle and dot cuz I didn’t wanted their colors to ruin the feel of the chessboard. This works by firstly determining if the piece in the way of destination squares is our piece or the opponents. If it’s our piece then destination squares will instantly stop generating but if it’s the opponent’s piece the we first add the sqaure position to capuredSquares array and then stop generating the destination squares. While doing this I learnt about the remove method which allow me to remove the captured piece element from the board. It took time for figuring out how capture pieces with rook. After that it was really easy for me to do the same with other pieces as well except for the pawn. The pawn isn’t the same as other pieces. It moves vertically and captures diagonally. So I had to write code differently for the pawn. I code for the pawn does seem a little messy but i think it’s fine. I would say it wasn’t too difficult to make the pawn capture pieces. I did have to think about making the capturing functionality work for both white and black pawns. This much for this devlog. I am being quite lazy nowadays. Time to grind and lock back in. Hit me up if you also want to grind along with me."}, {"post_id": 43022, "ts": "2026-08-08T02:09:50Z", "hours": 3.1258, "text": "Mostly cleaning up my messy code 🧹 Updates: Made bishop not able to pass through pieces Made the code creating rook destination squares much cleaner Made the code creating bishop destination squares much cleaner Fixed rook and bishop not creating destination sqaures at the edges of the board Made code for creating knight destination squares cleaner and fix if statement condition of rook in ChessboardContext.jsx Made code for creating pawn destination squares cleaner and make pawn unable to pass through pieces Fixed bug while clicking on a piece when another piece is already selected In last devlog I made the rook unable to pass through pieces so it was very logical to do the same to bishop. Making the bishop unable to pass through pieces was pretty simple as the code wasn’t much different from the rook one. Idk what clicked in me after doing that I started to thinking about making the rook destionation squares creation code cleaner. The code was very messy and repitetive and I believed it can made cleaner and smaller. I used 4 while loops before which had almost the same code but different values and slightly different calculations. After thinking and trying I turned the 4 while loops in to a single while loop. Now the code looks much better. Seeing the success in rook destination squares creation code I then moved on to the bishop’s code. Made similar changes to the code as the rook’s code. Also i believe the queen works perfectly as it’s mixture of rook and bishop code but I haven’t really tested it on board. After cleaning up both rook and bishop I found a small bug. The bug appeared because of my slight mistake while trying to make the code better. Basically the rooke and bishop weren’t creating any destination square at the edges of the board. The fix was simple so this didn’t take long to fix. I already didn’t like the knight’s destination squares creation code. Me cleaning up the rook and bishop code gave me the motivation to make the knights code better. It did take some time for me for cleaning up that messy and tangled code. I was using break keyword for rook and bishop so I also used break for stopping the loop but I didn’t want the loop to stop completely I just needed to skip the loop if there way a piece or if the knight was on the edge of the board. After a quick search I found that continue keyword does the job. The pawn code wasn’t that messy but it could definetely do better. I mainly changed the pawn’s code cuz I wanted the pawn to also be unable to pass through pieces. Before there were two loops now I one loop does the job. Then I also made the pawn unable to pass through pieces by breaking the loop. Fixed the annoying bug. If a piece is clicked when another piece is already selected then it looks like both pieces are selected. Desitnation of both pieces are shown and both pieces are hightlighted. So, as clicking on a square reset the selected piece, I reset the previous piece if user selected another piece with a small change. Now I’m trying to making all these things work from the black side as well. Okay this much for this devlog. See you on the next one. Biee…👋"}, {"post_id": 42402, "ts": "2026-08-07T02:53:40Z", "hours": 3.7158, "text": "30 day streak let’s goo 🔥 Updates: Added functionality of moving pawn with seperation destination square for white and black Added functionality of moving knight Changed color of chessboard Made rook not able to pass through pieces The pawns now move one square at a time and have the option to move two squares if they’re on starting squares. Moving pawn one square is easy but I had to think about creating two destination squares infront of the pawn. So I created a array and push all the starting squares of the pawn and if the pawn is on one of the starting squares then two destination squares are created. It’s also seperate for black pawn and white pawn so that white pawn doesn’t get two destination squares when it’s on the black pawn’s starting squares. I forgot the knight also needed to move lol 😆. Just remembered in time after finishing the pawn. The knight was tricky to move. As always I used the mighty pen and paper first before coding. Creating the knight took some time due to random bugs here and there. I think I need to revisit the knight code later as it’s very messy. Yay, now the back pieces don’t disapper on the dark squares as I have changed the chessboard light and dark square colors. I think the new colors look great. I was lazy to test out colors so I went to chess.com and picked colors from one of their themes. Okay now were moving to the next step. Making the pieces not be able to move through pieces. I started with the rook. The plan was simple. Check for any piece with squareid that’s same of the destination square and if true stop the loop. I couldn’t figure out how to even select the piece. I was frustrated as I need to select the specific piece with the squareid attribute. I found out about ReactDOM.findDOMNode but I couldn’t figure out how to work with it. I felt really frustrated at that time. I was thinking of using document object but I know that is a bad practice in react. It seems I forgot that we can use querySelector in refs. I already had the chessboardRef so I used querySelector to find if a piece was on the way of the rook. Also I had to change the way I calculated the rook’s destination squares but let’s not talk about that I think the devlog has gotten pretty long. Although the problems are hard for me to solve when I see the results working I genuinely feel happy. I have gotten lazy after getting sick. Although I have not fully recovered yet I’ll try to stop wasting my time. Okay this much for now biee…."}, {"post_id": 40781, "ts": "2026-08-04T15:12:05Z", "hours": 3.8114, "text": "More pieces can move (I’m sick again 😭) Updates: Added functionality to handle vision page if user changes page during vision practice Added functionality of moving bishop and seperate calculation of rook moves Added functionality of moving queen Added functionality of moving king I told in the last devlog that I was working on hanling vision page if user changed page during vision practice. And now, it’s done. I think I have reset the necessary things so that vision page works normal. If any bug related to this appear in the future then I’ll fix it then. Right now everything looks fine after adding this functionality. Creating destination squares for rook was easy and I thought bishop would also be probably easy. I was very wrong. The thing with rook is that there will always be equal number of destination squares but bishop doesn’t. I bishop’s destination squares varies according to it’s position. I took a long time to figure things out in pen and paper. I even wrote the whole chessboard notation in paper and looked at only one diagonal first to find some sequence ( I’ve attached the img below 😆). I started coding after kind of figuring out where to start. I had issues during coding as well but we got it boys. Also I was using OR instead of AND in the while loop causing bugs and I needed some time to digest that AND definetely worked there. A silly mistake from my side. For the queen I didn’t have to code much as I wrapped the rook and bishop destination squares code in to a function. Then, I created a new function for creating destination squares of queen which just called both the rook and bishop function. As this was really easy I was pumped to move on creating king’s destination squares as it is also really easy. Took a sip of coffee and continued my coding journey. I was wrong 🥀. I got stuck adding the king’s destination squares. I was first thinking of combination of rook and bishop but only one out from every side. This was the wrong way of thinking ig. Then I thought I should use two nested for loops for creating the destination squares which firstly worked out badly cuz I’m dumb. The destination squares we’re being created in such odd manner. After fixing that I had to also remove the destination square which was being created on top of the king and also had to handle to not generate some destination squares when the rook is on the edges of the board. I have done nothing today due to my illness. I hate my immune system 😭. I’ll code for 5 mins now ig for keeping my streak alive. Okay biee.."}, {"post_id": 39546, "ts": "2026-08-02T15:52:07Z", "hours": 3.3606, "text": "The rook got some moves 💃 Updates: Added movement to piece when destSquare is clicked Added mode state for seperation of chessboard in puzzles and vision page Moved states, refs, effects and functions from Chessboard.jsx to VisionContext.jsx Working on handling vision page data if user switches to other page during vision practice Finally I can proudly say that the rook can move now. I am really happy that it’s working. To move the rook I had created destSquares(the square with green dots) last time. Now if the user clicks on any of the destSquare with some maths the rook move to that square. I’ve added transition for the movement to look smooth. While doing this the rook did move to the destSquare but when clicked on the rook again the destSquare appered from when the rook was last time. To fix this I grabbed the destSquare location (e4) then set the squareid of piece to the location. The destSquares were calculated based on the squareid so now after moving the rook I can move it again. Also now if the a piece is seleced the background color of the pieces changes. When a piece is selected then destSquares appear but if the piece is selected again or other square is clicked then the destSquares are removed. Small things like this is making the chessboard feel lively and feel that it works correctly. I wanted to do this before but I thought I’ll do it later. I added a mode state in Chessboard.jsx. The mode state is either “puzzles” or “vision” representing the page the chessboard is on. I have made the pieces not appear while I’m in vision page and am trying to make sure nothing is running behind the scences if user decides to move to another page after they click on start. The countdown timer code of vision page was in Chessboard.jsx. I didn’t like that so I decided to move the code to VisionContext.jsx with the timer I move some states , refs and function with it. I had some issues during this migration but it wasn’t too difficult to resolve. I thought I had worked more but seems like I’ve. I’m confused, when I think I have done little work at that time I some how end up will better hours and when I think I have done decent amount of work I end up with less hours. Anyways it feels good watching the rook moves are working correctly. This much for this devlog. Peace ✌️"}, {"post_id": 38612, "ts": "2026-08-01T02:55:53Z", "hours": 4.9544, "text": "I got sick 🤧🥀 Updates: Make pieces position perfectly to square in chessboard Moved chessboard states and refs to ChessboardContext.jsx Fixed pieces sometimes being group together in one square when chessboard offsetWidth is null Added destSquare element on click for all possible moves of rook Last time I did position the squares but when I changed the background color of pieces there was a slight misalignment. I started searching what was causing that to happen. It was due to the height and width of chessboard being in decimals. I checked to see what lichess were doing and found out the height and width of the chessboard were always divisible by four. I did the same for my website and now it’s perfectly aligned and that’s what I love to see. Moved the states and refs from chessboard.jsx to chessboardContext.jsx to make the chessboard code less cluttered. The code relevent to puzzles page is in the chessboardContext while the code revelent to vision page is still in the chessboard page. When the page was loaded for the first time the pieces were being group together at the top left square. It was being fixed automically when the page was reloaded. It also happened while navagating from home page. I found out this was happenning due to chessboardWidth being null at start. To fix this I created a useState for the chessboardWidth so the page rerendered after the value was changed. My goal today was to make the rook move but I could only work up to generating the destSquares when the piece is clicked. I achieved this by creating a useState array and if user now clicks on the rook it calculates all the possible squares that the rook can move to and then that array is mapped using math to place destSquares perfectly on top of squares. The destSquares have a dot insided them which will be replaced by a icon but that’s the reason they’re not aligned centered currently. I did have a hard time doing this. Let’s not talk about it. 😭 I’ve written everything in short so that I don’t hit the 4000 characters limit and also ig it’s better for people reading (if any 🥀). I got sick yesterday and was just able to work on my project for 1 hr. Today I thought didn’t work much but it seems today I did 3 and half hrs. I am happy about today. I really don’t know if I can create the puzzle but I’ll try my best to do so. Everything I try to do seems to come with their own set of challenges and take time to overcome those challenges. Let’s see what happens 😔"}, {"post_id": 37397, "ts": "2026-07-30T02:35:38Z", "hours": 3.0969, "text": "The pieces have been placed. I was so sloppy 😭 I’ve added pieces to the chessboard. I’ve finally started facing my fear and started working on the puzzles section. It seems that creating the chessboard for puzzles will be harder than I have anticipated. Also please don’t mind the black pieces blending in with the background. I didn’t find chess piece set I liked so I downloaded the lichess chess piece set from pinterest. I was trying to crop them in figma and I coundn’t crop them properly. Also it was a tedious job. After downloading two crop pieces from figma I again went to the web to find out if someone already made them. This website came in clutch (greenchess.net). They had the whole chess pieces set of lichess available for download. Then, I started to code with no plan in mind . I don’t know why do I do this to myself. Obviously it was a bad decision. So I decided to use pen and paper to mainly solve one thing and that was how to place the pieces on the board. The writing helped me alot to think better. I was so sloppy while coding. I was mostly outside while coding and I was really distracted. One sec I was coding and another sec I was thinking about something else. I was making so many silly mistakes making the process more frustrating that it already was. I learned about fen while doing this (Forsyth-Edwards Notation). Through this any chess position can be stored and recreated in one line. It looks like this rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 I only needed to loop over the first part divided by slashes for positioning the pieces. Other things will be used later. I feel the code is really poorly written but it works so idk. I also found out about regex while I was trying to write a if condition for seperating strings and string with numbers. Okay this much for today. Bie…."}, {"post_id": 36798, "ts": "2026-07-29T02:45:06Z", "hours": 2.2681, "text": "Moving onto something big (I’m scared) Updates: Change ui of popup menus in options.jsx Added sounds for correct and incorrect attempt in chessboard Added countdown and start sound in chessboard.jsx Added puzzles page Renamed sidebar of vision page and it’s component with prefix of vision. Most of the updates in this devlog are small changes. But now I am going on to work on the puzzles page. I don’t know how I will figure this out. I hope it goes mostly smoothly.. I had designed the popup menus in the last devlog. I think the newer design is much better than the last one. The popup menus don’t look the same in the figma and the website cuz I tweak some things while coding. The figma design was a rough design Adding the sounds in the vision page has made praticing much more fun. The built in mac recorder doesn’t record sound unfortunately or I just don’t how to.. So, I’ll add a ss of vision page with menu open and a ss of puzzles page. I added chessboard and sidebar to vision page. There were two sidebars now so I decided to rename vision page sidebar to VisionSidebar and puzzles pages sidebar to PuzzlesSidebar. Okay that was all for this time. Give me strength to start making the puzzle by liking and commentin on the devlog. Byee ♥️. Also if you’re reading this support @PAPER_01 . AniShuffle has been taken down but she’s been unbanned now 💖."}, {"post_id": 36163, "ts": "2026-07-28T02:25:06Z", "hours": 3.6781, "text": "You’ve my coordinates now Updates: Added coordinates to chessboard Changed previous to current Fixed user input on chessboard being checked before countdown finished The show coordinates now works Fixed some event bubbling issues in colorMenu and timeMenu Designing the pop up menus Now it’s easier to locate squares with the help of coordinates . Now you will also notice the board has fliped while changing colors. ~ A small change, in the sidebar the previous word has been replace with current. I think the current word makes more sense there. ~ I also fixed user being able to click on the squared before the countdown finished. This was a silly mistake from me. ~ The coordinates has made it easier to locate squares. But if you want some challenge then you can toggle show coordinates off now. ~ That’s all for this devlog. If you wan’t my actual coordinates dm me 😄."}, {"post_id": 35623, "ts": "2026-07-27T05:20:24Z", "hours": 7.9881, "text": "We’ve reach 100 hours 🎉 Changes: Fixed timer not displaying in sidebar Removed the square display after time is over Fixed timer setInterval running multiple times and made countdown timer code cleaner Fix TimeMenu not closing Removed unused imports Designed the sidebar to add new data Added the new design Added animation to make the square notation that appears on the chessboard disappear First of all, we have reached 100 hours let’s goooooo. I would like to thank everybody who have followed my project read, liked or commented on my devlogs . My project has recently started getting some traction. Special thanks to @PAPER_01 💖. I have done a lot of things this devlog. I will try to cover these in as short as possible. It seems that the setInterval in progress.jsx was running twice. I found out this while I was making the countdown timer code cleaner. So to fix that I reset the hasCountdownCompleted as soon as the timer in progress.jsx runs out. Now, countdown and progress timer work as intended with cleaner code. The random color option in color menu now works. It was a little tricky making that work. Let’s just say it wasn’t working as expected but the fix wasn’t that hard. I liked what chess.com were doing. They were displaying the square notation and then the square notation would just disappear. The square rotation will also live in the sidebar so that if user forgets what the square was just displayed, they can easily look at the sidebar. I really like this idea and decided to implement on my project as well. But before I added this to the website, I first designed it on Figma. I also thought of displaying the score and best score on sidebar. Designing it was fun and tricky. I didn’t really like how the previous score and best score were looking and after some trial and error it looked okay. All of these things were fine and enjoyable to do but making the best score work was so frustratingggggg. It’s the reason that I couldn’t devlog yesterday. The issue was score was showing to be zero inside updateTimer function even though the score was greater than zero everywhere else. I thought fixing it wouldn’t be really hard. I tried console log score everywhere to see when the value was being zero but there was no sign of the score turn into zero. Later I found out that due to the updateTimer function being inside a setInterval the value is kind of locked and used useRef hook to solve the issue. Okay, that’s all for this devlog. Now that I have reached 100 hours let’s aim for 150 hours as soon as possible. I have taken very long to write this devlog so I like would be heavily appreciated 😄."}, {"post_id": 34403, "ts": "2026-07-25T02:47:48Z", "hours": 4.5364, "text": "Mostly cleaning up the code and breaking things Changes: Made timer code better and cleaner Added functionality to timeMenu options Added countdown before starting the timer and displaying the squares -Added VisionContext.jsx to make code cleander and broke down vision page into smaller components As I said in the previous dialogue, the timer code was messy. So I decided to clean the code now it looks much better. Also now the time button options work now the timer will have 15, 30 or 45 seconds according to what you choose. So before, after cleaning on start the timer would start right away and the square would also show up. But this might make the user frustrated as they have to click start and right away move their mouse to the chessboard. I saw that chess.com has a countdown timer so I also made one. The code for this countdown timer is also messy so I will probably make it more cleaner next time. This is the main thing I have doing this whole devlog which I cannot show you because it’s just making the code cleaner. The vision pays had a chessboard component and then sidebar element to it. The sidebar element had all the code which was making the vision page could a lot messy. So I have broken down components into components and those components in the further components. I think this is making the code much more easy to read and find and debug each component more easily. But in the process of cleaning my messy code, things have broken down. The timer isn’t working, I will fix that later. I don’t have much to show here today so the see the countdown timer working and the broken timer 😝. I will fix everything in the next devlog. So stay tuned. Bieee…"}, {"post_id": 33853, "ts": "2026-07-24T03:14:59Z", "hours": 4.7681, "text": "Ayy almost 5 hrs today !! Changes: Fixed attempt square and attempts not wrapping as expected Fixed color being stuck in chessboard when same square is clicked rapidly Added color menu popup when click color button in sidebar Added time menu popup when user clicks time button in sidebar Added Progress component in sidebar with working score Made timer in progress.jsx functional Fixing the user attempts in the was pretty easy. I just added a attempts container to wrap the attempts element and then the CSS work as expected. Fixing the red or green colour being stuck in chessboard when clicked rapidly was a headache to fix. I was trying my best and at last I came up to the decision that I needed a timeline for the animation before the animation was played the progress of the animation should be zero. I tried that and obviously that didn’t work but it seems that I was close to the answer. I used Claude to figure out the answer and Claude used killTweenOf gsap function to remove the animation before the animation was even played. It also added a onInterrupt property to the animation which basically reverted the stuck colour after killing the animation. I didn’t want to use Claude, but I just couldn’t figure it out and I think it was better to use Claude as I have never used those functions and properties of gsap. Also Claude made that portion of my much cleaner. Seeing this now, I will be more focused on the cleanliness of the code because claude showed me that my code was repetitive and how it could be made smaller and easy readable. I decided to make the colour menu pop-up and time menu pop-up straight by coding instead of designing it first as I should have. As you can see, the result is very terrible. I am sure definitely fixing it in the next devlog. I was force thinking of making a pop-up menu component and using them in both buttons but I found that it was a hassle and not worth it. Only the white and black button in colour pop-up menu work. They just rotate the board and that’s all I still need to add functionality to them. After learning the lesson that I should definitely design before coding. I started designing the progress component. Although there isn’t much to design there I definitely would have made it as bad as the pop-up menus. While coding this, I also made the score display the total number of correct at attempts which was pretty easy. I just had to add one digit whenever the chose the correct square. Then, I started working on the timer. The timer would have been really easy if I just used setTimeout every second but I like to torture myself so instead of just doing that, I challenged myself using date constructor. I have done this before but it has been sometime and I remember how it worked. The countdown started from 28 which was frustrating. Now, I have just completed that but the code is really messy. I will definitely fix that tomorrow or today as I might post this devlog tomorrow. I think that shorter devlogs do better in terms of views. I’ll try that next time. See you in the next devlog 👋."}, {"post_id": 33005, "ts": "2026-07-22T15:24:41Z", "hours": 3.3339, "text": "Things are going great Changes: Added chessboard component with ranks and colored squares Added function for generating random squares and displayed them Added feature to display green and req squares to indicate whether the user clicked correctly or incorrectly in the chessboard Displayed attempt made by user in the sidebar with respective colors for correct and incorrect ones I thought doing all of these took me at least four hours but I was wrong. It seems that it’s only been about like three hours. This time I have worked on the chessboard itself on the vision page. Before it was just a plain whiteboard but now there are individual squares which was pretty easy to implement. I however needed some time to figure out how to add colours to the squares. But it also wasn’t that difficult. Then I created a function for generating random squares with the help of math.random(). I created an absolute element to display the random squares at the centre of the chessboard. To indicate the user that the square they have clicked is correct or incorrect I played the small animation that changed the colour of the user clicked square into red or green depending upon whether the user input was correct or incorrect. I was stuck here because I didn’t know how to reverse the animation. Of course I could just change the colour to green and then the colour of the square but that didn’t look quite right as I am probably going to change the chessboard colour later. So I wanted the animation to be flexible I was trying to play and reverse a animation timeline but it was so much easier than that later. I just remember there was the repeat and yo-yo property that will easily accomplish this effect I’m looking for. I have found a new bug with this if I spam click a square the square permanently turns into either red or green so definitely I will fix that in the next devlog. Also now the squares that the user clicks will be displayed on the side bar. The colour of this square notation will be red or green depending upon the user selected the square correctly or incorrectly. I have found out that there’s a flex related css bug in attempts element. I will look into that tomorrow. Okay bie.. Hope you have a great day 💖"}, {"post_id": 32765, "ts": "2026-07-22T04:05:46Z", "hours": 4.1331, "text": "Started working on the vision page Changes Designed the vison page Created the vison page and worked on the sidebar ui I have changed the name from visualisation to a vision. I actually don’t know which one is better. I just changed because chess.com and chesskid.com had vision for practicing the squares on the board. Designing of the vision section was quite fun although I had some issues with auto layout that wasn’t big of a deal. I was thinking what options should I have and thought it would be best to add show coordinates, change the color and select the time. I think the UI turned out pretty great. I will probably change the colour of the chessboard but black and white also looks fine. Coding design wasn’t too difficult. It was just copying the design that I made, but the Figma design looks different. I should check out why the size of the buttons are the same but in Figma they look a lot bigger. It might be because the width of the sidebar is not the same. In conclusion, this was a peaceful devlog. It feels really nice not having to fight with your code and your designs. Hope that the future develops are the same 🤞. Until then peace✌️."}, {"post_id": 32156, "ts": "2026-07-21T03:52:34Z", "hours": 4.9689, "text": "We have followers Changes Designed hollow medals Switched from localStorage to db for storing updating and retrieving completed courses data Added feature to show medals achieved by user Designing the hollow medals (I don’t know what to call that so I’ll just say hollow medal) was really fun. I just started designing the medal for fun in Figma. The result turned out really great even better than what I had expected. I was using circles for the medal itself and was trying to use the rectangles for the below design. Later I figured that it would be wiser to use the pencil instead of creating a rectangle and mapping out the bottom portion of the medal which turned out to be a great idea. In this project, I have started using Figma for creation of some assets and I am loving it so far my intention is to keep on using Figma until and unless I really have to use AI. Switching from localStorage to database for completed courses data was easy in my head but it took me longer than expected mainly because of three reasons. Firstly, I was thinking of creating a separate backend endpoint for course data. After creating the controller and route for course data I thought that it isn’t really necessary to create another endpoint for this as we can store it in the users data itself. Secondly, after deleting the routes and controller, I created API function for fetching and updating the completed course data period I had forgotten that I don’t actually need to have a separate getCompleted function because while fetching the user itself, the data comes with it. I have forgotten to delete the getCompleted.js file which I will do later. Thirdly, I have started to use Postman for testing out api . I am loving to learn things such as Postman and Figma. But this issue I was facing was the postman was working correctly but from my codebase the request body was showing undefined. It was a fetch thing I use axios before and I am figuring out right now why people used axios. It seems that I needed to specify in the header that this request had the content of json. So figuring that out also took some time. Also, I have added the feature to show medals achieved by user. The code isn’t quite clean for this feature. Thanks to the people that followed this project. I genuinely appreciate that 💖. New followers : @PAPER_01 @sak"}, {"post_id": 31100, "ts": "2026-07-19T07:07:40Z", "hours": 3.5, "text": "When will my devlog get more than 7 views 😭 Changes: Added loading component Added scrollsmoother in home page Fixed course page padding and added toast while redirecting unauthenticated user Added back button to signup and login page Designed the logo for website Added the logo to the website Now whenever the frontend fetches user data from the backend there will be a loading component that will come up. I made the loading spinner myself in figma why not 😃. Scrolling the home page using a mouse is so much better now now due to scrollsmoother plugin of gsap. I was facing a issue with this though. I was seeing an error while navigating to other pages. After a while I found out a guy with same issue in gsap forum and his solution worked. God bless that guy 🙌. Some small changes were fixing the padding in course page , adding a toast while redirecting unauthenticated user from couse page and adding back button in singup and login page. I think they don’t need much explanation. I tried to design the logo of my website in figma. I tried different things and landed with a design that felt decent (The logo with king in the center). I look nice up close but it didn’t feel the same when shrunk down as a logo. So I started designing another one. I landed on the logo with cyan and dark purple background and !! symbol up front. I really don’t know how I feel about this logo. I looks decent sometimes and other times questionable. Please leave your opinion in the comments 🙏. While adding the icon as a favicon, for some reason the favicon wasn’t display which was confusing. Later I found out that this was a brave issue cuz it’s showing up in zen browser. Okay this much for now. Please like so that more people see this devlog 😭."}, {"post_id": 30508, "ts": "2026-07-18T04:21:03Z", "hours": 5.0097, "text": "Wth it’s been 5hrs?? Added toast for login signup and login as guest errors Made the signup data persist even after the value of hasContinued changes Designed the dropdown menu Added dropdown menu Added logout functionality First of all, I’m genuinly confused how this took me 5hrs.. Added toast so that now when there’s any error during the signup or login. For example during signup maybe a user might write a username less than two characters, then the toast pops up telling the user it should be greater than 2 characters. I was stuck during this cuz the trycatch block wasn’t catching the error which was confusing. I used axios previously and it threw an error if the backend response wasn’t ok. But this time I avoided using axios for reasons that you guys probably know 💀. It seems that fetch didn’t throw any error so I had to manually throw errors in the api functions. The making of signup data persist on hasContinued value change was early. I just set the value attribute of input to be it’s respective useState data. As you can see in the image that I designed the dropdown. I first designed the dark one which I really loved but it didn’t match the navbar so I created a light one. After seeing the dark one I really didn’t like the light one. So I tried fixing the design. I asked someone in the slack and they said the previous light dropdown design looked fine. Ig looking at the dropdown for long made it look fine to me as well 😂. Now I added the dropdown to the website. I had issue with the padding of the logout button during designing phase but I just winged it during coding phase and it worked 🎉. The dropdown now looks fine imo. I however did have a issue while making the dropdown closing work when user clicked outside of the dropdown. I thought of using an overlay in the background but I knew that there was a way of doing this by checking the click event. It seems I had forgetten to do this. After some trial and errors I remember how it was done.. I also added logout functionality which was fairly easy to add cuz I’m storing the jwt in the localStorage. I just removed the token for localStorage, set the user to null, set isDropdownOpen to false and navigated the user to the home page. Ig, i’ll try do things faster next time ⚡️. Don’t want to spend 5hrs on things like these. Okay biee…"}, {"post_id": 29446, "ts": "2026-07-16T12:12:04Z", "hours": 2.0422, "text": "Omg it’s finally fixed I finally fixed the bug that I addressed in my last devlog. This was so frustrating. I never expected that this would take me 2hrs and I would write a whole devlog on it 💔. The bug was that when I was logging in I was being redirected to /signup after signup, login or login as guest. I had made so that after signing up or logging in the user would be redirected to course page. I had also made it so that if the user value is null then the user would be redirected to the sign of page. So now you can see that where this is going. I just couldn’t simply figure out why the user value was null. After doing so much thinking and reading the code and trying to fix the bug, I have finally succeeded.Another issue that I was facing during the working was I was constantly forgetting what I was doing and to see everything visually I used excalidraw as you can see in the picture. So there were three things that was leading to this bug. Firstly, I wasn’t using the await keyword while calling the api functions. Secondly, I didn’t have a loading state while fetching the user’s data. Lastly, the function getUser function responsible for fetching the user data wasn’t even being called when redirected to course page. The function was only being called when the user first loaded the website. Right now, my head is aching now I think I should take some rest. I didn’t remember to add loading state which was so silly of me. I only realized that after visiting my old project. Seeing that I felt dumb because ofc you would need a loading state while fetching the user data from backend. I feel a little relieved now 😮💨. I cannot even remember properly all the things that I tried to solve this. It was just a mess 😩. After solving the bug, now looking back, it wasn’t that difficult to solve. It was just a me problem. I could write more on this but I’m too tired for this now. Okay biee..👋"}, {"post_id": 28787, "ts": "2026-07-15T09:05:35Z", "hours": 2.67, "text": "Life is frustrating 😩 ##Changes: Added navigation to /course after successful login Designed navbar when user is logged in Added the user button in navbar when user is logged in Added redirection to signup if user goes to /course without authentication Fixed jwt malformed error in protectRoute.js The navigation to /course after successful was implemented before but I somehow missed to implement that in login page. Designing the navbar for authenticated user was very challenging than I expected. As you can see in the image there are multiple attempts at creating the navbar. Everything I tried was just looking bad. The final design is also questionable. But for now it is what it is. Now unauthenticated user aren’t allowed to visit course page. They will be redirected to signup page if they try. This was supposed to be simple but somehow I made this also hard for myself. I have done this before so this should have been easy for me but nope. The redirecting was working fine but I were to be authenticated and be on course page and then reload, then also I would be redirected to the signup page. After I made up my own solution for this which I don’t think is the best way to do it. Due to my incapability of designing simple things and solving minor bugs I was questioning my ability to solve problems and design. Which at that moment felt sad 😔. Also there was jwt malformed error popping up in the backend which was also frustrating to solve. Not because it was hard but because it was easy and I wasn’t able to solve it. I won’t tell you what happened here as the devlog is getting long. No video this time cuz the I can’t show the navigation changes working as they aren’t working properly. The bug is preventing user from redirecting to /course after login or signup. Instead user is redirected to signup. I know that this because of the two redirection changes made in this devlog. So, I’ll go and fix it asap. Hope your coding experience isn’t going as frustrating as mine. Thank you for reading my frustrations. Bye…👋"}, {"post_id": 28126, "ts": "2026-07-14T06:43:34Z", "hours": 4.0444, "text": "I’m sorry 😭 ##Changes: Use localStorage to store jwt instead of cookies Fix signup page unequal width of img and form container Changed login.css similar to signup.css for consistent code Added login as guest functionality Added navigation to /course after signup or login success Added UserContext.jsx to handle user data Added protectRoute middleware to verify jwt Added “/api/user/“ endpoint to get user data from backend Too many changes, let’s break them down. I’m sorry that I switched to localStorage to store jwt instead of cookies 😭. The cookie wasn’t working as expected. I was able to store the jwt in the cookie and receive it in the frontend but when I reloaded the cookie would just disappear. I know that there’s a fix for this as I have done this before as well. But, I know that I’ll face the same issue during deployment even if I fix the issue now. I’ll probably deploy this in vercel and last time (in flavortown) I had to change the whole code format due to the cookie issue. So this time I’ll just rely on localStorage for now. If I deploy the website myself then maybe I’ll consider using the cookie. But for now just forgive me 🙏. I fixed the unequal width of img container and form container with again in signup page. This happened because I added padding to the form-container instead of the form. Using flex for this was a headache so I used grid and it worked. Although I didn’t necessarily needed to change the login page css. I did it to maintain a consistent codebase. This is a huge one. I added login as guest functionality. I know that people will be skeptical of entering their email even though they can use any made up email such as [email protected] . I purely added this feature so that people don’t rate me bad just because they assumed that they need their own email to signup. And logging in as guest is easier as well so why not. Now, after the signup, login or login as guest is successful then we’ll be redirected to the course page. Later I’ll make it so that users who aren’t logged in won’t be able to access any other path except for the “/“. Also now there’s userContext.jsx for storing and distributing user data. For now there’s getUser function for getting user’s data. I have made the backend work to verify the user’s token and then only provide the user with their data. Alright no more yapping, the devlog has gotten very long. If anyone has read this devlog, God bless them. ~ Peace ✌️."}, {"post_id": 27519, "ts": "2026-07-13T04:42:38Z", "hours": 4.9611, "text": "More progress on signup and login Changes: Designed the username form Created the username form in signup Changed useRef to useState to store signup data Adjusted the backend to receive and store username Add login functionality Fixed required attribute not working in both signup and login form Designing the username form wasn’t that hard as it’s just the signup page but will less things. I looked at how chess.com was doing things during signup and thought it’s better to split the email and password into one form and username form into another. There’s also a back button to go to the email and password form. Coding the username form was a little frustrating as I had some issue positioning the back button. Now it’s working but now I am facing the old issue of img-container and form container not being the same width. I’ll fix that next. Also the way username form is display is by just toggling a state into true or false in the singup page. After adding the username form there was an error telling that email and password was null. This was because while entering the username I wouldn’t be able to access the email and password input using the useRef hook. The fix was simple, I just changed the useRef into useState and store the data on input change. Now that was extra data (username) that needed to be stored. I sent the username along with email and password to the backend and changed the userSchema to accept username. I worked on the signup functionality last time so this time I worked on the login functionality. In short, now during login the backend verifies the email and password and gives the user a jsonwebtoken as a cookie or an error. I wanted the input to display “field is required” when user tries to login or signup without filling in the form. I just couldn’t get this working and it was so frustrating because the issue was so simple. Later I found out that I was using e.preventDefault on the button instead of the form causing the input to not show “field is required” Okay enough yapping. Gotta go and work on the project. Hope your project is going smoothly. Bie…👋"}, {"post_id": 26400, "ts": "2026-07-11T05:20:12Z", "hours": 5.6911, "text": "50 hours!! Let’s go 🎉 Changes Designed signup page and login page Created signup page and login page Divided the codebase into frontend and backend Setup backend Setup signup endpoint to receive formData Designing the signup and long page was really fun. I took some inspirations from pinterest. I’m proud of the design I made 😄. Turning the design into code was also fun ig. I did face a small bug. The image looked bigger than the form but both had flex-grow of one. The fix was simple I just had to change the flex-basis to 0 so I did flex: 1. Finally I’ve started on the backend. It’s been some time since I haven’t done backend stuff. Coming back to backend felt nice. Although it was frustrating when the data sent to backend was just saying it was undefined. But after some time I just figured out that I forgot add express.json() middleware in my server.js. I’m well now and feel that now I’ve no motive of slowing now. Hope you’re also doing well 🤞."}, {"post_id": 25132, "ts": "2026-07-09T04:37:06Z", "hours": 2.7414, "text": "Many small improvements Changes Made the opened cards remain open after finishing a lesson or going back from watch course Saved completed course data in localStorage Added confetti animation after clicking on finish lesson Fixed value of total in course.jsx by making it dynamic Fixed navbar animating when reloading on non home paths This time I have done many small changes but I think that they make a great impact on the website. ~ Firstly I made the card remain open while visiting other pages. I mainly did this as a part of user experience. I thought that it’s inconvenient for a user to see the card they opened being closed after they come back from the course watching page. ~ Also, now the data of completed course persists. It is stored in localStorage. I’ll definitely stored the data in database in the future. Also I was facing an annoying bug doing this because I forgot that I needed to stringify the data before storing in localStorage😭. ~ There’s now confetti animation after clicking finish lesson. I think it looks nice. I used a npm package for the animation. ~ Before the total course was a dummy value of 10. Instead of counting the courses manually I just did a sum of length of all courses data from constant.js. Now, when I change the professional course value I won’t have to think about changing the total value. ~ The navbar animation was meant to run only when user move from home page to other page and vise versa. But, when I was on the course page and if I reloaded the animation would still happen. Fixing this was really painful as the solution was really easy but I just couldn’t figure it out. At last I took the help of Claude to figure out the solution 😩. ~ I took two days off because I was sick again😭. Why is my immune system so weakkk😭.."}, {"post_id": 22223, "ts": "2026-07-04T16:15:12Z", "hours": 2.0581, "text": "Now the completed course has a green tick mark Basically now if you click on finish lesson you’ll be redirected back to the course page and the lesson you choose as completed will have a green tick mark inside the course card. ~ Also, if a lesson is completed the navbar won’t show the finish lesson button. ~ Right now, the data doesn’t persist across reloads. I will store the data in localStorage next and when I implement the backend, then only I’ll store the data in database. ~ The challenging part was seeing the whole picture. How will the feature work, where will the data live and how to know if a lesson is completed, things like that. ~ Also, during development I thought of using useContext hook but I had forgot how to use the hook while following best practices so I just went to my previous project to relearn stuff😅😆. ~ I decided to use pen and paper for problem solving and better visualization which worked really great for me 🎉🎉. I will definitely do this when I encounter problems in the future 😄. ~ Btw, No bullet points this time😅. I haven’t completed much as I’m sick. Hopefully I get well tomorrow🤞."}, {"post_id": 20676, "ts": "2026-07-02T10:26:56Z", "hours": 4.2492, "text": "I’m locked in Progress: Changed the dummy data from beginnerCourse and intermediateCourse in constants.js Created WatchCourse page Made courseCard open WatchCourse page with respective course video Made navbar show go back and finish lesson on button if the user is on WatchCourse page Designed a banner for the course page I changed the data of beginnerCourse and intermediateCourse in constants.js file which instantly made the cards inside both beginner and intermediate so much better. The professionalCourse data hasn’t changed and will be changed later. ~ After that I worked on one of the main feature of the website which is being able to watch the course. Now, if user clicks on a course that they want to watch, then will be redirected to WatchCourse page. I achieved by using the YouTube embed link and dynamic routing. ~ The navbar also changes in WatchCourse page as there will be go back and finish lesson button. The go back button currently works but I still have to work on the finish lesson button. ~ I took a break from coding after doing that and started working on the banner. I don’t really know how the banner should look so I just added a gradient, two chess pieces, some text and some chess analysis moves and called it a day. ~ Now I’ll go export that banner and add it to my website. If you have any recommendations please let me know. Biee.."}, {"post_id": 19060, "ts": "2026-06-30T07:56:09Z", "hours": 4.2233, "text": "Mostly designing and coding that design. Progress: Completed the info element Designed the course card inside the accordion Created the course card component Moved accordion, courseCard and progressBar component into components folder within the course page The course page is slowly but surely coming together. I think the info element looks really nice now that it’s complete. But yeah the list does contain dummy information. I will change them after I have selected the videos as my courses. ~ CourseCard component seems okay imo. The tick mark is supposed to indicate that the user hasn’t completed that course. After the individual course is completed it will go green. I have mixed feelings for the tick mark being there. The idea seems find but I’m really not sure about the design. ~ But anyways it was fun designing in figma. In the website have made the CourseCard with the ability of each card having different text and image but right now they are only a little different in different levels. ~ Idk how time passes so quickly. Got only this much done in 4hrs😕 but I think I am now starting to enjoy the process. I am not focused on the time so heavily as I was before 😇. ~ Okay this time I have decided to keep my devlog shorter. Any opinions will be appreciated ❤️."}, {"post_id": 18099, "ts": "2026-06-29T03:11:34Z", "hours": 5.4111, "text": "Ayy new devlog let’s go!! Updates: Designed the info part (the portion with the progress bar) Created working accordion component with animations Started working on the info part Created working progress bar component with animation I like the design of the info element. I have tried using hierarchy to make the design look good. Also I randomly had the idea of earned badges after the user completes the whole course of a certain difficulty. Then, I hoped onto coding the accordion. Firstly I wasn’t making accordion as a component. There were just three div in the course page and I realized that if I don’t make it a component the code is going to look messy so I created the accordion component and now the code looks much cleaner. While making that I stumbled across a funny bug. Clicking on one accordion component was making all component to open. It was because of gsap selecting all the similar classes and animating them. I fixed that by using useRef to select elements. I have also created a progress bar and now I’m working on completing the info element. The progress bar looks good if it’s even a little bit full but idk how I feel about the progress bar when it’s at 0%. It feels bland and idk what to do. Okay enough rambling. I feel my devlogs should be shorter ig. Anyways if you have any suggestions please let me know. Peace ✌️Ayy new devlog let’s go!!"}, {"post_id": 16777, "ts": "2026-06-27T07:43:36Z", "hours": 3.9072, "text": "Updates Added RootLayout.jsx for reusing a single a navbar across all pages Changed react-router-dom to react-router Added expanding animation to the navbar when the path is “/” and shrinking animation on other paths except “/” Designed the course part in course page What I wanted Before I added the navbar inside home page but after creating the course page I realized that I would want the navbar to be reusable across all pages. Also I wanted the navbar to expand in other pages expect the home page. Switch to react-router I was using react-router-dom for managing routes. I tried to look up the docs to make the navbar reusable. I couldn’t find anything and saw that react-router-dom just used react-router so I thought it’s was not necessary for me to use react-router-dom so I just switch to react-router. Navbar animation issue Animating navbar to expand and shrink was a mess. It’s look really simple and it is simple but not for my brain. I first thought of making the width to 100% and set align items to center. The width part animated as expected but the align items didn’t. Then I thought of using position absolute and centering the nav but now the navbar wasn’t respecting the nav-container’s padding. It was frustrating so I took help of claude and centered it using y property by doing some maths. Time flies I also had issue with the timeline reverse not working but I think I should stop my complains here. I am rambling here because it took too long to do too little 😭 . Designing the course page On the positive side the I have started working on the design of course page. I have only done a small part but it’s looking amazing. The part other part that don’t look right were the design which I made during the start of the project. Rn I am just refining that previous design of mine, that’s why the navbar looks different in figma. Hope you have a nice day ❤️"}, {"post_id": 16064, "ts": "2026-06-26T03:14:51Z", "hours": 4.9211, "text": "Visualization section transformation Separated visualization section into text wrapper and body wrapper Added a text with reveal animation in text wrapper Added visualizedMoves with animation around the img-container Deleted the thought component Finally I get to post a devlog with some good. It’s a better time cuz I’m logging both the figma and the coding time for the first time. Previous design I didn’t really like the previous design so I thought for a while and came up with this design. Although it isn’t perfect it’s much better than the last one. The figma design and the website don’t look the same because I just did the design roughly in figma and then winged the chess moves position in vscode. I think removing the background of the chess moves was a great decision. New design Firstly I designed the concept in figma before coding. I added a text wrapper within the visualization to break the flow of the website. The previous design which I was going towards started feeling like a generic website (a bad one). Now the there’s text with a reveal animation which looks pretty simple tbh but I think it’s better. I might change that in future though or add elements to make it look fuller. The after the text animation the person visualizing image appears and different moves appear indicating that the person is thinking the moves. I was going to use a thought component for this but I did it in a more simpler manner. Time I always underestimate the time required to build things. I feel that I should have completed more in the time that has been recorded but small bugs happen while coding which is really frustrating. In this devlog also I feel I should have completed more. Am I just slow or happens to others as well. I really would like to know (comment)."}, {"post_id": 14231, "ts": "2026-06-23T07:41:29Z", "hours": 1.8261, "text": "Hey, this devlog is a messy one. Changes: Created visualization section Created thought component Designing the visualization section Connected figma to hackatime I just figured out that I can add my connect figma to hackatime and record the time under this project. I have always designed this project before writing the code which a lot of time which could have been tracked is lost. That’s not a big worry as this project has long way to go. I just figured out that I can add my connect figma to hackatime and record the time under this project. I have always designed this project before writing the code which a lot of time which could have been tracked is lost. That’s not a big worry as this project has long way to go. Why this devlog is messy/incomplete The main purpose of this devlog is to figure out where I am currently in my project . I haven’t worked on my project like I used to because of my illness. So, instead of working on the project and forgetting what i did I just decided to commit the changes in my vscode write this devlog. I am hoping to work on this project as before as I am feeling better now. So that’s why the images below seem incomplete. Hope you guys are doing well. Btw the figma ss and the website image don’t match cuz i decided to change the figma design just before writing this devlog. I wasn’t happy with the previous design so i’m just tweking it to see where i land."}, {"post_id": 9977, "ts": "2026-06-16T14:48:46Z", "hours": 2.8114, "text": "Changes: Split home.jsx into smaller components Installed and applied different font weights Made navbar better Completed puzzle section on a basic level This time instead of jumping on doing something new I started with making the code cleaner first. It was easy as nothing broke. Then, I realized the font in the hero section doesn’t look as bold as in my figma design so after looking into the problem for a while I realized I had just the regular font weight of font downloaded leading to fonts looking different. Also made navbar better by decreasing horizontal padding in the button and adding a box shadow. Adding the box shadow made the navbar visible in the courses section. I also completed puzzle section which is looking good but I want to animate the image (Yoinked from chess.com btw 😅). The animation will bring so much life into the section but I really don’t know achieve that. If you can help me or have any suggestion in general please let me know. That’s all for this time folks. Piece ✌️ (It’s a pun btw)"}, {"post_id": 9132, "ts": "2026-06-15T08:50:45Z", "hours": 3.4731, "text": "Ayy new devlog!! Changes: Corrected timing of animations in courses section Added level indicator of thumbnail Added temporary images in each thumbnail. Added animation to course title Made animation on work reverse as well I’ve shifted on my macbook for coding which I’ve received from flavortown. Anyways, the courses section looks much better now. I am still not satisfied with the animation of courses info elements. I spend way to long to make that work but in the end I took help of gemini to make it work. Also, timing looks way better than last time. Now, I’m going to split the home page into smaller components to make the code cleaner. Also I’ve to do something of the navbar. Any suggestion will be appreciated."}, {"post_id": 7841, "ts": "2026-06-13T02:27:10Z", "hours": 2.3547, "text": "Changes: Added shrinking animation in hero section Moved courses text to a constants file Added thumbnails in the courses section with animation The courses section animation doesn’t look the way I want it to be. I’ll be fixing that.. Also things are taking more time than expected which is really frustrating. I thought this will take me about an hour but it’s still not finished. I’ll surely finish courses section today. Hope your project is going smoothly."}, {"post_id": 6073, "ts": "2026-06-10T06:20:34Z", "hours": 2.8981, "text": "Changes: Added text reveal animation Ahhhh it took three hours only to create this text revealing animation. I stumbled across many css and gsap bugs to make this. I first tried to use the ::before pseudo element which worked really well but later replaced it with span cuz i couldn’t figure out how to animate that with gsap. There are many other things that really annoyed me but lets not make this devlog a whole essay. But I love how it turned out in the end."}, {"post_id": 4195, "ts": "2026-06-07T12:47:02Z", "hours": 2.2108, "text": "Changes: Fixed the page stacking animation Changed the layout of hero section. Made navbar position fixed I was trying to make the navbar sticky which wasn’t working at first and was so annoying, after solving that I found out that it won’t go outside hero section. I was frustrated that I was messing up something so easy. Also it seems that I was doing the stacking animation the wrong way so I fixed that also. So now I have a clean stacking page animation and a navbar that stays at a fixed position."}, {"post_id": 2749, "ts": "2026-06-05T14:52:59Z", "hours": 0.9686, "text": "Created courses-section with page stacking animation. It took me an hour to figure this out 😭. I knew that I have to pin the hero-section but couldn’t figure out how to move the courses-section to overlap the hero-section. I watched different videos and even went to some random guy linked in account to find out the answer. But eventually I just figured it out myself. I still have to check if the way I have accomplished it is the correct way or not."}, {"post_id": 2615, "ts": "2026-06-05T07:31:04Z", "hours": 1.5622, "text": "Just worked on adding the animations to the home page. Also I downloaded the font instead of using google fonts cuz it was taking some time to load every time I reloaded the website. The animation of the hero text was a little tricky as it wasn’t working at first but then I found out the culprit was span. I change the span to inline-block and then the animation worked as expected. I have also made the let’s go nav button same as the cta button for consistency. You won’t be able to see the animations sadly cuz I’m attaching a screenshot here."}, {"post_id": 1995, "ts": "2026-06-04T08:13:05Z", "hours": 3.4961, "text": "First devlog I have worked on the hero section. I think it looks pretty good. I have some improvements to do on the nav bar. Also, I have to crop out the hero image. The image is taking alot of space rn. Now I’ll devlog after the hero section is complete and then will start on animating the hero section. Hope you’re project is also going well."}]...
|
Title: Evochess by @Sam | Stardance
Devlogs:
Firs Title: Evochess by @Sam | Stardance
Devlogs:
First devlog I have worked on the hero section. I think it looks pretty good. I have some improvements to do on the nav bar. Also, I have to crop out the hero image. The image is taking alot of space rn. Now I’ll devlog after the hero section is complete and then will start on animating the hero section. Hope you’re project is also going well.
Just worked on adding the animations to the home page. Also I downloaded the font instead of using google fonts cuz it was taking some time to load every time I reloaded the website. The animation of the hero text was a little tricky as it wasn’t working at first but then I found out the culprit was span. I change the span to inline-block and then the animation worked as expected. I have also made the let’s go nav button same as the cta button for consistency. You won’t be able to see the animations sadly cuz I’m attaching a screenshot here.
Created courses-section with page stacking animation. It took me an hour to figure this out 😭. I knew that I have to pin the hero-section but couldn’t figure out how to move the courses-section to overlap the hero-section. I watched different videos and even went to some random guy linked in account to find out the answer. But eventually I just figured it out myself. I still have to check if the way I have accomplished it is the correct way or not.
Changes: Fixed the page stacking animation Changed the layout of hero section. Made navbar position fixed I was trying to make the navbar sticky which wasn’t working at first and was so annoying, after solving that I found out that it won’t go outside hero section. I was frustrated that I was messing up something so easy. Also it seems that I was doing the stacking animation the wrong way so I fixed that also. So now I have a clean stacking page animation and a navbar that stays at a fixed position.
Changes: Added text reveal animation Ahhhh it took three hours only to create this text revealing animation. I stumbled across many css and gsap bugs to make this. I first tried to use the ::before pseudo element which worked really well but later replaced it with span cuz i couldn’t figure out how to animate that with gsap. There are many other things that really annoyed me but lets not make this devlog a whole essay. But I love how it turned out in the end.
Changes: Added shrinking animation in hero section Moved courses text to a constants file Added thumbnails in the courses section with animation The courses section animation doesn’t look the way I want it to be. I’ll be fixing that.. Also things are taking more time than expected which is really frustrating. I thought this will take me about an hour but it’s still not finished. I’ll surely finish courses section today. Hope your project is going smoothly.
Ayy new devlog!! Changes: Corrected timing of animations in courses section Added level indicator of thumbnail Added temporary images in each thumbnail. Added animation to course title Made animation on work reverse as well I’ve shifted on my macbook for coding which I’ve received from flavortown. Anyways, the courses section looks much better now. I am still not satisfied with the animation of courses info elements. I spend way to long to make that work but in the end I took help of gemini to make it work. Also, timing looks way better than last time. Now, I’m going to split the home page into smaller components to make the code cleaner. Also I’ve to do something of the navbar. Any suggestion will be appreciated.
Changes: Split home.jsx into smaller components Installed and applied different font weights Made navbar better Completed puzzle section on a basic level This time instead of jumping on doing something new I started with making the code cleaner first. It was easy as nothing broke. Then, I realized the font in the hero section doesn’t look as bold as in my figma design so after looking into the problem for a while I realized I had just the regular font weight of font downloaded leading to fonts looking different. Also made navbar better by decreasing horizontal padding in the button and adding a box shadow. Adding the box shadow made the navbar visible in the courses section. I also completed puzzle section which is looking good but I want to animate the image (Yoinked from chess.com btw 😅). The animation will bring so much life into the section but I really don’t know achieve that. If you can help me or have any suggestion in general please let me know. That’s all for this time folks. Piece ✌️ (It’s a pun btw)
Hey, this devlog is a messy one. Changes: Created visualization section Created thought component Designing the visualization section Connected figma to hackatime I just figured out that I can add my connect figma to hackatime and record the time under this project. I have always designed this project before writing the code which a lot of time which could have been tracked is lost. That’s not a big worry as this project has long way to go. I just figured out that I can add my connect figma to hackatime and record the time under this project. I have always designed this project before writing the code which a lot of time which could have been tracked is lost. That’s not a big worry as this project has long way to go. Why this devlog is messy/incomplete The main purpose of this devlog is to figure out where I am currently in my project . I haven’t worked on my project like I used to because of my illness. So, instead of working on the project and forgetting what i did I just decided to commit the changes in my vscode write this devlog. I am hoping to work on this project as before as I am feeling better now. So that’s why the images below seem incomplete. Hope you guys are doing well. Btw the figma ss and the website image don’t match cuz i decided to change the figma design just before writing this devlog. I wasn’t happy with the previous design so i’m just tweking it to see where i land.
Visualization section transformation Separated visualization section into text wrapper and body wrapper Added a text with reveal animation in text wrapper Added visualizedMoves with animation around the img-container Deleted the thought component Finally I get to post a devlog with some good. It’s a better time cuz I’m logging both the figma and the coding time for the first time. Previous design I didn’t really like the previous design so I thought for a while and came up with this design. Although it isn’t perfect it’s much better than the last one. The figma design and the website don’t look the same because I just did the design roughly in figma and then winged the chess moves position in vscode. I think removing the background of the chess moves was a great decision. New design Firstly I designed the concept in figma before coding. I added a text wrapper within the visualization to break the flow of the website. The previous design which I was going towards started feeling like a generic website (a bad one). Now the there’s text with a reveal animation which looks pretty simple tbh but I think it’s better. I might change that in future though or add elements to make it look fuller. The after the text animation the person visualizing image appears and different moves appear indicating that the person is thinking the moves. I was going to use a thought component for this but I did it in a more simpler manner. Time I always underestimate the time required to build things. I feel that I should have completed more in the time that has been recorded but small bugs happen while coding which is really frustrating. In this devlog also I feel I should have completed more. Am I just slow or happens to others as well. I really would like to know (comment).
Updates Added RootLayout.jsx for reusing a single a navbar across all pages Changed react-router-dom to react-router Added expanding animation to the navbar when the path is “/” and shrinking animation on other paths except “/” Designed the course part in course page What I wanted Before I added the navbar inside home page but after creating the course page I realized that I would want the navbar to be reusable across all pages. Also I wanted the navbar to expand in other pages expect the home page. Switch to react-router I was using react-router-dom for managing routes. I tried to look up the docs to make the navbar reusable. I couldn’t find anything and saw that react-router-dom just used react-router so I thought it’s was not necessary for me to use react-router-dom so I just switch to react-router. Navbar animation issue Animating navbar to expand and shrink was a mess. It’s look really simple and it is simple but not for my brain. I first thought of making the width to 100% and set align items to center. The width part animated as expected but the align items didn’t. Then I thought of using position absolute and centering the nav but now the navbar wasn’t respecting the nav-container’s padding. It was frustrating so I took help of claude and centered it using y property by doing some maths. Time flies I also had issue with the timeline reverse not working but I think I should stop my complains here. I am rambling here because it took too long to do too little 😭 . Designing the course page On the positive side the I have started working on the design of course page. I have only done a small part but it’s looking amazing. The part other part that don’t look right were the design which I made during the start of the project. Rn I am just refining that previous design of mine, that’s why the navbar looks different in figma. Hope you have a nice day ❤️
Ayy new devlog let’s go!! Updates: Designed the info part (the portion with the progress bar) Created working accordion component with animations Started working on the info part Created working progress bar component with animation I like the design of the info element. I have tried using hierarchy to make the design look good. Also I randomly had the idea of earned badges after the user completes the whole course of a certain difficulty. Then, I hoped onto coding the accordion. Firstly I wasn’t making accordion as a component. There were just three div in the course page and I realized that if I don’t make it a component the code is going to look messy so I created the accordion component and now the code looks much cleaner. While making that I stumbled across a funny bug. Clicking on one accordion component was making all component to open. It was because of gsap selecting all the similar classes and animating them. I fixed that by using useRef to select elements. I have also created a progress bar and now I’m working on completing the info element. The progress bar looks good if it’s even a little bit full but idk how I feel about the progress bar when it’s at 0%. It feels bland and idk what to do. Okay enough rambling. I feel my devlogs should be shorter ig. Anyways if you have any suggestions please let me know. Peace ✌️Ayy new devlog let’s go!!
Mostly designing and coding that design. Progress: Completed the info element Designed the course card inside the accordion Created the course card component Moved accordion, courseCard and progressBar component into components folder within the course page The course page is slowly but surely coming together. I think the info element looks really nice now that it’s complete. But yeah the list does contain dummy information. I will change them after I have selected the videos as my courses. ~ CourseCard component seems okay imo. The tick mark is supposed to indicate that the user hasn’t completed that course. After the individual course is completed it will go green. I have mixed feelings for the tick mark being there. The idea seems find but I’m really not sure about the design. ~ But anyways it was fun designing in figma. In the website have made the CourseCard with the ability of each card having different text and image but right now they are only a little different in different levels. ~ Idk how time passes so quickly. Got only this much done in 4hrs😕 but I think I am now starting to enjoy the process. I am not focused on the time so heavily as I was before 😇. ~ Okay this time I have decided to keep my devlog shorter. Any opinions will be appreciated ❤️.
I’m locked in Progress: Changed the dummy data from beginnerCourse and intermediateCourse in constants.js Created WatchCourse page Made courseCard open WatchCourse page with respective course video Made navbar show go back and finish lesson on button if the user is on WatchCourse page Designed a banner for the course page I changed the data of beginnerCourse and intermediateCourse in constants.js file which instantly made the cards inside both beginner and intermediate so much better. The professionalCourse data hasn’t changed and will be changed later. ~ After that I worked on one of the main feature of the website which is being able to watch the course. Now, if user clicks on a course that they want to watch, then will be redirected to WatchCourse page. I achieved by using the YouTube embed link and dynamic routing. ~ The navbar also changes in WatchCourse page as there will be go back and finish lesson button. The go back button currently works but I still have to work on the finish lesson button. ~ I took a break from coding after doing that and started working on the banner. I don’t really know how the banner should look so I just added a gradient, two chess pieces, some text and some chess analysis moves and called it a day. ~ Now I’ll go export that banner and add it to my website. If you have any recommendations please let me know. Biee..
Now the completed course has a green tick mark Basically now if you click on finish lesson you’ll be redirected back to the course page and the lesson you choose as completed will have a green tick mark inside the course card. ~ Also, if a lesson is completed the navbar won’t show the finish lesson button. ~ Right now, the data doesn’t persist across reloads. I will store the data in localStorage next and when I implement the backend, then only I’ll store the data in database. ~ The challenging part was seeing the whole picture. How will the feature work, where will the data live and how to know if a lesson is completed, things like that. ~ Also, during development I thought of using useContext hook but I had forgot how to use the hook while following best practices so I just went to my previous project to relearn stuff😅😆. ~ I decided to use pen and paper for problem solving and better visualization which worked really great for me 🎉🎉. I will definitely do this when I encounter problems in the future 😄. ~ Btw, No bullet points this time😅. I haven’t completed much as I’m sick. Hopefully I get well tomorrow🤞.
Many small improvements Changes Made the opened cards remain open after finishing a lesson or going back from watch course Saved completed course data in localStorage Added confetti animation after clicking on finish lesson Fixed value of total in course.jsx by making it dynamic Fixed navbar animating when reloading on non home paths This time I have done many small changes but I think that they make a great impact on the website. ~ Firstly I made the card remain open while visiting other pages. I mainly did this as a part of user experience. I thought that it’s inconvenient for a user to see the card they opened being closed after they come back from the course watching page. ~ Also, now the data of completed course persists. It is stored in localStorage. I’ll definitely stored the data in database in the future. Also I was facing an annoying bug doing this because I forgot that I needed to stringify the data before storing in localStorage😭. ~ There’s now confetti animation after clicking finish lesson. I think it looks nice. I used a npm package for the animation. ~ Before the total course was a dummy value of 10. Instead of counting the courses manually I just did a sum of length of all courses data from constant.js. Now, when I change the professional course value I won’t have to think about changing the total value. ~ The navbar animation was meant to run only when user move from home page to other page and vise versa. But, when I was on the course page and if I reloaded the animation would still happen. Fixing this was really painful as the solution was really easy but I just couldn’t figure it out. At last I took the help of Claude to figure out the solution 😩. ~ I took two days off because I was sick again😭. Why is my immune system so weakkk😭..
50 hours!! Let’s go 🎉 Changes Designed signup page and login page Created signup page and login page Divided the codebase into frontend and backend Setup backend Setup signup endpoint to receive formData Designing the signup and long page was really fun. I took some inspirations from pinterest. I’m proud of the design I made 😄. Turning the design into code was also fun ig. I did face a small bug. The image looked bigger than the form but both had flex-grow of one. The fix was simple I just had to change the flex-basis to 0 so I did flex: 1. Finally I’ve started on the backend. It’s been some time since I haven’t done backend stuff. Coming back to backend felt nice. Although it was frustrating when the data sent to backend was just saying it was undefined. But after some time I just figured out that I forgot add express.json() middleware in my server.js. I’m well now and feel that now I’ve no motive of slowing now. Hope you’re also doing well 🤞.
More progress on signup and login Changes: Designed the username form Created the username form in signup Changed useRef to useState to store signup data Adjusted the backend to receive and store username Add login functionality Fixed required attribute not working in both signup and login form Designing the username form wasn’t that hard as it’s just the signup page but will less things. I looked at how chess.com was doing things during signup and thought it’s better to split the email and password into one form and username form into another. There’s also a back button to go to the email and password form. Coding the username form was a little frustrating as I had some issue positioning the back button. Now it’s working but now I am facing the old issue of img-container and form container not being the same width. I’ll fix that next. Also the way username form is display is by just toggling a state into true or false in the singup page. After adding the username form there was an error telling that email and password was null. This was because while entering the username I wouldn’t be able to access the email and password input using the useRef hook. The fix was simple, I just changed the useRef into useState and store the data on input change. Now that was extra data (username) that needed to be stored. I sent the username along with email and password to the backend and changed the userSchema to accept username. I worked on the signup functionality last time so this time I worked on the login functionality. In short, now during login the backend verifies the email and password and gives the user a jsonwebtoken as a cookie or an error. I wanted the input to display “field is required” when user tries to login or signup without filling in the form. I just couldn’t get this working and it was so frustrating because the issue was so simple. Later I found out that I was using e.preventDefault on the button instead of the form causing the input to not show “field is required” Okay enough yapping. Gotta go and work on the project. Hope your project is going smoothly. Bie…👋
I’m sorry 😭 ##Changes: Use localStorage to store jwt instead of cookies Fix signup page unequal width of img and form container Changed login.css similar to signup.css for consistent code Added login as guest functionality Added navigation to /course after signup or login success Added UserContext.jsx to handle user data Added protectRoute middleware to verify jwt Added “/api/user/“ endpoint to get user data from backend Too many changes, let’s break them down. I’m sorry that I switched to localStorage to store jwt instead of cookies 😭. The cookie wasn’t working as expected. I was able to store the jwt in the cookie and receive it in the frontend but when I reloaded the cookie would just disappear. I know that there’s a fix for this as I have done this before as well. But, I know that I’ll face the same issue during deployment even if I fix the issue now. I’ll probably deploy this in vercel and last time (in flavortown) I had to change the whole code format due to the cookie issue. So this time I’ll just rely on localStorage for now. If I deploy the website myself then maybe I’ll consider using the cookie. But for now just forgive me 🙏. I fixed the unequal width of img container and form container with again in signup page. This happened because I added padding to the form-container instead of the form. Using flex for this was a headache so I used grid and it worked. Although I didn’t necessarily needed to change the login page css. I did it to maintain a consistent codebase. This is a huge one. I added login as guest functionality. I know that people will be skeptical of entering their email even though they can use any made up email such as [email protected] . I purely added this feature so that people don’t rate me bad just because they assumed that they need their own email to signup. And logging in as guest is easier as well so why not. Now, after the signup, login or login as guest is successful then we’ll be redirected to the course page. Later I’ll make it so that users who aren’t logged in won’t be able to access any other path except for the “/“. Also now there’s userContext.jsx for storing and distributing user data. For now there’s getUser function for getting user’s data. I have made the backend work to verify the user’s token and then only provide the user with their data. Alright no more yapping, the devlog has gotten very long. If anyone has read this devlog, God bless them. ~ Peace ✌️.
Life is frustrating 😩 ##Changes: Added navigation to /course after successful login Designed navbar when user is logged in Added the user button in navbar when user is logged in Added redirection to signup if user goes to /course without authentication Fixed jwt malformed error in protectRoute.js The navigation to /course after successful was implemented before but I somehow missed to implement that in login page. Designing the navbar for authenticated user was very challenging than I expected. As you can see in the image there are multiple attempts at creating the navbar. Everything I tried was just looking bad. The final design is also questionable. But for now it is what it is. Now unauthenticated user aren’t allowed to visit course page. They will be redirected to signup page if they try. This was supposed to be simple but somehow I made this also hard for myself. I have done this before so this should have been easy for me but nope. The redirecting was working fine but I were to be authenticated and be on course page and then reload, then also I would be redirected to the signup page. After I made up my own solution for this which I don’t think is the best way to do it. Due to my incapability of designing simple things and solving minor bugs I was questioning my ability to solve problems and design. Which at that moment felt sad 😔. Also there was jwt malformed error popping up in the backend which was also frustrating to solve. Not because it was hard but because it was easy and I wasn’t able to solve it. I won’t tell you what happened here as the devlog is getting long. No video this time cuz the I can’t show the navigation changes working as they aren’t working properly. The bug is preventing user from redirecting to /course after login or signup. Instead user is redirected to signup. I know that this because of the two redirection changes made in this devlog. So, I’ll go and fix it asap. Hope your coding experience isn’t going as frustrating as mine. Thank you for reading my frustrations. Bye…👋
Omg it’s finally fixed I finally fixed the bug that I addressed in my last devlog. This was so frustrating. I never expected that this would take me 2hrs and I would write a whole devlog on it 💔. The bug was that when I was logging in I was being redirected to /signup after signup, login or login as guest. I had made so that after signing up or logging in the user would be redirected to course page. I had also made it so that if the user value is null then the user would be redirected to the sign of page. So now you can see that where this is going. I just couldn’t simply figure out why the user value was null. After doing so much thinking and reading the code and trying to fix the bug, I have finally succeeded.Another issue that I was facing during the working was I was constantly forgetting what I was doing and to see everything visually I used excalidraw as you can see in the picture. So there were three things that was leading to this bug. Firstly, I wasn’t using the await keyword while calling the api functions. Secondly, I didn’t have a loading state while fetching the user’s data. Lastly, the function getUser function responsible for fetching the user data wasn’t even being called when redirected to course page. The function was only being called when the user first loaded the website. Right now, my head is aching now I think I should take some rest. I didn’t remember to add loading state which was so silly of me. I only realized that after visiting my old project. Seeing that I felt dumb because ofc you would need a loading state while fetching the user data from backend. I feel a little relieved now 😮💨. I cannot even remember properly all the things that I tried to solve this. It was just a mess 😩. After solving the bug, now looking back, it wasn’t that difficult to solve. It was just a me problem. I could write more on this but I’m too tired for this now. Okay biee..👋
Wth it’s been 5hrs?? Added toast for login signup and login as guest errors Made the signup data persist even after the value of hasContinued changes Designed the dropdown menu Added dropdown menu Added logout functionality First of all, I’m genuinly confused how this took me 5hrs.. Added toast so that now when there’s any error during the signup or login. For example during signup maybe a user might write a username less than two characters, then the toast pops up telling the user it should be greater than 2 characters. I was stuck during this cuz the trycatch block wasn’t catching the error which was confusing. I used axios previously and it threw an error if the backend response wasn’t ok. But this time I avoided using axios for reasons that you guys probably know 💀. It seems that fetch didn’t throw any error so I had to manually throw errors in the api functions. The making of signup data persist on hasContinued value change was early. I just set the value attribute of input to be it’s respective useState data. As you can see in the image that I designed the dropdown. I first designed the dark one which I really loved but it didn’t match the navbar so I created a light one. After seeing the dark one I really didn’t like the light one. So I tried fixing the design. I asked someone in the slack and they said the previous light dropdown design looked fine. Ig looking at the dropdown for long made it look fine to me as well 😂. Now I added the dropdown to the website. I had issue with the padding of the logout button during designing phase but I just winged it during coding phase and it worked 🎉. The dropdown now looks fine imo. I however did have a issue while making the dropdown closing work when user clicked outside of the dropdown. I thought of using an overlay in the background but I knew that there was a way of doing this by checking the click event. It seems I had forgetten to do this. After some trial and errors I remember how it was done.. I also added logout functionality which was fairly easy to add cuz I’m storing the jwt in the localStorage. I just removed the token for localStorage, set the user to null, set isDropdownOpen to false and navigated the user to the home page. Ig, i’ll try do things faster next time ⚡️. Don’t want to spend 5hrs on things like these. Okay biee…
When will my devlog get more than 7 views 😭 Changes: Added loading component Added scrollsmoother in home page Fixed course page padding and added toast while redirecting unauthenticated user Added back button to signup and login page Designed the logo for website Added the logo to the website Now whenever the frontend fetches user data from the backend there will be a loading component that will come up. I made the loading spinner myself in figma why not 😃. Scrolling the home page using a mouse is so much better now now due to scrollsmoother plugin of gsap. I was facing a issue with this though. I was seeing an error while navigating to other pages. After a while I found out a guy with same issue in gsap forum and his solution worked. God bless that guy 🙌. Some small changes were fixing the padding in course page , adding a toast while redirecting unauthenticated user from couse page and adding back button in singup and login page. I think they don’t need much explanation. I tried to design the logo of my website in figma. I tried different things and landed with a design that felt decent (The logo with king in the center). I look nice up close but it didn’t feel the same when shrunk down as a logo. So I started designing another one. I landed on the logo with cyan and dark purple background and !! symbol up front. I really don’t know how I feel about this logo. I looks decent sometimes and other times questionable. Please leave your opinion in the comments 🙏. While adding the icon as a favicon, for some reason the favicon wasn’t display which was confusing. Later I found out that this was a brave issue cuz it’s showing up in zen browser. Okay this much for now. Please like so that more people see this devlog 😭.
We have followers Changes Designed hollow medals Switched from localStorage to db for storing updating and retrieving completed courses data Added feature to show medals achieved by user Designing the hollow medals (I don’t know what to call that so I’ll just say hollow medal) was really fun. I just started designing the medal for fun in Figma. The result turned out really great even better than what I had expected. I was using circles for the medal itself and was trying to use the rectangles for the below design. Later I figured that it would be wiser to use the pencil instead of creating a rectangle and mapping out the bottom portion of the medal which turned out to be a great idea. In this project, I have started using Figma for creation of some assets and I am loving it so far my intention is to keep on using Figma until and unless I really have to use AI. Switching from localStorage to database for completed courses data was easy in my head but it took me longer than expected mainly because of three reasons. Firstly, I was thinking of creating a separate backend endpoint for course data. After creating the controller and route for course data I thought that it isn’t really necessary to create another endpoint for this as we can store it in the users data itself. Secondly, after deleting the routes and controller, I created API function for fetching and updating the completed course data period I had forgotten that I don’t actually need to have a separate getCompleted function because while fetching the user itself, the data comes with it. I have forgotten to delete the getCompleted.js file which I will do later. Thirdly, I have started to use Postman for testing out api . I am loving to learn things such as Postman and Figma. But this issue I was facing was the postman was working correctly but from my codebase the request body was showing undefined. It was a fetch thing I use axios before and I am figuring out right now why people used axios. It seems that I needed to specify in the header that this request had the content of json. So figuring that out also took some time. Also, I have added the feature to show medals achieved by user. The code isn’t quite clean for this feature. Thanks to the people that followed this project. I genuinely appreciate that 💖. New followers : @PAPER_01 @sak
Started working on the vision page Changes Designed the vison page Created the vison page and worked on the sidebar ui I have changed the name from visualisation to a vision. I actually don’t know which one is better. I just changed because chess.com and chesskid.com had vision for practicing the squares on the board. Designing of the vision section was quite fun although I had some issues with auto layout that wasn’t big of a deal. I was thinking what options should I have and thought it would be best to add show coordinates, change the color and select the time. I think the UI turned out pretty great. I will probably change the colour of the chessboard but black and white also looks fine. Coding design wasn’t too difficult. It was just copying the design that I made, but the Figma design looks different. I should check out why the size of the buttons are the same but in Figma they look a lot bigger. It might be because the width of the sidebar is not the same. In conclusion, this was a peaceful devlog. It feels really nice not having to fight with your code and your designs. Hope that the future develops are the same 🤞. Until then peace✌️.
Things are going great Changes: Added chessboard component with ranks and colored squares Added function for generating random squares and displayed them Added feature to display green and req squares to indicate whether the user clicked correctly or incorrectly in the chessboard Displayed attempt made by user in the sidebar with respective colors for correct and incorrect ones I thought doing all of these took me at least four hours but I was wrong. It seems that it’s only been about like three hours. This time I have worked on the chessboard itself on the vision page. Before it was just a plain whiteboard but now there are individual squares which was pretty easy to implement. I however needed some time to figure out how to add colours to the squares. But it also wasn’t that difficult. Then I created a function for generating random squares with the help of math.random(). I created an absolute element to display the random squares at the centre of the chessboard. To indicate the user that the square they have clicked is correct or incorrect I played the small animation that changed the colour of the user clicked square into red or green depending upon whether the user input was correct or incorrect. I was stuck here because I didn’t know how to reverse the animation. Of course I could just change the colour to green and then the colour of the square but that didn’t look quite right as I am probably going to change the chessboard colour later. So I wanted the animation to be flexible I was trying to play and reverse a animation timeline but it was so much easier than that later. I just remember there was the repeat and yo-yo property that will easily accomplish this effect I’m looking for. I have found a new bug with this if I spam click a square the square permanently turns into either red or green so definitely I will fix that in the next devlog. Also now the squares that the user clicks will be displayed on the side bar. The colour of this square notation will be red or green depending upon the user selected the square correctly or incorrectly. I have found out that there’s a flex related css bug in attempts element. I will look into that tomorrow. Okay bie.. Hope you have a great day 💖
Ayy almost 5 hrs today !! Changes: Fixed attempt square and attempts not wrapping as expected Fixed color being stuck in chessboard when same square is clicked rapidly Added color menu popup when click color button in sidebar Added time menu popup when user clicks time button in sidebar Added Progress component in sidebar with working score Made timer in progress.jsx functional Fixing the user attempts in the was pretty easy. I just added a attempts container to wrap the attempts element and then the CSS work as expected. Fixing the red or green colour being stuck in chessboard when clicked rapidly was a headache to fix. I was trying my best and at last I came up to the decision that I needed a timeline for the animation before the animation was played the progress of the animation should be zero. I tried that and obviously that didn’t work but it seems that I was close to the answer. I used Claude to figure out the answer and Claude used killTweenOf gsap function to remove the animation before the animation was even played. It also added a onInterrupt property to the animation which basically reverted the stuck colour after killing the animation. I didn’t want to use Claude, but I just couldn’t figure it out and I think it was better to use Claude as I have never used those functions and properties of gsap. Also Claude made that portion of my much cleaner. Seeing this now, I will be more focused on the cleanliness of the code because claude showed me that my code was repetitive and how it could be made smaller and easy readable. I decided to make the colour menu pop-up and time menu pop-up straight by coding instead of designing it first as I should have. As you can see, the result is very terrible. I am sure definitely fixing it in the next devlog. I was force thinking of making a pop-up menu component and using them in both buttons but I found that it was a hassle and not worth it. Only the white and black button in colour pop-up menu work. They just rotate the board and that’s all I still need to add functionality to them. After learning the lesson that I should definitely design before coding. I started designing the progress component. Although there isn’t much to design there I definitely would have made it as bad as the pop-up menus. While coding this, I also made the score display the total number of correct at attempts which was pretty easy. I just had to add one digit whenever the chose the correct square. Then, I started working on the timer. The timer would have been really easy if I just used setTimeout every second but I like to torture myself so instead of just doing that, I challenged myself using date constructor. I have done this before but it has been sometime and I remember how it worked. The countdown started from 28 which was frustrating. Now, I have just completed that but the code is really messy. I will definitely fix that tomorrow or today as I might post this devlog tomorrow. I think that shorter devlogs do better in terms of views. I’ll try that next time. See you in the next devlog 👋.
Mostly cleaning up the code and breaking things Changes: Made timer code better and cleaner Added functionality to timeMenu options Added countdown before starting the timer and displaying the squares -Added VisionContext.jsx to make code cleander and broke down vision page into smaller components As I said in the previous dialogue, the timer code was messy. So I decided to clean the code now it looks much better. Also now the time button options work now the timer will have 15, 30 or 45 seconds according to what you choose. So before, after cleaning on start the timer would start right away and the square would also show up. But this might make the user frustrated as they have to click start and right away move their mouse to the chessboard. I saw that chess.com has a countdown timer so I also made one. The code for this countdown timer is also messy so I will probably make it more cleaner next time. This is the main thing I have doing this whole devlog which I cannot show you because it’s just making the code cleaner. The vision pays had a chessboard component and then sidebar element to it. The sidebar element had all the code which was making the vision page could a lot messy. So I have broken down components into components and those components in the further components. I think this is making the code much more easy to read and find and debug each component more easily. But in the process of cleaning my messy code, things have broken down. The timer isn’t working, I will fix that later. I don’t have much to show here today so the see the countdown timer working and the broken timer 😝. I will fix everything in the next devlog. So stay tuned. Bieee…
We’ve reach 100 hours 🎉 Changes: Fixed timer not displaying in sidebar Removed the square display after time is over Fixed timer setInterval running multiple times and made countdown timer code cleaner Fix TimeMenu not closing Removed unused imports Designed the sidebar to add new data Added the new design Added animation to make the square notation that appears on the chessboard disappear First of all, we have reached 100 hours let’s goooooo. I would like to thank everybody who have followed my project read, liked or commented on my devlogs . My project has recently started getting some traction. Special thanks to @PAPER_01 💖. I have done a lot of things this devlog. I will try to cover these in as short as possible. It seems that the setInterval in progress.jsx was running twice. I found out this while I was making the countdown timer code cleaner. So to fix that I reset the hasCountdownCompleted as soon as the timer in progress.jsx runs out. Now, countdown and progress timer work as intended with cleaner code. The random color option in color menu now works. It was a little tricky making that work. Let’s just say it wasn’t working as expected but the fix wasn’t that hard. I liked what chess.com were doing. They were displaying the square notation and then the square notation would just disappear. The square rotation will also live in the sidebar so that if user forgets what the square was just displayed, they can easily look at the sidebar. I really like this idea and decided to implement on my project as well. But before I added this to the website, I first designed it on Figma. I also thought of displaying the score and best score on sidebar. Designing it was fun and tricky. I didn’t really like how the previous score and best score were looking and after some trial and error it looked okay. All of these things were fine and enjoyable to do but making the best score work was so frustratingggggg. It’s the reason that I couldn’t devlog yesterday. The issue was score was showing to be zero inside updateTimer function even though the score was greater than zero everywhere else. I thought fixing it wouldn’t be really hard. I tried console log score everywhere to see when the value was being zero but there was no sign of the score turn into zero. Later I found out that due to the updateTimer function being inside a setInterval the value is kind of locked and used useRef hook to solve the issue. Okay, that’s all for this devlog. Now that I have reached 100 hours let’s aim for 150 hours as soon as possible. I have taken very long to write this devlog so I like would be heavily appreciated 😄.
You’ve my coordinates now Updates: Added coordinates to chessboard Changed previous to current Fixed user input on chessboard being checked before countdown finished The show coordinates now works Fixed some event bubbling issues in colorMenu and timeMenu Designing the pop up menus Now it’s easier to locate squares with the help of coordinates . Now you will also notice the board has fliped while changing colors. ~ A small change, in the sidebar the previous word has been replace with current. I think the current word makes more sense there. ~ I also fixed user being able to click on the squared before the countdown finished. This was a silly mistake from me. ~ The coordinates has made it easier to locate squares. But if you want some challenge then you can toggle show coordinates off now. ~ That’s all for this devlog. If you wan’t my actual coordinates dm me 😄.
Moving onto something big (I’m scared) Updates: Change ui of popup menus in options.jsx Added sounds for correct and incorrect attempt in chessboard Added countdown and start sound in chessboard.jsx Added puzzles page Renamed sidebar of vision page and it’s component with prefix of vision. Most of the updates in this devlog are small changes. But now I am going on to work on the puzzles page. I don’t know how I will figure this out. I hope it goes mostly smoothly.. I had designed the popup menus in the last devlog. I think the newer design is much better than the last one. The popup menus don’t look the same in the figma and the website cuz I tweak some things while coding. The figma design was a rough design Adding the sounds in the vision page has made praticing much more fun. The built in mac recorder doesn’t record sound unfortunately or I just don’t how to.. So, I’ll add a ss of vision page with menu open and a ss of puzzles page. I added chessboard and sidebar to vision page. There were two sidebars now so I decided to rename vision page sidebar to VisionSidebar and puzzles pages sidebar to PuzzlesSidebar. Okay that was all for this time. Give me strength to start making the puzzle by liking and commentin on the devlog. Byee ♥️. Also if you’re reading this support @PAPER_01 . AniShuffle has been taken down but she’s been unbanned now 💖.
The pieces have been placed. I was so sloppy 😭 I’ve added pieces to the chessboard. I’ve finally started facing my fear and started working on the puzzles section. It seems that creating the chessboard for puzzles will be harder than I have anticipated. Also please don’t mind the black pieces blending in with the background. I didn’t find chess piece set I liked so I downloaded the lichess chess piece set from pinterest. I was trying to crop them in figma and I coundn’t crop them properly. Also it was a tedious job. After downloading two crop pieces from figma I again went to the web to find out if someone already made them. This website came in clutch (greenchess.net). They had the whole chess pieces set of lichess available for download. Then, I started to code with no plan in mind . I don’t know why do I do this to myself. Obviously it was a bad decision. So I decided to use pen and paper to mainly solve one thing and that was how to place the pieces on the board. The writing helped me alot to think better. I was so sloppy while coding. I was mostly outside while coding and I was really distracted. One sec I was coding and another sec I was thinking about something else. I was making so many silly mistakes making the process more frustrating that it already was. I learned about fen while doing this (Forsyth-Edwards Notation). Through this any chess position can be stored and recreated in one line. It looks like this rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 I only needed to loop over the first part divided by slashes for positioning the pieces. Other things will be used later. I feel the code is really poorly written but it works so idk. I also found out about regex while I was trying to write a if condition for seperating strings and string with numbers. Okay this much for today. Bie….
I got sick 🤧🥀 Updates: Make pieces position perfectly to square in chessboard Moved chessboard states and refs to ChessboardContext.jsx Fixed pieces sometimes being group together in one square when chessboard offsetWidth is null Added destSquare element on click for all possible moves of rook Last time I did position the squares but when I changed the background color of pieces there was a slight misalignment. I started searching what was causing that to happen. It was due to the height and width of chessboard being in decimals. I checked to see what lichess were doing and found out the height and width of the chessboard were always divisible by four. I did the same for my website and now it’s perfectly aligned and that’s what I love to see. Moved the states and refs from chessboard.jsx to chessboardContext.jsx to make the chessboard code less cluttered. The code relevent to puzzles page is in the chessboardContext while the code revelent to vision page is still in the chessboard page. When the page was loaded for the first time the pieces were being group together at the top left square. It was being fixed automically when the page was reloaded. It also happened while navagating from home page. I found out this was happenning due to chessboardWidth being null at start. To fix this I created a useState for the chessboardWidth so the page rerendered after the value was changed. My goal today was to make the rook move but I could only work up to generating the destSquares when the piece is clicked. I achieved this by creating a useState array and if user now clicks on the rook it calculates all the possible squares that the rook can move to and then that array is mapped using math to place destSquares perfectly on top of squares. The destSquares have a dot insided them which will be replaced by a icon but that’s the reason they’re not aligned centered currently. I did have a hard time doing this. Let’s not talk about it. 😭 I’ve written everything in short so that I don’t hit the 4000 characters limit and also ig it’s better for people reading (if any 🥀). I got sick yesterday and was just able to work on my project for 1 hr. Today I thought didn’t work much but it seems today I did 3 and half hrs. I am happy about today. I really don’t know if I can create the puzzle but I’ll try my best to do so. Everything I try to do seems to come with their own set of challenges and take time to overcome those challenges. Let’s see what happens 😔
The rook got some moves 💃 Updates: Added movement to piece when destSquare is clicked Added mode state for seperation of chessboard in puzzles and vision page Moved states, refs, effects and functions from Chessboard.jsx to VisionContext.jsx Working on handling vision page data if user switches to other page during vision practice Finally I can proudly say that the rook can move now. I am really happy that it’s working. To move the rook I had created destSquares(the square with green dots) last time. Now if the user clicks on any of the destSquare with some maths the rook move to that square. I’ve added transition for the movement to look smooth. While doing this the rook did move to the destSquare but when clicked on the rook again the destSquare appered from when the rook was last time. To fix this I grabbed the destSquare location (e4) then set the squareid of piece to the location. The destSquares were calculated based on the squareid so now after moving the rook I can move it again. Also now if the a piece is seleced the background color of the pieces changes. When a piece is selected then destSquares appear but if the piece is selected again or other square is clicked then the destSquares are removed. Small things like this is making the chessboard feel lively and feel that it works correctly. I wanted to do this before but I thought I’ll do it later. I added a mode state in Chessboard.jsx. The mode state is either “puzzles” or “vision” representing the page the chessboard is on. I have made the pieces not appear while I’m in vision page and am trying to make sure nothing is running behind the scences if user decides to move to another page after they click on start. The countdown timer code of vision page was in Chessboard.jsx. I didn’t like that so I decided to move the code to VisionContext.jsx with the timer I move some states , refs and function with it. I had some issues during this migration but it wasn’t too difficult to resolve. I thought I had worked more but seems like I’ve. I’m confused, when I think I have done little work at that time I some how end up will better hours and when I think I have done decent amount of work I end up with less hours. Anyways it feels good watching the rook moves are working correctly. This much for this devlog. Peace ✌️
More pieces can move (I’m sick again 😭) Updates: Added functionality to handle vision page if user changes page during vision practice Added functionality of moving bishop and seperate calculation of rook moves Added functionality of moving queen Added functionality of moving king I told in the last devlog that I was working on hanling vision page if user changed page during vision practice. And now, it’s done. I think I have reset the necessary things so that vision page works normal. If any bug related to this appear in the future then I’ll fix it then. Right now everything looks fine after adding this functionality. Creating destination squares for rook was easy and I thought bishop would also be probably easy. I was very wrong. The thing with rook is that there will always be equal number of destination squares but bishop doesn’t. I bishop’s destination squares varies according to it’s position. I took a long time to figure things out in pen and paper. I even wrote the whole chessboard notation in paper and looked at only one diagonal first to find some sequence ( I’ve attached the img below 😆). I started coding after kind of figuring out where to start. I had issues during coding as well but we got it boys. Also I was using OR instead of AND in the while loop causing bugs and I needed some time to digest that AND definetely worked there. A silly mistake from my side. For the queen I didn’t have to code much as I wrapped the rook and bishop destination squares code in to a function. Then, I created a new function for creating destination squares of queen which just called both the rook and bishop function. As this was really easy I was pumped to move on creating king’s destination squares as it is also really easy. Took a sip of coffee and continued my coding journey. I was wrong 🥀. I got stuck adding the king’s destination squares. I was first thinking of combination of rook and bishop but only one out from every side. This was the wrong way of thinking ig. Then I thought I should use two nested for loops for creating the destination squares which firstly worked out badly cuz I’m dumb. The destination squares we’re being created in such odd manner. After fixing that I had to also remove the destination square which was being created on top of the king and also had to handle to not generate some destination squares when the rook is on the edges of the board. I have done nothing today due to my illness. I hate my immune system 😭. I’ll code for 5 mins now ig for keeping my streak alive. Okay biee..
30 day streak let’s goo 🔥 Updates: Added functionality of moving pawn with seperation destination square for white and black Added functionality of moving knight Changed color of chessboard Made rook not able to pass through pieces The pawns now move one square at a time and have the option to move two squares if they’re on starting squares. Moving pawn one square is easy but I had to think about creating two destination squares infront of the pawn. So I created a array and push all the starting squares of the pawn and if the pawn is on one of the starting squares then two destination squares are created. It’s also seperate for black pawn and white pawn so that white pawn doesn’t get two destination squares when it’s on the black pawn’s starting squares. I forgot the knight also needed to move lol 😆. Just remembered in time after finishing the pawn. The knight was tricky to move. As always I used the mighty pen and paper first before coding. Creating the knight took some time due to random bugs here and there. I think I need to revisit the knight code later as it’s very messy. Yay, now the back pieces don’t disapper on the dark squares as I have changed the chessboard light and dark square colors. I think the new colors look great. I was lazy to test out colors so I went to chess.com and picked colors from one of their themes. Okay now were moving to the next step. Making the pieces not be able to move through pieces. I started with the rook. The plan was simple. Check for any piece with squareid that’s same of the destination square and if true stop the loop. I couldn’t figure out how to even select the piece. I was frustrated as I need to select the specific piece with the squareid attribute. I found out about ReactDOM.findDOMNode but I couldn’t figure out how to work with it. I felt really frustrated at that time. I was thinking of using document object but I know that is a bad practice in react. It seems I forgot that we can use querySelector in refs. I already had the chessboardRef so I used querySelector to find if a piece was on the way of the rook. Also I had to change the way I calculated the rook’s destination squares but let’s not talk about that I think the devlog has gotten pretty long. Although the problems are hard for me to solve when I see the results working I genuinely feel happy. I have gotten lazy after getting sick. Although I have not fully recovered yet I’ll try to stop wasting my time. Okay this much for now biee….
Mostly cleaning up my messy code 🧹 Updates: Made bishop not able to pass through pieces Made the code creating rook destination squares much cleaner Made the code creating bishop destination squares much cleaner Fixed rook and bishop not creating destination sqaures at the edges of the board Made code for creating knight destination squares cleaner and fix if statement condition of rook in ChessboardContext.jsx Made code for creating pawn destination squares cleaner and make pawn unable to pass through pieces Fixed bug while clicking on a piece when another piece is already selected In last devlog I made the rook unable to pass through pieces so it was very logical to do the same to bishop. Making the bishop unable to pass through pieces was pretty simple as the code wasn’t much different from the rook one. Idk what clicked in me after doing that I started to thinking about making the rook destionation squares creation code cleaner. The code was very messy and repitetive and I believed it can made cleaner and smaller. I used 4 while loops before which had almost the same code but different values and slightly different calculations. After thinking and trying I turned the 4 while loops in to a single while loop. Now the code looks much better. Seeing the success in rook destination squares creation code I then moved on to the bishop’s code. Made similar changes to the code as the rook’s code. Also i believe the queen works perfectly as it’s mixture of rook and bishop code but I haven’t really tested it on board. After cleaning up both rook and bishop I found a small bug. The bug appeared because of my slight mistake while trying to make the code better. Basically the rooke and bishop weren’t creating any destination square at the edges of the board. The fix was simple so this didn’t take long to fix. I already didn’t like the knight’s destination squares creation code. Me cleaning up the rook and bishop code gave me the motivation to make the knights code better. It did take some time for me for cleaning up that messy and tangled code. I was using break keyword for rook and bishop so I also used break for stopping the loop but I didn’t want the loop to stop completely I just needed to skip the loop if there way a piece or if the knight was on the edge of the board. After a quick search I found that continue keyword does the job. The pawn code wasn’t that messy but it could definetely do better. I mainly changed the pawn’s code cuz I wanted the pawn to also be unable to pass through pieces. Before there were two loops now I one loop does the job. Then I also made the pawn unable to pass through pieces by breaking the loop. Fixed the annoying bug. If a piece is clicked when another piece is already selected then it looks like both pieces are selected. Desitnation of both pieces are shown and both pieces are hightlighted. So, as clicking on a square reset the selected piece, I reset the previous piece if user selected another piece with a small change. Now I’m trying to making all these things work from the black side as well. Okay this much for this devlog. See you on the next one. Biee…👋
Gobble up pieces Updates: Rotated piece img when color is black and made user unable to select opponent’s piece Added functionality of capturing pieces with rook Added functionality of capturing pieces to bishop, king and knight Added functionality of capturing pieces with pawn My goal was to make the board work from both sides. I was ready for this goal to be challenging. I was messing with squareid and position of pieces by checking the color of the board. But it seems don’t have to do much for things to work. Before, I have already made the board rotate using css. I was rotating the pieces when color was black and that was causing issue. Instead of rotating the piece I simply rotated the img inside the piece. Till now every is working as expected. Also I made user unable to select the opposite colored piece. Now we can capture pieces . If a piece can be captured, the piece will have four triangles at the corners. This is inspired from lichess as I didn’t really like the circle of chess.com. I made the triangles myself using figma. Also I created the dot in figma to change it’s color. Previously the dots were green. It took me some time to pick the colors of triangle and dot cuz I didn’t wanted their colors to ruin the feel of the chessboard. This works by firstly determining if the piece in the way of destination squares is our piece or the opponents. If it’s our piece then destination squares will instantly stop generating but if it’s the opponent’s piece the we first add the sqaure position to capuredSquares array and then stop generating the destination squares. While doing this I learnt about the remove method which allow me to remove the captured piece element from the board. It took time for figuring out how capture pieces with rook. After that it was really easy for me to do the same with other pieces as well except for the pawn. The pawn isn’t the same as other pieces. It moves vertically and captures diagonally. So I had to write code differently for the pawn. I code for the pawn does seem a little messy but i think it’s fine. I would say it wasn’t too difficult to make the pawn capture pieces. I did have to think about making the capturing functionality work for both white and black pawns. This much for this devlog. I am being quite lazy nowadays. Time to grind and lock back in. Hit me up if you also want to grind along with me.
I’m dissapointed in myself Updates: Fixed pawn unable to show two capture squares at once Added function to move opponent’s piece automatically Set fen according to puzzleLevel Moved opponent piece after the pieces have been placed and remove css transition into gsap animation while moving pieces Last time I added functionality to pawn to be able to capture pieces. It worked fine I there was only one piece diagonal to the pawn. I there were two pieces diagonally infront of the pawn only one capture square would appear. Now two capture squares appear if there are two pieces in front of the pawn diagonally. Fixing this was simple. Created the function to move the opponent’s piece automatically. In puzzles the user only moves their piece, the opponent’s piece moves automatically after user plays their move. This was the most frustrating thing I worked on today. I thought the function worked correctly but I was wrong. I’ll tell you in a sec. I added 3 fens with moves from lichess puzzles data in constants.js . Then I made the default fen data to null and made it so that the fen is selected according to the level of the puzzle. I think I was trying to add loading state for this. It was very poor thinking from me. I was just being very ambious and instead of trying to do things step by step I was trying to multiple things at this time. I don’t remember exactly what changes I tried to make ig I was trying to fix the moveOppenentPiece function as well at this time. I undid some of those changes, left others as it was and fixed the fen and commited that. I was already frustrated at that point and then when I tried fixing the moveOpponentPiece function the constant errors and bugs worsened my frustration. I don’t want to explain that part. Just know that after fighting with my code it’s working now. Also before I had css transition for trasform property. Meaning that whenever the pieces moved it moved smoothly. But when the chessboard is first rendered all the pieces also animate to their places. I fixed this by removing the transition css and using gsap to move the pieces. Now the first opponent move happens automatically. This was also frustrating to make it working. Basically today was frustrating. I thought I coded longer but seems like not. But anyway, when you’re at the bottom the only was is going up. Saying that I will stop writing this devlog. I feel I could have written an essay today. Okay bie…
Taking a BIG decision Updates: Fixed pieces creating only single capture square Added redirection to signup page in puzzle and vision page if user isn’t logged in Made user unable to select piece when opponent’s piece is moving Connect oppenent’s move to puzzle data, Add check for user moves and Add functionality to make the opponent piece move automatically after user plays the correct move I fixed the pawn not being showing two capture squares last time. After that I found out that the capturing the piece wasn’t removing the piece from the board. I found out a function that I have commented out was being called and causing an error so I removed the function call for now. This was easy to fix but by doing this I found out that the pawn wasn’t the only one who wasn’t able to display mutliple capture squares. All the other pieces weren’t able to display multiple capture squares due to a simple rookie react mistake. The value of captureSquares was being updated with it’s own value instead of using the previous value. After sorting that out I figured i should do same with the destination squares. Previously had an array updatedDestinationSquares after pushing all the values to the array then only I updated the destinationSquares value. In short I was doing the correct thing and me thinking that I could save 2 lines of code by adding setDestinationSquares directly to the loop was a bad idea but the state function isn’t synchronous. So I undid all the changes and also added a updatedCaptureSquare to all functions just to be safe. Now user can’t select pieces when it’s the opponent’s turn. Although the timeframe to select piece is small but still I wanted to be safe. I achieved this with a state named isOpponentPieceMoving. it’s toggled on when user clicks on a destination square and toggles back off after the animation finishes. Next I tried to make the opponent piece move work through with the help of the lichess puzzle data. Before the opponent piece could only the first move to play. After connecting the moveOpponentPiece with puzzles data. I created a function to check whether the move made by user is correct or incorrect. This was also being checked with the data in constants.js file. The data is stored like this r3r1k1/p4ppp/2p2n2/1p6/3P1qb1/2NQR3/PPB2PP1/R1B3K1 w - - 5,e3g3 e8e1 g1h2 e1c1 a1c1 f4h6 h2g1 h6c1 The moves part start after the comma. First move is of opponent. It tells from which square to which square the piece is needs to be moved Eg(e3 to g3). The second move seperated by space is what the user need to play to move forward in the puzzle. So if the user’s move is correct then I move the opponent’s piece. But if it’s incorrect then I reset the board. I got lost in the reset part. I learned if the key of a element is changed the element kinda resets. When I started doing this I felt a little uneasy. I was figuring out the code I wrote was manipulating the dom which isn’t the best practice in react. Regardless, I added a fragment to the code that was generating the pieces with a key with the value of boardKey and updated the boardKey when the user’s move was incorrect. But in my mind a question was lingering "Should I redo this in the way how react wants it" . Seeing the functionality working I pushed off that question. But, when I captured a piece a error popped up. The ss is below. I tried to locate why was that error popping up. I’ve concluded that the bad code has started to show why it’s called bad code. Although I might find this solution to this issue I think it’s better for me to just rewrite the code. This is painful but it will make me a better developer. Also I found another bug, the error isn’t the only reason I’m making this decision. I’ll push the code upto what I’ve done right now and then I’ll start to fix what I’ve created.
Most rebuilding my broken code For context last devlog I took the decision to start rewriting the code to stop accessing dom directly by using states. Now the pieces are mapped from pieces state rather than directly from fen so that I can move the pieces from state instead of manipulating the dom. To achieve this I firstly created to convert the fen to pieces array. The pieces array looks something like this rn. [ {id: 'r-a8', pieceNotation: 'r', square: 'a8', coordOfFile: 0, coordOfRank: 0}, {id: 'r-e8', pieceNotation: 'r', square: 'e8', coordOfFile: 4, coordOfRank: 0} ] From this I learnt that setting the key attribute serves it’s own purpose in react. I don’t fully understand it rn but I’ll look into it. Now, the id of the piece serves as the key for the piece element and if I’ve understood correctly that will be vital in animating the piece moving. Yay the rook has been reestablished using react state without any dom manipulation. The reestablishment wasn’t too difficult as I thought due to the already existing code. All the changes now happen in the pieces state which then causes the react to repaint the pieces. Now the rook can move from one square to another and capture opponent’s pieces. Also I’ve made the reset squares function as it removes the destination squares, caputure squares, etc . Although there’s no animation during piece movement rn I’ll it add later. After making the rook work I stared making all other pieces work as they used to before. I thought I had to write most of the code to fix all the pieces but after finishing the rook other fix other pieces wasn’t that bad. I reused the code from the rook where I could, fixed some bugs and errors on the way and modified the code where necessary. Sometimes I got stuck due to my own stupidity but that’s nothing new 😆. The moveOpponentPiece function is rebuilt. Now the first opponent move will happen when the board is first loaded. While fixing this function I found out that I was able to select the opponent’s piece as well. This shouldn’t be the case cuz I had already put railguards for preventing this. After fixing the moveOpponentPiece function I checked why this was happenning and the cause was I put railguards only if user click on another piece when a piece was already selected and that code was also wrong. I fixed them both and now they work as expected. Another bug found. When I clicked on the first pawn it only created one destination square instead of two. This was happening because the for loop had only 7 iterations instead of 8 which added the starting pawn squares to the array. Also the user’s pawn were able to capture the user’s pieces which was a big nono so I quickly fixed that. Even thought the moveOpponentPiece is working for the first move it instantly breaks from the second move. I still fully don’t understand why this is happening. I know it has something to do with using setState and it not being synchronous. The code looks like this let updatedPieces = pieces.map((piece) => { if (piece.square === position) { return { ...piece, square: destination }; } return piece; }); setPieces((prev) => { console.log("updated", updatedPieces);// I don't understand how this value return updatedPieces; // and this are have different values}); I’ve fixed it while writing this devlog removing updatedPieces variable and mapping the value directly inside setPieces(). Now, the second move works but the third move is broken 😭 . I’ll look into this tomorrow. I’ll wrap this up for today. Also I’m changing my devlog style a little bit. I’m not telling you all the problems I ran into like I did before to keep the devlogs a little short.
I am stuck Ayy the opponent moves work as expected now. In last devlog I wasn’t able to capture opponent’s page because I accidentally didn’t filter the pieces, only moved the piece. Now the capturing system also works as normal. While talking about capturing pieces now the opponent can also capture pieces. If any of the player’s piece is on the destination of opponent’s piece then it will be captured. The main lesson learned here is to mostly use the previous data while changing the state’s value to avoid unnecessary bugs. I’ve made the reset board function work. This was the point where I decided to rebuilt the code by removing the use dom manipulation and looking back I think it was a great decision by me. (Context: 2, 3 devlogs ago I found out my code was really trash while creating the reset board function). While writing reset board function I did run into some weird bugs. The board is reset by reconverting the fen to pieces array. The first opponent move happens when the opponentMoveIndex is 0 now. In the reset function the opponentMoveIndex is set to zero. I’ll add a animation to indicate that the user’s move is incorrect later. For now I added the animation for the piece moving. I’ve learned that when moving the pieces by updating the state in react, the key of the element is what matters for animation to occur. If the key of the element is same and just the transform style has changed react knows that it’s the same piece that jumped from one place to another. Also now, the move transition doesn’t happen when the pieces are being place. Because the pieces are placed using the transfrom property, the same property used to move the piece. I took me a while to fix this. It seems that this was happening because the squareWidth was making the page re render. I’ve fixed it but I still I don’t completely understand it, which shows that I’ve a long way to go. This one is small but crucial. Now the user cannot select the opponent’s piece during opponent’s turn. I’ve added a 500 ms delay for opponent’s move so that it doesn’t feel things are happening really fast. In that timeframe user is not able to select any pieces now. I am now stuck at the part where I am trying to animate the pieces after checking the user input. Whether it’s correct or incorrect. I wanted to make the background green if the move was correct and red if it move user made was incorrect. Using states is proving to be tricky for me as they’re fully synchronous. My brain goes okay this will happen and that will happen but the code won’t have the updated data because of useState nature. Also I tried to change the background color same way I move the pieces. Now that I think I about it I just wasted time. I will try to do animations with gsap now but idk how to explain I can’t really think of a way to do it with these useStates. Okay this was more that enough yap for 2hr 30 mins of work. Let’s see if I figure out a way tomorrow. If you’re reading this love you man 💖.
Making good progress The piece background color now changes color depending upon the correct or incorrect move that the user makes. Last time I was trying to achieve this by just using useState hook. I’ve understood now that it was the wrong approach instead now gsap handles the animation part. The main issue with gsap I was having was I didn’t know how to select the exact piece for animation. I’ve achieved this by using useRef hook named pieceRefs containing an object will all the pieces on the board with their ids as key. I haven’t never used a ref like this before and it feels scary to write code in the unknown territory but ig it’s a part learning. Also I’ve removed the code that changed the backgroundColor using useState and used gsap. It was just waste of my time to try to use useState hook to change the backgroundColor . So now, piece toggling the highlighted bg color when a piece is selected or unselected will be handled through gsap. Ahhhhhhh.. Finally after a puzzle is completed successfully the the next puzzle will start. My brain feels like it’s melting after making this work. I struggled so much to make the work mainly due to react batching the state updates. Unexpected bugs came while coding this. So, basically a puzzle is considered finished if the moveOpponentPiece function has no moves left. Then, we change the fen state and also reset the board so that the pieces are placed again. After that when player reaches next level the opponent first move needs to take place. For that I have a useEffect hook to check if opponentMoveIndex and userMoveIndex value are default values. The values are set to default through resetBoard function and if the values are the default ones then the opponent pieces moves. One of the main issues I had with this was the moveOpponentPiece function was running twice. Due to which one of the opponent move was being skipped. I wasn’t able to locate why and was making so many unnecessary changes and console logging everywhere to fix this 😭 . The issue was that the useEffect that I talked about earlier had pieces in the dependency array making the moveOpponentPiece function to run twice. I’m really exhausted after doing this… Then after some relaxation I made a rough figma design for the puzzles sidebar. It was kinda relaxing to not worry about coding for a while. I had big plans for the sidebar like making candy crush type levels but I don’t think I’ve time for that so just basic buttons will have to do. I’ve tried creating the distuinguishing the levels based on completed levels, current level and locked levels. Back to coding again, I mostly copied the vision sidebar code for puzzles sidebar as the only difference is in the sidebar body. It seems that I’ve forgetten to use css grids. I wanted the buttons layout to be responsive. I took a quick revisit on how grids. Throwed random properties at the grid hoping it will work as I expected 😆. At last it was the auto-fill property I was looking for with a combination of minmax. I’ve tried created the css for completed, current and locked now I just have to hook them up to the buttons according to puzzle level reached by player. I’ll do that tomorrow, now I’ll stop writing. If you’re reading this, I hope your project is going well💖.
Learnt something valuable ✨ Okay now the puzzle buttons have dynamic ui. The puzzle button will have ui according to the puzzle level. I was confused on how to achieive because there were three condition instead of two. If there were only two coniditions then it would have be easy as I would have simply used ternary operator. I couldn’t use if condition inside jsx. After some time I figured that if could call a function and use if conditions inside the function and return the className. Also now the puzzle level is stored and fetched from the backend. After doing that a toast error popped up as you can see below. I didn’t know why this was showing up when the page is first loaded up but instead of fixing that I first moved on to make the start puzzle button work. I think my main problem is I get distracted easily. To make the start puzzles button work firstly I created puzzle context file . I was deciding to make the chesboard context the puzzlecontext as all the data needed for puzzles page was there but I think it’s better to seperate those things. So, I placed the puzzle context higher than chessboard context with that thought process. If the puzzle hasn’t started the fen value is set to default starting position. Then I again got distracted and thought why isn’t the vision context also above the chessboard context. So, I moved the vision context and the coordinates broke. The reason was color state so then I created different color states for vision and puzzle context. While writing this I don’t actually know what I’m really doing. I do one thing and jump onto another making writing the devlog very hard. I think I can do better… 🙁 After learning the lesson, doing thing one at a time. I only focused on making the start button work. So I moved some values inside puzzles context for this to work and everything broke. But, I wasn’t feeling overwhelmed as my focus on only one thing. Slowly but surely I fixed the pieces moving, capturing and the first opponent move. I think my main issue is dealing with useState hook updating in batches. Ig I will just get better with time. Still the backgroundColor animation is broken which I need to fix. Also while doing this I found out why the toast error was occurring. Silly me didn’t add method post to update the puzzle level. Now after the puzzle finishes the puzzle levels value updates and the updated value persists. I should definitely do things one at a time. Getting distracted and doing multiple things will just make me feeling overwhelmed and will make it harder for me to devlog as well.
Two steps forward, Four steps backwards 😭 Firstly, I’ve fixed the gsap animations not working. This happened because last time I renamed all the color state into chessboardColor. Due to this the gsap backgroundColor css property turned into backgroundchessboardColor. Ig the lesson here is think before using change all occurences feature in vscode. The sidebar now changes. If puzzle hasn’t started then it’s the same old ui. If the puzzle starts the level btns disappear along with start puzzle button. If user makes incorrect move the sidebar show retry puzzle button and if the puzzle is completed successfully then next puzzle button shows up. One thing I learned here is making one button use different className, onClick handler and text easily by storing all data in object. The retry and completed onClick function looks empty. So, I decided to work on the retry puzzle button functionality. To make the functionality work I imported the resetBoard function from chessboard context. Calling the function directly didn’t work because setState function doesn’t apparently update if the value is same. I fixed that by passing {retryLevel: true} or false to the function. After doing this the first opponent move did break and I did fix it but I think with bad code. Looking at the code now I’ve been calling resetting the board and setting default position using the chessboardColor seems wrong. So, then I started cleaning the code. I guess I was correct and things needed to change. I would say these are mostly small changes and don’t need explanation but it seems that the chessboardColor had an actually bug and it took my soul away trying to fix that 😭 . So, the opponent move was capturing it’s own piece meaning that the piece which moved at the beginning would automatically disappear. This was happening because the moveOpponentPiece function ran before the chessboardColor could change when the puzzle is first started. To fix this I had used useEffect hook with chessboardColor in the dependency array to reset the board. But only works if I have the black pieces. If I have the white pieces the chessboardColor doesn’t update because useState doesn’t update when the value is same. The value is white at first because of the default position set when puzzle hasn’t started. I don’t even know how to explain the fix i used. I just chained state updates from file to file to have colorUpdated state value updated in chessboard context.jsx. Basically I had a rough time fixing the resetBoard function running before chessboard color was updated. This time even pen and paper also couldn’t help me solve this 😭 😭 but it did help me to understand the problem on a deeper level. I tried adding next puzzle button functionality. “I tried” 😭 cuz I couldn’t get it to work and on top of that when I tested the retry button it didn’t work. Don’t know how but the retry button also broke. Now, I’m taking a huge decision again. I think some of the problems can be reduced if the chessboard wasn’t a single component that works on both puzzle page and vision page. I think I was too ambitious but now seeing these issues I think it’s better for me to have to separate chessboard components. This might not be the best practice, but this will probably make my life easier. I just read the “Devlogs that get noticed” in the resources page and I think I should make my devlogs a little shorter. I said this in one of my previous blocks as well, but it seems that I am explaining too much. So let’s see what will happen tomorrow. Okay bieeee….
Ayy good progress today I created a separate chessboard component for puzzles page only. Before both puzzles page and vision page were using the same chessboard component making the code complex, hard to read and hard to debug. Firstly I decided to move all the chessboard functions and states into puzzle context but later changed my mind midway. I decided the chessboard functions and states make more sense to be in it’s own folder. Everything broke while doing as expected but I fixed them one by one. Now the puzzles chessboard is functional and it’s code looks a little less overwhelming to me. Now the vision page also needed a separate a chessboard. It wasn’t as easy as just copying and pasting most of the code into vision chessboard because the data was connected to more components of the sidebar such as progress timer, color Menu, etc. I don’t if I should separate the functions to components that they server of just dump it all into the vision context file. What I did was keep functions into their respective folders cuz I think the vision context file looks really cluttered doing that. Everything broke here as well but as before I fixed things one by one. Now I really believe it will be much easier for me to work on chessboards as they’ve been seperated. Also I deleted the original chessboard component and chessboard context after that. On clicking the sidebar button the reset board function is called and the function came from chessboard context. As there is no chessboard context now you can see that there’s a problem here. The reset board function in now in PuzzlesChessboard.jsx which means we can’t access it from PuzzlesSidebarBody.jsx. To solve this I just made the board reset everytime when hasPuzzleStarted is true. We do have the access to hasPuzzleStarted from puzzle context. Fixing that somehow broke the piece transition though. After that I mostly worked on the small things. Such as fixing no transition during piece, fixing the progress timer staring with 2 seconds less than the time set, adding chessboard size to puzzles chessboard in a better way, etc… Now the next puzzle and retry puzzle buttons also work. The next puzzle button works as expected. The retry puzzle button also works but the pieces move to their repective place with animation when the board resets which I don’t wan’t. To prevent this specific thing I have already written some code before and it’s working when starting the puzzle, moving to next puzzle, rendering the default pieces on first load. I can’t figure out why it’s specifically working for retrying a puzzle. I spend a good amount of time looking but idk. I’ll look into this tomorrow. I think the devlogs are still pretty long. I’ll try to keep the devlogs shorter on future devlogs. Okay bie…
Finally, I present to you a short devlog 😆 I have fixed the issue of pieces moving with transition when pieces are being placed after clicking on retry puzzle. To prevent this I already written code which worked perfectly but when only on retry puzzle it wasn’t working. This solution was simple but figuring out the issue took time. To fix the issue I used a useState hook to set hasPiecesPlaced to true only after pieces state updated. Also, I’ve already written code for handling page change in the middle of vision practice. I think this doesn’t work after I removed Chessboard.jsx and ChessboardContext.jsx. Not sure when this broke . I found better way to do this using the useEffect hook cleanup function. I learned that when adding setState directly in cleanup function it throws at recurring error 😭 . I felt my laptop heating up 😭 😭 . But there’s no error when adding setState inside the function and then running the function in the cleanup function. That’s all for today. Couldn’t do as much as would like today cuz a rat bit me 😭. Bye…
Interesting updates I added back button in puzzles sidebar with functionality. Before there was not way to go to the default sidebar (the notStarted state). Now after messing up or completing a puzzle there’s a back button which sets the board to default postion and set sidebarMode to “notStarted”. I wanted both buttons to be taking up equal space but later thought the smaller back button is better. Also now, puzzleLevel updates instantly updates after solving a puzzle instead of updating only after clicking next puzzle button. User can now select and play any completed puzzle by clicking level btns in sidebar. Previously user can only start the puzzle Level user has reached which meant no puzzle 1 and 2 resolving puzzle after user has reached level 3. I split the puzzleLevel state into selectedLevel and highestReachedLevel. The puzzle is set to the selectedLevel and the buttons aren’t clickable above the highestReachedLevel. The ui of level buttons is changed. I made the buttons smaller and made the selected level more distinct by adding a inner glow to the button. We’ve upto 30 levels now . I downloaded the lichess puzzles database for this project but whenever I opened the file my laptop will just heat as there were more than 69 millions data 💀 . I did try to use the lichess data but I didn’t actually like the progression of difficulty so I used chatgpt to make puzzles. I’ve played upto 21 levels and I think it’s good so far. That’s all for now, okay bie….
A little rest from programming I’ve added hint button in the puzzles sidebar. I had been trying to avoid working on this but I couldn’t avoid it forever. Also the puzzles sidebar looked really empty without the hint button. In chess.com the hint button highlights the correct. I did things a little differently, the hint is communicated via text to user. The text animates during first appearance and I’ve made it so that user gets only one hint. After the hint the button goes gray indicating it’s not clickable anymore. I made puzzles sidebar code better to display buttons and also added replay button with functionality on successful puzzle complete. I mainly made the code better cuz I need to add the replay button. The replay button is same as retry button for replaying the puzzle after completion. I made next button do nothing if user reaches the last level. Before when completing the last puzzle level we would reach the next level automatically which is prevented now. I’ve been sick for 2-3 days now and am just writing this devlog. Hopefully from tomorrow I will be working on the project more seriously.
I’m so sloppy now I’ve added sounds for piece movement, capturing piece and completed puzzle. I spent more time than I should’ve finding the sounds. I am still not sure about the sounds that I’ve added expect completed puzzle sound. There was issue with playing sounds during opponent move cuz unlike moving player’s piece where there are seperate function for moving and capturing pieces, the moving and capturing logic is inside the same function. After thinking a while I did solve the issue. It seems mac default recording doesn’t capture sounds so you just have to trust me here 😅. I’ve made hint button disabled when pieces are moving (Both player and opponent piece). I did this after figuring out if user click the hint button quickly after the last puzzle move then we get an error. Although this thing happening is very unlikely but it’s better to always fix bugs. Also I don’t know what happens if user clicks on hint inbetween moves so I think preventing it is better. A small change, I’ve added better hover transition to logout button. I didn’t add a red background during making it cuz I had issue with chaning the svg color. I’ve learned that if I make the svg inline in the jsx and set fill to currentColor then I can change the svg color through css and add transitions. Also, I’ve added popup animations to time menu and color menu. I was even struggling with this even though I’ve added those kind of animations before. I was using the new Activity element in react to toggle the menus but to for adding the animations I’ve removed the Activity element cuz the menu would disappear before animating. I took some break from coding cuz I got sick. I think I’m really sloppy now. Imo these changes shouldn’t have taken me 2hrs. Hope I will be able to shake off this sloppiness.
Wow! This is the 51th devlog I’ve added the player color indicator in the sidebar. It tells you which color you’re playing. Before coding this I just complicating things in my head by thinking of creating new unnecessary states. I used pen and paper to think and realized why not use the color state already available in chessboard. To access the state I moved it up to the puzzles context file where both sidebar and chessboard could get and change the color. I also moved the hint down as it look clutter both color and hint together in the sidebar. Two quick small fixes. I fixed retry and back button not working and fixed replay button not playing the same level only on last level. I’ve added pawn promotions functionality to the opponent’s pawns. In puzzle 17 and 26 there are promotions that happen but without the promotion part it just looks weird to look at. Especially in level 26 where the pawn promotes to a knight and without having that knowledge the user will just get confused. I haven’t added promotion functionality for the user pawns because there is no puzzle that requires it. I will add it if I have the time to but rn i am going to just ignore it. One of the bugs I faced while doing this was the knight promotion worked fine but the queen promotion at level 17 wasn’t. The pawn was just disappearing because the pawn was capturing itself cuz the promotion only work for black pieces which is now fixed. Next I fixed the random color option color menu not working. Idk when and how it broke I thought it was working fine but it seems not. It seems it was not working because the element was being unmounted before running the selectRandomColor function. So, I moved it to vision context and with a useEffect hook it runs every time hasStarted is true. A small change but which I feel great that it’s solved. When clicking on accordion or pieces twice sometimes it selects the icon and other things which was just annoying. The fix was just two lines of css which I learned from a random dude on the internet. Really thank that random dude. I’ve now added functionality for adding multiple bestScore for according to the time and color. Before the highest score in vision would be the score scored across any time or color. So if you were to score 5 point in 45 seconds and score 5 points in 30 seconds they were treated as the same thing which imo opinion isn’t fair. To achieve this I used object inside a object unlike the single number representing the bestScore like before. The object looks like this. { white: { 15: 0, 30: 0, 45: 0, }, black: { 15: 0, 30: 0, 45: 0, } } I did have a very hard time figuring out how to update the state like this as I had to change the specific time score within the correct color. One thing I did learn from this is we can use square brackets for using a variable’s value as key while manipulating the useState object. I also encountered some errors while trying to implement this functionality. Now everything is working as expected.
Many small improvements 🙂 I’ve added transition to level btns and added icons and different ui to puzzle sidebar button. I am using an array inside objects to display all buttons. So to customize the buttons I manipulated the array.Some button have only text, some have both text and img and some have only img. Also the main button is wider and other buttons are gray in background color. For this I used the className like in tailwind to add the styling meaning the buttons which need gray color will have the className gray. The size of the buttons is differentiated using different values of flex grow. I think the buttons look way better now. I’ve added reset if user changes from puzzles page to other page. The is to avoid any unnecessary bugs and error. I had already done this in vision page now it was the turn of the puzzles page. I have been avoiding this for so long but finally I’ve done it. I added the videos for professional course (or should I say advance course). I changed the name to advance cuz professional is just the wrong word to use here. I also moved some videos from beginner to intermediate. Now that the courses are in place I can finally write what you’ll learn in the information section. I’ve added numbers such as 0 - 1000 representing what I mean by beginner. I’ve tried to match videos to the elo level. The data in courses section in the home page is also change from placeholder data. Looking back at the code they are really bad but I’ll leave it as it is not broken 😁. Now I think the project is coming to it’s final stages I do need to add things but after that ig all I need is to polish the website and make website responsive. I’ve also fixed progress bar animation happening everytime on reload. This was a small thing but it was bugging me so I decided to fix it. Fixing it was annoying as I had expected to fix this easily. After some trial and error I fixed it using a hasCompleted state which is set to true after finish lesson button is click. Only when the hasCompleted is true the animation occurs. Some other changes I did were fixing only displaying highest achieved medal in course page and adding background color transitions to buttons. Enought yapping. I don’t feel like coding and I think I should take some rest for the next two days. Hope the rest reset my feelings and returns me to my prime stardance days 😆.
The website is live guys I used vercel to deploy my mern stack project and it was rough . I first tried deploying the the frontend and the backend separately. After reading blogs and trying I ended up deploying the express backend but at that point I had learned that there’s vercel cli with which I don’t have to push commits everytime to find out errors in production. I can just use “vercel dev” command to create a production like environment but for development and testing out. I couldn’t figure out how to run frontend and backend seperately using vercel cli. I then tried deploying the whole repo. The issue with this was I couldn’t configure the website with folder structure like this chess-website ----frontend ----backend Maybe there’s a way to make this work (I couldn’t ), I chose the easier path which I’m kinda familiar with. In this approach there’s no frontend and backend directory. The backend is renamed to api which allows vercel to recognize that it’s the backend and all the contents of the frontend folder will be moved up to the root directory. Errors came as I changed the folder structure but fixed on after another. The backend wasn’t working which got me really confused. There were many issues in this approach as well but atlast the website is running and backend is working properly . The two days break I took from coding is over and i think I feel better. Here’s the link to the website: https://evochess.vercel.app/
Starting making the website responsive Before starting on making the website responsive I saw that when logging in or signing up there is some delay before redirection where people might click the login button several times thinking that it it’s working which is bad ux. In development there was almost no delay because I was using local mongodb. To let the user know that the button has been clicked successfully and to prevent multiple login/signup button clicks the buttons are disabled as soon as user clicks any button in login or signup page while turning the buttons color into gray. Now on to the reponsive ui part. I first tried making the navbar responsive but it didn’t look right in small screens. I was also trying to make the hero section responsive but without any design to follow. So realizing that I needed a design first I then hopped onto figma to design the navbar and hero section. I changed the ui of the navbar ig to make it easier to make it responsive but I don’t know if the navbar ui got better or worse. I know one thing and that is the navbar has got simpler. The design on the mobile is pretty simple imo but that’s the best I could do to make it look decent. I used flex property to make all the text align vertically in phones and decided to remove the image in phone screens. I’ve have currently hidden all sections below 1024px except the hero section to focus only on the hero section without other sections interference. I’ve mostly used hardcoded values to make hero section which I will change to clamp css propery for smoother hero section responsiveness. I have just eyeballed the sizes and paddings which is a bad idea but I’m just lazy to create figma design for every layouts. Now, I’ll make the hamburger menu working. Uhh, I hate making website responsive but it has to be done. If you’ve any suggestion feel free to leave it down in the comments.
More website responsive stuff Firstly, I removed the animations from home and courses section below 768px of screen size. I didn’t remove the hero section starting animation cuz it’s nice. I used gsap matchMedia to achieve this. While removing the animations a funny thing happened, the matchMedia wasn’t working and then I was reading this a gsap forum hoping to see where did I go wrong. I later found that I was doing things correctly but instead of looking at localhost I was looking at live website. Obviously the changes didn’t appear 🤦♂️ Then, I made the courses section kinda resposive. Firstly I went to figma to design the mobile version of courses section as I was mainly unsure of what to do with the thumbnail cards. I decided to turn them into carousel which imo was a great idea. First, I turned turned the main courses section text smaller and then started working on the carousel. The making of carousel was rough. Firstly I was reading stuff online on how the sliding thing works. I think I somewhat figured that out but what I couldn’t figure out is the aligning the cards perfectly. The issue was I was going for a style where the first and the last card aren’t centered alight while the rest of them are. The swiping snapped the cards into place and some parts of the left and right cards would also be visible. I couldn’t figure out how to make this and was about to making hamburger menu but coincidentally while scrolling the stardance home page I saw recommended projects section where it’s like a carousel without the snapping thing. It was way easier to achieve than what I was thinking so even though I didn’t make what I wanted the carousel isn’t bad. The overall the courses section felt responsive so I started working on the hamburger menu. Working on hamburger menu went pretty smoothly except for some things going wrong here and there. I first roughly designed the the menu in figma and then wrote the code.
Worked on hero and puzzles section (Responsiveness) The puzzles section was the easier that hero and courses section for making it responsive cuz puzzles section doesn’t contain any animations or any special thing. After several trials of adjusting the fonts and image I stopped after it looked quite decent. Before working on the visualization section I decided to polish the hero section first. My main goal with polishing the hero sectino was mainly using clamp() css function for smooth responsive text. Although the text are responsive using media queries in hero section, the text look kinda odd in some screens. After using clamp the website feels better that before. Also I changed the width of image with % values which does feel better. I also used clamp for some vertical padding as well cuz it was looking bad for devices with smaller vertical heights. I thought from 425px to 768px was tablet screen size but it seems the tablet screen size starts from 768px. So now upto 768px the website follows the mobile design. Now I’ll polishing courses section and puzzles sections just like the hero section. Wish me luck 😄. Bye I wanted to add more images but it seems 4 is the limit .
This was a rough one One a good note I’ve completed making the home page responsive (for now). After making the hero section more responsive last time I then proceeded with making the courses and puzzles page more responsive. I mainly used the clamp css funciton to make the course and puzzles section responsive. The courses section remained the same as I am quite happy wiht how it turn out but I didn’t like how the puzzles section was looking after testing the website out in my phone. It looked to small for a section so below 768px instead of the text and image being horizontally aligned it’s now vertically aligned. The clamp part was similar to the courses section. Finally after completing those two I started working on the visualization section. I was the hardest section to make responsive due to the absolute positioning of the moves. Firstly I only focused on bigger screens as I had no idea how it would look on smaller devices. The moves were positioned before by mapping an array with the move notation and the css of top and right/left with percent values. I tried to remove that and instead of mapping the elements I thought of manually placing them and giving the ids by which I could have greater control over the css. While trying that I couldn’t make it work as in smaller screen heights it still looked terrible. At this point I was losing hope. I was wasting time watching a anime series just so I could avoid working on this. I tried thinking out the solution but nothing came in mind. Later when I was messing around with css throught the developer tools on the browser I realized the I could change the height of the image container to change the positioning of the moves as the moves are postioned on the basis of the image container. Now below 1440px the height of image container is 90% and below 1024px it’s 80% and I have a max-height value set for safety. It’s not prefect but it’s much better and I’m relieved 😌 . The mobile design uses a image contaning the main image and all the moves as there’s no animation on mobile devices. I made the image in fimga and using clamps and % values I think it’s decently responsive. To make the pages responsive I am using the developer tool in browser to first figure out the min and max values and the putting that value into clamp calculator to generate values. I am constantly switching between vscode and browser for this and if you have a better way to do it please lemme know. Okay the devlog has turned very long so biee…
We’ve reached 200 hours It’s a big milestone that I’ve finally reached . I’ve made the whole course page responsive. This took me longer than I’ve expected. But before that I was getting 404 not found when visiting locations like /course directly but it was working normally when I was navbar to navigate. I’ve seen this issue before as well so I kinda knew that this was because of react SPA (Single Page Application) thing. To fix this I configured the vercel.json file and now it works as expected. So onto the course page. Firstly I made the accordions responsive on mobile screens using css clamp function. I removed the course info section for mobile devices. I didn’t touch the course card as they were a future problem for me to do. But the basic idea was the image with take up the whole width and the image and the text will be vertically aligned instead of the default horizontal alignment. Between 1024px and 768px one of the issues was the course info was looking crammed on the smaller side. so I reduced the padding and font-sizes with clamp css function so that it still looks good on the bigger screens. I also made the progress bar slimmer and badges smaller. Another issue were the course cards. One the bigger screens they looked find but on smaller screens the text were taking up more height than the image itself. I changed the value of thumbnail image from fixed value to %. Also I reduced the massive 1.75rem padding on the course card container for smaller screens. Also for all screens sizes below768px I made the banner slightly bigger vertically as the previous banner was looking very slim on mobile devices. I scraped the idea of making course cards vertically aligned and stayed with the horizontal alignment. I somehow managed the cards to look decent on smaller screens as well by using clamp(). The things I needed to do were similar but I guess it took me long as I was first checking the min and max values using browser dev tools and then putting that into clamp calculator and then pasting the value into vscode. Basically I had to constantly switch between things. In the end, I went to sleep but couldn’t fall asleep so I decided to complete the course page reponsiveness and do on last thing which was making the loading spinner responsive. Then, I peacefully went to bed .
Gosh I’m so dumb Last time I thought I had fixed 404 page issue when visiting paths like course directly. I did fix it for local development but not for production which is really dumb, shouldn’t the development environment be the same as deployment when using vercel cli. I tweaked the vercel.json to fix the issue in production now but now in the development the website didn’t work. The fix that I’m now using is leaving the production as it is and in devlopment using the environment created by vercel cli only as backend and running the frontend seperately using pnpm run dev. To connect both backend and frontend I configured the vite.config.js to redirect every /api request to localhost:3000(this is running throught vercel cli) Most of the time was spent on making the signup page responsive. The login page is also now responsive but it’s just a copy paste of signup page css. I am quite dissapointed in myself because it took me so long to do this and still I don’t like how it looks on certain screens. As I realized that I was spending too much time on making signup page responsive I panicked and just rushed the process. As a result a have a reponsive signup and login page that I’m not very proud of. I fixed the signup not working. While signing up there it showed user already exist error everytime. The fix was quite simple, I had missed await keyword when checking for user with same email in database. Due to which the userExists variable was always true. Then I did something really dumb. I tried to fix something that was already working. I was worried that if I delete a user from database and then if that user tries to login then it would throw an error so without even checking if that was true I started making changes to the protectRoute.js file. I was thinking after the token is verified then I’ll just check if the user exists or not. In the process I deleted one important line of code because of which I wasn’t able to login now and I didn’t know why. I tried made the code as before not knowing the line is still missing so the error still persisted. After giving up and doing ctrl + z undo the previous code returned I finally realized the missing line of code. Also the feature was already there when fetching user data so none of this was necessary 🫠 .
Worked on the drag and drop feature Although it’s not fully complete and polished, it’s kinda working. I stopped working on the feature and started writing this devlog cuz It has been 3hrs I’m forgetting what I did while working on it. Firstly I wasn’t even going to implement this on the first place as I thought this was outside my coding capability but someone gave me a feedback that I should add this feature so I decided to give it a shot. I found out about the dnd-kit package for implementing drag and drop. I was skeptical of using it at first. I was reading their docs to figure out the package. My main concern was how would I implement the feature with the already existing click to move feature. They provide a useDraggable hook for making any element draggable. The useDraggable was used to make the piece draggable. I had to convert the piece code into a component for it to work. To drop something into another thing there’s useDropable hook which as the piece I made square, destSquares and captureSquares into components. If I were a good react dev I would’ve already did those things ig the using the package is some what helping my code to be cleaner. I used the useDroppable hook inside destinationSquares and captureSquares. I was concerned that we couldn’t actually drop the piece as it doesn’t live inside the square rather it lives on top of the board using position absolute. But, I had gotten dnd-kit wrong. I element does need go inside the element if useDroppable is used. There’s DragDropProvider that connects both draggable and droppable hook. Let’s just say DragDropProvider gave me all the function such as dragEnd and values needed to move the piece. Later I changed the useDroppable to be inside all squares cuz after dragging the piece there was some issues when dropping the piece in it’s original square if the user wanted to cancel the move. I didn’t really have to write new code for moving, capturing and resettingSquare as the code I wrote previously worked fine with the drag and drop functionality. There were many issues while trying to add this feature. Still there are issues I need to fix such as the highlighting the square bg color instead of the piece bg color when selecting piece and other bugs I’ve found. Also transition when opponent captures pieces doesn’t working also need to fix that. But, I’m really glad I tried to add this feature as I’ve learned alot and the puzzles board now feels more fun because of the feature. Thanks @PAPER_01 for suggesting the feature 💖 Okay, I’ll stop yapping. Have a good time
Omg how does changing the color model solve the issue Before that I fixed the black piece being upside down when dragging. You can see it in my last devlog’s video. I was only happening with black pieces because to make the board work when user got the black pieces I just rotated the board 180 degree. This made all the pieces upside down and to fix that I again rotated the piece’s img 180 degree. Ig when dragging using dnd-kit (npm package) the transform value was being overwritten causing this issue. To fix the issue rather the rotating with board using css I changed the order of files and ranks. I used flex-direction column replacing column-reverse for the rank to start from 1 to 8. Then for reversing the files when color is black then I mapped squares from reversed files array using toReversed array method. I thought by doing this I’ll make the code cleaner but I think it’s more messy now 😭 . Also I did have hard time understanding my own code when trying to solve the issue 😭 . I fixed the pieces, destSquares and captureSquares being generated on the wrong squares. I realized the piece transition wasn’t working when capturing piece both for user’s piece and opponent’s piece. The transition only happens if hasPlacedPieces is set to true and isDragging is false. So, my first assumption the hasPlacedPieces was being turned to false only when capturing pieces but I was wrong. I was checked if it had something to do with the value of isDragging. I found the isDragging was never turned false so I fixed it but still the main issue wasn’t resolved. I was console logging things and just trying to figure out what was actually causing the issue. The fix was really simple. To implement the drag and drop feature I’ve broken down piece code into it’s own component. There inside the component I have added the key attribute and it was the issue. The key attribute is supposed to be used on the component itself instead of inside the component div. (Eg.) I don’t know why it only broke the capture transition but anyways it’s fixed Now to the part where I don’t even understand how does this even happen. Hopefully you understood what I was saying in the video btw please unmute the video as I am talking in that video. So what happened was the piece img bg color changes when it’s selected. This was working fine until I added the dragging feature. When the piece is dragged you see the background color comes along with the piece. So I decided that the square should change it’s color rather than the img inside the piece. I was going to create squareRefs for holding all the values of sqaures and then select the square using gsap to change the color but I realized a easier way would be to just target the square id. It worked so I also decided to use for changing background color of square when user move was either correct or incorrect. On light squares it worked great and it also fixed the animation as the same animation was working a little weirdly when using pieceRefs. I was happy that it was better but then I found the bug from the video. I tried different things and just couldn’t figure out what was the issue but when I decided to change the color from var(–c-red) to yellow it worked as intended. Then I changed the same hsl color into hex and it also worked but I don’t know whyyyy. If someone knows why this happened please tell me cuz it’s ridiculous. Most of the issue had a simple solution but learning what caused the issue what the difficult part.
We’re close to the end First I fixed the buggy dropping piece. I fixed this when I first worked on drag and drop piece feature but I don’t know how it broke again. When trying different things to fix it I tried to move the setIsDragging(false) lower inside dragEnd function below movePiece and capturePiece function calls. Surprisingly it worked 😄. I fixed light square being dark and vise versa if user had the black pieces. I found out this issue because the coordinates colors were mismatched. So my first intuition was changing the color of coords.jsx. I got really confused as the changes did nothing in the browser. I am so dumb I was changing the vision page chessboard’s coords.jsx instead of puzzles page chessboard’s coords.jsx. It worked but then I realized the coordinates color weren’t wrong square colors were. I undid the changes made to coords.jsx. I also seperated the coords.jsx but adding puzzles and vision in the name. Then I fixed the squares color for black’s board. I’ve figured out the mobile design for puzzle section. First the idea was that the chessboard and sidebar would be stacked on top of each other. This was the easy route but if I did that then it would add friction to the mobile players as they would have to scroll all the way down to start the puzzles. Then I looked at chess.com and they were doing it really well where only after clicking start puzzle the chessboard will appear. So I removed the chessboard below 425px first and then made the button text, size and gap smaller. I also removed the aspect ratio of 1/1 from the buttons as the buttons were ruining the gaps between them in certain screen sizes. Now for the first challenge I faced. How do I only make the chessboard appear and disappear when clicking start puzzle only on mobile devices. As I used gsap matchMedia to make the chessboard’s container display none or block according to hasPuzzleStarted for mobile screens. The chessboardSize is calculated according to chessboard container so that the chessboard is divisible by 4. When first loading the chessboard if the container has display none then the chessboardSize becomes zero and when setting the container to block will only show empty chessboard container without a board. I tried using the autoAlpha property of gsap hoping that it will do that same job as display none but without remove the element. It was making the container invisible but the container would still retain it’s height and width. I was starting to doubt myself here and was thinking to take the easy route but just stacking the board and sidebar vertically. After thinking for a while I came up with a breakthrough I made the position of chessboard container to absolute and visibility to invisible. Now the chessboard container won’t be visible and won’t take up any space as it is absolute. When the board used absolute position idk why but the board container got so bigger. It also distorted the pieces when puzzle started. To fix it I ran the gsapMatchMedia code only after chessboardSize is calculated which was a great idea. It fixed the board when the puzzle started but when it was hidden it was still large. I just replaced the absolute and visibility with display: none as it only runs after the chessboardSize is calculated, that’s why there is no issue with display:none. Last change is when sidebarMode is notStarted then only chessboard is hidden. I know that 80% of the things I say won’t be understood but I’m not a good explainer so you have do deal with it 😅. Were really close to the end now I just have to make puzzles page and vision page responsive and just polish the website and then click the ship button
Made puzzles page responsive and bugs fixes Puzzles page responsive Most the time was spent making the puzzles page responsive. As always it took more time than expected. There were many issue that popped up and slowly but surely I fixed them. One of the issues was in bigger mobile screens the sidebar was being squished because the chessboard was getting really big but puzzles page has height of 100dvh as the chesboard in mobile phones is calculated according to width. To fix it I tried adding min-height to the sidebar for not getting squished and height of auto to puzzles page but this broke the sidebar when puzzles is not started cuz there’s no chessboard. The height of sidebar is 100% so due to the parent’s height being auto the sidebar height was about as didn’t fill the whole screen. To fix this I used overflow: scroll to puzzles page and it’s height to 100dvh. Another issue came when trying to make chessboard and sidebar look decent in different laptop sizes. I made it somehow work but using clamp, min-height, max-height, min-width and max width. It was kind of a pain to solve all the issues that came while doing this. That’s why I’ve rushed making the puzzles page responsive. My plan is to come and polish it after I’ve made the course page responsive as well. It shouldn’t be too difficult imo as it’s very similar to puzzles page. Fixed user being able to drag and drop opponent’s pieces It was a quite dumb bug. I had prevented this for click to move feature but I didn’t think about it in drag and drop. The fix was quite simple as dnd-kit (npm package) provides a disabled property in useDraggble. I disabled it for the pieces for dragging which had the opposite color of chessboard. Fix next puzzle button not working on second last level I didn’t actually know about this bug. A friend of mine told me about this issue while testing the website. After level 29 is completed a state is toggled to true which prevents the next button from not working. The next button is now only supposed to not work after completed the last level. I haven’t used fixed values for fixing this so in future if I decide to add or remove puzzles it shouldn’t break. The fix was a little more complex than I anticipated. 9 days of stardance remain now. So, I have to lock in now. Okay bie
Changed some puzzles and more responsiveness work Copied the puzzles page and it’s component’s media query css So after making puzzles page somewhat responsive last time, the first thing I decided to do after that was copying puzzles page media query css and just paste it in vision page as both of pages are very similar. This made the vision page and it’s components a little responsive. Puzzle changes I’ve changed the puzzle from level 12, 23 and 30. The 12 and 23 level had 2 ways to deliver checkmate and only one of them counted as correct. I changed them as user might get frustrated seeing that. My code doesn’t handle that so I just changed them. Level 30 was changed cuz it wasn’t really difficult. I don’t think I’m satisfied with the new level 30 puzzle either. One issue while polishing signup page I didn’t want the form to look squished on devices with small vertical screen size. Due to this last time I generally kept things smaller than what I wanted to make sure it looks okay for those devices. To fix that I added min-height to the form-container. It prevented the form from squishing but the form-container was overflowing as the puzzles page has 100dvh. What I wanted was just the form scrolling using overflow: scroll but this probably took me about 20-30 mins to make it work 😭 . I set overflow to scroll to form-container it didn’t work, added it to form which also didn’t work and then I added it to puzzles page. The scroll part was working when I added it on puzzles page but not what I was looking. Then I created a wrapper div to hold the img container and form container hoping now adding overflow:scroll to form container will do the job. After trying all things things I realized that the min-height was set to form container instead of form. The fix was to adding min-height to form and set overflow scroll to form-container. I removed the wrapper div after that as it was unnecessary and also hid the scrollbar that appears in form-container. Signup and login page polish after that annoying issue After that annoying issue I’d say things went pretty smoothly. I mainly used clamp as always for making things responsive. And as always it took me longer that expected. After polishing up the signup page I copied the code to login page and just changed signup to login. Vision page responsive on mobile devices Making the vision page responsive for mobile device was really similar as polishing signup page. I just used clamp for everything and made sure everything looked good. Now that I think about it i only made the sidebar responsive including the popup menu as only that is displayed on mobile devices and chessboard is hidden. The chessboard is also kinda responsive due to the copy pasting the puzzles page media query css. The making of sidebar responsive was just trying out different sizes and then putting the value into clamp calculator and copy pasting the value. Now, I’ll work on the vision page responsiveness for bigger devices and then if everything looks great after testing then I’ll ship the project
This devlog is a short one I’ve made the vision page responsive for larger screens. Last time I made the page responsive for mobile screens. I made some small changes in puzzles page while doing this for maintaining similar code . I ran into some issues such as css not working due to incorrect nesting and writing the writing the css on wrong file. Also, I removed media query for 1440px as the default css will work between 1024px and 1440px using clamp css functions and by doing that, above 1440px the css will stay the largest clamp value. I think I will do the same in puzzles page as well. 2hrs wen’t so quickly mainly cuz of my stupidity as I broke things that already was working fine. Also, I don’t think I like the mobile responsiveness that much but i don’t think i’ll change it now (or maybe I will). While writing this devlog I just realize that I’ve make the sidebar responsive after vision page has started. Uhhh i hate responsive design
Fixing things and some more responsive things I’ve fixed chessboard displaying multiple selected squares. This happened when user selected a piece and then selected another piece by dragging. The fix was really simple. I just added resetSquares function when piece on drag start. I’ve also fixed pieces stacking on top of each other if user drags and drops a piece on another piece quickly before the opponents move happens. This was prevented when pieces are moved only by clicking but I forgot to prevent this if pieces were dragged and dropped. I did two things to prevent this: I reduced the time for opponent piece to move after the first move. I disabled the piece from dragging if it wasn’t the player’s turn. It seems the first fix wasn’t sufficient as it created another bug. So, if user selected a piece by clicking or dragging and then dragged the same piece then the destination squares and captureSquare will just completely disappear. The occurred due to resetSquares function that I had added. I thought for a while and came up with this solution. The resetSquares function only executes if user selects another piece on drag. However the function won’t execute if the selected Piece is being dragged. The selected piece state null at first so resetSquares() won’t also execute if selected piece is null. Now, it works as expected until and unless I find some bugs. Now returning back to the responsiveness. I fixed the puzzles button to be equal width and height. I had made the level buttons responsive before but they weren’t the same size. I had tried the aspect ratio last time as well but it was breaking the layout. Basically I used aspect ratio, removed the grid templated rows and changed some clamp values. Also I removed the media query below 1440px and integrated it as default css. After doing that, I started to fix the attempts in in vision sidebar. I thought it would take me two seconds to do it as I just had to apply the puzzle button knowledge here. I thought just doing this will work grid-template-columns: repeat(auto-fit, minmax(40px, 1fr)); I was wrong 😭 This worked fine for level buttons cuz the number of buttons were static. Here the attempts squares increases as the user clicks on the chessboard. If there’s only one attempt square then it will take the whole width. I was stuck after this. I tried different things such as using max-width, trying to add width: fit-content, etc. but nothing worked. At last I thought of reverting back to what the code orginally was which just used flex and flex wrap but coming this far I just used grid and used different values with height to make the attemps square kinda responsive. I still need to use clamp or something to make this look good. Uhhhhhh this is so frustrating… . I think I’m overexplaining things. I should just simplify down things
THIS MIGHT BE THE LAST DEVLOG First I polished the puzzles sidebar. I made the sidebar width to be same as vision page sidebar. Then I changed the level button size as they were too small for larger screens. I also made the level button container scrollable if the level buttons overflow. This took the most time because the whole puzzles sidebar body was overflowing pushing down that start button. I just wanted the sidebar body to not overflow which would make the levels container to be scrollable. The fix at last was using min-height: 0 to the sidebar body. Idk how the min-height: 0 is helping here 😭 . Next I made the visualization section animation (The last section of the home page) to appear quicker. This was a recommendation from my brother as when scrolling previously the section might seem like it contained nothing until you scroll fully. I faced issued mainly with the section not pinning to the top of screen when trying to move the animation timeline starting point. Also I tried to placing text higher on y axis and animate it coming down with the user scroll which produce the result I was expecting. So, I split the timeline into two. The first one reveals the text and the second one shows a person visualizing. The tex revealing animation ends when the section top hits the top of the screen which makes the section pin to the top exactly how I wanted it to be. Then I polished vision page sidebar as follows: Made the sidebar responsive after user has clicked on start Made the sidebar header look better and fix mismatch of padding from body Returned to using flex for the attempts and mad them responsive Tweaked the options and info as they were looking odd in some screen sizes (mainly the tablet one which looked really bad) I then copied some of these changes to the puzzles sidebar for maintaining similarity. Lastly I capped the width of course, puzzles and vision page to 1600px by adding a wrapper element. It acted weird on puzzles and vision page sidebar as there was already a element named wrapper and so I changed the classname to page-wrapper.
Ships:
Let’s ship 🚢 This is a website where people can learn and improve their chess skills by watching courses, solving puzzles and practicing their vision. The website was overall really challenging to build. If I had do pick, it would definitely be making a working chessboard for puzzles. At the beginning of the project I didn’t even know if I was capable of building one but I am really glad I tried as I’ve learned so much. Another challenging thing would definitely be making the website responsive. I don’t like making website responsive and in this project animations added another layer of complexity. I’ve tried my best to keep things responsive though. I am really proud of completing the project and mainly working chessboard as this is my first time building something like this. I am also proud of the animations and the ui of the website. To test my website some knowledge of chess is preferred but even if you have zero knowledge about chess you can test out my project as there are courses which will teach you about chess. Thanks stardance for everything 💖💖. I probably would never have created or completed this project without stardance😄...
|
1792615697.091723
|
1792702097.091723
|
|
43673
|
Corez.io by @FireWarrior | Stardance
|
FireWarrior
|
0
|
225.45
|
0
|
[]
|
[{"post_id": 77450, "ts": "202 [{"post_id": 77450, "ts": "2026-10-07T01:57:53Z", "hours": 17.9803, "text": "Devlog 6 Play at: https://corez.io 6 days ago Corez went live on corez.games. Since then I moved it to corez.io , shipped a HUGE v2, and rebuilt a ton of the game based on what players told me. It’s honestly a different game now, so make sure to read it! NEW HOME: corez.io The game now lives at corez.io (old links still bring you here) Moved to faster US servers, so way less lag The homepage loads about twice as fast and you can hit Play right away There’s a whole live raid playing behind the menu now, tanks mining and breaking rocks ROCKS GOT A GLOW UP 6 rock biomes: Sandstone, Red Clay, Mossy Hollows, Crystal Caves, Magma Veins and Obsidian Deep Gems sit inside the rocks, and the deeper you go the tougher the rock and the better the loot Mining feels way better: rock dust flies into your tank as you shoot, ore pays gems while you chip it, and gems fly straight to you when it breaks Mining is faster for everyone, no Mining Power points needed to have fun HOW RAIDS WORK NOW Most points wins! Points = gems you bank + kills + crowns At the last storm the top 3 players get crowns. Hold one for bonus points, or knock it off someone to steal it and their points Whoever is in 1st gets a bounty on their head, so nobody can just coast to the win Kills and gems are worth more as the storm closes in Every storm starts as the full rock circle and slides to a random spot DYING DOESN’T WRECK YOU ANYMORE Banked gems are 100% safe, always You keep 30% of the gems you were carrying “Respawn as (your tank)” puts you right back in with the same tank and stats Same stats and Random build buttons, so no more spending 50 points every life Vault shield when you leave a vault after banking, and safer respawns away from whoever just killed you THE CORE FIGHTS BACK The Core now shoots bullets you can dodge and sends drones you can shoot down Land the final hit for a 20% chance at a random shop item you don’t own yet! TONS OF NEW STUFF 81 achievements, including secret ones Raid perks every 5000 points Every skin redone as clean patterns that keep your team colour Sidekicks now mine rocks with you Daily rewards that give gemdust for the shop, and a View All tab to preview every cosmetic New HP and shield bars, a cleaner HUD, better chat bubbles Team Banks: break the banner to own it Press B to bank everything DUOS Fixed joining alone, the “away” bug and getting stuck on connecting Crowns work in Duos now, and they count for your team COMING NEXT: 650+ NEW TANKS A brand new Splitter branch Tier 5 tanks you unlock by growing to 2x your size mid-raid Over 770 tanks in total, and bots use them too That’s a LOT, so thank you to everyone who played and gave feedback, it literally shaped this whole update. Which tank branch are you most excited for? Comment below!"}, {"post_id": 75762, "ts": "2026-10-01T00:45:19Z", "hours": 34.7972, "text": "GAME PUBLISHED!!!! PLAY AT htttps://corez.games I PUBLISHED THE GAME YAYAYAYAYAYAYAYAY So a huuuuuuuggggeeeee recap of the stuff I did - put short Added growth mode Setup oracle server Bought a domain from name.com Setup the game for mobile Made accounts Added shop, locker, profile Setup password/username reset flow Created a discord bot that has commands to monitor the game nad stuff Added quests Added contracts Buffed factory, buffed autospawner, buffed annhilator, nerfed constructor, buffed rammer class, nerfed barricade, buffed streamliner, buffed penta shot, buffed triplet, buffed nailgun, nerfed conqueror (etc look at discord) FIXED TWO HUNDRED AND NINETY EIGHT BUGS (Yes, THAT many bugs accross all the commits) Added a working raid timer Added a alive tab and made it work Added a save command to save score Made banked gems stay accross sessions Added new ability rock barrage which spawns 10 rocks and destroys thigsn in the way Made rocks grow back 1/2 the speed of before Made gem rain Made meteor shower Revamped tutorial entirely Added mini tutorial first join Added guest login, username login, and discord login Added rankings bronze, silver, gold, plat, diamond, emerald, and champion Added leaderboard Created 40 skins Created 40 namestyles Added duos Made a new chat for duos Added esc keybind to open chat ingame Added friends Added a feature to chat with friends Designed logo and updated game name to Corez.io instead of Digwars Sound disabled by default Added performance settings in settings Added invite codes to the game which gives gemdust Added game currency gemdust to use in skin/name shop Added feedback page Made a YT channel Made a tiktok Published to itch, gamejolt, iogames.space, and a few others Added a contributors page Added play + win streaks daily Added and updated changelog Revamped ui, upgrade bars, and skill stats bar Added new raid overrides Added kill logs Made abilities usable on mobile Added custom movable joysticks on mobile Added new ui to mobile Added new storm look Added raid winners Added way too much to type out in stardance, ill post some more next time!! Join the discord or give feedback via the feedback button on homepage"}, {"post_id": 72938, "ts": "2026-09-24T02:31:56Z", "hours": 4.0744, "text": "just fixing more bugs… ahhhhhhhhhhhhhhhh Fixed a socket disconnect bug when 2 players joined the game at the same time Added a new spawn shield when spawning and a circle to indicate it Fixed lag issues that caused players to have less than 10fps and more than 7000ms ping. Fixed an error in which chests could overlap with rocks Made the time you could stay on rocks 3x Thats about it folks, just a small devlog for today. Hope yall enjoyed, thanks for reading!"}, {"post_id": 72492, "ts": "2026-09-23T02:27:19Z", "hours": 11.6403, "text": "Hi guys! Hope yall are doing well. I really changed my game a lot. Please give me any feedback you guys have (it can even be just that its laggy or a feature sucks!) Changes: Added bosses (4) which each look different and have their own capabilities Added rock-themed loot chests in rare and epic tier which each gives you gems, with a powerup guaranteed in the epic chest. Added Shop!!! Biggest change! Added over 20 items across kits, gear, drills, and siderarms! Configured the storm to properly work and also changed a BUNCH of ui, like moving leaderboard into minimap section, adding kill logs, adding notifications, moving the skill stats bottom right, etc. Added a NEW SKILL STAT: Mining power! Putting some points into this makes you mine faster! Added RAID OVERRIDES: These are overrides for the current storm phase which includes 1.5x size, more damage, rocket speed, etc! Test it out and give your feedback! https://digwars.hackclub.app/"}, {"post_id": 69442, "ts": "2026-09-17T02:01:30Z", "hours": 34.4983, "text": "Devlog 5 Play at: https://digwars.hackclub.app/ I have done a COMPLETE revamp on this game! Its a LOT of stuff but sure is interesting so make sure to read it! NEW MODE: BATTLE ROYALE, (Main and only mode now) How it works : Unlike regular battle royale where the last person to survive wins, this will be a battle royale lasting 2 hours and players can spawn in the middle of the match (chose this as we dont have many players) It lasts for 2 hours, and the storm comes from the edgs and closes in leaving a little final gap for 1.5 minutes, then resets, and the process continues creating an infinite storm loop Players CANNOT join during these 1.5 minutes and must spectate Purpose is to get as many kills and points as you can, which can be contributed to the shop to earn powerups for the game or cosmetics, and will also rank you up (once we add persistence and database) UI Revamps : Completely new death screen based on your rank in which you died and more stuff! Merged leaderboard with minimap which no shows 4 tabs - minimap, leaderboard, kill logs, and people alive. Added a lot of stuff like timers, notifications, etc Game updates : With the battle royale mode I have added: Bases: These look like outposts and can be killed and claimed by players. Claiming this acts like a zone of invulnerabity you can go to if you are attacked or low health. You have a ring on you with the color of the base signifying that you own it. You get kicked out 10 seconds after coming in. Also contains a vault inside to bank the gems Vaults: These are new vaults which rotate between rainbow colors. Any player can cash out their gems but only one player at a time per vault and they get kicked out after depositing Bug fixes : Heavily optimized so that the ping is as low as possible and the ping is now fully dependent on your location (server is in EU) Fixed a few bugs that caused the server to crash and some other stuff. Storm : The storm is a purple fog that closes in on players. A player in storm loses 10 health every second and dies with no health. For now it has a basic purple translucent look, will improve it. Theres SO much more but stardance is limiting me and Im also getting tired (waa) so see yall next time! Lmk what you guys think!"}, {"post_id": 60583, "ts": "2026-09-03T01:09:15Z", "hours": 7.6297, "text": "Devlog 4 Play it at: digwars.hackclub.app Changes: Added a hella sick background with moving tanks! (Image attached) Fixed 3-4 crucial bugs and made the game run way faster Fixed problems with bots being too conservative and not attacking afk players and such Im sorry that this devlog is hella short, I fractured my ring finger so I cant type much :( I really hope that this game succeeds and becomes at least a little popular (io-game popular); Ive spent way too much time for this and built too many projects to just quit this."}, {"post_id": 59288, "ts": "2026-09-01T00:12:56Z", "hours": 6.3742, "text": "Devlog 3 Play at digwars.hackclub.app! Added: Satchels Made game more compact instead of such a big map Planned out for shop Satchels: Satchels are kind of like backpacks behind players that show how much gems a player is holding so people with more gems has a more high risk play. I also fixed a BUNCH of bugs and got the game to run at around 75fps (which is an improvement from 50-60fps)"}, {"post_id": 51355, "ts": "2026-08-20T23:39:31Z", "hours": 18.2817, "text": "Devlog #2 Hi guys! Not sure why Im logging so many hours at a time, but regardless this is a another devlog for my gamer. Play it at www.digwars.hackclub.app ! Anyways, Ive done a LOT of stuff since my last devlog. 1. SFX All sfx were created by me using bfxr.net and exported as WAV files and imported into my game. I currently have 16 total sfx! List: Shooting SFX - Basic pew sound for shooting Drone Spawn - A little modern/motorised whirring type sound, lasts very short duration Rock Hit - Something that sounds like a rock being chipped except more 2d/gamified Rock Break - A light explosion/destroyal sound when a rock is destroyed Ore Break - Similar to rock break except a little more high pitched for a rock break which has gem(s) inside it Gem Pickup - A coin collecting type sound or a nice ding for a currency collecting type sound Satchel Full - A warning type sound that only sounds for like 1.5 seconds to notify the user to bank their gems Deposit Tick - A repeated tick sound that plays when depositing gems Deposit Done - A celebration or “yay” kinda sfx when the gems have all been deposited. Bank Celebration - Another nice ding except more intense as an achievement Combat Hit - A adrenaline rushing boop collision noise Combat Hurt - A health lowering typa sfx Combat Kill - Another adrenaline rushing exciting noise (srry cant describe lol) Death On Screen - Similar to combat kill, less intense Button UI Click - Just ur normal mouse click sound Rammer Movement - A whirring sound that is calm and low Also added sound options, as in screenshot 1. 2. Bots Not much to say here I added bots which move very much like human players and play like them, they were heavily tested, and improvised by analyzing where they got stuck, what they were missing, etc. Total of 40 bots for now due to the massive arena size. Initially added chat mechanics for the bots using deepseek api but that didnt go well. 3. Improved tutorial + New UI I did a complete overhaul on the UI and made it look pretty much new (though I have to improve it more it still looks slightly bad) Also made a WAYYY better tutorial! Its really awesome, gives u a nice small sandbox like arena just to learn every single one of the game mechanics. It uses a tiny part of the cpu and ram from the overall nest server. Thanks for reading this! Check out my game if yall want to as well; Cya next time!"}, {"post_id": 41718, "ts": "2026-08-06T03:08:25Z", "hours": 0.5606, "text": "Sub-Devlog #2 Not really a devlog, but just wanted to post a link for you guys to try out my game, will obviously make more devlogs on updating the game until I publish it officially. https://digwars.hackclub.app/#dw **Domain is based in europe, so it will lag in non-europe region, but its interpolated so other than input delay there shouldnt be any other problems."}, {"post_id": 41068, "ts": "2026-08-05T00:55:52Z", "hours": 89.6175, "text": "Hi guys! 👋 Test out my game here: https://digwars.hackclub.app/#dw (based in europe) I still have to roll out around 10 features and other bug fixes, so its obviously just a demo url, not the final game! This is my first devlog for my game, I’m sorry if it’s too long, I had to encompass around 90 hours of coding into one devlog. This is a comprehensive summary of my game and all of the functions of it. 🪨 What is Dig Wars? Dig Wars is a 2 team tank battle game where the whole map is a giant rock that never stops growing back :D You mine through it to collect gems, carry them back to your base vault to bank them, and fight the other team for control of the tunnels. 🌋 The Living Wall Every rock cell has health, and destroyed cells grow back after ~35 seconds over ~7 seconds, physically expanding and pushing tanks out of the way. Trapped between two growing rocks? You get crushed :D Tunnels heal from the walls inward, so active tunnels stay open while abandoned ones seal up. The side with more holes regrows faster, keeping the front line drifting back to center. ⛏️ Mining Every tank class has its own mining rate. Snipers and destroyers are excellent miners, drone classes are great escorts, drum classes barely scratch the rock. There’s a per player mining budget too, so you can’t spray clear a wall with an octo. Focused digging is fast. And the deeper you go, the harder the rock gets. 💎 Ore and Gems ~15% of rock cells contain ore. Four tiers: Copper - surface, ~40 gems Azurite - mid depth, ~90 gems Core Shards - deep, 400+ gems, glows through rock Emeralds - only 3 in the wall at once, server wide announcement when mined Breaking ore spawns gems exactly where the crystals are drawn. I had to keep four mirrored Voronoi implementations bit identical. Nightmare but it works :D 🎒 The Satchel Gems ride on your tank as a growing money bag others can see. You’re a target, an escort mission, and a gambling problem all at once. Cap of 4000 with a pulsing “Gem limit reached, please bank it!” warning Heavy gems slow you up to ~20% Die and you drop 60% of what you carried. Painful. :D 🏦 Banking The vault pad has a full UI: Carried, Already banked, and an input box for banking a custom ammount of gems. Deposits at 300 gems/sec, damage interrupts, so those last seconds are tense. A team war bar compares blue vs red banked totals with a live frontier notch. ⚡ The Rifts 2 Canyons, one towards the top and one towards the bottom going all the way from left to right, acting as tunnels for people too lazy to mine, which naturally makes it a hub for fighting. 🚩 Forward Outposts Hold a banner beacon for 30 seconds to capture a pocket in the wall. Gives forward respawn, field banking at 80%, and a no regrow radius. Enemies can shoot the beacon, and the wall always grows over it. 🗺️ World Map Fortnite style vector minimap and full screen map showing terrain, craters, bases, outposts, and the Rift. 🔊 Audio Fully procedural sound engine using the Web Audio API, no audio files. Rock cracks pitch up near death, breaking rock crunches, gems chime. Distance attenuation and stereo panning included. 🧠 The Tech The TerrainGrid tracks every rock cell’s health, alive state, ore tier, and deposits. Regrowth tracks death time, generation counters for re rolling ore, growth progress, and crush mechanics. Growing rocks have scaled collision so a 20% grown rock doesn’t block bullets. Trapping someone during regrowth is a strategy :D 🚀 What’s Next Core chambers and heists (crack a sealed chamber, erupts a gem fountain), a shop with drill tiers and consumables, bounties, war effort, and events. Plus a real playtest pass :D Thanks for reading all the way through! If you have questions or ideas, comment below or msg me on discord ( fire_warriorx ). Cya next time!"}]...
|
Title: Corez.io by @FireWarrior | Stardance
Devlo Title: Corez.io by @FireWarrior | Stardance
Devlogs:
Hi guys! 👋 Test out my game here: https://digwars.hackclub.app/#dw (based in europe) I still have to roll out around 10 features and other bug fixes, so its obviously just a demo url, not the final game! This is my first devlog for my game, I’m sorry if it’s too long, I had to encompass around 90 hours of coding into one devlog. This is a comprehensive summary of my game and all of the functions of it. 🪨 What is Dig Wars? Dig Wars is a 2 team tank battle game where the whole map is a giant rock that never stops growing back :D You mine through it to collect gems, carry them back to your base vault to bank them, and fight the other team for control of the tunnels. 🌋 The Living Wall Every rock cell has health, and destroyed cells grow back after ~35 seconds over ~7 seconds, physically expanding and pushing tanks out of the way. Trapped between two growing rocks? You get crushed :D Tunnels heal from the walls inward, so active tunnels stay open while abandoned ones seal up. The side with more holes regrows faster, keeping the front line drifting back to center. ⛏️ Mining Every tank class has its own mining rate. Snipers and destroyers are excellent miners, drone classes are great escorts, drum classes barely scratch the rock. There’s a per player mining budget too, so you can’t spray clear a wall with an octo. Focused digging is fast. And the deeper you go, the harder the rock gets. 💎 Ore and Gems ~15% of rock cells contain ore. Four tiers: Copper - surface, ~40 gems Azurite - mid depth, ~90 gems Core Shards - deep, 400+ gems, glows through rock Emeralds - only 3 in the wall at once, server wide announcement when mined Breaking ore spawns gems exactly where the crystals are drawn. I had to keep four mirrored Voronoi implementations bit identical. Nightmare but it works :D 🎒 The Satchel Gems ride on your tank as a growing money bag others can see. You’re a target, an escort mission, and a gambling problem all at once. Cap of 4000 with a pulsing “Gem limit reached, please bank it!” warning Heavy gems slow you up to ~20% Die and you drop 60% of what you carried. Painful. :D 🏦 Banking The vault pad has a full UI: Carried, Already banked, and an input box for banking a custom ammount of gems. Deposits at 300 gems/sec, damage interrupts, so those last seconds are tense. A team war bar compares blue vs red banked totals with a live frontier notch. ⚡ The Rifts 2 Canyons, one towards the top and one towards the bottom going all the way from left to right, acting as tunnels for people too lazy to mine, which naturally makes it a hub for fighting. 🚩 Forward Outposts Hold a banner beacon for 30 seconds to capture a pocket in the wall. Gives forward respawn, field banking at 80%, and a no regrow radius. Enemies can shoot the beacon, and the wall always grows over it. 🗺️ World Map Fortnite style vector minimap and full screen map showing terrain, craters, bases, outposts, and the Rift. 🔊 Audio Fully procedural sound engine using the Web Audio API, no audio files. Rock cracks pitch up near death, breaking rock crunches, gems chime. Distance attenuation and stereo panning included. 🧠 The Tech The TerrainGrid tracks every rock cell’s health, alive state, ore tier, and deposits. Regrowth tracks death time, generation counters for re rolling ore, growth progress, and crush mechanics. Growing rocks have scaled collision so a 20% grown rock doesn’t block bullets. Trapping someone during regrowth is a strategy :D 🚀 What’s Next Core chambers and heists (crack a sealed chamber, erupts a gem fountain), a shop with drill tiers and consumables, bounties, war effort, and events. Plus a real playtest pass :D Thanks for reading all the way through! If you have questions or ideas, comment below or msg me on discord ( fire_warriorx ). Cya next time!
Sub-Devlog #2 Not really a devlog, but just wanted to post a link for you guys to try out my game, will obviously make more devlogs on updating the game until I publish it officially. https://digwars.hackclub.app/#dw **Domain is based in europe, so it will lag in non-europe region, but its interpolated so other than input delay there shouldnt be any other problems.
Devlog #2 Hi guys! Not sure why Im logging so many hours at a time, but regardless this is a another devlog for my gamer. Play it at www.digwars.hackclub.app ! Anyways, Ive done a LOT of stuff since my last devlog. 1. SFX All sfx were created by me using bfxr.net and exported as WAV files and imported into my game. I currently have 16 total sfx! List: Shooting SFX - Basic pew sound for shooting Drone Spawn - A little modern/motorised whirring type sound, lasts very short duration Rock Hit - Something that sounds like a rock being chipped except more 2d/gamified Rock Break - A light explosion/destroyal sound when a rock is destroyed Ore Break - Similar to rock break except a little more high pitched for a rock break which has gem(s) inside it Gem Pickup - A coin collecting type sound or a nice ding for a currency collecting type sound Satchel Full - A warning type sound that only sounds for like 1.5 seconds to notify the user to bank their gems Deposit Tick - A repeated tick sound that plays when depositing gems Deposit Done - A celebration or “yay” kinda sfx when the gems have all been deposited. Bank Celebration - Another nice ding except more intense as an achievement Combat Hit - A adrenaline rushing boop collision noise Combat Hurt - A health lowering typa sfx Combat Kill - Another adrenaline rushing exciting noise (srry cant describe lol) Death On Screen - Similar to combat kill, less intense Button UI Click - Just ur normal mouse click sound Rammer Movement - A whirring sound that is calm and low Also added sound options, as in screenshot 1. 2. Bots Not much to say here I added bots which move very much like human players and play like them, they were heavily tested, and improvised by analyzing where they got stuck, what they were missing, etc. Total of 40 bots for now due to the massive arena size. Initially added chat mechanics for the bots using deepseek api but that didnt go well. 3. Improved tutorial + New UI I did a complete overhaul on the UI and made it look pretty much new (though I have to improve it more it still looks slightly bad) Also made a WAYYY better tutorial! Its really awesome, gives u a nice small sandbox like arena just to learn every single one of the game mechanics. It uses a tiny part of the cpu and ram from the overall nest server. Thanks for reading this! Check out my game if yall want to as well; Cya next time!
Devlog 3 Play at digwars.hackclub.app! Added: Satchels Made game more compact instead of such a big map Planned out for shop Satchels: Satchels are kind of like backpacks behind players that show how much gems a player is holding so people with more gems has a more high risk play. I also fixed a BUNCH of bugs and got the game to run at around 75fps (which is an improvement from 50-60fps)
Devlog 4 Play it at: digwars.hackclub.app Changes: Added a hella sick background with moving tanks! (Image attached) Fixed 3-4 crucial bugs and made the game run way faster Fixed problems with bots being too conservative and not attacking afk players and such Im sorry that this devlog is hella short, I fractured my ring finger so I cant type much :( I really hope that this game succeeds and becomes at least a little popular (io-game popular); Ive spent way too much time for this and built too many projects to just quit this.
Devlog 5 Play at: https://digwars.hackclub.app/ I have done a COMPLETE revamp on this game! Its a LOT of stuff but sure is interesting so make sure to read it! NEW MODE: BATTLE ROYALE, (Main and only mode now) How it works : Unlike regular battle royale where the last person to survive wins, this will be a battle royale lasting 2 hours and players can spawn in the middle of the match (chose this as we dont have many players) It lasts for 2 hours, and the storm comes from the edgs and closes in leaving a little final gap for 1.5 minutes, then resets, and the process continues creating an infinite storm loop Players CANNOT join during these 1.5 minutes and must spectate Purpose is to get as many kills and points as you can, which can be contributed to the shop to earn powerups for the game or cosmetics, and will also rank you up (once we add persistence and database) UI Revamps : Completely new death screen based on your rank in which you died and more stuff! Merged leaderboard with minimap which no shows 4 tabs - minimap, leaderboard, kill logs, and people alive. Added a lot of stuff like timers, notifications, etc Game updates : With the battle royale mode I have added: Bases: These look like outposts and can be killed and claimed by players. Claiming this acts like a zone of invulnerabity you can go to if you are attacked or low health. You have a ring on you with the color of the base signifying that you own it. You get kicked out 10 seconds after coming in. Also contains a vault inside to bank the gems Vaults: These are new vaults which rotate between rainbow colors. Any player can cash out their gems but only one player at a time per vault and they get kicked out after depositing Bug fixes : Heavily optimized so that the ping is as low as possible and the ping is now fully dependent on your location (server is in EU) Fixed a few bugs that caused the server to crash and some other stuff. Storm : The storm is a purple fog that closes in on players. A player in storm loses 10 health every second and dies with no health. For now it has a basic purple translucent look, will improve it. Theres SO much more but stardance is limiting me and Im also getting tired (waa) so see yall next time! Lmk what you guys think!
Hi guys! Hope yall are doing well. I really changed my game a lot. Please give me any feedback you guys have (it can even be just that its laggy or a feature sucks!) Changes: Added bosses (4) which each look different and have their own capabilities Added rock-themed loot chests in rare and epic tier which each gives you gems, with a powerup guaranteed in the epic chest. Added Shop!!! Biggest change! Added over 20 items across kits, gear, drills, and siderarms! Configured the storm to properly work and also changed a BUNCH of ui, like moving leaderboard into minimap section, adding kill logs, adding notifications, moving the skill stats bottom right, etc. Added a NEW SKILL STAT: Mining power! Putting some points into this makes you mine faster! Added RAID OVERRIDES: These are overrides for the current storm phase which includes 1.5x size, more damage, rocket speed, etc! Test it out and give your feedback! https://digwars.hackclub.app/
just fixing more bugs… ahhhhhhhhhhhhhhhh Fixed a socket disconnect bug when 2 players joined the game at the same time Added a new spawn shield when spawning and a circle to indicate it Fixed lag issues that caused players to have less than 10fps and more than 7000ms ping. Fixed an error in which chests could overlap with rocks Made the time you could stay on rocks 3x Thats about it folks, just a small devlog for today. Hope yall enjoyed, thanks for reading!
GAME PUBLISHED!!!! PLAY AT htttps://corez.games I PUBLISHED THE GAME YAYAYAYAYAYAYAYAY So a huuuuuuuggggeeeee recap of the stuff I did - put short Added growth mode Setup oracle server Bought a domain from name.com Setup the game for mobile Made accounts Added shop, locker, profile Setup password/username reset flow Created a discord bot that has commands to monitor the game nad stuff Added quests Added contracts Buffed factory, buffed autospawner, buffed annhilator, nerfed constructor, buffed rammer class, nerfed barricade, buffed streamliner, buffed penta shot, buffed triplet, buffed nailgun, nerfed conqueror (etc look at discord) FIXED TWO HUNDRED AND NINETY EIGHT BUGS (Yes, THAT many bugs accross all the commits) Added a working raid timer Added a alive tab and made it work Added a save command to save score Made banked gems stay accross sessions Added new ability rock barrage which spawns 10 rocks and destroys thigsn in the way Made rocks grow back 1/2 the speed of before Made gem rain Made meteor shower Revamped tutorial entirely Added mini tutorial first join Added guest login, username login, and discord login Added rankings bronze, silver, gold, plat, diamond, emerald, and champion Added leaderboard Created 40 skins Created 40 namestyles Added duos Made a new chat for duos Added esc keybind to open chat ingame Added friends Added a feature to chat with friends Designed logo and updated game name to Corez.io instead of Digwars Sound disabled by default Added performance settings in settings Added invite codes to the game which gives gemdust Added game currency gemdust to use in skin/name shop Added feedback page Made a YT channel Made a tiktok Published to itch, gamejolt, iogames.space, and a few others Added a contributors page Added play + win streaks daily Added and updated changelog Revamped ui, upgrade bars, and skill stats bar Added new raid overrides Added kill logs Made abilities usable on mobile Added custom movable joysticks on mobile Added new ui to mobile Added new storm look Added raid winners Added way too much to type out in stardance, ill post some more next time!! Join the discord or give feedback via the feedback button on homepage
Devlog 6 Play at: https://corez.io 6 days ago Corez went live on corez.games. Since then I moved it to corez.io , shipped a HUGE v2, and rebuilt a ton of the game based on what players told me. It’s honestly a different game now, so make sure to read it! NEW HOME: corez.io The game now lives at corez.io (old links still bring you here) Moved to faster US servers, so way less lag The homepage loads about twice as fast and you can hit Play right away There’s a whole live raid playing behind the menu now, tanks mining and breaking rocks ROCKS GOT A GLOW UP 6 rock biomes: Sandstone, Red Clay, Mossy Hollows, Crystal Caves, Magma Veins and Obsidian Deep Gems sit inside the rocks, and the deeper you go the tougher the rock and the better the loot Mining feels way better: rock dust flies into your tank as you shoot, ore pays gems while you chip it, and gems fly straight to you when it breaks Mining is faster for everyone, no Mining Power points needed to have fun HOW RAIDS WORK NOW Most points wins! Points = gems you bank + kills + crowns At the last storm the top 3 players get crowns. Hold one for bonus points, or knock it off someone to steal it and their points Whoever is in 1st gets a bounty on their head, so nobody can just coast to the win Kills and gems are worth more as the storm closes in Every storm starts as the full rock circle and slides to a random spot DYING DOESN’T WRECK YOU ANYMORE Banked gems are 100% safe, always You keep 30% of the gems you were carrying “Respawn as (your tank)” puts you right back in with the same tank and stats Same stats and Random build buttons, so no more spending 50 points every life Vault shield when you leave a vault after banking, and safer respawns away from whoever just killed you THE CORE FIGHTS BACK The Core now shoots bullets you can dodge and sends drones you can shoot down Land the final hit for a 20% chance at a random shop item you don’t own yet! TONS OF NEW STUFF 81 achievements, including secret ones Raid perks every 5000 points Every skin redone as clean patterns that keep your team colour Sidekicks now mine rocks with you Daily rewards that give gemdust for the shop, and a View All tab to preview every cosmetic New HP and shield bars, a cleaner HUD, better chat bubbles Team Banks: break the banner to own it Press B to bank everything DUOS Fixed joining alone, the “away” bug and getting stuck on connecting Crowns work in Duos now, and they count for your team COMING NEXT: 650+ NEW TANKS A brand new Splitter branch Tier 5 tanks you unlock by growing to 2x your size mid-raid Over 770 tanks in total, and bots use them too That’s a LOT, so thank you to everyone who played and gave feedback, it literally shaped this whole update. Which tank branch are you most excited for? Comment below!...
|
1792554916.7447872
|
1793159716.7447872
|
|
58573
|
spacecrew by @jakub-ginal | Stardance
|
jakub-ginal
|
1
|
227.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-15T10:03:07Z", "hours": 227.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "spacecrew - mission control for your terminal What I made: I got tired of opening five browser tabs to follow space, so I built one command that brings them all together. spacecrew tells you who’s in orbit this second, tells you when the ISS is about to cross your sky, counts down the next liftoff with a rocket photo beside it, displays NASA’s Picture of the Day in terminal characters, and tracks solar activity with a verdict on whether you’ll see auroras tonight. What was challenging: At one point, every satellite prediction was perfectly calculated, but for the mirror image of Earth. A single flipped sign in the orbital math put passes on the wrong side of the planet, and nothing looked obviously broken until I cross-checked each pass against an independent physics library, minute by minute, until reality matched. The other fight was time itself: switching an app built around UTC to local time without breaking a single countdown. What I’m proud of: The app now distrusts the internet by default. Dead APIs, rate limits, airplane mode: it keeps working from cached data and built-in satellite TLEs whenever possible. It also includes real orbital calculations, satellite tracking, radio frequencies, and a full interactive terminal interface, all installable with a single command. Features: People in Space, NASA APOD, Launches, ISS Tracking, Space Weather, Satellite Passes, Themes, Dashboard The GitHub README includes a detailed breakdown of the features, modes, configuration options, and command-line flags, along with screenshots and examples. Try it yourself: Install with either command: pipx install spacecrew or pip install spacecrew", "repo": "https://github.com/jakub-ginal/spacecrew", "demo": "https://pypi.org/project/spacecrew/"}]...
|
[{"post_id": 79650, "ts": "202 [{"post_id": 79650, "ts": "2026-10-14T21:49:05Z", "hours": 0.5514, "text": "spacecrew - quick terminal tour Quick tour of spacecrew in action: interactive menu, people in space, live ISS position, Tonight’s Best satellite passes, a launch countdown with the rocket photo view and more. Video is now available on the GitHub project page."}, {"post_id": 79610, "ts": "2026-10-14T18:19:01Z", "hours": 2.1667, "text": "v1.2.18 and v1.2.19 - Documentation and run fixes **Tzdata dependency ** - added the Windows-only tzdata dependency so timezones resolve correctly instead of falling back to UTC Dashboard navigation - fixed Enter-to-exit on Windows using msvcrt , while keeping existing POSIX behavior unchanged Module execution - python -m spacecrew now works via the new __main__.py Version detection - falls back to pyproject.toml in development checkouts to avoid reporting stale versions Docs - completely rewrote the README with feature sections and screenshots Published - v1.2.19 is now available on GitHub and PyPI"}, {"post_id": 79498, "ts": "2026-10-14T09:55:01Z", "hours": 10.1031, "text": "v1.2.17 - Timezones, rocket photos, and satellite pass fixes Local timezones - added --timezone flag, saved timezone settings, and automatic detection. Times display locally (e.g. 20:00 CEST), with UTC in parentheses in detail views UTC consistency - countdowns and --json output remain in UTC Rocket photos - press p in launch details to view a large, high-resolution rocket photo with minimal accompanying info Satellite pass accuracy - fixed a rotation sign error that caused incorrect predictions, verified against an independent reference to within ±1 minute Low-elevation passes - fixed filtering that silently dropped visible passes Settings persistence - fixed settings that sometimes failed to save Clean JSON output - status banners no longer pollute --json output Published - v1.2.17 is now available on GitHub and PyPI"}, {"post_id": 79399, "ts": "2026-10-13T20:13:28Z", "hours": 10.2, "text": "v1.2.16 - Fixes and configuration improvements Cache control - fixed --no-cache , which was parsed but previously ignored Custom configuration - added --config DIR , SPACE_CREW_CONFIG_DIR , and XDG_CONFIG_HOME support for isolated configs NASA API errors - added clearer DEMO_KEY rate-limit hints with an API link, plus 5xx and offline guidance in the APOD view SatNOGS cache - fixed cache typing to support both dictionaries and lists Offline weather - fixed offline responses to return the complete expected data structure Code cleanup - removed a duplicate docstring Documentation - updated the man page to v1.2.16 and synced README examples for --json and --config Published - v1.2.16 is now available on GitHub and PyPI"}, {"post_id": 79178, "ts": "2026-10-12T22:22:37Z", "hours": 8.0389, "text": "v1.2.15 - Scriptability, radio, and aurora JSON output - added --json support for passes, people, and launches, with machine-readable data for scripts, jq , cron jobs, and home automation Pass data - JSON includes satellite name, group, start/end times, max elevation, duration, magnitude, quality, cloud cover, moon phase, and visibility Downlink frequencies - new FREQUENCIES panel with SatNOGS transmitter data, including frequency, mode, uplink, baud rate, and description Offline frequency cache - transmitter data cached for 90 days and available offline Aurora forecast - dashboard and space weather view now show whether aurora is Overhead possible, Low on horizon possible, or Unlikely based on Kp and your location Reliable satellite data - 396-satellite offline TLE fallback across all 13 groups, with stale-cache failover when Celestrak is unavailable Faster fetching - shorter timeouts and improved data loading Published - v1.2.15 is now available on GitHub and PyPI"}, {"post_id": 79019, "ts": "2026-10-12T11:47:58Z", "hours": 10.3897, "text": "v1.2.14 - Live dashboard, countdowns, satellite info, and fetch improvements Live dashboard - updates every second, with background data refreshes every 60 seconds and Enter-only exit Countdowns everywhere - shows time until passes, red NOW for active passes, and dim ENDED for finished passes Pass filtering - ended passes are filtered out so lists start with the next upcoming pass Satellite info panel - displays NORAD ID, launch date, operator, country, and status from cached SatNOGS data Reliable data fetching - fast failover to stale cache and 396-satellite built-in fallback Parallel fetching - satellite groups load in parallel for better performance Cache protection - empty results never overwrite valid cached data Dashboard accuracy - Tiangong no longer displays ISS data Published - v1.2.14 is now available on GitHub and PyPI"}, {"post_id": 78781, "ts": "2026-10-11T16:18:02Z", "hours": 9.7994, "text": "v1.2.13 - Satellite data, dashboard, performance and documentation Offline satellite data - 396 real satellites across all 13 groups Satellite groups - fixed dead GROUP=other and empty iridium groups Dashboard fixes - q quits, Tiangong displays correct data, and unused imports removed Lazy-loaded images - Pillow and chafa no longer required at startup, with a new --no-image flag Performance improvements - optimized observer calculations and parallel group fetching Cache fixes - empty results no longer overwrite cached satellite data Documentation - updated README with all modes, configuration, and flags Man page - fixed documentation and removed duplicate man directory Published - v1.2.13 is now available on GitHub and PyPI"}, {"post_id": 78657, "ts": "2026-10-11T06:07:37Z", "hours": 11.6944, "text": "v1.2.12 - Bug fixes and packaging improvements Core stability - fixed argument parsing and replaced recursive refresh loops with proper loops Astronaut view - fixed crashes when photos are missing Moon phases - all 8 phases now work correctly, with proper UTC timestamps Satellite passes - fixed filter persistence, empty lists, group tags, and missing URLs ISS tracking - improved retries, offline handling, and location accuracy Dashboard - fixed storm level detection, now shows actual conditions Cache and display - improved corrupted cache handling and screen clearing APOD and space weather - fixed API key handling, date requests, and image loading with fallbacks Packaging - wheel now includes the man page and fallback TLE data Published - v1.2.12 is now available on GitHub and PyPI"}, {"post_id": 78399, "ts": "2026-10-10T17:20:02Z", "hours": 10.4, "text": "v1.2.10, v1.2.11 - Satellite tracker improvements Fallback TLE data - 24 satellites across 6 groups, available when network sources fail Detail view fixes Full-width panels - expanded panels for improved layout Faster TLE fetching Published - v1.2.11 is now available on GitHub and PyPI"}, {"post_id": 78156, "ts": "2026-10-09T20:18:48Z", "hours": 9.8033, "text": "v1.2.9 - Satellite detail view & themes Satellite detail redesign - new panel and table layout matching the launches and people views Header panel - satellite name, group badge, and FAV indicator Next Pass panel - highlighted summary with time, elevation, direction, duration, magnitude, quality, cloud cover, and moon phase Full passes table - date, time, max elevation, direction, duration, magnitude, quality, cloud cover, moon phase, and visibility Visibility indicators - green rows for visible passes and dimmed rows for non-visible passes Refined styling - subtle borders and softer colors for a cleaner look 10 themes - added Dracula Published - v1.2.9 is now available on GitHub and PyPI"}, {"post_id": 77945, "ts": "2026-10-08T22:00:46Z", "hours": 6.5667, "text": "v1.2.8 - Satellite Passes visual improvements Panel-based layout - each satellite now has a bordered card with its number, name, group badge, and [FAV] indicator Multiple passes - up to 3 passes per satellite, configurable Quality-tier borders - Best, Good, OK, and Dim tiers with matching colors Clean pass data - time, elevation, compass direction, duration, magnitude, and quality score Visibility details - cloud cover, moon phase, and VISIBLE status shown for each pass Satellite groups - fixed categorization: ISS & Stations, Starlink, Navigation, Science & Weather, Other Favorites integration - [FAV] badge, favorites-only mode with 5 , and F to toggle favorites Detail view navigation - Enter returns to the previous list instead of the main menu Published - v1.2.8 is now available on GitHub and PyPI"}, {"post_id": 77840, "ts": "2026-10-08T14:16:42Z", "hours": 9.7667, "text": "v1.2.6 - Satellite groups, navigation & visual improvements Satellite groups - proper categorization: ISS & Stations, Starlink, Navigation, Science & Weather, Other Detail view navigation - Enter now returns to the previous list instead of the main menu Cloud cover - displayed as ☁︎ XX% Azimuth - compass direction added, e.g. 45°NE → 135°SE Moon phase - displayed as Moon XX% Code cleanup Published - v1.2.5 is now available on GitHub and PyPI"}, {"post_id": 77668, "ts": "2026-10-07T19:40:00Z", "hours": 10.5333, "text": "v1.2.6 - Favorites satellites Favorites - add or remove satellites from the detail view with F Favorites mode - press 5 in the satellite passes menu to show only favorited satellites Favorites badge - ★ FAV badge shown in satellite detail view Persistent favorites - saved in ~/.config/spacecrew/config.toml Published - v1.2.5 is now available on GitHub and PyPI"}, {"post_id": 77374, "ts": "2026-10-06T18:11:40Z", "hours": 9.9, "text": "v1.2.5 - Satellite tracker fixes & polish Tonight’s Best fixed - no longer loads 10k+ Starlink satellites, only ISS + Stations Tiered quality system - Best (mag < 2, el > 45°, dur > 5 min), Good (mag < 4, el > 25°), OK (mag < 5.5, el > 15°) Filter menu - fixed duplicate code Calculating passes… - removed duplicate message Man page - added man spacecrew Shell completions - added bash, zsh, and fish support via spacecrew --generate-completion GitHub Release - added automatic release creation on tag push Published - v1.2.5 is now available on GitHub and PyPI"}, {"post_id": 77171, "ts": "2026-10-05T22:04:11Z", "hours": 5.9333, "text": "v1.2.3 - Pass Predictor fixes and UX improvements Tonight’s Best no longer loads 10k+ Starlink satellites Tiered quality system - Best, Good, OK instead of one strict filter Filter menu duplicate code fixed Calculating passes… duplicate message removed Night filtering fixed with sun_el_max v1.2.3 on GitHub and PyPI."}, {"post_id": 77035, "ts": "2026-10-05T13:12:07Z", "hours": 10.0, "text": "v1.2.3 - Satellite tracker redesign Pass Predictor redesign - Tonight’s Best, All Passes, Specific Satellite Cloud cover from Open-Meteo, cached for 1 hour Moon phase via local Meeus algorithm, fully offline Night pass info - cloud cover and moon phase when relevant Satellite groups reorganized for easier browsing Direct satellite search across all groups Type badges added to satellite details Simplified controls - Enter = back everywhere"}, {"post_id": 76893, "ts": "2026-10-04T23:29:10Z", "hours": 9.3603, "text": "v1.2.3 - Cloud cover and moon phase now appear alongside every predicted pass in the satellite tracker. Cloud cover - Real-time data from Open-Meteo. Shows percentage at exact pass time and location. Cached 1 hour. Moon phase - Local Meeus algorithm, zero API calls. Only shown for night passes (sun elevation < -6°). Displays phase name + illumination: MOON FIRST QUARTER 44%. v1.2.3 on GitHub and PyPI."}, {"post_id": 76707, "ts": "2026-10-04T11:48:44Z", "hours": 10.5, "text": "spacecrew v1.2.1 Dashboard mode (option 8) - 2-column btop-like grid: ISS/Tiangong/Passes left, Weather/People/Launches/APOD right; renders via Rich Layout grid 9 themes: default, Catppuccin Mocha/Latte, Tokyo Night, Gruvbox, Nord, Everforest, Rose Pine, Kanagawa - semantic styles, zero hardcoded colors, persist in config.toml v1.2.1 on GitHub and PyPI"}, {"post_id": 76537, "ts": "2026-10-03T21:14:34Z", "hours": 10.4872, "text": "v1.1.18 - Themes, progress bars, consistent Enter=back 5 themes: default, dark, solarized, dracula, monokai Progress bars: spinner for single fetch, count bar for multi-group TLE Enter = back everywhere for consistent navigation Replaced hardcoded colors with semantic theme styles Theme selection persists in config.toml v1.1.18 on GitHub and PyPI."}, {"post_id": 76264, "ts": "2026-10-02T23:41:38Z", "hours": 10.5508, "text": "v1.1.16-17 - Pass quality scores and real magnitudes: Quality (0-100) - elevation, duration, darkness, magnitude, rarity combined Real mags - per-type standards (ISS -1.3, Starlink 5.5, GPS 4.0) with range + phase correction Phase angle math - proper Sun-sat-observer geometry for realistic brightness UI shows both - mag -2.6 Q80 on every pass in list and detail views All groups covered - stations, Starlink, military, NOAA, GOES, GPS, Galileo, BeiDou, Iridium Offline–irst - cached TLE, zero network needed The predictor now tells you which passes are worth waking up for. v1.1.17 on GitHub and PyPI."}, {"post_id": 76099, "ts": "2026-10-02T10:05:54Z", "hours": 8.0419, "text": "spacecrew v1.1.15 - Satellite Pass Predictor update. Fixed TLE cache: each group (stations, starlink, military, gps, weather, science, amateur, radar, cubesat, geo, iridium). Menu: full menu (all/tonight/stations/starlink quick/days config), tonight’s best (quick 24h), specific satellite picker with group selector, search, pagination, 7-day detail, change location, back. 11 groups, 11,500+ satellites. Works offline (cached TLEs, 1-day TTL). v1.1.15 on GitHub and PyPI."}, {"post_id": 75904, "ts": "2026-10-01T15:35:24Z", "hours": 11.1056, "text": "spacecrew v1.1.14 - Satellite Pass Predictor. Menu option 6 / spacecrew –mode passes. Celestrak TLE data + local sgp4 propagation, no API keys, no rate limits, works offline after first run. Tracks ISS, Starlink trains, and many more satellites. Calculates visible passes for the next three days: elevation >10°, sky dark, satellite sunlit. Shows start time, max elevation, duration, direction, visibility flag. Location saved to config, prompted once. Example: ISS 05:53 UTC max 53° 6min west→east ✓, Starlink-1017 11:21 UTC max 80° 7min ✓. v1.1.14 on GitHub and PyPI."}, {"post_id": 75680, "ts": "2026-09-30T18:50:20Z", "hours": 10.3292, "text": "Today I released spacecrew v1.1.10, v1.1.11, and v1.1.12. v1.1.10 - Added –offline flag: runs entirely from local SQLite cache with zero network requests. Avoids rate limits, works without internet. All four modes work if previously cached. Banner shows “Offline mode: using cached data only”. v1.1.11 - Launch countdown timer: live T- in launches list (cyan to yellow to red as launch nears, LAUNCHED for past). Space Weather dashboard (menu option 5, –mode weather): solar flares (X/M/C colored), CMEs with speed, Kp index with storm level (Quiet to G5), NOAA 3-day forecast highlights. All cached (1-day TTL), works offline. v1.1.12 - Fixed few things. Published to GitHub (tags v1.1.10, v1.1.11, v1.1.12) and PyPI via automated workflow."}, {"post_id": 75385, "ts": "2026-09-29T22:02:03Z", "hours": 5.7128, "text": "Today I released spacecrew v1.1.9. The main addition is an ISS Tracker using wheretheiss.at (real-time TLE calculation) as primary source with open-notify.org fallback - shows latitude, longitude, altitude (~425 km), velocity (~27,500 km/h), visibility, and location name via reverse geocoding, plus a Google Maps link. Core improvements: persistent SQLite cache with configurable TTL (30 days default) for all API responses, a config file at ~/.config/spacecrew/config.toml (NASA API key, cache TTL, theme, default mode), CLI arguments for direct mode access (–mode {people,apod,launches,iss}), –clear-cache, –no-cache, Windows-compatible screen clearing, and Python 3.10 support via conditional tomli dependency. Published to GitHub (tag v1.1.9) and PyPI via the automated workflow."}, {"post_id": 74899, "ts": "2026-09-28T15:39:13Z", "hours": 10.4289, "text": "Today I worked on spacecrew and enhanced the project with major improvements. I enhanced NASA’s Astronomy Picture of the Day (APOD) with date navigation (previous day), HD image opening in browser, and full metadata display. I also added a new Upcoming Launches feature using The Space Devs API, showing 15 upcoming launches from all agencies with a clean panel-based list view and detailed view including links to launch transmissions when available, mission patch, and info/Wikipedia links. I restructured the CLI with a main menu for three modes (People in Space, APOD, Launches), added NASA_API_KEY environment variable support with DEMO_KEY fallback, and implemented in-memory session caching for both features. Published v1.1.8 to GitHub and PyPI."}, {"post_id": 74542, "ts": "2026-09-27T16:30:32Z", "hours": 4.5878, "text": "Today I worked on spacecrew and made several improvements to the project. I added NASA’s Astronomy Picture of the Day (APOD), so users can now view the current astronomical picture directly from the CLI. I also tested the feature, updated the project documentation, and published the updated version to GitHub and PyPI. I also worked on improving the overall project and making the CLI easier to use."}, {"post_id": 74031, "ts": "2026-09-26T15:43:20Z", "hours": 0.2561, "text": "Im working on spacecrew, a linux command line tool for managing and organizing space-related information directly from the terminal. Im improving the CLI, adding features, fixing bugs, and making the project easier to use."}]...
|
Title: spacecrew by @jakub-ginal | Stardance
Devl Title: spacecrew by @jakub-ginal | Stardance
Devlogs:
Im working on spacecrew, a linux command line tool for managing and organizing space-related information directly from the terminal. Im improving the CLI, adding features, fixing bugs, and making the project easier to use.
Today I worked on spacecrew and made several improvements to the project. I added NASA’s Astronomy Picture of the Day (APOD), so users can now view the current astronomical picture directly from the CLI. I also tested the feature, updated the project documentation, and published the updated version to GitHub and PyPI. I also worked on improving the overall project and making the CLI easier to use.
Today I worked on spacecrew and enhanced the project with major improvements. I enhanced NASA’s Astronomy Picture of the Day (APOD) with date navigation (previous day), HD image opening in browser, and full metadata display. I also added a new Upcoming Launches feature using The Space Devs API, showing 15 upcoming launches from all agencies with a clean panel-based list view and detailed view including links to launch transmissions when available, mission patch, and info/Wikipedia links. I restructured the CLI with a main menu for three modes (People in Space, APOD, Launches), added NASA_API_KEY environment variable support with DEMO_KEY fallback, and implemented in-memory session caching for both features. Published v1.1.8 to GitHub and PyPI.
Today I released spacecrew v1.1.9. The main addition is an ISS Tracker using wheretheiss.at (real-time TLE calculation) as primary source with open-notify.org fallback - shows latitude, longitude, altitude (~425 km), velocity (~27,500 km/h), visibility, and location name via reverse geocoding, plus a Google Maps link. Core improvements: persistent SQLite cache with configurable TTL (30 days default) for all API responses, a config file at ~/.config/spacecrew/config.toml (NASA API key, cache TTL, theme, default mode), CLI arguments for direct mode access (–mode {people,apod,launches,iss}), –clear-cache, –no-cache, Windows-compatible screen clearing, and Python 3.10 support via conditional tomli dependency. Published to GitHub (tag v1.1.9) and PyPI via the automated workflow.
Today I released spacecrew v1.1.10, v1.1.11, and v1.1.12. v1.1.10 - Added –offline flag: runs entirely from local SQLite cache with zero network requests. Avoids rate limits, works without internet. All four modes work if previously cached. Banner shows “Offline mode: using cached data only”. v1.1.11 - Launch countdown timer: live T- in launches list (cyan to yellow to red as launch nears, LAUNCHED for past). Space Weather dashboard (menu option 5, –mode weather): solar flares (X/M/C colored), CMEs with speed, Kp index with storm level (Quiet to G5), NOAA 3-day forecast highlights. All cached (1-day TTL), works offline. v1.1.12 - Fixed few things. Published to GitHub (tags v1.1.10, v1.1.11, v1.1.12) and PyPI via automated workflow.
spacecrew v1.1.14 - Satellite Pass Predictor. Menu option 6 / spacecrew –mode passes. Celestrak TLE data + local sgp4 propagation, no API keys, no rate limits, works offline after first run. Tracks ISS, Starlink trains, and many more satellites. Calculates visible passes for the next three days: elevation >10°, sky dark, satellite sunlit. Shows start time, max elevation, duration, direction, visibility flag. Location saved to config, prompted once. Example: ISS 05:53 UTC max 53° 6min west→east ✓, Starlink-1017 11:21 UTC max 80° 7min ✓. v1.1.14 on GitHub and PyPI.
spacecrew v1.1.15 - Satellite Pass Predictor update. Fixed TLE cache: each group (stations, starlink, military, gps, weather, science, amateur, radar, cubesat, geo, iridium). Menu: full menu (all/tonight/stations/starlink quick/days config), tonight’s best (quick 24h), specific satellite picker with group selector, search, pagination, 7-day detail, change location, back. 11 groups, 11,500+ satellites. Works offline (cached TLEs, 1-day TTL). v1.1.15 on GitHub and PyPI.
v1.1.16-17 - Pass quality scores and real magnitudes: Quality (0-100) - elevation, duration, darkness, magnitude, rarity combined Real mags - per-type standards (ISS -1.3, Starlink 5.5, GPS 4.0) with range + phase correction Phase angle math - proper Sun-sat-observer geometry for realistic brightness UI shows both - mag -2.6 Q80 on every pass in list and detail views All groups covered - stations, Starlink, military, NOAA, GOES, GPS, Galileo, BeiDou, Iridium Offline–irst - cached TLE, zero network needed The predictor now tells you which passes are worth waking up for. v1.1.17 on GitHub and PyPI.
v1.1.18 - Themes, progress bars, consistent Enter=back 5 themes: default, dark, solarized, dracula, monokai Progress bars: spinner for single fetch, count bar for multi-group TLE Enter = back everywhere for consistent navigation Replaced hardcoded colors with semantic theme styles Theme selection persists in config.toml v1.1.18 on GitHub and PyPI.
spacecrew v1.2.1 Dashboard mode (option 8) - 2-column btop-like grid: ISS/Tiangong/Passes left, Weather/People/Launches/APOD right; renders via Rich Layout grid 9 themes: default, Catppuccin Mocha/Latte, Tokyo Night, Gruvbox, Nord, Everforest, Rose Pine, Kanagawa - semantic styles, zero hardcoded colors, persist in config.toml v1.2.1 on GitHub and PyPI
v1.2.3 - Cloud cover and moon phase now appear alongside every predicted pass in the satellite tracker. Cloud cover - Real-time data from Open-Meteo. Shows percentage at exact pass time and location. Cached 1 hour. Moon phase - Local Meeus algorithm, zero API calls. Only shown for night passes (sun elevation < -6°). Displays phase name + illumination: MOON FIRST QUARTER 44%. v1.2.3 on GitHub and PyPI.
v1.2.3 - Satellite tracker redesign Pass Predictor redesign - Tonight’s Best, All Passes, Specific Satellite Cloud cover from Open-Meteo, cached for 1 hour Moon phase via local Meeus algorithm, fully offline Night pass info - cloud cover and moon phase when relevant Satellite groups reorganized for easier browsing Direct satellite search across all groups Type badges added to satellite details Simplified controls - Enter = back everywhere
v1.2.3 - Pass Predictor fixes and UX improvements Tonight’s Best no longer loads 10k+ Starlink satellites Tiered quality system - Best, Good, OK instead of one strict filter Filter menu duplicate code fixed Calculating passes… duplicate message removed Night filtering fixed with sun_el_max v1.2.3 on GitHub and PyPI.
v1.2.5 - Satellite tracker fixes & polish Tonight’s Best fixed - no longer loads 10k+ Starlink satellites, only ISS + Stations Tiered quality system - Best (mag < 2, el > 45°, dur > 5 min), Good (mag < 4, el > 25°), OK (mag < 5.5, el > 15°) Filter menu - fixed duplicate code Calculating passes… - removed duplicate message Man page - added man spacecrew Shell completions - added bash, zsh, and fish support via spacecrew --generate-completion GitHub Release - added automatic release creation on tag push Published - v1.2.5 is now available on GitHub and PyPI
v1.2.6 - Favorites satellites Favorites - add or remove satellites from the detail view with F Favorites mode - press 5 in the satellite passes menu to show only favorited satellites Favorites badge - ★ FAV badge shown in satellite detail view Persistent favorites - saved in ~/.config/spacecrew/config.toml Published - v1.2.5 is now available on GitHub and PyPI
v1.2.6 - Satellite groups, navigation & visual improvements Satellite groups - proper categorization: ISS & Stations, Starlink, Navigation, Science & Weather, Other Detail view navigation - Enter now returns to the previous list instead of the main menu Cloud cover - displayed as ☁︎ XX% Azimuth - compass direction added, e.g. 45°NE → 135°SE Moon phase - displayed as Moon XX% Code cleanup Published - v1.2.5 is now available on GitHub and PyPI
v1.2.8 - Satellite Passes visual improvements Panel-based layout - each satellite now has a bordered card with its number, name, group badge, and [FAV] indicator Multiple passes - up to 3 passes per satellite, configurable Quality-tier borders - Best, Good, OK, and Dim tiers with matching colors Clean pass data - time, elevation, compass direction, duration, magnitude, and quality score Visibility details - cloud cover, moon phase, and VISIBLE status shown for each pass Satellite groups - fixed categorization: ISS & Stations, Starlink, Navigation, Science & Weather, Other Favorites integration - [FAV] badge, favorites-only mode with 5 , and F to toggle favorites Detail view navigation - Enter returns to the previous list instead of the main menu Published - v1.2.8 is now available on GitHub and PyPI
v1.2.9 - Satellite detail view & themes Satellite detail redesign - new panel and table layout matching the launches and people views Header panel - satellite name, group badge, and FAV indicator Next Pass panel - highlighted summary with time, elevation, direction, duration, magnitude, quality, cloud cover, and moon phase Full passes table - date, time, max elevation, direction, duration, magnitude, quality, cloud cover, moon phase, and visibility Visibility indicators - green rows for visible passes and dimmed rows for non-visible passes Refined styling - subtle borders and softer colors for a cleaner look 10 themes - added Dracula Published - v1.2.9 is now available on GitHub and PyPI
v1.2.10, v1.2.11 - Satellite tracker improvements Fallback TLE data - 24 satellites across 6 groups, available when network sources fail Detail view fixes Full-width panels - expanded panels for improved layout Faster TLE fetching Published - v1.2.11 is now available on GitHub and PyPI
v1.2.12 - Bug fixes and packaging improvements Core stability - fixed argument parsing and replaced recursive refresh loops with proper loops Astronaut view - fixed crashes when photos are missing Moon phases - all 8 phases now work correctly, with proper UTC timestamps Satellite passes - fixed filter persistence, empty lists, group tags, and missing URLs ISS tracking - improved retries, offline handling, and location accuracy Dashboard - fixed storm level detection, now shows actual conditions Cache and display - improved corrupted cache handling and screen clearing APOD and space weather - fixed API key handling, date requests, and image loading with fallbacks Packaging - wheel now includes the man page and fallback TLE data Published - v1.2.12 is now available on GitHub and PyPI
v1.2.13 - Satellite data, dashboard, performance and documentation Offline satellite data - 396 real satellites across all 13 groups Satellite groups - fixed dead GROUP=other and empty iridium groups Dashboard fixes - q quits, Tiangong displays correct data, and unused imports removed Lazy-loaded images - Pillow and chafa no longer required at startup, with a new --no-image flag Performance improvements - optimized observer calculations and parallel group fetching Cache fixes - empty results no longer overwrite cached satellite data Documentation - updated README with all modes, configuration, and flags Man page - fixed documentation and removed duplicate man directory Published - v1.2.13 is now available on GitHub and PyPI
v1.2.14 - Live dashboard, countdowns, satellite info, and fetch improvements Live dashboard - updates every second, with background data refreshes every 60 seconds and Enter-only exit Countdowns everywhere - shows time until passes, red NOW for active passes, and dim ENDED for finished passes Pass filtering - ended passes are filtered out so lists start with the next upcoming pass Satellite info panel - displays NORAD ID, launch date, operator, country, and status from cached SatNOGS data Reliable data fetching - fast failover to stale cache and 396-satellite built-in fallback Parallel fetching - satellite groups load in parallel for better performance Cache protection - empty results never overwrite valid cached data Dashboard accuracy - Tiangong no longer displays ISS data Published - v1.2.14 is now available on GitHub and PyPI
v1.2.15 - Scriptability, radio, and aurora JSON output - added --json support for passes, people, and launches, with machine-readable data for scripts, jq , cron jobs, and home automation Pass data - JSON includes satellite name, group, start/end times, max elevation, duration, magnitude, quality, cloud cover, moon phase, and visibility Downlink frequencies - new FREQUENCIES panel with SatNOGS transmitter data, including frequency, mode, uplink, baud rate, and description Offline frequency cache - transmitter data cached for 90 days and available offline Aurora forecast - dashboard and space weather view now show whether aurora is Overhead possible, Low on horizon possible, or Unlikely based on Kp and your location Reliable satellite data - 396-satellite offline TLE fallback across all 13 groups, with stale-cache failover when Celestrak is unavailable Faster fetching - shorter timeouts and improved data loading Published - v1.2.15 is now available on GitHub and PyPI
v1.2.16 - Fixes and configuration improvements Cache control - fixed --no-cache , which was parsed but previously ignored Custom configuration - added --config DIR , SPACE_CREW_CONFIG_DIR , and XDG_CONFIG_HOME support for isolated configs NASA API errors - added clearer DEMO_KEY rate-limit hints with an API link, plus 5xx and offline guidance in the APOD view SatNOGS cache - fixed cache typing to support both dictionaries and lists Offline weather - fixed offline responses to return the complete expected data structure Code cleanup - removed a duplicate docstring Documentation - updated the man page to v1.2.16 and synced README examples for --json and --config Published - v1.2.16 is now available on GitHub and PyPI
v1.2.17 - Timezones, rocket photos, and satellite pass fixes Local timezones - added --timezone flag, saved timezone settings, and automatic detection. Times display locally (e.g. 20:00 CEST), with UTC in parentheses in detail views UTC consistency - countdowns and --json output remain in UTC Rocket photos - press p in launch details to view a large, high-resolution rocket photo with minimal accompanying info Satellite pass accuracy - fixed a rotation sign error that caused incorrect predictions, verified against an independent reference to within ±1 minute Low-elevation passes - fixed filtering that silently dropped visible passes Settings persistence - fixed settings that sometimes failed to save Clean JSON output - status banners no longer pollute --json output Published - v1.2.17 is now available on GitHub and PyPI
v1.2.18 and v1.2.19 - Documentation and run fixes **Tzdata dependency ** - added the Windows-only tzdata dependency so timezones resolve correctly instead of falling back to UTC Dashboard navigation - fixed Enter-to-exit on Windows using msvcrt , while keeping existing POSIX behavior unchanged Module execution - python -m spacecrew now works via the new __main__.py Version detection - falls back to pyproject.toml in development checkouts to avoid reporting stale versions Docs - completely rewrote the README with feature sections and screenshots Published - v1.2.19 is now available on GitHub and PyPI
spacecrew - quick terminal tour Quick tour of spacecrew in action: interactive menu, people in space, live ISS position, Tonight’s Best satellite passes, a launch countdown with the rocket photo view and more. Video is now available on the GitHub project page.
Ships:
spacecrew - mission control for your terminal What I made: I got tired of opening five browser tabs to follow space, so I built one command that brings them all together. spacecrew tells you who’s in orbit this second, tells you when the ISS is about to cross your sky, counts down the next liftoff with a rocket photo beside it, displays NASA’s Picture of the Day in terminal characters, and tracks solar activity with a verdict on whether you’ll see auroras tonight. What was challenging: At one point, every satellite prediction was perfectly calculated, but for the mirror image of Earth. A single flipped sign in the orbital math put passes on the wrong side of the planet, and nothing looked obviously broken until I cross-checked each pass against an independent physics library, minute by minute, until reality matched. The other fight was time itself: switching an app built around UTC to local time without breaking a single countdown. What I’m proud of: The app now distrusts the internet by default. Dead APIs, rate limits, airplane mode: it keeps working from cached data and built-in satellite TLEs whenever possible. It also includes real orbital calculations, satellite tracking, radio frequencies, and a full interactive terminal interface, all installable with a single command. Features: People in Space, NASA APOD, Launches, ISS Tracking, Space Weather, Satellite Passes, Themes, Dashboard The GitHub README includes a detailed breakdown of the features, modes, configuration options, and command-line flags, along with screenshots and examples. Try it yourself: Install with either command: pipx install spacecrew or pip install spacecrew...
|
1792756516.4344232
|
1792842916.4344232
|