|
22010
|
3D-OS by @smitamaw | Stardance
|
smitamaw
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-30T20:28:37Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "3D-OS is live!! It is a WebOS that aims to be fully 3D, increasing your productivity tenfold. I ran into some issues when trying to host the project on Vercel, but I was able to host it eventually. I wanted to show my vision of what an OS of the future would look like, and i hope you enjoy playing around with it! project-kanon.vercel.app", "repo": "https://github.com/smitamw/3D-OS", "demo": "https://project-kanon.vercel.app/"}]...
|
[{"post_id": 13412, "ts": "202 [{"post_id": 13412, "ts": "2026-06-21T23:21:30Z", "hours": 0.8056, "text": "Added Minesweeper and removed the grid and colored cubes. Try it out here: https://project-kanon.vercel.app/"}, {"post_id": 12754, "ts": "2026-06-20T21:07:39Z", "hours": 1.0531, "text": "Made the basic 3D pseudo-OS with rotatable draggable double sided windows. Even added a Youtube player!"}]...
|
Title: 3D-OS by @smitamaw | Stardance
Devlogs:
Ma Title: 3D-OS by @smitamaw | Stardance
Devlogs:
Made the basic 3D pseudo-OS with rotatable draggable double sided windows. Even added a Youtube player!
Added Minesweeper and removed the grid and colored cubes. Try it out here: https://project-kanon.vercel.app/
Ships:
3D-OS is live!! It is a WebOS that aims to be fully 3D, increasing your productivity tenfold. I ran into some issues when trying to host the project on Vercel, but I was able to host it eventually. I wanted to show my vision of what an OS of the future would look like, and i hope you enjoy playing around with it! project-kanon.vercel.app...
|
1793148684.8531535
|
1793235084.8531535
|
|
22029
|
Sentinel: Autonomous Exploration Rover by @Sriyan Sentinel: Autonomous Exploration Rover by @Sriyan | Stardance...
|
Sriyan
|
1
|
146.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-30T03:15:27Z", "hours": 146.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a robot controller and the code responding for it although I couldn’t finish the robot itself I feel like this Is worth the effort I put into it thanks, Sriyan", "repo": "https://github.com/BigestBrainestbozo/Sentinal-robot-website-and-code", "demo": ""}]...
|
[{"post_id": 75433, "ts": "202 [{"post_id": 75433, "ts": "2026-09-30T02:29:18Z", "hours": 20.4072, "text": "Devlog — Motor Control System Time: ~7 Hours I wasn’t able to finish building the physical robot, so this year I’ve been focusing more on the coding side of the project. During these 7 hours, I worked on the robot’s motor control system, including movement, motor power, direction, and stopping. I also spent time testing and debugging the code so that when I return to the physical robot, I’ll already have a stronger software foundation ready. Next I’m going to keep developing and improving the code this year, and eventually return to finishing and integrating it with the physical robot."}, {"post_id": 55358, "ts": "2026-08-27T04:21:04Z", "hours": 5.8667, "text": "––Devlog 17–– Continuing Sentinel’s Retrace System Today I continued working on Sentinel’s autonomous retrace system. The goal of this system is to give it a way to recover when autonomous navigation leads it into a bad situation. Instead of stopping, it will eventually be able to remember its recent route, retrace it, look for another path, and only return control to the user if autonomous recovery fails. Recording Autonomous Movement I continued connecting it’s existing autonomous navigation to the movement-history system. it can store recent movements using: rememberMovement ()"}, {"post_id": 54250, "ts": "2026-08-25T04:19:16Z", "hours": 14.075, "text": "––Devlog 16–– Testing Sentinel in the Real World Yesterday I focused on just testing it over obstacles I’ve spent a lot of recent sessions improving the autonomous navigation system, failsafe logic, sensor handling, mission statistics, and the beginning of the retrace system. Physical Testing I spent the session working with Sentinel’s real hardware and observing how the different systems behave outside of the Arduino IDE. I focused on: Motor movement Servo movement Ultrasonic sensor behavior Sensor positioning Current wiring Rover movement Existing manual controls Existing autonomous behavior"}, {"post_id": 52469, "ts": "2026-08-22T16:24:33Z", "hours": 4.9, "text": "––Devlog 15–– Remembering its Path Today I started working on a much more advanced recovery system for the rover. Until now, FAILSAFE has mainly been designed to stop the rover when autonomous navigation runs into a serious problem. I don’t want stopping to always be the rovers first and only solution. Instead, I want Sentinel to eventually remember where it came from, retrace part of its path, and search for another route. The New Recovery Idea The recovery system I’m building is designed to eventually work like this: Dead End? I v FAILSAFE I v Retrace Recent Path I v Scan Surroundings Again I v Try Another Route I v No Safe Route? I v Switch to Manual Mode"}, {"post_id": 51305, "ts": "2026-08-20T21:38:39Z", "hours": 5.5142, "text": "—Devlog 14— Making it more reliable today I continue improving the autonomous navigation system work better by making a better failsafe. Sensor Failures I improved sentinels ultrasonic sensor failure handling/ the rover now treats different situations respectively not just backing up when sensor failsafe now it will retrace its path and go a different way if there is no other way the rover will automatically switch to manual mode and your device will do a cool animation change in the schedule since school started I am trying hard to balance 6 hours of school and 5 hours of work each day, so now physical and catch up days are on weekends due to having no school."}, {"post_id": 45366, "ts": "2026-08-11T19:31:55Z", "hours": 4.9944, "text": "–Devlog 13– Finishing Sentinel’s Failsafe System Today I continued working on Sentinel’s autonomous safety system. The main goal was to make FAILSAFE more useful instead of having it simply stop the rover without explaining what happened."}, {"post_id": 44450, "ts": "2026-08-10T06:23:59Z", "hours": 13.1775, "text": "––Devlog 12–– Making Sentinel Safer Today I focused on improving autonomous navigation and making the rover safer when something goes maybe might go wrong. A lot of today’s work was about making sure Sentinel doesn’t just assume that every sensor reading is correct or that every direction is safe. Smarter Path Decisions I added a minimum turning clearance to the rover’s settings. Before this, Sentinel could scan both directions and simply choose whichever side had more space. For example: left: 8 cm right: 12 cm the right side has more space, but 12 cm still isn’t enough room to safely turn. Now it checks whether a direction actually has enough clearance before choosing it. If both directions are clear, it chooses the side with more room. If only one direction is clear, it chooses that direction. If neither direction is clear, it knows that it needs to try something else. gn"}, {"post_id": 43773, "ts": "2026-08-09T06:19:22Z", "hours": 7.4453, "text": "———––Devlog 11———— I made it to Colorado yeah Failsafe I decided to make the autonomous mode safer rather than faster. the purpose of the failsafe is if something is to ever go wrong it will know what to do. Smart Path Decision well you heard the title, well basically what I did is that it can tell the difference between: A clear path A path that is too close to an obstacle A failed sensor reading Both paths being blocked I also added a minimum turning distance so it doesn’t choose one side for being like 1 cm better than the other. Example: left: 11cm right 12cm"}, {"post_id": 42656, "ts": "2026-08-07T14:31:52Z", "hours": 5.2392, "text": "———––Devlog 10———— Improving Sentinel’s Brain And Hardware Today I finally did a hardware and software day I spent the digital part fixing my devlogs and coding the place holder awareness. Software Progress I continued working on the autonomous navigation system like: Tracking servo current position Improved logic for left, center, and right Remembering sensor readings Physical Work My solder wire is leaded im cooked I didnt like my solder work so I tried again but this time I watched a video and it said leaded is dangerous so yeah but I connected 1 wire cut in half\\ Important Info im going to colorado today for 10 days but 3 of them Im going to be in mountain so no work Thanks for following Project Sentinel!"}, {"post_id": 41798, "ts": "2026-08-06T06:53:25Z", "hours": 7.4844, "text": "———––Devlog 09———— Sentinel’s Software Gets Smarter Today I focused mainly on improving Sentinel’s software and project documentation . The rover is not physically ready for full testing yet, so I used the digital work session to organize the code, fix errors, add useful debugging features, and improve how I present the project. Software Progress I expanded Sentinel’s Arduino Mega code with several new systems: Manual and autonomous driving modes Emergency stop command Configurable rover settings Obstacle detection and stopping Reverse-and-turn behavior Servo-based left, center, and right scanning Mission statistics Current rover status reporting Structured communication messages TB6612 motor-driver control functions The autonomous system is designed to follow this sequence: Drive forward Detect an obstacle Stop Reverse Scan left, center, and right Compare the available paths Choose the clearer direction Turn Continue driving Mission Statistics I added a command that can report information such as: Mission runtime Number of obstacles detected Number of left turns Number of right turns Number of successful distance readings I also added a current-status command so I can check Sentinel’s mode, state, movement command, and latest sensor reading while debugging. 📡 Communication Protocol I standardized the messages Sentinel sends through the Serial Monitor. Examples include: MODE:MANUAL MODE:AUTONOMOUS STATE:DRIVING STATE:REVERSING STATE:SCANNING_LEFT CMD:FORWARD CMD:STOP DIST:32.4"}, {"post_id": 40925, "ts": "2026-08-04T19:19:32Z", "hours": 14.7436, "text": "———––Devlog 08———— Making The Navigation Brain Toda I focused on the software for Sentinel. instead of working on hardware all day I switch to digital to make the user interface easy and intuitive for everyone(me) to use without any brain power. What I coded I added code for : The stop distance before obstacles Sensor-reading interval duration for turning and reversing and movement speed changes I got these from looking at my robot vac believe it or not. Preparations I began preparing for the motors because i have to solder them to the Arduino and im a noob at it so i made self drving mode and manual mode with placeholders What I Learned those little disks roaming around houses are hard to code kudos to the engineers, but I think that I learned that sensor awarness is hard and that anyways, Thanks for listening to my thing and following my project."}, {"post_id": 39172, "ts": "2026-08-01T23:01:50Z", "hours": 10.3956, "text": "———––Devlog 07———— Sentinel’s Web Controller Is Fixed Today I fixed a major part of the website which was the mobile part not being able to work properly Desktop Controls On a computer, sentinel can be controlled using the keyboard. The main controls are (for now): W - Forward A - Left S - Backward D - Right Mobile Controls For phones, I designed a different interface, instead of trying to use small buttons to control I made a joystick . Device Detection The website automatically provides better control method depending on what device you are using. Thanks for following Project Sentinel ! We’re getting closer to actually driving this thing."}, {"post_id": 37934, "ts": "2026-07-30T23:16:10Z", "hours": 9.9833, "text": "—————— Devlog 06 —————— Building Sentinel’s Eyes & Control Center Over the past few days, I worked on both the physical rover and its control system. What I Finished I completed the custom mount for Sentinel’s ultrasonic sensors. The mount holds the sensors securely and prepares them to be mounted on the servo, allowing Sentinel to scan left, center, and right while navigating. Website Progress I also spent time building Sentinel’s web controller. So far I have created: 🖥️ Desktop version Mobile version Both versions are coming together nicely. The only problem is that the mobile version isn’t displaying correctly on my phone yet, so I’ll show it off in the next devlog after I fix it. What I Learned This project is becoming much bigger than just building a rover. I’m now working on: CAD 3D printing Web development C++ Electronics Hardware integration It’s exciting seeing all of these skills come together in one project. Next Mission Fix the mobile website layout Finish the web controller Mount the ultrasonic sensor onto the servo Continue building Sentinel’s autonomous navigation system Thanks for following Project Sentinel ! Every update gets me one step closer to bringing Sentinel to life."}, {"post_id": 36717, "ts": "2026-07-28T23:13:11Z", "hours": 4.4978, "text": "———––Devlog 05———— Learning CAD - Day 2 Today I continued learning CAD so I eventually design custom parts for Sentinel . What I Learned Its hard. also refined my skills and made some medium difficulty items. Thanks for following Project Sentinel!"}, {"post_id": 36078, "ts": "2026-07-27T22:48:14Z", "hours": 11.8211, "text": "———––Devlog 04———— Learning CAD After being away for a while, I finally made it home! Now that I access to all my hardware again, I decided to make a mount for my servo and sensor and for the battery. Why I’m Learning CAD The rover needs some mount for: Ultrasonic Sensor Servo Battery Other electronics What I’m Working On My first goal is to design a bracket that can mount the ultrasonic sensor on top of the servo. That setup will allow Sentinel to: Look left Look forward Look right Compare distances Choose the best path What I’m Learning This is my first time trying a 3d modeling software, so Im going to start off with the basics. Target for tomorrow Make simple 3d shapes Build a servo mount Maybe print Thanks for following Project Sentinel!"}, {"post_id": 33733, "ts": "2026-07-23T21:42:37Z", "hours": 4.36, "text": "———––Devlog 03———— Information It’s definitely been longer than I planned since my last update . I was on vacation for a while, and I honestly lost more time than I wanted to. Instead of letting that stop the project, I decided to get back on track by focusing on something that will help Sentinel in the long run: learning C++ . What I’ve Been Doing While I haven’t been home to work on the hardware, I’ve been spending my time learning the fundamentals of C++. Some of the topics I’ve been working through includes: Variables Loops Functions Enums Classes General programming concepts I’ve attached a few screenshots showing what I’ve been learning. The Plan Since I lost some time during vacay, I going to have to do 4 hours and 32 minutes a day until I reach my goal. It won’t be easy, but I know it’ll be worth it when Sentinel finally comes together. Progress Even though there hasn’t been much hardware progress yet, I believe learning C++ now will save me a lot of time later because I’ll be writing and understanding my own rover software instead of relying on tutorials. Next Mission Continue learning C++ Return home Start assembling Sentinel Begin writing the rover’s software Thanks for following Project Sentinel. The build will finally start picking up speed soon!"}, {"post_id": 14189, "ts": "2026-06-23T05:44:45Z", "hours": 1.0669, "text": "———––Devlog 02———— Preparing For Sentinel Welcome back to another devlog! While I’m still waiting for the rest of Sentinel’s parts to arrive (they should be here by the end of June), I’ve decided to spend this time learning C++ . Instead of relying only on the Arduino examples and documentation, I want to understand how everything works so I can build different project by myself. Current Plan While waiting for the hardware, I’m focusing on learning: Variables Functions Loops Classes Enums General C++ programming My goal is to write as much of Sentinel’s software myself as possible instead of just copying code. Hardware Update As I said before Most of the remaining parts are expected to arrive near the end of June . Once everything arrives, I’ll be able to start assembling the rover and putting everything I’ve learned into practice. Target For Tomorrow -Continue learning C++ Wait for the remaining hardware Begin assembling Sentinel when the parts arrive Thanks so much for following Project Sentinel! Every bit of support motivates me to keep improving."}, {"post_id": 14046, "ts": "2026-06-23T00:51:47Z", "hours": 0.3708, "text": "———––Devlog 01———— Giving Sentinel Its Eyes Today I connect the ultrasonic sensors that will act as the eyes of Sentinel What I Added Ultrasonic distance sensors Front-facing sensor layout Very basic obstacle detection software Why Ultrasonic Sensors? I considered using cameras, but they were outside my budget and would have made the project more complicated. Target for tomorrow Test distance readings Connect the sensor to the Arduino Mega Start obstacle-avoidance log"}]...
|
Title: Sentinel: Autonomous Exploration Rover by @ Title: Sentinel: Autonomous Exploration Rover by @Sriyan | Stardance
Devlogs:
———––Devlog 01———— Giving Sentinel Its Eyes Today I connect the ultrasonic sensors that will act as the eyes of Sentinel What I Added Ultrasonic distance sensors Front-facing sensor layout Very basic obstacle detection software Why Ultrasonic Sensors? I considered using cameras, but they were outside my budget and would have made the project more complicated. Target for tomorrow Test distance readings Connect the sensor to the Arduino Mega Start obstacle-avoidance log
———––Devlog 02———— Preparing For Sentinel Welcome back to another devlog! While I’m still waiting for the rest of Sentinel’s parts to arrive (they should be here by the end of June), I’ve decided to spend this time learning C++ . Instead of relying only on the Arduino examples and documentation, I want to understand how everything works so I can build different project by myself. Current Plan While waiting for the hardware, I’m focusing on learning: Variables Functions Loops Classes Enums General C++ programming My goal is to write as much of Sentinel’s software myself as possible instead of just copying code. Hardware Update As I said before Most of the remaining parts are expected to arrive near the end of June . Once everything arrives, I’ll be able to start assembling the rover and putting everything I’ve learned into practice. Target For Tomorrow -Continue learning C++ Wait for the remaining hardware Begin assembling Sentinel when the parts arrive Thanks so much for following Project Sentinel! Every bit of support motivates me to keep improving.
———––Devlog 03———— Information It’s definitely been longer than I planned since my last update . I was on vacation for a while, and I honestly lost more time than I wanted to. Instead of letting that stop the project, I decided to get back on track by focusing on something that will help Sentinel in the long run: learning C++ . What I’ve Been Doing While I haven’t been home to work on the hardware, I’ve been spending my time learning the fundamentals of C++. Some of the topics I’ve been working through includes: Variables Loops Functions Enums Classes General programming concepts I’ve attached a few screenshots showing what I’ve been learning. The Plan Since I lost some time during vacay, I going to have to do 4 hours and 32 minutes a day until I reach my goal. It won’t be easy, but I know it’ll be worth it when Sentinel finally comes together. Progress Even though there hasn’t been much hardware progress yet, I believe learning C++ now will save me a lot of time later because I’ll be writing and understanding my own rover software instead of relying on tutorials. Next Mission Continue learning C++ Return home Start assembling Sentinel Begin writing the rover’s software Thanks for following Project Sentinel. The build will finally start picking up speed soon!
———––Devlog 04———— Learning CAD After being away for a while, I finally made it home! Now that I access to all my hardware again, I decided to make a mount for my servo and sensor and for the battery. Why I’m Learning CAD The rover needs some mount for: Ultrasonic Sensor Servo Battery Other electronics What I’m Working On My first goal is to design a bracket that can mount the ultrasonic sensor on top of the servo. That setup will allow Sentinel to: Look left Look forward Look right Compare distances Choose the best path What I’m Learning This is my first time trying a 3d modeling software, so Im going to start off with the basics. Target for tomorrow Make simple 3d shapes Build a servo mount Maybe print Thanks for following Project Sentinel!
———––Devlog 05———— Learning CAD - Day 2 Today I continued learning CAD so I eventually design custom parts for Sentinel . What I Learned Its hard. also refined my skills and made some medium difficulty items. Thanks for following Project Sentinel!
—————— Devlog 06 —————— Building Sentinel’s Eyes & Control Center Over the past few days, I worked on both the physical rover and its control system. What I Finished I completed the custom mount for Sentinel’s ultrasonic sensors. The mount holds the sensors securely and prepares them to be mounted on the servo, allowing Sentinel to scan left, center, and right while navigating. Website Progress I also spent time building Sentinel’s web controller. So far I have created: 🖥️ Desktop version Mobile version Both versions are coming together nicely. The only problem is that the mobile version isn’t displaying correctly on my phone yet, so I’ll show it off in the next devlog after I fix it. What I Learned This project is becoming much bigger than just building a rover. I’m now working on: CAD 3D printing Web development C++ Electronics Hardware integration It’s exciting seeing all of these skills come together in one project. Next Mission Fix the mobile website layout Finish the web controller Mount the ultrasonic sensor onto the servo Continue building Sentinel’s autonomous navigation system Thanks for following Project Sentinel ! Every update gets me one step closer to bringing Sentinel to life.
———––Devlog 07———— Sentinel’s Web Controller Is Fixed Today I fixed a major part of the website which was the mobile part not being able to work properly Desktop Controls On a computer, sentinel can be controlled using the keyboard. The main controls are (for now): W - Forward A - Left S - Backward D - Right Mobile Controls For phones, I designed a different interface, instead of trying to use small buttons to control I made a joystick . Device Detection The website automatically provides better control method depending on what device you are using. Thanks for following Project Sentinel ! We’re getting closer to actually driving this thing.
———––Devlog 08———— Making The Navigation Brain Toda I focused on the software for Sentinel. instead of working on hardware all day I switch to digital to make the user interface easy and intuitive for everyone(me) to use without any brain power. What I coded I added code for : The stop distance before obstacles Sensor-reading interval duration for turning and reversing and movement speed changes I got these from looking at my robot vac believe it or not. Preparations I began preparing for the motors because i have to solder them to the Arduino and im a noob at it so i made self drving mode and manual mode with placeholders What I Learned those little disks roaming around houses are hard to code kudos to the engineers, but I think that I learned that sensor awarness is hard and that anyways, Thanks for listening to my thing and following my project.
———––Devlog 09———— Sentinel’s Software Gets Smarter Today I focused mainly on improving Sentinel’s software and project documentation . The rover is not physically ready for full testing yet, so I used the digital work session to organize the code, fix errors, add useful debugging features, and improve how I present the project. Software Progress I expanded Sentinel’s Arduino Mega code with several new systems: Manual and autonomous driving modes Emergency stop command Configurable rover settings Obstacle detection and stopping Reverse-and-turn behavior Servo-based left, center, and right scanning Mission statistics Current rover status reporting Structured communication messages TB6612 motor-driver control functions The autonomous system is designed to follow this sequence: Drive forward Detect an obstacle Stop Reverse Scan left, center, and right Compare the available paths Choose the clearer direction Turn Continue driving Mission Statistics I added a command that can report information such as: Mission runtime Number of obstacles detected Number of left turns Number of right turns Number of successful distance readings I also added a current-status command so I can check Sentinel’s mode, state, movement command, and latest sensor reading while debugging. 📡 Communication Protocol I standardized the messages Sentinel sends through the Serial Monitor. Examples include: MODE:MANUAL MODE:AUTONOMOUS STATE:DRIVING STATE:REVERSING STATE:SCANNING_LEFT CMD:FORWARD CMD:STOP DIST:32.4
———––Devlog 10———— Improving Sentinel’s Brain And Hardware Today I finally did a hardware and software day I spent the digital part fixing my devlogs and coding the place holder awareness. Software Progress I continued working on the autonomous navigation system like: Tracking servo current position Improved logic for left, center, and right Remembering sensor readings Physical Work My solder wire is leaded im cooked I didnt like my solder work so I tried again but this time I watched a video and it said leaded is dangerous so yeah but I connected 1 wire cut in half\ Important Info im going to colorado today for 10 days but 3 of them Im going to be in mountain so no work Thanks for following Project Sentinel!
———––Devlog 11———— I made it to Colorado yeah Failsafe I decided to make the autonomous mode safer rather than faster. the purpose of the failsafe is if something is to ever go wrong it will know what to do. Smart Path Decision well you heard the title, well basically what I did is that it can tell the difference between: A clear path A path that is too close to an obstacle A failed sensor reading Both paths being blocked I also added a minimum turning distance so it doesn’t choose one side for being like 1 cm better than the other. Example: left: 11cm right 12cm
––Devlog 12–– Making Sentinel Safer Today I focused on improving autonomous navigation and making the rover safer when something goes maybe might go wrong. A lot of today’s work was about making sure Sentinel doesn’t just assume that every sensor reading is correct or that every direction is safe. Smarter Path Decisions I added a minimum turning clearance to the rover’s settings. Before this, Sentinel could scan both directions and simply choose whichever side had more space. For example: left: 8 cm right: 12 cm the right side has more space, but 12 cm still isn’t enough room to safely turn. Now it checks whether a direction actually has enough clearance before choosing it. If both directions are clear, it chooses the side with more room. If only one direction is clear, it chooses that direction. If neither direction is clear, it knows that it needs to try something else. gn
–Devlog 13– Finishing Sentinel’s Failsafe System Today I continued working on Sentinel’s autonomous safety system. The main goal was to make FAILSAFE more useful instead of having it simply stop the rover without explaining what happened.
—Devlog 14— Making it more reliable today I continue improving the autonomous navigation system work better by making a better failsafe. Sensor Failures I improved sentinels ultrasonic sensor failure handling/ the rover now treats different situations respectively not just backing up when sensor failsafe now it will retrace its path and go a different way if there is no other way the rover will automatically switch to manual mode and your device will do a cool animation change in the schedule since school started I am trying hard to balance 6 hours of school and 5 hours of work each day, so now physical and catch up days are on weekends due to having no school.
––Devlog 15–– Remembering its Path Today I started working on a much more advanced recovery system for the rover. Until now, FAILSAFE has mainly been designed to stop the rover when autonomous navigation runs into a serious problem. I don’t want stopping to always be the rovers first and only solution. Instead, I want Sentinel to eventually remember where it came from, retrace part of its path, and search for another route. The New Recovery Idea The recovery system I’m building is designed to eventually work like this: Dead End? I v FAILSAFE I v Retrace Recent Path I v Scan Surroundings Again I v Try Another Route I v No Safe Route? I v Switch to Manual Mode
––Devlog 16–– Testing Sentinel in the Real World Yesterday I focused on just testing it over obstacles I’ve spent a lot of recent sessions improving the autonomous navigation system, failsafe logic, sensor handling, mission statistics, and the beginning of the retrace system. Physical Testing I spent the session working with Sentinel’s real hardware and observing how the different systems behave outside of the Arduino IDE. I focused on: Motor movement Servo movement Ultrasonic sensor behavior Sensor positioning Current wiring Rover movement Existing manual controls Existing autonomous behavior
––Devlog 17–– Continuing Sentinel’s Retrace System Today I continued working on Sentinel’s autonomous retrace system. The goal of this system is to give it a way to recover when autonomous navigation leads it into a bad situation. Instead of stopping, it will eventually be able to remember its recent route, retrace it, look for another path, and only return control to the user if autonomous recovery fails. Recording Autonomous Movement I continued connecting it’s existing autonomous navigation to the movement-history system. it can store recent movements using: rememberMovement ()
Devlog — Motor Control System Time: ~7 Hours I wasn’t able to finish building the physical robot, so this year I’ve been focusing more on the coding side of the project. During these 7 hours, I worked on the robot’s motor control system, including movement, motor power, direction, and stopping. I also spent time testing and debugging the code so that when I return to the physical robot, I’ll already have a stronger software foundation ready. Next I’m going to keep developing and improving the code this year, and eventually return to finishing and integrating it with the physical robot.
Ships:
I made a robot controller and the code responding for it although I couldn’t finish the robot itself I feel like this Is worth the effort I put into it thanks, Sriyan...
|
1793148752.2995584
|
1793235152.2995584
|
|
22030
|
Standard Model Simulator by @sunjae_choi710 | Star Standard Model Simulator by @sunjae_choi710 | Stardance...
|
sunjae_choi710
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-01T21:19:46Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a simulator where you can experiment with elementary particles in the Standard Model.", "repo": "https://github.com/sunjaechoi710-png/0th-element", "demo": "https://sunjaechoi710-png.github.io/0th-element/"}]...
|
[{"post_id": 13506, "ts": "202 [{"post_id": 13506, "ts": "2026-06-22T03:10:33Z", "hours": 2.0142, "text": "Standard Model Simulator I made a simulator where you can experiment with elementary particles in the Standard Model. You can merge quarks to create matter, watch different bosons decay, collide photons, and much more. Select the particles from the menu on the left. Drag them around or launch them. The details and scientific values are displayed on the menu, as well as a Feynman diagram for each interaction. If you’re stuck, refer to the recipes. Have fun and lemme know any errors! https://sunjaechoi710-png.github.io/0th-element/"}]...
|
Title: Standard Model Simulator by @sunjae_choi710 Title: Standard Model Simulator by @sunjae_choi710 | Stardance
Devlogs:
Standard Model Simulator I made a simulator where you can experiment with elementary particles in the Standard Model. You can merge quarks to create matter, watch different bosons decay, collide photons, and much more. Select the particles from the menu on the left. Drag them around or launch them. The details and scientific values are displayed on the menu, as well as a Feynman diagram for each interaction. If you’re stuck, refer to the recipes. Have fun and lemme know any errors! https://sunjaechoi710-png.github.io/0th-element/
Ships:
I made a simulator where you can experiment with elementary particles in the Standard Model....
|
1793130557.3673935
|
1793216957.3673935
|
|
22040
|
clk-link by @CLK | Stardance
|
CLK
|
1
|
1.63
|
1
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-25T19:49:22Z", "hours": 1.0, "multiplier": 1.3, "payout": 1, "blessing": "neutral", "text": "I made a website that links most of my other websites together with this one I hope you like it, enjoy", "repo": "https://github.com/NIVLACvt/clk-link", "demo": "https://nivlacvt.github.io/clk-link/"}]...
|
[{"post_id": 27636, "ts": "202 [{"post_id": 27636, "ts": "2026-07-13T12:13:01Z", "hours": 0.6297, "text": "just added my rock-paper-scissor game’s button, made buttons larger and made it so that the buttons are below the description of the project and a cool pattern for the layout"}, {"post_id": 13673, "ts": "2026-06-22T13:01:03Z", "hours": 0.5842, "text": "Added button links instead of normal links and my calculater website"}, {"post_id": 11646, "ts": "2026-06-18T23:50:59Z", "hours": 0.5842, "text": "Just finished adding the first three websites and color(can’t wait to add more) to view you can go to https://nivlacvt.github.io/clk-link/"}]...
|
Title: clk-link by @CLK | Stardance
Devlogs:
Just Title: clk-link by @CLK | Stardance
Devlogs:
Just finished adding the first three websites and color(can’t wait to add more) to view you can go to https://nivlacvt.github.io/clk-link/
Added button links instead of normal links and my calculater website
just added my rock-paper-scissor game’s button, made buttons larger and made it so that the buttons are below the description of the project and a cool pattern for the layout
Ships:
I made a website that links most of my other websites together with this one I hope you like it, enjoy...
|
1793310799.783988
|
1793397199.783988
|
|
22045
|
cctf.rs by @riverdalecoder | Stardance
|
riverdalecoder
|
1
|
36.28
|
391
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-09T18:05:43Z", "hours": 36.0, "multiplier": 11.29, "payout": 391, "blessing": "neutral", "text": "custom framework for a ctf platform written in rust. second ship on it will be the finalized platform instead of just the framework!! hope you enjoy!!", "repo": "https://github.com/TogiFerretFerret/cctf.rs", "demo": "https://ctf.river.hackclub.app/docs"}]...
|
[{"post_id": 25587, "ts": "202 [{"post_id": 25587, "ts": "2026-07-09T22:44:36Z", "hours": 0.2769, "text": "currently doing jp tl"}, {"post_id": 25416, "ts": "2026-07-09T18:00:54Z", "hours": 3.9936, "text": "ladida ship in a box"}, {"post_id": 23758, "ts": "2026-07-06T21:47:52Z", "hours": 3.8386, "text": "Fixed the import typos (FileService comma, Multipart import) Finished main.rs file_service wiring (with the gdrive RCLONE_REMOTE env override) + all test AppState sites Your routes + API_ROUTES entries are in (with your // TODO: make configurable on the body limit — left as-is) Added openapi /api/v1/files paths (multipart upload → ChallengeFile, download → binary) + ctf-file-missing key + English fluent strings Refactored the upload handler’s loop → while let (clippy never_loop)"}, {"post_id": 21913, "ts": "2026-07-04T02:52:15Z", "hours": 0.8875, "text": "i am locked in"}, {"post_id": 21885, "ts": "2026-07-04T01:54:05Z", "hours": 0.5717, "text": "wahoo this did not take 30 minutes (i kid this is not my only change)"}, {"post_id": 21864, "ts": "2026-07-04T01:06:37Z", "hours": 0.6411, "text": "CONCISEIFY"}, {"post_id": 21738, "ts": "2026-07-03T20:34:34Z", "hours": 0.5481, "text": "my payout should be at LEAST this much lmao (im kidding, almost)"}, {"post_id": 21701, "ts": "2026-07-03T20:00:01Z", "hours": 0.7075, "text": "i gave up on trying to write commit messages"}, {"post_id": 21663, "ts": "2026-07-03T18:52:33Z", "hours": 1.6639, "text": "yes i am starting to write real commit messages"}, {"post_id": 20606, "ts": "2026-07-02T07:39:00Z", "hours": 1.0633, "text": "tipscript"}, {"post_id": 20585, "ts": "2026-07-02T06:24:44Z", "hours": 1.0033, "text": "openapi"}, {"post_id": 20556, "ts": "2026-07-02T05:17:08Z", "hours": 0.69, "text": "i passed 20 hours lmao"}, {"post_id": 20513, "ts": "2026-07-02T03:51:04Z", "hours": 0.63, "text": "integration tests"}, {"post_id": 20480, "ts": "2026-07-02T02:41:29Z", "hours": 0.6553, "text": "MAIIIIIIN"}, {"post_id": 20464, "ts": "2026-07-02T01:49:59Z", "hours": 0.6083, "text": "me when doctests+refactor"}, {"post_id": 20413, "ts": "2026-07-02T00:30:37Z", "hours": 0.5308, "text": "email worker done"}, {"post_id": 20370, "ts": "2026-07-01T23:12:08Z", "hours": 1.4994, "text": "smtpp"}, {"post_id": 18934, "ts": "2026-06-30T03:35:14Z", "hours": 0.4983, "text": "pem; todolo"}, {"post_id": 18868, "ts": "2026-06-30T02:06:27Z", "hours": 1.4889, "text": "smtp; also checkout https://www.youtube.com/watch?v=PVwUMu1OVOo its really good"}, {"post_id": 17367, "ts": "2026-06-28T03:46:24Z", "hours": 0.5025, "text": "wow"}, {"post_id": 16042, "ts": "2026-06-26T02:04:24Z", "hours": 1.4167, "text": "whee all tests pass. still working on backend and excited to continue working on backend."}, {"post_id": 15963, "ts": "2026-06-25T22:30:14Z", "hours": 0.2867, "text": "i hate freeze time"}, {"post_id": 15704, "ts": "2026-06-25T15:16:48Z", "hours": 0.3469, "text": "rhai bad"}, {"post_id": 15685, "ts": "2026-06-25T14:34:31Z", "hours": 0.71, "text": "everything works except for this??? sigh"}, {"post_id": 15155, "ts": "2026-06-24T16:56:56Z", "hours": 0.4889, "text": "tests still pass, this time with some fixes to the instancer"}, {"post_id": 15121, "ts": "2026-06-24T15:57:56Z", "hours": 0.3278, "text": "yaya all tests pass"}, {"post_id": 15076, "ts": "2026-06-24T14:31:22Z", "hours": 0.3611, "text": "improved instance reaper"}, {"post_id": 14766, "ts": "2026-06-24T00:00:02Z", "hours": 0.6339, "text": "WIP Kubernetes instancer"}, {"post_id": 14424, "ts": "2026-06-23T15:29:45Z", "hours": 2.0428, "text": "something something testcases dont pass"}, {"post_id": 13714, "ts": "2026-06-22T14:12:25Z", "hours": 0.9958, "text": "rust is throwing a lot of errors, i might be debugging for a while; implemented scoreboardservice and added backend to support accuracy-based scoreboards"}, {"post_id": 13475, "ts": "2026-06-22T02:09:33Z", "hours": 0.4306, "text": "IT. IS. DONE (this one file lmao)"}, {"post_id": 13469, "ts": "2026-06-22T01:42:18Z", "hours": 0.4508, "text": "😭 i hate oauth"}, {"post_id": 13460, "ts": "2026-06-22T01:13:00Z", "hours": 1.1869, "text": "i hate rust. period."}, {"post_id": 13407, "ts": "2026-06-21T23:13:42Z", "hours": 0.3619, "text": "giant wip repos file"}, {"post_id": 13398, "ts": "2026-06-21T22:48:13Z", "hours": 0.7606, "text": "more types"}, {"post_id": 13236, "ts": "2026-06-21T17:50:50Z", "hours": 0.8161, "text": "got down all the types for challenges done, which will take a while to implement. however, it’s setup for modularity in the future which is good."}, {"post_id": 12806, "ts": "2026-06-20T22:58:50Z", "hours": 1.9642, "text": "i spent two hours writing a localized jwt system; this was DEFINITELY worth my time :trembling_thumbs_up: all jokes aside, very excited to be working on this project"}]...
|
Title: cctf.rs by @riverdalecoder | Stardance
Dev Title: cctf.rs by @riverdalecoder | Stardance
Devlogs:
i spent two hours writing a localized jwt system; this was DEFINITELY worth my time :trembling_thumbs_up: all jokes aside, very excited to be working on this project
got down all the types for challenges done, which will take a while to implement. however, it’s setup for modularity in the future which is good.
more types
giant wip repos file
i hate rust. period.
😭 i hate oauth
IT. IS. DONE (this one file lmao)
rust is throwing a lot of errors, i might be debugging for a while; implemented scoreboardservice and added backend to support accuracy-based scoreboards
something something testcases dont pass
WIP Kubernetes instancer
improved instance reaper
yaya all tests pass
tests still pass, this time with some fixes to the instancer
everything works except for this??? sigh
rhai bad
i hate freeze time
whee all tests pass. still working on backend and excited to continue working on backend.
wow
smtp; also checkout https://www.youtube.com/watch?v=PVwUMu1OVOo its really good
pem; todolo
smtpp
email worker done
me when doctests+refactor
MAIIIIIIN
integration tests
i passed 20 hours lmao
openapi
tipscript
yes i am starting to write real commit messages
i gave up on trying to write commit messages
my payout should be at LEAST this much lmao (im kidding, almost)
CONCISEIFY
wahoo this did not take 30 minutes (i kid this is not my only change)
i am locked in
Fixed the import typos (FileService comma, Multipart import) Finished main.rs file_service wiring (with the gdrive RCLONE_REMOTE env override) + all test AppState sites Your routes + API_ROUTES entries are in (with your // TODO: make configurable on the body limit — left as-is) Added openapi /api/v1/files paths (multipart upload → ChallengeFile, download → binary) + ctf-file-missing key + English fluent strings Refactored the upload handler’s loop → while let (clippy never_loop)
ladida ship in a box
currently doing jp tl
Ships:
custom framework for a ctf platform written in rust. second ship on it will be the finalized platform instead of just the framework!! hope you enjoy!!...
|
1793227682.0230334
|
1793314082.0230334
|
|
22086
|
My very own WebOS by @zarthy1155 | Stardance
|
zarthy1155
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-24T21:30:50Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made My very own WebOS based off of The Chosen Cheese. It has two apps, draggable windows, and some cool stuff. Yay.", "repo": "https://github.com/Zarfur/VeryOwnWebOS", "demo": "https://zarfur.github.io/VeryOwnWebOS/"}]...
|
[{"post_id": 34290, "ts": "202 [{"post_id": 34290, "ts": "2026-07-24T21:28:51Z", "hours": 0.8347, "text": "Added a second app to The Chosen Cheese OS. It uses the Relic Rater app to display upgrades for an idle cheese counter. Yay!"}, {"post_id": 33762, "ts": "2026-07-23T22:44:38Z", "hours": 2.3378, "text": "I finished the. “Jam” thing. But i took like an extra hour than what was recommended. (which i feel quite foolish about). But my website is done! There are some movable windows and movable Chosen Cheese, which you can move if you please. You can close them too! Also there is a little image you can tap on which opens a “Relic Rater” window. It just gives some silly opinions on random Relics. TODO: add something that wasn’t on the Jam !!!!"}, {"post_id": 33570, "ts": "2026-07-23T16:39:30Z", "hours": 1.1192, "text": "My Very Own WebOS 1 following the tutorial!! html 😨 i did the first two “jams” ? i created some window boxes with cool words and images inside of them! Also a top bar and a display of the time. It is cool! My Web OS will be about The Chosen Cheese."}]...
|
Title: My very own WebOS by @zarthy1155 | Stardanc Title: My very own WebOS by @zarthy1155 | Stardance
Devlogs:
My Very Own WebOS 1 following the tutorial!! html 😨 i did the first two “jams” ? i created some window boxes with cool words and images inside of them! Also a top bar and a display of the time. It is cool! My Web OS will be about The Chosen Cheese.
I finished the. “Jam” thing. But i took like an extra hour than what was recommended. (which i feel quite foolish about). But my website is done! There are some movable windows and movable Chosen Cheese, which you can move if you please. You can close them too! Also there is a little image you can tap on which opens a “Relic Rater” window. It just gives some silly opinions on random Relics. TODO: add something that wasn’t on the Jam !!!!
Added a second app to The Chosen Cheese OS. It uses the Relic Rater app to display upgrades for an idle cheese counter. Yay!
Ships:
I made My very own WebOS based off of The Chosen Cheese. It has two apps, draggable windows, and some cool stuff. Yay....
|
1793310631.7339466
|
1793397031.7339466
|
|
22090
|
mogged by @eli_ozcan | Stardance
|
eli_ozcan
|
1
|
10.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-02T20:00:38Z", "hours": 10.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Mogged is a fun amalgamation of Omoggle and Mogwars with a custom research-based mogging backend. This is 10000% for funsies because I wanted to see how I compared to other people without yk having to involve other people. The app takes in photo/video feed and runs Google’s Mediapipe on it to find facial landmarks and then uses custom algorithm code stolen from Omoggle and Mogwars to calculate a facial score. The backend named after me (“Eli”) runs it’s own estimations and takes into account facial color and the full 3D reconstruction of one’s face. Below is a photo I took at school of my project working.", "repo": "https://github.com/elijah629/mogged", "demo": "https://mogged.eli.best"}]...
|
[{"post_id": 33876, "ts": "202 [{"post_id": 33876, "ts": "2026-07-24T04:35:23Z", "hours": 4.0914, "text": "okay so omoggle/mogwars was cool but this is cooler: i noticed that those “backends” only ran on a static frame of your face and only measured landmarks. I decided to make one which bases it off of a 3D scan as well as texture information to estimate skincare. After some research, I found 3DDFA , a small model which can reconstruct a 3D model of a face from photos. the app first takes 7 poses by asking you to move your camera and then passes them all into the model. (120x120x3b tensor). The model gives 62 parameters per pose, and then the app takes the median identity-shape parameters across all views -> BFM2009 decoder -> 68 points used to calculate all the structural metrics. then it uses the texture of the face that’s not in the eyes or mouth and samples them for clarity, eveness, texture, exposure, sharpness, etc. takes the median of that and then calculates a skin value. exact weights for them are found in the code."}, {"post_id": 21869, "ts": "2026-07-04T01:10:27Z", "hours": 5.9342, "text": "Mogged sorry for the lackluster devlog quality, my >4k char devlog was js deleted and i’m pissed inspo a very chopped aquantience couldn’t believe how chopped he was and I wanted to prove it to him. however, he didn’t want to go into an omoggle match w me so I needed something that supported image upload motivation popular websites that do an omoggle-style ranking either are not accurate to omoggle or send your photo off-device to a vLLM or server, which I don’t want criteria both image and photo support privacy first all local on-device scoring accurate to the two popular mogging platforms I found, mogwars and omoggle research found an excellent (althrough made by ai) writeup on omoggle. This shows that Omoggle uses Google’s Mediapipe FaceLandmarker . I knew the data fed into an algorithim but I didn’t know how the facial data was turned into a score so I got a codex agent to analyze the bundled JS of omoggle and mogwars to reverse-engineer the scoring mechanism. It came back with the following: that both websites use the same metrics but process them differently into a score the way metrics (symmetry, jawline, etc.) are calculated from the landmarks and how each platform uses them for sake of brevity (character limit) I will not be describing exactly how each platform works nor how the metrics are calculated in specific, for those interested, check out src/lib/scoring . I promise I’m not larping, I actually understand how it works lol. implementation I then took all of that as well as some Google-given examples for the landmarking API and created a new NextJS + Shadcn + Tailwind v4 project. I first wrote the landmarking system and then the scoring system based on the output of the landmarker. After, I made a temporary UI with google stitch and got codex to wire everything together. demo available at https://mogged.eli.best"}]...
|
Title: mogged by @eli_ozcan | Stardance
Devlogs:
Title: mogged by @eli_ozcan | Stardance
Devlogs:
Mogged sorry for the lackluster devlog quality, my >4k char devlog was js deleted and i’m pissed inspo a very chopped aquantience couldn’t believe how chopped he was and I wanted to prove it to him. however, he didn’t want to go into an omoggle match w me so I needed something that supported image upload motivation popular websites that do an omoggle-style ranking either are not accurate to omoggle or send your photo off-device to a vLLM or server, which I don’t want criteria both image and photo support privacy first all local on-device scoring accurate to the two popular mogging platforms I found, mogwars and omoggle research found an excellent (althrough made by ai) writeup on omoggle. This shows that Omoggle uses Google’s Mediapipe FaceLandmarker . I knew the data fed into an algorithim but I didn’t know how the facial data was turned into a score so I got a codex agent to analyze the bundled JS of omoggle and mogwars to reverse-engineer the scoring mechanism. It came back with the following: that both websites use the same metrics but process them differently into a score the way metrics (symmetry, jawline, etc.) are calculated from the landmarks and how each platform uses them for sake of brevity (character limit) I will not be describing exactly how each platform works nor how the metrics are calculated in specific, for those interested, check out src/lib/scoring . I promise I’m not larping, I actually understand how it works lol. implementation I then took all of that as well as some Google-given examples for the landmarking API and created a new NextJS + Shadcn + Tailwind v4 project. I first wrote the landmarking system and then the scoring system based on the output of the landmarker. After, I made a temporary UI with google stitch and got codex to wire everything together. demo available at https://mogged.eli.best
okay so omoggle/mogwars was cool but this is cooler: i noticed that those “backends” only ran on a static frame of your face and only measured landmarks. I decided to make one which bases it off of a 3D scan as well as texture information to estimate skincare. After some research, I found 3DDFA , a small model which can reconstruct a 3D model of a face from photos. the app first takes 7 poses by asking you to move your camera and then passes them all into the model. (120x120x3b tensor). The model gives 62 parameters per pose, and then the app takes the median identity-shape parameters across all views -> BFM2009 decoder -> 68 points used to calculate all the structural metrics. then it uses the texture of the face that’s not in the eyes or mouth and samples them for clarity, eveness, texture, exposure, sharpness, etc. takes the median of that and then calculates a skin value. exact weights for them are found in the code.
Ships:
Mogged is a fun amalgamation of Omoggle and Mogwars with a custom research-based mogging backend. This is 10000% for funsies because I wanted to see how I compared to other people without yk having to involve other people. The app takes in photo/video feed and runs Google’s Mediapipe on it to find facial landmarks and then uses custom algorithm code stolen from Omoggle and Mogwars to calculate a facial score. The backend named after me (“Eli”) runs it’s own estimations and takes into account facial color and the full 3D reconstruction of one’s face. Below is a photo I took at school of my project working....
|
1793249467.7648323
|
1793335867.7648323
|
|
22103
|
CoW Calc by @superheroyrr | Stardance
|
superheroyrr
|
1
|
16.0
|
302
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-14T01:02:41Z", "hours": 16.0, "multiplier": 18.84, "payout": 302, "blessing": "neutral", "text": "So here’s a summary of what I’ve done: CoW Calc is a battle calculator for the browser strategy game Call of War. The game involves complex battles between stacks of military units with different stats, doctrines, and HP values. Doing that math by hand mid-game is genuinely painful, sure as you get more experience you start to know automatically, but there will still be times when you aren’t sure. CoW Calc makes it fast and visual. The biggest challenge was making it approachable for players who’d never seen it before. My friend tried it cold and got completely lost, so I rebuilt the onboarding from scratch into an interactive guided tour that walks you through your first calculation step by step. I’m most proud of the community response. I posted it to r/CallOfWar and it hit #1 post of the day, and the Discord feedback directly shaped what I built next (mobile support was the #1 request and previously didn’t exist at all). To test it if you don’t play Call of War: The tutorial will walk you through everything. For a quick demo after the tutorial: imagine you’re attacking with 3 Infantry (level 1, Comintern doctrine, 100% HP) against 2 Artillery (level 1, Allies doctrine, 90% HP). Add those units to each side using the unit list, connect them on the battle map, and hit calculate. The website will show the predicted results, which are usually pretty accurate. You don’t need to know the game — the calculator applies its game knowledge for you.", "repo": "https://github.com/agokule/cow-calc", "demo": "https://cow-calc.vercel.app/"}]...
|
[{"post_id": 28018, "ts": "202 [{"post_id": 28018, "ts": "2026-07-14T00:28:29Z", "hours": 0.9553, "text": "Flashback to when I said: At the very least, I feel confident that this project is complete enough to be submitted now… Yeah clearly that did NOT happen. ㅤ So I tried using my own app for its intended purpose on my own, and I ran into a crazy weird bug: sometimes when switching between the main page and connection page, it would duplicate the units that were selected. ㅤ What’s weirder is that it seemed to only affect the enemy units and not the your list… ㅤ It took me about 2 hours of debugging (unfortunately most of which was on Chrome DevTools debugger, so it didn’t count for stardance 😞) to finally find out the root cause. ㅤ The root cause was in how React.js handles refreshing data. So basically, whenever the data in my program changes (ie: the user hits next or start calculation on the connections page), it gets saved to the sessionStorage, after being processed into certain format. It saved the “your” unit lists then the “enemy” unit lists to the sessionStorage. ㅤ In the function that saves it to the sessionStorage, it has a local variable that is supposed to have the current data, which is normal. How it works is that the it sort of takes local variable and overrides the specific changes on top of it, then saves the whole thing to sessionStorage. ㅤ However, because it was using a React method to get the current data, it doesn’t immediately update itself, only updates when a new frame is drawn to the screen… So when the higher level code then tried to save the your unit list, the local variable was out of date, and applied the changes on top of an out of date data and then saved that to the sessionStorage. ㅤ This caused problems when switching between tabs since sessionStorage is the lifeline of the communication between them. I got around this problem by basically saving all of the data in one go instead of saving one part then the next part. ㅤ This was very frustrating to debug by myself but it feels rewarding now that I’ve done it. NOW I will submit this. My family is starting a roadtrip tomorrow morning so I won’t be able to code for a few days, I really want to get this off my plate before then. ㅤ Here’s my debugging setup I used for this:"}, {"post_id": 27316, "ts": "2026-07-12T19:52:03Z", "hours": 0.2728, "text": "So immediately after deploying the previous change there was a simple type error that made the whole thing fail 🤦♂️. This could have been easily avoided if I just ran npm run build before pushing, I think I will do that from now on. ㅤ I also added a button on the connections page to go back to the main page, I had to go through 2 deployments for this change as well because on the first attempt, I accidentally put the button underneath the tutorial button on mobile lol. ㅤ At the very least, I feel confident that this project is complete enough to be submitted now, I am really excited to move on to another cooler project."}, {"post_id": 27303, "ts": "2026-07-12T19:23:33Z", "hours": 0.6044, "text": "Ok so now I fixed that bug which the guy from discord was talking about (at least probably). The problem they had was that when switching between the connections page and the main page, it would sometimes clear out all of the entered information. ㅤ This problem was not occurring for me or my friend, so I was a bit confused on why this could be. After a bit of research (basically talking to my friend gemini), it turns out that the previous method I was using for this, React.js context , was not designed for this use case and is fairly fragile about the data it holds. ㅤ A simple refresh will clear out the data, and sometimes mobile browsers can aggressively do this. The person who reported the bug was also one of the people who asked for mobile support, so they were probably on mobile and it happened. For some reason, my phone wouldn’t cause this to happen so I didn’t catch that bug. ㅤ So now, instead of React.js’s context api, I swapped to using the browser’s sessionStorage api , which is supposed to be much more reliable and also keeps the data intact after a fully refresh! I will now ask that guy if the problem is fixed."}, {"post_id": 26327, "ts": "2026-07-11T01:54:27Z", "hours": 1.3217, "text": "So for this devlog, I added information about how to report bugs and give feature requests. It is pretty low-tech, but it gets the job done. ㅤ I also made the handle bars of the connections page on mobile bigger, so it isn’t as annoying to use."}, {"post_id": 25495, "ts": "2026-07-09T20:06:51Z", "hours": 2.77, "text": "I just finished this really cool interactive tutorial!! ㅤ I’ll be honest, I vibe coded like 80% of this part, than made various tweaks and changed the wording of the different steps so that they make more sense (at one point Claude literally called the doctrines “numbers” lol if you played this game, you would know that they are NOT numbers. FYI they are the “Allies/Comintern/Axis/Pan-Asian” drop downs). ㅤ Somehow, I was able to get that 80% done with just the free tier of the Claude web app chat. It was REALLY annoying because I kept running into usage limits, which is why it took this long to make. If someone could suggest some other tool that’s free and is much easier that would be appreciated. ㅤ What’s really crazy is that I was able to just give it the link to the github repo, told it to make an interactive tutorial and it just started working on it, that too on the free tier! It was very surprising how good a result it created from the first go and how much critical thinking it showed. Now, I did say that I would be done with this once I made the tutorial, but I really want to do some other small things first and also add information about how to report bug/give feedback on the website. Also, someone on the game’s discord server pointed out what might be a bug, or a flaw in the app so I should fix that as well. ㅤ Jeez, I’ve been telling myself “oh wow, I’m so close, I should be able to finish it today” for what feels like a week now, but seriously, I should be done with this today or tomorrow. (hopefully I didn’t jinx it again)."}, {"post_id": 22539, "ts": "2026-07-05T01:57:49Z", "hours": 1.0308, "text": "So it turns out there is also level 2 and level 3 marines and snipers, along with level 2 flame tanks that exist in the game, which I didn’t realize earlier. ㅤ So in this session, I added those pieces of data to the app, and they can be used in calculations now. Holy this required 2,400 lines of code apparently ㅤ (I used the script at src/data/units/synthesiser.ts to estimate the statistics of the other doctrines, since I don’t have access to them, it’s usually pretty accurate with the predictions so it should be fine). ㅤ Now I will work on the tutorial tomorrow and I should be done with this!"}, {"post_id": 21489, "ts": "2026-07-03T13:54:22Z", "hours": 0.3128, "text": "It turns out that the Call of War devs added another new unit to the game: Marines. So I quickly added its data to the website. Now it can be used for calculations"}, {"post_id": 21166, "ts": "2026-07-02T23:37:44Z", "hours": 1.0028, "text": "So now I have added iconography to make the website less text-heavy and more visually appealing. It’s not a lot but it really makes things better ㅤ Now the only thing left is the tutorial!"}, {"post_id": 20462, "ts": "2026-07-02T01:46:53Z", "hours": 0.8294, "text": "So I have finished the doctrine thing today, this makes the website more convenient to use since it is VERY likely that all units in a stack are the same doctrine. Previously you would have had to set the doctrine for EVERY single unit if it wasn’t all Allies doctrine. I made the level and quantity inputs smaller, so that the doctrine selector can take up more space and it actually displays the full name with out the “…” ㅤ Now what’s next is: trying to display more iconography, and the tutorial!!"}, {"post_id": 19666, "ts": "2026-07-01T01:29:26Z", "hours": 1.725, "text": "So I added much better a much better slider system for inputting the hp of each unit. This system is much more intuitive and easy to understand than the previous one. ㅤ On the way, I learned about the ch unit in CSS , which was what I used to set the width of the number input with the up and down arrows. ㅤ Now you might be like “how did it take 1hr 41min to just do that??” So basically, I went through 2 prototypes to get to this point, and it’s been so long since I did web development, I ran into freaking syntax errors slowing me down!!! ㅤ Also, along with this change, I found a bunch of places where there were bad coding practices, like basically having copy pasted code with just a small change between them. Because this is bad practice, I felt obliged to fix them. Again, those syntax errors slowed me down on this part as well. ㅤ But tbh, yeah it should NOT have taken this long to finish this feature, but at least it created an improvement! Conclusion This was one of the things my friend told me I should fix up, and so I did, now there are only 3 other things I decided I would do before considering this project to be done. They are: the default doctrine being selected information displayed as icons instead of text the big thing: a proper tutorial I am closing in on the finish line, I can feel it!"}, {"post_id": 19274, "ts": "2026-06-30T15:25:25Z", "hours": 0.4478, "text": "So I have now color coded the enemy and allied nodes to be red and blue respectively in the node editor. ㅤ This makes it much easier to use the calculator if you have a lot of stacks here."}, {"post_id": 18789, "ts": "2026-06-30T00:12:38Z", "hours": 1.4469, "text": "So for this devlog, I have just added the Sniper, Flame Tank, and Amphibious Tank units that were previously missing from the calculator. I have also added a tag on the website so it stands out! ㅤ This was the first step in my todo list for this app."}, {"post_id": 18061, "ts": "2026-06-29T01:28:52Z", "hours": 0.3028, "text": "So this is more of a self-reflection of what I have done and what there is to do. Outside of coding So, I had previously left this app public for a long time (like a year) hoping that players would just somehow find it naturally, but it turns out that’s not how the world works. So I sent it to the discord server (mentioned earlier). Now I also sent as a reddit post and it got lots of traction, quickly becoming #1 post of the day. So clearly, what I’m doing is good and is solving the problem. What is there left to do So I got my friend who plays this game and never saw the calculator before try it and I quickly realized that the website is not very intuitive at all. I need to make a better tutorial (one where it shows where you should click, etc). ㅤ There are also some minor things I have on there that made sense when I was coding it, but now that I think of it don’t make sense at all (like the hp field and how it handles non percentage values). Not only that, but there are many quality of life features, like if you set the doctrine of the first item, it set the default doctrine to that one for everything following it. Also the “Your” stack and “Enemy” stacks should be color coded, and more info should be displayed as icons rather than text. ㅤ Also, devs added a new Sniper unit to the game, and I forgot to include flame tanks and amphibious tanks in my calculator. Overall, the app is basically done, just need to add the final touches that will make this truly helpful for anyone. ㅤ Summary of things to do (this is supposed to be a task list, but stardance formatting is not working): Add Sniper, Flame Tank, and Amphibious Tank Color Code “Your” and “Enemy” stacks Display more info as icons rather than text (such as doctrines, unit levels, etc) Set the default doctrine after one has been added to a stack Make the HP field make more sense And finally, the big task: Make a tutorial that really holds the player’s hand for the initial bit, so that they know what to do afterwards. So with that I will start on this transformation!"}, {"post_id": 15026, "ts": "2026-06-24T12:30:40Z", "hours": 0.3525, "text": "For this devlog, I just updated the tutorial to be more specific and have better wording. I also adjusted the UI of it so that it has a scrollbar, if not enough vertical room, etc."}, {"post_id": 12755, "ts": "2026-06-20T21:09:08Z", "hours": 2.7169, "text": "So I sent this app to the Call of War discord server and the overall feedback was pretty positive! It’s just that there was one complaint that came again and again: there is no mobile support! I had completely forgotten about that somehow, so I set out to change that in this devlog. I did the following in this devlog: added whole new way to edit unit lists, which better suits mobile made the UI on mobile look better"}]...
|
Title: CoW Calc by @superheroyrr | Stardance
Devl Title: CoW Calc by @superheroyrr | Stardance
Devlogs:
So I sent this app to the Call of War discord server and the overall feedback was pretty positive! It’s just that there was one complaint that came again and again: there is no mobile support! I had completely forgotten about that somehow, so I set out to change that in this devlog. I did the following in this devlog: added whole new way to edit unit lists, which better suits mobile made the UI on mobile look better
For this devlog, I just updated the tutorial to be more specific and have better wording. I also adjusted the UI of it so that it has a scrollbar, if not enough vertical room, etc.
So this is more of a self-reflection of what I have done and what there is to do. Outside of coding So, I had previously left this app public for a long time (like a year) hoping that players would just somehow find it naturally, but it turns out that’s not how the world works. So I sent it to the discord server (mentioned earlier). Now I also sent as a reddit post and it got lots of traction, quickly becoming #1 post of the day. So clearly, what I’m doing is good and is solving the problem. What is there left to do So I got my friend who plays this game and never saw the calculator before try it and I quickly realized that the website is not very intuitive at all. I need to make a better tutorial (one where it shows where you should click, etc). ㅤ There are also some minor things I have on there that made sense when I was coding it, but now that I think of it don’t make sense at all (like the hp field and how it handles non percentage values). Not only that, but there are many quality of life features, like if you set the doctrine of the first item, it set the default doctrine to that one for everything following it. Also the “Your” stack and “Enemy” stacks should be color coded, and more info should be displayed as icons rather than text. ㅤ Also, devs added a new Sniper unit to the game, and I forgot to include flame tanks and amphibious tanks in my calculator. Overall, the app is basically done, just need to add the final touches that will make this truly helpful for anyone. ㅤ Summary of things to do (this is supposed to be a task list, but stardance formatting is not working): Add Sniper, Flame Tank, and Amphibious Tank Color Code “Your” and “Enemy” stacks Display more info as icons rather than text (such as doctrines, unit levels, etc) Set the default doctrine after one has been added to a stack Make the HP field make more sense And finally, the big task: Make a tutorial that really holds the player’s hand for the initial bit, so that they know what to do afterwards. So with that I will start on this transformation!
So for this devlog, I have just added the Sniper, Flame Tank, and Amphibious Tank units that were previously missing from the calculator. I have also added a tag on the website so it stands out! ㅤ This was the first step in my todo list for this app.
So I have now color coded the enemy and allied nodes to be red and blue respectively in the node editor. ㅤ This makes it much easier to use the calculator if you have a lot of stacks here.
So I added much better a much better slider system for inputting the hp of each unit. This system is much more intuitive and easy to understand than the previous one. ㅤ On the way, I learned about the ch unit in CSS , which was what I used to set the width of the number input with the up and down arrows. ㅤ Now you might be like “how did it take 1hr 41min to just do that??” So basically, I went through 2 prototypes to get to this point, and it’s been so long since I did web development, I ran into freaking syntax errors slowing me down!!! ㅤ Also, along with this change, I found a bunch of places where there were bad coding practices, like basically having copy pasted code with just a small change between them. Because this is bad practice, I felt obliged to fix them. Again, those syntax errors slowed me down on this part as well. ㅤ But tbh, yeah it should NOT have taken this long to finish this feature, but at least it created an improvement! Conclusion This was one of the things my friend told me I should fix up, and so I did, now there are only 3 other things I decided I would do before considering this project to be done. They are: the default doctrine being selected information displayed as icons instead of text the big thing: a proper tutorial I am closing in on the finish line, I can feel it!
So I have finished the doctrine thing today, this makes the website more convenient to use since it is VERY likely that all units in a stack are the same doctrine. Previously you would have had to set the doctrine for EVERY single unit if it wasn’t all Allies doctrine. I made the level and quantity inputs smaller, so that the doctrine selector can take up more space and it actually displays the full name with out the “…” ㅤ Now what’s next is: trying to display more iconography, and the tutorial!!
So now I have added iconography to make the website less text-heavy and more visually appealing. It’s not a lot but it really makes things better ㅤ Now the only thing left is the tutorial!
It turns out that the Call of War devs added another new unit to the game: Marines. So I quickly added its data to the website. Now it can be used for calculations
So it turns out there is also level 2 and level 3 marines and snipers, along with level 2 flame tanks that exist in the game, which I didn’t realize earlier. ㅤ So in this session, I added those pieces of data to the app, and they can be used in calculations now. Holy this required 2,400 lines of code apparently ㅤ (I used the script at src/data/units/synthesiser.ts to estimate the statistics of the other doctrines, since I don’t have access to them, it’s usually pretty accurate with the predictions so it should be fine). ㅤ Now I will work on the tutorial tomorrow and I should be done with this!
I just finished this really cool interactive tutorial!! ㅤ I’ll be honest, I vibe coded like 80% of this part, than made various tweaks and changed the wording of the different steps so that they make more sense (at one point Claude literally called the doctrines “numbers” lol if you played this game, you would know that they are NOT numbers. FYI they are the “Allies/Comintern/Axis/Pan-Asian” drop downs). ㅤ Somehow, I was able to get that 80% done with just the free tier of the Claude web app chat. It was REALLY annoying because I kept running into usage limits, which is why it took this long to make. If someone could suggest some other tool that’s free and is much easier that would be appreciated. ㅤ What’s really crazy is that I was able to just give it the link to the github repo, told it to make an interactive tutorial and it just started working on it, that too on the free tier! It was very surprising how good a result it created from the first go and how much critical thinking it showed. Now, I did say that I would be done with this once I made the tutorial, but I really want to do some other small things first and also add information about how to report bug/give feedback on the website. Also, someone on the game’s discord server pointed out what might be a bug, or a flaw in the app so I should fix that as well. ㅤ Jeez, I’ve been telling myself “oh wow, I’m so close, I should be able to finish it today” for what feels like a week now, but seriously, I should be done with this today or tomorrow. (hopefully I didn’t jinx it again).
So for this devlog, I added information about how to report bugs and give feature requests. It is pretty low-tech, but it gets the job done. ㅤ I also made the handle bars of the connections page on mobile bigger, so it isn’t as annoying to use.
Ok so now I fixed that bug which the guy from discord was talking about (at least probably). The problem they had was that when switching between the connections page and the main page, it would sometimes clear out all of the entered information. ㅤ This problem was not occurring for me or my friend, so I was a bit confused on why this could be. After a bit of research (basically talking to my friend gemini), it turns out that the previous method I was using for this, React.js context , was not designed for this use case and is fairly fragile about the data it holds. ㅤ A simple refresh will clear out the data, and sometimes mobile browsers can aggressively do this. The person who reported the bug was also one of the people who asked for mobile support, so they were probably on mobile and it happened. For some reason, my phone wouldn’t cause this to happen so I didn’t catch that bug. ㅤ So now, instead of React.js’s context api, I swapped to using the browser’s sessionStorage api , which is supposed to be much more reliable and also keeps the data intact after a fully refresh! I will now ask that guy if the problem is fixed.
So immediately after deploying the previous change there was a simple type error that made the whole thing fail 🤦♂️. This could have been easily avoided if I just ran npm run build before pushing, I think I will do that from now on. ㅤ I also added a button on the connections page to go back to the main page, I had to go through 2 deployments for this change as well because on the first attempt, I accidentally put the button underneath the tutorial button on mobile lol. ㅤ At the very least, I feel confident that this project is complete enough to be submitted now, I am really excited to move on to another cooler project.
Flashback to when I said: At the very least, I feel confident that this project is complete enough to be submitted now… Yeah clearly that did NOT happen. ㅤ So I tried using my own app for its intended purpose on my own, and I ran into a crazy weird bug: sometimes when switching between the main page and connection page, it would duplicate the units that were selected. ㅤ What’s weirder is that it seemed to only affect the enemy units and not the your list… ㅤ It took me about 2 hours of debugging (unfortunately most of which was on Chrome DevTools debugger, so it didn’t count for stardance 😞) to finally find out the root cause. ㅤ The root cause was in how React.js handles refreshing data. So basically, whenever the data in my program changes (ie: the user hits next or start calculation on the connections page), it gets saved to the sessionStorage, after being processed into certain format. It saved the “your” unit lists then the “enemy” unit lists to the sessionStorage. ㅤ In the function that saves it to the sessionStorage, it has a local variable that is supposed to have the current data, which is normal. How it works is that the it sort of takes local variable and overrides the specific changes on top of it, then saves the whole thing to sessionStorage. ㅤ However, because it was using a React method to get the current data, it doesn’t immediately update itself, only updates when a new frame is drawn to the screen… So when the higher level code then tried to save the your unit list, the local variable was out of date, and applied the changes on top of an out of date data and then saved that to the sessionStorage. ㅤ This caused problems when switching between tabs since sessionStorage is the lifeline of the communication between them. I got around this problem by basically saving all of the data in one go instead of saving one part then the next part. ㅤ This was very frustrating to debug by myself but it feels rewarding now that I’ve done it. NOW I will submit this. My family is starting a roadtrip tomorrow morning so I won’t be able to code for a few days, I really want to get this off my plate before then. ㅤ Here’s my debugging setup I used for this:
Ships:
So here’s a summary of what I’ve done: CoW Calc is a battle calculator for the browser strategy game Call of War. The game involves complex battles between stacks of military units with different stats, doctrines, and HP values. Doing that math by hand mid-game is genuinely painful, sure as you get more experience you start to know automatically, but there will still be times when you aren’t sure. CoW Calc makes it fast and visual. The biggest challenge was making it approachable for players who’d never seen it before. My friend tried it cold and got completely lost, so I rebuilt the onboarding from scratch into an interactive guided tour that walks you through your first calculation step by step. I’m most proud of the community response. I posted it to r/CallOfWar and it hit #1 post of the day, and the Discord feedback directly shaped what I built next (mobile support was the #1 request and previously didn’t exist at all). To test it if you don’t play Call of War: The tutorial will walk you through everything. For a quick demo after the tutorial: imagine you’re attacking with 3 Infantry (level 1, Comintern doctrine, 100% HP) against 2 Artillery (level 1, Allies doctrine, 90% HP). Add those units to each side using the unit list, connect them on the battle map, and hit calculate. The website will show the predicted results, which are usually pretty accurate. You don’t need to know the game — the calculator applies its game knowledge for you....
|
1793292490.2612865
|
1793378890.2612865
|
|
22105
|
Alla Skriv by @Sabrina | Stardance
|
Sabrina
|
1
|
3.0
|
40
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-19T03:24:35Z", "hours": 3.0, "multiplier": 12.02, "payout": 40, "blessing": "neutral", "text": "I made a 1920x1080 pixel canvas that is synced with everyone else online! I’m particularly proud of the settings menu when you rigth click since i had to prevent the default thing and then figure out how to recreate the menu via divs and stuff. my favorite aspect of it is making it disappear if your mouse leaves it’s area Features: You can draw If you right click you can change settings like brush size, color, and if youre using a marker or pencil Ctrl+Z to undo a stroke, or use the settings menu to click the undo button Your drawing and every elses are synced together", "repo": "https://github.com/BoomBoomMushroom/EveryoneCanvas", "demo": "https://alla-skriv.netlify.app/"}]...
|
[{"post_id": 11732, "ts": "202 [{"post_id": 11732, "ts": "2026-06-19T03:19:39Z", "hours": 1.245, "text": "I made the server and it gets each time the client adds or removes their canvas stroke, and then it syncs your strokes with everyone else!"}, {"post_id": 11698, "ts": "2026-06-19T01:51:38Z", "hours": 2.1264, "text": "ive got the entire client working! with a custom right click menu and everything. plus ctrl+z support Now ive gotta work on: Server websocket Client sending their drawings Server syncing other clients drawings to each other"}]...
|
Title: Alla Skriv by @Sabrina | Stardance
Devlogs Title: Alla Skriv by @Sabrina | Stardance
Devlogs:
ive got the entire client working! with a custom right click menu and everything. plus ctrl+z support Now ive gotta work on: Server websocket Client sending their drawings Server syncing other clients drawings to each other
I made the server and it gets each time the client adds or removes their canvas stroke, and then it syncs your strokes with everyone else!
Ships:
I made a 1920x1080 pixel canvas that is synced with everyone else online! I’m particularly proud of the settings menu when you rigth click since i had to prevent the default thing and then figure out how to recreate the menu via divs and stuff. my favorite aspect of it is making it disappear if your mouse leaves it’s area Features: You can draw If you right click you can change settings like brush size, color, and if youre using a marker or pencil Ctrl+Z to undo a stroke, or use the settings menu to click the undo button Your drawing and every elses are synced together...
|
1793267617.1616163
|
1793354017.1616163
|
|
22111
|
Scrapbook maker by @kk_vun | Stardance
|
kk_vun
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-19T18:28:34Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a Saturn V rocket with fusion 360 NASA PLS Hire me also check out my scrapbook maker", "repo": "https://github.com/kkv-lang/Gallery-maker", "demo": "https://kkv-lang.github.io/Gallery-maker/"}]...
|
[{"post_id": 11735, "ts": "202 [{"post_id": 11735, "ts": "2026-06-19T03:24:16Z", "hours": 0.2867, "text": "Yo guys I finished my Saturn V rocket I used fusion 360 and I added a Decal to it (NASA if you are reading this pls hire me also (PLS PLS PLS vote for me I need the macbook for my physics olympiad!) Also I added some caption searches to my scrapbook maker so check that out if you want but NASA my offer ends next week."}, {"post_id": 11725, "ts": "2026-06-19T02:59:14Z", "hours": 0.3092, "text": "Guys I created a rocket like saturn V in fusion 360 this is what I had at phase one also creat your own scrapebooks using this (pls like i need a new laptop for my competitions)"}]...
|
Title: Scrapbook maker by @kk_vun | Stardance
Dev Title: Scrapbook maker by @kk_vun | Stardance
Devlogs:
Guys I created a rocket like saturn V in fusion 360 this is what I had at phase one also creat your own scrapebooks using this (pls like i need a new laptop for my competitions)
Yo guys I finished my Saturn V rocket I used fusion 360 and I added a Decal to it (NASA if you are reading this pls hire me also (PLS PLS PLS vote for me I need the macbook for my physics olympiad!) Also I added some caption searches to my scrapbook maker so check that out if you want but NASA my offer ends next week.
Ships:
I made a Saturn V rocket with fusion 360 NASA PLS Hire me also check out my scrapbook maker...
|
1793141670.4807718
|
1793228070.4807718
|
|
22112
|
CalcOS by @pranay | Stardance
|
pranay
|
1
|
16.67
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-11T01:24:28Z", "hours": 12.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hi everyone! I made a WebOS that is themed around calculators. From naming to what apps do, I tried to take inspiration from how calculators do it. Features: Ability to have multiple windows of the same app (done through IDs and cloning HTML) The Operator: a calculator and search bar that controls the operating system (click the mouse-following calculator icon in the top left) Live math evaluation in the Operator/calculator (thanks to math.js) Ability to search for apps in the Operator Window management through the four basic operator icons (+, -, ×, ÷) in the middle of the top bar Calculation history storage via localStorage The Root app: a file explorer for browsing calculation history and installed apps For the second ship, I want to add functionality to the M+ button in the top bar, so that it shows clipboard history and current open windows. Roadblocks: Module scoping for the JavaScript files was probably the most annoying thing in the project. Functions defined in type=“module” scripts were invisible to onclick attributes in HTML, so a ReferenceError would occur every time a button was clicked. It took me so long to figure out that you had to expose functions via window.functionName. Another issue I had was with my window manager system. I had to add ID’s to every duplicated window (since apps can have multiple windows open). This got really frustrating because every time I wanted to edit attributes of a certain window using JavaScript, I needed that window ID. The logic for retrieving that ID took me a while to figure out. Proud Of: Though that window manager that caused me so many bugs, I am so proud of how it turned out. Figuring out the logic for it took a long time, but it was mostly fun. I’m also proud of how I handle new apps. Instead of having to add all that app’s code into index.html or having to change a ton of JavaScript to account for that new app, my project automatically accounts for new apps based on .html files in the “apps” folder. Thank you for going through my ship and have a great day!!", "repo": "https://github.com/helloGithub326/CalcOS", "demo": "https://hellogithub326.github.io/CalcOS/"}]...
|
[{"post_id": 35265, "ts": "202 [{"post_id": 35265, "ts": "2026-07-26T15:51:38Z", "hours": 1.7169, "text": "Devlog 07 So I might have gotten sidetracked from the settings app cause it’s such a boring app to work on. Instead, I started working on the unit circle/calendar app. I thought it would be a good idea to combine those two to make the calendar app interesting. However, since there are 365 days and only 360 degrees, I’m going to combine 6 days (probably the week of pi day) into one SUPER PI DAY or some other name. To draw the circle, I’m using an HTML canvas element. I’m learning that it’s actually a really cool element, but obviously not as cool as a div element."}, {"post_id": 34997, "ts": "2026-07-26T04:29:13Z", "hours": 2.0306, "text": "Devlog 06 Unfortunately, I couldn’t get the clipboard history to come up in the M+ panel. Instead, I made a system stats counter (image one). I know, it’s not as useful and it has some pretty lame stats right now. I can’t fix the useful part, but I will try to make the stats more fun/interesting by the next devlog (which hopefully won’t take a week this time). Anyway, I also started working on the settings app (image two). The “update” buttons don’t do anything right now, but they will soon. Thank you for reading through this devlog and have a great day!!"}, {"post_id": 30817, "ts": "2026-07-18T19:00:34Z", "hours": 0.9231, "text": "Devlog 05 A pretty small devlog today. Just got the M+ button working with the currently open windows. The problem with the clipboard history is that I have to get website permission from the user to do that. I don’t really know how to do that, so I’ll work on that either later today or tomorrow."}, {"post_id": 26288, "ts": "2026-07-11T00:13:05Z", "hours": 3.2319, "text": "Devlog 04 - Browse your FILES Finished I wrote instructions on how to use the operating system in the Welcome app. Also, as I said I will last time, I made an app. It’s called Root because “root directory” and the math term “root”. It’s not the best name ever, but it’s good enough. Speaking of names, for the calculator/search thingy, I picked the name Operator cause it controls a lot of the OS. Next Up Now, I’m going to ship this OS. Then, I’ll work on the M+ button (the clipboard manager and app switcher for the operating system), the math store idea where you can download apps for different math things, and a settings app for customization."}, {"post_id": 25136, "ts": "2026-07-09T05:01:17Z", "hours": 3.5792, "text": "Devlog 03 - FINALLY the MATH Finished Last time, I said I was going to make more apps before I do the calculator. However, the calculator seemed way more fun than random math-related apps, so that’s exactly what I worked on. As you can see in the images, you can now do math in the calculator searchbar thingy (still need a name for it), and you can search for apps. Next This time, for real, I’m going to make more apps. I’m probably going to start with a file explorer that shows previous math calculations as files. After I’m done making a couple of apps, I’ll work on the clipboard (the M+ button from my previous devlogs). Once both of those are done, the OS should be ready to ship, and for my second ship of the OS, I want to make the math store and add customization."}, {"post_id": 19511, "ts": "2026-06-30T20:45:36Z", "hours": 1.2036, "text": "Devlog 02 - All the windows you want It’s been way too long since my previous devlog. Finished You can now create multiple windows of the same app (as you can see in the image) by clicking the × symbol at the top. I created an “apps” folder in my project to store HTML files, and each file contains a single div that holds an entire app. This setup should simplify developing more apps in the future since all I have to do is create an html file in that folder. This new system of making apps meant that I had to change the loading app logic in script.js, but luckily, it wasn’t that different to the previous logic. Selected windows now actually look different when compared to unselected windows. It took me a while to figure out how to do that CSS effect, so hopefully that was worth it. Next Now, I’m going to work on actually making good looking apps that have more than just text in them. Then, I will on the calculator search menu that will eventually control the entire operating system. Still not completely sure how that’s going to work though."}, {"post_id": 13371, "ts": "2026-06-21T22:05:24Z", "hours": 3.6086, "text": "Devlog 01 Finished A top bar (inspired by MacOS) M+ will be the clipboard manager Four operations (+/-/x/÷) at the center of the top bar; these control the selected window +: maximizes the window -: hides the window x: creates a new window for the selected app ÷: quits the selected app Window manager logic that allows multiple windows of the same app (by duplication html and using IDs for each window) Future Plans The main calculator menu (like a search bar, but a calculator and everything in the operating system will be controlled from here) A file explorer to look back at previous calculations (history files) A math store (app store) to install higher levels of math; I don’t know what the higher levels of math will be used for in the OS, but yeah Note divs have to be the best component in html"}]...
|
Title: CalcOS by @pranay | Stardance
Devlogs:
Dev Title: CalcOS by @pranay | Stardance
Devlogs:
Devlog 01 Finished A top bar (inspired by MacOS) M+ will be the clipboard manager Four operations (+/-/x/÷) at the center of the top bar; these control the selected window +: maximizes the window -: hides the window x: creates a new window for the selected app ÷: quits the selected app Window manager logic that allows multiple windows of the same app (by duplication html and using IDs for each window) Future Plans The main calculator menu (like a search bar, but a calculator and everything in the operating system will be controlled from here) A file explorer to look back at previous calculations (history files) A math store (app store) to install higher levels of math; I don’t know what the higher levels of math will be used for in the OS, but yeah Note divs have to be the best component in html
Devlog 02 - All the windows you want It’s been way too long since my previous devlog. Finished You can now create multiple windows of the same app (as you can see in the image) by clicking the × symbol at the top. I created an “apps” folder in my project to store HTML files, and each file contains a single div that holds an entire app. This setup should simplify developing more apps in the future since all I have to do is create an html file in that folder. This new system of making apps meant that I had to change the loading app logic in script.js, but luckily, it wasn’t that different to the previous logic. Selected windows now actually look different when compared to unselected windows. It took me a while to figure out how to do that CSS effect, so hopefully that was worth it. Next Now, I’m going to work on actually making good looking apps that have more than just text in them. Then, I will on the calculator search menu that will eventually control the entire operating system. Still not completely sure how that’s going to work though.
Devlog 03 - FINALLY the MATH Finished Last time, I said I was going to make more apps before I do the calculator. However, the calculator seemed way more fun than random math-related apps, so that’s exactly what I worked on. As you can see in the images, you can now do math in the calculator searchbar thingy (still need a name for it), and you can search for apps. Next This time, for real, I’m going to make more apps. I’m probably going to start with a file explorer that shows previous math calculations as files. After I’m done making a couple of apps, I’ll work on the clipboard (the M+ button from my previous devlogs). Once both of those are done, the OS should be ready to ship, and for my second ship of the OS, I want to make the math store and add customization.
Devlog 04 - Browse your FILES Finished I wrote instructions on how to use the operating system in the Welcome app. Also, as I said I will last time, I made an app. It’s called Root because “root directory” and the math term “root”. It’s not the best name ever, but it’s good enough. Speaking of names, for the calculator/search thingy, I picked the name Operator cause it controls a lot of the OS. Next Up Now, I’m going to ship this OS. Then, I’ll work on the M+ button (the clipboard manager and app switcher for the operating system), the math store idea where you can download apps for different math things, and a settings app for customization.
Devlog 05 A pretty small devlog today. Just got the M+ button working with the currently open windows. The problem with the clipboard history is that I have to get website permission from the user to do that. I don’t really know how to do that, so I’ll work on that either later today or tomorrow.
Devlog 06 Unfortunately, I couldn’t get the clipboard history to come up in the M+ panel. Instead, I made a system stats counter (image one). I know, it’s not as useful and it has some pretty lame stats right now. I can’t fix the useful part, but I will try to make the stats more fun/interesting by the next devlog (which hopefully won’t take a week this time). Anyway, I also started working on the settings app (image two). The “update” buttons don’t do anything right now, but they will soon. Thank you for reading through this devlog and have a great day!!
Devlog 07 So I might have gotten sidetracked from the settings app cause it’s such a boring app to work on. Instead, I started working on the unit circle/calendar app. I thought it would be a good idea to combine those two to make the calendar app interesting. However, since there are 365 days and only 360 degrees, I’m going to combine 6 days (probably the week of pi day) into one SUPER PI DAY or some other name. To draw the circle, I’m using an HTML canvas element. I’m learning that it’s actually a really cool element, but obviously not as cool as a div element.
Ships:
Hi everyone! I made a WebOS that is themed around calculators. From naming to what apps do, I tried to take inspiration from how calculators do it. Features: Ability to have multiple windows of the same app (done through IDs and cloning HTML) The Operator: a calculator and search bar that controls the operating system (click the mouse-following calculator icon in the top left) Live math evaluation in the Operator/calculator (thanks to math.js) Ability to search for apps in the Operator Window management through the four basic operator icons (+, -, ×, ÷) in the middle of the top bar Calculation history storage via localStorage The Root app: a file explorer for browsing calculation history and installed apps For the second ship, I want to add functionality to the M+ button in the top bar, so that it shows clipboard history and current open windows. Roadblocks: Module scoping for the JavaScript files was probably the most annoying thing in the project. Functions defined in type=“module” scripts were invisible to onclick attributes in HTML, so a ReferenceError would occur every time a button was clicked. It took me so long to figure out that you had to expose functions via window.functionName. Another issue I had was with my window manager system. I had to add ID’s to every duplicated window (since apps can have multiple windows open). This got really frustrating because every time I wanted to edit attributes of a certain window using JavaScript, I needed that window ID. The logic for retrieving that ID took me a while to figure out. Proud Of: Though that window manager that caused me so many bugs, I am so proud of how it turned out. Figuring out the logic for it took a long time, but it was mostly fun. I’m also proud of how I handle new apps. Instead of having to add all that app’s code into index.html or having to change a ton of JavaScript to account for that new app, my project automatically accounts for new apps based on .html files in the “apps” folder. Thank you for going through my ship and have a great day!!...
|
1793260289.8397508
|
1793346689.8397508
|
|
22131
|
PencilOS by @hen | Stardance
|
hen
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-28T00:34:31Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "My first iteration of PencilOS, made with the guide in WebOS 1. The idea behind this was originally to draw things on paper and then upload it, but I decided to digitally draw icons instead so brush sizing and colors were more consistent.", "repo": "https://github.com/hen43/pencil-os", "demo": "https://pencil-os.vercel.app/"}]...
|
[{"post_id": 17272, "ts": "202 [{"post_id": 17272, "ts": "2026-06-28T00:11:34Z", "hours": 0.4692, "text": "The opinions of our customers are very important. Especially if it includes raw, unfiltered rage. You are now able to give feedback through the Github Issues page."}, {"post_id": 17245, "ts": "2026-06-27T23:23:58Z", "hours": 1.41, "text": "made an openable and closable app icon"}, {"post_id": 12448, "ts": "2026-06-20T09:43:53Z", "hours": 1.1642, "text": "1-Hour prototype– The window on the right is draggable and closable."}]...
|
Title: PencilOS by @hen | Stardance
Devlogs:
1-Ho Title: PencilOS by @hen | Stardance
Devlogs:
1-Hour prototype– The window on the right is draggable and closable.
made an openable and closable app icon
The opinions of our customers are very important. Especially if it includes raw, unfiltered rage. You are now able to give feedback through the Github Issues page.
Ships:
My first iteration of PencilOS, made with the guide in WebOS 1. The idea behind this was originally to draw things on paper and then upload it, but I decided to digitally draw icons instead so brush sizing and colors were more consistent....
|
1793249477.070427
|
1793335877.070427
|
|
22178
|
Analyser by @dsita3465 | Stardance
|
dsita3465
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-19T08:41:25Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "An Analyser where you can do the Visulaization of the CSV and teh Excel Format that is there.", "repo": "https://github.com/DSITAGMAILCOM/Hello_all_Coder", "demo": "https://helloallcoder-bmjbtdfcm9naqn9hvxqecb.streamlit.app/"}]...
|
[{"post_id": 11841, "ts": "202 [{"post_id": 11841, "ts": "2026-06-19T08:39:53Z", "hours": 0.8039, "text": "An Analyser where you can do the Visualization of your datasets in the CSV or Excel format that is there."}]...
|
Title: Analyser by @dsita3465 | Stardance
Devlogs Title: Analyser by @dsita3465 | Stardance
Devlogs:
An Analyser where you can do the Visualization of your datasets in the CSV or Excel format that is there.
Ships:
An Analyser where you can do the Visulaization of the CSV and teh Excel Format that is there....
|
1793274790.4370997
|
1793361190.4370997
|
|
22182
|
test project by @nullskulls | Stardance
|
nullskulls
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-19T05:08:52Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i vibe coded this project", "repo": "https://github.com/hackclub/shipwrights/", "demo": ""}]...
|
[{"post_id": 11776, "ts": "202 [{"post_id": 11776, "ts": "2026-06-19T05:07:30Z", "hours": 6.0039, "text": "test project please ignore"}]...
|
Title: test project by @nullskulls | Stardance
De Title: test project by @nullskulls | Stardance
Devlogs:
test project please ignore
Ships:
i vibe coded this project...
|
1793134421.7908201
|
1793220821.7908201
|
|
22203
|
TejOS by @yadavtejas1947 | Stardance
|
yadavtejas1947
|
1
|
8.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-18T11:41:22Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I got lots of help from the guide so shout out to Amber for making that guide. The most challenging part was the CSS because I really don’t like CSS. Tweaking stuff, borders, and padding was quite difficult. I’m really proud. People should test my project in any kind of way they want and give me a review.", "repo": "https://github.com/yadavtejas1947-eng/TejOS", "demo": "https://tejos.onrender.com/"}]...
|
[{"post_id": 80641, "ts": "202 [{"post_id": 80641, "ts": "2026-10-18T11:38:04Z", "hours": 0.4567, "text": "Final tweaks and checks before the ship.."}, {"post_id": 33582, "ts": "2026-07-23T17:00:41Z", "hours": 2.8411, "text": "Day - 04 : 23-07-2026 After a quite a long break I restarted work on this project . Today I made some significant changes to the OS. First of all I add a draggable window to the OS , which is essentially a welcome screen which opens up whenever to start the OS . I was working on this feature some past 2-3days but couldn’t finish it together . So , Today I did that . Also I made that window closeable and openable which was a headache , because I don’t know JavaScript so I had to go through tutorials and Claude to help me fix every bug . So , that’s it for today ."}, {"post_id": 28469, "ts": "2026-07-14T18:36:19Z", "hours": 0.9064, "text": "Day - 03 : 15-07-2026 Today I didn’t made a significant progress but still managed to make the best out of my time. Firstly I added a better wallpaper for my OS , added a bottom bar and styled it a little , added a proper functioning clock and date which refreshes every second , I made it using basic JavaScript(JS)."}, {"post_id": 27842, "ts": "2026-07-13T18:42:39Z", "hours": 1.2642, "text": "Day -02 : 14-07-2026 I know their is a very significant gap between my first and second devlog of this project , that is because I had to travel out of town for two weeks , I promise myself that I’ll be consistent from today.. So , nothing much progress ,just added a topbar , added translucency to it and fixed my broken CSS code and rewrite the whole CSS script , so it took a lot of my time. The biggest challenge I face while working on websites is that I don’t understand the positioning and placement of divs , I’ll take a tutorial before working from tomorrow ….."}, {"post_id": 16893, "ts": "2026-06-27T12:47:19Z", "hours": 2.5186, "text": "Day - 01 : 27-06-2026 Today was the first day of building my own OS . First I revised over some basic HTML and CSS concepts because I haven’t touched these since 2024 . Then following the tutorial I made the basic page , added some image , fonts , background color and borders. I struggled with the CSS at first but then I managed to make the basic page in about 1hr 30mins , I know its a lot but going over StackOverflow , Youtube , Chatgpt , Claude takes time . I didn’t copied the code , just understood and then applied it into my project. So this was it for today ThankYou……"}]...
|
Title: TejOS by @yadavtejas1947 | Stardance
Devlo Title: TejOS by @yadavtejas1947 | Stardance
Devlogs:
Day - 01 : 27-06-2026 Today was the first day of building my own OS . First I revised over some basic HTML and CSS concepts because I haven’t touched these since 2024 . Then following the tutorial I made the basic page , added some image , fonts , background color and borders. I struggled with the CSS at first but then I managed to make the basic page in about 1hr 30mins , I know its a lot but going over StackOverflow , Youtube , Chatgpt , Claude takes time . I didn’t copied the code , just understood and then applied it into my project. So this was it for today ThankYou……
Day -02 : 14-07-2026 I know their is a very significant gap between my first and second devlog of this project , that is because I had to travel out of town for two weeks , I promise myself that I’ll be consistent from today.. So , nothing much progress ,just added a topbar , added translucency to it and fixed my broken CSS code and rewrite the whole CSS script , so it took a lot of my time. The biggest challenge I face while working on websites is that I don’t understand the positioning and placement of divs , I’ll take a tutorial before working from tomorrow …..
Day - 03 : 15-07-2026 Today I didn’t made a significant progress but still managed to make the best out of my time. Firstly I added a better wallpaper for my OS , added a bottom bar and styled it a little , added a proper functioning clock and date which refreshes every second , I made it using basic JavaScript(JS).
Day - 04 : 23-07-2026 After a quite a long break I restarted work on this project . Today I made some significant changes to the OS. First of all I add a draggable window to the OS , which is essentially a welcome screen which opens up whenever to start the OS . I was working on this feature some past 2-3days but couldn’t finish it together . So , Today I did that . Also I made that window closeable and openable which was a headache , because I don’t know JavaScript so I had to go through tutorials and Claude to help me fix every bug . So , that’s it for today .
Final tweaks and checks before the ship..
Ships:
I got lots of help from the guide so shout out to Amber for making that guide. The most challenging part was the CSS because I really don’t like CSS. Tweaking stuff, borders, and padding was quite difficult. I’m really proud. People should test my project in any kind of way they want and give me a review....
|
1793199156.3075511
|
1793285556.3075511
|
|
22204
|
My awesome macropad! by @Antara | Stardance
|
Antara
|
1
|
1.02
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-23T05:45:01Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built a custom 3-key macropad using the Seeed XIAO RP2040, designed from scratch using KiCad, Fusion 360, and KMK firmware. The project includes a custom PCB, a custom 3D-printable enclosure, and firmware that maps the three keys to common macOS shortcuts: Cmd + C (Copy) Cmd + V (Paste) Cmd + Z (Undo) One of the biggest challenges was learning the complete hardware workflow, including PCB design in KiCad, creating a case in Fusion 360, generating production files, and organizing the project for manufacturing. I also spent time configuring KMK firmware and setting up the project repository. I’m most proud of successfully designing every part of the project myself and producing a complete set of manufacturing files, firmware, documentation, and CAD models. To test the project, flash the KMK firmware to a Seeed XIAO RP2040, assemble the PCB with the switches, connect it to a computer via USB-C, and verify that the three keys perform Copy, Paste, and Undo shortcuts.", "repo": "https://github.com/Rare21ism/hackpad-macropad", "demo": ""}]...
|
[{"post_id": 14249, "ts": "202 [{"post_id": 14249, "ts": "2026-06-23T08:28:29Z", "hours": 1.0217, "text": "Completing the Hackpad Today I completed my 3-key Hackpad macropad. Finished Designed the enclosure in Fusion 360 Exported the STEP model Wrote KMK firmware Configured the keys: Cmd + C (Copy) Cmd + V (Paste) Cmd + Z (Undo) Organized the GitHub repository Added screenshots and documentation I’m happy that I was able to complete the PCB, case, firmware, and documentation for the project. The project is now ready for submission and manufacturing."}, {"post_id": 14183, "ts": "2026-06-23T05:28:40Z", "hours": 0.3339, "text": "Today I worked on the electronic design of my Hackpad project.I created the schematic in KiCad using the Seeed XIAO RP2040 and connected three mechanical switches for the macropad inputs. After verifying the schematic, I designed the PCB layout and arranged the components to keep the board compact and easy to assemble.I also generated the production files and reviewed the design before exporting the manufacturing outputs.Next, I will work on the enclosure and firmware."}]...
|
Title: My awesome macropad! by @Antara | Stardance Title: My awesome macropad! by @Antara | Stardance
Devlogs:
Today I worked on the electronic design of my Hackpad project.I created the schematic in KiCad using the Seeed XIAO RP2040 and connected three mechanical switches for the macropad inputs. After verifying the schematic, I designed the PCB layout and arranged the components to keep the board compact and easy to assemble.I also generated the production files and reviewed the design before exporting the manufacturing outputs.Next, I will work on the enclosure and firmware.
Completing the Hackpad Today I completed my 3-key Hackpad macropad. Finished Designed the enclosure in Fusion 360 Exported the STEP model Wrote KMK firmware Configured the keys: Cmd + C (Copy) Cmd + V (Paste) Cmd + Z (Undo) Organized the GitHub repository Added screenshots and documentation I’m happy that I was able to complete the PCB, case, firmware, and documentation for the project. The project is now ready for submission and manufacturing.
Ships:
I built a custom 3-key macropad using the Seeed XIAO RP2040, designed from scratch using KiCad, Fusion 360, and KMK firmware. The project includes a custom PCB, a custom 3D-printable enclosure, and firmware that maps the three keys to common macOS shortcuts: Cmd + C (Copy) Cmd + V (Paste) Cmd + Z (Undo) One of the biggest challenges was learning the complete hardware workflow, including PCB design in KiCad, creating a case in Fusion 360, generating production files, and organizing the project for manufacturing. I also spent time configuring KMK firmware and setting up the project repository. I’m most proud of successfully designing every part of the project myself and producing a complete set of manufacturing files, firmware, documentation, and CAD models. To test the project, flash the KMK firmware to a Seeed XIAO RP2040, assemble the PCB with the switches, connect it to a computer via USB-C, and verify that the three keys perform Copy, Paste, and Undo shortcuts....
|
1793224361.4261625
|
1793310761.4261625
|
|
22208
|
Personal Site by @secret | Stardance
|
secret
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-03T17:27:38Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "The site is finished. I tried to make it look as good as possible, only using HTML and CSS. I learned new things because I used AI much less than before, only using it when I got stuck on a small problem. I am satisfied with the results.", "repo": "https://github.com/dominik-vrg/personal-site", "demo": "https://dominik-vrg.github.io/personal-site/"}]...
|
[{"post_id": 21607, "ts": "202 [{"post_id": 21607, "ts": "2026-07-03T17:26:01Z", "hours": 2.0078, "text": "My Personal Site - devlog #1 I created a simple website using HTML and CSS only. It features 5 sections: a welcome header an “about me” section a “my team” section a “my favorite games” section and a copyright footer"}]...
|
Title: Personal Site by @secret | Stardance
Devlo Title: Personal Site by @secret | Stardance
Devlogs:
My Personal Site - devlog #1 I created a simple website using HTML and CSS only. It features 5 sections: a welcome header an “about me” section a “my team” section a “my favorite games” section and a copyright footer
Ships:
The site is finished. I tried to make it look as good as possible, only using HTML and CSS. I learned new things because I used AI much less than before, only using it when I got stuck on a small problem. I am satisfied with the results....
|
1793141269.2961519
|
1793227669.2961519
|
|
22214
|
Personal Website by @AlexGu | Stardance
|
AlexGu
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-01T17:53:38Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built a personal website using HTML and CSS. This was my first time learning front-end delopment and although I was a bit tricker to get a feel for the syntax at first, it was not as daunting as I initally expected! Overall, I am fairly satistfied with what I was able to put together and I hope to learn the JS aspect of web development in the future :)", "repo": "https://github.com/AlexGullish/Personal-Site", "demo": "https://alexgullish.github.io/Personal-Site/"}]...
|
[{"post_id": 20131, "ts": "202 [{"post_id": 20131, "ts": "2026-07-01T17:44:40Z", "hours": 0.3483, "text": "The CSS has been implemented!!! I am very pleased with how it turned out and I think I am about ready to deploy"}, {"post_id": 20116, "ts": "2026-07-01T17:17:42Z", "hours": 0.2672, "text": "I added an image and I have begun writing the CSS of my website!!! Once i am done with the CSS I will move on to deployment :)"}, {"post_id": 19697, "ts": "2026-07-01T02:44:46Z", "hours": 0.4461, "text": "I’ve written the raw HTML for my personal site. This is my first website but I was surprised by the simplicity of the basics. I will next start to write the CSS and maybe add some images and improve the layout!"}]...
|
Title: Personal Website by @AlexGu | Stardance
De Title: Personal Website by @AlexGu | Stardance
Devlogs:
I’ve written the raw HTML for my personal site. This is my first website but I was surprised by the simplicity of the basics. I will next start to write the CSS and maybe add some images and improve the layout!
I added an image and I have begun writing the CSS of my website!!! Once i am done with the CSS I will move on to deployment :)
The CSS has been implemented!!! I am very pleased with how it turned out and I think I am about ready to deploy
Ships:
I built a personal website using HTML and CSS. This was my first time learning front-end delopment and although I was a bit tricker to get a feel for the syntax at first, it was not as daunting as I initally expected! Overall, I am fairly satistfied with what I was able to put together and I hope to learn the JS aspect of web development in the future :)...
|
1793281801.7223148
|
1793368201.7223148
|
|
22215
|
Multi-Matrix by @Deva | Stardance
|
Deva
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-03T08:20:41Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built Multi-Matrix, an Arduino Nano powered 8 in 1 retro game arcade and digital multi-tool that runs motion controlled games and utilities on a single 8x8 LED matrix. The hardest part was optimization squashing instant I2C hardware freezes with a custom software timeout shield, implementing edge detection to stop capacitive touch pads from double triggering inputs, and tuning real time physics to feel smooth on a tiny pixel grid. It runs flawlessly on a custom code, letting you hot swap between all eight modes instantly using a 4-channel touch pad and a hardware capacitive touch Shift key.", "repo": "https://github.com/HyperBeast1551/Multi-Matrix", "demo": ""}]...
|
[{"post_id": 21332, "ts": "202 [{"post_id": 21332, "ts": "2026-07-03T06:54:33Z", "hours": 0.8192, "text": "Made the README.md as clean as possible. Checked for flaws and debugged the code. The project is nearly complete, only some minor patches are left."}, {"post_id": 18160, "ts": "2026-06-29T05:45:38Z", "hours": 0.3631, "text": "The coding part is now complete! Some amount of refinement/debugging is needed to make the code perfect."}, {"post_id": 17816, "ts": "2026-06-28T19:06:25Z", "hours": 1.4494, "text": "Completed the main loop. Added a MPU sensor helper profile. Started working on the Modes(0-7). The modes- compass(analogue/digital), Bowling game, Snake game and Flappy Dot game are finished. Next I’ll work on the modes 5-7."}, {"post_id": 17088, "ts": "2026-06-27T19:01:43Z", "hours": 1.3139, "text": "Started working on the Multi-Matix. Added an option to set the calibration offsets, defined game variables, made each individual Pixel graphics and also the graphics of the dice game, added the helper function and finished the initial Setup."}]...
|
Title: Multi-Matrix by @Deva | Stardance
Devlogs: Title: Multi-Matrix by @Deva | Stardance
Devlogs:
Started working on the Multi-Matix. Added an option to set the calibration offsets, defined game variables, made each individual Pixel graphics and also the graphics of the dice game, added the helper function and finished the initial Setup.
Completed the main loop. Added a MPU sensor helper profile. Started working on the Modes(0-7). The modes- compass(analogue/digital), Bowling game, Snake game and Flappy Dot game are finished. Next I’ll work on the modes 5-7.
The coding part is now complete! Some amount of refinement/debugging is needed to make the code perfect.
Made the README.md as clean as possible. Checked for flaws and debugged the code. The project is nearly complete, only some minor patches are left.
Ships:
I built Multi-Matrix, an Arduino Nano powered 8 in 1 retro game arcade and digital multi-tool that runs motion controlled games and utilities on a single 8x8 LED matrix. The hardest part was optimization squashing instant I2C hardware freezes with a custom software timeout shield, implementing edge detection to stop capacitive touch pads from double triggering inputs, and tuning real time physics to feel smooth on a tiny pixel grid. It runs flawlessly on a custom code, letting you hot swap between all eight modes instantly using a 4-channel touch pad and a hardware capacitive touch Shift key....
|
1793249294.6492798
|
1793335694.6492798
|
|
22261
|
Rocket Booster by @Danvir | Stardance
|
Danvir
|
1
|
5.0
|
58
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-21T09:07:10Z", "hours": 5.0, "multiplier": 12.68, "payout": 58, "blessing": "neutral", "text": "I built Rocket Booster, a physics-based game in Unity where players control a rocket using thrusters and rotation to navigate through obstacle-filled levels and reach the finish safely.The biggest challenge was implementing smooth rocket movement and balancing the controls so that flying felt responsive but still required skill. Fine-tuning the physics and obstacle layouts also took several iterations.I’m proud of creating smooth controls and a fun gameplay experience. Controls: Space = Boost, A = Left, D = Right.", "repo": "https://github.com/jsdjoker/RocketBooster", "demo": "https://danjs.itch.io/rocket-booster"}]...
|
[{"post_id": 13014, "ts": "202 [{"post_id": 13014, "ts": "2026-06-21T09:05:58Z", "hours": 1.9156, "text": "Finished the game with more levels and also with more obstacles and effect"}, {"post_id": 12422, "ts": "2026-06-20T08:33:55Z", "hours": 1.2069, "text": "created thrust effect and success effect!"}, {"post_id": 12034, "ts": "2026-06-19T17:04:37Z", "hours": 0.9122, "text": "added sound sfx to the game when player crash or get win and also changed skybox"}, {"post_id": 11903, "ts": "2026-06-19T12:15:24Z", "hours": 0.5342, "text": "Just created rocket movement and added audio thrusting!!"}]...
|
Title: Rocket Booster by @Danvir | Stardance
Devl Title: Rocket Booster by @Danvir | Stardance
Devlogs:
Just created rocket movement and added audio thrusting!!
added sound sfx to the game when player crash or get win and also changed skybox
created thrust effect and success effect!
Finished the game with more levels and also with more obstacles and effect
Ships:
I built Rocket Booster, a physics-based game in Unity where players control a rocket using thrusters and rotation to navigate through obstacle-filled levels and reach the finish safely.The biggest challenge was implementing smooth rocket movement and balancing the controls so that flying felt responsive but still required skill. Fine-tuning the physics and obstacle layouts also took several iterations.I’m proud of creating smooth controls and a fun gameplay experience. Controls: Space = Boost, A = Left, D = Right....
|
1793303770.0727737
|
1793390170.0727737
|
|
22354
|
Dev-Tools by @Pradhya | Stardance
|
Pradhya
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-05T16:12:06Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "So, what ive made is a tool that helps me (yes, mainly me because why not. You can use it too tho!!) develop my other stuff ie enclave messenger, and that has like a LOT of like repetitive stuff which i wanted to reduce likeee python3 ../dev-tools/sigh.py (yes its sigh.py not sign.py . i just wanted some fun tbh) and i plan to add a lot more stuff and improve my messenger so i added a lot of stuff i needed while making this and a clock. The challenging part was to like package this and like get it to pypi. Andddddd figure out what i wanted to do here. Like… idk D: Im proud that i managed to like package this and like get it to pypi so i can learn and like package my messenger properly when i redo it… soonnnnnnn The installation guide/process is in the readme.md or just run pipx install project-enclave-tools", "repo": "https://github.com/Project-Enclave/project-enclave-tools", "demo": "https://pypi.org/project/project-enclave-tools/"}]...
|
[{"post_id": 77075, "ts": "202 [{"post_id": 77075, "ts": "2026-10-05T15:49:26Z", "hours": 1.875, "text": "Added MORE HELPERS for stuff like Project init Diagnostic Changelog Version Release Asset Improved: Signing (that was the only thing i could improve t_t) Config management"}, {"post_id": 76080, "ts": "2026-10-02T08:36:34Z", "hours": 3.315, "text": "It fucking works! Added signing Need to add verification, upload to custom server, proper config file, etc Yay!"}]...
|
Title: Dev-Tools by @Pradhya | Stardance
Devlogs: Title: Dev-Tools by @Pradhya | Stardance
Devlogs:
It fucking works! Added signing Need to add verification, upload to custom server, proper config file, etc Yay!
Added MORE HELPERS for stuff like Project init Diagnostic Changelog Version Release Asset Improved: Signing (that was the only thing i could improve t_t) Config management
Ships:
So, what ive made is a tool that helps me (yes, mainly me because why not. You can use it too tho!!) develop my other stuff ie enclave messenger, and that has like a LOT of like repetitive stuff which i wanted to reduce likeee python3 ../dev-tools/sigh.py (yes its sigh.py not sign.py . i just wanted some fun tbh) and i plan to add a lot more stuff and improve my messenger so i added a lot of stuff i needed while making this and a clock. The challenging part was to like package this and like get it to pypi. Andddddd figure out what i wanted to do here. Like… idk D: Im proud that i managed to like package this and like get it to pypi so i can learn and like package my messenger properly when i redo it… soonnnnnnn The installation guide/process is in the readme.md or just run pipx install project-enclave-tools...
|
1793152173.79504
|
1793238573.79504
|
|
22380
|
student helper by @Dany_tag | Stardance
|
Dany_tag
|
1
|
10.3
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-04T17:36:34Z", "hours": 10.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a web app called Student Helper. It generates clear and structured topic summaries and helps students learn by guiding them through questions instead of giving direct answers. I built it especially for dyslexic students because I am dyslexic myself and I wanted a tool that actually works the way my brain does. The most challenging part was integrating Firebase for authentication and making the login work reliably with a free tier database that sometimes takes a moment to respond. Getting the app to automatically detect which AI provider to use just from the API key format was also a fun problem to solve. I am proud that the app supports three different AI providers, Anthropic, OpenAI and Groq, so anyone can use it with whatever key they have. I am also proud that it works in both Italian and English and that it is live online for anyone to try. Since the app never gives direct answers but only guides the student through reasoning, it can be used as a compensatory or dispensatory tool depending on the national regulations, the specific rules of your school, or the student’s IEP (Individualized Education Program), which is the personalized plan given to students with learning disabilities like dyslexia. It helps students work independently without replacing the learning process. To test it in english or italian go to https://student-hel-per.streamlit.app/ and create an account. You will need an API key from one of these three services: Anthropic, OpenAI or Groq. Once you are in, pick any topic and start asking questions.", "repo": "https://github.com/DanyyTag/Student-Helper", "demo": "https://student-hel-per.streamlit.app/"}]...
|
[{"post_id": 22302, "ts": "202 [{"post_id": 22302, "ts": "2026-07-04T18:13:16Z", "hours": 0.3011, "text": "It is done. Finally. After a lot of back and forth, fixing bugs, rewriting pieces, and testing everything over and over, Student Helper is now complete at least for this first version. The two biggest things in this update are the interface and the language support. The whole app has been cleaned up and optimized, everything reads better, feels more consistent, and works the way it should on any screen. Italian and English are both fully supported now, you switch from the sidebar and the entire app updates instantly every label, every message, every prompt the tutor uses. The login screen you see in the screenshot went through a few iterations too. The delay before showing an error was causing confusion people thought their credentials were wrong when the database just needed a moment to wake up. Fixed that. Now it waits before telling you anything, which means almost no false errors. The home screen is exactly what I wanted from the beginning. One field, one button, and then your summary appears clean and structured. No clutter, no distractions. Just the content you need, formatted in a way that actually works for dyslexic brains. This whole project started because I needed it myself. Building it taught me more than I expected Firebase integration, multi-provider API detection, bilingual interfaces, deployment. All things I had never done before. The app is live at https://student-hel-per.streamlit.app/ free to use, just bring your own API key from Anthropic, OpenAI or Groq."}, {"post_id": 22173, "ts": "2026-07-04T14:35:24Z", "hours": 9.3892, "text": "🎓 Student Helper — What’s New Hey everyone! Just some updates to Student Helper and wanted to share what changed Firebase Integration The app now uses Firebase for authentication and storage. What this means for you: Create an account with email and password Your API key gets saved once — no more pasting it every time Everything stored securely in the cloud Password Reset Forgot your password? No stress. New Reset Password tab on the login screen — enter your email, get a reset link straight to your inbox. English Support Student Helper now speaks two languages: Italian 🇮🇹 and English 🇬🇧 Switch anytime from the sidebar the whole interface updates instantly, including the AI tutor’s responses. That’s it for now! Built by a dyslexic student, for dyslexic students and everyone else Ideas? Open an issue on GitHub (DanyTagg)!"}, {"post_id": 12652, "ts": "2026-06-20T17:49:43Z", "hours": 0.3039, "text": "I am working on a project to help students study better. This project is special to me because I have dyslexia. I know how hard it can be to learn when you have dyslexia. The best part is that you can chose the ai modelThe project uses intelligence. It has two features:It can make clear and organized study notes, summaries and mind maps from documents or text.When a student asks for help the AI guides them step by step. It does not give the answer directly. Instead it helps students understand and find the solution themselves. The goal is to improve learning.I designed a logo for the project. I would love to hear what you think about it. Do you like it? Do you have any ideas to make the logo better? Do you have suggestions for features for the web app?Thanks, for your feedback! Byeee!"}]...
|
Title: student helper by @Dany_tag | Stardance
De Title: student helper by @Dany_tag | Stardance
Devlogs:
I am working on a project to help students study better. This project is special to me because I have dyslexia. I know how hard it can be to learn when you have dyslexia. The best part is that you can chose the ai modelThe project uses intelligence. It has two features:It can make clear and organized study notes, summaries and mind maps from documents or text.When a student asks for help the AI guides them step by step. It does not give the answer directly. Instead it helps students understand and find the solution themselves. The goal is to improve learning.I designed a logo for the project. I would love to hear what you think about it. Do you like it? Do you have any ideas to make the logo better? Do you have suggestions for features for the web app?Thanks, for your feedback! Byeee!
🎓 Student Helper — What’s New Hey everyone! Just some updates to Student Helper and wanted to share what changed Firebase Integration The app now uses Firebase for authentication and storage. What this means for you: Create an account with email and password Your API key gets saved once — no more pasting it every time Everything stored securely in the cloud Password Reset Forgot your password? No stress. New Reset Password tab on the login screen — enter your email, get a reset link straight to your inbox. English Support Student Helper now speaks two languages: Italian 🇮🇹 and English 🇬🇧 Switch anytime from the sidebar the whole interface updates instantly, including the AI tutor’s responses. That’s it for now! Built by a dyslexic student, for dyslexic students and everyone else Ideas? Open an issue on GitHub (DanyTagg)!
It is done. Finally. After a lot of back and forth, fixing bugs, rewriting pieces, and testing everything over and over, Student Helper is now complete at least for this first version. The two biggest things in this update are the interface and the language support. The whole app has been cleaned up and optimized, everything reads better, feels more consistent, and works the way it should on any screen. Italian and English are both fully supported now, you switch from the sidebar and the entire app updates instantly every label, every message, every prompt the tutor uses. The login screen you see in the screenshot went through a few iterations too. The delay before showing an error was causing confusion people thought their credentials were wrong when the database just needed a moment to wake up. Fixed that. Now it waits before telling you anything, which means almost no false errors. The home screen is exactly what I wanted from the beginning. One field, one button, and then your summary appears clean and structured. No clutter, no distractions. Just the content you need, formatted in a way that actually works for dyslexic brains. This whole project started because I needed it myself. Building it taught me more than I expected Firebase integration, multi-provider API detection, bilingual interfaces, deployment. All things I had never done before. The app is live at https://student-hel-per.streamlit.app/ free to use, just bring your own API key from Anthropic, OpenAI or Groq.
Ships:
I made a web app called Student Helper. It generates clear and structured topic summaries and helps students learn by guiding them through questions instead of giving direct answers. I built it especially for dyslexic students because I am dyslexic myself and I wanted a tool that actually works the way my brain does. The most challenging part was integrating Firebase for authentication and making the login work reliably with a free tier database that sometimes takes a moment to respond. Getting the app to automatically detect which AI provider to use just from the API key format was also a fun problem to solve. I am proud that the app supports three different AI providers, Anthropic, OpenAI and Groq, so anyone can use it with whatever key they have. I am also proud that it works in both Italian and English and that it is live online for anyone to try. Since the app never gives direct answers but only guides the student through reasoning, it can be used as a compensatory or dispensatory tool depending on the national regulations, the specific rules of your school, or the student’s IEP (Individualized Education Program), which is the personalized plan given to students with learning disabilities like dyslexia. It helps students work independently without replacing the learning process. To test it in english or italian go to https://student-hel-per.streamlit.app/ and create an account. You will need an API key from one of these three services: Anthropic, OpenAI or Groq. Once you are in, pick any topic and start asking questions....
|
1792878519.479673
|
1793742519.479673
|
|
22399
|
My very own WebOS by @D4LM | Stardance
|
D4LM
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-25T16:59:25Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "A very cool web os, with my own two apps, a bottom bar and all running in a single html file. (Strangely I can’t get it to run in multiple, but it just works!)", "repo": "https://github.com/D4LMwastaken/Web-OS", "demo": "https://d4lmwastaken.github.io/Web-OS/"}]...
|
[{"post_id": 15744, "ts": "202 [{"post_id": 15744, "ts": "2026-06-25T16:51:56Z", "hours": 0.54, "text": "I got it working, and it is finished! Yay! I am so happy!"}, {"post_id": 15400, "ts": "2026-06-25T01:11:22Z", "hours": 2.1925, "text": "Good news, the windows are now draggable! I am so happy!"}, {"post_id": 13445, "ts": "2026-06-22T00:49:26Z", "hours": 0.3344, "text": "Worked on finishing the final parts of the tutorial. Sadly, my website did not come out the way I expected…"}, {"post_id": 13370, "ts": "2026-06-21T22:01:25Z", "hours": 1.275, "text": "Finished part #3. Sadly tho, I am getting stuck on it and I don’t know if hjow my own app will look light. Right now, my web os is very chaotic!"}, {"post_id": 12145, "ts": "2026-06-19T20:54:09Z", "hours": 0.7736, "text": "Finished Part 1 and Part 2!"}]...
|
Title: My very own WebOS by @D4LM | Stardance
Dev Title: My very own WebOS by @D4LM | Stardance
Devlogs:
Finished Part 1 and Part 2!
Finished part #3. Sadly tho, I am getting stuck on it and I don’t know if hjow my own app will look light. Right now, my web os is very chaotic!
Worked on finishing the final parts of the tutorial. Sadly, my website did not come out the way I expected…
Good news, the windows are now draggable! I am so happy!
I got it working, and it is finished! Yay! I am so happy!
Ships:
A very cool web os, with my own two apps, a bottom bar and all running in a single html file. (Strangely I can’t get it to run in multiple, but it just works!)...
|
1793137681.098059
|
1793224081.098059
|
|
22470
|
DomainOS by @adityanavale | Stardance
|
adityanavale
|
1
|
11.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-16T20:54:03Z", "hours": 11.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a minimalistic web based operating system that increases productivity and is easy to use. A huge challenge was learning how to write Javascript code alongside with HTML which I had never done before. I am proud of the fact that I learned a lot more HTML and JS and know how to deploy my projects with live demo links(through Vercel). People should know that the app interfaces and some debugging were built/done using AI but most was done by me.", "repo": "https://github.com/adityanavale-tech/DomianOS", "demo": "https://domian-os-new.vercel.app/"}]...
|
[{"post_id": 46784, "ts": "202 [{"post_id": 46784, "ts": "2026-08-14T09:12:10Z", "hours": 1.0669, "text": "New Search App! With the help of AI I’ve build a web based browser in DomainOS -Online web searching using google -Background Customization -Draggable Icon -Refresh & site forward and back buttons"}, {"post_id": 44804, "ts": "2026-08-10T20:31:55Z", "hours": 0.9819, "text": "To-Do App finished Task creations Calendar view Add priority, location, people and more to tasks User friendly (Done with the help of AI, has been declared)"}, {"post_id": 13947, "ts": "2026-06-22T21:54:51Z", "hours": 1.9639, "text": "DomainOS app coming soon! the to-do app is coming soon to domainOS what you can do: -track different projects -add tasks to projects -draggable window + resizable(new)"}, {"post_id": 13272, "ts": "2026-06-21T18:51:01Z", "hours": 3.2242, "text": "DomainOS’s first app! new features: no more bugs(fixed all + added some safety) -app icon -draggable app -auto welcome window closure -new to-do list app(in the works) goals: properly link github -create user-friendly app interface -create an “app dock” + new apps -make functions????!!"}, {"post_id": 12715, "ts": "2026-06-20T19:30:05Z", "hours": 4.1514, "text": "Started DomainOS! Begineer features Welcome window Dragable window Open & Close buttons Goals: Style the screens properly Make it look good Add apps Bottom Bar … I also want to do another project that is a web based browser powered by a search engine!"}]...
|
Title: DomainOS by @adityanavale | Stardance
Devl Title: DomainOS by @adityanavale | Stardance
Devlogs:
Started DomainOS! Begineer features Welcome window Dragable window Open & Close buttons Goals: Style the screens properly Make it look good Add apps Bottom Bar … I also want to do another project that is a web based browser powered by a search engine!
DomainOS’s first app! new features: no more bugs(fixed all + added some safety) -app icon -draggable app -auto welcome window closure -new to-do list app(in the works) goals: properly link github -create user-friendly app interface -create an “app dock” + new apps -make functions????!!
DomainOS app coming soon! the to-do app is coming soon to domainOS what you can do: -track different projects -add tasks to projects -draggable window + resizable(new)
To-Do App finished Task creations Calendar view Add priority, location, people and more to tasks User friendly (Done with the help of AI, has been declared)
New Search App! With the help of AI I’ve build a web based browser in DomainOS -Online web searching using google -Background Customization -Draggable Icon -Refresh & site forward and back buttons
Ships:
I made a minimalistic web based operating system that increases productivity and is easy to use. A huge challenge was learning how to write Javascript code alongside with HTML which I had never done before. I am proud of the fact that I learned a lot more HTML and JS and know how to deploy my projects with live demo links(through Vercel). People should know that the app interfaces and some debugging were built/done using AI but most was done by me....
|
1793267692.5676808
|
1793354092.5676808
|
|
22496
|
My very own portfolio website by @mishika | Starda My very own portfolio website by @mishika | Stardance...
|
mishika
|
1
|
0.51
|
1
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-25T14:39:40Z", "hours": 0.0, "multiplier": 1.17, "payout": 1, "blessing": "neutral", "text": "It’s my own portfolio website. I made it with html and added my skills, dark mode toggle. I enjoyed building it with the tutorial will add more stuff in it soon.", "repo": "https://github.com/mishika074/mishika-corner", "demo": "https://mishika074.github.io/mishika-corner/"}]...
|
[{"post_id": 36240, "ts": "202 [{"post_id": 36240, "ts": "2026-07-28T06:13:45Z", "hours": 0.5111, "text": "I did some changes to my portfolio website like added the heading typing effect and a cute emoji trail. I also added my email link in find me."}, {"post_id": 34622, "ts": "2026-07-25T14:34:53Z", "hours": 0.4989, "text": "It’s my first portfolio website"}]...
|
Title: My very own portfolio website by @mishika | Title: My very own portfolio website by @mishika | Stardance
Devlogs:
It’s my first portfolio website
I did some changes to my portfolio website like added the heading typing effect and a cute emoji trail. I also added my email link in find me.
Ships:
It’s my own portfolio website. I made it with html and added my skills, dark mode toggle. I enjoyed building it with the tutorial will add more stuff in it soon....
|
1793008431.482404
|
1793872431.482404
|
|
22500
|
Basic Atom Simulator by @harieshkarth | Stardance
|
harieshkarth
|
1
|
3.0
|
11
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-01T17:30:55Z", "hours": 3.0, "multiplier": 3.49, "payout": 11, "blessing": "neutral", "text": "This is a simulator where the user can hover over three different subatomic particles in an atom to learn more about what they are.", "repo": "https://github.com/harieshkarth-byte/atom-simulator", "demo": "https://harieshkarth-byte.itch.io/atom-simulator"}]...
|
[{"post_id": 14649, "ts": "202 [{"post_id": 14649, "ts": "2026-06-23T20:41:25Z", "hours": 0.9567, "text": "Devlog 2 I’ve finished the first simulator! I redesigned all the subatomic particles as well as the background and descriptions to make everything more visually appealing. Additionally, to help the user know what to do, I added some text telling them to hover over the subatomic particles. Moving on, I would like to make more chemistry simulations. Here are some of my ideas: An interactive periodic table to learn about the different sections A simulation to teach someone how to calculate the atomic mass A simulation that adds electrons to an element, following the Aufbau Principle, to teach someone how to make an electron configuration"}, {"post_id": 13761, "ts": "2026-06-22T15:40:38Z", "hours": 2.17, "text": "Devlog 1 I just finished the bare-bones structure for my atom simulator! I made a basic hydrogen atom with an electron orbiting around a proton and a neutron. When you hover over one of the particles, it gives a basic description of that subatomic particle. For now, I only have placeholder images that I made in about 30 seconds. My next step will be to work on the artwork so it’s a bit more appealing to the eyes. This is my first project, which is why it’s a little basic. I’m hoping to make more sophisticated simulations going forward."}]...
|
Title: Basic Atom Simulator by @harieshkarth | Sta Title: Basic Atom Simulator by @harieshkarth | Stardance
Devlogs:
Devlog 1 I just finished the bare-bones structure for my atom simulator! I made a basic hydrogen atom with an electron orbiting around a proton and a neutron. When you hover over one of the particles, it gives a basic description of that subatomic particle. For now, I only have placeholder images that I made in about 30 seconds. My next step will be to work on the artwork so it’s a bit more appealing to the eyes. This is my first project, which is why it’s a little basic. I’m hoping to make more sophisticated simulations going forward.
Devlog 2 I’ve finished the first simulator! I redesigned all the subatomic particles as well as the background and descriptions to make everything more visually appealing. Additionally, to help the user know what to do, I added some text telling them to hover over the subatomic particles. Moving on, I would like to make more chemistry simulations. Here are some of my ideas: An interactive periodic table to learn about the different sections A simulation to teach someone how to calculate the atomic mass A simulation that adds electrons to an element, following the Aufbau Principle, to teach someone how to make an electron configuration
Ships:
This is a simulator where the user can hover over three different subatomic particles in an atom to learn more about what they are....
|
1793263790.0517213
|
1793350190.0517213
|
|
22531
|
Grounding by @skornuta | Stardance
|
skornuta
|
1
|
6.0
|
86
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-03T22:49:09Z", "hours": 6.0, "multiplier": 14.58, "payout": 86, "blessing": "neutral", "text": "Q. What did you make? A. Chrome extension that gates distracting sites (YouTube, Reddit, IG, X, TikTok, Snapchat, Facebook) behind a calm brain-dump instead of a productivity test. It asks “what’s making your mind busy right now?”, every character you type dissolves 1.5s later, and 50 characters unlocks the site. Its just a forced pause to notice why you opened the app. Q. What was challenging? A. Getting real isolation from host-site CSS/CSP (solved with a closed Shadow DOM + constructable stylesheet + bundled fonts) and fully trapping input — YouTube’s shortcuts were still firing under the overlay until I trapped keydown / keypress / keyup plus the full mouse event set with stopImmediatePropagation . Q. What are you proud of? A. Killing three earlier “typing test” versions of this to land on the much simpler, much better idea: stop measuring, just let people empty out. 3 major QoL improvements: Full Shadow DOM isolation — overlay can’t be broken by host-site styles/CSP on any gated site. Full keyboard + mouse input trap — host shortcuts (space/k/f on YouTube, etc.) can’t fire underneath the overlay. Toolbar popup on/off toggle ( chrome.storage -backed) — turn it off instantly, no digging through chrome://extensions . How to test: Load unpacked via chrome://extensions → Developer mode → Load unpacked. Visit any gated site, let the breathing intro play (or press a key to skip), type into the canvas, hit 50 chars to unlock, try Escape to reset. Toggle off in the popup mid-session and confirm it melts away immediately. Time invested: about 6 hours in total.", "repo": "https://github.com/skornuta/grounded", "demo": "https://github.com/skornuta/grounded/releases/tag/v0.6.0"}]...
|
[{"post_id": 40423, "ts": "202 [{"post_id": 40423, "ts": "2026-08-03T22:34:30Z", "hours": 1.5839, "text": "devlog v0.6.0 ~1 hour and 28minutes logged i finally admitted to myself that the thing i was building was basically monkeytype with extra steps and a guilt trip attached. wpm counters, accuracy tracking, quote banks… all of it made the extension feel like a typing test. and the last thing i need when im opening youtube for the 40th time today is to feel like im being graded. the “productivity” version of this extension was stressing me out more than the doomscrolling was. so i deleted the whole concept and started over. what sucked the css pollution bug. outube and twitter kept leaking their styles into the overlay and centering was broken on like half the sites. it filled up the website console and it sucked to fix. found out the scroll lock used a :has(.fade-out) selector, which breaks if the site itself has any element with the class fade-out. the google fonts import just straight up does not load on x.com because of csp. the drift-up animation on the dissolving letters didnt work at all. css transforms dont apply to inline elements so the text was just fading in place this whole time and i thought it was drifting. there was also a random prime number sieve running on every single page load. no clue The Epiphany the epiphany was: stop measuring. the typing test framing WAS the problem. the extension is supposed to make you go outside. so now its just a blank void that asks “what’s making your mind busy right now?” and everything i type dissolves 1.5 seconds later. Just 50 characters so thats it i think what actually got built free-form canvas. zero quotes, zero wpm, zero accuracy, zero scores dissolving text engine — every char fades + blurs + drifts away exactly 1.5s after typing, and each char gets its own random drift vector so the text scatters like ash instead of disappearing as a block. invisible-ish 50 char threshold, then the whole overlay melts (fade + scale + unblur) and lets me back in full shadow dom isolation — closed root + a constructable stylesheet, which apparently is immune to page csp?? so host sites cant touch the overlay anymore. not youtube, not twitter roboto mono bundled INSIDE the extension (latin, latin-ext, cyrillic — yes cyrillic, i type in more than one language) so csp and offline cant hurt me anymore kept the breathing intro but its 6s now and any key skips it. and the skip key actually types itself instead of being eaten capture-phase key handling so youtube shortcuts dont fire behind the overlay while i type (no more accidental video pausing mid-vent) an actual working scroll lock this time reduced-motion support because accessibility is not optional removed the prime sieve. again. dont want to talk about it done with this project maybe one day ill keep working on it. release a 1.0.0…"}, {"post_id": 20539, "ts": "2026-07-02T04:52:47Z", "hours": 0.9978, "text": "Another hour of coding today, and it led to a massive realization. The 0.5.0 Wall (And Why It Sucked) I spent today’s session trying to fine tune the “Zen Governor” speed penalty and fixing the text wrapping bugs. While the words are wrapping better now, actually using the extension felt terrible. I type pretty fast, and using my own extension was making me so mad that I wanted to stop working on it. the screenshot I attached shows what the penalty was. basically, if you started writing too fast, it would add MORE to the poem. and it sucked. i tried playing around with the characters per minute timings but its just not very reliable and hard to perfect. If a mindfulness app makes you want to punch your keyboard, you’ve built the wrong app. the Epiphany The whole typing-test framework is inherently stressful. If the app is tracking your typos, grading your accuracy, and monitoring your speed, your brain stays stuck in “performance mode.” You arent relaxing, youre just playing this game of “type as fast as you can”. while its fun to type fast, its not the point of this project. So, I’m throwing the whole typing exam mechanic in the trash. The Next Step: The “Brain Dump” Overhaul (v0.6.0) For the next version, we are pivoting to something that actually feels therapeutic: Free-form Canvas: No more copying quotes perfectly. No more “incorrect” keys or rigid typing checks. You get an empty screen that asks: What’s making your mind busy right now? Dissolving Text: You type whatever raw thoughts are in your head. Exactly 1.5 seconds after you type a letter, it will smoothly fade, blur, and drift away into nothingness. Your stressful thoughts literally disappear from the screen. No Performance Metrics: Goodbye WPM, goodbye accuracy tracking. Just a simple counter showing you’ve let go of 50 characters. Once you type 50 characters of a raw brain dump, the overlay fades out, and the site unlocks. hopefully this 5.0 release will be the LAST, as this project is getting a little boring to work on… This completely gets rid of the annoying spacing and indexing bugs too, because the browser can just handle normal text input natively. Time to rebuild this into something that actually brings some peace."}, {"post_id": 19782, "ts": "2026-07-01T05:15:02Z", "hours": 2.0003, "text": "Well. I just spent 2 hours on the newest version. And for what… This is the official 0.4.0 release. It’s been a bit since my last devlog, and a lot has happened behind the scenes to finally bridge the gap between project and final extension. unfortunately, this is not the final. First, a quick reality check on the layout. In my last post, I said the text was perfectly centered. It was… on my blank HTML test page. But the second I actually started testing the extension on live websites like YouTube and Twitter, their styles completely leaked into my code and broke it. So ye, the centering is currently broken but ill fix it one day. maybe Here is a quick list of everything I actually changed and built since the last log: It actually unlocks the page now: Once you finish typing the very last letter, the overlay just fades away. pretty simple for now, i might make it like a melting effect? not sure yet Bolder text & a clean new font: Like I said in the last post, the old text was way too small and thin. I cranked it up to 34px, made it a lot bolder, and switched it to Google’s ‘Roboto Mono’ font so it looks way niccer. Multi-line poems: You can type through short stanzas now instead of just flat, one-line quotes. I completely broke the extension at first because the cursor kept getting stuck on the invisible line-break characters \\n , but I fixed the logic so it jumps lines. Escape to restart: Added a quick reset feature. Hitting the Escape key wipes your current progress and pulls up a fresh random quote. The Plan The code works well and everything feels incredibly smooth, but this 0.4.0 update is officially a halfway point and a place to rebuild. After staring at the live WPM and accuracy counters ticking up while I was testing it, I asked my dad how it looked. He made me realize that I am literaly building the exact opposite of what I actually want. The whole points of this Grounding project is to be a relaxing speed bump that encourages you to take a breath and get off your device. But by adding speed metrics and accuracy, I literally just cloned Monkeytype. instead of calming your brain, i filled it with the dopamine hit like any game. you just want to get back to your social media even FASTER. but what is next: For the next update, im making a big change. I am stripping away the stress metrics (byeWPM and accuracy) and shifting toward a more mindful experience. I am going to look into organic, calming color palettes and maybe even a mechanic that forces you to ‘slow down’ rather than type fast. Like, maybe if you type too fast, it generates more text for you to slow you down. Not really sure yet, but the speed type era is officially over. i also learnedd more markdown so from now on my dev logs will look better."}, {"post_id": 17200, "ts": "2026-06-27T22:12:18Z", "hours": 0.5753, "text": "huge update for grounding today. first off, i fixed the layout issues from the last post. the text is finally centered on the screen and actually readable against the dark background. but the biggest change is that the typing mechanic is officially here. I shifted the text rendering to individual character spans so i could track keyboard inputs character by character. it completely mirrors the monkeytype feel now. How it looks so far: characters start out a muted gray typing a correct key turns it a smooth offwhite typos turn a soft red i also got the custom caret (cursor) working. it has a decent transition so it slides smoothly between letters instead of just snapping rigidly, and it flashes slowly when you stop typing (the animation is still going to be worked on cuz its not the best). backspace support is fully functional too, so you can actually go backward and correct your mistakes. now, what’s next: making the overlay fade out beautifully once the quote is 100% complete also might make the text larger and bolder; its hard to read actually unlocking the restricted website after you finish typing expanding the quote pool with some longer, cleaner poems/quotes (i might try to get the quotes from some bank, not sure yet.)"}, {"post_id": 14728, "ts": "2026-06-23T22:50:26Z", "hours": 0.4344, "text": "Added some placeholder quotes. I have it randomly choose from a list of quotes that then displays on the overlay. Next update will make the text EASIER to see, and also i will add the ability to type and get into the social media. also its off center and ill fix that."}, {"post_id": 14695, "ts": "2026-06-23T21:54:36Z", "hours": 0.2797, "text": "Finally started the extension. Googles docs for creating extensions is amazing, theres a full guide. i matched the coloring from MonkeyType, because thats where my inspiration comes from. First devlog. Created the files, and created some small text to see how all of the work would turn out. Looks great so far. Features to add: Poems to auto show. Compatible with more websites. add the actual typing animations and everything 4, clean up the code cuz its messy"}]...
|
Title: Grounding by @skornuta | Stardance
Devlogs Title: Grounding by @skornuta | Stardance
Devlogs:
Finally started the extension. Googles docs for creating extensions is amazing, theres a full guide. i matched the coloring from MonkeyType, because thats where my inspiration comes from. First devlog. Created the files, and created some small text to see how all of the work would turn out. Looks great so far. Features to add: Poems to auto show. Compatible with more websites. add the actual typing animations and everything 4, clean up the code cuz its messy
Added some placeholder quotes. I have it randomly choose from a list of quotes that then displays on the overlay. Next update will make the text EASIER to see, and also i will add the ability to type and get into the social media. also its off center and ill fix that.
huge update for grounding today. first off, i fixed the layout issues from the last post. the text is finally centered on the screen and actually readable against the dark background. but the biggest change is that the typing mechanic is officially here. I shifted the text rendering to individual character spans so i could track keyboard inputs character by character. it completely mirrors the monkeytype feel now. How it looks so far: characters start out a muted gray typing a correct key turns it a smooth offwhite typos turn a soft red i also got the custom caret (cursor) working. it has a decent transition so it slides smoothly between letters instead of just snapping rigidly, and it flashes slowly when you stop typing (the animation is still going to be worked on cuz its not the best). backspace support is fully functional too, so you can actually go backward and correct your mistakes. now, what’s next: making the overlay fade out beautifully once the quote is 100% complete also might make the text larger and bolder; its hard to read actually unlocking the restricted website after you finish typing expanding the quote pool with some longer, cleaner poems/quotes (i might try to get the quotes from some bank, not sure yet.)
Well. I just spent 2 hours on the newest version. And for what… This is the official 0.4.0 release. It’s been a bit since my last devlog, and a lot has happened behind the scenes to finally bridge the gap between project and final extension. unfortunately, this is not the final. First, a quick reality check on the layout. In my last post, I said the text was perfectly centered. It was… on my blank HTML test page. But the second I actually started testing the extension on live websites like YouTube and Twitter, their styles completely leaked into my code and broke it. So ye, the centering is currently broken but ill fix it one day. maybe Here is a quick list of everything I actually changed and built since the last log: It actually unlocks the page now: Once you finish typing the very last letter, the overlay just fades away. pretty simple for now, i might make it like a melting effect? not sure yet Bolder text & a clean new font: Like I said in the last post, the old text was way too small and thin. I cranked it up to 34px, made it a lot bolder, and switched it to Google’s ‘Roboto Mono’ font so it looks way niccer. Multi-line poems: You can type through short stanzas now instead of just flat, one-line quotes. I completely broke the extension at first because the cursor kept getting stuck on the invisible line-break characters \n , but I fixed the logic so it jumps lines. Escape to restart: Added a quick reset feature. Hitting the Escape key wipes your current progress and pulls up a fresh random quote. The Plan The code works well and everything feels incredibly smooth, but this 0.4.0 update is officially a halfway point and a place to rebuild. After staring at the live WPM and accuracy counters ticking up while I was testing it, I asked my dad how it looked. He made me realize that I am literaly building the exact opposite of what I actually want. The whole points of this Grounding project is to be a relaxing speed bump that encourages you to take a breath and get off your device. But by adding speed metrics and accuracy, I literally just cloned Monkeytype. instead of calming your brain, i filled it with the dopamine hit like any game. you just want to get back to your social media even FASTER. but what is next: For the next update, im making a big change. I am stripping away the stress metrics (byeWPM and accuracy) and shifting toward a more mindful experience. I am going to look into organic, calming color palettes and maybe even a mechanic that forces you to ‘slow down’ rather than type fast. Like, maybe if you type too fast, it generates more text for you to slow you down. Not really sure yet, but the speed type era is officially over. i also learnedd more markdown so from now on my dev logs will look better.
Another hour of coding today, and it led to a massive realization. The 0.5.0 Wall (And Why It Sucked) I spent today’s session trying to fine tune the “Zen Governor” speed penalty and fixing the text wrapping bugs. While the words are wrapping better now, actually using the extension felt terrible. I type pretty fast, and using my own extension was making me so mad that I wanted to stop working on it. the screenshot I attached shows what the penalty was. basically, if you started writing too fast, it would add MORE to the poem. and it sucked. i tried playing around with the characters per minute timings but its just not very reliable and hard to perfect. If a mindfulness app makes you want to punch your keyboard, you’ve built the wrong app. the Epiphany The whole typing-test framework is inherently stressful. If the app is tracking your typos, grading your accuracy, and monitoring your speed, your brain stays stuck in “performance mode.” You arent relaxing, youre just playing this game of “type as fast as you can”. while its fun to type fast, its not the point of this project. So, I’m throwing the whole typing exam mechanic in the trash. The Next Step: The “Brain Dump” Overhaul (v0.6.0) For the next version, we are pivoting to something that actually feels therapeutic: Free-form Canvas: No more copying quotes perfectly. No more “incorrect” keys or rigid typing checks. You get an empty screen that asks: What’s making your mind busy right now? Dissolving Text: You type whatever raw thoughts are in your head. Exactly 1.5 seconds after you type a letter, it will smoothly fade, blur, and drift away into nothingness. Your stressful thoughts literally disappear from the screen. No Performance Metrics: Goodbye WPM, goodbye accuracy tracking. Just a simple counter showing you’ve let go of 50 characters. Once you type 50 characters of a raw brain dump, the overlay fades out, and the site unlocks. hopefully this 5.0 release will be the LAST, as this project is getting a little boring to work on… This completely gets rid of the annoying spacing and indexing bugs too, because the browser can just handle normal text input natively. Time to rebuild this into something that actually brings some peace.
devlog v0.6.0 ~1 hour and 28minutes logged i finally admitted to myself that the thing i was building was basically monkeytype with extra steps and a guilt trip attached. wpm counters, accuracy tracking, quote banks… all of it made the extension feel like a typing test. and the last thing i need when im opening youtube for the 40th time today is to feel like im being graded. the “productivity” version of this extension was stressing me out more than the doomscrolling was. so i deleted the whole concept and started over. what sucked the css pollution bug. outube and twitter kept leaking their styles into the overlay and centering was broken on like half the sites. it filled up the website console and it sucked to fix. found out the scroll lock used a :has(.fade-out) selector, which breaks if the site itself has any element with the class fade-out. the google fonts import just straight up does not load on x.com because of csp. the drift-up animation on the dissolving letters didnt work at all. css transforms dont apply to inline elements so the text was just fading in place this whole time and i thought it was drifting. there was also a random prime number sieve running on every single page load. no clue The Epiphany the epiphany was: stop measuring. the typing test framing WAS the problem. the extension is supposed to make you go outside. so now its just a blank void that asks “what’s making your mind busy right now?” and everything i type dissolves 1.5 seconds later. Just 50 characters so thats it i think what actually got built free-form canvas. zero quotes, zero wpm, zero accuracy, zero scores dissolving text engine — every char fades + blurs + drifts away exactly 1.5s after typing, and each char gets its own random drift vector so the text scatters like ash instead of disappearing as a block. invisible-ish 50 char threshold, then the whole overlay melts (fade + scale + unblur) and lets me back in full shadow dom isolation — closed root + a constructable stylesheet, which apparently is immune to page csp?? so host sites cant touch the overlay anymore. not youtube, not twitter roboto mono bundled INSIDE the extension (latin, latin-ext, cyrillic — yes cyrillic, i type in more than one language) so csp and offline cant hurt me anymore kept the breathing intro but its 6s now and any key skips it. and the skip key actually types itself instead of being eaten capture-phase key handling so youtube shortcuts dont fire behind the overlay while i type (no more accidental video pausing mid-vent) an actual working scroll lock this time reduced-motion support because accessibility is not optional removed the prime sieve. again. dont want to talk about it done with this project maybe one day ill keep working on it. release a 1.0.0…
Ships:
Q. What did you make? A. Chrome extension that gates distracting sites (YouTube, Reddit, IG, X, TikTok, Snapchat, Facebook) behind a calm brain-dump instead of a productivity test. It asks “what’s making your mind busy right now?”, every character you type dissolves 1.5s later, and 50 characters unlocks the site. Its just a forced pause to notice why you opened the app. Q. What was challenging? A. Getting real isolation from host-site CSS/CSP (solved with a closed Shadow DOM + constructable stylesheet + bundled fonts) and fully trapping input — YouTube’s shortcuts were still firing under the overlay until I trapped keydown / keypress / keyup plus the full mouse event set with stopImmediatePropagation . Q. What are you proud of? A. Killing three earlier “typing test” versions of this to land on the much simpler, much better idea: stop measuring, just let people empty out. 3 major QoL improvements: Full Shadow DOM isolation — overlay can’t be broken by host-site styles/CSP on any gated site. Full keyboard + mouse input trap — host shortcuts (space/k/f on YouTube, etc.) can’t fire underneath the overlay. Toolbar popup on/off toggle ( chrome.storage -backed) — turn it off instantly, no digging through chrome://extensions . How to test: Load unpacked via chrome://extensions → Developer mode → Load unpacked. Visit any gated site, let the breathing intro play (or press a key to skip), type into the canvas, hit 50 chars to unlock, try Escape to reset. Toggle off in the popup mid-session and confirm it melts away immediately. Time invested: about 6 hours in total....
|
1793307086.8446763
|
1793393486.8446763
|
|
22546
|
KALbot by @maxoliver | Stardance
|
maxoliver
|
1
|
2.0
|
7
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-28T13:10:58Z", "hours": 2.0, "multiplier": 4.14, "payout": 7, "blessing": "neutral", "text": "I made a slack bot with goverments, trade, and more. If you’ve used dank memer on discord, its like that, but with a sim-dem(simulated democracy) and political country peace/war manager in one lazily made slack bot. Jokes aside, this was a really fun project, and I hope you find it fun too.", "repo": "https://github.com/molive6316github/kal", "demo": "https://app.slack.com/client/E09V59WQY1E/C0BBZ4188KU"}]...
|
[{"post_id": 12618, "ts": "202 [{"post_id": 12618, "ts": "2026-06-20T16:46:51Z", "hours": 1.2789, "text": "KAL is complete. It is now a full simdem/economy sim with elections(not shown, only days 11-14) trading permissions and more. i still need to polish 1 or two things and publish, but it is mostly done."}, {"post_id": 12156, "ts": "2026-06-19T21:16:44Z", "hours": 0.4964, "text": "I am building the app to be a simdem with kingdoms, trading, elections, and more. Much work to be done."}]...
|
Title: KALbot by @maxoliver | Stardance
Devlogs:
Title: KALbot by @maxoliver | Stardance
Devlogs:
I am building the app to be a simdem with kingdoms, trading, elections, and more. Much work to be done.
KAL is complete. It is now a full simdem/economy sim with elections(not shown, only days 11-14) trading permissions and more. i still need to polish 1 or two things and publish, but it is mostly done.
Ships:
I made a slack bot with goverments, trade, and more. If you’ve used dank memer on discord, its like that, but with a sim-dem(simulated democracy) and political country peace/war manager in one lazily made slack bot. Jokes aside, this was a really fun project, and I hope you find it fun too....
|
1793245915.1624029
|
1793332315.1624029
|
|
22550
|
Olympus by @nithilgadde | Stardance
|
nithilgadde
|
1
|
26.88
|
503
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-24T01:51:24Z", "hours": 26.0, "multiplier": 19.33, "payout": 503, "blessing": "neutral", "text": "Hey everyone! I made Olympus, a small game engine for Python that lets you build tiny pixel games on a 128x128 screen with 16 colors, kind of like PICO-8. The twist is I built it from scratch. No pygame, no pyxel. The screen is just a numpy grid of color numbers, and I hand-wrote all the drawing myself: the lines, the circles, the sprite blitting, a little pixel font, even the sound. SDL2 only opens the window and reads the keyboard, it does none of the actual drawing. The hardest parts were the ones you don’t see. My filled circles came out with weird spikes poking off the sides until I rewrote them with a proper midpoint algorithm. Then turning it into a real installable library nearly broke me: wrong Python versions, a locked-down pip, and an upload token that kept getting rejected. I learned a lot more about packaging than I planned to. What I’m proudest of is that it’s actually real. You can install the library by going to the ‘Try project’ or ‘See source code’, both have proper instructions on how to install the library. Then, you can start building games! There is proper documentation in the ‘Wiki’ tab in the Github Repo (click See source code). Happy making! (The Demo is a copy of Snake using the Olympus Engine)", "repo": "https://github.com/nithilgadde/Olympus", "demo": "https://pypi.org/project/olympus-engine/"}]...
|
[{"post_id": 34068, "ts": "202 [{"post_id": 34068, "ts": "2026-07-24T15:02:51Z", "hours": 0.8831, "text": "Devlog #9: Starting to Fly Again Hello everyone! I’m finally making another devlog for Olympus. I took a break because I went on vacation and I didn’t feel motivated to start coding again. But now, I’m ready to show you the new things I’ve created. When I was looking at the code, I realized that I never added functionality to export a game. If you wanted to share your game with someone, you would have to send them your entire code and then make them install Python, Olympus, and it’s a huge deal just to play your game. So, I’ve implemented a game exporter! How it works So I used PyInstaller to make this work. Basically, when you export your game, PyInstalled will “freeze” your program. This means that it will trace every import your game makes, gathers all of your assets (your code, the Python interpreter, olympus, numpy, Pillow, PySDL2) and then packs it into one self-contained bundle. And that’s your game! What’s Next? Honesty, I have no idea. I’m planning on adding mouse implementation but it depends on what I’m feeling like doing. See you later! Below is a simple snake game that I created and it was created and exported by Olympus Engine."}, {"post_id": 14810, "ts": "2026-06-24T01:37:11Z", "hours": 0.7514, "text": "Devlog #8: The Ship has Sailed? Hey everyone! Stardance says that I have a certain amount of time logged and that if I ship and don’t make a devlog for that time, I’m gonna lose it. So, I’ll make a quick devlog: README.md: I created a nice README.md for the GitHub Repo. I also added a wiki, so that it will be very easy for anyone to learn Olympus. Turned into a Python Package This is my first time uploading a Python Package to PyPi, the official provider for Python packages, so this was a new experience. However, there are lots of documentation online that made it very easy. So, Olympus is now an official Python library! You can check it out when i ship the project. Welp, that’s it. I hope to see you next time!"}, {"post_id": 14579, "ts": "2026-06-23T19:01:45Z", "hours": 7.7639, "text": "Devlog #7: We’ve Reached the Peak! Hello everyone! Welcome back to another devlog. I’m happy to announce that my game engine, Olympus, is finally finished! Here’s what I added. Sound This part took about 1 - 2 hours to implement. Because the game engine is a 16-bit game engine, this means that we can only play sounds that are 16-bit. You can create your own sounds using the game engine, but you can also upload your own sounds. The program works by converting your sounds into a 16-bit audio that the game engine can render. Sprite Editor This part took foreverrrrr. Basically, instead of manually typing out sprites for your game, I wanted a editor where you could draw the sprites and then export them. This took forever because I didn’t know how to export your sprites into actual array code that would turn into a sprite. However, I was able to just reuse my code that render sprites from a list into the sprite editor and add functionality that would turn the blank spaces in the canvas into a ‘.’ (blank space) and all the squares that are drawn into an ‘x’ (the actual sprite pixels). I was also able to add saving and onion skinning. What’s Next? I’ll be turning Olympus into a Python library so everyone can install it. Then, I will ship the project. See you next time!"}, {"post_id": 14065, "ts": "2026-06-23T01:24:29Z", "hours": 4.1719, "text": "Devlog #6: Sights on the Peak! Hey everyone! Welcome back to another devlog. Today, we are one giant step forward in finishing the game engine: tilemaps and animations. Tilemaps: The whole level is a grid of letters. I draw my maps as plain text: W is a wall, C is a coin, ’. ‘is empty space (These are just the examples that I’m using for the demos). So a level is literally a block of text I type out, like ASCII art of the room. The engine turns each letter into a tile. It walks the grid square by square, and for each letter it looks up a matching 8×8 picture and stamps it at that spot. A ‘W’ becomes a wall tile, a ’. ‘draw nothing. This is all easy on paper but when actually trying to create it, it was hell. The amount of bugs that would come wouldn’t stop and I actually was very close to giving up for the day. But, I persisted, and after over 20+ Google Tabs, I was able to work it out. Animations: Even though I thought this would be the hardest thing to implement, this one was the easiest feature to implement imo. It’s a flipbook of sprites. A walk animation is just a list of frames, the same little pixel sprites I already made. Flip through them fast and the legs look like they’re moving. A timer controls the speed. If I swapped frames every single frame of the game (60 times a second) it’d be a blur, so I count ticks and only switch to the next frame every few ticks. That one number tunes how fast the walk looks. When it reaches the last frame it loops back to the first, so it cycles forever. It only animates when it should. While you hold an arrow, I advance the frames so the hero walks. When you let go, I reset to the standing pose so he doesn’t moonwalk in place. What’s Next? This engine is veryyy close to being finished! I just need to add sounds and this engine should be complete! After I finish the engine, I will ship the engine. See you next time! Also, if you want to know what the tilemap in the demo looks like in code, here it is: LEVEL = [ \"WWWWWWWWWWWWWWWW\", \"W...........................................................W\", \"W.................WWW.......................C....W\", \"W............................................WWW..W\", \"W..C......................................................W\", \"W.......................WW...........................W\", \"W.....................WW............C...............W\", \"W..........................................................W\", \"W..................WWWW........................W\", \"W.............................C...........................W\", \"W.............................C...........................W\", \"W.........................WWWW.................W\", \"W..........................................................W\", \"W........................C...............C..............W\", \"W..........................................................W\", \"WWWWWWWWWWWWWWWW\", ] ``` The formatting is messed up as the original is in Python, but I hope you get the gist!"}, {"post_id": 13496, "ts": "2026-06-22T02:53:30Z", "hours": 6.105, "text": "Devlog #5: The Writing’s on the Wall. Hey everyone! Welcome back to another devlog for my game engine made in Python: Olympus. Today, I added the hardest things to implement: text and collisions. Text: This is the one I struggled with the most. I wanted text while having the 16-bit style that I was going for. I tried displaying text using the SDL2 functions, but it didn’t give me the effect I was looking for. So, I had to make my own. And, it was tough. It didn’t help that I had no idea what I was doing, but it also didn’t help that I had many bugs. However, I was able to figure it out. I was able to do this by making each letter a tiny picture made of pixels and store all of the characters in a lookup table. Collisions: Collisions was easy when looking at it. Check of the walls or an object is colliding. if it is, do something. Otherwise, don’t let the player go into it. But boy, was it hard to implement. I spent a good 3 hours just trying to figure out how to do this. But, eventually, I figured it out. It works as the collisions check if two boxes overlap only if they overlap left-to-right AND up-and-down. If there is a gap, then they aren’t touching. You can see both the text and the collisions in effect in the little demo I made below. What’s Next? I have a feeling that we are very close to being finished with this game engine, but I’m probably getting my hopes up. Next up, adding animations and tilemaps so that you can create levels. That’s it for me. see you later!"}, {"post_id": 13275, "ts": "2026-06-21T18:58:22Z", "hours": 2.5392, "text": "Devlog #4: If Looks could Kill Hey everyone! Welcome back to another devlog! Today, I’ve finally implemented sprites into the game engine: Olympus. This way, you can make your character look like anything! How do the sprites actually work? I made my own sprite format, where each sprite is just rows of text where each character is a color and a dot means transparent. This is the coolest part as the engine will think the dots are transparent and there won’t be a big black box dragging the sprite around. And, if I wanted to flip the sprite around, I could just reverse the rows with numpy. There was a stupid bug where I kept getting a Screen object has no attribute spr error, an I couldn’t find out why. But, I realized that I wrote the method in the wrong file. But, after fixing that error, the program worked! What’s Next? Next up, we are adding text. Every game engine needs text and next up, we are adding that. See you next time!"}, {"post_id": 12855, "ts": "2026-06-21T01:40:19Z", "hours": 1.7486, "text": "Devlog #3: Let there be Movement! Hey everyone! In this devlog, I added movement to our game engine: Olympus! New functions! I created two new functions: btn() and btnp() . btn() is for when the key on your keyboard will be held down. This can be used for movement. btnp() is for when the key is only going to be pressed once. This can be used for actions such as jumping, shooting, or confirming something in the game. How does the movement work? An objects position is two variables: px and py . px is the x-axis (left and right) and py is the y-axis (up and down). If you remember from algebra, when you subtract your initial position in the x-axis, you move to the left and when you add your initial position in the x-axis, you move right. The same applys for the y-axis. If you subtract, you move down. If you add, you go up. So, we check the keys using the btn() function. So, if btn(LEFT) == True when the left arrow is held, it will subtract from px on whatever value you want and it will move the character that way. What’s next? That’s it for today’s devlog. Tomorrow, I hope to finally implement sprites into the game, so you can add custom models instead of using just circles and squares. See you later!"}, {"post_id": 12274, "ts": "2026-06-20T01:13:08Z", "hours": 2.2489, "text": "Devlog #2: Adding Elements One Shape at a Time! Hey everyone, devlog #2! This week I added the first real drawing tools to the engine: lines,rectangles, and circles, all from scratch, no graphics library. Here’s how each shape works: Lines Lines use the Bresenham algorithm, which is an algorithm which finds the best way to create a straight line between two points. At first, I tried using the built-in SDL2 Line function, but it would produce choppy lines that wouldn’t be a straight, full line (see screenshot below). But, after implementing the Bresenham algorithm, it worked perfectly! Lines can be called using the line() function. Rectangles For Rectangles, I created two new functions. rectfill() and rect() . For rectfill() , I just hand to numpy to fill a whole block at once. For rect() , I just use the line() function 4 times to create the rectangle. Circles Circles use the midpoint method. The circles gave me the most trouble. My filled circle used different math than the outline, so it grew these weird single-pixel spikes around the edge (before pic). The fix was making the fill reuse the exact same midpoint math as the outline, so they finally match (after pic). What’s Next? In order for a game to work, we need the player to control something. So, the next step is adding movement. See you in the next devlog!"}, {"post_id": 12060, "ts": "2026-06-19T17:46:51Z", "hours": 1.0283, "text": "Devlog #1: The Start of a Long Climb! Hey everyone! Starting a new project: Olympus, a little game engine like PICO-8, built from scratch in Python. What I’ve Done So Far: So far I’ve got a window opening and my 16-color palette working. The annoying part was SDL2. I’m using it raw through ctypes, so it wants C-style byte strings and pointers everywhere, and I spent way too long just getting a blank window to show up without crashing. It works now though in the screenshot below. What’s Next? Next up: drawing actual shapes onto it. I’ve already tried implementing lines in the screenshot below, but it isn’t working currently. Hopefully in the next devlog, I can get it to work!"}]...
|
Title: Olympus by @nithilgadde | Stardance
Devlog Title: Olympus by @nithilgadde | Stardance
Devlogs:
Devlog #1: The Start of a Long Climb! Hey everyone! Starting a new project: Olympus, a little game engine like PICO-8, built from scratch in Python. What I’ve Done So Far: So far I’ve got a window opening and my 16-color palette working. The annoying part was SDL2. I’m using it raw through ctypes, so it wants C-style byte strings and pointers everywhere, and I spent way too long just getting a blank window to show up without crashing. It works now though in the screenshot below. What’s Next? Next up: drawing actual shapes onto it. I’ve already tried implementing lines in the screenshot below, but it isn’t working currently. Hopefully in the next devlog, I can get it to work!
Devlog #2: Adding Elements One Shape at a Time! Hey everyone, devlog #2! This week I added the first real drawing tools to the engine: lines,rectangles, and circles, all from scratch, no graphics library. Here’s how each shape works: Lines Lines use the Bresenham algorithm, which is an algorithm which finds the best way to create a straight line between two points. At first, I tried using the built-in SDL2 Line function, but it would produce choppy lines that wouldn’t be a straight, full line (see screenshot below). But, after implementing the Bresenham algorithm, it worked perfectly! Lines can be called using the line() function. Rectangles For Rectangles, I created two new functions. rectfill() and rect() . For rectfill() , I just hand to numpy to fill a whole block at once. For rect() , I just use the line() function 4 times to create the rectangle. Circles Circles use the midpoint method. The circles gave me the most trouble. My filled circle used different math than the outline, so it grew these weird single-pixel spikes around the edge (before pic). The fix was making the fill reuse the exact same midpoint math as the outline, so they finally match (after pic). What’s Next? In order for a game to work, we need the player to control something. So, the next step is adding movement. See you in the next devlog!
Devlog #3: Let there be Movement! Hey everyone! In this devlog, I added movement to our game engine: Olympus! New functions! I created two new functions: btn() and btnp() . btn() is for when the key on your keyboard will be held down. This can be used for movement. btnp() is for when the key is only going to be pressed once. This can be used for actions such as jumping, shooting, or confirming something in the game. How does the movement work? An objects position is two variables: px and py . px is the x-axis (left and right) and py is the y-axis (up and down). If you remember from algebra, when you subtract your initial position in the x-axis, you move to the left and when you add your initial position in the x-axis, you move right. The same applys for the y-axis. If you subtract, you move down. If you add, you go up. So, we check the keys using the btn() function. So, if btn(LEFT) == True when the left arrow is held, it will subtract from px on whatever value you want and it will move the character that way. What’s next? That’s it for today’s devlog. Tomorrow, I hope to finally implement sprites into the game, so you can add custom models instead of using just circles and squares. See you later!
Devlog #4: If Looks could Kill Hey everyone! Welcome back to another devlog! Today, I’ve finally implemented sprites into the game engine: Olympus. This way, you can make your character look like anything! How do the sprites actually work? I made my own sprite format, where each sprite is just rows of text where each character is a color and a dot means transparent. This is the coolest part as the engine will think the dots are transparent and there won’t be a big black box dragging the sprite around. And, if I wanted to flip the sprite around, I could just reverse the rows with numpy. There was a stupid bug where I kept getting a Screen object has no attribute spr error, an I couldn’t find out why. But, I realized that I wrote the method in the wrong file. But, after fixing that error, the program worked! What’s Next? Next up, we are adding text. Every game engine needs text and next up, we are adding that. See you next time!
Devlog #5: The Writing’s on the Wall. Hey everyone! Welcome back to another devlog for my game engine made in Python: Olympus. Today, I added the hardest things to implement: text and collisions. Text: This is the one I struggled with the most. I wanted text while having the 16-bit style that I was going for. I tried displaying text using the SDL2 functions, but it didn’t give me the effect I was looking for. So, I had to make my own. And, it was tough. It didn’t help that I had no idea what I was doing, but it also didn’t help that I had many bugs. However, I was able to figure it out. I was able to do this by making each letter a tiny picture made of pixels and store all of the characters in a lookup table. Collisions: Collisions was easy when looking at it. Check of the walls or an object is colliding. if it is, do something. Otherwise, don’t let the player go into it. But boy, was it hard to implement. I spent a good 3 hours just trying to figure out how to do this. But, eventually, I figured it out. It works as the collisions check if two boxes overlap only if they overlap left-to-right AND up-and-down. If there is a gap, then they aren’t touching. You can see both the text and the collisions in effect in the little demo I made below. What’s Next? I have a feeling that we are very close to being finished with this game engine, but I’m probably getting my hopes up. Next up, adding animations and tilemaps so that you can create levels. That’s it for me. see you later!
Devlog #6: Sights on the Peak! Hey everyone! Welcome back to another devlog. Today, we are one giant step forward in finishing the game engine: tilemaps and animations. Tilemaps: The whole level is a grid of letters. I draw my maps as plain text: W is a wall, C is a coin, ’. ‘is empty space (These are just the examples that I’m using for the demos). So a level is literally a block of text I type out, like ASCII art of the room. The engine turns each letter into a tile. It walks the grid square by square, and for each letter it looks up a matching 8×8 picture and stamps it at that spot. A ‘W’ becomes a wall tile, a ’. ‘draw nothing. This is all easy on paper but when actually trying to create it, it was hell. The amount of bugs that would come wouldn’t stop and I actually was very close to giving up for the day. But, I persisted, and after over 20+ Google Tabs, I was able to work it out. Animations: Even though I thought this would be the hardest thing to implement, this one was the easiest feature to implement imo. It’s a flipbook of sprites. A walk animation is just a list of frames, the same little pixel sprites I already made. Flip through them fast and the legs look like they’re moving. A timer controls the speed. If I swapped frames every single frame of the game (60 times a second) it’d be a blur, so I count ticks and only switch to the next frame every few ticks. That one number tunes how fast the walk looks. When it reaches the last frame it loops back to the first, so it cycles forever. It only animates when it should. While you hold an arrow, I advance the frames so the hero walks. When you let go, I reset to the standing pose so he doesn’t moonwalk in place. What’s Next? This engine is veryyy close to being finished! I just need to add sounds and this engine should be complete! After I finish the engine, I will ship the engine. See you next time! Also, if you want to know what the tilemap in the demo looks like in code, here it is: LEVEL = [ "WWWWWWWWWWWWWWWW", "W...........................................................W", "W.................WWW.......................C....W", "W............................................WWW..W", "W..C......................................................W", "W.......................WW...........................W", "W.....................WW............C...............W", "W..........................................................W", "W..................WWWW........................W", "W.............................C...........................W", "W.............................C...........................W", "W.........................WWWW.................W", "W..........................................................W", "W........................C...............C..............W", "W..........................................................W", "WWWWWWWWWWWWWWWW", ] ``` The formatting is messed up as the original is in Python, but I hope you get the gist!
Devlog #7: We’ve Reached the Peak! Hello everyone! Welcome back to another devlog. I’m happy to announce that my game engine, Olympus, is finally finished! Here’s what I added. Sound This part took about 1 - 2 hours to implement. Because the game engine is a 16-bit game engine, this means that we can only play sounds that are 16-bit. You can create your own sounds using the game engine, but you can also upload your own sounds. The program works by converting your sounds into a 16-bit audio that the game engine can render. Sprite Editor This part took foreverrrrr. Basically, instead of manually typing out sprites for your game, I wanted a editor where you could draw the sprites and then export them. This took forever because I didn’t know how to export your sprites into actual array code that would turn into a sprite. However, I was able to just reuse my code that render sprites from a list into the sprite editor and add functionality that would turn the blank spaces in the canvas into a ‘.’ (blank space) and all the squares that are drawn into an ‘x’ (the actual sprite pixels). I was also able to add saving and onion skinning. What’s Next? I’ll be turning Olympus into a Python library so everyone can install it. Then, I will ship the project. See you next time!
Devlog #8: The Ship has Sailed? Hey everyone! Stardance says that I have a certain amount of time logged and that if I ship and don’t make a devlog for that time, I’m gonna lose it. So, I’ll make a quick devlog: README.md: I created a nice README.md for the GitHub Repo. I also added a wiki, so that it will be very easy for anyone to learn Olympus. Turned into a Python Package This is my first time uploading a Python Package to PyPi, the official provider for Python packages, so this was a new experience. However, there are lots of documentation online that made it very easy. So, Olympus is now an official Python library! You can check it out when i ship the project. Welp, that’s it. I hope to see you next time!
Devlog #9: Starting to Fly Again Hello everyone! I’m finally making another devlog for Olympus. I took a break because I went on vacation and I didn’t feel motivated to start coding again. But now, I’m ready to show you the new things I’ve created. When I was looking at the code, I realized that I never added functionality to export a game. If you wanted to share your game with someone, you would have to send them your entire code and then make them install Python, Olympus, and it’s a huge deal just to play your game. So, I’ve implemented a game exporter! How it works So I used PyInstaller to make this work. Basically, when you export your game, PyInstalled will “freeze” your program. This means that it will trace every import your game makes, gathers all of your assets (your code, the Python interpreter, olympus, numpy, Pillow, PySDL2) and then packs it into one self-contained bundle. And that’s your game! What’s Next? Honesty, I have no idea. I’m planning on adding mouse implementation but it depends on what I’m feeling like doing. See you later! Below is a simple snake game that I created and it was created and exported by Olympus Engine.
Ships:
Hey everyone! I made Olympus, a small game engine for Python that lets you build tiny pixel games on a 128x128 screen with 16 colors, kind of like PICO-8. The twist is I built it from scratch. No pygame, no pyxel. The screen is just a numpy grid of color numbers, and I hand-wrote all the drawing myself: the lines, the circles, the sprite blitting, a little pixel font, even the sound. SDL2 only opens the window and reads the keyboard, it does none of the actual drawing. The hardest parts were the ones you don’t see. My filled circles came out with weird spikes poking off the sides until I rewrote them with a proper midpoint algorithm. Then turning it into a real installable library nearly broke me: wrong Python versions, a locked-down pip, and an upload token that kept getting rejected. I learned a lot more about packaging than I planned to. What I’m proudest of is that it’s actually real. You can install the library by going to the ‘Try project’ or ‘See source code’, both have proper instructions on how to install the library. Then, you can start building games! There is proper documentation in the ‘Wiki’ tab in the Github Repo (click See source code). Happy making! (The Demo is a copy of Snake using the Olympus Engine)...
|
1793252873.6442547
|
1793339273.6442547
|
|
22557
|
Custom-Rocket-Builder by @Shivansh_Mishra | Starda Custom-Rocket-Builder by @Shivansh_Mishra | Stardance...
|
Shivansh_Mishra
|
1
|
1.76
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-25T17:33:48Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "It’s a custom rocket builder website , where one can build his/her own rocket , explore pre built rockets , or something like that. The project is incomplete yet , so please don’t judge it’s just 1 day of development. Updating the project soon. For now the user can only select to highlight the rocket model", "repo": "https://github.com/Shivansh-Mishra-12/Custom-Rocket-Builder", "demo": "https://custom-rocket-builder.vercel.app/"}]...
|
[{"post_id": 16224, "ts": "202 [{"post_id": 16224, "ts": "2026-06-26T11:06:29Z", "hours": 0.7617, "text": "Devlog #3: Finally found a good 3d model for the rocket. Also replaced the launchpad as I found a better one on https://science.nasa.gov/3d-resources/ . THANKS NASA for this Cleaned up the project files , deleted extra useless models. Also updated the README.md file. Remember the project isn’t even half done yet so don’t judge."}, {"post_id": 15777, "ts": "2026-06-25T17:21:33Z", "hours": 0.3817, "text": "Devlog #2: This time I haven’t done a lot on this project. I changed the previous rocket model with a new one but I regret it now as the model is not built in parts rather it is a single body 3d model which basically means that I can’t select specific parts or components of the model. For example, in the previous model I was able to select and alter properties of different components of the rocket, fairing for Instance. Previously the fairing could be removed, but now it’s not possible. So for now I’m search for a nearly perfect free downloadable 3d model of a rocket as I’m not good at modelling or Blender. That’s all for today, Next Update Soon 🔜."}, {"post_id": 15023, "ts": "2026-06-24T12:27:38Z", "hours": 0.4567, "text": "DevLog #1: Well, today I started working on this project Custom-Rocket-Builder. My hackatime shows I coded this project for only 27 minutes but offcourse that’s not true. The amount of work I have done on this project clearly indicates I have spent hours coding into this project. Lemme introduct myself first, I’m Shivansh Mishra, a 12th grader with Science stream and interests in Computers and other exciting things. I’m developing this Project called “Custom-Rocket-Builder”. Till now I have setup the project, added 2 or more 3D Models. Also I added the functionality to hightlight some specific components of the rocket and that launchpad like 3d model, also I added the Moon and a loader screen (built using ai) as it looks really good. Next I’m planning to add boosters to the rocket and some other functionalities."}]...
|
Title: Custom-Rocket-Builder by @Shivansh_Mishra | Title: Custom-Rocket-Builder by @Shivansh_Mishra | Stardance
Devlogs:
DevLog #1: Well, today I started working on this project Custom-Rocket-Builder. My hackatime shows I coded this project for only 27 minutes but offcourse that’s not true. The amount of work I have done on this project clearly indicates I have spent hours coding into this project. Lemme introduct myself first, I’m Shivansh Mishra, a 12th grader with Science stream and interests in Computers and other exciting things. I’m developing this Project called “Custom-Rocket-Builder”. Till now I have setup the project, added 2 or more 3D Models. Also I added the functionality to hightlight some specific components of the rocket and that launchpad like 3d model, also I added the Moon and a loader screen (built using ai) as it looks really good. Next I’m planning to add boosters to the rocket and some other functionalities.
Devlog #2: This time I haven’t done a lot on this project. I changed the previous rocket model with a new one but I regret it now as the model is not built in parts rather it is a single body 3d model which basically means that I can’t select specific parts or components of the model. For example, in the previous model I was able to select and alter properties of different components of the rocket, fairing for Instance. Previously the fairing could be removed, but now it’s not possible. So for now I’m search for a nearly perfect free downloadable 3d model of a rocket as I’m not good at modelling or Blender. That’s all for today, Next Update Soon 🔜.
Devlog #3: Finally found a good 3d model for the rocket. Also replaced the launchpad as I found a better one on https://science.nasa.gov/3d-resources/ . THANKS NASA for this Cleaned up the project files , deleted extra useless models. Also updated the README.md file. Remember the project isn’t even half done yet so don’t judge.
Ships:
It’s a custom rocket builder website , where one can build his/her own rocket , explore pre built rockets , or something like that. The project is incomplete yet , so please don’t judge it’s just 1 day of development. Updating the project soon. For now the user can only select to highlight the rocket model...
|
1793310488.5566902
|
1793396888.5566902
|
|
22560
|
NovaBIOS by @tonyx | Stardance
|
tonyx
|
1
|
0.4
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-20T13:21:31Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a fake BIOS ( a bootloader / little kernel ) which allows you to manage your device without worrying about hardware limitations, compatible with all CPUs.", "repo": "https://github.com/Juste1dev/NovaBIOS", "demo": "https://github.com/Juste1dev/NovaBIOS/releases/tag/NovaBIOS"}]...
|
[{"post_id": 12603, "ts": "202 [{"post_id": 12603, "ts": "2026-06-20T16:19:30Z", "hours": 0.3986, "text": "adding ascii-art for Hack-Club ❤️❤️"}, {"post_id": 12520, "ts": "2026-06-20T13:20:00Z", "hours": 0.3219, "text": "adding more devices"}]...
|
Title: NovaBIOS by @tonyx | Stardance
Devlogs:
ad Title: NovaBIOS by @tonyx | Stardance
Devlogs:
adding more devices
adding ascii-art for Hack-Club ❤️❤️
Ships:
This is a fake BIOS ( a bootloader / little kernel ) which allows you to manage your device without worrying about hardware limitations, compatible with all CPUs....
|
1793307249.4570954
|
1793393649.4570954
|
|
22565
|
In This Economy!? by @OrangePainting | Stardance
|
OrangePainting
|
1
|
48.0
|
593
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-28T11:27:44Z", "hours": 48.0, "multiplier": 16.7, "payout": 593, "blessing": "neutral", "text": "I made an incremental clicker game where you experience the harsh results of applying to jobs. Work hard, apply a lot, and complete projects to maximize your chances of landing an offer! This game was created for The Very Serious Juniper Dev Game Jam, which meant I had 7 days to create a game with the theme “spin to win.” It was challenging to bring this all together in 7 or so days, but the community I had in-person and online helped me finish this project. I have had this game playtested a few times to be able to find soooo many bugs, graphical issues, and suggestions. Because of this, I am very proud of what I have made. Please play it on itch.io using the buttons, and feel free to check out the code in Github. This entire game was made using the Godot Game Engine.", "repo": "https://github.com/OrangePainting/in-this-economy", "demo": "https://orangepainting.itch.io/in-this-economy"}]...
|
[{"post_id": 17537, "ts": "202 [{"post_id": 17537, "ts": "2026-06-28T11:22:04Z", "hours": 0.3436, "text": "Final Devlog There was some issues with linking my game, but now everything is set, and I even did some more optimizations. Please play my game on itch.io, and you can see the github with all my code linked as well."}, {"post_id": 17031, "ts": "2026-06-27T17:18:33Z", "hours": 6.6281, "text": "In This Economy!? - Devlog 5 Yay, it’s done. Please play it and provide feedback so that I can make the game better in the future! Itch.io page is finished up Added 2 more tracks Added some more sound effects Added a tutorial at the beginning of the game Fixed some more bugs and graphical issues Game works on mobile, and desktop (mouse and spacebar works) Added achievements to track the player’s progress Added another minigame project, each with their own win and death screens now. Some Final QOL stuff to finish There are some minor graphical issues, but they are mainly unnoticable. I also plan to improve the performance of the game in the backend after this project is shipped :) Thanks!"}, {"post_id": 16124, "ts": "2026-06-26T06:51:54Z", "hours": 20.3653, "text": "In This Economy!? - Devlog 4 I did a ton of more changes again, but mainly it’s just Quality of Life stuff, mainly from my friends playtesting the game for me: Big Changes: 2 More music tracks and 10 more paper sounds added Added a start screen that players can type into Added a new project minigame to balance out the game in general Smaller Changes: The game is more balanced Replaced the Quit button with a Credits button because this game will be played on the web Changed the projects tab to be more understandable"}, {"post_id": 14705, "ts": "2026-06-23T22:06:09Z", "hours": 12.3967, "text": "[PLACEHOLDER] - Devlog 3 I added a bunch of things, because I’m nearing the deadline (only 2 days left :0) Big changes: Added a lot of SFX and Music, mostly done by me but also sourced from online Added more art for projects and the background using Aseprite Added Title Screen with start and quit buttons Added End Screen for when you win the game Made my first project for the projects tab Made more active UI How To Play section is complete Updated the layout entirely QOL stuff: Added settings for Music and SFX in the settings section Added Credits Entire project is organized to make things easier to access Scrolling background in the main menu, along with custom shader and particle animations just for fun Better animations so that things don’t suddenly appear or disappear Still have a lot more things to do, but it should be doable yay."}, {"post_id": 13377, "ts": "2026-06-21T22:19:18Z", "hours": 6.6122, "text": "[PLACEHOLDER] - Devlog 2 Added more functionality: There is now a tab system that players can click through Base upgrades are now available, and are functional Changed a few sprites to make disabled button sprites, and fit the theme more of applying to jobs I plan to add more places to spin, as that’s a key mechanic for this game. I want it to be as accessible too, so a tutorial is also necessary to make at some point."}, {"post_id": 12243, "ts": "2026-06-20T00:12:47Z", "hours": 1.9492, "text": "[PLACEHOLDER] - Devlog 1 Currently don’t have much done, but added some basic spin functionality, along with some pass and fail results. There isn’t much else yet, but I plan to add some upgrades and make the sprites a little better before the 7th day. Don’t have a name yet."}]...
|
Title: In This Economy!? by @OrangePainting | Star Title: In This Economy!? by @OrangePainting | Stardance
Devlogs:
[PLACEHOLDER] - Devlog 1 Currently don’t have much done, but added some basic spin functionality, along with some pass and fail results. There isn’t much else yet, but I plan to add some upgrades and make the sprites a little better before the 7th day. Don’t have a name yet.
[PLACEHOLDER] - Devlog 2 Added more functionality: There is now a tab system that players can click through Base upgrades are now available, and are functional Changed a few sprites to make disabled button sprites, and fit the theme more of applying to jobs I plan to add more places to spin, as that’s a key mechanic for this game. I want it to be as accessible too, so a tutorial is also necessary to make at some point.
[PLACEHOLDER] - Devlog 3 I added a bunch of things, because I’m nearing the deadline (only 2 days left :0) Big changes: Added a lot of SFX and Music, mostly done by me but also sourced from online Added more art for projects and the background using Aseprite Added Title Screen with start and quit buttons Added End Screen for when you win the game Made my first project for the projects tab Made more active UI How To Play section is complete Updated the layout entirely QOL stuff: Added settings for Music and SFX in the settings section Added Credits Entire project is organized to make things easier to access Scrolling background in the main menu, along with custom shader and particle animations just for fun Better animations so that things don’t suddenly appear or disappear Still have a lot more things to do, but it should be doable yay.
In This Economy!? - Devlog 4 I did a ton of more changes again, but mainly it’s just Quality of Life stuff, mainly from my friends playtesting the game for me: Big Changes: 2 More music tracks and 10 more paper sounds added Added a start screen that players can type into Added a new project minigame to balance out the game in general Smaller Changes: The game is more balanced Replaced the Quit button with a Credits button because this game will be played on the web Changed the projects tab to be more understandable
In This Economy!? - Devlog 5 Yay, it’s done. Please play it and provide feedback so that I can make the game better in the future! Itch.io page is finished up Added 2 more tracks Added some more sound effects Added a tutorial at the beginning of the game Fixed some more bugs and graphical issues Game works on mobile, and desktop (mouse and spacebar works) Added achievements to track the player’s progress Added another minigame project, each with their own win and death screens now. Some Final QOL stuff to finish There are some minor graphical issues, but they are mainly unnoticable. I also plan to improve the performance of the game in the backend after this project is shipped :) Thanks!
Final Devlog There was some issues with linking my game, but now everything is set, and I even did some more optimizations. Please play my game on itch.io, and you can see the github with all my code linked as well.
Ships:
I made an incremental clicker game where you experience the harsh results of applying to jobs. Work hard, apply a lot, and complete projects to maximize your chances of landing an offer! This game was created for The Very Serious Juniper Dev Game Jam, which meant I had 7 days to create a game with the theme “spin to win.” It was challenging to bring this all together in 7 or so days, but the community I had in-person and online helped me finish this project. I have had this game playtested a few times to be able to find soooo many bugs, graphical issues, and suggestions. Because of this, I am very proud of what I have made. Please play it on itch.io using the buttons, and feel free to check out the code in Github. This entire game was made using the Godot Game Engine....
|
1793227764.50145
|
1793314164.50145
|
|
22609
|
Pretty Simple File Sharing Protocol by @brny | Sta Pretty Simple File Sharing Protocol by @brny | Stardance...
|
brny
|
1
|
11.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-31T14:01:01Z", "hours": 11.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a custom encrypted file sharing protocol in rust. This was overall a great learning project that helped me learn how threads, networking, files, tls and hashes work. I am hoping to continue the development of this project in the future and keep improving it.", "repo": "https://github.com/angrypig555/psfsp", "demo": "https://github.com/angrypig555/psfsp/releases"}]...
|
[{"post_id": 58896, "ts": "202 [{"post_id": 58896, "ts": "2026-08-31T13:48:57Z", "hours": 2.6442, "text": "Final devlog! This is my final devlog before shipping this project! There hasn’t been a devlog in a really long time so i decided to do one now. New features: File uploading from client to server Cross platform build script Fixed a bug where the client doesn’t gracefully close the connection This update doesn’t have any huge notable changes beside these 2. The GUI doesn’t support uploading due to how the library works but you can upload files from the CLI. Thank you for reading this devlog here’s an image of the build script in action"}, {"post_id": 14506, "ts": "2026-06-23T17:26:15Z", "hours": 2.6492, "text": "There’s now a GUI There has been 1 huge addition made to psfsp and it’s that there is a GUI now. It is not a traditional GUI, but it more resembles electron, using a library called tauri which uses the system webview but allows you to call rust functions from the app. Currently the app shows the available files and allows you to download files from the server but the code is a bit buggy on the networking side and shows error messages when it’s completely fine Goals: Fixing all the current bugs Better styling File compression"}, {"post_id": 13111, "ts": "2026-06-21T13:25:42Z", "hours": 2.4506, "text": "IT’S NOW ENCRYPTED!!! There have been a lot of new updates and improvements to psfsp. Here’s all of them: Added a better UI for the client side Fixed bug where if the file is larger, verifying the hashes would fail. Added the ability to query the files available and, the big one Added username and password authentication - Added TLS encryption so everything is encrypted including your password and username and the files you download The TLS certificates are generated locally on the first startup and saved to the home folder. They are self signed and do not depend on a machine name. Future goals: Graphical User Interface for the client (current) Ability to delete, rename and upload files Compression Key based authentication Control panel for the server DDOS protection That’s it for now"}, {"post_id": 12642, "ts": "2026-06-20T17:27:31Z", "hours": 3.2772, "text": "hashes are cool It’s new devlog time. There have been a ton of features added to pretty simple file sharing protocol. - First of all, you can share files. Second of all, files are hashed to verify their integrity What are some of the future goals? Username / password authentication Encryption Docker container Currently known bugs If you put the END byte in the file being sent, it will be interpreted as the end of the file and will result in a broken download What’s the goal of this program? This is meant to be a replacement for the dated FTP protocol, and even a competitor though there is a long way to go."}, {"post_id": 12110, "ts": "2026-06-19T19:38:04Z", "hours": 0.2675, "text": "PSFSP is a custom file sharing protocol built completely from scratch. It would reroute every new connection to a new thread on an ephemeral port, and send the data in chunks along with hashes. I currently started writing the definitions for the bytes and the documentation for them but also set up cargo and other stuff."}]...
|
Title: Pretty Simple File Sharing Protocol by @brn Title: Pretty Simple File Sharing Protocol by @brny | Stardance
Devlogs:
PSFSP is a custom file sharing protocol built completely from scratch. It would reroute every new connection to a new thread on an ephemeral port, and send the data in chunks along with hashes. I currently started writing the definitions for the bytes and the documentation for them but also set up cargo and other stuff.
hashes are cool It’s new devlog time. There have been a ton of features added to pretty simple file sharing protocol. - First of all, you can share files. Second of all, files are hashed to verify their integrity What are some of the future goals? Username / password authentication Encryption Docker container Currently known bugs If you put the END byte in the file being sent, it will be interpreted as the end of the file and will result in a broken download What’s the goal of this program? This is meant to be a replacement for the dated FTP protocol, and even a competitor though there is a long way to go.
IT’S NOW ENCRYPTED!!! There have been a lot of new updates and improvements to psfsp. Here’s all of them: Added a better UI for the client side Fixed bug where if the file is larger, verifying the hashes would fail. Added the ability to query the files available and, the big one Added username and password authentication - Added TLS encryption so everything is encrypted including your password and username and the files you download The TLS certificates are generated locally on the first startup and saved to the home folder. They are self signed and do not depend on a machine name. Future goals: Graphical User Interface for the client (current) Ability to delete, rename and upload files Compression Key based authentication Control panel for the server DDOS protection That’s it for now
There’s now a GUI There has been 1 huge addition made to psfsp and it’s that there is a GUI now. It is not a traditional GUI, but it more resembles electron, using a library called tauri which uses the system webview but allows you to call rust functions from the app. Currently the app shows the available files and allows you to download files from the server but the code is a bit buggy on the networking side and shows error messages when it’s completely fine Goals: Fixing all the current bugs Better styling File compression
Final devlog! This is my final devlog before shipping this project! There hasn’t been a devlog in a really long time so i decided to do one now. New features: File uploading from client to server Cross platform build script Fixed a bug where the client doesn’t gracefully close the connection This update doesn’t have any huge notable changes beside these 2. The GUI doesn’t support uploading due to how the library works but you can upload files from the CLI. Thank you for reading this devlog here’s an image of the build script in action
Ships:
I made a custom encrypted file sharing protocol in rust. This was overall a great learning project that helped me learn how threads, networking, files, tls and hashes work. I am hoping to continue the development of this project in the future and keep improving it....
|
1793242515.4253159
|
1793328915.4253159
|
|
22612
|
RC car by @Sked | Stardance
|
Sked
|
1
|
58.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-29T21:57:08Z", "hours": 58.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made my own RC car in 1/10 scale because i always wanted one! When i was younger I always liked the idea of vehicles that you can control yourself So i decided to built one. I knew that this is going to be hard because this is my very first project like this and i was ready. It was really hard to start because i didnt know where and how. I used only to find good electronics and hardware for this project. I was deeply inspired by Robak 2 project. I took some ideas from it but every 3d model was made by me. I am very proud of myself because at the start i thought that i am not going to finish this project but i actually did. When i started building it i didn’t know about StarDance so i was building it for myself but now i released all 3D CAD files. It will be very hard to understand and built this car. I know that there is a lot of things that you can modify to make it better but for now i think its fine. I had a lot of fun building this RC car", "repo": "https://github.com/Sked777/RC-car-", "demo": ""}]...
|
[{"post_id": 75338, "ts": "202 [{"post_id": 75338, "ts": "2026-09-29T19:39:10Z", "hours": 10.6006, "text": "I am actually finishing this project. This is the last devlog. I finally printed the body and assembled it."}, {"post_id": 73990, "ts": "2026-09-26T14:07:47Z", "hours": 12.8336, "text": "This car needs a lot of work. one day everything broke and i spent like a week reprinting and reassembling everything. Also differentials were leaking so i took them apart, cleaned everything and reassembled"}, {"post_id": 69735, "ts": "2026-09-17T17:51:13Z", "hours": 10.0503, "text": "still working on the car. fixing a lot of things"}, {"post_id": 65335, "ts": "2026-09-10T12:41:51Z", "hours": 9.7836, "text": "I made it work but it keeps breaking, so Im constantly changing and reprinting a lot of parts. The battery is now fixed in place. I still Dont know what kind of body to give it"}, {"post_id": 59479, "ts": "2026-09-01T10:48:26Z", "hours": 11.0289, "text": "still working on my RC car! soon finishing it but i lost some parts and now im waiting for new ones and also i finally figured out suspension."}, {"post_id": 19577, "ts": "2026-06-30T22:24:11Z", "hours": 1.3336, "text": "I keep working on my car Today i did lower rear arm and it has holes for mounting shocks It will be a double wishbone suspension"}, {"post_id": 17888, "ts": "2026-06-28T20:30:44Z", "hours": 0.8167, "text": "Today i did an upper suspension arm for my RC car cant wait to complete this project and finally drive it"}, {"post_id": 17201, "ts": "2026-06-27T22:12:20Z", "hours": 1.2503, "text": "I am making my own RC car in approximately 1/10 scale i did base of the car before i found out of the Stardance challenge but now i am making rest of the car Today i started making wheel hubs and soon will be making suspension arms"}]...
|
Title: RC car by @Sked | Stardance
Devlogs:
I am Title: RC car by @Sked | Stardance
Devlogs:
I am making my own RC car in approximately 1/10 scale i did base of the car before i found out of the Stardance challenge but now i am making rest of the car Today i started making wheel hubs and soon will be making suspension arms
Today i did an upper suspension arm for my RC car cant wait to complete this project and finally drive it
I keep working on my car Today i did lower rear arm and it has holes for mounting shocks It will be a double wishbone suspension
still working on my RC car! soon finishing it but i lost some parts and now im waiting for new ones and also i finally figured out suspension.
I made it work but it keeps breaking, so Im constantly changing and reprinting a lot of parts. The battery is now fixed in place. I still Dont know what kind of body to give it
still working on the car. fixing a lot of things
This car needs a lot of work. one day everything broke and i spent like a week reprinting and reassembling everything. Also differentials were leaking so i took them apart, cleaned everything and reassembled
I am actually finishing this project. This is the last devlog. I finally printed the body and assembled it.
Ships:
I made my own RC car in 1/10 scale because i always wanted one! When i was younger I always liked the idea of vehicles that you can control yourself So i decided to built one. I knew that this is going to be hard because this is my very first project like this and i was ready. It was really hard to start because i didnt know where and how. I used only to find good electronics and hardware for this project. I was deeply inspired by Robak 2 project. I took some ideas from it but every 3d model was made by me. I am very proud of myself because at the start i thought that i am not going to finish this project but i actually did. When i started building it i didn’t know about StarDance so i was building it for myself but now i released all 3D CAD files. It will be very hard to understand and built this car. I know that there is a lot of things that you can modify to make it better but for now i think its fine. I had a lot of fun building this RC car...
|
1793152066.933572
|
1793238466.933572
|
|
22613
|
Color Companion by @Connorr | Stardance
|
Connorr
|
1
|
7.0
|
33
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-28T23:55:39Z", "hours": 7.0, "multiplier": 5.0, "payout": 33, "blessing": "neutral", "text": "The Color Companion is a handheld tool that can give you the color values of objects. I really enjoyed making this as a whole, especially designing the case and writing the code. There were some challenges, like having to make my own display mount, and soldering everything together, but in the end I had a lot of fun!", "repo": "https://github.com/LetsEatLead/Color-Companion", "demo": ""}]...
|
[{"post_id": 18007, "ts": "202 [{"post_id": 18007, "ts": "2026-06-28T23:42:42Z", "hours": 1.0097, "text": "Color Companion Devlog #3 What is this? A lil handheld device that can tell you the color values of what you put it on. What’s New? Its done! I wired it all up, added some bevels to the case so its not sharp, and added a hex conversion at the bottom of the display. I also made a GitHub for it (check it out, it has a lot more info than this devlog!). https://github.com/LetsEatLead/Color-Companion/"}, {"post_id": 15430, "ts": "2026-06-25T02:16:00Z", "hours": 3.5844, "text": "Color Companion (Formerly IRL Color Picker) Devlog #2 What is this? Ever seen a color and thought, I want that color! The Color Companion is a handheld device with a color sensor and display, which can give you the exact RGB and HEX values of anything for you! New Stuff Goodbye breadboard, hello case! I modeled an enclosure for the esp32 devboard, TCS34725 color sensor, and the SSD1306 oled display, along with a little toggle button for holding the color on the display. Also, the color sensor has a shroud which seals itself out from ambient light, and includes a little divider between the integrated LED and the sensor itself. This way, the sensor only receives light reflected from the object, not straight from the LED. Challenges While I originally intended it to have a built in battery, that would end up having to double the components (Battery, battery charger module, boost converter to get 5V), and also make the device too big. So I had to scrap it :( When I was building the mount for the display, I thought it would be easy. Just pop in four mounting holes for the screen, screw in the M3 bolts, and done. But disaster struck, The mounting holes for the display were M2 (A whole mm smaller than M3)! And because I didn’t have M2 bolts, I had to come up with a weird mounting solution. (Silver lining, I only need 2 bolts instead of 4 using my mount) What now? Wire it up! Add HEX color values to the display Make the case round so it feels good to hold"}, {"post_id": 13858, "ts": "2026-06-22T18:20:01Z", "hours": 2.0014, "text": "Color Picker Devlog #1 What is this? The color picker is a device which can identify the RGB and HEX color values of any object using a color sensor and a integrated screen! Progress Figured out how to use the display and color sensor Added a button which starts color sampling and turns on the LED (When the button is released, the screen stops updating and LED is turned off) Completed the wiring and most of the coding Challenges To convert the raw values to the displayed values, I had to divide the raw value by the overall light and multiply it by 256, but the number simplified itself to zero, resulting in 0 * 256 = 0, and only displaying zero as the color values. I fixed this by multiplying first, and then dividing, avoiding the simplification to zero. What’s Next? Add battery power (Via a 18650 and tp4056 charging module) Create a 3d printed enclosure Add RGB to HEX conversion Add a shroud around the sensor to block outside light and get better color accuracy"}]...
|
Title: Color Companion by @Connorr | Stardance
De Title: Color Companion by @Connorr | Stardance
Devlogs:
Color Picker Devlog #1 What is this? The color picker is a device which can identify the RGB and HEX color values of any object using a color sensor and a integrated screen! Progress Figured out how to use the display and color sensor Added a button which starts color sampling and turns on the LED (When the button is released, the screen stops updating and LED is turned off) Completed the wiring and most of the coding Challenges To convert the raw values to the displayed values, I had to divide the raw value by the overall light and multiply it by 256, but the number simplified itself to zero, resulting in 0 * 256 = 0, and only displaying zero as the color values. I fixed this by multiplying first, and then dividing, avoiding the simplification to zero. What’s Next? Add battery power (Via a 18650 and tp4056 charging module) Create a 3d printed enclosure Add RGB to HEX conversion Add a shroud around the sensor to block outside light and get better color accuracy
Color Companion (Formerly IRL Color Picker) Devlog #2 What is this? Ever seen a color and thought, I want that color! The Color Companion is a handheld device with a color sensor and display, which can give you the exact RGB and HEX values of anything for you! New Stuff Goodbye breadboard, hello case! I modeled an enclosure for the esp32 devboard, TCS34725 color sensor, and the SSD1306 oled display, along with a little toggle button for holding the color on the display. Also, the color sensor has a shroud which seals itself out from ambient light, and includes a little divider between the integrated LED and the sensor itself. This way, the sensor only receives light reflected from the object, not straight from the LED. Challenges While I originally intended it to have a built in battery, that would end up having to double the components (Battery, battery charger module, boost converter to get 5V), and also make the device too big. So I had to scrap it :( When I was building the mount for the display, I thought it would be easy. Just pop in four mounting holes for the screen, screw in the M3 bolts, and done. But disaster struck, The mounting holes for the display were M2 (A whole mm smaller than M3)! And because I didn’t have M2 bolts, I had to come up with a weird mounting solution. (Silver lining, I only need 2 bolts instead of 4 using my mount) What now? Wire it up! Add HEX color values to the display Make the case round so it feels good to hold
Color Companion Devlog #3 What is this? A lil handheld device that can tell you the color values of what you put it on. What’s New? Its done! I wired it all up, added some bevels to the case so its not sharp, and added a hex conversion at the bottom of the display. I also made a GitHub for it (check it out, it has a lot more info than this devlog!). https://github.com/LetsEatLead/Color-Companion/
Ships:
The Color Companion is a handheld tool that can give you the color values of objects. I really enjoyed making this as a whole, especially designing the case and writing the code. There were some challenges, like having to make my own display mount, and soldering everything together, but in the end I had a lot of fun!...
|
1793285682.7854457
|
1793372082.7854457
|
|
22628
|
AdiBot:HackClub SlackBot by @nathanaditya254 | Sta AdiBot:HackClub SlackBot by @nathanaditya254 | Stardance...
|
nathanaditya254
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-19T21:20:34Z", "hours": 0.0, "multiplier": 1.47, "payout": 0, "blessing": "neutral", "text": "What did I make? A Slack bot called AdiBot that responds to slash commands in the Hack Club workspace. You can use /adibot-ping to check if it’s online, /adibot-joke to get a random joke, and /adibot-help to see all commands. What was challenging? Running into an SSL error on Mac when testing locally, and figuring out that GitHub doesn’t let you use your password anymore when cloning on a new server. What are you proud of? Getting it deployed on Hack Club Nest as a systemd service so it runs 24/7 even when my laptop is closed. It feels like an actual real deployment. What should people know so they can test your project? Just go to any Hack Club Slack channel and type /adibot-ping, /adibot-joke, or /adibot-help and the bot will respond! You can even try it in your private DMs with yourself!", "repo": "https://github.com/nathanaditya254/StardanceChallenge-slackBot-adibot", "demo": "https://hackclub.enterprise.slack.com/archives/C0BBRG1K5HR"}]...
|
[{"post_id": 12151, "ts": "202 [{"post_id": 12151, "ts": "2026-06-19T21:01:43Z", "hours": 0.2889, "text": "I built AdiBot, a custom Slack bot for the Hack Club workspace that responds to slash commands. Anyone in the Hack Club Slack can use it by typing one of three commands in any channel: /adibot-ping — checks if the bot is online and shows latency /adibot-joke — fetches a random joke from an API /adibot-help — lists all available commands I built it using Python and the Slack Bolt library, with Socket Mode so no public URL was needed. The bot pulls jokes from the Official Joke API using the requests library. I stored my tokens securely in a .env file and kept them out of GitHub using .gitignore. For hosting, I deployed it on Hack Club Nest, a free Linux server for students. I set it up as a systemd service so it runs 24/7 and automatically restarts if it ever crashes, even when my laptop is closed. The trickiest part was dealing with an SSL certificate error on Mac when first running the bot locally, and setting up GitHub authentication on the Nest server. Both were good debugging experiences!"}]...
|
Title: AdiBot:HackClub SlackBot by @nathanaditya25 Title: AdiBot:HackClub SlackBot by @nathanaditya254 | Stardance
Devlogs:
I built AdiBot, a custom Slack bot for the Hack Club workspace that responds to slash commands. Anyone in the Hack Club Slack can use it by typing one of three commands in any channel: /adibot-ping — checks if the bot is online and shows latency /adibot-joke — fetches a random joke from an API /adibot-help — lists all available commands I built it using Python and the Slack Bolt library, with Socket Mode so no public URL was needed. The bot pulls jokes from the Official Joke API using the requests library. I stored my tokens securely in a .env file and kept them out of GitHub using .gitignore. For hosting, I deployed it on Hack Club Nest, a free Linux server for students. I set it up as a systemd service so it runs 24/7 and automatically restarts if it ever crashes, even when my laptop is closed. The trickiest part was dealing with an SSL certificate error on Mac when first running the bot locally, and setting up GitHub authentication on the Nest server. Both were good debugging experiences!
Ships:
What did I make? A Slack bot called AdiBot that responds to slash commands in the Hack Club workspace. You can use /adibot-ping to check if it’s online, /adibot-joke to get a random joke, and /adibot-help to see all commands. What was challenging? Running into an SSL error on Mac when testing locally, and figuring out that GitHub doesn’t let you use your password anymore when cloning on a new server. What are you proud of? Getting it deployed on Hack Club Nest as a systemd service so it runs 24/7 even when my laptop is closed. It feels like an actual real deployment. What should people know so they can test your project? Just go to any Hack Club Slack channel and type /adibot-ping, /adibot-joke, or /adibot-help and the bot will respond! You can even try it in your private DMs with yourself!...
|
1793141748.4874163
|
1793228148.4874163
|
|
22634
|
Now That's What I Call A Broadcast by @Kapios Now That's What I Call A Broadcast by @Kapios | Stardance...
|
Kapios
|
1
|
12.61
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-26T11:39:28Z", "hours": 11.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hi there! Now That’s What I Call A Broadcast is an application that lets you watch videos/streams from your cozy computer terminal. It works sort of in a way like analog tv, where you don’t set the color for each pixel but you modify the color of the beam that progressively scans across the frame with operations like addition and subtraction and more. Version 0.1.0 (this) only includes playing videos from .ntwicab files, but the general idea is already present. You can have a variable framerate, video dimensions and even change metadata on the fly. Demo files are included in the GitHub release, and an instruction on how to make your own files is in the README. After this, I will start working on receiving and broadcasting via the Internet. It’s mostly made using Spectre.Console in C#. Hope you like it :D", "repo": "https://github.com/kapios010/NTWICAB/", "demo": "https://github.com/kapios010/NTWICAB/releases"}]...
|
[{"post_id": 17743, "ts": "202 [{"post_id": 17743, "ts": "2026-06-28T17:40:07Z", "hours": 1.6106, "text": "Working on receiving network streams. Over TCP because the header kinda messes up the broadcast part unless i change it so it’s multiplexed so the header will be sent over individually and only then will a client join the broadcast. Had trouble with how to make both receiving packets and displaying the stream happen simultaneously, but maybe hopefully this should work? i think that’s how it’s used"}, {"post_id": 14768, "ts": "2026-06-24T00:04:44Z", "hours": 1.3639, "text": "A demonstration of everything that works* now, including the main menu, opening the file, showing the video, changing the stream metadata and ending the stream. The Frame Rate Adjusting for framerate uses delta time between the start and end of frame, and if it’s smaller than the allocated time for one frame, it waits. Of course I couldn’t just do Thread.Sleep() because if someone sets the stream to 1fp4s then you’d have to wait the full 4 seconds before being to exit, so it just continue s the loop and on each next iteration checks if the time has passed. Janky? Maybe. works? well enough."}, {"post_id": 14015, "ts": "2026-06-23T00:15:31Z", "hours": 3.6967, "text": "Reading a stream from file is now possible :D Framerate will be measured in Frames per 4 seconds (hence fp4s) to make slow streams not painful to make while fast videos can be played up to 255fp4s so 63,75fps. This didn’t very much focus on reading files as it was reading streams in general so a big part of the groundwork for playing from remote is now done! edit: Well, delta time for frame rate isn’t implemented yet so that will also need to be done"}, {"post_id": 13433, "ts": "2026-06-22T00:27:53Z", "hours": 0.5094, "text": "Made the layout for the stream viewer. Uses a few Panel widgets inside a Layout. Next to implement actually parsing the image data and drawing it."}, {"post_id": 13384, "ts": "2026-06-21T22:35:36Z", "hours": 3.3367, "text": "Made a .ntwicab file parser (well, the metadata part). The stream player will include metadata like video name, author and a broadcast identification thingy (like a network bug but made from Unicode characters). Currently the string limit is 32, wilk probably double that. I think I’ll also make the bug bigger (it’s currently 4 rows x 16 chars )"}, {"post_id": 12776, "ts": "2026-06-20T21:45:42Z", "hours": 2.1683, "text": "Made a simple banner and a simple main menu with Spectre Console (only the quit button works; embarrassing for 2hrs of work lmao)"}]...
|
Title: Now That's What I Call A Broadcast by @ Title: Now That's What I Call A Broadcast by @Kapios | Stardance
Devlogs:
Made a simple banner and a simple main menu with Spectre Console (only the quit button works; embarrassing for 2hrs of work lmao)
Made a .ntwicab file parser (well, the metadata part). The stream player will include metadata like video name, author and a broadcast identification thingy (like a network bug but made from Unicode characters). Currently the string limit is 32, wilk probably double that. I think I’ll also make the bug bigger (it’s currently 4 rows x 16 chars )
Made the layout for the stream viewer. Uses a few Panel widgets inside a Layout. Next to implement actually parsing the image data and drawing it.
Reading a stream from file is now possible :D Framerate will be measured in Frames per 4 seconds (hence fp4s) to make slow streams not painful to make while fast videos can be played up to 255fp4s so 63,75fps. This didn’t very much focus on reading files as it was reading streams in general so a big part of the groundwork for playing from remote is now done! edit: Well, delta time for frame rate isn’t implemented yet so that will also need to be done
A demonstration of everything that works* now, including the main menu, opening the file, showing the video, changing the stream metadata and ending the stream. The Frame Rate Adjusting for framerate uses delta time between the start and end of frame, and if it’s smaller than the allocated time for one frame, it waits. Of course I couldn’t just do Thread.Sleep() because if someone sets the stream to 1fp4s then you’d have to wait the full 4 seconds before being to exit, so it just continue s the loop and on each next iteration checks if the time has passed. Janky? Maybe. works? well enough.
Working on receiving network streams. Over TCP because the header kinda messes up the broadcast part unless i change it so it’s multiplexed so the header will be sent over individually and only then will a client join the broadcast. Had trouble with how to make both receiving packets and displaying the stream happen simultaneously, but maybe hopefully this should work? i think that’s how it’s used
Ships:
Hi there! Now That’s What I Call A Broadcast is an application that lets you watch videos/streams from your cozy computer terminal. It works sort of in a way like analog tv, where you don’t set the color for each pixel but you modify the color of the beam that progressively scans across the frame with operations like addition and subtraction and more. Version 0.1.0 (this) only includes playing videos from .ntwicab files, but the general idea is already present. You can have a variable framerate, video dimensions and even change metadata on the fly. Demo files are included in the GitHub release, and an instruction on how to make your own files is in the README. After this, I will start working on receiving and broadcasting via the Internet. It’s mostly made using Spectre.Console in C#. Hope you like it :D...
|
1793260126.6108453
|
1793346526.6108453
|
|
22635
|
Macropad by @danielmb | Stardance
|
danielmb
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-04T19:39:08Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I build a macropad that uses ESPHome to connect to Home Assistant where it can can control stuf like my spotify. It has a 4x4 button matrix, a small oled screen, 2 leds and 2 knobs. It was really fun to make. The most challenging was designing the pcb.", "repo": "https://github.com/DaanDolfijn/Macropad-HA", "demo": ""}]...
|
[{"post_id": 61717, "ts": "202 [{"post_id": 61717, "ts": "2026-09-04T19:13:40Z", "hours": 1.3167, "text": "So its a long time since i made a devlog, thats cus i waited for the funding and then for the pcb. Once the pcb arrived i stated assembling the pparts taht didnt need the case. Thats becouse i needed to redisign it, i did that (and didnt log that time :( ) and then assembled the rest. And lastly i assigned all the buttons to Home Assistant automations"}, {"post_id": 28146, "ts": "2026-07-14T08:00:36Z", "hours": 1.4236, "text": "So i have not posted a Devlog in a little bit and i did some work. First of all i finished the PCB, but did that without recording in Lookout. After that i designed a case for everything. And lastly i fixed the command that sets the volume on my PC."}, {"post_id": 13687, "ts": "2026-06-22T13:15:28Z", "hours": 1.7167, "text": "Started working on the PCB, Its more work than i expected at first, but its beginning to look nice. I prob only need like 20 min to finish it."}, {"post_id": 12552, "ts": "2026-06-20T14:38:20Z", "hours": 1.8211, "text": "Soooo, this is my first project on stardance or hackclub. I started this project about a week ago and got some parts today. i am making a macropad that connects to home assistant via esphome. I had most of the code already, but today i added the screen that worked imediately. i also added the rgb leds today, but they had some errors I fixed the rgb leds by removing 2 of them. i made the potentiometor give a outputvalue from 1-100 so that i can display it on the screen in the future. And last but not least i added the 9v battery so it is portable now"}]...
|
Title: Macropad by @danielmb | Stardance
Devlogs: Title: Macropad by @danielmb | Stardance
Devlogs:
Soooo, this is my first project on stardance or hackclub. I started this project about a week ago and got some parts today. i am making a macropad that connects to home assistant via esphome. I had most of the code already, but today i added the screen that worked imediately. i also added the rgb leds today, but they had some errors I fixed the rgb leds by removing 2 of them. i made the potentiometor give a outputvalue from 1-100 so that i can display it on the screen in the future. And last but not least i added the 9v battery so it is portable now
Started working on the PCB, Its more work than i expected at first, but its beginning to look nice. I prob only need like 20 min to finish it.
So i have not posted a Devlog in a little bit and i did some work. First of all i finished the PCB, but did that without recording in Lookout. After that i designed a case for everything. And lastly i fixed the command that sets the volume on my PC.
So its a long time since i made a devlog, thats cus i waited for the funding and then for the pcb. Once the pcb arrived i stated assembling the pparts taht didnt need the case. Thats becouse i needed to redisign it, i did that (and didnt log that time :( ) and then assembled the rest. And lastly i assigned all the buttons to Home Assistant automations
Ships:
I build a macropad that uses ESPHome to connect to Home Assistant where it can can control stuf like my spotify. It has a 4x4 button matrix, a small oled screen, 2 leds and 2 knobs. It was really fun to make. The most challenging was designing the pcb....
|
1793289170.974001
|
1793375570.974001
|
|
22638
|
HackCAD by @ABN | Stardance
|
ABN
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-22T22:10:39Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a macropad which makes it easier to CAD by having dedicated shortcuts for copy, paste, and undo! I’m proud of being able to create this with very limited hardware experience, and also being able to use my CAD knowledge in conjunction with it. A challenge was creating the CAD in Onshape, since I didn’t have space for Fusion on my PC. The CAD can be checked out on the public Onshape, and the Github has all the associated code!", "repo": "https://github.com/abn3000/HackCAD", "demo": ""}]...
|
[{"post_id": 13470, "ts": "202 [{"post_id": 13470, "ts": "2026-06-22T01:53:26Z", "hours": 0.2883, "text": "Macropad more like MacroCAD! Copy Paste Undo What more could you possibly need?"}]...
|
Title: HackCAD by @ABN | Stardance
Devlogs:
Macro Title: HackCAD by @ABN | Stardance
Devlogs:
Macropad more like MacroCAD! Copy Paste Undo What more could you possibly need?
Ships:
I made a macropad which makes it easier to CAD by having dedicated shortcuts for copy, paste, and undo! I’m proud of being able to create this with very limited hardware experience, and also being able to use my CAD knowledge in conjunction with it. A challenge was creating the CAD in Onshape, since I didn’t have space for Fusion on my PC. The CAD can be checked out on the public Onshape, and the Github has all the associated code!...
|
1793242358.7617018
|
1793328758.7617018
|
|
22641
|
Stock history shower by @kk_vun | Stardance
|
kk_vun
|
1
|
1.25
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-19T21:12:58Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a stock viewer that shows the history of stocks and their past prices some challenges I had were accuraccy I tried my best to make it work but its still not 100% accurate I used AI to code it because I cant code.", "repo": "https://github.com/kkv-lang/stock-simulator", "demo": "https://kkv-lang.github.io/stock-simulator/"}]...
|
[{"post_id": 12196, "ts": "202 [{"post_id": 12196, "ts": "2026-06-19T22:09:08Z", "hours": 0.2542, "text": "Finally finished my 2nd version of the stock history viewer I made it look like a cyberpunk terminal theme and added some new features so go and explore! (May not be 100% accurate) made with AI but I am learning how to code!"}, {"post_id": 12149, "ts": "2026-06-19T20:59:16Z", "hours": 1.0972, "text": "I made a stock market history viewer to see the history and performance of your favorite stocks in the past (may not be 100% accurate)"}]...
|
Title: Stock history shower by @kk_vun | Stardance Title: Stock history shower by @kk_vun | Stardance
Devlogs:
I made a stock market history viewer to see the history and performance of your favorite stocks in the past (may not be 100% accurate)
Finally finished my 2nd version of the stock history viewer I made it look like a cyberpunk terminal theme and added some new features so go and explore! (May not be 100% accurate) made with AI but I am learning how to code!
Ships:
I made a stock viewer that shows the history of stocks and their past prices some challenges I had were accuraccy I tried my best to make it work but its still not 100% accurate I used AI to code it because I cant code....
|
1793270923.1170185
|
1793357323.1170185
|
|
22643
|
station-siege by @Abbos | Stardance
|
Abbos
|
1
|
90.0
|
1130
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-29T11:46:37Z", "hours": 90.0, "multiplier": 15.55, "payout": 1130, "blessing": "neutral", "text": "I made Station Siege, a first-person zombie shooter set on an abandoned space station. You fight through 10 waves of zombies, earn gold for kills, and spend it on weapons, ammo, and unlocking doors to different rooms. It’s built in Godot 4.7 and runs in the browser. The hardest part was zombie pathfinding. Zombies kept getting stuck in their spawn rooms, and one stuck zombie was enough to stop the next wave from starting. It turned out the doors were baked into the navigation mesh as closed, so even with a door open, the zombies had no path out. I rebuilt the navmesh without doors and barricades, and added a backup that despawns any zombie that makes no progress for 20 seconds. Getting it onto the web was the other big challenge. The first export was 2.3 GB, so I cut unused models and switched textures to a web-safe format to get it under itch’s 200 MB limit. I’m proudest of the atmosphere: the dark corridors, the barricades zombies tear through, and the moment a wave starts pouring in from several directions at once. How to test: Open the itch link in Chrome or Edge on a desktop computer. It doesn’t work on phones. Click Start, then click inside the game window to lock the mouse. Controls: WASD to move, Shift to sprint, left click to shoot, R to reload, 1-3 to switch weapons, E to interact or buy, hold F to repair a barricade, Esc to pause. They’re also on the Controls screen in the main menu. The first load can take a little while because the game is about 150 MB. Read the note near the spawn. It tells you where to find the shotgun, machine gun and gives a small backstory.", "repo": "https://github.com/Madyarov27/station-siege", "demo": "https://madyarov27.itch.io/station-siege-web"}]...
|
[{"post_id": 75174, "ts": "202 [{"post_id": 75174, "ts": "2026-09-29T11:36:11Z", "hours": 2.5928, "text": "Devlog #10 - my last devlog. Done: Removed jumping (it had no purpose) Repairing is now done via the F button. Shipped the game to itch.io. This took me a while. The export was 2.3 gigabytes, so itch.io flat-out rejected it due to size limits. I removed a pile of unused models from the export. GPU texture compression came out garbled in WebGL, so I switched the textures to WebP capped at 2048px. That got the build down to about 150 MB, well under itch’s 200 MB per-file limit. You can play it here: https://madyarov27.itch.io/station-siege-web . I also cleaned up the repo, rewrote the README, and pushed everything to GitHub, including the zombie model through Git LFS."}, {"post_id": 74902, "ts": "2026-09-28T15:52:46Z", "hours": 16.2392, "text": "#9th devlog. Station Siege. Achieved: Added acid puddle as an environmental threat. Can be used to kite zombies and kill them or likewise, end up hurting yourself if you step on it. Messages in HUD when interacting with barricades, vending machine, and acid puddle. Improved zombie navigation. Now it’s completely foolproof to sharp corner turns. Added sound effect when reloading. I had the mp3 and wav files lying there doing nothing for a while but now i finally wired them in. Added like a dozen new props. Took everything from SketchFab, and used them to decorate medical bay, engineering, and cargo. Replaced almost all existing AI generated 3d models to the ones took from sketchfab. Mainly because they had like a trillion faces which was frying my CPU but also they kinda looked soulless and low effort. Added an interior wall in the spawn chamber so zombies dont look like they appear out of thin air when they spawn. Also redesigned the barricade slightly. Good for realism Changed the game map extensively. The ring part is gone. That part made sense in the beginning but the more I tested, the more I realized that shape is not ideal for my game. It’s too big and you can kite zombies forever. Now, the map looks more like spaceship themed family home interior and it’s actualyl challenging here now. You can get cornered and slimed unexpectedly."}, {"post_id": 71096, "ts": "2026-09-20T09:08:46Z", "hours": 10.3072, "text": "Devlog #wa8 I’ll just keep it short Added: Sprinting Added male zombie (finally) Overhauled wave manager. Now zombies in rooms that are locked will not spawn until you unlock them yourself. Switched to open only doors so players can’t just go to empty room to heal forever Replaced wooden plank in barricades for rusty slab of metal with sound effect when fixing. Fixed a bug where zombies broke barricades unreliably. A dozen zombies took a whole minute to break 2 barricades due to a timing mismatch Built main menu screen Built pause menu Added ammo reserve system so weapons finally stop having infinite ammo except for default pistol"}, {"post_id": 67979, "ts": "2026-09-14T09:40:17Z", "hours": 12.8564, "text": "**Devlog #7 ** A lot of stuff added so this time I’ll try to keep it short and concise. Gun model kickback on firing. Muzzle smoke on every shot Real travelling bullet projectile instead of yellow ray Bullet shell ejected every time you fire Fixed the weird bug with zombie not spawning at all. Fixed an unexpepcted bug where corridor lights worked facing one way but not the other. It was because of too many lights crowded into one area after duplicating the lights node to new added areas. Fixed the bug with bullets sometimes passing through the zombies without hitting Fixed the bug with the gun accidentally damaging the player Added extra damage for headshot Added head bob to player POV so it feels more natural Fixed the crosshair not being perfectly centered on screen Added a sliding door"}, {"post_id": 61005, "ts": "2026-09-03T18:19:05Z", "hours": 10.0069, "text": "Station siege - Devlog #6 This time I spent my hours optimizing the game, mainly because the game was borderline unplayable to work on. The map had ~90 live CSG collision shapes constantly recalculating in real time. I baked them into static geometry. Also, I swapped out the majority of 3D models in the map, which were absurdly overbuilt. Most had over a million faces, while one was sitting at ~3 million faces for a single 1x1 meter window. The editor is noticeably faster now. Another huge change was the map. Now it is a tube-like corridor connected to a polygon with 18 sides. There is also a small room connected to the ring. This ate up most of my hours. A small yet meaningful thing was the lighting overhaul. I pivoted from flat, evenly lit corridors to nearly dark chambers with higher contrast and isolated pools of light. Moreover, I added flickering animation to some of the lights so there’s some variety. Last thing is the new HUD. It’s not final yet; I will likely iterate multiple times before settling on the ideal one. However, it’s a noticeable upgrade from the previous flat white text on the screen. What I’m most happy about is still the optimization. My laptop isn’t particularly a RAM titan, so this is really important for me. I think this will ripple into other areas of the development and speed things up a lot."}, {"post_id": 52856, "ts": "2026-08-23T06:59:58Z", "hours": 13.4275, "text": "Devlog #5 - The station finally looks like a station. Last time, the place was simply a box with some texture, fog and good lighting. Now it actually has real objects, and smoothher gameplay. Biggest thing: I built out a full Tripo3D asset pipeline and used it to generate a whole set of props. Window, metal junk, archways, tubes, a metal fence, vent, door, and a vending machine used for weapon purchasing, all are wired up. The place, at least the corridor, can larp as an abandoned space station and not just a box. Another small update for immersiveness: I added creepy ambient background music. Small, but does a lot of work when you are in an empty hallway and hear nothing but that song. Took me expensive 13 hours but it was all worth it."}, {"post_id": 19506, "ts": "2026-06-30T20:37:05Z", "hours": 14.3875, "text": "This one’s huge. 14 hours logged and the game is totally not the same game anymore. Biggest news first: I pivoted the whole thing. It used to be a generic zombie shooter on Earth. Now it’s Station Siege - a dark horror-survival game set on n abandoned space station. And no, this wasn’t a random. Three reasons: Earth zombies are overdone and generic, my 2018 Intel Mac physically cannot handle realistic Earth environments without dying, and a pitch-black abandoned space station justifies the oppressive lighting and lore for free. I even did actual homework, studied why Lethal Company, R.E.P.O. and PEAK blew up (turns out: co-op survival horror, simple visuals, mood over graphics). So the direction is locked now, backed by real reasoning instead of vibes. The zombies got a massive glow-up. They now groan at you in the dark (positional audio on random timers. Honestly the single biggest horror upgrade I’ve made), they wind up an attack animation when they reach you or a barricade, and they play a death animation before crumpling and disappearing instead of just vanishing. I also generated a custom horror zombie with Tripo3D, retopologized it from 1.9 million triangles down to ~11k so my Mac doesn’t catch fire, and rigged it through Mixamo. The struggle award goes to the AnimationPlayer. Getting multiple Mixamo animations onto one model in Godot is way more painful than it sounds, name collisions everywhere (everything Mixamo exports is named “mixamo_com”), two AnimationPlayers fighting over one skeleton, and getting the death animation to actually finish before the body gets deleted. I spent hours in that menu. But it works now. Btw thanks to @sol4r_on_hackclub for suggesting using mixamo assets. Atmosphere-wise: black space void background, cold dark lighting, fog retuned to feel like a morgue. Added screen shake when you get hit and a blood overlay that gets heavier the lower your health drops. Also solved a nasty FPS hitch where the whole map stuttered the first time it rendered, fixed it with a black loading screen that spins the camera in a full circle while hidden, so all the shaders compile before the player ever sees anything. Pretty proud of that one. And of course, the Intel GPU texture curse struck again (devlog #3 readers know the grass saga). Every single model I imported rendered as a black blob until I remembered my own golden rule: compress everything Lossless or it won’t decode. Nearly lost my mind a second time before it clicked. One design decision I’m happy about: I’m keeping real gun sounds instead of sci-fi laser noises. Grounded firearms fit horror way better, and they make sense for a human station that got overrun. Next up: Finish wiring the male zombie (texture + animations) Reskin barricades into hull breaches / blast doors Build out the 4-room map (Airlock → Hangar → Reactor / Med Bay) Per-room zombie spawning (only spawn in rooms you’ve unlocked) Props to fill the empty rooms - consoles, crates, corpses - so the station feels lived-in and abandoned"}, {"post_id": 14666, "ts": "2026-06-23T21:04:15Z", "hours": 6.9606, "text": "Devlog #3 - A lot of updates on the zombie-game. Whooh, where do I even start? I made a functional barricade that repairs when pressing shift and that zombies can break to escape. I added crosshair, gold and health labels on screen. I added actual grass texture instead of grey floor I added shotgun - a second weapon - and a real shop where you can buy it using gold. I added jumping mechanics I changed the map from 2 platforms connected by a bridge to a single large platform. The biggest struggle was the grass although it sounds kinda ridiculous. I added it for the first time and it rendered either extreme green or extreme grey, nothing in between. It resembled nothing in the actual grass texture that I used. Turns out my Intel Mac can’t decode DXT-compressed textures so anything I imported rendered as weird slop. Fixed it with one setting - compress: losless. Nearly ragequit but then reimported and worked perfectly. A lot of stuff out of my to-do list in just 7 hours. Next, I will focus on adding more weapons (e.g sniper), expanding the map, adding actual buidings (e.g bunker), dedicated zombie spawning spots, and real sound effects."}, {"post_id": 13034, "ts": "2026-06-21T09:59:49Z", "hours": 0.9778, "text": "Made some progress on my zombie game! the map is a larger now with a corridor connecting 2 platforms. I also added 3 more zombies and obstacles to the map. Next step is to make them spawn continuously and give them actual body instead of green cube :/"}, {"post_id": 12664, "ts": "2026-06-20T18:06:58Z", "hours": 2.1242, "text": "Working on a cool zombie game :). Just made the first map, working gun and zombie (that little green cube on the screen). So far smooth, never had so much fun. Next step is to give shape to the player and the zombie"}]...
|
Title: station-siege by @Abbos | Stardance
Devlog Title: station-siege by @Abbos | Stardance
Devlogs:
Working on a cool zombie game :). Just made the first map, working gun and zombie (that little green cube on the screen). So far smooth, never had so much fun. Next step is to give shape to the player and the zombie
Made some progress on my zombie game! the map is a larger now with a corridor connecting 2 platforms. I also added 3 more zombies and obstacles to the map. Next step is to make them spawn continuously and give them actual body instead of green cube :/
Devlog #3 - A lot of updates on the zombie-game. Whooh, where do I even start? I made a functional barricade that repairs when pressing shift and that zombies can break to escape. I added crosshair, gold and health labels on screen. I added actual grass texture instead of grey floor I added shotgun - a second weapon - and a real shop where you can buy it using gold. I added jumping mechanics I changed the map from 2 platforms connected by a bridge to a single large platform. The biggest struggle was the grass although it sounds kinda ridiculous. I added it for the first time and it rendered either extreme green or extreme grey, nothing in between. It resembled nothing in the actual grass texture that I used. Turns out my Intel Mac can’t decode DXT-compressed textures so anything I imported rendered as weird slop. Fixed it with one setting - compress: losless. Nearly ragequit but then reimported and worked perfectly. A lot of stuff out of my to-do list in just 7 hours. Next, I will focus on adding more weapons (e.g sniper), expanding the map, adding actual buidings (e.g bunker), dedicated zombie spawning spots, and real sound effects.
This one’s huge. 14 hours logged and the game is totally not the same game anymore. Biggest news first: I pivoted the whole thing. It used to be a generic zombie shooter on Earth. Now it’s Station Siege - a dark horror-survival game set on n abandoned space station. And no, this wasn’t a random. Three reasons: Earth zombies are overdone and generic, my 2018 Intel Mac physically cannot handle realistic Earth environments without dying, and a pitch-black abandoned space station justifies the oppressive lighting and lore for free. I even did actual homework, studied why Lethal Company, R.E.P.O. and PEAK blew up (turns out: co-op survival horror, simple visuals, mood over graphics). So the direction is locked now, backed by real reasoning instead of vibes. The zombies got a massive glow-up. They now groan at you in the dark (positional audio on random timers. Honestly the single biggest horror upgrade I’ve made), they wind up an attack animation when they reach you or a barricade, and they play a death animation before crumpling and disappearing instead of just vanishing. I also generated a custom horror zombie with Tripo3D, retopologized it from 1.9 million triangles down to ~11k so my Mac doesn’t catch fire, and rigged it through Mixamo. The struggle award goes to the AnimationPlayer. Getting multiple Mixamo animations onto one model in Godot is way more painful than it sounds, name collisions everywhere (everything Mixamo exports is named “mixamo_com”), two AnimationPlayers fighting over one skeleton, and getting the death animation to actually finish before the body gets deleted. I spent hours in that menu. But it works now. Btw thanks to @sol4r_on_hackclub for suggesting using mixamo assets. Atmosphere-wise: black space void background, cold dark lighting, fog retuned to feel like a morgue. Added screen shake when you get hit and a blood overlay that gets heavier the lower your health drops. Also solved a nasty FPS hitch where the whole map stuttered the first time it rendered, fixed it with a black loading screen that spins the camera in a full circle while hidden, so all the shaders compile before the player ever sees anything. Pretty proud of that one. And of course, the Intel GPU texture curse struck again (devlog #3 readers know the grass saga). Every single model I imported rendered as a black blob until I remembered my own golden rule: compress everything Lossless or it won’t decode. Nearly lost my mind a second time before it clicked. One design decision I’m happy about: I’m keeping real gun sounds instead of sci-fi laser noises. Grounded firearms fit horror way better, and they make sense for a human station that got overrun. Next up: Finish wiring the male zombie (texture + animations) Reskin barricades into hull breaches / blast doors Build out the 4-room map (Airlock → Hangar → Reactor / Med Bay) Per-room zombie spawning (only spawn in rooms you’ve unlocked) Props to fill the empty rooms - consoles, crates, corpses - so the station feels lived-in and abandoned
Devlog #5 - The station finally looks like a station. Last time, the place was simply a box with some texture, fog and good lighting. Now it actually has real objects, and smoothher gameplay. Biggest thing: I built out a full Tripo3D asset pipeline and used it to generate a whole set of props. Window, metal junk, archways, tubes, a metal fence, vent, door, and a vending machine used for weapon purchasing, all are wired up. The place, at least the corridor, can larp as an abandoned space station and not just a box. Another small update for immersiveness: I added creepy ambient background music. Small, but does a lot of work when you are in an empty hallway and hear nothing but that song. Took me expensive 13 hours but it was all worth it.
Station siege - Devlog #6 This time I spent my hours optimizing the game, mainly because the game was borderline unplayable to work on. The map had ~90 live CSG collision shapes constantly recalculating in real time. I baked them into static geometry. Also, I swapped out the majority of 3D models in the map, which were absurdly overbuilt. Most had over a million faces, while one was sitting at ~3 million faces for a single 1x1 meter window. The editor is noticeably faster now. Another huge change was the map. Now it is a tube-like corridor connected to a polygon with 18 sides. There is also a small room connected to the ring. This ate up most of my hours. A small yet meaningful thing was the lighting overhaul. I pivoted from flat, evenly lit corridors to nearly dark chambers with higher contrast and isolated pools of light. Moreover, I added flickering animation to some of the lights so there’s some variety. Last thing is the new HUD. It’s not final yet; I will likely iterate multiple times before settling on the ideal one. However, it’s a noticeable upgrade from the previous flat white text on the screen. What I’m most happy about is still the optimization. My laptop isn’t particularly a RAM titan, so this is really important for me. I think this will ripple into other areas of the development and speed things up a lot.
**Devlog #7 ** A lot of stuff added so this time I’ll try to keep it short and concise. Gun model kickback on firing. Muzzle smoke on every shot Real travelling bullet projectile instead of yellow ray Bullet shell ejected every time you fire Fixed the weird bug with zombie not spawning at all. Fixed an unexpepcted bug where corridor lights worked facing one way but not the other. It was because of too many lights crowded into one area after duplicating the lights node to new added areas. Fixed the bug with bullets sometimes passing through the zombies without hitting Fixed the bug with the gun accidentally damaging the player Added extra damage for headshot Added head bob to player POV so it feels more natural Fixed the crosshair not being perfectly centered on screen Added a sliding door
Devlog #wa8 I’ll just keep it short Added: Sprinting Added male zombie (finally) Overhauled wave manager. Now zombies in rooms that are locked will not spawn until you unlock them yourself. Switched to open only doors so players can’t just go to empty room to heal forever Replaced wooden plank in barricades for rusty slab of metal with sound effect when fixing. Fixed a bug where zombies broke barricades unreliably. A dozen zombies took a whole minute to break 2 barricades due to a timing mismatch Built main menu screen Built pause menu Added ammo reserve system so weapons finally stop having infinite ammo except for default pistol
#9th devlog. Station Siege. Achieved: Added acid puddle as an environmental threat. Can be used to kite zombies and kill them or likewise, end up hurting yourself if you step on it. Messages in HUD when interacting with barricades, vending machine, and acid puddle. Improved zombie navigation. Now it’s completely foolproof to sharp corner turns. Added sound effect when reloading. I had the mp3 and wav files lying there doing nothing for a while but now i finally wired them in. Added like a dozen new props. Took everything from SketchFab, and used them to decorate medical bay, engineering, and cargo. Replaced almost all existing AI generated 3d models to the ones took from sketchfab. Mainly because they had like a trillion faces which was frying my CPU but also they kinda looked soulless and low effort. Added an interior wall in the spawn chamber so zombies dont look like they appear out of thin air when they spawn. Also redesigned the barricade slightly. Good for realism Changed the game map extensively. The ring part is gone. That part made sense in the beginning but the more I tested, the more I realized that shape is not ideal for my game. It’s too big and you can kite zombies forever. Now, the map looks more like spaceship themed family home interior and it’s actualyl challenging here now. You can get cornered and slimed unexpectedly.
Devlog #10 - my last devlog. Done: Removed jumping (it had no purpose) Repairing is now done via the F button. Shipped the game to itch.io. This took me a while. The export was 2.3 gigabytes, so itch.io flat-out rejected it due to size limits. I removed a pile of unused models from the export. GPU texture compression came out garbled in WebGL, so I switched the textures to WebP capped at 2048px. That got the build down to about 150 MB, well under itch’s 200 MB per-file limit. You can play it here: https://madyarov27.itch.io/station-siege-web . I also cleaned up the repo, rewrote the README, and pushed everything to GitHub, including the zombie model through Git LFS.
Ships:
I made Station Siege, a first-person zombie shooter set on an abandoned space station. You fight through 10 waves of zombies, earn gold for kills, and spend it on weapons, ammo, and unlocking doors to different rooms. It’s built in Godot 4.7 and runs in the browser. The hardest part was zombie pathfinding. Zombies kept getting stuck in their spawn rooms, and one stuck zombie was enough to stop the next wave from starting. It turned out the doors were baked into the navigation mesh as closed, so even with a door open, the zombies had no path out. I rebuilt the navmesh without doors and barricades, and added a backup that despawns any zombie that makes no progress for 20 seconds. Getting it onto the web was the other big challenge. The first export was 2.3 GB, so I cut unused models and switched textures to a web-safe format to get it under itch’s 200 MB limit. I’m proudest of the atmosphere: the dark corridors, the barricades zombies tear through, and the moment a wave starts pouring in from several directions at once. How to test: Open the itch link in Chrome or Edge on a desktop computer. It doesn’t work on phones. Click Start, then click inside the game window to lock the mouse. Controls: WASD to move, Shift to sprint, left click to shoot, R to reload, 1-3 to switch weapons, E to interact or buy, hold F to repair a barricade, Esc to pause. They’re also on the Controls screen in the main menu. The first load can take a little while because the game is about 150 MB. Read the note near the spawn. It tells you where to find the shotgun, machine gun and gives a small backstory....
|
1793152064.8819964
|
1793238464.8819964
|
|
22646
|
Sprout: Your personal Desktop Daemon that makes su Sprout: Your personal Desktop Daemon that makes sure you take breaks! by @LaraCroft | Stardance...
|
LaraCroft
|
1
|
4.0
|
49
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-13T02:53:47Z", "hours": 4.0, "multiplier": 12.6, "payout": 49, "blessing": "neutral", "text": "I created a plant pot style desktop daemon that manages and tracks your posture and the amount of time you stay behind your desk without breaks. The lightweight user interface handles the visual rendering, native Windows system tray lifecycle, and Pomodoro timing variables, while silently spawning the local Python virtual environment to monitor your posture via an integrated webcam feed.", "repo": "https://github.com/botW-programmer/sprout", "demo": "https://github.com/botW-programmer/sprout/releases/tag/v1.1.0"}]...
|
[{"post_id": 27483, "ts": "202 [{"post_id": 27483, "ts": "2026-07-13T02:51:23Z", "hours": 2.5956, "text": "It’s been a few weeks since I last worked on sprout. Honestly, SAT prep has been taking up the majority of my time. I spent around an hour of unrecorded time just reading through my code and a bunch of notes I left for myself. After getting myself caught up, I shifted my sight to my goals. I immediately realized I hated the bulky, standard application window. It felt too clunky for a focus app. I decided to completely pivot the design: instead of a full app, I wanted a tiny, transparent, aesthetic widget that just floats quietly on the desktop. It’s been a while since I last programmed a widget, so it took me a while to catch up. The second I tried to make the window transparent, my entire CSS layout completely collapsed. The background started tiling infinitely, my assets disappeared, and the drag-handle completely broke. The Tauri v2 migration also messed me up. Tauri completely overhauled how they handle security permissions, system tray icons, and background shell processes. I spent way too long staring at my screen just trying to figure out why my Python AI backend wouldn’t launch. But after rewriting the main.js file from scratch and working on the Rust config files, I made some progress. Here is what is actually working in V1.0.0: UI: It’s a tiny, frosted-glass widget with a shimmering pastel title bar. AI core: The Python computer vision script now boots up invisibly in the background the second you open the app. No more messing with terminals. System Tray: It minimizes straight to the Windows tray, keeping your taskbar clean. My favorite part, the pomodoro timer: A fully functional, click-to-start Pomodoro timer that hooks directly into native Windows notifications to tell you to take a break. I packaged the whole thing into a distributable .msi installer and added it onto GitHub Releases. It is completely open-source and officially out. It was a bit annoying, but seeing my little plant sitting on my desktop, actually tracking my posture without crashing, makes it totally worth it."}, {"post_id": 12375, "ts": "2026-06-20T06:16:01Z", "hours": 1.3683, "text": "I felt really productive after today! I started “Sprout”, which is a wellness daemon that perks up when you take breaks and droops down when you stay seated for too long. Here’s what I did today: I busted my “ghost chair” bug My camera kept thinking that my empty chair is a person, so when I got up to take breaks, it would keep a skeletal frame on my chair. I fixed it by implementing a visibility heuristic filter. I essentially told my webcam that unless it is 60% that it detects a human nose, it shouldn’t recognize the object infront of it as human. Headless Originally, to test-run the project, I had 2 windows up: my actual project and my webcam with a skeletal structure pasted over me. I just stripped out the GUI code from my vision_sensor webcam code so that it would stop appearing. Notifications I had to install a native Rust plugin to bypass the browser security so that my code could communicate directly with Windows OS. When my JS gave me an import error (since I’m using Vanilla JS without a bundler), I just edited tauri.conf.json to recognize Tauri’s tools globally. Native desktop achieved! I created my assets! Using LibreSprite, I drew my Sprout (cat themed plant pot) and background, and enabled some simple asynchronous JS loops to animate them! - Goals for tomorrow: I need to remove the ugly text and glassmorphic box I implemented earlier for testing, and create my own text-based assets. (P.S. I dropped my finished assets below for anyone interested. They're really low quality since they're meant for a small window)"}]...
|
Title: Sprout: Your personal Desktop Daemon that m Title: Sprout: Your personal Desktop Daemon that makes sure you take breaks! by @LaraCroft | Stardance
Devlogs:
I felt really productive after today! I started “Sprout”, which is a wellness daemon that perks up when you take breaks and droops down when you stay seated for too long. Here’s what I did today: I busted my “ghost chair” bug My camera kept thinking that my empty chair is a person, so when I got up to take breaks, it would keep a skeletal frame on my chair. I fixed it by implementing a visibility heuristic filter. I essentially told my webcam that unless it is 60% that it detects a human nose, it shouldn’t recognize the object infront of it as human. Headless Originally, to test-run the project, I had 2 windows up: my actual project and my webcam with a skeletal structure pasted over me. I just stripped out the GUI code from my vision_sensor webcam code so that it would stop appearing. Notifications I had to install a native Rust plugin to bypass the browser security so that my code could communicate directly with Windows OS. When my JS gave me an import error (since I’m using Vanilla JS without a bundler), I just edited tauri.conf.json to recognize Tauri’s tools globally. Native desktop achieved! I created my assets! Using LibreSprite, I drew my Sprout (cat themed plant pot) and background, and enabled some simple asynchronous JS loops to animate them! - Goals for tomorrow: I need to remove the ugly text and glassmorphic box I implemented earlier for testing, and create my own text-based assets. (P.S. I dropped my finished assets below for anyone interested. They're really low quality since they're meant for a small window)
It’s been a few weeks since I last worked on sprout. Honestly, SAT prep has been taking up the majority of my time. I spent around an hour of unrecorded time just reading through my code and a bunch of notes I left for myself. After getting myself caught up, I shifted my sight to my goals. I immediately realized I hated the bulky, standard application window. It felt too clunky for a focus app. I decided to completely pivot the design: instead of a full app, I wanted a tiny, transparent, aesthetic widget that just floats quietly on the desktop. It’s been a while since I last programmed a widget, so it took me a while to catch up. The second I tried to make the window transparent, my entire CSS layout completely collapsed. The background started tiling infinitely, my assets disappeared, and the drag-handle completely broke. The Tauri v2 migration also messed me up. Tauri completely overhauled how they handle security permissions, system tray icons, and background shell processes. I spent way too long staring at my screen just trying to figure out why my Python AI backend wouldn’t launch. But after rewriting the main.js file from scratch and working on the Rust config files, I made some progress. Here is what is actually working in V1.0.0: UI: It’s a tiny, frosted-glass widget with a shimmering pastel title bar. AI core: The Python computer vision script now boots up invisibly in the background the second you open the app. No more messing with terminals. System Tray: It minimizes straight to the Windows tray, keeping your taskbar clean. My favorite part, the pomodoro timer: A fully functional, click-to-start Pomodoro timer that hooks directly into native Windows notifications to tell you to take a break. I packaged the whole thing into a distributable .msi installer and added it onto GitHub Releases. It is completely open-source and officially out. It was a bit annoying, but seeing my little plant sitting on my desktop, actually tracking my posture without crashing, makes it totally worth it.
Ships:
I created a plant pot style desktop daemon that manages and tracks your posture and the amount of time you stay behind your desk without breaks. The lightweight user interface handles the visual rendering, native Windows system tray lifecycle, and Pomodoro timing variables, while silently spawning the local Python virtual environment to monitor your posture via an integrated webcam feed....
|
1793307056.5589807
|
1793393456.5589807
|
|
22654
|
Umbra by @urged-st | Stardance
|
urged-st
|
1
|
19.0
|
243
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-16T19:00:39Z", "hours": 19.0, "multiplier": 12.73, "payout": 243, "blessing": "neutral", "text": "umbra is a browser-based exoplanet transit simulator. you get a star, a planet on an adjustable orbit, and a live light curve that dips every time the planet crosses in front of the star. sliders control planet size, orbit radius, orbit speed and eccentricity, and there’s a set of presets so you can jump straight to different planet types (hot jupiter, super-earth, earth-like, etc) without tuning everything by hand. getting the orbit itself right was very hard. circular orbits are easy, but real planets have eccentric ones, which means solving kepler’s equation to work out where the planet actually is at any given moment. did that with newton-raphson, a handful of iterations converges fast enough to run every frame without lagging. have fun!", "repo": "https://github.com/urged-st/Umbra", "demo": "https://umbra-sim.vercel.app"}]...
|
[{"post_id": 27915, "ts": "202 [{"post_id": 27915, "ts": "2026-07-13T20:51:32Z", "hours": 3.1261, "text": "Umbra — Adding Some Chaos (On Purpose) Real telescopes don’t hand you a perfect light curve, they hand you a noisy mess with a signal buried in it, so I added a noise toggle to make Umbra actually look like real data instead of a simple ahh textbook diagram Used a Box-Muller transform to turn two uniform randoms into a proper gaussian sample, tuned roughly to TESS-scale scatter so it’s not comically noisy, just enough to make the dip look like something you’d actually have to squint at New “N” button sits next to the reset one, goes amber when it’s on, same button family as everything else up there The bit I actually spent time thinking about, which was that the noise only touches what gets drawn on the graph, not the underlying flux value. Transit detection, transit counting, period measurement, and the stats panel all still read the clean number I wanted it this way on purpose, in real analysis you don’t just throw the noise away, you fit the curve through it, so having Umbra’s detection stay accurate underneath a noisy-looking graph felt like the more honest way to represent that, rather than making the sim itself worse at its job just for realism points lol"}, {"post_id": 27093, "ts": "2026-07-12T10:56:00Z", "hours": 2.3894, "text": "Umbra - Making the Dip Actually Mean Something Kepler solved the “where the heck is the planet” issue, but I still had a “how much light does it actually block” issue, and the answer wasn’t as simple as I first thought My first instinct was just measuring the distance between planet and star centres and eyeballing a dim amount from that, which is wrong the second the planet is anything other than fully in or fully out What you actually need is the overlap area between two circles, so I built circleOverlapArea() using the proper lens equation, it takes the centre distance plus both radii and works out the exact overlapping region This is what gives you the sloped ingress and egress on the light curve instead of a dip that just snaps to a flat bottom, which is a lot closer to what a real transit looks like Also added depth ordering off the back of this, since I needed to know when the planet’s on the near side of the orbit vs the far side so it draws in front of or behind the star correctly (sin of the eccentric anomaly tells you which side you’re on, handy) Once the flux number was actually trustworthy, I edited the instrumentation to go with it: fixed the stats panel (radius ratio, current flux, transit depth, max depth, eccentricity, transit count, measured period) rising-edge detection so it counts transits and times the period itself, rather than me just reading it off the speed slider fixed the light curve graph itself, plotting flux over time with gridlines so you can actually see the dip shape as it happens Genuinely didn’t expect the geometry bit to be the harder half of this session, Kepler felt like the scary one going in but the overlap maths turned out to be the fiddlier of the two! I also distributed all my code into separate files as for some reason I put it all inline in one html file and I got some reviews about file structure on my other projects, so didn’t want to repeat that lol"}, {"post_id": 26213, "ts": "2026-07-10T21:36:46Z", "hours": 4.0325, "text": "Umbra — Kepler’s Equation Nearly Broke Me So remember in the first devlog when I said I spent 2+ hours just getting the orbit right? Turns out “right” was still wrong, the planet was moving at constant angular speed the whole time, which is basically not how orbits work Real orbits speed up near the star and slow down far away (thanks Kepler), so I had to actually solve Kepler’s equation properly instead of faking it Problem is M = E − e·sin(E) has no closed-form solution for E, you can’t just rearrange and solve for it like a normal equation, which I did not know going in and briefly panicked about Ended up using Newton-Raphson to solve it numerically, feels very full circle after doing the same kind of thing for my EPQ (orbital sim for near-Earth objects), except this time it’s converging in like 5 iterations instead of me validating against JPL Horizons for weeks lol The difference is honestly crazy to look at now, the planet visibly rips through periapsis and crawls through apoapsis instead of just gliding round at one speed the whole way, which is exactly what real eccentric orbits do Pretty happy with this 4 hours cause it means I now have actual physics rather than some fake thing only added for the visuals. below are some snippets from the solvers but not the full code of course"}, {"post_id": 15548, "ts": "2026-06-25T08:42:15Z", "hours": 5.0658, "text": "Umbra - Major Update! Ok, I’ll admit I wasn’t too consistent with devlogging as I was with my other projects, so I’ll keep this detailed for that storytelling rating So I started by adding the four sliders - the planet radius, orbit radius, speed, and eccentricity. The eccentricity one was probably the most interesting to build because I didn’t want it to just go from 0 to max in one direction, I made it signed so zero sits in the middle of the slider and you can push the elongation either way. Felt much more intuitive to use. I also had to add a clamp so the orbit can’t intersect the star — without it you could drag the eccentricity up until the planet was literally passing through the star which looked awful. It recalculates the safe maximum every frame based on whatever the other sliders are at, and goes amber with a little “(max)” label if you’re hitting the ceiling. Then I added presets (as always lol): Hot Jupiter, Super-Earth, Earth-like, Eccentric Giant, Grazing Transit, as a dropdown that snaps all the sliders at once. Wanted a way to show off what different orbit types actually look like on the light curve without the user having to dial everything in manually. Each preset fires a little toast notification from the top of the screen with a one-liner about what makes that orbit interesting, which I’m pretty happy with. Last thing was the reset button — just a ↺ in the top right that puts everything back to defaults and clears the graph. Small thing but its actually really useful when you’ve been toying around with this all day 😭, saves me a bit of sanity. If you want more on what I did and why I did it feel free to check out https://instagram.com/urged.st where I post video devlogs!"}, {"post_id": 12699, "ts": "2026-06-20T18:55:31Z", "hours": 4.6267, "text": "Umbra Begins Alright, we’re really hitting the ground running with this one. Started yesterday and I’m already 4 hours deep (my goal is 10hrs minimum for each simulator) Added the heavy UI now so I don’t have to write paragraphs later (wasn’t too bad lol, same styling as the other two sims) Added an orbiting planet (yes I spent two hours + on the planet and getting its orbit right…)"}]...
|
Title: Umbra by @urged-st | Stardance
Devlogs:
Um Title: Umbra by @urged-st | Stardance
Devlogs:
Umbra Begins Alright, we’re really hitting the ground running with this one. Started yesterday and I’m already 4 hours deep (my goal is 10hrs minimum for each simulator) Added the heavy UI now so I don’t have to write paragraphs later (wasn’t too bad lol, same styling as the other two sims) Added an orbiting planet (yes I spent two hours + on the planet and getting its orbit right…)
Umbra - Major Update! Ok, I’ll admit I wasn’t too consistent with devlogging as I was with my other projects, so I’ll keep this detailed for that storytelling rating So I started by adding the four sliders - the planet radius, orbit radius, speed, and eccentricity. The eccentricity one was probably the most interesting to build because I didn’t want it to just go from 0 to max in one direction, I made it signed so zero sits in the middle of the slider and you can push the elongation either way. Felt much more intuitive to use. I also had to add a clamp so the orbit can’t intersect the star — without it you could drag the eccentricity up until the planet was literally passing through the star which looked awful. It recalculates the safe maximum every frame based on whatever the other sliders are at, and goes amber with a little “(max)” label if you’re hitting the ceiling. Then I added presets (as always lol): Hot Jupiter, Super-Earth, Earth-like, Eccentric Giant, Grazing Transit, as a dropdown that snaps all the sliders at once. Wanted a way to show off what different orbit types actually look like on the light curve without the user having to dial everything in manually. Each preset fires a little toast notification from the top of the screen with a one-liner about what makes that orbit interesting, which I’m pretty happy with. Last thing was the reset button — just a ↺ in the top right that puts everything back to defaults and clears the graph. Small thing but its actually really useful when you’ve been toying around with this all day 😭, saves me a bit of sanity. If you want more on what I did and why I did it feel free to check out https://instagram.com/urged.st where I post video devlogs!
Umbra — Kepler’s Equation Nearly Broke Me So remember in the first devlog when I said I spent 2+ hours just getting the orbit right? Turns out “right” was still wrong, the planet was moving at constant angular speed the whole time, which is basically not how orbits work Real orbits speed up near the star and slow down far away (thanks Kepler), so I had to actually solve Kepler’s equation properly instead of faking it Problem is M = E − e·sin(E) has no closed-form solution for E, you can’t just rearrange and solve for it like a normal equation, which I did not know going in and briefly panicked about Ended up using Newton-Raphson to solve it numerically, feels very full circle after doing the same kind of thing for my EPQ (orbital sim for near-Earth objects), except this time it’s converging in like 5 iterations instead of me validating against JPL Horizons for weeks lol The difference is honestly crazy to look at now, the planet visibly rips through periapsis and crawls through apoapsis instead of just gliding round at one speed the whole way, which is exactly what real eccentric orbits do Pretty happy with this 4 hours cause it means I now have actual physics rather than some fake thing only added for the visuals. below are some snippets from the solvers but not the full code of course
Umbra - Making the Dip Actually Mean Something Kepler solved the “where the heck is the planet” issue, but I still had a “how much light does it actually block” issue, and the answer wasn’t as simple as I first thought My first instinct was just measuring the distance between planet and star centres and eyeballing a dim amount from that, which is wrong the second the planet is anything other than fully in or fully out What you actually need is the overlap area between two circles, so I built circleOverlapArea() using the proper lens equation, it takes the centre distance plus both radii and works out the exact overlapping region This is what gives you the sloped ingress and egress on the light curve instead of a dip that just snaps to a flat bottom, which is a lot closer to what a real transit looks like Also added depth ordering off the back of this, since I needed to know when the planet’s on the near side of the orbit vs the far side so it draws in front of or behind the star correctly (sin of the eccentric anomaly tells you which side you’re on, handy) Once the flux number was actually trustworthy, I edited the instrumentation to go with it: fixed the stats panel (radius ratio, current flux, transit depth, max depth, eccentricity, transit count, measured period) rising-edge detection so it counts transits and times the period itself, rather than me just reading it off the speed slider fixed the light curve graph itself, plotting flux over time with gridlines so you can actually see the dip shape as it happens Genuinely didn’t expect the geometry bit to be the harder half of this session, Kepler felt like the scary one going in but the overlap maths turned out to be the fiddlier of the two! I also distributed all my code into separate files as for some reason I put it all inline in one html file and I got some reviews about file structure on my other projects, so didn’t want to repeat that lol
Umbra — Adding Some Chaos (On Purpose) Real telescopes don’t hand you a perfect light curve, they hand you a noisy mess with a signal buried in it, so I added a noise toggle to make Umbra actually look like real data instead of a simple ahh textbook diagram Used a Box-Muller transform to turn two uniform randoms into a proper gaussian sample, tuned roughly to TESS-scale scatter so it’s not comically noisy, just enough to make the dip look like something you’d actually have to squint at New “N” button sits next to the reset one, goes amber when it’s on, same button family as everything else up there The bit I actually spent time thinking about, which was that the noise only touches what gets drawn on the graph, not the underlying flux value. Transit detection, transit counting, period measurement, and the stats panel all still read the clean number I wanted it this way on purpose, in real analysis you don’t just throw the noise away, you fit the curve through it, so having Umbra’s detection stay accurate underneath a noisy-looking graph felt like the more honest way to represent that, rather than making the sim itself worse at its job just for realism points lol
Ships:
umbra is a browser-based exoplanet transit simulator. you get a star, a planet on an adjustable orbit, and a live light curve that dips every time the planet crosses in front of the star. sliders control planet size, orbit radius, orbit speed and eccentricity, and there’s a set of presets so you can jump straight to different planet types (hot jupiter, super-earth, earth-like, etc) without tuning everything by hand. getting the orbit itself right was very hard. circular orbits are easy, but real planets have eccentric ones, which means solving kepler’s equation to work out where the planet actually is at any given moment. did that with newton-raphson, a handful of iterations converges fast enough to run every frame without lagging. have fun!...
|
1792878740.9890122
|
1793742740.9890122
|
|
22665
|
A New Down by @late-parrot | Stardance
|
late-parrot
|
1
|
18.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-28T21:32:42Z", "hours": 18.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "My submission to The Very Serious Juniper Dev Game Jam, A New Down is a unique and difficult puzzle platformer with novel spinning mechanics DEMO (Itch.io)Web version—downloads are also available Features Interesting and novel spinning mechanics Retro-inspired pixel-perfect graphics Short, difficult levels for rewarding gameplay Behind the Scenes A New Dawn was created with Godot version 4.7, and the development process brought along some significant difficulties. Getting the physics system to work with a constantly rotating level was tough, and I had to try several different techniques to make the player move in a way that I liked. If you want to see more about the development journey, check out the devlogs here. Credits All code and art created by Eric Schuette (me) Music by Anthony Hsu The main font is Chonkly by ItMeArcadia (CC0) Sound effects from 512 Sound Effects (8-bit style) by SubspaceAudio (CC0) Huge thanks to everyone who tested out the game and gave feedback—it was very helpful and extremely valuable.", "repo": "https://github.com/late-parrot/a-new-down", "demo": "https://late-parrot.itch.io/a-new-down"}]...
|
[{"post_id": 17898, "ts": "202 [{"post_id": 17898, "ts": "2026-06-28T20:42:43Z", "hours": 5.5914, "text": "Add Settings and Final Levels This is a huge devlog, mostly because this last part of the game jam was extremely chaotic. Now that I’ve submitted my game, I have the time to write a devlog. After receiving feedback from others, I learned that the pixelation effects could be very jarring for some, but that others really liked the effect. Because I was getting these conflicting opinions, I decided to make this a setting for those who need it, but to keep the effect on as a default. Because this meant I was building a settings system, I also decided to implement volume settings. None of this was super difficult, but the settings had to be hooked up into every other part of the game. With this out of the way, I still needed more levels. At this point I had 5 levels, which is the amount that I’ve submitted for some other games. However, due to how short these levels are, I wanted to get all the way to 10 levels. Level design is certainly not my strong suit, so this took a significant amount of time. I tried to make the levels difficult, but after receiving some more feedback, it’s clear that I probably should’ve made it easier. With these new levels, I also added a new mechanic—blocks that will flip the rotation direction when contacted. These were much easier to implement than the sticky blocks, but still required me to work on many different parts of the game. These blocks gave me a new tool to use for level design, which helped out a lot. I made some more tweaks to the export settings, and with about 15 minutes to spare, I uploaded my files to Itch.io. I wasn’t able to test all of the exports, but the web and MacOS versions definitely work, and my game uploaded just fine. I’m not totally sure about the future of this project—every other game jam game has been abandoned as soon as the jam was finished, but I really like the mechanics of this one. Because of this, I may actually end up fleshing it out more and developing a full game, but I also might not—we’ll see."}, {"post_id": 15445, "ts": "2026-06-25T03:13:37Z", "hours": 1.0744, "text": "Work on README and do some polishing This was mostly working on my README, which wasn’t too difficult, but I had to figure out how I wanted to embed my images. I ended up just linking to the ones that I uploaded to Itch.io, because they were hosting them for me. I followed the README guidelines from Stardance, and I think I have a solid, professional README. Once the README was written, I reused most of the text for my Itch.io page and made that look presentable. I also fixed some issues with window scaling, but these changes were minor. Really all I have left at this point is to make some levels, which I’ve clearly been putting off. As of writing this, I have about two days left in the game jam, so I feel comfortable with my time."}, {"post_id": 15259, "ts": "2026-06-24T19:35:38Z", "hours": 3.0589, "text": "Add music and sound effects This devlog covers a lot of different things that I worked on, but the most major was music and sound effects. For music, I was able to find an old song that one of my friends had made for a different project. We didn’t end up using it for that game, but I think it fits the vibes of this game pretty well, so I dropped it in. I found sound effects from OpenGameArt (with the CC0 license—one of my favorite parts of that site is that you can filter by license), but getting them into the game was much harder than with the music. Jump sounds were easy; I just played the sound whenever you jumped. However, I also wanted landing sounds, and these proved much more difficult. Because of the constantly rotating level, the physics engine is constantly registering lots of collisions. If I just played the sounds whenever the player collided with the floor, they would play way too often. To remedy this, I instead tried to check the incoming velocity to get a sense of the “strength” of the collisions, but this didn’t work particularly well. Eventually, I ended up putting a limit on how often the sound can play per “shape” (Godot turns each large chunk of the tilemap into a single shape to simplify the physics simulation). This was very difficult to get right, but I’m happy with the result. Now that I had all of these new assets, I had to update the credits. While I was working on UI, I also decided it would be a good idea to add an end screen—before when the player won, nothing really happened. This was pretty easy to do, but I might want to update it later to make it look better. With this in place, the game feels much more complete, if not for the lack of levels. I only have a few days left in the game jam, so I will spend the next part of my time on configuring the export and building my Itch page. Once I’m happy with both of these, I’ll finish up my levels and submit. I’m hoping to reach a total of ten levels, but we’ll see where I end up."}, {"post_id": 13587, "ts": "2026-06-22T08:07:25Z", "hours": 1.0706, "text": "Create more levels I added two more unique levels, for a new total of five. Each level helps teach parts of the game that I want to incorporate into future levels, and the fifth level is genuinely somewhat challenging. I put a lot of thought and consideration into these levels, and tested them thoroughly. These taught me things like how far the player can jump and how to make the player use momentum for their benefit. I hope that what I learned can help me make even better levels in the future. Everything that I said I still needed to do in the last devlog still stands—that means I still need more levels and mechanics, and that I still need to incorporate sound into my game. I will try to work on these as soon as possible, and I have a few ideas for new mechanics."}, {"post_id": 13565, "ts": "2026-06-22T06:31:01Z", "hours": 1.8753, "text": "Create credits and clean up player movement I created a simple credits scene, and although I plan to add more to it later, it should suffice for now. I tinkered around a lot with the layout, and I went with something pretty simple. Because the credits are going to be extremely short, I decided not to go with scrolling credits like I’ve done in the past. In addition to this, I also worked on player movement for a while, refining some aspects so that they would fit the game better. I made the cooldown to launch from a sticky block much shorter so that they felt more responsive, and I lowered the threshold for something to be considered a “floor”. This means that the player can jump off of steeper slopes, and I may end up removing the threshold entirely, effectively allowing wall jumps. In the future I clearly need to add more levels, given that my current count is still at three.m With those, I need two things: new interesting mechanics and a good tutorial. As it is, it’s quite hard for a player to just jump into the game, because they need to know more about the controls and how you’re meant to play. A tutorial will help significantly with this problem. The game also currently has no sound, which makes it feel boring and uninteresting. I plan to add sound effects for things like jumping and landing, but I’m not completely confident in my music abilities. Because of this, I’m attempting to get a few other people to help me, but if needed I can create the music myself."}, {"post_id": 12727, "ts": "2026-06-20T20:00:32Z", "hours": 1.4819, "text": "Added a title screen and polished some of the transitions The title screen really helps tie the game together, and makes it feel much more like a real game. I found two fonts on Itch to use for my game— Chonkly and 3x3 Mono . Both are CC0, and I’ve yet to use 3x3 Mono, but I might use it for smaller text later. The transition between levels and when you die and the level resets both looked pretty bad, flashing a gray screen and looking quite jittery. I hunted around a bit for the source of the problem, and eventually discovered that it was due to my camera’s position smoothing. I fixed this by calling reset_smoothing() in the relevant places. All in all, this really made the game feel more complete, and I’m really happy with where it’s going. In the future, I need to add more levels and the mechanics that go with those. If I have a large number of levels, I may also need a level select menu."}, {"post_id": 12654, "ts": "2026-06-20T17:55:36Z", "hours": 0.8511, "text": "Added a level system with loading and transitions Touching the goal blocks will now trigger a transition to the next level, and to test out this system, I developed two new levels for a total of three. I decided to dynamically load level scenes by looking for scenes/levels/0.tscn , scenes/levels/1.tscn , etc. This system worked well, but when reaching the goal for the next level, it would try to load a nonexistent file and crash. I fixed this by calling a win() function instead of loading a level file when the file cannot be found. Next, I plan to add a few more levels, or maybe work on some of the main UI. The newer levels will introduce other special blocks and mechanics."}, {"post_id": 12256, "ts": "2026-06-20T00:43:47Z", "hours": 1.4767, "text": "Added sticky blocks These blocks are the first of several that I plan to add in order to make the game more interesting and make for better levels. Whenever you run into a sticky block, you snap to its position and stop moving, while the level continues to rotate. Once stuck, you can launch yourself in any direction by pressing that key. I decided to add these because I thought it would be cool to have levels where you launch yourself through a large number of sticky blocks, and they add a method of transportation other than the basic rolling and jumping. I’m thinking about ideas for other blocks, and as soon as I have a few I’ll start to build some levels."}, {"post_id": 12177, "ts": "2026-06-19T21:53:05Z", "hours": 1.8714, "text": "Completed the basic mechanics such as the rotating level, rolling, and jumping I had to go through several different iterations to get the rotation to work—at first I tried to rotate the player and have gravity change with them. I thought that this would eliminate issues with collisions, but it turns out this was the wrong approach. Then I tried rotating the level, and this had the problems I expected—the player constantly phased through the walls of the level and didn’t move very well. Finally I decided to use a rigid body for the player, which worked, but meant I had to use forces and torques instead of the kinds of movement I was used to. Eventually I got everything to work and I’m happy with the result. For this prototype I used very simple art and a pixelation shader that I modified from one of my other projects, but I think it actually turned out looking pretty good, so I might keep it. Next I plan to get some levels prototyped and some of my secondary mechanics developed. Hopefully after this I’ll have something good enough to post on Itch."}]...
|
Title: A New Down by @late-parrot | Stardance
Dev Title: A New Down by @late-parrot | Stardance
Devlogs:
Completed the basic mechanics such as the rotating level, rolling, and jumping I had to go through several different iterations to get the rotation to work—at first I tried to rotate the player and have gravity change with them. I thought that this would eliminate issues with collisions, but it turns out this was the wrong approach. Then I tried rotating the level, and this had the problems I expected—the player constantly phased through the walls of the level and didn’t move very well. Finally I decided to use a rigid body for the player, which worked, but meant I had to use forces and torques instead of the kinds of movement I was used to. Eventually I got everything to work and I’m happy with the result. For this prototype I used very simple art and a pixelation shader that I modified from one of my other projects, but I think it actually turned out looking pretty good, so I might keep it. Next I plan to get some levels prototyped and some of my secondary mechanics developed. Hopefully after this I’ll have something good enough to post on Itch.
Added sticky blocks These blocks are the first of several that I plan to add in order to make the game more interesting and make for better levels. Whenever you run into a sticky block, you snap to its position and stop moving, while the level continues to rotate. Once stuck, you can launch yourself in any direction by pressing that key. I decided to add these because I thought it would be cool to have levels where you launch yourself through a large number of sticky blocks, and they add a method of transportation other than the basic rolling and jumping. I’m thinking about ideas for other blocks, and as soon as I have a few I’ll start to build some levels.
Added a level system with loading and transitions Touching the goal blocks will now trigger a transition to the next level, and to test out this system, I developed two new levels for a total of three. I decided to dynamically load level scenes by looking for scenes/levels/0.tscn , scenes/levels/1.tscn , etc. This system worked well, but when reaching the goal for the next level, it would try to load a nonexistent file and crash. I fixed this by calling a win() function instead of loading a level file when the file cannot be found. Next, I plan to add a few more levels, or maybe work on some of the main UI. The newer levels will introduce other special blocks and mechanics.
Added a title screen and polished some of the transitions The title screen really helps tie the game together, and makes it feel much more like a real game. I found two fonts on Itch to use for my game— Chonkly and 3x3 Mono . Both are CC0, and I’ve yet to use 3x3 Mono, but I might use it for smaller text later. The transition between levels and when you die and the level resets both looked pretty bad, flashing a gray screen and looking quite jittery. I hunted around a bit for the source of the problem, and eventually discovered that it was due to my camera’s position smoothing. I fixed this by calling reset_smoothing() in the relevant places. All in all, this really made the game feel more complete, and I’m really happy with where it’s going. In the future, I need to add more levels and the mechanics that go with those. If I have a large number of levels, I may also need a level select menu.
Create credits and clean up player movement I created a simple credits scene, and although I plan to add more to it later, it should suffice for now. I tinkered around a lot with the layout, and I went with something pretty simple. Because the credits are going to be extremely short, I decided not to go with scrolling credits like I’ve done in the past. In addition to this, I also worked on player movement for a while, refining some aspects so that they would fit the game better. I made the cooldown to launch from a sticky block much shorter so that they felt more responsive, and I lowered the threshold for something to be considered a “floor”. This means that the player can jump off of steeper slopes, and I may end up removing the threshold entirely, effectively allowing wall jumps. In the future I clearly need to add more levels, given that my current count is still at three.m With those, I need two things: new interesting mechanics and a good tutorial. As it is, it’s quite hard for a player to just jump into the game, because they need to know more about the controls and how you’re meant to play. A tutorial will help significantly with this problem. The game also currently has no sound, which makes it feel boring and uninteresting. I plan to add sound effects for things like jumping and landing, but I’m not completely confident in my music abilities. Because of this, I’m attempting to get a few other people to help me, but if needed I can create the music myself.
Create more levels I added two more unique levels, for a new total of five. Each level helps teach parts of the game that I want to incorporate into future levels, and the fifth level is genuinely somewhat challenging. I put a lot of thought and consideration into these levels, and tested them thoroughly. These taught me things like how far the player can jump and how to make the player use momentum for their benefit. I hope that what I learned can help me make even better levels in the future. Everything that I said I still needed to do in the last devlog still stands—that means I still need more levels and mechanics, and that I still need to incorporate sound into my game. I will try to work on these as soon as possible, and I have a few ideas for new mechanics.
Add music and sound effects This devlog covers a lot of different things that I worked on, but the most major was music and sound effects. For music, I was able to find an old song that one of my friends had made for a different project. We didn’t end up using it for that game, but I think it fits the vibes of this game pretty well, so I dropped it in. I found sound effects from OpenGameArt (with the CC0 license—one of my favorite parts of that site is that you can filter by license), but getting them into the game was much harder than with the music. Jump sounds were easy; I just played the sound whenever you jumped. However, I also wanted landing sounds, and these proved much more difficult. Because of the constantly rotating level, the physics engine is constantly registering lots of collisions. If I just played the sounds whenever the player collided with the floor, they would play way too often. To remedy this, I instead tried to check the incoming velocity to get a sense of the “strength” of the collisions, but this didn’t work particularly well. Eventually, I ended up putting a limit on how often the sound can play per “shape” (Godot turns each large chunk of the tilemap into a single shape to simplify the physics simulation). This was very difficult to get right, but I’m happy with the result. Now that I had all of these new assets, I had to update the credits. While I was working on UI, I also decided it would be a good idea to add an end screen—before when the player won, nothing really happened. This was pretty easy to do, but I might want to update it later to make it look better. With this in place, the game feels much more complete, if not for the lack of levels. I only have a few days left in the game jam, so I will spend the next part of my time on configuring the export and building my Itch page. Once I’m happy with both of these, I’ll finish up my levels and submit. I’m hoping to reach a total of ten levels, but we’ll see where I end up.
Work on README and do some polishing This was mostly working on my README, which wasn’t too difficult, but I had to figure out how I wanted to embed my images. I ended up just linking to the ones that I uploaded to Itch.io, because they were hosting them for me. I followed the README guidelines from Stardance, and I think I have a solid, professional README. Once the README was written, I reused most of the text for my Itch.io page and made that look presentable. I also fixed some issues with window scaling, but these changes were minor. Really all I have left at this point is to make some levels, which I’ve clearly been putting off. As of writing this, I have about two days left in the game jam, so I feel comfortable with my time.
Add Settings and Final Levels This is a huge devlog, mostly because this last part of the game jam was extremely chaotic. Now that I’ve submitted my game, I have the time to write a devlog. After receiving feedback from others, I learned that the pixelation effects could be very jarring for some, but that others really liked the effect. Because I was getting these conflicting opinions, I decided to make this a setting for those who need it, but to keep the effect on as a default. Because this meant I was building a settings system, I also decided to implement volume settings. None of this was super difficult, but the settings had to be hooked up into every other part of the game. With this out of the way, I still needed more levels. At this point I had 5 levels, which is the amount that I’ve submitted for some other games. However, due to how short these levels are, I wanted to get all the way to 10 levels. Level design is certainly not my strong suit, so this took a significant amount of time. I tried to make the levels difficult, but after receiving some more feedback, it’s clear that I probably should’ve made it easier. With these new levels, I also added a new mechanic—blocks that will flip the rotation direction when contacted. These were much easier to implement than the sticky blocks, but still required me to work on many different parts of the game. These blocks gave me a new tool to use for level design, which helped out a lot. I made some more tweaks to the export settings, and with about 15 minutes to spare, I uploaded my files to Itch.io. I wasn’t able to test all of the exports, but the web and MacOS versions definitely work, and my game uploaded just fine. I’m not totally sure about the future of this project—every other game jam game has been abandoned as soon as the jam was finished, but I really like the mechanics of this one. Because of this, I may actually end up fleshing it out more and developing a full game, but I also might not—we’ll see.
Ships:
My submission to The Very Serious Juniper Dev Game Jam, A New Down is a unique and difficult puzzle platformer with novel spinning mechanics DEMO (Itch.io)Web version—downloads are also available Features Interesting and novel spinning mechanics Retro-inspired pixel-perfect graphics Short, difficult levels for rewarding gameplay Behind the Scenes A New Dawn was created with Godot version 4.7, and the development process brought along some significant difficulties. Getting the physics system to work with a constantly rotating level was tough, and I had to try several different techniques to make the player move in a way that I liked. If you want to see more about the development journey, check out the devlogs here. Credits All code and art created by Eric Schuette (me) Music by Anthony Hsu The main font is Chonkly by ItMeArcadia (CC0) Sound effects from 512 Sound Effects (8-bit style) by SubspaceAudio (CC0) Huge thanks to everyone who tested out the game and gave feedback—it was very helpful and extremely valuable....
|
1793202601.446716
|
1793289001.446716
|
|
22668
|
Heartstopper by @freddie | Stardance
|
freddie
|
1
|
1.0
|
7
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-22T08:05:43Z", "hours": 1.0, "multiplier": 5.67, "payout": 7, "blessing": "neutral", "text": "I made a website, just a website. I sat down and coded it in class, then a bit more at home. I’m hosting it on nest, right, a static site on nest. But not a polished, bland lifeless heap, a little box on the internet (on @WillKitch ’s domain) that i made for you (stardance generally or you individually, whatever way you want to take it). :>", "repo": "https://github.com/hippogriff101/heartstopper", "demo": "https://freddiething.willkitch.me/"}]...
|
[{"post_id": 13584, "ts": "202 [{"post_id": 13584, "ts": "2026-06-22T07:55:13Z", "hours": 0.3458, "text": "There we go, all finished! I added a nice readme and pushed code to gh (and uploaded to nest) On the actual site i added some more content and some css fixes."}, {"post_id": 12176, "ts": "2026-06-19T21:52:50Z", "hours": 0.8594, "text": "my first devlog! - I started by getting the server (for a static website) set up on nest, a bit silly when gh pages and vercel are out there. Then I started fleshing out the site. Images, text, titles as well as adding a pinch of css. I know, comic sans, crummy gradient bg but it is personal not proffecianl (spelled wrong purpusfully )"}]...
|
Title: Heartstopper by @freddie | Stardance
Devlo Title: Heartstopper by @freddie | Stardance
Devlogs:
my first devlog! - I started by getting the server (for a static website) set up on nest, a bit silly when gh pages and vercel are out there. Then I started fleshing out the site. Images, text, titles as well as adding a pinch of css. I know, comic sans, crummy gradient bg but it is personal not proffecianl (spelled wrong purpusfully )
There we go, all finished! I added a nice readme and pushed code to gh (and uploaded to nest) On the actual site i added some more content and some css fixes.
Ships:
I made a website, just a website. I sat down and coded it in class, then a bit more at home. I’m hosting it on nest, right, a static site on nest. But not a polished, bland lifeless heap, a little box on the internet (on @WillKitch ’s domain) that i made for you (stardance generally or you individually, whatever way you want to take it). :>...
|
1793141384.4562242
|
1793227784.4562242
|
|
22669
|
Pi Proxy Bridge by @tosterabgx | Stardance
|
tosterabgx
|
1
|
17.16
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-21T22:06:14Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Say hi to my project!! Pi Proxy Bridge is a setup where a Raspberry Pi works as a WiFi-to-WiFi proxy access point with support for Xray Core. At home, we have a security webcam that doesn’t work without a proxy, but it can’t connect to one itself. So, I decided to build my own proxy bridge for it. This is the first working version, and I want to expand this project further, probably wrapping everything up in Docker and adding a router local web page for easier configuration. But for now, you can check out the video demonstration!", "repo": "https://github.com/felowctl/pi-proxy-bridge", "demo": "https://github.com/felowctl/pi-proxy-bridge#installation"}]...
|
[{"post_id": 24856, "ts": "202 [{"post_id": 24856, "ts": "2026-07-08T18:21:36Z", "hours": 5.9192, "text": "The final touches It has been a long time since the last devlog, but I finally added some quality-of-life features. The admin page PiRouter serves an admin webpage on a standard ip 192.168.50.1 behind the auth (default password is Admin , but don’t tell anyone). It has a number of configurations for the wifi and proxy. It also has a theme switch, but i don’t think that anyone will ever use the light theme ;p Other stuff Fixed some bugs and added a bit more configurability during the installation process. That’s it! I think that this will be my last devlog, so thanks to anyone watching this. Bye!"}, {"post_id": 14292, "ts": "2026-06-23T11:03:11Z", "hours": 4.245, "text": "Virtual AP update From now on, you don’t need an additional USB dongle for Pi Proxy Bridge to work! Better interface Updated the installer. It now starts by asking which mode you want (virtual interface or second adapter). Then, it asks configuration questions like Hotspot SSID Hotspot password Hotspot’s channel Whether to use 5GHz README update I also updated the README to better explain how my project works, as well as some setup tips."}, {"post_id": 13362, "ts": "2026-06-21T21:53:01Z", "hours": 2.2947, "text": "Bulletproofing the install script Spent two hours cooking my installer to perfection. But now we also have a logo! What’s new Added several checks for sudo access, WiFi interfaces and required packages Added the uninstall script Made a video showcasing Pi Proxy Bridge at work The time wasn’t logged, but I spent an hour trying to find free video editing software and blur out my ip address :p"}, {"post_id": 12813, "ts": "2026-06-20T23:35:53Z", "hours": 2.9625, "text": "Feature-full prototype + installation script Added Xray Core and the routing rules so everything works together. Checked it with ifconfig.me . Also, I decided to automate the whole configuration process and made a bash installation script, which seems to work. Learned a bunch of cool little bash things along the way, like set -e (which stops the script if an error occurs) or the difference between > and &> ."}, {"post_id": 12720, "ts": "2026-06-20T19:36:30Z", "hours": 1.2225, "text": "It works! (kinda) Installed and configured hostapd (a tool for creating a hotspot) Sounds simple but… After setting up an access point, my phone did not connect and was just saying “Obtaining IP address”. Turns out, I also needed to install a DHCP server (dnsmasq) so it assigns different IP addresses to devices on the network. But there’s no proxy right now, so…. more updates are to come"}, {"post_id": 12490, "ts": "2026-06-20T12:11:18Z", "hours": 0.3514, "text": "Architecture Sketch Sketched out how my Pi Proxy Bridge works. The Idea Raspberry Pi (4B in my case) connects to my home wifi and shares its own hotspot at the same time. Anything on that hotspot gets routed through a proxy. My separate webcam (which needs a proxy to run, but can’t start one itself) connects to the hotspot and gets a proxied internet connection. Profit. Details Needs a dedicated USB wifi dongle No WireGuard or OpenVPN, because they often get blocked. Went with Xray-Core instead (vless, trojan, shadowsocks, etc.)"}]...
|
Title: Pi Proxy Bridge by @tosterabgx | Stardance
Title: Pi Proxy Bridge by @tosterabgx | Stardance
Devlogs:
Architecture Sketch Sketched out how my Pi Proxy Bridge works. The Idea Raspberry Pi (4B in my case) connects to my home wifi and shares its own hotspot at the same time. Anything on that hotspot gets routed through a proxy. My separate webcam (which needs a proxy to run, but can’t start one itself) connects to the hotspot and gets a proxied internet connection. Profit. Details Needs a dedicated USB wifi dongle No WireGuard or OpenVPN, because they often get blocked. Went with Xray-Core instead (vless, trojan, shadowsocks, etc.)
It works! (kinda) Installed and configured hostapd (a tool for creating a hotspot) Sounds simple but… After setting up an access point, my phone did not connect and was just saying “Obtaining IP address”. Turns out, I also needed to install a DHCP server (dnsmasq) so it assigns different IP addresses to devices on the network. But there’s no proxy right now, so…. more updates are to come
Feature-full prototype + installation script Added Xray Core and the routing rules so everything works together. Checked it with ifconfig.me . Also, I decided to automate the whole configuration process and made a bash installation script, which seems to work. Learned a bunch of cool little bash things along the way, like set -e (which stops the script if an error occurs) or the difference between > and &> .
Bulletproofing the install script Spent two hours cooking my installer to perfection. But now we also have a logo! What’s new Added several checks for sudo access, WiFi interfaces and required packages Added the uninstall script Made a video showcasing Pi Proxy Bridge at work The time wasn’t logged, but I spent an hour trying to find free video editing software and blur out my ip address :p
Virtual AP update From now on, you don’t need an additional USB dongle for Pi Proxy Bridge to work! Better interface Updated the installer. It now starts by asking which mode you want (virtual interface or second adapter). Then, it asks configuration questions like Hotspot SSID Hotspot password Hotspot’s channel Whether to use 5GHz README update I also updated the README to better explain how my project works, as well as some setup tips.
The final touches It has been a long time since the last devlog, but I finally added some quality-of-life features. The admin page PiRouter serves an admin webpage on a standard ip 192.168.50.1 behind the auth (default password is Admin , but don’t tell anyone). It has a number of configurations for the wifi and proxy. It also has a theme switch, but i don’t think that anyone will ever use the light theme ;p Other stuff Fixed some bugs and added a bit more configurability during the installation process. That’s it! I think that this will be my last devlog, so thanks to anyone watching this. Bye!
Ships:
Say hi to my project!! Pi Proxy Bridge is a setup where a Raspberry Pi works as a WiFi-to-WiFi proxy access point with support for Xray Core. At home, we have a security webcam that doesn’t work without a proxy, but it can’t connect to one itself. So, I decided to build my own proxy bridge for it. This is the first working version, and I want to expand this project further, probably wrapping everything up in Docker and adding a router local web page for easier configuration. But for now, you can check out the video demonstration!...
|
1793137950.9055767
|
1793224350.9055767
|
|
22691
|
Scratcher by @BetterClient | Stardance
|
BetterClient
|
1
|
188.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-25T19:05:06Z", "hours": 188.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Scratcher is a high level language that compiles to scratch. Some of Scratcher’s features: Lambdas Closures Function pointers Structs Arrays Lists Generics Sealed enums Pattern matching Compile time null safety Extension functions Operator overloading String interpolation Function returns Along with having support for all of these: Scratcher is memory safe Scratcher has 2 garbage collectors. Scratcher has a big optimizer pass, making your code very performant. Scratcher has very good documentation Scratcher can also safely interop with normal scratch code: You can expose your functions to normal scratch code using the export keyword, which makes normal scratch code able to safely call your code. You can use on GreenFlag {} or on KeyPressed(\"key\") {} to handle scratch events. Advanced loop control: Scratcher allows you to write expressive code like for(int i in list) Scratcher also has support for continue and break which is fully absent on scratch. What I’m proud of Return values: Normal scratch has no idea what a function call is, it only knows procedures(which don’t have returns)! The double GC: Scratcher comes with 2 garbage collectors, which can run at the same time, one is reference counting GC and the other one is a Tracing Mark and sweep GC. Lambdas: Scratcher allows you to use lambdas very expressively, allowing you to capture local variables from outside the lambda, use it, modify it while also keeping that modified instance in the original function, its just like kotlin’s lambdas(which I love) The expression control flow: Scratcher allows you to write if statements and when statements INSIDE other expressions, this lets you write very expressive code: func( if(something) { funcB() } else 5 ) Short circuits: Normal scratch executes the right side of an and / or block no matter what, scratcher doesn’t, if the left side of and is false, the right side won’t run. Very rich type system: The scratcher type system allows you to do a lot of things, I love sealed enums, they’re just like rust enums: sealed enum Result<T, E> { Success(T value), Error(E error) } Testing the compiler If you don’t wanna bother downloading the CLI and writing your own program, look at the example programs in this folder If you wanna use the CLI and maybe even write your own programs, check out the documentation: https://github.com/betterclient/Scratcher/blob/master/docs/hello_world.md", "repo": "https://github.com/betterclient/Scratcher", "demo": "https://github.com/betterclient/Scratcher/releases/tag/1.0"}]...
|
[{"post_id": 82740, "ts": "202 [{"post_id": 82740, "ts": "2026-10-25T18:27:59Z", "hours": 5.7203, "text": "Tests I added tests to scratcher, this makes sure the language is holding up to its promises before I press release. I currently only have very simple tests, but I’ve already fixed 4 bugs in the compiler. Other shit Added github workflows so it gets released automatically! Made the Compiler completely isolated, this means it can run multiple times without having the JVM restarted. Added compact float lists!"}, {"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
Tests I added tests to scratcher, this makes sure the language is holding up to its promises before I press release. I currently only have very simple tests, but I’ve already fixed 4 bugs in the compiler. Other shit Added github workflows so it gets released automatically! Made the Compiler completely isolated, this means it can run multiple times without having the JVM restarted. Added compact float lists!
Ships:
Scratcher is a high level language that compiles to scratch. Some of Scratcher’s features: Lambdas Closures Function pointers Structs Arrays Lists Generics Sealed enums Pattern matching Compile time null safety Extension functions Operator overloading String interpolation Function returns Along with having support for all of these: Scratcher is memory safe Scratcher has 2 garbage collectors. Scratcher has a big optimizer pass, making your code very performant. Scratcher has very good documentation Scratcher can also safely interop with normal scratch code: You can expose your functions to normal scratch code using the export keyword, which makes normal scratch code able to safely call your code. You can use on GreenFlag {} or on KeyPressed("key") {} to handle scratch events. Advanced loop control: Scratcher allows you to write expressive code like for(int i in list) Scratcher also has support for continue and break which is fully absent on scratch. What I’m proud of Return values: Normal scratch has no idea what a function call is, it only knows procedures(which don’t have returns)! The double GC: Scratcher comes with 2 garbage collectors, which can run at the same time, one is reference counting GC and the other one is a Tracing Mark and sweep GC. Lambdas: Scratcher allows you to use lambdas very expressively, allowing you to capture local variables from outside the lambda, use it, modify it while also keeping that modified instance in the original function, its just like kotlin’s lambdas(which I love) The expression control flow: Scratcher allows you to write if statements and when statements INSIDE other expressions, this lets you write very expressive code: func( if(something) { funcB() } else 5 ) Short circuits: Normal scratch executes the right side of an and / or block no matter what, scratcher doesn’t, if the left side of and is false, the right side won’t run. Very rich type system: The scratcher type system allows you to do a lot of things, I love sealed enums, they’re just like rust enums: sealed enum Result<T, E> { Success(T value), Error(E error) } Testing the compiler If you don’t wanna bother downloading the CLI and writing your own program, look at the example programs in this folder If you wanna use the CLI and maybe even write your own programs, check out the documentation: https://github.com/betterclient/Scratcher/blob/master/docs/hello_world.md...
|
1793141339.7944539
|
1793227739.7944539
|
|
22698
|
Cool Graphing Point by @Hadi | Stardance
|
Hadi
|
1
|
3.57
|
5
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-22T02:37:37Z", "hours": 3.0, "multiplier": 1.78, "payout": 5, "blessing": "neutral", "text": "clipGraphapoint was the first python project I built with my very two hands. I wanted to combine my love for math and pythons tkinter to make a visual way to represent a line from your given point. I went through various challenges like having to rewrite my entire logic and adding a restart button. However, after doing that, i feel confident in what i learned and I would love to make more cooler math related projects in the future. Guess which point I chose.", "repo": "https://github.com/hadidihighway/Graphapoint", "demo": "https://graphapoint.vercel.app/"}]...
|
[{"post_id": 14721, "ts": "202 [{"post_id": 14721, "ts": "2026-06-23T22:36:35Z", "hours": 0.5733, "text": "Brang it to the web so no changes will be requested"}, {"post_id": 13479, "ts": "2026-06-22T02:20:43Z", "hours": 1.5194, "text": "Added a restart button and fixed a bit of the logic"}, {"post_id": 12251, "ts": "2026-06-20T00:31:59Z", "hours": 1.1072, "text": "Finished the baseline, now tomorrow i will be improving it"}]...
|
Title: Cool Graphing Point by @Hadi | Stardance
D Title: Cool Graphing Point by @Hadi | Stardance
Devlogs:
Finished the baseline, now tomorrow i will be improving it
Added a restart button and fixed a bit of the logic
Brang it to the web so no changes will be requested
Ships:
clipGraphapoint was the first python project I built with my very two hands. I wanted to combine my love for math and pythons tkinter to make a visual way to represent a line from your given point. I went through various challenges like having to rewrite my entire logic and adding a restart button. However, after doing that, i feel confident in what i learned and I would love to make more cooler math related projects in the future. Guess which point I chose....
|
1793267560.9375532
|
1793353960.9375532
|
|
22707
|
Projectile Calculator by @Luz | Stardance
|
Luz
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-08T12:31:59Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Something that made this project challenging is the fact that it was my first time using the pygame library. So making sense of the commands were something I struggled with, as well as learning how to use the formulas along with the fact that this is not the real world and I needed to plan according how something moves in pixels.", "repo": "https://github.com/Luz-Jaramillo/projectile-simulation", "demo": "https://github.com/Luz-Jaramillo/projectile-simulation/releases/tag/v1.1"}]...
|
[{"post_id": 24520, "ts": "202 [{"post_id": 24520, "ts": "2026-07-08T03:49:00Z", "hours": 0.8453, "text": "Finally finished this project. Although it is very basic it did teach me on how to create the windows and get a gist of how pygame works."}, {"post_id": 12334, "ts": "2026-06-20T03:45:58Z", "hours": 1.2939, "text": "Recently I have been interested in the creation of physics simulations, so far I believe that I have been doing good, I estimate that this project will be finished tomorrow. However I have been busy adding all of the math, and am now figuring out how to make it visual. Regarding that, I have only been able to make it appear as a black screen."}]...
|
Title: Projectile Calculator by @Luz | Stardance
Title: Projectile Calculator by @Luz | Stardance
Devlogs:
Recently I have been interested in the creation of physics simulations, so far I believe that I have been doing good, I estimate that this project will be finished tomorrow. However I have been busy adding all of the math, and am now figuring out how to make it visual. Regarding that, I have only been able to make it appear as a black screen.
Finally finished this project. Although it is very basic it did teach me on how to create the windows and get a gist of how pygame works.
Ships:
Something that made this project challenging is the fact that it was my first time using the pygame library. So making sense of the commands were something I struggled with, as well as learning how to use the formulas along with the fact that this is not the real world and I needed to plan according how something moves in pixels....
|
1793271218.6796067
|
1793357618.6796067
|
|
22728
|
Computer Companion by @Charlie_Coder | Stardance
|
Charlie_Coder
|
1
|
4.0
|
24
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-25T22:39:09Z", "hours": 4.0, "multiplier": 5.89, "payout": 24, "blessing": "neutral", "text": "I have made a useful python script called computer companion that remembers the user name, and has a bunch of useful utilities including batch pinging to confirm when a device goes online and offline. Features include: Remembers user name Opening App Function Help Menu Basic Calculator System Information IPv4 automatic batch ping Random Number Generator Friendly Greetings Fun mode including jokes I have uploaded it to pipx, so it can now be installed if you have pipx with: “pipx install computercompanion”. I found it especially challenging to get the pinging method to work well and work in boundary cases. I also struggled with getting it on pipx, but I got there. I’m especially proud of the main utilities that I will use myself, including the batch pinging, app opener, and system information. I hope you enjoy using my script!", "repo": "https://github.com/Miningsleuth/computercompanion", "demo": "https://pypi.org/project/computercompanion/"}]...
|
[{"post_id": 15961, "ts": "202 [{"post_id": 15961, "ts": "2026-06-25T22:28:22Z", "hours": 0.4225, "text": "I believe I am finally ready to ship :) I have done quite a few final touches, and have also made sure that the pipx doesn’t automatically use my name to start. It can be installed with “pipx install computercompanion” once pipx is installed on your device."}, {"post_id": 15564, "ts": "2026-06-25T09:36:35Z", "hours": 0.3183, "text": "Okay, it took a while, but now it properly works on pipx! You can now just do pipx install computercompanion and it should work :). I am close to shipping I hope, but I am going to add a few more things and do a few more touch ups. I tested installing on another machine - a linux device."}, {"post_id": 15556, "ts": "2026-06-25T09:08:20Z", "hours": 0.3844, "text": "Hooray! Computer Companion can now be installed through pipx :)"}, {"post_id": 15544, "ts": "2026-06-25T08:26:47Z", "hours": 0.5078, "text": "I have worked on making it run better. I have added jokes to the fun section (although I used AI to gather most of them). I have set up the random utility, which can do random words (the user chooses the amount) or random numbers (the user choose the boundaries). I added try and except to ensure the script doesn’t crash on a bad entry. I also have started the system information section, and imported platform as it will be used for the system information section."}, {"post_id": 14928, "ts": "2026-06-24T07:45:36Z", "hours": 0.6, "text": "Added more boundary cases, and added the calculator utility. I added more to the readme, as well as to the clarity of the script for the user. There is improvements to the overall running, and extra general touch ups. Now, utilities that haven’t been added in yet have a message explaining the fact."}, {"post_id": 12355, "ts": "2026-06-20T04:59:55Z", "hours": 0.7231, "text": "I have added a pinging utility to the companion. This allows for easy batch pinging where needed. Adding this also meant I created a utility menu, which I will expand upon and add more to. The code requires ping from pythonping, but that means pythonping has to be pip installed. This is not a large problem, as the rest of the code works fine, and the python file warns that it is not installed, and says how. However, a future improvement could be making a way that the user doesn’t need to install this."}, {"post_id": 12317, "ts": "2026-06-20T03:13:57Z", "hours": 0.7064, "text": "I have been working on getting the main parts of my python script finished, so I can build off there. My code now saves the users name to a .json file which can be accessed the next time the python file is run. It is stored in a name variable, so it can be accessed throughout the script. I have also added an app opening function, which has some simple tasks I have learned how to open. Finally, I added some extra parts to help ensure the code accepts what the user wants, even if it isn’t word-for-word. One way in python of doing this is adding .lower() after an input, or before checking the input, as it reduces the possible inconsistencies if needing to compare it."}, {"post_id": 12282, "ts": "2026-06-20T01:43:52Z", "hours": 0.4003, "text": "Getting Coding Companion to store .json data. I also made sure that git would not save the .json data, so I am able to run tests, without those modifications being changed in Github. This means other people could use the software, and wouldn’t start with my presets, but with the default."}]...
|
Title: Computer Companion by @Charlie_Coder | Star Title: Computer Companion by @Charlie_Coder | Stardance
Devlogs:
Getting Coding Companion to store .json data. I also made sure that git would not save the .json data, so I am able to run tests, without those modifications being changed in Github. This means other people could use the software, and wouldn’t start with my presets, but with the default.
I have been working on getting the main parts of my python script finished, so I can build off there. My code now saves the users name to a .json file which can be accessed the next time the python file is run. It is stored in a name variable, so it can be accessed throughout the script. I have also added an app opening function, which has some simple tasks I have learned how to open. Finally, I added some extra parts to help ensure the code accepts what the user wants, even if it isn’t word-for-word. One way in python of doing this is adding .lower() after an input, or before checking the input, as it reduces the possible inconsistencies if needing to compare it.
I have added a pinging utility to the companion. This allows for easy batch pinging where needed. Adding this also meant I created a utility menu, which I will expand upon and add more to. The code requires ping from pythonping, but that means pythonping has to be pip installed. This is not a large problem, as the rest of the code works fine, and the python file warns that it is not installed, and says how. However, a future improvement could be making a way that the user doesn’t need to install this.
Added more boundary cases, and added the calculator utility. I added more to the readme, as well as to the clarity of the script for the user. There is improvements to the overall running, and extra general touch ups. Now, utilities that haven’t been added in yet have a message explaining the fact.
I have worked on making it run better. I have added jokes to the fun section (although I used AI to gather most of them). I have set up the random utility, which can do random words (the user chooses the amount) or random numbers (the user choose the boundaries). I added try and except to ensure the script doesn’t crash on a bad entry. I also have started the system information section, and imported platform as it will be used for the system information section.
Hooray! Computer Companion can now be installed through pipx :)
Okay, it took a while, but now it properly works on pipx! You can now just do pipx install computercompanion and it should work :). I am close to shipping I hope, but I am going to add a few more things and do a few more touch ups. I tested installing on another machine - a linux device.
I believe I am finally ready to ship :) I have done quite a few final touches, and have also made sure that the pipx doesn’t automatically use my name to start. It can be installed with “pipx install computercompanion” once pipx is installed on your device.
Ships:
I have made a useful python script called computer companion that remembers the user name, and has a bunch of useful utilities including batch pinging to confirm when a device goes online and offline. Features include: Remembers user name Opening App Function Help Menu Basic Calculator System Information IPv4 automatic batch ping Random Number Generator Friendly Greetings Fun mode including jokes I have uploaded it to pipx, so it can now be installed if you have pipx with: “pipx install computercompanion”. I found it especially challenging to get the pinging method to work well and work in boundary cases. I also struggled with getting it on pipx, but I got there. I’m especially proud of the main utilities that I will use myself, including the batch pinging, app opener, and system information. I hope you enjoy using my script!...
|
1793256603.5913937
|
1793343003.5913937
|